diff --git a/DEPS b/DEPS index 1149dd31..0d4d2eb 100644 --- a/DEPS +++ b/DEPS
@@ -138,11 +138,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': 'f91aeb259e095bf8c942063f7f2525fef2d5020c', + 'skia_revision': '7694b90eb000cd91813171cb9ad5a2b45d51dcf9', # 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': '84c5a5374f3fc14391d282d03493e32bda642659', + 'v8_revision': '353cbaa98234985eb46270232aae073740b8352a', # 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. @@ -150,7 +150,7 @@ # 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': '81b6acfb86850cd81fa70bccb44791d5e37a43fa', + 'angle_revision': '9a4bd48d5f0c367fd1db39e67aaffdbff1736bd6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -158,7 +158,7 @@ # 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': 'f0f9a8f1fd94d812afbe9df814657340d43fda79', + 'pdfium_revision': '84079432edd2ca5889fea4fa57d230df73d5fce7', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -201,7 +201,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': 'baea8814b88ef71a1f1866c5efa19f6f8a7e5b1c', + 'catapult_revision': '26377fc5ea907d3242cfdb8e1b4b9af11bbb486e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -273,7 +273,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '872c1d7fe98a41359364e96609231f9700160d7a', + 'dawn_revision': '92cdeaaf810bee05e4b23e99fc2bededbdfa59d4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -807,7 +807,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '40ee745abc3b3dd0309c67d3cb0b4c29adc2c484', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '4e5c106f96c40427706ccf1bae049450e6c9c162', 'condition': 'checkout_linux', }, @@ -832,7 +832,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '49131ca238ded3455771ba8b448a2f48dbf8597f', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '764ec87e51cd63d517f05a38a1cc87ff562680e0', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -1355,7 +1355,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6f0b34abee8dba611c253738d955c59f703c147a', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '342f98b117653524dc08f585fd5053ceca5b4d40', + Var('webrtc_git') + '/src.git' + '@' + 'b7a3e3f5c42ae926f5962c69e87bbfa6375a45ba', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1396,7 +1396,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@88825299a7d45d0a57c209f55f1c7684d1a45243', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fd4e0560a28b36aed4e712d6ea8568e8d5bd4dfe', 'condition': 'checkout_src_internal', },
diff --git a/WATCHLISTS b/WATCHLISTS index a2f3312..83d6aa0 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -2620,7 +2620,7 @@ 'shuchen+watch@chromium.org', 'yhanada+watch@chromium.org', 'yusukes+watch@chromium.org'], - 'timers': ['chirantan+watch@chromium.org'], + 'timers': [], 'tools_win_chromeexts': ['robliao+watch@chromium.org'], 'touch_selection': ['ajith.v@samsung.com', 'ajith.v@chromium.org'],
diff --git a/android_webview/browser/aw_autofill_client.cc b/android_webview/browser/aw_autofill_client.cc index 94ad76d5..5cbaa9c 100644 --- a/android_webview/browser/aw_autofill_client.cc +++ b/android_webview/browser/aw_autofill_client.cc
@@ -173,7 +173,7 @@ NOTIMPLEMENTED(); } -void AwAutofillClient::CreditCardUploadCompleted() { +void AwAutofillClient::CreditCardUploadCompleted(bool card_saved) { NOTIMPLEMENTED(); }
diff --git a/android_webview/browser/aw_autofill_client.h b/android_webview/browser/aw_autofill_client.h index b3c88a9..cbfd12c 100644 --- a/android_webview/browser/aw_autofill_client.h +++ b/android_webview/browser/aw_autofill_client.h
@@ -110,7 +110,7 @@ std::unique_ptr<base::DictionaryValue> legal_message, SaveCreditCardOptions options, UploadSaveCardPromptCallback callback) override; - void CreditCardUploadCompleted() override; + void CreditCardUploadCompleted(bool card_saved) override; void ConfirmCreditCardFillAssist(const autofill::CreditCard& card, base::OnceClosure callback) override; bool HasCreditCardScanFeature() override;
diff --git a/android_webview/browser/aw_feature_list_creator.cc b/android_webview/browser/aw_feature_list_creator.cc index 596ea5f..217a7a0 100644 --- a/android_webview/browser/aw_feature_list_creator.cc +++ b/android_webview/browser/aw_feature_list_creator.cc
@@ -55,9 +55,12 @@ cdm::prefs::kMediaDrmStorage, // Randomly-generated GUID which pseudonymously identifies uploaded metrics. metrics::prefs::kMetricsClientID, - // Random seed values for variation's entropy providers, used to assign + // Random seed value for variation's entropy providers. Used to assign // experiment groups. metrics::prefs::kMetricsLowEntropySource, + // Current and past country codes, to filter variations studies by country. + variations::prefs::kVariationsCountry, + variations::prefs::kVariationsPermanentConsistencyCountry, }; // Shows notifications which correspond to PersistentPrefStore's reading errors.
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc index d19b99a..10ac2f2 100644 --- a/ash/accelerators/accelerator_controller_impl.cc +++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -561,7 +561,11 @@ void HandleToggleOverview() { base::RecordAction(base::UserMetricsAction("Accel_Overview_F5")); - Shell::Get()->overview_controller()->ToggleOverview(); + OverviewController* overview_controller = Shell::Get()->overview_controller(); + if (overview_controller->InOverviewSession()) + overview_controller->EndOverview(); + else + overview_controller->StartOverview(); } void HandleToggleUnifiedDesktop() {
diff --git a/ash/accessibility/accessibility_controller.cc b/ash/accessibility/accessibility_controller.cc index 3f2b54407..9085810 100644 --- a/ash/accessibility/accessibility_controller.cc +++ b/ash/accessibility/accessibility_controller.cc
@@ -42,7 +42,7 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "ui/aura/window.h" -#include "ui/base/cursor/cursor_type.h" +#include "ui/base/cursor/cursor_size.h" #include "ui/base/l10n/l10n_util.h" #include "ui/message_center/message_center.h" #include "ui/message_center/public/cpp/notifier_id.h"
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc index e3a7acb..5781f47 100644 --- a/ash/app_list/app_list_presenter_delegate_unittest.cc +++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -1678,13 +1678,13 @@ // Enable overview mode. OverviewController* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); // Test that the AppListView is transparent. DCHECK_EQ(0.0f, GetAppListView()->GetWidget()->GetLayer()->opacity()); // Disable overview mode. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); // Show the launcher, test that the opacity is restored. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -1701,13 +1701,13 @@ // Enable overview mode. OverviewController* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); ui::Layer* layer = GetAppListView()->GetWidget()->GetNativeWindow()->layer(); EXPECT_EQ(0.0f, layer->opacity()); // Disable overview mode. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); EXPECT_FALSE(overview_controller->InOverviewSession()); EXPECT_EQ(1.0f, layer->opacity()); } @@ -1747,12 +1747,12 @@ wallpaper_test_api.StartWallpaperPreview(); EXPECT_FALSE(GetAppListView()->GetWidget()->IsVisible()); OverviewController* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); EXPECT_FALSE(GetAppListView()->GetWidget()->IsVisible()); // Disable overview mode. Verify the app list is still hidden because // wallpaper preview is still active. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); EXPECT_FALSE(overview_controller->InOverviewSession()); EXPECT_FALSE(GetAppListView()->GetWidget()->IsVisible()); // End preview by confirming the wallpaper. Verify the app list is shown. @@ -1824,7 +1824,7 @@ GetAppListTestHelper()->CheckVisibility(true); std::unique_ptr<aura::Window> window(CreateTestWindowInShellWithId(0)); OverviewController* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); // Press app list button.
diff --git a/ash/assistant/assistant_notification_controller.cc b/ash/assistant/assistant_notification_controller.cc index 615a76d3..6328039 100644 --- a/ash/assistant/assistant_notification_controller.cc +++ b/ash/assistant/assistant_notification_controller.cc
@@ -195,6 +195,10 @@ model_.RemoveAllNotifications(from_server); } +void AssistantNotificationController::SetQuietMode(bool enabled) { + message_center::MessageCenter::Get()->SetQuietMode(enabled); +} + // AssistantNotificationModelObserver ------------------------------------------ void AssistantNotificationController::OnNotificationAdded(
diff --git a/ash/assistant/assistant_notification_controller.h b/ash/assistant/assistant_notification_controller.h index 4dbef87f..bd1655b 100644 --- a/ash/assistant/assistant_notification_controller.h +++ b/ash/assistant/assistant_notification_controller.h
@@ -71,6 +71,7 @@ void RemoveNotificationByGroupingKey(const std::string& grouping_id, bool from_server) override; void RemoveAllNotifications(bool from_server) override; + void SetQuietMode(bool enabled) override; // AssistantNotificationModelObserver: void OnNotificationAdded(const AssistantNotification* notification) override;
diff --git a/ash/assistant/ui/assistant_web_view.cc b/ash/assistant/ui/assistant_web_view.cc index 2bb5ea0..210347f 100644 --- a/ash/assistant/ui/assistant_web_view.cc +++ b/ash/assistant/ui/assistant_web_view.cc
@@ -145,6 +145,8 @@ if (contents_view_initialized_) return; + contents_view_initialized_ = true; + UpdateContentSize(); AddChildView(contents_->GetView()->view()); SetFocusBehavior(FocusBehavior::ALWAYS); @@ -153,8 +155,6 @@ contents_->GetView()->native_view()->layer()->SetRoundedCornerRadius( {/*top_left=*/0, /*top_right=*/0, /*bottom_right=*/kCornerRadiusDip, /*bottom_left=*/kCornerRadiusDip}); - - contents_view_initialized_ = true; } void AssistantWebView::DidSuppressNavigation(const GURL& url, @@ -190,8 +190,7 @@ void AssistantWebView::OnUsableWorkAreaChanged( const gfx::Rect& usable_work_area) { - if (contents_) - UpdateContentSize(); + UpdateContentSize(); } void AssistantWebView::RemoveContents() { @@ -209,7 +208,7 @@ } void AssistantWebView::UpdateContentSize() { - if (!contents_view_initialized_) + if (!contents_ || !contents_view_initialized_) return; const gfx::Size preferred_size = gfx::Size(
diff --git a/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc b/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc index c1eacd9..1c33baf 100644 --- a/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc +++ b/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc
@@ -475,7 +475,6 @@ void KeyboardShortcutView::ShowSearchResults( const base::string16& search_query) { - const base::TimeTicks start_time = base::TimeTicks::Now(); search_results_container_->RemoveAllChildViews(true); auto* search_container_content_view = search_no_result_view_.get(); auto found_items_list_view = std::make_unique<KeyboardShortcutItemListView>(); @@ -552,21 +551,6 @@ search_results_container_->AddChildView(search_container_content_view); Layout(); SchedulePaint(); - constexpr int kBucketCount = 100; - UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( - "Keyboard.ShortcutViewer.SearchUpdateTime", - base::TimeTicks::Now() - start_time, - base::TimeDelta::FromMicroseconds(50), base::TimeDelta::FromSeconds(1), - kBucketCount); - GetWidget()->GetCompositor()->RequestPresentationTimeForNextFrame( - base::BindOnce( - [](base::TimeTicks start_time, - const gfx::PresentationFeedback& feedback) { - UMA_HISTOGRAM_TIMES( - "Keyboard.ShortcutViewer.SearchUpdateTimeVisual", - feedback.timestamp - start_time); - }, - start_time)); } bool KeyboardShortcutView::CanMaximize() const {
diff --git a/ash/frame/non_client_frame_view_ash_unittest.cc b/ash/frame/non_client_frame_view_ash_unittest.cc index 6cccde5..f4cf307 100644 --- a/ash/frame/non_client_frame_view_ash_unittest.cc +++ b/ash/frame/non_client_frame_view_ash_unittest.cc
@@ -412,10 +412,10 @@ // Verify the header is not painted in overview mode and painted when not in // overview mode. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_FALSE(delegate->header_view()->should_paint()); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->EndOverview(); EXPECT_TRUE(delegate->header_view()->should_paint()); } @@ -439,7 +439,7 @@ // Verify that when one window is snapped, the header is drawn for the snapped // window, but not drawn for the window still in overview. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); Shell::Get()->split_view_controller()->SnapWindow(widget1->GetNativeWindow(), SplitViewController::LEFT); EXPECT_TRUE(delegate1->header_view()->should_paint()); @@ -457,7 +457,7 @@ // Toggle overview mode so we return back to left snapped mode. Verify that // the header is again drawn for the snapped window, but not for the unsnapped // window. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); ASSERT_EQ(SplitViewState::kLeftSnapped, Shell::Get()->split_view_controller()->state()); EXPECT_TRUE(delegate1->header_view()->should_paint()); @@ -731,9 +731,9 @@ EXPECT_FALSE(header_view->should_paint()); EXPECT_TRUE(wide_header_view->should_paint()); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_FALSE(wide_header_view->should_paint()); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->EndOverview(); EXPECT_TRUE(wide_header_view->should_paint()); // Test immersive.
diff --git a/ash/home_screen/home_launcher_gesture_handler.cc b/ash/home_screen/home_launcher_gesture_handler.cc index 41bd23ed..d70a081 100644 --- a/ash/home_screen/home_launcher_gesture_handler.cc +++ b/ash/home_screen/home_launcher_gesture_handler.cc
@@ -501,7 +501,7 @@ // Exit overview if event is released on the top half. This will also // end splitview if it is active as SplitViewController observes // overview mode ends. - Shell::Get()->overview_controller()->ToggleOverview( + Shell::Get()->overview_controller()->EndOverview( OverviewSession::EnterExitOverviewType::kSwipeFromShelf); } else { home_launcher_opacity = 0.f;
diff --git a/ash/home_screen/home_launcher_gesture_handler_unittest.cc b/ash/home_screen/home_launcher_gesture_handler_unittest.cc index 4644b9b..f3121b5 100644 --- a/ash/home_screen/home_launcher_gesture_handler_unittest.cc +++ b/ash/home_screen/home_launcher_gesture_handler_unittest.cc
@@ -206,7 +206,7 @@ EXPECT_FALSE(wm::GetWindowState(window2.get())->IsMinimized()); OverviewController* controller = Shell::Get()->overview_controller(); - controller->ToggleOverview(); + controller->StartOverview(); const int window1_initial_translation = window1->transform().To2dTranslation().y(); const int window2_initial_translation = @@ -243,7 +243,7 @@ UpdateDisplay("400x456"); OverviewController* controller = Shell::Get()->overview_controller(); - controller->ToggleOverview(); + controller->StartOverview(); views::Widget* no_windows_widget = static_cast<views::Widget*>( controller->overview_session()->no_windows_widget_for_testing()); ASSERT_TRUE(no_windows_widget); @@ -279,7 +279,7 @@ auto window = CreateWindowForTesting(); GetGestureHandler()->ShowHomeLauncher( display_manager()->FindDisplayContainingPoint(gfx::Point(10, 10))); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); } // Tests that HomeLauncherGestureHandler works as expected when one window is @@ -292,7 +292,7 @@ // Snap one window and leave overview mode open with the other window. OverviewController* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); SplitViewController* split_view_controller = Shell::Get()->split_view_controller(); split_view_controller->SnapWindow(window1.get(), SplitViewController::LEFT);
diff --git a/ash/home_screen/home_screen_controller.cc b/ash/home_screen/home_screen_controller.cc index d77b28c3..bfd8e9d 100644 --- a/ash/home_screen/home_screen_controller.cc +++ b/ash/home_screen/home_screen_controller.cc
@@ -86,7 +86,7 @@ if (Shell::Get()->overview_controller()->InOverviewSession()) { // End overview mode. - Shell::Get()->overview_controller()->ToggleOverview( + Shell::Get()->overview_controller()->EndOverview( OverviewSession::EnterExitOverviewType::kWindowsMinimized); return true; }
diff --git a/ash/kiosk_next/kiosk_next_home_controller.cc b/ash/kiosk_next/kiosk_next_home_controller.cc index dbf867b..6015dcd8 100644 --- a/ash/kiosk_next/kiosk_next_home_controller.cc +++ b/ash/kiosk_next/kiosk_next_home_controller.cc
@@ -146,7 +146,7 @@ if (component == HTCLIENT && event->type() == ui::ET_GESTURE_SCROLL_BEGIN) { auto* overview_controller = Shell::Get()->overview_controller(); if (!overview_controller->InOverviewSession()) - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); started_handling_events_ = true; }
diff --git a/ash/magnifier/docked_magnifier_controller_impl.cc b/ash/magnifier/docked_magnifier_controller_impl.cc index 02d7ff9..8fac759 100644 --- a/ash/magnifier/docked_magnifier_controller_impl.cc +++ b/ash/magnifier/docked_magnifier_controller_impl.cc
@@ -583,7 +583,7 @@ SplitViewController::EndReason::kNormal); } - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); } if (new_enabled) {
diff --git a/ash/magnifier/docked_magnifier_controller_impl_unittest.cc b/ash/magnifier/docked_magnifier_controller_impl_unittest.cc index 8f3e63a..b3b5f2b9 100644 --- a/ash/magnifier/docked_magnifier_controller_impl_unittest.cc +++ b/ash/magnifier/docked_magnifier_controller_impl_unittest.cc
@@ -328,7 +328,7 @@ // Enable overview mode followed by the magnifier. auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); controller()->SetEnabled(true); EXPECT_TRUE(controller()->GetEnabled()); @@ -364,7 +364,7 @@ // Simulate going into split view, by enabling overview mode, and snapping // a window to the left. auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); split_view_controller->SnapWindow(window.get(), SplitViewController::LEFT); EXPECT_EQ(split_view_controller->state(), SplitViewState::kLeftSnapped); @@ -401,7 +401,7 @@ CreateTestWindowInShell(SK_ColorWHITE, 200, gfx::Rect(0, 0, 200, 200))); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); auto* split_view_controller = Shell::Get()->split_view_controller();
diff --git a/ash/public/cpp/test/shell_test_api.h b/ash/public/cpp/test/shell_test_api.h index 2bc974d..58bd7d2 100644 --- a/ash/public/cpp/test/shell_test_api.h +++ b/ash/public/cpp/test/shell_test_api.h
@@ -69,9 +69,6 @@ // fullscreen button. void ToggleFullscreen(); - // Enters or exits overview mode. - void ToggleOverviewMode(); - // Returns true if it is in overview selecting mode. bool IsOverviewSelecting();
diff --git a/ash/public/interfaces/ash_message_center_controller.mojom b/ash/public/interfaces/ash_message_center_controller.mojom index 1effb5a..4fc2fbf7 100644 --- a/ash/public/interfaces/ash_message_center_controller.mojom +++ b/ash/public/interfaces/ash_message_center_controller.mojom
@@ -9,7 +9,4 @@ interface AshMessageCenterController { // Sets the ARC notification instance. SetArcNotificationsInstance(arc.mojom.NotificationsInstance instance); - - // Changes the quiet mode state in the message center. - SetQuietMode(bool enabled); };
diff --git a/ash/public/interfaces/assistant_controller.mojom b/ash/public/interfaces/assistant_controller.mojom index 90ce9ebd..707aee49 100644 --- a/ash/public/interfaces/assistant_controller.mojom +++ b/ash/public/interfaces/assistant_controller.mojom
@@ -105,6 +105,9 @@ // Requests that all notifications be removed. If |from_server| is true the // request was initiated by the server. RemoveAllNotifications(bool from_server); + + // Changes the quiet mode state in the message center. + SetQuietMode(bool enabled); }; // Interface to the AssistantScreenContextController which is owned by the
diff --git a/ash/session/session_controller_impl.cc b/ash/session/session_controller_impl.cc index 1133cb7..ac2d368 100644 --- a/ash/session/session_controller_impl.cc +++ b/ash/session/session_controller_impl.cc
@@ -426,9 +426,7 @@ void SessionControllerImpl::CanSwitchActiveUser( CanSwitchActiveUserCallback callback) { // Cancel overview mode when switching user profiles. - OverviewController* controller = Shell::Get()->overview_controller(); - if (controller->InOverviewSession()) - controller->ToggleOverview(); + Shell::Get()->overview_controller()->EndOverview(); ash::Shell::Get() ->screen_switch_check_controller()
diff --git a/ash/session/session_controller_impl_unittest.cc b/ash/session/session_controller_impl_unittest.cc index 91d2601..9a69c300 100644 --- a/ash/session/session_controller_impl_unittest.cc +++ b/ash/session/session_controller_impl_unittest.cc
@@ -613,8 +613,8 @@ } // Methods needed to test with overview mode. - bool ToggleOverview() { - return Shell::Get()->overview_controller()->ToggleOverview(); + bool StartOverview() { + return Shell::Get()->overview_controller()->StartOverview(); } bool InOverviewSession() const { return Shell::Get()->overview_controller()->InOverviewSession(); @@ -771,7 +771,7 @@ EXPECT_EQ(0, switch_callback_hit_count()); gfx::Rect bounds(0, 0, 100, 100); std::unique_ptr<aura::Window> w(CreateTestWindowInShellWithBounds(bounds)); - ASSERT_TRUE(ToggleOverview()); + ASSERT_TRUE(StartOverview()); ASSERT_TRUE(InOverviewSession()); SwitchUser(CanSwitchUserTest::NO_DIALOG); ASSERT_FALSE(InOverviewSession());
diff --git a/ash/shelf/app_list_button_unittest.cc b/ash/shelf/app_list_button_unittest.cc index 241059f..bc5c773 100644 --- a/ash/shelf/app_list_button_unittest.cc +++ b/ash/shelf/app_list_button_unittest.cc
@@ -284,7 +284,7 @@ // Enter Overview mode. OverviewController* overview_controller = Shell::Get()->overview_controller(); - ASSERT_TRUE(overview_controller->ToggleOverview()); + ASSERT_TRUE(overview_controller->StartOverview()); ASSERT_TRUE(overview_controller->InOverviewSession()); test_api.RunMessageLoopUntilAnimationsDone();
diff --git a/ash/shelf/back_button_unittest.cc b/ash/shelf/back_button_unittest.cc index 945d20c2..51f1479 100644 --- a/ash/shelf/back_button_unittest.cc +++ b/ash/shelf/back_button_unittest.cc
@@ -166,7 +166,7 @@ // Enter Overview mode, since the shelf view is hidden from the Kiosk Next // home screen. OverviewController* overview_controller = Shell::Get()->overview_controller(); - ASSERT_TRUE(overview_controller->ToggleOverview()); + ASSERT_TRUE(overview_controller->StartOverview()); ASSERT_TRUE(overview_controller->InOverviewSession()); test_api()->RunMessageLoopUntilAnimationsDone();
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc index c2961d33..80d4771 100644 --- a/ash/shelf/shelf_layout_manager_unittest.cc +++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -1367,7 +1367,7 @@ OverviewController* overview_controller = Shell::Get()->overview_controller(); // Tests that the shelf is visible when in overview mode - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); ash::ShellTestApi().WaitForOverviewAnimationState( ash::OverviewAnimationState::kEnterAnimationComplete); @@ -1376,7 +1376,7 @@ EXPECT_EQ(SHELF_BACKGROUND_OVERVIEW, GetShelfWidget()->GetBackgroundType()); // Test that on exiting overview mode, the shelf returns to auto hide state. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); ash::ShellTestApi().WaitForOverviewAnimationState( ash::OverviewAnimationState::kExitAnimationComplete); @@ -3225,14 +3225,14 @@ TestDisplayObserver observer; { OverviewAnimationWaiter waiter; - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); waiter.Wait(); } ASSERT_TRUE(TabletModeControllerTestApi().IsTabletModeStarted()); EXPECT_EQ(0, observer.metrics_change_count()); { OverviewAnimationWaiter waiter; - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); waiter.Wait(); } ASSERT_TRUE(TabletModeControllerTestApi().IsTabletModeStarted()); @@ -3254,7 +3254,7 @@ OverviewController* overview_controller = Shell::Get()->overview_controller(); { OverviewAnimationWaiter waiter; - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); shelf->SetAlignment(SHELF_ALIGNMENT_LEFT); waiter.Wait(); } @@ -3263,7 +3263,7 @@ // Change alignment during overview exit animation. { OverviewAnimationWaiter waiter; - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); shelf->SetAlignment(SHELF_ALIGNMENT_BOTTOM); waiter.Wait(); }
diff --git a/ash/shell_test_api.cc b/ash/shell_test_api.cc index 34c94c1d..fd14036 100644 --- a/ash/shell_test_api.cc +++ b/ash/shell_test_api.cc
@@ -195,10 +195,6 @@ ash::accelerators::ToggleFullscreen(); } -void ShellTestApi::ToggleOverviewMode() { - shell_->overview_controller()->ToggleOverview(); -} - bool ShellTestApi::IsOverviewSelecting() { return shell_->overview_controller()->InOverviewSession(); }
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 18c6c1d..e2d0e481 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">இணைத்தால், உங்கள் சாதனங்கள் இன்னும் சிறப்பாக வேலை செய்யும்</translation> <translation id="112308213915226829">அடுக்கைத் தானாக மறை</translation> <translation id="1153356358378277386">இணைத்த சாதனங்கள்</translation> +<translation id="1175572348579024023">நகர்த்து</translation> <translation id="1178581264944972037">இடைநிறுத்து</translation> <translation id="1195412055398077112">ஓவர்ஸ்கேன்</translation> <translation id="119944043368869598">அனைத்தையும் அழி</translation> @@ -252,6 +253,7 @@ <translation id="4778095205580009397">டெமோ அமர்வில் Google அசிஸ்டண்ட்டைப் பயன்படுத்த முடியாது.</translation> <translation id="479989351350248267">தேடல்</translation> <translation id="4804818685124855865">தொடர்பைத் துண்டி</translation> +<translation id="4831034276697007977">தானாகக் கிளிக் செய்யும் அம்சத்தை ஆஃப் செய்ய விரும்புகிறீர்களா?</translation> <translation id="4849058404725798627">விசைப்பலகை ஃபோகஸ் மூலம் ஆப்ஜெக்ட்டைத் தனிப்படுத்து</translation> <translation id="485592688953820832">எந்தச் செயலும் இல்லை (இடைநிறுத்தும்)</translation> <translation id="4872237917498892622">Alt+தேடல் அல்லது Shift</translation> @@ -418,6 +420,7 @@ <translation id="7561014039265304140"><ph name="SPECIFIED_RESOLUTION" /> ஐ <ph name="DISPLAY_NAME" /> ஆதரிக்கவில்லை. <ph name="FALLBACK_RESOLUTION" /> க்குத் தெளிவு மாற்றப்பட்டது</translation> <translation id="7562368315689366235">ஈமொஜி தட்டு</translation> <translation id="7564874036684306347">சாளரத்தை வேறு டெஸ்க்டாப்க்கு மாற்றினால், அது எதிர்பாராதவிதமாகச் செயல்படக் கூடும். அடுத்தடுத்து வரும் அறிவிப்புகளும் சாளரங்களும் உரையாடல்களும் டெஸ்க்டாப்களுக்கு இடையே பிரிக்கப்படலாம்.</translation> +<translation id="7568294522609223312">தானாகக் கிளிக் செய்வதை ஆஃப் செய்தல்</translation> <translation id="7569509451529460200">பிரெய்லி மற்றும் ChromeVox இயக்கப்பட்டன</translation> <translation id="7593891976182323525">தேடல் அல்லது Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (உரிமையாளர்)</translation>
diff --git a/ash/system/message_center/message_center_controller.cc b/ash/system/message_center/message_center_controller.cc index 45566b46..d6e4e1e 100644 --- a/ash/system/message_center/message_center_controller.cc +++ b/ash/system/message_center/message_center_controller.cc
@@ -114,8 +114,4 @@ arc_notification_manager_->SetInstance(std::move(arc_notification_instance)); } -void MessageCenterController::SetQuietMode(bool enabled) { - MessageCenter::Get()->SetQuietMode(enabled); -} - } // namespace ash
diff --git a/ash/system/message_center/message_center_controller.h b/ash/system/message_center/message_center_controller.h index b9161d3..a5158cc 100644 --- a/ash/system/message_center/message_center_controller.h +++ b/ash/system/message_center/message_center_controller.h
@@ -41,7 +41,6 @@ // mojom::AshMessageCenterController: void SetArcNotificationsInstance( arc::mojom::NotificationsInstancePtr arc_notification_instance) override; - void SetQuietMode(bool enabled) override; InactiveUserNotificationBlocker* inactive_user_notification_blocker_for_testing() {
diff --git a/ash/system/message_center/notifier_settings_view.cc b/ash/system/message_center/notifier_settings_view.cc index f777393..0cf8b1a 100644 --- a/ash/system/message_center/notifier_settings_view.cc +++ b/ash/system/message_center/notifier_settings_view.cc
@@ -116,6 +116,8 @@ void OnFocus() override; bool OnKeyPressed(const ui::KeyEvent& event) override; bool OnKeyReleased(const ui::KeyEvent& event) override; + bool OnMousePressed(const ui::MouseEvent& event) override; + void OnMouseReleased(const ui::MouseEvent& event) override; void OnPaint(gfx::Canvas* canvas) override; void OnBlur() override; const char* GetClassName() const override; @@ -192,6 +194,14 @@ return contents_->OnKeyReleased(event); } +bool NotifierButtonWrapperView::OnMousePressed(const ui::MouseEvent& event) { + return contents_->OnMousePressed(event); +} + +void NotifierButtonWrapperView::OnMouseReleased(const ui::MouseEvent& event) { + contents_->OnMouseReleased(event); +} + void NotifierButtonWrapperView::OnPaint(gfx::Canvas* canvas) { View::OnPaint(canvas); views::Painter::PaintFocusPainter(this, canvas, focus_painter_.get());
diff --git a/ash/system/message_center/unified_message_center_view.cc b/ash/system/message_center/unified_message_center_view.cc index 9a7c704..b2d7706 100644 --- a/ash/system/message_center/unified_message_center_view.cc +++ b/ash/system/message_center/unified_message_center_view.cc
@@ -46,39 +46,16 @@ constexpr base::TimeDelta kCollapseAnimationDuration = base::TimeDelta::FromMilliseconds(640); -enum ClearAllButtonTag { - kStackingBarClearAllButtonTag, - kBottomClearAllButtonTag, -}; - -constexpr int kClearAllButtonRowHeight = 3 * kUnifiedNotificationCenterSpacing; - class ScrollerContentsView : public views::View { public: ScrollerContentsView(UnifiedMessageListView* message_list_view, views::ButtonListener* listener) { - auto* contents_layout = SetLayoutManager( - std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical)); + auto* contents_layout = SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::kVertical, + gfx::Insets(0, 0, kUnifiedNotificationCenterSpacing, 0))); contents_layout->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kStretch); AddChildView(message_list_view); - - views::View* button_container = new views::View; - auto* button_layout = - button_container->SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::kHorizontal, - gfx::Insets(kUnifiedNotificationCenterSpacing), 0)); - button_layout->set_main_axis_alignment( - views::BoxLayout::MainAxisAlignment::kEnd); - - auto* clear_all_button = new RoundedLabelButton( - listener, l10n_util::GetStringUTF16( - IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_LABEL)); - clear_all_button->SetTooltipText(l10n_util::GetStringUTF16( - IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_TOOLTIP)); - clear_all_button->set_tag(kBottomClearAllButtonTag); - button_container->AddChildView(clear_all_button); - AddChildView(button_container); } ~ScrollerContentsView() override = default; @@ -100,7 +77,6 @@ StackingBarClearAllButton(views::ButtonListener* listener, const base::string16& text) : views::LabelButton(listener, text) { - set_tag(kStackingBarClearAllButtonTag); SetEnabledTextColors(kUnifiedMenuButtonColorActive); SetHorizontalAlignment(gfx::ALIGN_CENTER); SetBorder(views::CreateEmptyBorder(gfx::Insets())); @@ -285,7 +261,7 @@ scroll_bar_(new MessageCenterScrollBar(this)), scroller_(new views::ScrollView()), message_list_view_(new UnifiedMessageListView(this, model)), - last_scroll_position_from_bottom_(kClearAllButtonRowHeight), + last_scroll_position_from_bottom_(0), animation_(std::make_unique<gfx::LinearAnimation>(this)) { message_list_view_->Init(); @@ -392,9 +368,6 @@ preferred_size.set_height(preferred_size.height() + bar_height); } - // Hide Clear All button at the buttom from initial viewport. - preferred_size.set_height(preferred_size.height() - kClearAllButtonRowHeight); - if (animation_state_ == UnifiedMessageCenterAnimationState::COLLAPSE) { int height = preferred_size.height() * (1.0 - GetAnimationValue()); preferred_size.set_height(height); @@ -431,18 +404,8 @@ void UnifiedMessageCenterView::ButtonPressed(views::Button* sender, const ui::Event& event) { - if (sender) { - switch (sender->tag()) { - case kStackingBarClearAllButtonTag: - base::RecordAction(base::UserMetricsAction( - "StatusArea_Notifications_StackingBarClearAll")); - break; - case kBottomClearAllButtonTag: - base::RecordAction( - base::UserMetricsAction("StatusArea_Notifications_ClearAll")); - break; - } - } + base::RecordAction( + base::UserMetricsAction("StatusArea_Notifications_StackingBarClearAll")); message_list_view_->ClearAllWithAnimation(); }
diff --git a/ash/system/message_center/unified_message_center_view.h b/ash/system/message_center/unified_message_center_view.h index 143ebc3..aa9df6d 100644 --- a/ash/system/message_center/unified_message_center_view.h +++ b/ash/system/message_center/unified_message_center_view.h
@@ -49,7 +49,8 @@ }; // The header shown above the notification list displaying the number of hidden -// notifications. +// notifications. There are currently two UI implementations toggled by the +// NotificationStackingBarRedesign feature flag. class StackingNotificationCounterView : public views::View { public: explicit StackingNotificationCounterView(views::ButtonListener* listener);
diff --git a/ash/system/message_center/unified_message_center_view_unittest.cc b/ash/system/message_center/unified_message_center_view_unittest.cc index a09d276..4af630b 100644 --- a/ash/system/message_center/unified_message_center_view_unittest.cc +++ b/ash/system/message_center/unified_message_center_view_unittest.cc
@@ -218,9 +218,6 @@ auto id0 = AddNotification(); EXPECT_TRUE(message_center_view()->GetVisible()); - EXPECT_EQ(3 * kUnifiedNotificationCenterSpacing, - GetScrollerContents()->height() - - GetScroller()->GetVisibleRect().bottom()); // The notification first slides out of the list. MessageCenter::Get()->RemoveNotification(id0, true /* by_user */); @@ -393,7 +390,7 @@ TEST_F(UnifiedMessageCenterViewTest, InitialPositionWithLargeNotification) { AddNotification(); AddNotification(); - CreateMessageCenterView(100 /* max_height */); + CreateMessageCenterView(80 /* max_height */); EXPECT_TRUE(message_center_view()->GetVisible()); // MessageCenterView is shorter than the notification.
diff --git a/ash/system/overview/overview_button_tray.cc b/ash/system/overview/overview_button_tray.cc index 4572bdf..10a0a00 100644 --- a/ash/system/overview/overview_button_tray.cc +++ b/ash/system/overview/overview_button_tray.cc
@@ -158,7 +158,11 @@ // Note: Toggling overview mode will fail if there is no window to show, the // screen is locked, a modal dialog is open or is running in kiosk app // session. - bool performed = controller->ToggleOverview(); + bool performed; + if (controller->InOverviewSession()) + performed = controller->EndOverview(); + else + performed = controller->StartOverview(); Shell::Get()->metrics()->RecordUserMetricsAction(UMA_TRAY_OVERVIEW); return performed; }
diff --git a/ash/system/overview/overview_button_tray_unittest.cc b/ash/system/overview/overview_button_tray_unittest.cc index d148742..a7285b43 100644 --- a/ash/system/overview/overview_button_tray_unittest.cc +++ b/ash/system/overview/overview_button_tray_unittest.cc
@@ -266,11 +266,11 @@ std::unique_ptr<aura::Window> window( CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20))); - EXPECT_TRUE(Shell::Get()->overview_controller()->ToggleOverview()); + EXPECT_TRUE(Shell::Get()->overview_controller()->StartOverview()); EXPECT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); EXPECT_TRUE(GetTray()->is_active()); - EXPECT_TRUE(Shell::Get()->overview_controller()->ToggleOverview()); + EXPECT_TRUE(Shell::Get()->overview_controller()->EndOverview()); EXPECT_FALSE(Shell::Get()->overview_controller()->InOverviewSession()); EXPECT_FALSE(GetTray()->is_active()); } @@ -355,7 +355,7 @@ // Enter splitview mode. Snap |window1| to the left, this will be the default // splitview window. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); SplitViewController* split_view_controller = Shell::Get()->split_view_controller(); split_view_controller->SnapWindow(window1.get(), SplitViewController::LEFT);
diff --git a/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc b/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc index 0adb2da..753bd4c9 100644 --- a/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc +++ b/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc
@@ -51,7 +51,7 @@ TEST_F(UserChooserDetailedViewControllerTest, ShowMultiProfileLoginWithOverview) { // Enter ovewview mode. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); // Show system tray. @@ -80,7 +80,7 @@ std::unique_ptr<views::Widget> widget = CreateTestWidget(); // Enter overview mode. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); // Show system tray.
diff --git a/ash/wallpaper/wallpaper_view.cc b/ash/wallpaper/wallpaper_view.cc index 46e19e3..f930f96 100644 --- a/ash/wallpaper/wallpaper_view.cc +++ b/ash/wallpaper/wallpaper_view.cc
@@ -97,7 +97,7 @@ // Events that happen while app list is sliding out during overview should // be ignored to prevent overview from disappearing out from under the user. if (!IsSlidingOutOverviewFromShelf()) - controller->ToggleOverview(); + controller->EndOverview(); event->StopPropagation(); }
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index 234c65f..795a443 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -223,7 +223,7 @@ if (overview_controller->InOverviewSession()) { // Selecting the active desk's mini_view in overview mode is allowed and // should just exit overview mode normally. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); } return; } @@ -294,7 +294,7 @@ // Exit overview mode immediately without any animations before taking the // ending desk screenshot. This makes sure that the ending desk // screenshot will only show the windows in that desk, not overview stuff. - Shell::Get()->overview_controller()->ToggleOverview( + Shell::Get()->overview_controller()->EndOverview( OverviewSession::EnterExitOverviewType::kImmediateExit); }
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index c02e2db..126866c 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -251,7 +251,7 @@ auto* controller = DesksController::Get(); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); const auto* overview_grid = @@ -309,9 +309,9 @@ // Exit overview mode and re-enter. Since we have more than one pre-existing // desks, their mini_views should be created upon construction of the desks // bar. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); EXPECT_FALSE(overview_controller->InOverviewSession()); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); // Get the new grid and the new desk_bar_view. @@ -586,7 +586,7 @@ // desks mini views, and there are exactly two windows in the overview mode // grid. auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); const auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); @@ -623,14 +623,14 @@ // showing exactly one window. auto win2 = CreateTestWindow(gfx::Rect(50, 50, 200, 200)); wm::ActivateWindow(win2.get()); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); EXPECT_EQ(1u, overview_grid->window_list().size()); // When exiting overview mode without changing desks, the focus should be // restored to the same window. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); EXPECT_FALSE(overview_controller->InOverviewSession()); // Run a loop since the overview session is destroyed async and until that // happens, focus will be on the dummy "OverviewModeFocusedWidget". @@ -653,7 +653,7 @@ // Enter overview mode. auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); auto roots = Shell::GetAllRootWindows(); @@ -701,7 +701,7 @@ Desk* desk_4 = controller->desks()[3].get(); ActivateDesk(desk_4); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); const auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); @@ -753,7 +753,7 @@ // Exiting overview mode should not cause any mini_views refreshes, since the // destroyed overview-specific windows do not show up in the mini_view. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); EXPECT_FALSE(overview_controller->InOverviewSession()); EXPECT_EQ(1, desk_4_observer.notify_counts()); desk_4->RemoveObserver(&desk_4_observer); @@ -782,7 +782,7 @@ // Enter overview mode, and remove desk_2 from its mini-view close button. auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); const auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); @@ -831,7 +831,7 @@ // Exiting overview mode should not cause any mini_views refreshes, since the // destroyed overview-specific windows do not show up in the mini_view. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); EXPECT_FALSE(overview_controller->InOverviewSession()); EXPECT_EQ(1, desk_1_observer.notify_counts()); desk_1->RemoveObserver(&desk_1_observer); @@ -848,7 +848,7 @@ // Enter overview mode, and click on `desk_1`'s mini_view, and expect that // overview mode exits since this is the already active desk. auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); const auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); @@ -914,7 +914,7 @@ EXPECT_TRUE(shadow->layer()->GetTargetVisibility()); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); EXPECT_EQ(1u, overview_grid->size()); @@ -978,7 +978,7 @@ ASSERT_TRUE(window_state->IsMinimized()); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); auto* overview_session = overview_controller->overview_session(); @@ -1023,7 +1023,7 @@ EXPECT_EQ(window.get(), wm::GetActiveWindow()); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); const auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); @@ -1163,7 +1163,7 @@ // Enter overview and expect that the backdrop is still present for desk_1 but // hidden. auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); ASSERT_TRUE(desk_1_backdrop_controller->backdrop_window()); EXPECT_FALSE(desk_1_backdrop_controller->backdrop_window()->IsVisible()); @@ -1194,7 +1194,7 @@ // Exit overview, and expect that desk_2's backdrop remains hidden since the // desk is not activated yet. - overview_controller->ToggleOverview( + overview_controller->EndOverview( OverviewSession::EnterExitOverviewType::kImmediateExit); EXPECT_FALSE(overview_controller->InOverviewSession()); EXPECT_FALSE(desk_1_backdrop_controller->backdrop_window()); @@ -1213,6 +1213,48 @@ EXPECT_FALSE(desk_2_backdrop_controller->backdrop_window()); } +TEST_F(DesksTest, NoDesksBarInTabletModeWithOneDesk) { + // Initially there's only one desk. + auto* controller = DesksController::Get(); + ASSERT_EQ(1u, controller->desks().size()); + + auto window = CreateTestWindow(gfx::Rect(0, 0, 250, 100)); + wm::ActivateWindow(window.get()); + EXPECT_EQ(window.get(), wm::GetActiveWindow()); + + // Enter tablet mode and expect that the DesksBar widget won't be created. + // Avoid TabletModeController::OnGetSwitchStates() from disabling tablet mode. + base::RunLoop().RunUntilIdle(); + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); + + auto* overview_controller = Shell::Get()->overview_controller(); + overview_controller->StartOverview(); + EXPECT_TRUE(overview_controller->InOverviewSession()); + const auto* overview_grid = + GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); + const auto* desks_bar_view = overview_grid->GetDesksBarViewForTesting(); + ASSERT_FALSE(desks_bar_view); + + // It's possible to drag the window without any crashes. + auto* overview_session = overview_controller->overview_session(); + auto* overview_item = + overview_session->GetOverviewItemForWindow(window.get()); + DragItemToPoint(overview_item, window->GetBoundsInScreen().CenterPoint(), + GetEventGenerator(), /*drop=*/true); + + // Exit overview and add a new desk, then re-enter overview. Expect that now + // the desks bar is visible. + overview_controller->EndOverview(); + EXPECT_FALSE(overview_controller->InOverviewSession()); + controller->NewDesk(); + overview_controller->StartOverview(); + EXPECT_TRUE(overview_controller->InOverviewSession()); + overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); + desks_bar_view = overview_grid->GetDesksBarViewForTesting(); + ASSERT_TRUE(desks_bar_view); + ASSERT_EQ(2u, desks_bar_view->mini_views().size()); +} + TEST_F(DesksTest, TabletModeDesksCreationRemovalCycle) { auto window = CreateTestWindow(gfx::Rect(0, 0, 250, 100)); wm::ActivateWindow(window.get()); @@ -1224,7 +1266,7 @@ Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); auto* desks_controller = DesksController::Get(); @@ -1266,7 +1308,7 @@ controller->NewDesk(); ASSERT_EQ(3u, controller->desks().size()); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); const auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); @@ -1341,7 +1383,7 @@ EXPECT_EQ(window.get(), wm::GetActiveWindow()); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow());
diff --git a/ash/wm/desks/desks_util.cc b/ash/wm/desks/desks_util.cc index 6792f1af..5a2c824b 100644 --- a/ash/wm/desks/desks_util.cc +++ b/ash/wm/desks/desks_util.cc
@@ -6,6 +6,7 @@ #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/shell_window_ids.h" +#include "ash/public/cpp/tablet_mode.h" #include "ash/wm/desks/desk.h" #include "ash/wm/desks/desks_controller.h" #include "ui/aura/window.h" @@ -122,6 +123,12 @@ return nullptr; } +bool ShouldDesksBarBeCreated() { + return features::IsVirtualDesksEnabled() && + (!TabletMode::Get()->IsEnabled() || + DesksController::Get()->desks().size() > 1); +} + } // namespace desks_util } // namespace ash
diff --git a/ash/wm/desks/desks_util.h b/ash/wm/desks/desks_util.h index aefd95e..7bada37 100644 --- a/ash/wm/desks/desks_util.h +++ b/ash/wm/desks/desks_util.h
@@ -42,6 +42,9 @@ // container, otherwise return nullptr. ASH_EXPORT aura::Window* GetDeskContainerForContext(aura::Window* context); +// Returns true if the DesksBar widget should be created in overview mode. +ASH_EXPORT bool ShouldDesksBarBeCreated(); + } // namespace desks_util } // namespace ash
diff --git a/ash/wm/gestures/overview_gesture_handler.cc b/ash/wm/gestures/overview_gesture_handler.cc index 174776e2..1b44348 100644 --- a/ash/wm/gestures/overview_gesture_handler.cc +++ b/ash/wm/gestures/overview_gesture_handler.cc
@@ -66,11 +66,13 @@ // Reset scroll amount on toggling. scroll_x_ = scroll_y_ = 0; base::RecordAction(base::UserMetricsAction("Touchpad_Gesture_Overview")); - if (overview_controller->InOverviewSession() && - overview_controller->AcceptSelection()) { - return true; + if (overview_controller->InOverviewSession()) { + if (overview_controller->AcceptSelection()) + return true; + overview_controller->EndOverview(); + } else { + overview_controller->StartOverview(); } - overview_controller->ToggleOverview(); return true; }
diff --git a/ash/wm/gestures/overview_gesture_handler_unittest.cc b/ash/wm/gestures/overview_gesture_handler_unittest.cc index 020c0eb5..638a239 100644 --- a/ash/wm/gestures/overview_gesture_handler_unittest.cc +++ b/ash/wm/gestures/overview_gesture_handler_unittest.cc
@@ -27,10 +27,6 @@ return CreateTestWindowInShellWithDelegate(&delegate_, -1, bounds); } - void ToggleOverview() { - Shell::Get()->overview_controller()->ToggleOverview(); - } - bool InOverviewSession() { return Shell::Get()->overview_controller()->InOverviewSession(); } @@ -93,7 +89,7 @@ // Enter overview mode as if using an accelerator. // Entering overview mode with an upwards three-finger scroll gesture would // have the same result (allow selection using horizontal scroll). - ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_TRUE(InOverviewSession()); // Long scroll right moves selection to the fourth window.
diff --git a/ash/wm/overview/overview_controller.cc b/ash/wm/overview/overview_controller.cc index 9b7c71e..2a8e560 100644 --- a/ash/wm/overview/overview_controller.cc +++ b/ash/wm/overview/overview_controller.cc
@@ -281,158 +281,24 @@ } } -bool OverviewController::ToggleOverview( +bool OverviewController::StartOverview( OverviewSession::EnterExitOverviewType type) { - // Hide the virtual keyboard as it obstructs the overview mode. - // Don't need to hide if it's the a11y keyboard, as overview mode - // can accept text input and it resizes correctly with the a11y keyboard. - keyboard::KeyboardController::Get()->HideKeyboardImplicitlyByUser(); + // No need to start overview if overview is currently active. + if (InOverviewSession()) + return true; - auto windows = - Shell::Get()->mru_window_tracker()->BuildMruWindowList(kActiveDesk); - - // Hidden windows will be removed by wm::ShouldExcludeForOverview so we - // must copy them out first. - std::vector<aura::Window*> hide_windows(windows.size()); - auto end = std::copy_if( - windows.begin(), windows.end(), hide_windows.begin(), - [](aura::Window* w) { return w->GetProperty(kHideInOverviewKey); }); - hide_windows.resize(end - hide_windows.begin()); - base::EraseIf(windows, wm::ShouldExcludeForOverview); - // Overview windows will handle showing their transient related windows, so if - // a window in |windows| has a transient root also in |windows|, we can remove - // it as the transient root will handle showing the window. - wm::RemoveTransientDescendants(&windows); - - // We may want to slide the overview grid in or out in some cases, even if - // not explicitly stated. - OverviewSession::EnterExitOverviewType new_type = type; - if (type == OverviewSession::EnterExitOverviewType::kNormal && - ShouldSlideInOutOverview(windows)) { - new_type = OverviewSession::EnterExitOverviewType::kWindowsMinimized; - } - - if (InOverviewSession()) { - // Do not allow ending overview if we're in single split mode unless swiping - // up from the shelf in tablet mode. - if (windows.empty() && - Shell::Get()->split_view_controller()->InTabletSplitViewMode() && - type != OverviewSession::EnterExitOverviewType::kSwipeFromShelf) { - return true; - } - - TRACE_EVENT_ASYNC_BEGIN0("ui", "OverviewController::ExitOverview", this); - - // Suspend occlusion tracker until the exit animation is complete. - PauseOcclusionTracker(); - - overview_session_->set_enter_exit_overview_type(new_type); - if (type == OverviewSession::EnterExitOverviewType::kWindowsMinimized || - type == OverviewSession::EnterExitOverviewType::kSwipeFromShelf) { - // Minimize the windows without animations. When the home launcher button - // is pressed, minimized widgets will get created in their place, and - // those widgets will be slid out of overview. Otherwise, - // HomeLauncherGestureHandler will handle sliding the windows out and when - // this function is called, we do not need to create minimized widgets. - std::vector<aura::Window*> windows_to_hide_minimize(windows.size()); - auto it = std::copy_if( - windows.begin(), windows.end(), windows_to_hide_minimize.begin(), - [](aura::Window* window) { - return !wm::GetWindowState(window)->IsMinimized(); - }); - windows_to_hide_minimize.resize( - std::distance(windows_to_hide_minimize.begin(), it)); - wm::HideAndMaybeMinimizeWithoutAnimation(windows_to_hide_minimize, true); - } - - EndOverview(); - } else { - // Don't start overview if it is not allowed. - if (!CanEnterOverview()) - return false; - - TRACE_EVENT_ASYNC_BEGIN0("ui", "OverviewController::EnterOverview", this); - - // Clear any animations that may be running from last overview end. - for (const auto& animation : delayed_animations_) - animation->Shutdown(); - if (!delayed_animations_.empty()) - OnEndingAnimationComplete(/*canceled=*/true); - delayed_animations_.clear(); - - // Suspend occlusion tracker until the enter animation is complete. - PauseOcclusionTracker(); - - overview_session_ = std::make_unique<OverviewSession>(this); - overview_session_->set_enter_exit_overview_type(new_type); - for (auto& observer : observers_) - observer.OnOverviewModeStarting(); - overview_session_->Init(windows, hide_windows); - if (IsWallpaperChangeAllowed()) - overview_wallpaper_controller_->Blur(/*animate_only=*/false); - - // For app dragging, there are no start animations so add a delay to delay - // animations observing when the start animation ends, such as the shelf, - // shadow and rounded corners. - if (new_type == OverviewSession::EnterExitOverviewType::kWindowDragged && - !delayed_animation_task_delay_.is_zero()) { - auto force_delay_observer = - std::make_unique<ForceDelayObserver>(delayed_animation_task_delay_); - AddEnterAnimationObserver(std::move(force_delay_observer)); - } - - if (start_animations_.empty()) - OnStartingAnimationComplete(/*canceled=*/false); - - if (!last_overview_session_time_.is_null()) { - UMA_HISTOGRAM_LONG_TIMES("Ash.WindowSelector.TimeBetweenUse", - base::Time::Now() - last_overview_session_time_); - } - } - return true; + return ToggleOverview(type); } // TODO(flackr): Make OverviewController observe the activation of // windows, so we can remove OverviewDelegate. -// TODO(sammiequon): Refactor to use a single entry point for overview. -void OverviewController::EndOverview() { +bool OverviewController::EndOverview( + OverviewSession::EnterExitOverviewType type) { + // No need to end overview if overview is already ended. if (!InOverviewSession()) - return; + return true; - if (!occlusion_tracker_pauser_) - PauseOcclusionTracker(); - - if (!start_animations_.empty()) - OnStartingAnimationComplete(/*canceled=*/true); - start_animations_.clear(); - - overview_session_->set_is_shutting_down(true); - // Do not show mask and show during overview shutdown. - overview_session_->UpdateMaskAndShadow(); - - for (auto& observer : observers_) - observer.OnOverviewModeEnding(overview_session_.get()); - overview_session_->Shutdown(); - -#if DCHECK_IS_ON() - const auto enter_exit_type = overview_session_->enter_exit_overview_type(); - if (enter_exit_type == - OverviewSession::EnterExitOverviewType::kImmediateExit && - !delayed_animations_.empty()) { - // Immediate exit type implies no delayed exit animations at all, if we get - // here then this is a bug. - NOTREACHED(); - } -#endif - - // Don't delete |overview_session_| yet since the stack is still using it. - base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, - overview_session_.release()); - last_overview_session_time_ = base::Time::Now(); - for (auto& observer : observers_) - observer.OnOverviewModeEnded(); - if (delayed_animations_.empty()) - OnEndingAnimationComplete(/*canceled=*/false); + return ToggleOverview(type); } bool OverviewController::InOverviewSession() const { @@ -484,8 +350,7 @@ active_window = split_view_controller->GetDefaultSnappedWindow(); DCHECK(active_window); split_view_controller->EndSplitView(); - if (InOverviewSession()) - ToggleOverview(); + EndOverview(); MaximizeIfSnapped(active_window); ::wm::ActivateWindow(active_window); base::RecordAction( @@ -512,7 +377,7 @@ // If we are not in overview mode, enter overview mode and then find the // window item to snap. - ToggleOverview(); + StartOverview(); DCHECK(overview_session_); OverviewGrid* current_grid = overview_session_->GetGridWithRootWindow( active_window->GetRootWindow()); @@ -668,6 +533,149 @@ return windows; } +bool OverviewController::ToggleOverview( + OverviewSession::EnterExitOverviewType type) { + // Hide the virtual keyboard as it obstructs the overview mode. + // Don't need to hide if it's the a11y keyboard, as overview mode + // can accept text input and it resizes correctly with the a11y keyboard. + keyboard::KeyboardController::Get()->HideKeyboardImplicitlyByUser(); + + auto windows = + Shell::Get()->mru_window_tracker()->BuildMruWindowList(kActiveDesk); + + // Hidden windows will be removed by wm::ShouldExcludeForOverview so we + // must copy them out first. + std::vector<aura::Window*> hide_windows(windows.size()); + auto end = std::copy_if( + windows.begin(), windows.end(), hide_windows.begin(), + [](aura::Window* w) { return w->GetProperty(kHideInOverviewKey); }); + hide_windows.resize(end - hide_windows.begin()); + base::EraseIf(windows, wm::ShouldExcludeForOverview); + // Overview windows will handle showing their transient related windows, so if + // a window in |windows| has a transient root also in |windows|, we can remove + // it as the transient root will handle showing the window. + wm::RemoveTransientDescendants(&windows); + + // We may want to slide the overview grid in or out in some cases, even if + // not explicitly stated. + OverviewSession::EnterExitOverviewType new_type = type; + if (type == OverviewSession::EnterExitOverviewType::kNormal && + ShouldSlideInOutOverview(windows)) { + new_type = OverviewSession::EnterExitOverviewType::kWindowsMinimized; + } + + if (InOverviewSession()) { + // Do not allow ending overview if we're in single split mode unless swiping + // up from the shelf in tablet mode. + if (windows.empty() && + Shell::Get()->split_view_controller()->InTabletSplitViewMode() && + Shell::Get()->split_view_controller()->state() != + SplitViewState::kBothSnapped && + type != OverviewSession::EnterExitOverviewType::kSwipeFromShelf) { + return true; + } + + TRACE_EVENT_ASYNC_BEGIN0("ui", "OverviewController::ExitOverview", this); + + // Suspend occlusion tracker until the exit animation is complete. + PauseOcclusionTracker(); + + overview_session_->set_enter_exit_overview_type(new_type); + if (type == OverviewSession::EnterExitOverviewType::kWindowsMinimized || + type == OverviewSession::EnterExitOverviewType::kSwipeFromShelf) { + // Minimize the windows without animations. When the home launcher button + // is pressed, minimized widgets will get created in their place, and + // those widgets will be slid out of overview. Otherwise, + // HomeLauncherGestureHandler will handle sliding the windows out and when + // this function is called, we do not need to create minimized widgets. + std::vector<aura::Window*> windows_to_hide_minimize(windows.size()); + auto it = std::copy_if( + windows.begin(), windows.end(), windows_to_hide_minimize.begin(), + [](aura::Window* window) { + return !wm::GetWindowState(window)->IsMinimized(); + }); + windows_to_hide_minimize.resize( + std::distance(windows_to_hide_minimize.begin(), it)); + wm::HideAndMaybeMinimizeWithoutAnimation(windows_to_hide_minimize, true); + } + + if (!start_animations_.empty()) + OnStartingAnimationComplete(/*canceled=*/true); + start_animations_.clear(); + + overview_session_->set_is_shutting_down(true); + // Do not show mask and show during overview shutdown. + overview_session_->UpdateMaskAndShadow(); + + for (auto& observer : observers_) + observer.OnOverviewModeEnding(overview_session_.get()); + overview_session_->Shutdown(); + +#if DCHECK_IS_ON() + const auto enter_exit_type = overview_session_->enter_exit_overview_type(); + if (enter_exit_type == + OverviewSession::EnterExitOverviewType::kImmediateExit && + !delayed_animations_.empty()) { + // Immediate exit type implies no delayed exit animations at all, if we + // get here then this is a bug. + NOTREACHED(); + } +#endif + + // Don't delete |overview_session_| yet since the stack is still using it. + base::ThreadTaskRunnerHandle::Get()->DeleteSoon( + FROM_HERE, overview_session_.release()); + last_overview_session_time_ = base::Time::Now(); + for (auto& observer : observers_) + observer.OnOverviewModeEnded(); + if (delayed_animations_.empty()) + OnEndingAnimationComplete(/*canceled=*/false); + } else { + // Don't start overview if it is not allowed. + if (!CanEnterOverview()) + return false; + + TRACE_EVENT_ASYNC_BEGIN0("ui", "OverviewController::EnterOverview", this); + + // Clear any animations that may be running from last overview end. + for (const auto& animation : delayed_animations_) + animation->Shutdown(); + if (!delayed_animations_.empty()) + OnEndingAnimationComplete(/*canceled=*/true); + delayed_animations_.clear(); + + // Suspend occlusion tracker until the enter animation is complete. + PauseOcclusionTracker(); + + overview_session_ = std::make_unique<OverviewSession>(this); + overview_session_->set_enter_exit_overview_type(new_type); + for (auto& observer : observers_) + observer.OnOverviewModeStarting(); + overview_session_->Init(windows, hide_windows); + if (IsWallpaperChangeAllowed()) + overview_wallpaper_controller_->Blur(/*animate_only=*/false); + + // For app dragging, there are no start animations so add a delay to delay + // animations observing when the start animation ends, such as the shelf, + // shadow and rounded corners. + if (new_type == OverviewSession::EnterExitOverviewType::kWindowDragged && + !delayed_animation_task_delay_.is_zero()) { + auto force_delay_observer = + std::make_unique<ForceDelayObserver>(delayed_animation_task_delay_); + AddEnterAnimationObserver(std::move(force_delay_observer)); + } + + if (start_animations_.empty()) + OnStartingAnimationComplete(/*canceled=*/false); + + if (!last_overview_session_time_.is_null()) { + UMA_HISTOGRAM_LONG_TIMES("Ash.WindowSelector.TimeBetweenUse", + base::Time::Now() - last_overview_session_time_); + } + } + return true; +} + // static void OverviewController::SetDoNotChangeWallpaperForTests() { g_disable_wallpaper_change_for_tests = true;
diff --git a/ash/wm/overview/overview_controller.h b/ash/wm/overview/overview_controller.h index 74991a1..7199441b 100644 --- a/ash/wm/overview/overview_controller.h +++ b/ash/wm/overview/overview_controller.h
@@ -29,13 +29,13 @@ OverviewController(); ~OverviewController() override; - // Attempts to toggle overview mode and returns true if successful (showing + // Starts/Ends overview with |type|. Returns true if successful (showing // overview would be unsuccessful if there are no windows to show). Depending // on |type| the enter/exit animation will look different. - bool ToggleOverview(OverviewSession::EnterExitOverviewType type = - OverviewSession::EnterExitOverviewType::kNormal); - - void EndOverview(); + bool StartOverview(OverviewSession::EnterExitOverviewType type = + OverviewSession::EnterExitOverviewType::kNormal); + bool EndOverview(OverviewSession::EnterExitOverviewType type = + OverviewSession::EnterExitOverviewType::kNormal); // Returns true if overview mode is active. bool InOverviewSession() const; @@ -116,6 +116,12 @@ FRIEND_TEST_ALL_PREFIXES(TabletModeControllerTest, DisplayDisconnectionDuringOverview); + // Attempts to toggle overview mode and returns true if successful (showing + // overview would be unsuccessful if there are no windows to show). Depending + // on |type| the enter/exit animation will look different. + bool ToggleOverview(OverviewSession::EnterExitOverviewType type = + OverviewSession::EnterExitOverviewType::kNormal); + // There is no need to blur or dim the wallpaper for tests. static void SetDoNotChangeWallpaperForTests();
diff --git a/ash/wm/overview/overview_controller_unittest.cc b/ash/wm/overview/overview_controller_unittest.cc index 4930571..ef425ed 100644 --- a/ash/wm/overview/overview_controller_unittest.cc +++ b/ash/wm/overview/overview_controller_unittest.cc
@@ -163,7 +163,7 @@ TestOverviewObserver observer(/*should_monitor_animation_state = */ true); // Enter without windows. auto* shell = Shell::Get(); - shell->overview_controller()->ToggleOverview(); + shell->overview_controller()->StartOverview(); EXPECT_TRUE(shell->overview_controller()->InOverviewSession()); EXPECT_EQ(TestOverviewObserver::COMPLETED, observer.starting_animation_state()); @@ -172,7 +172,7 @@ EXPECT_TRUE(overview_controller->HasBlurAnimationForTest()); // Exit without windows still creates an animation. - shell->overview_controller()->ToggleOverview(); + shell->overview_controller()->EndOverview(); EXPECT_FALSE(shell->overview_controller()->InOverviewSession()); EXPECT_EQ(TestOverviewObserver::UNKNOWN, observer.ending_animation_state()); EXPECT_TRUE(overview_controller->HasBlurForTest()); @@ -194,7 +194,7 @@ ASSERT_EQ(TestOverviewObserver::UNKNOWN, observer.ending_animation_state()); // Enter with windows. - shell->overview_controller()->ToggleOverview(); + shell->overview_controller()->StartOverview(); EXPECT_TRUE(shell->overview_controller()->InOverviewSession()); EXPECT_EQ(TestOverviewObserver::UNKNOWN, observer.starting_animation_state()); EXPECT_EQ(TestOverviewObserver::UNKNOWN, observer.ending_animation_state()); @@ -202,7 +202,7 @@ EXPECT_FALSE(overview_controller->HasBlurAnimationForTest()); // Exit with windows before starting animation ends. - shell->overview_controller()->ToggleOverview(); + shell->overview_controller()->EndOverview(); EXPECT_FALSE(shell->overview_controller()->InOverviewSession()); EXPECT_EQ(TestOverviewObserver::CANCELED, observer.starting_animation_state()); @@ -214,7 +214,7 @@ observer.Reset(); // Enter again before exit animation ends. - shell->overview_controller()->ToggleOverview(); + shell->overview_controller()->StartOverview(); EXPECT_TRUE(shell->overview_controller()->InOverviewSession()); EXPECT_EQ(TestOverviewObserver::UNKNOWN, observer.starting_animation_state()); EXPECT_EQ(TestOverviewObserver::CANCELED, observer.ending_animation_state()); @@ -242,16 +242,16 @@ std::unique_ptr<aura::Window> window( CreateTestWindowInShellWithBounds(bounds)); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_FALSE(observer.last_animation_was_slide()); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->EndOverview(); EXPECT_FALSE(observer.last_animation_was_slide()); // Even with all window minimized, there should not be a slide animation. ASSERT_FALSE(Shell::Get()->overview_controller()->InOverviewSession()); wm::GetWindowState(window.get())->Minimize(); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_FALSE(observer.last_animation_was_slide()); } @@ -270,19 +270,19 @@ std::unique_ptr<aura::Window> window( CreateTestWindowInShellWithBounds(bounds)); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_FALSE(observer.last_animation_was_slide()); // Exit to home launcher. Slide animation should be used, and all windows // should be minimized. - Shell::Get()->overview_controller()->ToggleOverview( + Shell::Get()->overview_controller()->EndOverview( OverviewSession::EnterExitOverviewType::kWindowsMinimized); EXPECT_TRUE(observer.last_animation_was_slide()); ASSERT_FALSE(Shell::Get()->overview_controller()->InOverviewSession()); EXPECT_TRUE(wm::GetWindowState(window.get())->IsMinimized()); // All windows are minimized, so we should use the slide animation. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_TRUE(observer.last_animation_was_slide()); } @@ -311,7 +311,7 @@ EXPECT_EQ(OcclusionState::VISIBLE, window2->occlusion_state()); // Enter with windows. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_EQ(OcclusionState::OCCLUDED, window1->occlusion_state()); EXPECT_EQ(OcclusionState::VISIBLE, window2->occlusion_state()); @@ -323,7 +323,7 @@ EXPECT_EQ(OcclusionState::VISIBLE, window1->occlusion_state()); // Exit with windows. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->EndOverview(); EXPECT_EQ(OcclusionState::VISIBLE, window1->occlusion_state()); EXPECT_EQ(OcclusionState::VISIBLE, window2->occlusion_state()); observer.WaitForEndingAnimationComplete(); @@ -335,7 +335,7 @@ observer.Reset(); // Enter again. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_EQ(OcclusionState::OCCLUDED, window1->occlusion_state()); EXPECT_EQ(OcclusionState::VISIBLE, window2->occlusion_state()); auto* active = wm::GetActiveWindow(); @@ -369,7 +369,7 @@ GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplay().id()); GetAppListTestHelper()->CheckVisibility(true); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(false); } @@ -402,7 +402,7 @@ keyboard_controller()->ShowKeyboard(false /* locked */); ASSERT_TRUE(keyboard::WaitUntilShown()); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); // Timeout failure here if the keyboard does not hide. keyboard::WaitUntilHidden(); @@ -413,7 +413,7 @@ keyboard_controller()->ShowKeyboard(true /* locked */); ASSERT_TRUE(keyboard::WaitUntilShown()); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); EXPECT_FALSE(keyboard::IsKeyboardHiding()); }
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index 807b141a..28813d8c 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -24,6 +24,7 @@ #include "ash/shell.h" #include "ash/wm/desks/desk_mini_view.h" #include "ash/wm/desks/desks_bar_view.h" +#include "ash/wm/desks/desks_util.h" #include "ash/wm/overview/cleanup_animation_observer.h" #include "ash/wm/overview/drop_target_view.h" #include "ash/wm/overview/overview_constants.h" @@ -1319,7 +1320,7 @@ } bool OverviewGrid::IsDesksBarViewActive() const { - DCHECK(features::IsVirtualDesksEnabled()); + DCHECK(desks_util::ShouldDesksBarBeCreated()); // The desk bar view is not active if there is only a single desk when // overview is started. Once there are more than one desk, it should stay @@ -1329,7 +1330,7 @@ } gfx::Rect OverviewGrid::GetGridEffectiveBounds() const { - if (!features::IsVirtualDesksEnabled() || !IsDesksBarViewActive()) + if (!desks_util::ShouldDesksBarBeCreated() || !IsDesksBarViewActive()) return bounds_; gfx::Rect effective_bounds = bounds_; @@ -1339,7 +1340,7 @@ bool OverviewGrid::UpdateDesksBarDragDetails( const gfx::Point& screen_location) { - DCHECK(features::IsVirtualDesksEnabled()); + DCHECK(desks_util::ShouldDesksBarBeCreated()); const bool dragged_item_over_bar = desks_widget_->GetWindowBoundsInScreen().Contains(screen_location); @@ -1350,7 +1351,7 @@ bool OverviewGrid::MaybeDropItemOnDeskMiniView( const gfx::Point& screen_location, OverviewItem* drag_item) { - DCHECK(features::IsVirtualDesksEnabled()); + DCHECK(desks_util::ShouldDesksBarBeCreated()); // End the drag for the DesksBarView. desks_bar_view_->SetDragDetails(screen_location, @@ -1386,7 +1387,7 @@ } void OverviewGrid::MaybeInitDesksWidget() { - if (!features::IsVirtualDesksEnabled() || desks_widget_) + if (!desks_util::ShouldDesksBarBeCreated() || desks_widget_) return; desks_widget_ = DesksBarView::CreateDesksWidget(
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc index b4963c1..b6f62f2 100644 --- a/ash/wm/overview/overview_item.cc +++ b/ash/wm/overview/overview_item.cc
@@ -15,6 +15,7 @@ #include "ash/scoped_animation_disabler.h" #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" +#include "ash/wm/desks/desks_util.h" #include "ash/wm/drag_window_controller.h" #include "ash/wm/overview/delayed_animation_observer_impl.h" #include "ash/wm/overview/overview_animation_type.h" @@ -764,7 +765,7 @@ OverviewController* overview_controller = Shell::Get()->overview_controller(); if (disable_mask_ || !overview_controller || !overview_controller->InOverviewSession() || - (!ash::features::ShouldUseShaderRoundedCorner() && + (!features::ShouldUseShaderRoundedCorner() && overview_grid_->window_list().size() > 10) || overview_controller->IsInStartAnimation() || is_being_dragged_ || overview_grid_->IsDropTargetWindow(GetWindow()) || @@ -864,7 +865,7 @@ } void OverviewItem::HandleLongPressEvent(const gfx::PointF& location_in_screen) { - if (ShouldAllowSplitView() || features::IsVirtualDesksEnabled()) + if (ShouldAllowSplitView() || desks_util::ShouldDesksBarBeCreated()) overview_session_->StartNormalDragMode(location_in_screen); }
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index 3b7de06..341b13c 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -189,7 +189,10 @@ void ToggleOverview(OverviewSession::EnterExitOverviewType type = OverviewSession::EnterExitOverviewType::kNormal) { - overview_controller()->ToggleOverview(type); + if (overview_controller()->InOverviewSession()) + overview_controller()->EndOverview(type); + else + overview_controller()->StartOverview(type); } gfx::Rect GetTransformedBounds(aura::Window* window) {
diff --git a/ash/wm/overview/overview_window_drag_controller.cc b/ash/wm/overview/overview_window_drag_controller.cc index 12d4210e..d427235a 100644 --- a/ash/wm/overview/overview_window_drag_controller.cc +++ b/ash/wm/overview/overview_window_drag_controller.cc
@@ -12,6 +12,7 @@ #include "ash/screen_util.h" #include "ash/shell.h" #include "ash/wm/desks/desk_preview_view.h" +#include "ash/wm/desks/desks_util.h" #include "ash/wm/overview/overview_constants.h" #include "ash/wm/overview/overview_controller.h" #include "ash/wm/overview/overview_grid.h" @@ -95,7 +96,7 @@ item_(item), on_desks_bar_item_size_(GetItemSizeWhenOnDesksBar(item)), should_allow_split_view_(ShouldAllowSplitView()), - virtual_desks_enabled_(features::IsVirtualDesksEnabled()) {} + virtual_desks_bar_enabled_(desks_util::ShouldDesksBarBeCreated()) {} OverviewWindowDragController::~OverviewWindowDragController() = default; @@ -132,7 +133,7 @@ overview_session_->GetGridWithRootWindow(item_->root_window()) ->StartNudge(item_); did_move_ = true; - } else if (should_allow_split_view_ || virtual_desks_enabled_) { + } else if (should_allow_split_view_ || virtual_desks_bar_enabled_) { StartNormalDragMode(location_in_screen); } } @@ -183,7 +184,7 @@ void OverviewWindowDragController::StartNormalDragMode( const gfx::PointF& location_in_screen) { - DCHECK(should_allow_split_view_ || virtual_desks_enabled_); + DCHECK(should_allow_split_view_ || virtual_desks_bar_enabled_); did_move_ = true; current_drag_behavior_ = DragBehavior::kNormalDrag; @@ -334,7 +335,7 @@ gfx::PointF centerpoint = location_in_screen - (initial_event_location_ - initial_centerpoint_); - if (virtual_desks_enabled_) { + if (virtual_desks_bar_enabled_) { if (item_->overview_grid()->UpdateDesksBarDragDetails( gfx::ToRoundedPoint(location_in_screen))) { // The drag location intersects the bounds of the DesksBarView, in this @@ -391,7 +392,7 @@ } // Attempt to move a window to a different desk. - if (virtual_desks_enabled_) { + if (virtual_desks_bar_enabled_) { item_->SetOpacity(original_opacity_); if (item_->overview_grid()->MaybeDropItemOnDeskMiniView(
diff --git a/ash/wm/overview/overview_window_drag_controller.h b/ash/wm/overview/overview_window_drag_controller.h index f2f33680..a9b41af 100644 --- a/ash/wm/overview/overview_window_drag_controller.h +++ b/ash/wm/overview/overview_window_drag_controller.h
@@ -142,8 +142,8 @@ // True if SplitView is enabled. const bool should_allow_split_view_; - // True if the Virtual Desks feature is enabled. - const bool virtual_desks_enabled_; + // True if the Virtual Desks bar is created and dragging to desks is enabled. + const bool virtual_desks_bar_enabled_; // False if the initial drag location was not a snap region, or if it was in // a snap region but the drag has since moved out.
diff --git a/ash/wm/overview/overview_window_drag_controller_unittest.cc b/ash/wm/overview/overview_window_drag_controller_unittest.cc index bae7edb..d1dcbab 100644 --- a/ash/wm/overview/overview_window_drag_controller_unittest.cc +++ b/ash/wm/overview/overview_window_drag_controller_unittest.cc
@@ -97,7 +97,7 @@ wm::ActivateWindow(window.get()); EXPECT_EQ(window.get(), wm::GetActiveWindow()); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); auto* overview_session = overview_controller->overview_session(); auto* overview_item = @@ -125,7 +125,7 @@ wm::ActivateWindow(window.get()); EXPECT_EQ(window.get(), wm::GetActiveWindow()); auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); auto* overview_session = overview_controller->overview_session(); auto* overview_item =
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc index 9c10cbc..58c08c6a 100644 --- a/ash/wm/splitview/split_view_controller.cc +++ b/ash/wm/splitview/split_view_controller.cc
@@ -1802,16 +1802,13 @@ } void SplitViewController::StartOverview(bool window_drag) { - if (!Shell::Get()->overview_controller()->InOverviewSession()) { - Shell::Get()->overview_controller()->ToggleOverview( - window_drag ? OverviewSession::EnterExitOverviewType::kWindowDragged - : OverviewSession::EnterExitOverviewType::kNormal); - } + Shell::Get()->overview_controller()->StartOverview( + window_drag ? OverviewSession::EnterExitOverviewType::kWindowDragged + : OverviewSession::EnterExitOverviewType::kNormal); } void SplitViewController::EndOverview() { - if (Shell::Get()->overview_controller()->InOverviewSession()) - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->EndOverview(); } void SplitViewController::FinishWindowResizing(aura::Window* window) {
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc index 44a79e70..e97ff42 100644 --- a/ash/wm/splitview/split_view_controller_unittest.cc +++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -175,7 +175,12 @@ void EndSplitView() { split_view_controller()->EndSplitView(); } void ToggleOverview() { - Shell::Get()->overview_controller()->ToggleOverview(); + OverviewController* overview_controller = + Shell::Get()->overview_controller(); + if (overview_controller->InOverviewSession()) + overview_controller->EndOverview(); + else + overview_controller->StartOverview(); } void LongPressOnOverivewButtonTray() { @@ -2675,13 +2680,13 @@ std::unique_ptr<aura::Window> window2( CreateWindowWithType(bounds, AppType::BROWSER)); - Shell::Get()->overview_controller()->ToggleOverview(); + ToggleOverview(); EXPECT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); OverviewSession* overview_session = Shell::Get()->overview_controller()->overview_session(); EXPECT_TRUE(overview_session->IsWindowInOverview(window1.get())); EXPECT_TRUE(overview_session->IsWindowInOverview(window2.get())); - Shell::Get()->overview_controller()->ToggleOverview(); + ToggleOverview(); std::unique_ptr<WindowResizer> resizer = StartDrag(window1.get(), window1.get());
diff --git a/ash/wm/splitview/split_view_drag_indicators_unittest.cc b/ash/wm/splitview/split_view_drag_indicators_unittest.cc index d5b4d8d3..1873a17 100644 --- a/ash/wm/splitview/split_view_drag_indicators_unittest.cc +++ b/ash/wm/splitview/split_view_drag_indicators_unittest.cc
@@ -46,7 +46,11 @@ void ToggleOverview() { auto* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + if (overview_controller->InOverviewSession()) + overview_controller->EndOverview(); + else + overview_controller->StartOverview(); + if (!overview_controller->InOverviewSession()) { overview_session_ = nullptr; split_view_drag_indicators_ = nullptr;
diff --git a/ash/wm/tablet_mode/tablet_mode_controller.cc b/ash/wm/tablet_mode/tablet_mode_controller.cc index bbdca66..8a8eaae 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller.cc
@@ -926,7 +926,7 @@ const auto state = Shell::Get()->split_view_controller()->state(); if (state == SplitViewState::kLeftSnapped || state == SplitViewState::kRightSnapped) { - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); } state_ = State::kInTabletMode;
diff --git a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc index 26725c3..b3a1759 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
@@ -554,7 +554,7 @@ ASSERT_FALSE(IsTabletModeStarted()); tablet_mode_controller()->SetEnabledForTest(true); - EXPECT_TRUE(Shell::Get()->overview_controller()->ToggleOverview()); + EXPECT_TRUE(Shell::Get()->overview_controller()->StartOverview()); UpdateDisplay("800x600"); base::RunLoop().RunUntilIdle(); @@ -1481,7 +1481,7 @@ std::unique_ptr<aura::Window> window = CreateTestWindow(); ::wm::ActivateWindow(window.get()); split_view_controller->SnapWindow(window.get(), SplitViewController::LEFT); - EXPECT_TRUE(Shell::Get()->overview_controller()->ToggleOverview()); + EXPECT_TRUE(Shell::Get()->overview_controller()->StartOverview()); } // Test that when OnKioskNextEnabled() is called the UI mode changes into
diff --git a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc index 5a3f566..7831efab 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc
@@ -154,7 +154,7 @@ ->overview_button_tray(); DCHECK(overview_button_tray); overview_button_tray->SnapRippleToActivated(); - controller->ToggleOverview( + controller->StartOverview( OverviewSession::EnterExitOverviewType::kWindowDragged); }
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager.cc b/ash/wm/tablet_mode/tablet_mode_window_manager.cc index d01d989..82d7f9aa 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_manager.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_manager.cc
@@ -422,10 +422,9 @@ // snapped to one side but no window snapped to the other side. OverviewController* overview_controller = Shell::Get()->overview_controller(); SplitViewState state = split_view_controller->state(); - if (overview_controller->InOverviewSession() != - (state == SplitViewState::kLeftSnapped || - state == SplitViewState::kRightSnapped)) { - overview_controller->ToggleOverview(); + if (state == SplitViewState::kLeftSnapped || + state == SplitViewState::kRightSnapped) { + overview_controller->StartOverview(); } }
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc index 22455829..b760d446 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -1315,13 +1315,13 @@ CreateWindow(aura::client::WINDOW_TYPE_NORMAL, rect2)); OverviewController* overview_controller = Shell::Get()->overview_controller(); - ASSERT_TRUE(overview_controller->ToggleOverview()); + ASSERT_TRUE(overview_controller->StartOverview()); ASSERT_TRUE(overview_controller->InOverviewSession()); TabletModeWindowManager* manager = CreateTabletModeWindowManager(); ASSERT_TRUE(manager); EXPECT_FALSE(overview_controller->InOverviewSession()); - ASSERT_TRUE(overview_controller->ToggleOverview()); + ASSERT_TRUE(overview_controller->StartOverview()); ASSERT_TRUE(overview_controller->InOverviewSession()); // Destroy the manager again and check that the windows return to their // previous state. @@ -1769,12 +1769,12 @@ EXPECT_EQ(window->bounds(), rect); OverviewController* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_EQ(window->bounds(), rect); // Exit overview mode will update all windows' bounds. However, if the window // is minimized, the bounds will not be updated. - overview_controller->ToggleOverview(); + overview_controller->EndOverview(); EXPECT_EQ(window->bounds(), rect); }
diff --git a/ash/wm/window_finder_unittest.cc b/ash/wm/window_finder_unittest.cc index f1fd8d9a..9509ef2 100644 --- a/ash/wm/window_finder_unittest.cc +++ b/ash/wm/window_finder_unittest.cc
@@ -71,7 +71,7 @@ CreateTestWindow(gfx::Rect(0, 0, 100, 100)); OverviewController* overview_controller = Shell::Get()->overview_controller(); - overview_controller->ToggleOverview(); + overview_controller->StartOverview(); EXPECT_TRUE(overview_controller->InOverviewSession()); // Get |window1| and |window2|'s transformed bounds in overview.
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc index a5c9746..6ca420d 100644 --- a/ash/wm/workspace/workspace_layout_manager_unittest.cc +++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -1364,13 +1364,13 @@ } // Toggle overview. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); base::RunLoop().RunUntilIdle(); backdrop = test_helper.GetBackdropWindow(); ASSERT_TRUE(backdrop); EXPECT_FALSE(backdrop->IsVisible()); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->EndOverview(); base::RunLoop().RunUntilIdle(); backdrop = test_helper.GetBackdropWindow(); ASSERT_TRUE(backdrop); @@ -1397,12 +1397,12 @@ } // Toggle overview with the delegate. - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->StartOverview(); base::RunLoop().RunUntilIdle(); backdrop = test_helper.GetBackdropWindow(); ASSERT_TRUE(backdrop); EXPECT_FALSE(backdrop->IsVisible()); - Shell::Get()->overview_controller()->ToggleOverview(); + Shell::Get()->overview_controller()->EndOverview(); base::RunLoop().RunUntilIdle(); backdrop = test_helper.GetBackdropWindow(); ASSERT_TRUE(backdrop); @@ -1563,8 +1563,8 @@ ShowTopWindowBackdropForContainer(default_container(), true); EXPECT_TRUE(test_helper.GetBackdropWindow()); - // Toggle overview button to enter overview mode. - Shell::Get()->overview_controller()->ToggleOverview(); + // Enter overview mode. + Shell::Get()->overview_controller()->StartOverview(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(test_helper.GetBackdropWindow());
diff --git a/base/process/process_win.cc b/base/process/process_win.cc index dd065b6..e43ce2d 100644 --- a/base/process/process_win.cc +++ b/base/process/process_win.cc
@@ -165,10 +165,14 @@ DPLOG(ERROR) << "Error waiting for process exit"; Exited(exit_code); } else { - // The process can't be terminated, perhaps because it has already - // exited or is in the process of exiting. A non-zero timeout is necessary - // here for the same reasons as above. - DPLOG(ERROR) << "Unable to terminate process"; + // The process can't be terminated, perhaps because it has already exited or + // is in the process of exiting. An error code of ERROR_ACCESS_DENIED is the + // undocumented-but-expected result if the process has already exited or + // started exiting when TerminateProcess is called, so don't print an error + // message in that case. + if (GetLastError() != ERROR_ACCESS_DENIED) + DPLOG(ERROR) << "Unable to terminate process"; + // A non-zero timeout is necessary here for the same reasons as above. if (::WaitForSingleObject(Handle(), kWaitMs) == WAIT_OBJECT_0) { DWORD actual_exit; Exited(::GetExitCodeProcess(Handle(), &actual_exit) ? actual_exit
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_am.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_am.xtb index 12b73ec..f774385 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_am.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_am.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="am"> <translation id="1492646418094134664">በChrome ክሬዲት ካርድን ለመሙላት መታ ያድርጉ</translation> +<translation id="1566281227936819866">የተቀመጡ የመክፈያ ዘዴዎችን በማሳየት ላይ</translation> <translation id="2610239185026711824">የይለፍ ቃል ጠቁም</translation> <translation id="2803478378562657435">የተቀመጡ የይለፍ ቃላትን እና የይለፍ ቃል አማራጮችን በማሳየት ላይ</translation> <translation id="2903493209154104877">አድራሻዎች</translation> @@ -12,5 +13,6 @@ <translation id="6810986916917535017">በChrome ይለፍ ቃል ለመሙላት መታ ያድርጉ</translation> <translation id="7299100402441711551">አድራሻዎችን አሳይ</translation> <translation id="7494879913343971937">የይለፍ ቃላትን አሳይ</translation> +<translation id="8037472847879765671">የመክፈያ ዘዴዎችን አሳይ</translation> <translation id="8507520749471379845">የይለፍ ቃላት ይገኛሉ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb index 38d5bab..8ffe423f 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="fil"> <translation id="1492646418094134664">I-tap para punan ang credit card gamit ang Chrome</translation> +<translation id="1566281227936819866">Ipinapakita ang mga na-save na paraan ng pagbabayad</translation> <translation id="2610239185026711824">Magmungkahi ng password</translation> <translation id="2803478378562657435">Ipinapakita ang mga naka-save na password at mga opsyon sa password</translation> <translation id="2903493209154104877">Mga Address</translation> @@ -12,5 +13,6 @@ <translation id="6810986916917535017">I-tap para punan ang password gamit ang Chrome</translation> <translation id="7299100402441711551">Ipakita ang Mga Address</translation> <translation id="7494879913343971937">Ipakita ang mga password</translation> +<translation id="8037472847879765671">Ipakita ang mga paraan ng pagbabayad</translation> <translation id="8507520749471379845">May mga password</translation> </translationbundle> \ 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 84342a3..0401e32d 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -54,6 +54,10 @@ "java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayout.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabStripToolbarCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabStripToolbarViewProperties.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabStripViewBinder.java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_layout.xml b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_layout.xml new file mode 100644 index 0000000..943a363 --- /dev/null +++ b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_layout.xml
@@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/selectable_list" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/modern_primary_color"/> \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_toolbar.xml b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_toolbar.xml new file mode 100644 index 0000000..2077d666 --- /dev/null +++ b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_toolbar.xml
@@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorToolbar + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <org.chromium.ui.widget.ButtonCompat + android:id="@+id/action_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:enabled="false" + android:text="@string/tab_selection_editor_group" + style="@style/TextButton.Inverse" /> +</org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorToolbar> \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java index 58de2d9..9ec1f22d 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
@@ -76,8 +76,26 @@ } private class TabListOnScrollListener extends RecyclerView.OnScrollListener { + // TODO(mattsimmons): Remove state from this class. This is here to prevent scroll signals + // from showing the toolbar shadow after the show/hide of the GTS has already triggered the + // shadow being hidden. Due to this view's visibility being updated asynchronously after + // animating off-screen, checking View.getVisibility() can't be used as the guard condition + // here. Removing/Adding the listener from the view also happens asynchronously and has + // similar undesirable effects. + private boolean mIsActive; + + public void pause() { + mIsActive = false; + } + + public void resume() { + mIsActive = true; + } + @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if (!mIsActive) return; + final int yOffset = recyclerView.computeVerticalScrollOffset(); setShadowVisibility(yOffset > 0); } @@ -145,6 +163,7 @@ mListener.finishedShowing(); // Restore the original value. setItemAnimator(mOriginalAnimator); + mScrollListener.resume(); setShadowVisibility(computeVerticalScrollOffset() > 0); if (mDynamicView != null) { mDynamicView.dropCachedBitmap(); @@ -302,6 +321,7 @@ mListener.finishedHiding(); } }); + mScrollListener.pause(); setShadowVisibility(false); mFadeOutAnimator.start(); if (!animate) mFadeOutAnimator.end();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java index e9ee189..3bb5400 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java
@@ -6,12 +6,14 @@ import android.content.Context; import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModelFilter; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.tab_ui.R; import java.util.ArrayList; import java.util.List; @@ -47,11 +49,18 @@ private final View mParentView; private final TabModelSelector mTabModelSelector; + private final TabSelectionEditorLayout mTabSelectionEditorLayout; + public TabSelectionEditorCoordinator(Context context, View parentView, TabModelSelector tabModelSelector, TabContentManager tabContentManager) { mContext = context; mParentView = parentView; mTabModelSelector = tabModelSelector; + + // TODO(meiliang): call mTabSelectionEditorLayout.initialize() + mTabSelectionEditorLayout = LayoutInflater.from(context) + .inflate(R.layout.tab_selection_editor_layout, null) + .findViewById(R.id.selectable_list); } private void resetWithListOfTabs(@Nullable List<Tab> tab) {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayout.java new file mode 100644 index 0000000..89a968d9 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayout.java
@@ -0,0 +1,83 @@ +// 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.content.Context; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.View; +import android.view.WindowManager; +import android.widget.PopupWindow; + +import org.chromium.chrome.browser.widget.selection.SelectableListLayout; +import org.chromium.chrome.browser.widget.selection.SelectionDelegate; +import org.chromium.chrome.tab_ui.R; + +/** + * This class is used to show the {@link SelectableListLayout} in a {@link PopupWindow}. + */ +class TabSelectionEditorLayout extends SelectableListLayout<Integer> { + private TabSelectionEditorToolbar mToolbar; + private final PopupWindow mWindow; + private View mParentView; + private boolean mIsInitialized; + + // TODO(meiliang): inflates R.layout.tab_selection_editor_layout in + // TabSelectionEditorCoordinator. + public TabSelectionEditorLayout(Context context, AttributeSet attrs) { + super(context, attrs); + + DisplayMetrics displayMetrics = new DisplayMetrics(); + ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay() + .getMetrics(displayMetrics); + mWindow = new PopupWindow(this, displayMetrics.widthPixels, displayMetrics.heightPixels); + } + + /** + * Initializes the RecyclerView and the toolbar for the layout. This must be called before + * calling show/hide. + * + * @param parentView The parent view for the {@link PopupWindow}. + * @param recyclerView The recycler view to be shown. + * @param adapter The adapter that provides views that represent items in the recycler view. + * @param selectionDelegate The {@link SelectionDelegate} that will inform the toolbar of + * selection changes. + */ + void initialize(View parentView, RecyclerView recyclerView, RecyclerView.Adapter adapter, + SelectionDelegate<Integer> selectionDelegate) { + mIsInitialized = true; + initializeRecyclerView(adapter, recyclerView); + mToolbar = + (TabSelectionEditorToolbar) initializeToolbar(R.layout.tab_selection_editor_toolbar, + selectionDelegate, 0, 0, 0, null, false, true); + mParentView = parentView; + } + + /** + * Shows the layout in a {@link PopupWindow}. + */ + public void show() { + assert mIsInitialized; + mWindow.showAtLocation(mParentView, Gravity.CENTER, 0, 0); + } + + /** + * Hides the {@link PopupWindow}. + */ + public void hide() { + assert mIsInitialized; + if (mWindow.isShowing()) mWindow.dismiss(); + } + + /** + * @return The toolbar of the layout. + */ + public TabSelectionEditorToolbar getToolbar() { + return mToolbar; + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java new file mode 100644 index 0000000..144b692 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java
@@ -0,0 +1,36 @@ +// 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; + +/** + * This is a ViewBinder for TabSelectionEditorLayout. + */ +public class TabSelectionEditorLayoutBinder { + /** + * This method binds the given model to the given view. + * @param model The model to use. + * @param view The View to use. + * @param propertyKey The key for the property to update for. + */ + public static void bind( + PropertyModel model, TabSelectionEditorLayout view, PropertyKey propertyKey) { + if (TabSelectionEditorProperties.IS_VISIBLE == propertyKey) { + if (model.get(TabSelectionEditorProperties.IS_VISIBLE)) { + view.show(); + } else { + view.hide(); + } + } else if (TabSelectionEditorProperties.TOOLBAR_GROUP_BUTTON_LISTENER == propertyKey) { + view.getToolbar().setActionButtonOnClickListener( + model.get(TabSelectionEditorProperties.TOOLBAR_GROUP_BUTTON_LISTENER)); + } else if (TabSelectionEditorProperties.TOOLBAR_NAVIGATION_LISTENER == propertyKey) { + view.getToolbar().setNavigationOnClickListener( + model.get(TabSelectionEditorProperties.TOOLBAR_NAVIGATION_LISTENER)); + } + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java new file mode 100644 index 0000000..fef40213 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java
@@ -0,0 +1,29 @@ +// 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 org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * {@link PropertyKey} list for TabSelectionEditor. + */ +public class TabSelectionEditorProperties { + public static final PropertyModel.WritableBooleanPropertyKey IS_VISIBLE = + new PropertyModel.WritableBooleanPropertyKey(); + + public static final PropertyModel + .WritableObjectPropertyKey<View.OnClickListener> TOOLBAR_GROUP_BUTTON_LISTENER = + new PropertyModel.WritableObjectPropertyKey<>(); + + public static final PropertyModel + .WritableObjectPropertyKey<View.OnClickListener> TOOLBAR_NAVIGATION_LISTENER = + new PropertyModel.WritableObjectPropertyKey<>(); + + public static final PropertyKey[] ALL_KEYS = new PropertyKey[] { + IS_VISIBLE, TOOLBAR_GROUP_BUTTON_LISTENER, TOOLBAR_NAVIGATION_LISTENER}; +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java new file mode 100644 index 0000000..84a3451 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java
@@ -0,0 +1,47 @@ +// 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.content.Context; +import android.util.AttributeSet; +import android.widget.Button; + +import org.chromium.chrome.browser.widget.selection.SelectableListToolbar; +import org.chromium.chrome.tab_ui.R; + +import java.util.List; + +/** + * Handles toolbar functionality for TabSelectionEditor. + */ +class TabSelectionEditorToolbar extends SelectableListToolbar<Integer> { + private Button mGroupButton; + + public TabSelectionEditorToolbar(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mGroupButton = (Button) findViewById(org.chromium.chrome.R.id.action_button); + mNumberRollView.setStringForZero(R.string.tab_selection_editor_toolbar_select_tabs); + } + + @Override + public void onSelectionStateChange(List<Integer> selectedItems) { + super.onSelectionStateChange(selectedItems); + mGroupButton.setEnabled(selectedItems.size() > 1); + } + + /** + * Sets a {@link android.view.View.OnClickListener} to respond to {@code mGroupButton} clicking + * event. + * @param listener The listener to set. + */ + public void setActionButtonOnClickListener(OnClickListener listener) { + mGroupButton.setOnClickListener(listener); + } +}
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 be3f9a2..424a2cc0 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
@@ -19,7 +19,6 @@ import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabPanel; import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item; -import org.chromium.chrome.browser.datareduction.DataReductionProxyUma; import org.chromium.chrome.browser.firstrun.FirstRunStatus; import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; @@ -131,13 +130,13 @@ // Note: these values must match the ContextMenuSaveImage enum in enums.xml. // Only add new values at the end, right before NUM_ENTRIES. - @IntDef({TypeSaveImage.LOADED, TypeSaveImage.FETCHED_LOFI, TypeSaveImage.NOT_DOWNLOADABLE, + @IntDef({TypeSaveImage.LOADED, TypeSaveImage.NOT_DOWNLOADABLE, TypeSaveImage.DISABLED_AND_IS_NOT_IMAGE_PARAM, TypeSaveImage.DISABLED_AND_IS_IMAGE_PARAM, TypeSaveImage.SHOWN}) @Retention(RetentionPolicy.SOURCE) public @interface TypeSaveImage { int LOADED = 0; - int FETCHED_LOFI = 1; + // int FETCHED_LOFI = 1; deprecated int NOT_DOWNLOADABLE = 2; int DISABLED_AND_IS_NOT_IMAGE_PARAM = 3; int DISABLED_AND_IS_IMAGE_PARAM = 4; @@ -326,16 +325,7 @@ if (params.isImage() && FirstRunStatus.getFirstRunFlowComplete()) { List<ContextMenuItem> imageTab = new ArrayList<>(); boolean isSrcDownloadableScheme = UrlUtilities.isDownloadableScheme(params.getSrcUrl()); - if (params.imageWasFetchedLoFi()) { - DataReductionProxyUma.previewsLoFiContextMenuAction( - DataReductionProxyUma.ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_SHOWN); - // All image context menu items other than "Load image," "Open original image in - // new tab," and "Copy image URL" should be disabled on Lo-Fi images. - imageTab.add(new ChromeContextMenuItem(Item.LOAD_ORIGINAL_IMAGE)); - if (mMode == ContextMenuMode.NORMAL) { - imageTab.add(new ChromeContextMenuItem(Item.OPEN_IMAGE_IN_NEW_TAB)); - } - } else { + // Avoid showing open image option for same image which is already opened. if (mMode == ContextMenuMode.CUSTOM_TAB && !mDelegate.getPageUrl().equals(params.getSrcUrl())) { @@ -363,9 +353,9 @@ } imageTab.add(new ShareContextMenuItem(R.drawable.ic_share_white_24dp, R.string.contextmenu_share_image, R.id.contextmenu_share_image, false)); - } - recordSaveImageContextMenuResult(params.imageWasFetchedLoFi(), isSrcDownloadableScheme); - groupedItems.add(new Pair<>(R.string.contextmenu_image_title, imageTab)); + + recordSaveImageContextMenuResult(isSrcDownloadableScheme); + groupedItems.add(new Pair<>(R.string.contextmenu_image_title, imageTab)); } if (params.isVideo() && FirstRunStatus.getFirstRunFlowComplete() && params.canSaveMedia() @@ -451,15 +441,6 @@ title = URLUtil.guessFileName(params.getSrcUrl(), null, null); } mDelegate.onOpenInEphemeralTab(params.getSrcUrl(), title); - } else if (itemId == R.id.contextmenu_load_original_image) { - ContextMenuUma.record(params, ContextMenuUma.Action.LOAD_ORIGINAL_IMAGE); - DataReductionProxyUma.previewsLoFiContextMenuAction( - DataReductionProxyUma.ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_CLICKED); - if (!mDelegate.wasLoadOriginalImageRequestedForPageLoad()) { - DataReductionProxyUma.previewsLoFiContextMenuAction( - DataReductionProxyUma.ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_CLICKED_ON_PAGE); - } - mDelegate.onLoadOriginalImage(); } else if (itemId == R.id.contextmenu_copy_link_address) { ContextMenuUma.record(params, ContextMenuUma.Action.COPY_LINK_ADDRESS); mDelegate.onSaveToClipboard( @@ -561,11 +542,9 @@ /** * Record the UMA related to save image context menu option. - * @param wasFetchedLoFi The image was fetched Lo-Fi. * @param isDownloadableScheme The image is downloadable. */ - private void recordSaveImageContextMenuResult( - boolean wasFetchedLoFi, boolean isDownloadableScheme) { + private void recordSaveImageContextMenuResult(boolean isDownloadableScheme) { if (!BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER) .isStartupSuccessfullyCompleted()) { return; @@ -573,11 +552,6 @@ ContextMenuUma.recordSaveImageUma(ContextMenuUma.TypeSaveImage.LOADED); - if (wasFetchedLoFi) { - ContextMenuUma.recordSaveImageUma(ContextMenuUma.TypeSaveImage.FETCHED_LOFI); - return; - } - if (!isDownloadableScheme) { ContextMenuUma.recordSaveImageUma(ContextMenuUma.TypeSaveImage.NOT_DOWNLOADABLE); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuParams.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuParams.java index e8522a537..24e26cd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuParams.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuParams.java
@@ -24,7 +24,6 @@ private final String mTitleText; private final String mUnfilteredLinkUrl; private final String mSrcUrl; - private final boolean mImageWasFetchedLoFi; private final Referrer mReferrer; private final boolean mIsAnchor; @@ -80,13 +79,6 @@ } /** - * @return Whether or not an image was fetched using Lo-Fi. - */ - public boolean imageWasFetchedLoFi() { - return mImageWasFetchedLoFi; - } - - /** * @return the referrer associated with the frame on which the menu is invoked */ public Referrer getReferrer() { @@ -165,15 +157,14 @@ public ContextMenuParams(@WebContextMenuMediaType int mediaType, String pageUrl, String linkUrl, String linkText, String unfilteredLinkUrl, String srcUrl, String titleText, - boolean imageWasFetchedLoFi, Referrer referrer, boolean canSaveMedia, - int triggeringTouchXDp, int triggeringTouchYDp, @MenuSourceType int sourceType) { + Referrer referrer, boolean canSaveMedia, int triggeringTouchXDp, int triggeringTouchYDp, + @MenuSourceType int sourceType) { mPageUrl = pageUrl; mLinkUrl = linkUrl; mLinkText = linkText; mTitleText = titleText; mUnfilteredLinkUrl = unfilteredLinkUrl; mSrcUrl = srcUrl; - mImageWasFetchedLoFi = imageWasFetchedLoFi; mReferrer = referrer; mIsAnchor = !TextUtils.isEmpty(linkUrl); @@ -188,13 +179,12 @@ @CalledByNative private static ContextMenuParams create(@WebContextMenuMediaType int mediaType, String pageUrl, String linkUrl, String linkText, String unfilteredLinkUrl, String srcUrl, - String titleText, boolean imageWasFetchedLoFi, String sanitizedReferrer, - int referrerPolicy, boolean canSaveMedia, int triggeringTouchXDp, - int triggeringTouchYDp, @MenuSourceType int sourceType) { + String titleText, String sanitizedReferrer, int referrerPolicy, boolean canSaveMedia, + int triggeringTouchXDp, int triggeringTouchYDp, @MenuSourceType int sourceType) { Referrer referrer = TextUtils.isEmpty(sanitizedReferrer) ? null : new Referrer(sanitizedReferrer, referrerPolicy); return new ContextMenuParams(mediaType, pageUrl, linkUrl, linkText, unfilteredLinkUrl, - srcUrl, titleText, imageWasFetchedLoFi, referrer, canSaveMedia, triggeringTouchXDp, - triggeringTouchYDp, sourceType); + srcUrl, titleText, referrer, canSaveMedia, triggeringTouchXDp, triggeringTouchYDp, + sourceType); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionProxyUma.java b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionProxyUma.java index 5477a239..92778fc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionProxyUma.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionProxyUma.java
@@ -12,7 +12,6 @@ */ public class DataReductionProxyUma { public static final String UI_ACTION_HISTOGRAM_NAME = "DataReductionProxy.UIAction"; - public static final String PREVIEWS_HISTOGRAM_NAME = "Previews.ContextMenuAction.LoFi"; public static final String USER_VIEWED_ORIGINAL_SIZE_HISTOGRAM_NAME = "DataReductionProxy.UserViewedOriginalSize"; @@ -56,15 +55,6 @@ public static final int ACTION_INFOBAR_ON_TO_ON = 31; public static final int ACTION_INDEX_BOUNDARY = 32; - // Represent the possible Lo-Fi context menu user actions. This must remain in sync with - // Previews.ContextMenuAction.LoFi in tools/metrics/histograms/histograms.xml. - public static final int ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_SHOWN = 0; - public static final int ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_CLICKED = 1; - public static final int ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_CLICKED_ON_PAGE = 2; - // Deprecated: ACTION_LOFI_LOAD_IMAGES_CONTEXT_MENU_SHOWN = 3; - // Deprecated: ACTION_LOFI_LOAD_IMAGES_CONTEXT_MENU_CLICKED = 4; - public static final int ACTION_LOFI_CONTEXT_MENU_INDEX_BOUNDARY = 5; - /** * Record the DataReductionProxy.UIAction histogram. * @param action User action at the promo, first run experience, or settings screen @@ -105,14 +95,4 @@ RecordHistogram.recordPercentageHistogram( USER_VIEWED_SAVINGS_DIFFERENCE_HISTOGRAM_NAME, savedDifference); } - - /** - * Record the Previews.ContextMenuAction.LoFi histogram. - * @param action Lo-Fi user action on the context menu - */ - public static void previewsLoFiContextMenuAction(int action) { - assert action >= 0 && action < ACTION_LOFI_CONTEXT_MENU_INDEX_BOUNDARY; - RecordHistogram.recordEnumeratedHistogram( - PREVIEWS_HISTOGRAM_NAME, action, ACTION_LOFI_CONTEXT_MENU_INDEX_BOUNDARY); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java index 3231e12..3ea790f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java
@@ -8,21 +8,26 @@ import android.content.Context; import android.content.res.Configuration; import android.os.Build; +import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import android.view.ContextThemeWrapper; +import org.chromium.base.VisibleForTesting; import org.chromium.chrome.browser.ChromeBaseAppCompatActivity; /** * Helper methods for supporting night mode. */ public class NightModeUtils { + private static Boolean sNightModeSupportedForTest; + /** * Due to Lemon issues on resources access, night mode is disabled on Kitkat until the issue is * resolved. See https://crbug.com/957286 for details. * @return Whether night mode is supported. */ public static boolean isNightModeSupported() { + if (sNightModeSupportedForTest != null) return sNightModeSupportedForTest; return Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT; } @@ -102,4 +107,9 @@ wrapper.applyOverrideConfiguration(config); return wrapper; } + + @VisibleForTesting + public static void setNightModeSupportedForTesting(@Nullable Boolean nightModeSupported) { + sNightModeSupportedForTest = nightModeSupported; + } }
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb index c585ffe..42b040e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -358,6 +358,7 @@ <translation id="363596933471559332">የተከማቹ ምስክርነቶችን በመጠቀም በራስ-ሰር ወደ የድር ጣቢያዎች መለያ ይግቡ። ባህሪው ሲጠፋ ወደ አንድ ድር ጣቢያ ከመግባትዎ በፊት ማረጋገጫ ይጠየቃሉ።</translation> <translation id="3658159451045945436">ዳግም ማስጀመር የተጎበኙ ጣቢያዎች ዝርዝር ጨምሮ የውሂብ ቁጠባዎን ታሪክ ይደመስሳል።</translation> <translation id="3662546969139119822">እዚህ ምንም ታሪክ የለም</translation> +<translation id="3663367437272849150"><ph name="NUM_SELECTED" /> ትሮችን ይሰብስቡ።</translation> <translation id="3672452749423051839">የአሰሳ ስህተት ጥቆማ አስተያየቶች</translation> <translation id="3692944402865947621">የማከማቻ ቦታው የማይገኝ ስለሆነ <ph name="FILE_NAME" />ን ማውረድ አልተሳካም።</translation> <translation id="3714981814255182093">የአግኝ አሞሌን ክፈት</translation> @@ -632,6 +633,7 @@ <translation id="557283862590186398">Chrome ለዚህ ጣቢያ የእርስዎን ማይክራፎን ለመድረስ ፈቃድ ይፈልጋል።</translation> <translation id="55737423895878184">አካባቢ እና ማሳወቂያዎች ይፈቀዳሉ</translation> <translation id="5578795271662203820">ይህንን ምስል <ph name="SEARCH_ENGINE" /> ላይ ይፈልጉት</translation> +<translation id="5580090775658607195"><ph name="TAB_COUNT" /> ትሮች ተሰብስበዋል</translation> <translation id="5581519193887989363">በማንኛውም ጊዜ ምን እንደሚያሰምሩ በ<ph name="BEGIN_LINK1" />ቅንብሮች<ph name="END_LINK1" /> ውስጥ መምረጥ ይችላሉ።</translation> <translation id="5595485650161345191">አድራሻ አርትዕ</translation> <translation id="5596627076506792578">ተጨማሪ አማራጮች</translation> @@ -710,6 +712,7 @@ <translation id="6181444274883918285">ለየት ያለ ጣቢያን አክል</translation> <translation id="6192333916571137726">ፋይል ያውርዱ</translation> <translation id="6192792657125177640">የተለዩ</translation> +<translation id="6193448654517602979">ትሮችን ምረጥ</translation> <translation id="6194112207524046168">የእርስዎን ካሜራ Chrome እንዲደርስበት ለማድረግ፣ በ <ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ካሜራን በተጨማሪ ያብሩ።</translation> <translation id="6196640612572343990">የሦስተኛ ወገን ኩኪዎችን አግድ</translation> <translation id="6206551242102657620">ግንኙነት ደህንነቱ የተጠበቀ ነው። የጣቢያ መረጃ</translation> @@ -853,6 +856,7 @@ <translation id="7141896414559753902">ጣቢያዎች ብቅ-ባዮችን እንዳያሳዩ ያግዱ (የሚመከር)</translation> <translation id="7149158118503947153">ከ<ph name="DOMAIN_NAME" /> <ph name="BEGIN_LINK" />የመጀመሪያውን ገጽ ጫን<ph name="END_LINK" /></translation> <translation id="7149893636342594995">ባለፉት 24 ሰዓቶች</translation> +<translation id="7161892015146974550">የ<ph name="TAB_TITLE" /> ትር ይምረጡ።</translation> <translation id="7176368934862295254"><ph name="KILOBYTES" /> ኪባ</translation> <translation id="7177466738963138057">ይሄንን በኋላ ቅንብሮች ውስጥ ሊለውጡት ይችላሉ</translation> <translation id="7180611975245234373">አድስ</translation> @@ -885,6 +889,7 @@ <translation id="7403691278183511381">Chrome የመጀመሪያ አሂድ ተሞክሮ</translation> <translation id="741204030948306876">አዎ፣ ገብቼያለሁ</translation> <translation id="7413229368719586778">መጀመሪያ ቀን <ph name="DATE" /></translation> +<translation id="7418565925463285788">የቡድን ትሮች...</translation> <translation id="7423098979219808738">መጀመሪያ ጠይቅ</translation> <translation id="7423538860840206698">ቅንጥብ ሰሌዳን ከማንበብ ታግዷል</translation> <translation id="7431991332293347422">ፍለጋን እና ተጨማሪ ነገሮችን ግላዊነት ለማላበስ የእርስዎ የአሰሳ ታሪክ እንዴት ጥቅም ላይ እንደሚውል ይቆጣጠሩ</translation> @@ -1021,6 +1026,7 @@ <translation id="8339163506404995330">በ<ph name="LANGUAGE" /> ያሉ ገጾች አይተረጎሙም</translation> <translation id="8349013245300336738">ጥቅም ላይ በዋለው የውሂብ መጠን ደርድር</translation> <translation id="8364299278605033898">ታዋቂ ድር ጣቢያዎችን ይመልከቱ</translation> +<translation id="8364603787714420828">የ<ph name="TAB_TITLE" /> ትርን አትምረጥ።</translation> <translation id="8372893542064058268">ለአንድ የተወሰነ ጣቢያ የጀርባ ስምረትን ይፍቀዱ።</translation> <translation id="8374821112118309944">TalkBackን ወደ አዲስ ስሪት ማዘመን አለብዎት።</translation> <translation id="8378714024927312812">በእርስዎ ድርጅት የሚተዳደር</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 81227c6..460a91f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -358,6 +358,7 @@ <translation id="363596933471559332">Awtomatikong mag-sign in sa mga website gamit ang mga naka-store na kredensyal. Kapag naka-off ang feature, hihilingin sa iyong mag-verify sa tuwing magsa-sign in ka sa isang website.</translation> <translation id="3658159451045945436">Kapag na-reset, mabubura ang iyong history ng pagtitipid ng data, kabilang ang listahan ng mga binisitang site.</translation> <translation id="3662546969139119822">Walang history rito</translation> +<translation id="3663367437272849150">Pagpangkatin ang <ph name="NUM_SELECTED" /> tab.</translation> <translation id="3672452749423051839">Mga suhestyon para sa error sa pag-navigate</translation> <translation id="3692944402865947621">Hindi na-download ang <ph name="FILE_NAME" /> dahil hindi maabot ang lokasyon ng storage.</translation> <translation id="3714981814255182093">Buksan ang Bar sa Paghahanap</translation> @@ -632,6 +633,7 @@ <translation id="557283862590186398">Kailangan ng Chrome ng pahintulot na i-access ang iyong mikropono para sa site na ito.</translation> <translation id="55737423895878184">Pinapayagan ang lokasyon at mga notification</translation> <translation id="5578795271662203820">Hanapin sa <ph name="SEARCH_ENGINE" /> ang larawan</translation> +<translation id="5580090775658607195">Ipinangkat ang <ph name="TAB_COUNT" /> tab</translation> <translation id="5581519193887989363">Mapipili mo kung ano ang isi-sync anumang oras sa <ph name="BEGIN_LINK1" />mga setting<ph name="END_LINK1" />.</translation> <translation id="5595485650161345191">Mag-edit ng address</translation> <translation id="5596627076506792578">Higit pang opsyon</translation> @@ -710,6 +712,7 @@ <translation id="6181444274883918285">Magdagdag ng pagbubukod ng site</translation> <translation id="6192333916571137726">File ng download</translation> <translation id="6192792657125177640">Mga Pagbubukod</translation> +<translation id="6193448654517602979">Pumili ng mga tab</translation> <translation id="6194112207524046168">Para payagang i-access ng Chrome ang iyong camera, i-on din ang camera sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">I-block ang mga third-party na cookie</translation> <translation id="6206551242102657620">Secure ang koneksyon. Impormasyon ng site</translation> @@ -853,6 +856,7 @@ <translation id="7141896414559753902">I-block ang pagpapakita ng mga site ng mga pop-up at pag-redirect (inirerekomenda)</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />I-load ang orihinal na page<ph name="END_LINK" /> mula sa <ph name="DOMAIN_NAME" /></translation> <translation id="7149893636342594995">Nakalipas na 24 na oras</translation> +<translation id="7161892015146974550">Piliin ang tab na <ph name="TAB_TITLE" />.</translation> <translation id="7176368934862295254"><ph name="KILOBYTES" /> KB</translation> <translation id="7177466738963138057">Maaari mo itong baguhin sa ibang pagkakataon sa Mga Setting</translation> <translation id="7180611975245234373">I-refresh</translation> @@ -885,6 +889,7 @@ <translation id="7403691278183511381">Unang Karanasan sa Pagtakbo ng Chrome</translation> <translation id="741204030948306876">Oo, sali ako</translation> <translation id="7413229368719586778">Petsa ng pagsisimula <ph name="DATE" /></translation> +<translation id="7418565925463285788">Pagpangkatin ang mga tab...</translation> <translation id="7423098979219808738">Magtanong muna</translation> <translation id="7423538860840206698">Na-block sa pag-read ng clipboard</translation> <translation id="7431991332293347422">Kontrolin kung paano ginagamit ang iyong history ng pag-browse para i-personalize ang Paghahanap at higit pa</translation> @@ -1021,6 +1026,7 @@ <translation id="8339163506404995330">Hindi isasalin ang mga page na nasa <ph name="LANGUAGE" /></translation> <translation id="8349013245300336738">Pagbukud-bukurin ayon sa dami ng data na nagamit</translation> <translation id="8364299278605033898">Tingnan ang mga sikat na website</translation> +<translation id="8364603787714420828">I-unselect ang tab na <ph name="TAB_TITLE" />.</translation> <translation id="8372893542064058268">Payagan ang Pag-sync sa Background para sa isang partikular na site.</translation> <translation id="8374821112118309944">Kailangan mong i-update ang TalkBack sa isang mas bagong bersyon.</translation> <translation id="8378714024927312812">Pinapamahalaan ng iyong organisasyon</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb index dd276101..203f32a6 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -44,7 +44,7 @@ <translation id="1260236875608242557">חיפוש ודפדוף</translation> <translation id="1264974993859112054">ספורט</translation> <translation id="1272079795634619415">הפסק</translation> -<translation id="1272444412400969138">בוחר המכשירים לשיתוף כרטיסייה.</translation> +<translation id="1272444412400969138">בורר המכשירים שאיתם תשותף הכרטיסייה.</translation> <translation id="1283039547216852943">הקש כדי להרחיב</translation> <translation id="1285320974508926690">איני רוצה לקבל תרגום של אתר זה</translation> <translation id="1291207594882862231">ניקוי ההיסטוריה, קובצי ה-Cookie, נתוני האתרים, המטמון…</translation> @@ -403,7 +403,7 @@ <translation id="4008040567710660924">אישור קובצי Cookie של אתר מסוים.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{שעה אחת}two{שעתיים}many{# שעות}other{# שעות}}</translation> <translation id="4042870126885713738">הצעות יופיעו כאשר כתובת אינטרנט אינה מזוהה או כשלא ניתן ליצור חיבור</translation> -<translation id="4044912625106523635">בוחר המכשירים לשיתוף כרטיסייה נפתח בגובה מלא.</translation> +<translation id="4044912625106523635">בורר המכשירים שאיתם תשותף הכרטיסייה נפתח בגובה מלא.</translation> <translation id="4046123991198612571">הרצועה הבאה</translation> <translation id="4048707525896921369">ניתן לקבל מידע על נושאים באתרים מבלי לצאת מהדף. התכונה 'הקשה כדי לחפש' שולחת מילה ואת ההקשר שלה אל חיפוש Google, המחזיר הגדרות, תמונות, תוצאות חיפוש ופרטים אחרים. @@ -747,7 +747,7 @@ <translation id="6406506848690869874">סנכרון</translation> <translation id="641643625718530986">הדפסה…</translation> <translation id="6416782512398055893">בוצעה הורדה של MB <ph name="MBS" /></translation> -<translation id="6418750371676080905">בוחר המכשירים לשיתוף כרטיסייה נסגר.</translation> +<translation id="6418750371676080905">בורר המכשירים שאיתם תשותף הכרטיסייה נסגר.</translation> <translation id="6427112570124116297">תרגום התוכן באינטרנט</translation> <translation id="6433501201775827830">בחירת מנוע החיפוש</translation> <translation id="6437478888915024427">פרטי דף</translation> @@ -787,7 +787,7 @@ <translation id="666268767214822976">שימוש בשירות חיזוי כדי להציג שאילתות קשורות ואתרים פופולריים תוך כדי ההקלדה בשורת כתובת האתר</translation> <translation id="666731172850799929">פתח ב-<ph name="APP_NAME" /></translation> <translation id="666981079809192359">הודעת הפרטיות של Chrome</translation> -<translation id="6672986458216094438">בוחר המכשירים לשיתוף כרטיסייה נפתח בחצי הגובה.</translation> +<translation id="6672986458216094438">בורר המכשירים שאיתם תשותף הכרטיסייה נפתח בחצי הגובה.</translation> <translation id="6697492270171225480">הצגת הצעות לדפים דומים אם דף מסוים לא נמצא</translation> <translation id="6697947395630195233">Chrome זקוק לגישה אל המיקום שלך כדי לשתף אותו עם האתר הזה.</translation> <translation id="6698801883190606802">ניהול נתונים מסונכרנים</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 5cfb54d..529faca 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -889,7 +889,7 @@ <translation id="7403691278183511381">Førsteinntrykk ved bruk av Chrome</translation> <translation id="741204030948306876">Ja, jeg er med</translation> <translation id="7413229368719586778">Startdato <ph name="DATE" /></translation> -<translation id="7418565925463285788">Gruppér faner</translation> +<translation id="7418565925463285788">Gruppér faner...</translation> <translation id="7423098979219808738">Spør først.</translation> <translation id="7423538860840206698">Blokkert fra å lese utklippstavlen</translation> <translation id="7431991332293347422">Kontrollér hvordan nettleserloggen din brukes til blant annet personlig tilpasning av søk</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb index 771e08b8..6cd9d90e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="ta"> <translation id="1006017844123154345">ஆன்லைனில் திற</translation> +<translation id="1028699632127661925"><ph name="DEVICE_NAME" /> சாதனத்திற்கு அனுப்புகிறது...</translation> <translation id="1036727731225946849"><ph name="WEBAPK_NAME" />ஐச் சேர்க்கிறது...</translation> <translation id="1041308826830691739">இணையதளங்களிலிருந்து</translation> <translation id="1049743911850919806">மறைநிலை</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">இணையத்தில் தேடுக & உள்ளடக்கங்களை உலாவுக</translation> <translation id="1264974993859112054">விளையாட்டு</translation> <translation id="1272079795634619415">நிறுத்து</translation> +<translation id="1272444412400969138">தாவலைப் பகிர்வதற்கான சாதனத் தேர்வுக் கருவி.</translation> <translation id="1283039547216852943">விரிவாக்க, தட்டவும்</translation> <translation id="1285320974508926690">இந்த தளத்தை எப்போதும் மொழிபெயர்க்க வேண்டாம்</translation> <translation id="1291207594882862231">வரலாறு, குக்கீகள், தளத் தரவு, தற்காலிகச் சேமிப்பை அழி…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">வணக்கம், <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">தேடல்</translation> <translation id="1384959399684842514">பதிவிறக்கம் இடைநிறுத்தப்பட்டது</translation> +<translation id="1386674309198842382"><ph name="LAST_UPDATED" /> நாட்களுக்கு முன் பயன்படுத்தியுள்ளார்</translation> <translation id="1389974829397082527">இங்கு புக்மார்க்குகள் இல்லை</translation> <translation id="1397811292916898096"><ph name="PRODUCT_NAME" /> மூலம் தேடுக</translation> <translation id="1404122904123200417"><ph name="WEBSITE_URL" /> இல் உட்பொதிக்கப்பட்டது</translation> @@ -399,6 +402,7 @@ <translation id="4008040567710660924">குறிப்பிட்ட தளத்திற்கு, குக்கீகளை அனுமதிக்கும்.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# மணிநேரம்}other{# மணிநேரம்}}</translation> <translation id="4042870126885713738">இணைய முகவரியைத் தீர்க்க முடியாதபோது அல்லது இணைப்பை உருவாக்க முடியவில்லையெனில் பரிந்துரைகளைக் காட்டு</translation> +<translation id="4044912625106523635">தாவலைப் பகிர்வதற்கான சாதனத் தேர்வுக் கருவியின் பக்கம் முழுத் திரையில் திறக்கப்பட்டுள்ளது.</translation> <translation id="4046123991198612571">அடுத்த ட்ராக்</translation> <translation id="4048707525896921369">பக்கத்தை விட்டு விலகாமலே இணையதளங்களில் உள்ள தலைப்புகள் குறித்து அறிந்துகொள்ளலாம். "தேடுவதற்குத் தட்டு" அம்சமானது சொல்லையும் அதன் சூழலையும் Google தேடலுக்கு அனுப்புவதோடு வரையறைகள், படங்கள், தேடல் முடிவுகள், பிற விவரங்கள் ஆகியவற்றை வழங்குகிறது. @@ -578,6 +582,7 @@ <translation id="5271967389191913893">பதிவிறக்க வேண்டிய உள்ளடக்கத்தைச் சாதனத்தால் திறக்க முடியாது</translation> <translation id="528192093759286357">முழுத்திரையிலிருந்து வெளியேற, மேலிருந்து இழுத்து "முந்தையது" பொத்தானைத் தொடவும்.</translation> <translation id="5284584623296338184">புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் ஆகியவற்றிலும் பிற அமைப்புகளிலும் செய்யும் மாற்றங்கள், இனி உங்கள் Google கணக்குடன் ஒத்திசைக்கப்படாது. எனினும், ஏற்கனவே சேமிக்கப்பட்ட உங்கள் தரவு Google கணக்கில் அப்படியே இருக்கும்.</translation> +<translation id="5292796745632149097">இதற்கு அனுப்பு:</translation> <translation id="5300589172476337783">காண்பி</translation> <translation id="5301954838959518834">சரி, புரிந்தது</translation> <translation id="5304593522240415983">இந்தப் புலம் காலியாக இருக்கக் கூடாது</translation> @@ -739,6 +744,7 @@ <translation id="6406506848690869874">Sync</translation> <translation id="641643625718530986">அச்சிடு...</translation> <translation id="6416782512398055893"><ph name="MBS" /> மெ.பை. பதிவிறக்கப்பட்டுள்ளது</translation> +<translation id="6418750371676080905">தாவலைப் பகிர்வதற்கான சாதனத் தேர்வுக் கருவியின் பக்கம் மூடப்பட்டுள்ளது.</translation> <translation id="6427112570124116297">இணையத்தை மொழிபெயர்த்தல்</translation> <translation id="6433501201775827830">தேடல் இன்ஜினைத் தேர்வுசெய்யவும்</translation> <translation id="6437478888915024427">பக்கத் தகவல்</translation> @@ -778,6 +784,7 @@ <translation id="666268767214822976">முகவரிப்பட்டியில் நீங்கள் உள்ளிடும்போதே தொடர்புடைய கேள்விகளையும், பிரபலமான இணையதளங்களையும் காட்டுவதற்கு, யூக சேவையைப் பயன்படுத்தவும்</translation> <translation id="666731172850799929"><ph name="APP_NAME" /> இல் திற</translation> <translation id="666981079809192359">Chrome தனியுரிமை அறிக்கை</translation> +<translation id="6672986458216094438">தாவலைப் பகிர்வதற்கான சாதனத் தேர்வுக் கருவியின் பக்கம் பாதி உயரத்தில் திறக்கப்பட்டுள்ளது.</translation> <translation id="6697492270171225480">பக்கத்தைக் கண்டறிய முடியாத போது, அதே மாதிரியான பக்கங்களுக்கான பரிந்துரைகளைக் காட்டும்</translation> <translation id="6697947395630195233">இந்தத் தளத்துடன் இருப்பிடத்தைப் பகிர, Chromeமுக்கு உங்கள் இருப்பிடத்திற்கான அணுகல் தேவை.</translation> <translation id="6698801883190606802">ஒத்திசைத்த தரவை நிர்வகித்தல்</translation> @@ -955,6 +962,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> காலாவதியாகிவிட்டது.</translation> <translation id="7947953824732555851">ஏற்று உள்நுழைக</translation> <translation id="7963646190083259054">விற்பனையாளர்:</translation> +<translation id="7971136598759319605">கடைசியாக 1 நாளுக்கு முன் பயன்படுத்தியுள்ளார்</translation> <translation id="7975379999046275268">பக்க மாதிரிக்காட்சியைக் காட்டு <ph name="BEGIN_NEW" />புதிது<ph name="END_NEW" /></translation> <translation id="7981313251711023384">மிக விரைவான உலாவலுக்காகவும் தேடலிற்காகவும் பக்கங்களை முன்னதாக ஏற்றும்</translation> <translation id="79859296434321399">ஆக்மென்ட்டட் ரியாலிட்டி உள்ளடக்கத்தைப் பார்க்க, ARCoreஐ நிறுவவும்</translation> @@ -1096,6 +1104,7 @@ <translation id="8986494364107987395">பயன்பாட்டுப் புள்ளிவிவரங்களையும் சிதைவு அறிக்கைகளையும் தானாகவே Google க்கு அனுப்பு</translation> <translation id="8993760627012879038">புதிய தாவலை மறைநிலையில் திறக்கும்</translation> <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கில் உள்நுழைந்து, உங்கள் Chrome தரவு மீதான கட்டுப்பாட்டை அதன் நிர்வாகிக்கு வழங்குகிறீர்கள். இந்தக் கணக்குடன் தரவு நிரந்தரமாக இணைக்கப்படும். Chrome இலிருந்து வெளியேறினால், இந்தச் சாதனத்திலிருந்து தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation> +<translation id="9005637476204108703">உங்கள் கணக்குகளை நிர்வகிக்க இங்கே தட்டவும்</translation> <translation id="9019902583201351841">உங்கள் பெற்றோரால் நிர்வகிக்கப்படுகிறது</translation> <translation id="9040142327097499898">அறிவிப்புகள் அனுமதிக்கப்படுகின்றன. இந்தச் சாதனத்திற்கான இருப்பிடம் முடக்கப்பட்டுள்ளது.</translation> <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# வீடியோ}other{# வீடியோக்கள்}}</translation> @@ -1116,6 +1125,7 @@ <translation id="9155898266292537608">ஒரு சொல்லைத் தட்டி உடனடியாகவும் தேடலாம்</translation> <translation id="9169594135889675189">குழுவில் புதிய தாவலைச் சேர்</translation> <translation id="9188680907066685419">நிர்வகிக்கப்படும் கணக்கிலிருந்து வெளியேறு</translation> +<translation id="9190112541605496997">உங்கள் கணக்குகளை நிர்வகிக்க "கணக்கை நிர்வகி" பட்டனைத் தட்டவும்</translation> <translation id="9204836675896933765">1 கோப்பு மீதமுள்ளது</translation> <translation id="9206873250291191720">A</translation> <translation id="9219103736887031265">படங்கள்</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUiTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUiTest.java index d7bf7d96..8394b62 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUiTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUiTest.java
@@ -54,17 +54,15 @@ private String mUrl = ""; private MockMenuParams(int mediaType, String pageUrl, String linkUrl, String linkText, - String unfilteredLinkUrl, String srcUrl, String titleText, - boolean imageWasFetchedLoFi, Referrer referrer, boolean canSavemedia, - int touchPointXDp, int touchPointYDp, @MenuSourceType int sourceType) { + String unfilteredLinkUrl, String srcUrl, String titleText, Referrer referrer, + boolean canSavemedia, int touchPointXDp, int touchPointYDp, + @MenuSourceType int sourceType) { super(mediaType, pageUrl, linkUrl, linkText, unfilteredLinkUrl, srcUrl, titleText, - imageWasFetchedLoFi, referrer, canSavemedia, touchPointXDp, touchPointYDp, - sourceType); + referrer, canSavemedia, touchPointXDp, touchPointYDp, sourceType); } private MockMenuParams(String url) { - this(0, "", "", "", "", "", "", false, null, true, 0, 0, - MenuSourceType.MENU_SOURCE_TOUCH); + this(0, "", "", "", "", "", "", null, true, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); mUrl = url; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java index c87536b..5e73b44 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java
@@ -8,6 +8,9 @@ import org.chromium.base.test.params.ParameterProvider; import org.chromium.base.test.params.ParameterSet; +import org.chromium.chrome.browser.preferences.ChromePreferenceManager; +import org.chromium.chrome.browser.preferences.themes.ThemePreferences; +import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.test.ui.DummyUiActivity; import java.util.Arrays; @@ -41,9 +44,40 @@ } /** - * Resets the night mode state. + * Resets the night mode state for {@link DummyUiActivity}. */ public static void tearDownNightModeForDummyUiActivity() { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } + + /** + * Sets up initial states for night mode before + * {@link org.chromium.chrome.browser.ChromeActivity} is launched. + */ + public static void setUpNightModeBeforeChromeActivityLaunched() { + FeatureUtilities.setNightModeAvailableForTesting(true); + NightModeUtils.setNightModeSupportedForTesting(true); + } + + /** + * Sets up the night mode state for {@link org.chromium.chrome.browser.ChromeActivity}. + * @param nightModeEnabled Whether night mode should be enabled. + */ + public static void setUpNightModeForChromeActivity(boolean nightModeEnabled) { + ChromePreferenceManager.getInstance().writeInt(ChromePreferenceManager.UI_THEME_SETTING_KEY, + nightModeEnabled ? ThemePreferences.ThemeSetting.DARK + : ThemePreferences.ThemeSetting.LIGHT); + } + + /** + * Resets the night mode state after {@link org.chromium.chrome.browser.ChromeActivity} is + * destroyed. + */ + public static void tearDownNightModeAfterChromeActivityDestroyed() { + FeatureUtilities.setNightModeAvailableForTesting(null); + NightModeUtils.setNightModeSupportedForTesting(null); + GlobalNightModeStateProviderHolder.resetInstanceForTesting(); + ChromePreferenceManager.getInstance().removeKey( + ChromePreferenceManager.UI_THEME_SETTING_KEY); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java index 5d48faa36..974e4fe9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
@@ -19,8 +19,10 @@ import android.widget.FrameLayout; import org.junit.After; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; @@ -29,6 +31,8 @@ import org.chromium.base.Callback; import org.chromium.base.DiscardableReferencePool; import org.chromium.base.task.PostTask; +import org.chromium.base.test.params.ParameterAnnotations; +import org.chromium.base.test.params.ParameterizedRunner; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.UrlUtils; @@ -39,6 +43,7 @@ import org.chromium.chrome.browser.favicon.IconType; import org.chromium.chrome.browser.favicon.LargeIconBridge; import org.chromium.chrome.browser.native_page.ContextMenuManager; +import org.chromium.chrome.browser.night_mode.NightModeTestUtils; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.ntp.cards.PersonalizedPromoViewHolder; import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo; @@ -61,7 +66,7 @@ import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import org.chromium.chrome.browser.widget.displaystyle.VerticalDisplayStyle; import org.chromium.chrome.test.ChromeActivityTestRule; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.chrome.test.util.RenderTestRule; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.compositor.layouts.DisableChromeAnimations; @@ -80,7 +85,8 @@ /** * Tests for the appearance of Article Snippets. */ -@RunWith(ChromeJUnit4ClassRunner.class) +@RunWith(ParameterizedRunner.class) +@ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class ArticleSnippetsTest { @Rule @@ -113,6 +119,17 @@ private long mTimestamp; + @BeforeClass + public static void setUpBeforeActivityLaunched() { + NightModeTestUtils.setUpNightModeBeforeChromeActivityLaunched(); + } + + @ParameterAnnotations.UseMethodParameterBefore(NightModeTestUtils.NightModeParams.class) + public void setupNightMode(boolean nightModeEnabled) { + NightModeTestUtils.setUpNightModeForChromeActivity(nightModeEnabled); + mRenderTestRule.setNightModeEnabled(nightModeEnabled); + } + @Before public void setUp() throws Exception { mActivityTestRule.startMainActivityOnBlankPage(); @@ -155,10 +172,16 @@ if (mSigninPromo != null) mSigninPromo.setSigninPromoControllerForTests(null); } + @AfterClass + public static void tearDownAfterActivityDestroyed() { + NightModeTestUtils.tearDownNightModeAfterChromeActivityDestroyed(); + } + @Test @MediumTest @Feature({"ArticleSnippets", "RenderTest"}) - public void testSnippetAppearance() throws IOException { + @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class) + public void testSnippetAppearance(boolean nightModeEnabled) throws IOException { SuggestionsCategoryInfo fullCategoryInfo = new SuggestionsCategoryInfo(FULL_CATEGORY, "Section Title", ContentSuggestionsCardLayout.FULL_CARD, ContentSuggestionsAdditionalAction.NONE, @@ -239,7 +262,8 @@ @Test @MediumTest @Feature({"ArticleSnippets", "RenderTest"}) - public void testVideoSuggestion() throws IOException { + @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class) + public void testVideoSuggestion(boolean nightModeEnabled) throws IOException { SuggestionsCategoryInfo categoryInfo = new SuggestionsCategoryInfo(FULL_CATEGORY, "Section Title", ContentSuggestionsCardLayout.FULL_CARD, ContentSuggestionsAdditionalAction.NONE, @@ -293,7 +317,9 @@ @Feature({"ArticleSnippets", "RenderTest"}) // TODO(https://crbug.com/936986): Add goldens for UnifiedConsent promos. @DisableFeatures(ChromeFeatureList.UNIFIED_CONSENT) - public void testPersonalizedSigninPromosNoAccounts() throws IOException { + @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class) + public void testPersonalizedSigninPromosNoAccounts(boolean nightModeEnabled) + throws IOException { TestThreadUtils.runOnUiThreadBlocking(() -> { createPersonalizedSigninPromo(null); mContentView.addView(mSigninPromo.itemView); @@ -306,7 +332,9 @@ @Feature({"ArticleSnippets", "RenderTest"}) // TODO(https://crbug.com/936986): Add goldens for UnifiedConsent promos. @DisableFeatures(ChromeFeatureList.UNIFIED_CONSENT) - public void testPersonalizedSigninPromosWithAccount() throws IOException { + @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class) + public void testPersonalizedSigninPromosWithAccount(boolean nightModeEnabled) + throws IOException { TestThreadUtils.runOnUiThreadBlocking(() -> { createPersonalizedSigninPromo(getTestProfileData()); mContentView.addView(mSigninPromo.itemView);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java index 671da9a..510241a 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
@@ -121,7 +121,7 @@ public void testHttpLink() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(0, PAGE_URL, LINK_URL, - LINK_TEXT, "", "", "", false, null, false, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); + LINK_TEXT, "", "", "", null, false, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); int[] expected = {R.id.contextmenu_copy_link_address, R.id.contextmenu_copy_link_text}; checkMenuOptions(contextMenuParams, expected); @@ -159,7 +159,7 @@ public void testHttpLinkWithCustomContextMenu() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(0, PAGE_URL, LINK_URL, - LINK_TEXT, "", "", "", false, null, false, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); + LINK_TEXT, "", "", "", null, false, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); int[] expected = {R.id.contextmenu_copy_link_address}; checkMenuOptions(contextMenuParams, expected); @@ -196,7 +196,7 @@ FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(0, PAGE_URL, "mailto:marcin@mwiacek.com", "MAIL!", "", "", "", - false, null, false, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); + null, false, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); int[] expected = {R.id.contextmenu_copy}; checkMenuOptions(contextMenuParams, expected); @@ -234,8 +234,8 @@ public void testTelLink() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = - new ContextMenuParams(0, PAGE_URL, "tel:0048221234567", "PHONE!", "", "", "", false, - null, false, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); + new ContextMenuParams(0, PAGE_URL, "tel:0048221234567", "PHONE!", "", "", "", null, + false, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); int[] expected = {R.id.contextmenu_copy}; checkMenuOptions(contextMenuParams, expected); @@ -274,8 +274,8 @@ public void testVideoLink() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(WebContextMenuMediaType.VIDEO, - PAGE_URL, "http://www.blah.com/I_love_mouse_video.avi", "VIDEO!", "", "", "", false, - null, true, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); + PAGE_URL, "http://www.blah.com/I_love_mouse_video.avi", "VIDEO!", "", "", "", null, + true, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); int[] expectedTab1 = {R.id.contextmenu_copy_link_address, R.id.contextmenu_copy_link_text}; checkMenuOptions(contextMenuParams, expectedTab1); @@ -311,44 +311,10 @@ @Test @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) - public void testImageLoFi() { - FirstRunStatus.setFirstRunFlowComplete(false); - ContextMenuParams contextMenuParams = new ContextMenuParams(WebContextMenuMediaType.IMAGE, - PAGE_URL, "", "", "", IMAGE_SRC_URL, IMAGE_TITLE_TEXT, true, null, true, 0, 0, - MenuSourceType.MENU_SOURCE_TOUCH); - - int[] expected = null; - checkMenuOptions(contextMenuParams, expected); - - initializePopulator(ChromeContextMenuPopulator.ContextMenuMode.CUSTOM_TAB); - checkMenuOptions(contextMenuParams, expected); - - initializePopulator(ChromeContextMenuPopulator.ContextMenuMode.WEB_APP); - checkMenuOptions(contextMenuParams, expected); - - FirstRunStatus.setFirstRunFlowComplete(true); - - initializePopulator(ChromeContextMenuPopulator.ContextMenuMode.NORMAL); - int[] expected2 = { - R.id.contextmenu_load_original_image, R.id.contextmenu_open_image_in_new_tab}; - checkMenuOptions(contextMenuParams, expected2); - - initializePopulator(ChromeContextMenuPopulator.ContextMenuMode.CUSTOM_TAB); - int[] expected3 = { - R.id.contextmenu_open_in_browser_id, R.id.contextmenu_load_original_image}; - checkMenuOptions(contextMenuParams, expected3); - - initializePopulator(ChromeContextMenuPopulator.ContextMenuMode.WEB_APP); - int[] expected4 = {R.id.contextmenu_load_original_image, R.id.contextmenu_open_in_chrome}; - checkMenuOptions(contextMenuParams, expected4); - } - - @Test - @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testImageHiFi() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(WebContextMenuMediaType.IMAGE, - PAGE_URL, "", "", "", IMAGE_SRC_URL, IMAGE_TITLE_TEXT, false, null, true, 0, 0, + PAGE_URL, "", "", "", IMAGE_SRC_URL, IMAGE_TITLE_TEXT, null, true, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); int[] expected = null; @@ -383,8 +349,8 @@ public void testHttpLinkWithImageHiFi() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(WebContextMenuMediaType.IMAGE, - PAGE_URL, LINK_URL, LINK_TEXT, "", IMAGE_SRC_URL, IMAGE_TITLE_TEXT, false, null, - true, 0, 0, MenuSourceType.MENU_SOURCE_TOUCH); + PAGE_URL, LINK_URL, LINK_TEXT, "", IMAGE_SRC_URL, IMAGE_TITLE_TEXT, null, true, 0, + 0, MenuSourceType.MENU_SOURCE_TOUCH); int[] expected = {R.id.contextmenu_copy_link_address}; checkMenuOptions(contextMenuParams, expected);
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_am.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_am.xtb index 592beb6..448100b 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_am.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_am.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">አሁን</translation> <translation id="3669009212293447190">ተጨማሪ ጽሑፎች</translation> +<translation id="6664816932026096408">መተግበሪያዎችን ያስሱ</translation> <translation id="7626032353295482388">ወደ Chrome እንኳን ደህና መጡ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ar.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ar.xtb index 1c90b787..61283f5 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ar.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ar.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">الآن</translation> <translation id="3669009212293447190">مقالات أخرى</translation> +<translation id="6664816932026096408">التعرّف على التطبيقات</translation> <translation id="7626032353295482388">مرحبًا بك في Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_bg.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_bg.xtb index 4bb36d3..1302ae46 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_bg.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_bg.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Сега</translation> <translation id="3669009212293447190">Още статии</translation> +<translation id="6664816932026096408">Разглеждане на приложения</translation> <translation id="7626032353295482388">Добре дошли в Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_bn.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_bn.xtb index 7b504ea..5264dee 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_bn.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_bn.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">এখনই</translation> <translation id="3669009212293447190">আরও নিবন্ধ</translation> +<translation id="6664816932026096408">কী কী অ্যাপ আছে দেখুন</translation> <translation id="7626032353295482388">Chrome এ স্বাগতম</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ca.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ca.xtb index e4966a4..d91ce9c 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ca.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ca.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Ara</translation> <translation id="3669009212293447190">Més articles</translation> +<translation id="6664816932026096408">Explora les aplicacions</translation> <translation id="7626032353295482388">Et donem la benvinguda a Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_cs.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_cs.xtb index fc3c2c4..f97f4e7 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_cs.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_cs.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Teď</translation> <translation id="3669009212293447190">Další články</translation> +<translation id="6664816932026096408">Prozkoumat aplikace</translation> <translation id="7626032353295482388">Vítá vás Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_da.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_da.xtb index 9b619a7..bcc5fb6 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_da.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_da.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Nu</translation> <translation id="3669009212293447190">Flere artikler</translation> +<translation id="6664816932026096408">Se flere apps</translation> <translation id="7626032353295482388">Velkommen til Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_de.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_de.xtb index 76257d93..16339bd 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_de.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_de.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Jetzt</translation> <translation id="3669009212293447190">Weitere Artikel</translation> +<translation id="6664816932026096408">Apps entdecken</translation> <translation id="7626032353295482388">Willkommen bei Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_el.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_el.xtb index 187987e..e1dec86 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_el.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_el.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Τώρα</translation> <translation id="3669009212293447190">Περισσότερα άρθρα</translation> +<translation id="6664816932026096408">Εξερεύνηση εφαρμογών</translation> <translation id="7626032353295482388">Καλώς ήρθατε στο Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_en-GB.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_en-GB.xtb index fc44223..87eedc7 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_en-GB.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_en-GB.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Now</translation> <translation id="3669009212293447190">More articles</translation> +<translation id="6664816932026096408">Explore apps</translation> <translation id="7626032353295482388">Welcome to Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_es-419.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_es-419.xtb index 6f4f0df9..f8e28c0 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_es-419.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_es-419.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Ahora</translation> <translation id="3669009212293447190">Más artículos</translation> +<translation id="6664816932026096408">Explorar las apps</translation> <translation id="7626032353295482388">Te damos la bienvenida a Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_es.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_es.xtb index 1e541d1..3751568 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_es.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_es.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Ahora</translation> <translation id="3669009212293447190">Más artículos</translation> +<translation id="6664816932026096408">Explorar aplicaciones</translation> <translation id="7626032353295482388">Te damos la bienvenida a Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_et.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_et.xtb index 10d52440..cb892c62 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_et.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_et.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Kohe</translation> <translation id="3669009212293447190">Veel artikleid</translation> +<translation id="6664816932026096408">Avastage rakendusi</translation> <translation id="7626032353295482388">Tere tulemast Chrome'i</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_fa.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_fa.xtb index d1f3128..d5049629 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_fa.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_fa.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">اکنون</translation> <translation id="3669009212293447190">مقالههای بیشتر</translation> +<translation id="6664816932026096408">کاوش برنامهها</translation> <translation id="7626032353295482388">به Chrome خوش آمدید</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_fi.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_fi.xtb index a98474e..1663ea88 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_fi.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_fi.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Nyt</translation> <translation id="3669009212293447190">Lisää artikkeleja</translation> +<translation id="6664816932026096408">Tutustu sovelluksiin</translation> <translation id="7626032353295482388">Tervetuloa Chromeen</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_fil.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_fil.xtb index a10d8a52..8cd0ecf 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_fil.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_fil.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Ngayon</translation> <translation id="3669009212293447190">Higit pang artikulo</translation> +<translation id="6664816932026096408">I-explore ang mga app</translation> <translation id="7626032353295482388">Welcome sa Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_fr.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_fr.xtb index 120d8d2..db29e63 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_fr.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_fr.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Maintenant</translation> <translation id="3669009212293447190">Autres articles</translation> +<translation id="6664816932026096408">Découvrir des applications</translation> <translation id="7626032353295482388">Bienvenue dans Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_gu.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_gu.xtb index 0920b89..18e941c 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_gu.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_gu.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">હમણાં</translation> <translation id="3669009212293447190">વધુ લેખો</translation> +<translation id="6664816932026096408">ઍપ વિશે જાણકારી મેળવો</translation> <translation id="7626032353295482388">Chrome પર આપનું સ્વાગત છે</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_hi.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_hi.xtb index ff2ad93..fda1f43 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_hi.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_hi.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">अभी</translation> <translation id="3669009212293447190">ज़्यादा लेख</translation> +<translation id="6664816932026096408">ऐप्लिकेशन खोजें</translation> <translation id="7626032353295482388">Chrome में आपका स्वागत है</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_hr.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_hr.xtb index da9f9fff..a82659c 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_hr.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_hr.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Sad</translation> <translation id="3669009212293447190">Više članaka</translation> +<translation id="6664816932026096408">Istražite aplikacije</translation> <translation id="7626032353295482388">Dobro došli u Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_hu.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_hu.xtb index 56e75d7..9367da3 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_hu.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_hu.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Most</translation> <translation id="3669009212293447190">További cikkek</translation> +<translation id="6664816932026096408">Alkalmazások felfedezése</translation> <translation id="7626032353295482388">A Chrome üdvözli Önt!</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_id.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_id.xtb index 966b0050..005fa42 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_id.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_id.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Sekarang</translation> <translation id="3669009212293447190">Artikel lainnya</translation> +<translation id="6664816932026096408">Temukan aplikasi</translation> <translation id="7626032353295482388">Selamat Datang di Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_it.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_it.xtb index b95d6f4..9be017f 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_it.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_it.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Ora</translation> <translation id="3669009212293447190">Altri articoli</translation> +<translation id="6664816932026096408">Esplora le app</translation> <translation id="7626032353295482388">Benvenuto in Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_iw.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_iw.xtb index c44e60b..2cbba647 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_iw.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_iw.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">עכשיו</translation> <translation id="3669009212293447190">מאמרים נוספים</translation> +<translation id="6664816932026096408">הכרת אפליקציות</translation> <translation id="7626032353295482388">ברוכים הבאים ל-Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ja.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ja.xtb index 8d6c8ae..e44fc995 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ja.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ja.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">たった今</translation> <translation id="3669009212293447190">その他の記事</translation> +<translation id="6664816932026096408">アプリを探す</translation> <translation id="7626032353295482388">Chrome へようこそ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_kn.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_kn.xtb index 5f5a442c..258916e 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_kn.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_kn.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">ಈಗ</translation> <translation id="3669009212293447190">ಇನ್ನಷ್ಟು ಲೇಖನಗಳು</translation> +<translation id="6664816932026096408">ಆ್ಯಪ್ಗಳನ್ನು ಎಕ್ಸ್ಪ್ಲೋರ್ ಮಾಡಿ</translation> <translation id="7626032353295482388">Chrome ಗೆ ಸ್ವಾಗತ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ko.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ko.xtb index b072546..1840c3c 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ko.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ko.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">방금</translation> <translation id="3669009212293447190">더보기</translation> +<translation id="6664816932026096408">앱 살펴보기</translation> <translation id="7626032353295482388">Chrome에 오신 것을 환영합니다</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_lt.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_lt.xtb index 65fe017..66de231 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_lt.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_lt.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Dabar</translation> <translation id="3669009212293447190">Daugiau straipsnių</translation> +<translation id="6664816932026096408">Naršyti programas</translation> <translation id="7626032353295482388">Sveiki, tai „Chrome“</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_lv.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_lv.xtb index 5b9fead..d1789f9 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_lv.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_lv.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Tikko</translation> <translation id="3669009212293447190">Citi raksti</translation> +<translation id="6664816932026096408">Izpētīt lietotnes</translation> <translation id="7626032353295482388">Laipni lūdzam pārlūkā Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ml.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ml.xtb index ab0a9bd8..f65b35e 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ml.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ml.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">ഇപ്പോൾ</translation> <translation id="3669009212293447190">കൂടുതൽ ലേഖനങ്ങൾ</translation> +<translation id="6664816932026096408">ആപ്പുകൾ അടുത്തറിയുക</translation> <translation id="7626032353295482388">Chrome-ലേക്ക് സ്വാഗതം</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_mr.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_mr.xtb index f3fa47ce..7c67e04 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_mr.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_mr.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">आता</translation> <translation id="3669009212293447190">आणखी लेख</translation> +<translation id="6664816932026096408">अॅप्स एक्सप्लोर करा</translation> <translation id="7626032353295482388">Chrome मध्ये स्वागत आहे</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ms.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ms.xtb index 56c1c6b..6296328 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ms.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ms.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Sekarang</translation> <translation id="3669009212293447190">Lagi artikel</translation> +<translation id="6664816932026096408">Terokai apl</translation> <translation id="7626032353295482388">Selamat Datang ke Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_nl.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_nl.xtb index 026c0ac..db8bdee 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_nl.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_nl.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Nu</translation> <translation id="3669009212293447190">Meer artikelen</translation> +<translation id="6664816932026096408">Apps verkennen</translation> <translation id="7626032353295482388">Welkom bij Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_no.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_no.xtb index a87556e..3e2d730 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_no.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_no.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Nå</translation> <translation id="3669009212293447190">Flere artikler</translation> +<translation id="6664816932026096408">Utforsk apper</translation> <translation id="7626032353295482388">Velkommen til Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_pl.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_pl.xtb index 62010d40..095a6a9d 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_pl.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_pl.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Przed chwilą</translation> <translation id="3669009212293447190">Więcej artykułów</translation> +<translation id="6664816932026096408">Poznaj aplikacje</translation> <translation id="7626032353295482388">Witamy w Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_pt-BR.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_pt-BR.xtb index a4159dfd..d4306c46 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_pt-BR.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_pt-BR.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Agora</translation> <translation id="3669009212293447190">Mais artigos</translation> +<translation id="6664816932026096408">Conheça os apps</translation> <translation id="7626032353295482388">Bem-vindo ao Google Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_pt-PT.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_pt-PT.xtb index d9a15da..ec6afdc 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_pt-PT.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_pt-PT.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Agora</translation> <translation id="3669009212293447190">Mais artigos</translation> +<translation id="6664816932026096408">Explorar aplicações</translation> <translation id="7626032353295482388">Bem-vindo ao Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ro.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ro.xtb index 68f0fc2..f7b451a 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ro.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ro.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Acum</translation> <translation id="3669009212293447190">Mai multe articole</translation> +<translation id="6664816932026096408">Explorați aplicațiile</translation> <translation id="7626032353295482388">Bun venit la Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ru.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ru.xtb index df9989a..3924e335 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ru.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ru.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Сейчас</translation> <translation id="3669009212293447190">Ещё статьи</translation> +<translation id="6664816932026096408">Открыть каталог</translation> <translation id="7626032353295482388">Добро пожаловать в Chrome!</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_sk.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_sk.xtb index ac5ba4f..7180ab2 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_sk.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_sk.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Teraz</translation> <translation id="3669009212293447190">Ďalšie články</translation> +<translation id="6664816932026096408">Preskúmať aplikácie</translation> <translation id="7626032353295482388">Víta vás prehliadač Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_sl.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_sl.xtb index 260f47be..17d78a1 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_sl.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_sl.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Zdaj</translation> <translation id="3669009212293447190">Več člankov</translation> +<translation id="6664816932026096408">Raziskovanje aplikacij</translation> <translation id="7626032353295482388">Dobrodošli v Chromu</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_sr.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_sr.xtb index 33dcda5..3cc62210 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_sr.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_sr.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Сада</translation> <translation id="3669009212293447190">Још чланака</translation> +<translation id="6664816932026096408">Истражите апликације</translation> <translation id="7626032353295482388">Добро дошли у Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_sv.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_sv.xtb index ee683fc..63c09b2 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_sv.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_sv.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Nyss</translation> <translation id="3669009212293447190">Fler artiklar</translation> +<translation id="6664816932026096408">Upptäck nya appar</translation> <translation id="7626032353295482388">Välkommen till Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_sw.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_sw.xtb index f4d1846..97792f2 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_sw.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_sw.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Sasa</translation> <translation id="3669009212293447190">Makala zaidi</translation> +<translation id="6664816932026096408">Gundua programu</translation> <translation id="7626032353295482388">Karibu kwenye Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ta.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ta.xtb index 9bc07883..6943e59 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_ta.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ta.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">இப்போது</translation> <translation id="3669009212293447190">மேலும் செய்திகள்</translation> +<translation id="6664816932026096408">மேலும் பல ஆப்ஸ்</translation> <translation id="7626032353295482388">Chrome க்கு வருக</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_te.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_te.xtb index cd25bf7..77c1b69 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_te.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_te.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">ఇప్పుడే</translation> <translation id="3669009212293447190">మరిన్ని కథనాలు</translation> +<translation id="6664816932026096408">యాప్లను అన్వేషించండి</translation> <translation id="7626032353295482388">Chromeకు స్వాగతం</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_th.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_th.xtb index e1877f7..8537d13 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_th.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_th.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">ตอนนี้</translation> <translation id="3669009212293447190">บทความเพิ่มเติม</translation> +<translation id="6664816932026096408">สำรวจแอป</translation> <translation id="7626032353295482388">ยินดีต้อนรับสู่ Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_tr.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_tr.xtb index c2375a3..6b7aeb5 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_tr.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_tr.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Şimdi</translation> <translation id="3669009212293447190">Daha fazla makale</translation> +<translation id="6664816932026096408">Uygulamaları keşfedin</translation> <translation id="7626032353295482388">Chrome'a Hoş Geldiniz</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_uk.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_uk.xtb index 502efa1..bba484e1 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_uk.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_uk.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Щойно</translation> <translation id="3669009212293447190">Більше статей</translation> +<translation id="6664816932026096408">Огляд додатків</translation> <translation id="7626032353295482388">Вітаємо у Chrome!</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_vi.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_vi.xtb index 9b9776a..306ea26 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_vi.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_vi.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">Bây giờ</translation> <translation id="3669009212293447190">Bài viết khác</translation> +<translation id="6664816932026096408">Khám phá ứng dụng</translation> <translation id="7626032353295482388">Chào mừng bạn đến với Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_zh-CN.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_zh-CN.xtb index 245c51c6..fb15351 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_zh-CN.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_zh-CN.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">刚刚</translation> <translation id="3669009212293447190">更多报道</translation> +<translation id="6664816932026096408">浏览应用</translation> <translation id="7626032353295482388">欢迎使用 Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_zh-TW.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_zh-TW.xtb index 41cfb421..75a75bb 100644 --- a/chrome/android/touchless/java/strings/translations/touchless_strings_zh-TW.xtb +++ b/chrome/android/touchless/java/strings/translations/touchless_strings_zh-TW.xtb
@@ -5,5 +5,6 @@ <translation id="1759842336958782510">Chrome</translation> <translation id="2169830938017475061">剛剛</translation> <translation id="3669009212293447190">更多報導</translation> +<translation id="6664816932026096408">瀏覽應用程式</translation> <translation id="7626032353295482388">歡迎使用 Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index f245fd4..8da44b8 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -527,6 +527,7 @@ <translation id="1781502536226964113">የአዲስ ትር ገጽ ክፈት</translation> <translation id="1781771911845953849">መለያዎች እና ማስመር</translation> <translation id="1782196717298160133">የእርስዎን ስልክ ማግኘት</translation> +<translation id="1784707308176068866">በተባባሪ ቤተኛ መተግበሪያ ሲጠየቅ በበስተጀርባ ውስጥ አሂድ</translation> <translation id="1784849162047402014">መሣሪያ ያለው ባዶ ቦታ ዝቅተኛ ነው</translation> <translation id="1790194216133135334">አገናኝ ወደ <ph name="DEVICE_NAME" /> ይላኩ</translation> <translation id="1792619191750875668">የተቀጠለ ማሳያ</translation> @@ -535,6 +536,7 @@ <translation id="1799071797295057738">የ«<ph name="EXTENSION_NAME" />» ቅጥያ በራስ-ሰር ተሰናክሏል።</translation> <translation id="1802687198411089702">ይህ ገጽ ምላሽ እየሰጠ አይደለም። እሱን መጠበቅ ወይም ትተው መውጣት ይችላል።</translation> <translation id="1802931390041703523">Flash በዚህ ገጽ ላይ ታግዷል</translation> +<translation id="1803531841600994172">የሚተረጎምበት ቋንቋ</translation> <translation id="1803545009660609783">ዳግም አሰልጥን</translation> <translation id="1805472176602625930">በደህንነት ቁልፉ ላይ ያለውን አዝራር ይጫኑ</translation> <translation id="1805738995123446102">የጀርባ ትር ማይክሮፎንዎን እየተጠቀመ ነው</translation> @@ -736,6 +738,7 @@ <translation id="212862741129535676">የተደጋጋሚነት ሁኔታ ያዥነት መቶኛ</translation> <translation id="2129825002735785149">ተሰኪን አዘምን</translation> <translation id="2131077480075264">በ«<ph name="IMPORT_NAME" />» ስላልተፈቀደ «<ph name="APP_NAME" />»ን መጫን አልተቻለም</translation> +<translation id="21354425047973905">ፒኖችን ይደብቁ</translation> <translation id="2135456203358955318">የተተከለ ማጉያ</translation> <translation id="2135787500304447609">&ከቆመበት ቀጥል</translation> <translation id="2136372518715274136">አዲስ የይለፍ ቃል ያስገቡ</translation> @@ -949,6 +952,7 @@ <translation id="2436707352762155834">አነስተኛ</translation> <translation id="2439545803278355377">አዲሱን የእርስዎ ፒን ያስገቡ። ፒን ቢያንስ የአራት ቁምፊዎች ርዝመት ሊኖረው ይገባል እና ፊደላትን፣ ቁጥሮችን እና ሌሎች ቁምፊዎችን ይይዛል።</translation> <translation id="2440604414813129000">ም&ንጭ አሳይ</translation> +<translation id="2444119669991608829">ገጽ በ<ph name="LANGUAGE" /> አይደለም?</translation> <translation id="2445081178310039857">የቅጥያ ስርወ ማውጫ ያስፈልጋል።</translation> <translation id="2445484935443597917">አዲስ መገለጫ ፍጠር</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> የእርስዎን ማንነት ማረጋገጥ ይፈልጋል</translation> @@ -962,6 +966,7 @@ <translation id="2454247629720664989">ቁልፍ ቃል</translation> <translation id="245661998428026871">በሥዕል-ውስጥ-ሥዕል ሁነታ ላይ ያለው ቪዲዮ ማጫወት ያቆማል።</translation> <translation id="2457246892030921239"><ph name="APP_NAME" /> ከ<ph name="VOLUME_NAME" /> ፋይሎችን ለመቅዳት ይፈልጋል።</translation> +<translation id="2458379781610688953">መለያን <ph name="EMAIL" /> አዘምን</translation> <translation id="2458591546854598341">የመሣሪያ አስተዳደር ማስመሰያ ልክ ያልኾነ ነው።</translation> <translation id="2462724976360937186">የእውቅና ማረጋገጫ ባለስልጣን ቁልፍ መታወቂያ</translation> <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> ታክሏል</translation> @@ -1127,6 +1132,7 @@ <translation id="2693176596243495071">ውይ! አንድ ያልታወቀ ስህተት ተከስቷል። እባክዎ ቆይተው እንደገና ይሞክሩ ወይም ችግሩ ከቀጠለ አስተዳዳሪዎን ያነጋግሩ።</translation> <translation id="2695749433451188613">የበይነመረብ ህትመት ፕሮቶኮል (ኤችቲቲፒኤስ)</translation> <translation id="2699911226086014512">ከኮድ <ph name="RETRIES" /> ጋር የፒን ሥርዓተ ክወና ተሰናክሏል።</translation> +<translation id="2701737434167469065">ግባ፣ <ph name="EMAIL" /></translation> <translation id="270358213449696159">የGoogle Chrome OS ውል ይዘቶች</translation> <translation id="2704184184447774363">Microsoft Document Signing</translation> <translation id="270516211545221798">የመዳሰሻ ሰሌዳ ፍጥነት</translation> @@ -1920,6 +1926,7 @@ <translation id="3872220884670338524">ተጨማሪ እርምጃዎች፣ መለያ <ph name="DOMAIN" /> ላይ ለ<ph name="USERNAME" /> ተቀምጧል</translation> <translation id="3872991219937722530">የዲስክ ቦታ ያስለቅቁ፣ አለበለዚያ መሣሪያው ምላሽ የማይሰጥ ይሆናል</translation> <translation id="3873315167136380065">ይህን ለማብራት፣ የእርስዎን የስምረት ግዢ ለማስወገድ <ph name="BEGIN_LINK" />ስምረትን ዳግም ያቀናብሩ<ph name="END_LINK" /></translation> +<translation id="3873423927483480833">ፒኖችን አሳይ</translation> <translation id="3873915545594852654">በARC++ ላይ ችግር አጋጥሟል።</translation> <translation id="3878840326289104869">ቁጥጥር ላይ ያለ ተጠቃሚ በመፍጠር ላይ</translation> <translation id="3879748587602334249">የማውረድ አቀናባሪ</translation> @@ -2342,6 +2349,7 @@ <translation id="4562155214028662640">የጣት አሻራን አክል</translation> <translation id="4563880231729913339">ጣት 3</translation> <translation id="4565377596337484307">የይለፍ ቃል ደብቅ</translation> +<translation id="456717285308019641">የሚተረጎመው የገጽ ቋንቋ</translation> <translation id="4567772783389002344">ቃል አክል</translation> <translation id="4568025708905928793">የደህንነት ቁልፍ በመጠየቅ ላይ ነው</translation> <translation id="4568213207643490790">ይቅርታ፣ የGoogle መለያዎች በዚህ መሣሪያ ላይ አይፈቀዱም።</translation> @@ -2372,6 +2380,7 @@ <translation id="4613144866899789710">የLinux ጭነትን በመሰረዝ ላይ...</translation> <translation id="4613271546271159013">አዲስ ትር ሲከፍቱ የሚኖረውን ገጽ አንድ ቅጥያ ለውጦታል።</translation> <translation id="4615586811063744755">ምንም ኩኪ አልተመረጠም</translation> +<translation id="4617001782309103936">በጣም አጭር</translation> <translation id="4617270414136722281">የቅጥያ አማራጮች</translation> <translation id="4619615317237390068">ከሌሎች መሣሪያዎች የመጡ ትሮች</translation> <translation id="4620809267248568679">ይህ ቅንብር በአንድ ቅጥያ ነው የሚፈጸመው።</translation> @@ -2384,6 +2393,7 @@ <translation id="4633003931260532286">ቅጥያው ቢያንስ የ«<ph name="IMPORT_VERSION" />» ስሪት የሆነ «<ph name="IMPORT_NAME" />» ያስፈልገዋል፣ ነገር ግን «<ph name="INSTALLED_VERSION" />» ስሪት ብቻ ነው የተጫነው</translation> <translation id="4634771451598206121">እንደገና ይግቡ...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> ለእንግዳ ተጠቃሚዎች አይገኝም።</translation> +<translation id="4637083375689622795">ተጨማሪ እርምጃዎች፣ <ph name="EMAIL" /></translation> <translation id="4641539339823703554">Chrome የስርዓት ጊዜ ማዘጋጀት አልቻለም። እባክዎ ከዚህ በታች ያለውን ጊዜ ይፈትሹና አስፈላጊ ከሆነ ያስተካክሉ።</translation> <translation id="4643612240819915418">&ቪዲዮ በአዲስ ትር ክፈት</translation> <translation id="4645676300727003670">&አስቀምጥ</translation> @@ -2901,6 +2911,7 @@ <translation id="5449716055534515760">&መስኮት ዝጋ</translation> <translation id="5453630479789469584">Plugin VMን ማቀናበር አልተቻለም</translation> <translation id="5454166040603940656">ከ<ph name="PROVIDER" /> ጋር</translation> +<translation id="545426320101607695">የሚተረጎምበት ቋንቋ</translation> <translation id="5457113250005438886">ልክ ያልሆነ</translation> <translation id="5457459357461771897">በኮምፒውተርዎ ላይ ፎቶዎችን፣ ሙዚቃ እና ሌላ ማህደረ መረጃን ያነብባል</translation> <translation id="5457599981699367932">እንደ እንግዳ ያስሱ</translation> @@ -3822,6 +3833,7 @@ <translation id="6871644448911473373">OCSP ምላሽ ሰጪ፦ <ph name="LOCATION" /></translation> <translation id="6872781471649843364">ያስገቡት የይለፍ ቃል በአገልጋዩ ተቀባይነት አላገኘም።</translation> <translation id="6876155724392614295">ቢስክሌት</translation> +<translation id="6877460900831874810">በማያ ገጽ ቁልፍ ላይ የChrome ሚዲያ መልሶ ማጫወትን ያንቁ</translation> <translation id="6878422606530379992">ዳሳሾች ተፈቅደዋል</translation> <translation id="6880587130513028875">በዚህ ገጽ ላይ ምስሎች ታግደዋል።</translation> <translation id="6883319974225028188">ውይ! ሥርዓቱ የመሣሪያ ውቅረቱን ማስቀመጥ አልቻለም።</translation> @@ -3922,6 +3934,7 @@ <translation id="7019805045859631636">ፈጣን</translation> <translation id="7022562585984256452">የእርስዎ መነሻ ገጽ ተዋቅሯል።</translation> <translation id="7025190659207909717">የተንቀሳቃሽ ስልክ ውሂብ አገልግሎት ማቀናበር</translation> +<translation id="7027891519253193555">ገጽ በ<ph name="LANGUAGE" /> አይደለም?</translation> <translation id="7029809446516969842">የይለፍ ቃላት</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - ተከታታይ ወደብ ተገናኝቷል</translation> <translation id="7031962166228839643">TPM እየተዘጋጀ ነው፣ እባክዎ ይጠብቁ (ይሄ ጥቂት ደቂቃዎች ሊወስድ ይችላል)...</translation> @@ -4127,6 +4140,7 @@ <translation id="7328699668338161242">የእርስዎ ረዳት ድምፅዎን ለይቶ ማወቅ ይችላል</translation> <translation id="7328867076235380839">ልክ ያልሆነ ጥምረት</translation> <translation id="7329154610228416156">ደህንነቱ አስተማማኝ ያልሆነ ዩአርኤል (<ph name="BLOCKED_URL" />) እንዲጠቀም ስለተዋቀረ በመለያ መግባት አልተሳካም። እባክዎ የእርስዎን አስተዳዳሪ ያነጋግሩ።</translation> +<translation id="733006820760728943">እንደ ገቢር መለያ አቀናብር</translation> <translation id="7334190995941642545">Smart Lock በአሁኑ ጊዜ አይገኝም። እባክዎ ቆይተው እንደገና ይሞክሩ።</translation> <translation id="7334274148831027933">የተተከለ ማጉያን ያንቁ</translation> <translation id="7335974957018254119">ለዚህ ፊደል ማረሚያን ይጠቀሙ፦</translation> @@ -4202,6 +4216,7 @@ <translation id="7442465037756169001">የእርስዎ Hangouts Meet hardware ለመዋቀር ዝግጁ ነው።</translation> <translation id="744341768939279100">አዲስ መገለጫ ፍጠር</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" />ን አሰናክል</translation> +<translation id="7448430327655618736">መተግበሪያዎችን በራስ-ሰር ጫን</translation> <translation id="7450761244949417357">አሁን በ<ph name="ALTERNATIVE_BROWSER_NAME" /> ውስጥ ይከፈታል</translation> <translation id="7453008956351770337">ይህን አታሚ በመምረጥዎ የሚከተለው ቅጥያ አታሚዎን እንዲደርስበት ፍቃድ እየሰጡት ነው፦</translation> <translation id="7456142309650173560">dev</translation> @@ -4386,6 +4401,7 @@ <translation id="7728570244950051353">ከአንቀላፋ ሁነታ ማያ ገጽ ቆልፍ</translation> <translation id="7728668285692163452">የሰርጥ ለውጥ በኋላ ላይ ነው የሚተገበረው</translation> <translation id="7730449930968088409">የእርስዎ ማያ ገጽ ይዘት ይቀርጻል</translation> +<translation id="7731119595976065702">ተጨማሪ ቋንቋዎች...</translation> <translation id="7732111077498238432">አውታረ መረብ በመመሪያ ቁጥጥር የሚደረግበት ነው</translation> <translation id="7737238973539693982">Linux (ቅድመ-ይሁንታ)ን ሰርዝ</translation> <translation id="7740996059027112821">መደበኛ</translation> @@ -4732,6 +4748,7 @@ <translation id="8206354486702514201">ይህ ቅንብር በአስተዳዳሪዎ ነው በግዳጅ እንዲፈጸም የተደረገው።</translation> <translation id="8206581664590136590">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ በራስ-ሰር ወደ Google በመላክ የልጅዎን የAndroid ተሞክሮ እንዲሻሻል ያግዙ። ይህ ልጅዎን ለመለየት ስራ ላይ አይውልም፣ እና የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። የተጨማሪ የድር እና መተግበሪያ እንቅስቃሴ ቅንብር ለልጅዎ በርቶ ከሆነ ይህ ውሂብ ወደ የGoogle መለያቸው ሊቀመጥ ይችላል። <ph name="BEGIN_LINK1" />የበለጠ ለመረዳት<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesy</translation> +<translation id="8206859287963243715">ሴሉላር</translation> <translation id="8209677645716428427">አንድ ክትትል የሚደረግበት ተጠቃሚ ድሩን በእርስዎ ክትትል ማሰስ ይችላል። በChrome ውስጥ ያለ የአንድ ክትትል የሚደረግበት ተጠቃሚ እንደመሆንዎ መጠን እርስዎ እነኚህን ማድረግ ይችላሉ፦</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{ማውረድ በሂደት ላይ ነው}one{ውርዶች በሂደት ላይ ናቸው}other{ውርዶች በሂደት ላይ ናቸው}}</translation> <translation id="8213449224684199188">ወደ የፎቶ ሁነታ ተገብቷል</translation> @@ -4740,6 +4757,7 @@ <translation id="8214489666383623925">ፋይል ክፈት…</translation> <translation id="8214962590150211830">ይህን ሰው አስወግድ</translation> <translation id="8217399928341212914">በርካታ ፋይሎችን በራስ ሰር ማውረድን ማገድ ቀጥል</translation> +<translation id="822519928942492333">የሚተረጎመው የገጽ ቋንቋ</translation> <translation id="8225265270453771718">የመተግበሪያ መስኮት ያጋሩ</translation> <translation id="8225753906568652947">የእርስዎን ዋጋ ቅናሾችን ይውሰዱ</translation> <translation id="8226222018808695353">የተከለከለ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 13f875f2..905b83d 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -4168,7 +4168,6 @@ <translation id="7364796246159120393">اختيار ملفّ</translation> <translation id="7366415735885268578">إضافة موقع ويب</translation> <translation id="7366909168761621528">بيانات التصفح</translation> -<translation id="7367483872576694328">خدمة المحلل اللغوي لفحص BLE</translation> <translation id="736877393389250337">تعذَّر فتح <ph name="URL" /> في <ph name="ALTERNATIVE_BROWSER_NAME" />. يُرجى التواصل مع مشرف النظام.</translation> <translation id="7371006317849674875">وقت البدء</translation> <translation id="7375053625150546623">EAP</translation> @@ -4744,6 +4743,7 @@ <translation id="8206354486702514201">تم فرض هذا الإعداد بواسطة المشرف.</translation> <translation id="8206581664590136590">يمكنك إرسال بيانات الاستخدام والتشخيص. يمكنك المساعدة في تحسين تجربة نظام التشغيل Android على حسابك الفرعي من خلال إرسال بيانات التطبيق والجهاز والتشخيص تلقائيًا إلى Google. لن يتم استخدام ذلك لتعريف حسابك الفرعي وسيساعد في استقرار عمل النظام والتطبيقات، بالإضافة إلى التحسينات الأخرى. كما ستساعد بعض البيانات المجمّعة تطبيقات Google وشركائها، مثل مطوّري برامج نظام التشغيل Android. في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات" لحسابك الفرعي، قد يتم حفظ هذه البيانات في حسابك على Google. <ph name="BEGIN_LINK1" />مزيد من المعلومات<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">موسيقي</translation> +<translation id="8206859287963243715">خلوي</translation> <translation id="8209677645716428427">يُمكن للمستخدم الذي يخضع للإشراف استكشاف الويب وفقًا لإرشاداتك. وباعتبارك مديرًا لمستخدم يخضع للإشراف في Chrome، يُمكنك إجراء ما يلي:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{جارٍ تنزيل عنصر واحد}zero{جارٍ تنزيل عدّة عناصر}two{جارِ تنزيل عنصرين}few{جارٍ تنزيل عدّة عناصر}many{جارٍ تنزيل عدّة عناصر}other{جارٍ تنزيل عدّة عناصر}}</translation> <translation id="8213449224684199188">تم الدخول إلى وضع الصور</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index c1455fb..aa8baef4 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Избор на файл</translation> <translation id="7366415735885268578">Добавяне на сайт</translation> <translation id="7366909168761621528">Данни за сърфирането</translation> -<translation id="7367483872576694328">Услуга за синтактичен анализ на сканирането за BLE</translation> <translation id="736877393389250337"><ph name="URL" /> не можа да се отвори чрез <ph name="ALTERNATIVE_BROWSER_NAME" />. Моля, обърнете се към системния си администратор.</translation> <translation id="7371006317849674875">Начален час</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">Тази настройка е наложена от администратора ви.</translation> <translation id="8206581664590136590">Изпращане на данни за употребата и диагностиката. Помогнете за подобряването на работата на детето ви с Android, като автоматично изпращате до Google диагностична информация и данни за употребата на устройството и приложенията. Тази информация няма да се използва за идентифициране на детето ви, а ще послужи за подобряване на стабилността на системата и приложенията и др. Някои обобщени данни също така ще подпомогнат приложенията и партньорите на Google, напр. програмистите за Android. Ако настройката „Допълнителна активност в мрежата и приложенията“ е включена за детето ви, тези данни може да се запазват в профила му в Google. <ph name="BEGIN_LINK1" />Научете повече<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Музикант</translation> +<translation id="8206859287963243715">Клетъчно</translation> <translation id="8209677645716428427">Контролираният потребител може да изследва мрежата с ваше напътствие. Като негов мениджър в Chrome можете:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Изтегля се файл}other{Изтеглят се файлове}}</translation> <translation id="8213449224684199188">Преминахте в режим за снимки</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 260e277..ecb65d27 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -4169,7 +4169,6 @@ <translation id="7364796246159120393">ফাইল বেছে নিন</translation> <translation id="7366415735885268578">একটি সাইট যোগ করুন</translation> <translation id="7366909168761621528">ব্রাউজিং ডেটা</translation> -<translation id="7367483872576694328">BLE স্ক্যান পার্সার পরিষেবা</translation> <translation id="736877393389250337"><ph name="ALTERNATIVE_BROWSER_NAME" />-এ <ph name="URL" /> খোলা যাচ্ছে না। সিস্টেম অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন।</translation> <translation id="7371006317849674875">শুরুর সময়</translation> <translation id="7375053625150546623">EAP</translation> @@ -4743,6 +4742,7 @@ <translation id="8206354486702514201">এই সেটিংটি আপনার প্রশাসক দ্বারা কার্যকরী করা হয়েছে৷</translation> <translation id="8206581664590136590">ব্যবহার এবং ডায়াগনস্টিক ডেটা পাঠান। Google-এ নিজে থেকে ডায়াগনস্টিক, ডিভাইস এবং অ্যাপ ব্যবহারের ডেটা পাঠিয়ে, আপনার সন্তানের Android অভিজ্ঞতাকে উন্নত করতে সাহায্য করুন। এটি আপনার সন্তানকে শনাক্ত করতে ব্যবহার করা হবে না এবং সিস্টেম ও অ্যাপের স্থিতিশীলতা এবং অন্যান্য উন্নতিতে সাহায্য করবে। ব্যবহারকারীদের কিছু সম্মিলিত ডেটা Google অ্যাপ এবং Android ডেভেলপারদের মতো পার্টনারদের কাজে লাগবে। অতিরিক্ত ওয়েব ও অ্যাপ অ্যাক্টিভিটি সেটিংটি আপনার সন্তানের ডিভাইসের জন্য চালু করা থাকলে, এই ডেটা তাদের Google অ্যাকাউন্টে সেভ করা হতে পারে। <ph name="BEGIN_LINK1" />আরও জানুন<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">ব্লুজস</translation> +<translation id="8206859287963243715">সেলুলার</translation> <translation id="8209677645716428427">একজন তত্ত্বাবধানে থাকা ব্যবহারকারী আপনার নির্দেশিকার সাহায্যে ওয়েব এক্সপ্লোর করতে পারেন৷ Chrome-এ একজন তত্ত্বাবধানে থাকা ব্যবহারকারীর ম্যানেজার হিসাবে, আপনি যা করতে পারেন:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{ডাউনলোড করা হচ্ছে}one{ডাউনলোডগুলি করা হচ্ছে}other{ডাউনলোডগুলি করা হচ্ছে}}</translation> <translation id="8213449224684199188">ফটো মোডটি চালু হয়েছে</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 29d879b..1488132d 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -4169,7 +4169,6 @@ <translation id="7364796246159120393">Tria un fitxer</translation> <translation id="7366415735885268578">Afegeix un lloc</translation> <translation id="7366909168761621528">Dades de navegació</translation> -<translation id="7367483872576694328">Servei d'anàlisi de cerques de BLE</translation> <translation id="736877393389250337"><ph name="URL" /> no s'ha pogut obrir a <ph name="ALTERNATIVE_BROWSER_NAME" />. Contacta amb l'administrador del sistema.</translation> <translation id="7371006317849674875">Hora d'inici</translation> <translation id="7375053625150546623">EAP</translation> @@ -4742,6 +4741,7 @@ <translation id="8206354486702514201">L'administrador aplica aquesta opció de configuració.</translation> <translation id="8206581664590136590">Envia dades d'ús i de diagnòstic. Ajuda a millorar l'experiència a Android del teu fill enviant automàticament a Google dades de diagnòstic, del dispositiu i d'ús d'aplicacions. Aquestes dades no es faran servir per identificar el teu fill i ajudaran a millorar l'estabilitat del sistema i de les aplicacions, entre altres característiques. Una part de les dades agregades també serà útil per a les aplicacions i els col·laboradors de Google, com ara els desenvolupadors d'Android. Si l'opció Activitat al web i en aplicacions addicional està activada per al teu fill, és possible que aquestes dades es desin al seu Compte de Google. <ph name="BEGIN_LINK1" />Més informació<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Música</translation> +<translation id="8206859287963243715">Cel·lular</translation> <translation id="8209677645716428427">Un usuari supervisat pot explorar el web amb la vostra orientació. Com a administrador d'un usuari supervisat de Chrome, podeu fer el següent:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Baixada en curs}other{Baixades en curs}}</translation> <translation id="8213449224684199188">S'ha activat el mode de fotos</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 7275bbf..38cc76a 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -4168,7 +4168,6 @@ <translation id="7364796246159120393">Vybrat soubor</translation> <translation id="7366415735885268578">Přidání webu</translation> <translation id="7366909168761621528">Údaje o prohlížení</translation> -<translation id="7367483872576694328">Služba analýzy skenování BLE</translation> <translation id="736877393389250337">Adresu <ph name="URL" /> se v prohlížeči <ph name="ALTERNATIVE_BROWSER_NAME" /> nepodařilo otevřít. Kontaktujte administrátora systému.</translation> <translation id="7371006317849674875">Čas zahájení</translation> <translation id="7375053625150546623">EAP</translation> @@ -4741,6 +4740,7 @@ <translation id="8206354486702514201">Toto nastavení je vyžadováno administrátorem.</translation> <translation id="8206581664590136590">Odesílat údaje o využití a diagnostice. Pomozte prostředí Android svého dítěte zlepšit tím, že necháte do Googlu automaticky odesílat diagnostické údaje a údaje o využití zařízení a aplikací. Tyto údaje nebudou používány ke zjištění totožnosti dítěte a pomohou nám se zvyšováním stability systému a aplikací a dalšími vylepšeními. Některá souhrnná data budou moci využít také naši partneři, např. vývojáři aplikací pro Android. Pokud má dítě zapnuté dodatečné nastavení Aktivita na webu a v aplikacích, mohou se tato data ukládat do jeho účtu Google. <ph name="BEGIN_LINK1" />Další informace<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Melodie</translation> +<translation id="8206859287963243715">Mobil</translation> <translation id="8209677645716428427">Dozorovaný uživatel si může prohlížet web podle vašich pokynů. Jako správce dozorovaného uživatele v Chromu můžete:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Probíhá stahování}few{Probíhají stahování}many{Probíhají stahování}other{Probíhají stahování}}</translation> <translation id="8213449224684199188">Přešli jste do režimu fotek</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index d5767b9..b22bd3a 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -4171,7 +4171,6 @@ <translation id="7364796246159120393">Vælg fil</translation> <translation id="7366415735885268578">Tilføj et website</translation> <translation id="7366909168761621528">Browserdata</translation> -<translation id="7367483872576694328">Parsingtjeneste for BLE-scanning</translation> <translation id="736877393389250337"><ph name="URL" /> kunne ikke åbnes i <ph name="ALTERNATIVE_BROWSER_NAME" />. Kontakt din systemadministrator.</translation> <translation id="7371006317849674875">Starttidspunkt</translation> <translation id="7375053625150546623">EAP</translation> @@ -4746,6 +4745,7 @@ <translation id="8206354486702514201">Denne indstilling håndhæves af din administrator.</translation> <translation id="8206581664590136590">Send brugs- og diagnosticeringsdata. Hjælp med at forbedre dit barns Android-oplevelse ved automatisk at sende diagnosticerings- og enhedsdata samt data om brug af apps til Google. Disse data bruges ikke til at identificere dit barn. De bruges kun til forbedring af bl.a. systemets og appens stabilitet. Visse samlede data hjælper også Google-apps og -partnere, f.eks. Android-udviklere. Hvis indstillingen til yderligere web- og appaktivitet er aktiveret for dit barn, gemmes disse data muligvis på barnets Google-konto. <ph name="BEGIN_LINK1" />Få flere oplysninger<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">BB King</translation> +<translation id="8206859287963243715">Mobil</translation> <translation id="8209677645716428427">En administreret bruger kan søge på nettet med din hjælp. Som administrator for en administreret bruger i Chrome kan du:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Downloaden er i gang}one{Downloaden er i gang}other{Downloadene er i gang}}</translation> <translation id="8213449224684199188">Fototilstand er aktiveret</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 7dc92ec..4f00c5f 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -4167,7 +4167,6 @@ <translation id="7364796246159120393">Datei auswählen</translation> <translation id="7366415735885268578">Website hinzufügen</translation> <translation id="7366909168761621528">Browserdaten</translation> -<translation id="7367483872576694328">BLE-Scan-Parser-Service</translation> <translation id="736877393389250337"><ph name="URL" /> kann in <ph name="ALTERNATIVE_BROWSER_NAME" /> nicht geöffnet werden. Bitte wenden Sie sich an Ihren Systemadministrator.</translation> <translation id="7371006317849674875">Startzeit</translation> <translation id="7375053625150546623">EAP</translation> @@ -4742,6 +4741,7 @@ <translation id="8206354486702514201">Diese Einstellung wird von Ihrem Administrator erzwungen.</translation> <translation id="8206581664590136590">Sie haben die Möglichkeit, Nutzungs- und Diagnosedaten zu senden. Sie können uns helfen, Android für Ihr Kind zu verbessern, indem Sie zulassen, dass Diagnose- sowie Geräte- und App-Nutzungsdaten automatisch an Google gesendet werden. Ihr Kind wird mithilfe dieser Daten nicht identifiziert, sie helfen jedoch beispielsweise dabei, die Stabilität des Systems und der Apps zu verbessern. Einige aggregierte Daten sind auch für Apps und Partner von Google, beispielsweise Android-Entwickler, nützlich. Wenn zusätzlich die Einstellung "Web- & App-Aktivitäten" für Ihr Kind aktiviert ist, werden diese Daten in seinem Google-Konto gespeichert. <ph name="BEGIN_LINK1" />Weitere Informationen<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Blues</translation> +<translation id="8206859287963243715">Mobil</translation> <translation id="8209677645716428427">Sie können die Weberfahrung von betreuten Nutzern anpassen. Als Manager eines betreuten Nutzers in Chrome können Sie:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Download wird ausgeführt}other{Downloads werden ausgeführt}}</translation> <translation id="8213449224684199188">Fotomodus aktiviert</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index a2c9d9a..5ef37a9 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -4173,7 +4173,6 @@ <translation id="7364796246159120393">Επιλογή αρχείου</translation> <translation id="7366415735885268578">Προσθήκη ιστοτόπου</translation> <translation id="7366909168761621528">Δεδομένα περιήγησης</translation> -<translation id="7367483872576694328">Υπηρεσία αναλυτή σάρωσης BLE</translation> <translation id="736877393389250337">Δεν ήταν δυνατό το άνοιγμα της διεύθυνσης <ph name="URL" /> στο <ph name="ALTERNATIVE_BROWSER_NAME" />. Επικοινωνήστε με τον διαχειριστή του συστήματός σας.</translation> <translation id="7371006317849674875">Ώρα έναρξης</translation> <translation id="7375053625150546623">EAP</translation> @@ -4749,6 +4748,7 @@ <translation id="8206354486702514201">Η ρύθμιση αυτή επιβάλλεται από τον διαχειριστή σας.</translation> <translation id="8206581664590136590">Αποστολή δεδομένων χρήσης και διαγνωστικών. Συμβάλλετε στη βελτίωση της εμπειρίας Android του παιδιού σας με την αυτόματη αποστολή διαγνωστικών δεδομένων και δεδομένων συσκευής και χρήσης εφαρμογών στην Google. Αυτά τα δεδομένα δεν θα χρησιμοποιηθούν για την ταυτοποίηση του παιδιού σας και θα βοηθήσουν με τη σταθερότητα του συστήματος και των εφαρμογών και την παροχή άλλων βελτιώσεων. Ορισμένα συγκεντρωτικά δεδομένα θα βοηθήσουν επίσης τις εφαρμογές και τους συνεργάτες της Google, όπως τους προγραμματιστές Android. Εάν είναι ενεργή η ρύθμιση της πρόσθετης Δραστηριότητας ιστού και εφαρμογών για το παιδί σας, αυτά τα δεδομένα μπορεί να αποθηκευτούν στον Λογαριασμό του Google. <ph name="BEGIN_LINK1" />Μάθετε περισσότερα<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Μπλουζ</translation> +<translation id="8206859287963243715">Κινητό</translation> <translation id="8209677645716428427">Οι εποπτευόμενοι χρήστες μπορούν να εξερευνήσουν το διαδίκτυο με την καθοδήγησή σας. Ως διαχειριστής ενός εποπτευόμενου χρήστη στο Chrome, μπορείτε να κάνετε τα εξής:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Λήψη σε εξέλιξη}other{Λήψεις σε εξέλιξη}}</translation> <translation id="8213449224684199188">Έγινε είσοδος στη λειτουργία φωτογραφίας</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 75bbc20..871e48a 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -4171,7 +4171,6 @@ <translation id="7364796246159120393">Choose file</translation> <translation id="7366415735885268578">Add a site</translation> <translation id="7366909168761621528">Browsing data</translation> -<translation id="7367483872576694328">BLE Scan Parser Service</translation> <translation id="736877393389250337"><ph name="URL" /> could not be open in <ph name="ALTERNATIVE_BROWSER_NAME" />. Please contact your system administrator.</translation> <translation id="7371006317849674875">Start time</translation> <translation id="7375053625150546623">EAP</translation> @@ -4747,6 +4746,7 @@ <translation id="8206354486702514201">This setting is enforced by your administrator.</translation> <translation id="8206581664590136590">Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web & App Activity setting is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK1" />Find out more<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesy</translation> +<translation id="8206859287963243715">Mobile</translation> <translation id="8209677645716428427">A supervised user can explore the web with your guidance. As the manager of a supervised user in Chrome, you can:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Download is in progress}other{Downloads are in progress}}</translation> <translation id="8213449224684199188">Photo mode entered</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index bbc39a2..8472e4d 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -4169,7 +4169,6 @@ <translation id="7364796246159120393">Seleccionar archivo</translation> <translation id="7366415735885268578">Agregar un sitio</translation> <translation id="7366909168761621528">Datos de navegación</translation> -<translation id="7367483872576694328">Servicio del analizador de escaneo de BLE</translation> <translation id="736877393389250337"><ph name="URL" /> no se pudo abrir en <ph name="ALTERNATIVE_BROWSER_NAME" />. Comunícate con el administrador del sistema.</translation> <translation id="7371006317849674875">Hora de inicio</translation> <translation id="7375053625150546623">EAP</translation> @@ -4745,6 +4744,7 @@ <translation id="8206354486702514201">El administrador controla esta configuración.</translation> <translation id="8206581664590136590">Envía datos de uso y diagnóstico. Para ayudar a mejorar la experiencia de Android de tu hijo, envía a Google datos de diagnóstico y uso de dispositivos y apps de forma automática. Esta información no se usará para identificar a tu hijo y ayudará a lograr la estabilidad de las apps y el sistema, entre otras mejoras. Algunos datos agregados también ayudarán a las apps y los socios de Google, como los desarrolladores de Android. Si habilitaste la "Actividad de web y de aplicaciones adicional" en la Cuenta de Google de tu hijo, es posible que se almacenen estos datos en esa cuenta. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Musical</translation> +<translation id="8206859287963243715">Celular</translation> <translation id="8209677645716428427">Un usuario supervisado puede explorar la Web con tu ayuda. Como administrador de un usuario supervisado en Chrome, puedes:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Descarga en curso}other{Descargas en curso}}</translation> <translation id="8213449224684199188">Ingresaste al modo de foto</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 9c86012d..816ab2f 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -4169,7 +4169,6 @@ <translation id="7364796246159120393">Seleccionar archivo</translation> <translation id="7366415735885268578">Añadir un sitio web</translation> <translation id="7366909168761621528">Datos de navegación</translation> -<translation id="7367483872576694328">Servicio para analizar el escaneado de BLE</translation> <translation id="736877393389250337"><ph name="URL" /> no se ha podido abrir en <ph name="ALTERNATIVE_BROWSER_NAME" />. Ponte en contacto con el administrador del sistema.</translation> <translation id="7371006317849674875">Hora de inicio</translation> <translation id="7375053625150546623">EAP</translation> @@ -4745,6 +4744,7 @@ <translation id="8206354486702514201">El administrador aplica esta opción.</translation> <translation id="8206581664590136590">Enviar datos de uso y diagnóstico. Contribuye a mejorar la experiencia de Android de tu hijo enviando automáticamente a Google datos de diagnóstico, del dispositivo y del uso de las aplicaciones. Los datos no se usarán para identificar a tu hijo, sino para aumentar la estabilidad de las aplicaciones y del sistema y realizar otras mejoras. Parte de los datos recogidos también ayudarán a las aplicaciones y los colaboradores de Google, como los desarrolladores de Android. Si la opción Actividad en la Web y en Aplicaciones Adicional está activada, es posible que estos datos se guarden en la cuenta de Google de tu hijo. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Música</translation> +<translation id="8206859287963243715">Móvil</translation> <translation id="8209677645716428427">Un usuario supervisado puede explorar la Web con tu ayuda. Como administrador de un usuario supervisado en Chrome, puedes realizar las siguientes acciones:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Descarga en curso}other{Descargas en curso}}</translation> <translation id="8213449224684199188">Se ha cambiado al modo de foto</translation> @@ -5395,7 +5395,7 @@ <translation id="930268624053534560">Marcas de tiempo detalladas</translation> <translation id="932327136139879170">Página principal</translation> <translation id="932508678520956232">No se ha podido iniciar la impresión.</translation> -<translation id="93343527085570547">Accede a la <ph name="BEGIN_LINK1" />página Ayuda de Legal<ph name="END_LINK1" /> para solicitar cambios de contenido por motivos legales. Parte de la información del sistema y de la cuenta se enviará a Google, que la utilizará para solucionar problemas técnicos y mejorar sus servicios, de acuerdo con su <ph name="BEGIN_LINK2" />política de privacidad<ph name="END_LINK2" /> y <ph name="BEGIN_LINK3" />condiciones del servicio<ph name="END_LINK3" />.</translation> +<translation id="93343527085570547">Accede a la <ph name="BEGIN_LINK1" />página Ayuda de Legal<ph name="END_LINK1" /> para solicitar cambios de contenido por motivos legales. Parte de la información del sistema y de la cuenta se enviará a Google, que la utilizará para solucionar problemas técnicos y mejorar sus servicios, de acuerdo con su <ph name="BEGIN_LINK2" />Política de Privacidad<ph name="END_LINK2" /> y <ph name="BEGIN_LINK3" />Condiciones del Servicio<ph name="END_LINK3" />.</translation> <translation id="93393615658292258">Solo contraseña</translation> <translation id="934503638756687833">Si es necesario, también se eliminarán elementos que no se incluyan aquí. Consulta más información sobre la <a href="<ph name="URL" />">protección contra software no deseado</a> en el informe de privacidad de Chrome.</translation> <translation id="935490618240037774">Tus marcadores, historial, contraseñas y otros ajustes se sincronizarán con tu cuenta de Google para que puedas utilizarlos en todos tus dispositivos.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 9afb99f3..0c8ff20 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Vali fail</translation> <translation id="7366415735885268578">Saidi lisamine</translation> <translation id="7366909168761621528">Sirvimisandmed</translation> -<translation id="7367483872576694328">BLE skannimise sõelumisteenus</translation> <translation id="736877393389250337">URL-i <ph name="URL" /> ei saanud brauseris <ph name="ALTERNATIVE_BROWSER_NAME" /> avada. Võtke ühendust oma süsteemiadministraatoriga.</translation> <translation id="7371006317849674875">Algusaeg</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">Selle seade jõustas teie administraator.</translation> <translation id="8206581664590136590">Saada kasutus- ja diagnostikaandmeid. Aidake täiustada oma lapse Androidi kasutuskogemust, saates Google'ile automaatselt seadme teavet ning rakenduse kasutus- ja diagnostikaandmeid. Neid andmeid ei kasutata teie lapse isiku tuvastamiseks ning need aitavad parandada süsteemi ja rakenduse stabiilsust ning muud. Teatud koondandmed on abiks ka Google'i rakendustele ja partneritele, näiteks Androidi arendajatele. Kui täiendavad veebi- ja rakendustegevused on teie lapse jaoks sisse lülitatud, võidakse need andmed salvestada tema Google'i kontole. <ph name="BEGIN_LINK1" />Lisateave<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluusilik</translation> +<translation id="8206859287963243715">Mobiil</translation> <translation id="8209677645716428427">Valvatav kasutaja saab veebi avastada teie juhendamisel. Valvatava kasutaja haldurina Chrome'is saate teha järgmist:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Allalaadimine on pooleli}other{Allalaadimised on pooleli}}</translation> <translation id="8213449224684199188">Fotorežiim aktiveeriti</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 0a1c1292..7b30c59f 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -4168,7 +4168,6 @@ <translation id="7364796246159120393">انتخاب فایل</translation> <translation id="7366415735885268578">افزودن سایت</translation> <translation id="7366909168761621528">دادههای مرور</translation> -<translation id="7367483872576694328">سرویس تجزیهکننده اسکن BLE (بلوتوث کممصرف)</translation> <translation id="736877393389250337"><ph name="URL" /> در <ph name="ALTERNATIVE_BROWSER_NAME" /> باز نشد. لطفاً با سرپرست سیستم تماس بگیرید.</translation> <translation id="7371006317849674875">زمان شروع</translation> <translation id="7375053625150546623">EAP</translation> @@ -4744,6 +4743,7 @@ <translation id="8206354486702514201">این تنظیم توسط سرپرست شما اجباری شده است.</translation> <translation id="8206581664590136590">دادههای استفاده و عیبیابی را ارسال کنید. با ارسال خودکار دادههای عیبیابی و دادههای استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این دادهها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی دادههای انبوه نیز به برنامهها و شرکای Google (مانند برنامهنویسهای Android) کمک میکند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این دادهها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK1" />بیشتر بدانید<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">بلوزی</translation> +<translation id="8206859287963243715">سلولی</translation> <translation id="8209677645716428427">کاربر نظارتشده میتواند با راهنمایی شما در وب کاوش کند. شما به عنوان مدیر کاربر نظارتشده در Chrome میتوانید:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{بارگیری درحال انجام است}one{بارگیری درحال انجام است}other{بارگیری درحال انجام است}}</translation> <translation id="8213449224684199188">به حالت عکسبرداری وارد شد</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 0792f0a5..bf81346 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Valitse tiedosto</translation> <translation id="7366415735885268578">Lisää sivusto</translation> <translation id="7366909168761621528">Selailutiedot</translation> -<translation id="7367483872576694328">BLE-tarkistuksen jäsennyspalvelu</translation> <translation id="736877393389250337">Osoitteen <ph name="URL" /> avaaminen ei onnistunut selaimessa <ph name="ALTERNATIVE_BROWSER_NAME" />. Ota yhteyttä järjestelmänvalvojaasi.</translation> <translation id="7371006317849674875">Aloitusaika</translation> <translation id="7375053625150546623">EAP</translation> @@ -4747,6 +4746,7 @@ <translation id="8206354486702514201">Järjestelmänvalvojasi hallinnoi tätä asetusta.</translation> <translation id="8206581664590136590">Lähetä käyttö- ja diagnostiikkadataa. Auta parantamaan lapsesi Android-käyttökokemusta lähettämällä diagnostiikkadataa sekä laitteen ja sovellusten käyttödataa automaattisesti Googlelle. Dataa ei käytetä lapsesi henkilöllisyyden selvittämiseen – sen avulla parannetaan esimerkiksi järjestelmän ja sovellusten vakautta. Kootusta datasta on hyötyä myös Googlen sovelluksille ja kumppaneille, kuten Android-kehittäjille. Jos muun verkko- ja sovellustoiminnan asetus on lapsella käytössä, tätä dataa voidaan tallentaa hänen Google-tililleen. <ph name="BEGIN_LINK1" />Lue lisää<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Muusikko</translation> +<translation id="8206859287963243715">Matkapuhelin</translation> <translation id="8209677645716428427">Valvottu käyttäjä voi selata internetiä sinun opastuksessasi. Valvotun käyttäjän hallinnoijana Chromessa voit</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Lataus on käynnissä}other{Latauksia on käynnissä}}</translation> <translation id="8213449224684199188">Valokuvatilaan siirrytty</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 3eba88e..0ffe08f 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -527,6 +527,7 @@ <translation id="1781502536226964113">Buksan ang page ng Bagong Tab</translation> <translation id="1781771911845953849">Mga account at pag-sync</translation> <translation id="1782196717298160133">Hinahanap ang iyong telepono</translation> +<translation id="1784707308176068866">Patakbuhin sa background kapag hiniling ng nakikipagtulungang native application</translation> <translation id="1784849162047402014">Kaunti na lang ang espasyo sa disk ng device</translation> <translation id="1790194216133135334">Ipadala ang link sa <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Pinalawak na display</translation> @@ -535,6 +536,7 @@ <translation id="1799071797295057738">Awtomatikong na-disable ang extension na "<ph name="EXTENSION_NAME" />."</translation> <translation id="1802687198411089702">Hindi tumutugon ang page. Maaari mo itong hintayin o maaari kang lumabas.</translation> <translation id="1802931390041703523">Naka-block ang Flash sa page na ito</translation> +<translation id="1803531841600994172">Wika kung saan ita-translate</translation> <translation id="1803545009660609783">I-retrain</translation> <translation id="1805472176602625930">Pindutin ang button sa security key</translation> <translation id="1805738995123446102">Ginagamit ng tab sa background ang iyong mikropono</translation> @@ -736,6 +738,7 @@ <translation id="212862741129535676">Porsyento ng Ginagamit sa Estado ng Dalas</translation> <translation id="2129825002735785149">I-update ang plugin</translation> <translation id="2131077480075264">Hindi ma-install ang "<ph name="APP_NAME" />" dahil hindi ito pinayagan ng "<ph name="IMPORT_NAME" />"</translation> +<translation id="21354425047973905">Itago ang Mga PIN</translation> <translation id="2135456203358955318">Naka-dock na magnifier</translation> <translation id="2135787500304447609">&Magpatuloy</translation> <translation id="2136372518715274136">Ilagay ang bagong password</translation> @@ -950,6 +953,7 @@ <translation id="2436707352762155834">Minimum</translation> <translation id="2439545803278355377">Ilagay ang bago mong PIN. Dapat ay may hindi bababa sa apat na character ang PIN, at puwede itong maglaman ng mga titik, numero, at iba pang character.</translation> <translation id="2440604414813129000">Tingnan s&ource</translation> +<translation id="2444119669991608829">Hindi <ph name="LANGUAGE" /> Ang Page ?</translation> <translation id="2445081178310039857">Kinakailangan ang pinagmulang direktoryo ng extension.</translation> <translation id="2445484935443597917">Gumawa ng Bagong Profile</translation> <translation id="2446585455334014596">Gustong i-verify ng <ph name="APP_NAME" /> ang iyong pagkakakilanlan</translation> @@ -963,6 +967,7 @@ <translation id="2454247629720664989">Keyword</translation> <translation id="245661998428026871">Hihinto sa pag-play ang video sa picture-in-picture mode.</translation> <translation id="2457246892030921239">Gustong kumopya ng <ph name="APP_NAME" /> ng mga file mula sa <ph name="VOLUME_NAME" />.</translation> +<translation id="2458379781610688953">I-update ang account, <ph name="EMAIL" /></translation> <translation id="2458591546854598341">Invalid ang token sa pamamahala ng device.</translation> <translation id="2462724976360937186">Certification Authority Key ID</translation> <translation id="2462752602710430187">Idinagdag ang <ph name="PRINTER_NAME" /></translation> @@ -1128,6 +1133,7 @@ <translation id="2693176596243495071">Oops! Nagkaroon ng hindi matukoy na error. Pakisubukang muli sa ibang pagkakataon o makipag-ugnayan sa iyong administrator kung magpapatuloy ang isyu.</translation> <translation id="2695749433451188613">Internet Printing Protocol (HTTPS)</translation> <translation id="2699911226086014512">Hindi nagamit ang PIN na may code <ph name="RETRIES" />.</translation> +<translation id="2701737434167469065">Mag-sign in, <ph name="EMAIL" /></translation> <translation id="270358213449696159">Mga content ng Mga Tuntunin ng Google Chrome OS</translation> <translation id="2704184184447774363">Microsoft Document Signing</translation> <translation id="270516211545221798">Bilis ng touchpad</translation> @@ -1921,6 +1927,7 @@ <translation id="3872220884670338524">Higit pang pagkilos, naka-save na account para sa <ph name="USERNAME" /> sa <ph name="DOMAIN" /></translation> <translation id="3872991219937722530">Magbakante ng espasyo sa disk o hindi gagana nang maayos ang iyong device.</translation> <translation id="3873315167136380065">Para i-on ito, <ph name="BEGIN_LINK" />i-reset ang pag-sync<ph name="END_LINK" /> para alisin ang iyong passphrase sa pag-sync</translation> +<translation id="3873423927483480833">Ipakita ang Mga PIN</translation> <translation id="3873915545594852654">Nagkaproblema sa ARC++.</translation> <translation id="3878840326289104869">Gumagawa ng pinangangasiwaang user</translation> <translation id="3879748587602334249">Download manager</translation> @@ -2345,6 +2352,7 @@ <translation id="4562155214028662640">Magdagdag ng Fingerprint</translation> <translation id="4563880231729913339">Daliri 3</translation> <translation id="4565377596337484307">Itago ang password</translation> +<translation id="456717285308019641">Wika ng page na ita-translate</translation> <translation id="4567772783389002344">Magdagdag ng salita</translation> <translation id="4568025708905928793">Humihiling ng security key</translation> <translation id="4568213207643490790">Paumanhin, hindi pinapayagan ang mga Google account sa device na ito.</translation> @@ -2375,6 +2383,7 @@ <translation id="4613144866899789710">Kinakansela ang pag-install ng Linux...</translation> <translation id="4613271546271159013">Binago ng isang extension ang ipinapakitang page kapag nagbukas ka ng bagong tab.</translation> <translation id="4615586811063744755">walang piniling cookie</translation> +<translation id="4617001782309103936">Napakaikli</translation> <translation id="4617270414136722281">Mga opsyon ng extension</translation> <translation id="4619615317237390068">Mga tab mula sa iba pang device</translation> <translation id="4620809267248568679">Ipinapatupad ng isang extension ang setting na ito.</translation> @@ -2387,6 +2396,7 @@ <translation id="4633003931260532286">Kinakailangan ng extension ang "<ph name="IMPORT_NAME" />" na may minimum na bersyon na "<ph name="IMPORT_VERSION" />," ngunit ang bersyon na "<ph name="INSTALLED_VERSION" />" lang ang naka-install</translation> <translation id="4634771451598206121">Muling mag-sign in...</translation> <translation id="4635398712689569051">Hindi available ang <ph name="PAGE_NAME" /> sa mga Bisitang user.</translation> +<translation id="4637083375689622795">Higit pang pagkilos, <ph name="EMAIL" /></translation> <translation id="4641539339823703554">Hindi nagawang itakda ng Chrome ang oras sa system. Pakitingnan ang oras sa ibaba at iwasto ito kung kinakailangan.</translation> <translation id="4643612240819915418">&Buksan ang Video sa Bagong Tab</translation> <translation id="4645676300727003670">&Panatilihin</translation> @@ -2904,6 +2914,7 @@ <translation id="5449716055534515760">Isara ang Win&dow</translation> <translation id="5453630479789469584">Hindi ma-set up ang Plugin VM</translation> <translation id="5454166040603940656">sa <ph name="PROVIDER" /></translation> +<translation id="545426320101607695">Wika Kung Saan Ita-translate</translation> <translation id="5457113250005438886">Di-wasto</translation> <translation id="5457459357461771897">Basahin at i-delete ang mga larawan, musika at iba pang media sa iyong computer</translation> <translation id="5457599981699367932">Mag-browse bilang Bisita</translation> @@ -3825,6 +3836,7 @@ <translation id="6871644448911473373">OCSP Responder: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Tinanggihan ng server ang password na inilagay mo.</translation> <translation id="6876155724392614295">Bisikleta</translation> +<translation id="6877460900831874810">I-enable ang pag-playback ng media ng Chrome sa lock screen</translation> <translation id="6878422606530379992">Pinapayagan ang mga sensor</translation> <translation id="6880587130513028875">Hinarangan ang mga larawan sa pahinang ito.</translation> <translation id="6883319974225028188">Oops! Hindi na-save ng system ang configuration ng device.</translation> @@ -3925,6 +3937,7 @@ <translation id="7019805045859631636">Mabilis</translation> <translation id="7022562585984256452">Naitakda na ang iyong home page.</translation> <translation id="7025190659207909717">Pamamahala sa serbisyo ng data ng mobile</translation> +<translation id="7027891519253193555">Hindi <ph name="LANGUAGE" /> ang page ?</translation> <translation id="7029809446516969842">Mga Password</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Nakakonekta ang serial port</translation> <translation id="7031962166228839643">Ang TPM ay ihinahanda, mangyaring maghintay (maaaring tumagal ito nang ilang minuto)...</translation> @@ -4130,6 +4143,7 @@ <translation id="7328699668338161242">Nakikilala na ng iyong Assistant ang boses mo</translation> <translation id="7328867076235380839">Invalid ang kumbinasyon</translation> <translation id="7329154610228416156">Hindi nakapag-sign in dahil naka-configure ito sa paggamit ng isang hindi secure na URL (<ph name="BLOCKED_URL" />). Mangyaring makipag-ugnayan sa iyong administrator.</translation> +<translation id="733006820760728943">Itakda bilang aktibong account</translation> <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> @@ -4205,6 +4219,7 @@ <translation id="7442465037756169001">Handa nang ma-set up ang iyong Hangouts Meet hardware.</translation> <translation id="744341768939279100">Gumawa ng bagong profile</translation> <translation id="7444983668544353857">Huwag paganahin <ph name="NETWORKDEVICE" /></translation> +<translation id="7448430327655618736">Awtomatikong nag-i-install ng mga app</translation> <translation id="7450761244949417357">Binubuksan ngayon sa <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> <translation id="7453008956351770337">Sa pamamagitan ng pagpili sa printer na ito, binibigyan mo ng pahintulot ang sumusunod na extension upang i-access ang iyong printer:</translation> <translation id="7456142309650173560">dev</translation> @@ -4389,6 +4404,7 @@ <translation id="7728570244950051353">Lock screen mula sa sleep mode</translation> <translation id="7728668285692163452">Malalapat ang pagbabago sa channel sa ibang pagkakataon</translation> <translation id="7730449930968088409">Kunan ang nilalaman ng iyong screen</translation> +<translation id="7731119595976065702">Higit Pang Wika...</translation> <translation id="7732111077498238432">Kinokontrol ng patakaran ang network</translation> <translation id="7737238973539693982">I-delete ang Linux (Beta)</translation> <translation id="7740996059027112821">Karaniwan</translation> @@ -4731,6 +4747,7 @@ <translation id="8206354486702514201">Ipinapatupad ng iyong administrator ang setting na ito.</translation> <translation id="8206581664590136590">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. 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_LINK1" />Matuto Pa<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Musika</translation> +<translation id="8206859287963243715">Cellular</translation> <translation id="8209677645716428427">Maaaring i-explore ng isang pinangangasiwaang user ang web sa iyong paggabay. Bilang manager ng isang pinangangasiwaang user sa Chrome, maaari mong:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Kasalukuyang isinasagawa ang pag-download}one{Kasalukuyang isinasagawa ang mga pag-download}other{Kasalukuyang isinasagawa ang mga pag-download}}</translation> <translation id="8213449224684199188">Nailagay sa photo mode</translation> @@ -4739,6 +4756,7 @@ <translation id="8214489666383623925">Open File...</translation> <translation id="8214962590150211830">Alisin ang Taong Ito</translation> <translation id="8217399928341212914">Patuloy na i-block ang mga awtomatikong pagda-download ng maraming file</translation> +<translation id="822519928942492333">Wika ng Page na Ita-translate</translation> <translation id="8225265270453771718">Magbahagi ng application window</translation> <translation id="8225753906568652947">I-redeem ang iyong mga alok</translation> <translation id="8226222018808695353">Ipinagbabawal</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index a9f867b3..b5d8a01d 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -4173,7 +4173,6 @@ <translation id="7364796246159120393">Choisir un fichier</translation> <translation id="7366415735885268578">Ajouter un site</translation> <translation id="7366909168761621528">Données de navigation</translation> -<translation id="7367483872576694328">Service d'analyse BLE</translation> <translation id="736877393389250337">Impossible d'ouvrir <ph name="URL" /> dans <ph name="ALTERNATIVE_BROWSER_NAME" />. Veuillez contacter votre administrateur système.</translation> <translation id="7371006317849674875">Heure de début</translation> <translation id="7375053625150546623">EAP</translation> @@ -4749,6 +4748,7 @@ <translation id="8206354486702514201">Ce paramètre est appliqué par votre administrateur.</translation> <translation id="8206581664590136590">Envoyer des données d'utilisation et de diagnostic. Contribuez à l'amélioration de l'expérience de votre enfant sur Android en envoyant automatiquement à Google des données relatives aux diagnostics et à l'utilisation de l'appareil et des applications. Ces informations ne seront pas utilisées pour identifier votre enfant, mais elles nous aideront à améliorer, entre autres, la stabilité du système et des applications. Certaines données globales seront également utiles aux développeurs des applications Google et à nos partenaires, tels que les développeurs Android. Si vous activez le paramètre relatif à l'activité supplémentaire sur le Web et les applications pour votre enfant, ces données peuvent être enregistrées dans son compte Google. <ph name="BEGIN_LINK1" />En savoir plus<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Musique</translation> +<translation id="8206859287963243715">Mobile</translation> <translation id="8209677645716428427">Un utilisateur supervisé peut naviguer sur le Web avec votre aide. En tant que gestionnaire d'un tel utilisateur dans Chrome, vous pouvez :</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Téléchargement en cours}one{Téléchargement en cours}other{Téléchargements en cours}}</translation> <translation id="8213449224684199188">Mode Photo activé</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index b78c84d..e8a8fd16c 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -4170,7 +4170,6 @@ <translation id="7364796246159120393">ફાઇલ પસંદ કરો</translation> <translation id="7366415735885268578">એક સાઇટ ઉમેરો</translation> <translation id="7366909168761621528">બ્રાઉઝિંગ ડેટા</translation> -<translation id="7367483872576694328">BLE સ્કૅન વિશ્લેષક સેવા</translation> <translation id="736877393389250337"><ph name="ALTERNATIVE_BROWSER_NAME" />માં <ph name="URL" /> ખોલી શકાયું નથી. કૃપા કરીને તમારા સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરો.</translation> <translation id="7371006317849674875">પ્રારંભ સમય</translation> <translation id="7375053625150546623">EAP</translation> @@ -4740,6 +4739,7 @@ <translation id="8206354486702514201">આ સેટિંગ તમારા વહીવટકર્તા દ્વારા લાગુ કરેલી છે.</translation> <translation id="8206581664590136590">વપરાશ અને નિદાનનો ડેટા મોકલો. Googleને નિદાન, ડિવાઇસ અને ઍપ વપરાશનો ડેટા ઑટોમૅટિક રીતે મોકલીને તમારા બાળકના Android અનુભવને બહેતર બનાવવામાં સહાય કરો. આનો ઉપયોગ તમારા બાળકને ઓળખવા માટે થશે નહીં અને સિસ્ટમ અને ઍપની સ્થિરતા અને અન્ય સુધારણાઓમાં સહાય કરશે. એકત્રીકરણ કરેલો કેટલોક ડેટા Google ઍપ અને ભાગીદારોને પણ મદદ કરશે, જેમ કે Android ડેવલપર. જો તમારા બાળક માટે વધારાની વેબ અને ઍપ પ્રવૃત્તિ સેટિંગ ચાલુ હોય, તો આ ડેટા તેમના Google એકાઉન્ટમાં સાચવવામાં આવી શકે છે. <ph name="BEGIN_LINK1" />વધુ જાણો<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">બ્લુસી</translation> +<translation id="8206859287963243715">સેલ્યુલર</translation> <translation id="8209677645716428427">નિરીક્ષણ કરેલ વપરાશકર્તા તમારા માર્ગદર્શન સાથે વેબનું અન્વેષણ કરી શકે છે. Chrome માં નિરીક્ષણ કરેલ વપરાશકર્તા તરીકે, તમે આ કરી શકો છો:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{ડાઉનલોડ ચાલુ છે}one{ડાઉનલોડ ચાલુ છે}other{ડાઉનલોડ ચાલુ છે}}</translation> <translation id="8213449224684199188">ફોટો મોડ પર સ્વિચ કર્યું</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 2ac2074..551d963 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -3403,7 +3403,7 @@ <translation id="6185132558746749656">डिवाइस स्थान</translation> <translation id="6195693561221576702">यह डिवाइस ऑफ़लाइन डेमो मोड में सेट अप नहीं किया जा सकता.</translation> <translation id="6196640612572343990">तीसरे पक्ष की कुकी ब्लॉक करें</translation> -<translation id="6196854373336333322">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह ऑनलाइन किए जाने वाले काम को बदल सकता है, रोक सकता है या उसे छिप कर सुन सकता है. अगर आप सुनिश्चित नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation> +<translation id="6196854373336333322">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह ऑनलाइन किए जाने वाले काम को बदल सकता है, रोक सकता है या उसे छिप कर सुन सकता है. अगर आप पक्का नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation> <translation id="6198102561359457428">साइन आउट करें और फिर से साइन इन करें...</translation> <translation id="6198252989419008588">पिन बदलें</translation> <translation id="6201792273624501289">Linux ऐप्लिकेशन</translation> @@ -4171,7 +4171,6 @@ <translation id="7364796246159120393">फ़ाइल चुनें</translation> <translation id="7366415735885268578">साइट जोड़ें</translation> <translation id="7366909168761621528">ब्राउज़िंग डेटा</translation> -<translation id="7367483872576694328">BLE स्कैन पार्सर सेवा</translation> <translation id="736877393389250337"><ph name="URL" /> <ph name="ALTERNATIVE_BROWSER_NAME" /> में नहीं खोला जा सकता है. कृपया अपने सिस्टम एडमिन से संपर्क करें.</translation> <translation id="7371006317849674875">शुरू करने का समय</translation> <translation id="7375053625150546623">EAP</translation> @@ -4746,6 +4745,7 @@ <translation id="8206354486702514201">इस सेटिंग को आपके व्यवस्थापक द्वारा लागू किया जाता है.</translation> <translation id="8206581664590136590">इस्तेमाल और निदान से जुड़ा डेटा भेजें. Google को निदान, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने आप भेजकर, अपने बच्चे के Android अनुभव को बेहतर बनाने में मदद करें. इसका इस्तेमाल आपके बच्चे की पहचान करने के लिए नहीं किया जाएगा. यह सिस्टम और ऐप्लिकेशन की स्थिरता और दूसरे सुधारों में मदद करेगा. कुछ एग्रीगेट डेटा Google ऐप्लिकेशन और पार्टनर, जैसे कि Android डेवलपरों की भी मदद करेगा. अगर आपके बच्चे के लिए दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है. <ph name="BEGIN_LINK1" />ज़्यादा जानें<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">ब्लुसी</translation> +<translation id="8206859287963243715">सेलुलर</translation> <translation id="8209677645716428427">'निगरानी में रखा गया उपयोगकर्ता' आपके दिशा-निर्देशों के साथ वेब को एक्सप्लोर कर सकता है. Chrome में 'निगरानी में रखे गए उपयोगकर्ता' के प्रबंधक के रूप में, आप यह कर सकते हैं:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{डाउनलोड जारी है}one{डाउनलोड जारी हैं}other{डाउनलोड जारी हैं}}</translation> <translation id="8213449224684199188">आप फ़ोटो मोड में हैं</translation> @@ -4833,7 +4833,7 @@ <translation id="8342861492835240085">कोई संग्रह चुनें</translation> <translation id="8343187330304787218"><ph name="DEVICE_TYPE" /> पर अपने प्लग इन वीएम चलाने के लिए सेटिंग प्रबंधित करें</translation> <translation id="8343956361364550006">सबसे बढ़िया वीडियो या ऐनिमेशन के लिए उच्च बैंडविड्थ का इस्तेमाल करें. हो सकता है कि धीमे कनेक्शन वाले अन्य लोगों को आपकी सामग्री दिखाई न दे.</translation> -<translation id="8351419472474436977">इस एक्सटेंशन ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह ऑनलाइन किए जाने वाले काम को बदल सकता है, खंडित कर सकता है या उसे छिप कर सुन सकता है. अगर आप सुनिश्चित नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation> +<translation id="8351419472474436977">इस एक्सटेंशन ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह ऑनलाइन किए जाने वाले काम को बदल सकता है, खंडित कर सकता है या उसे छिप कर सुन सकता है. अगर आप पक्का नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation> <translation id="835238322900896202">अनइंस्टॉल करते समय एक गड़बड़ी हुई. कृपया 'टर्मिनल' के ज़रिए अनइंस्टॉल करें.</translation> <translation id="8352772353338965963">एक से ज़्यादा साइन-इन के लिए कोई खाता जोड़ें. सभी साइन इन किए गए खातों को पासवर्ड के बिना एक्सेस किया जा सकता है, इसलिए इस सुविधा का इस्तेमाल सिर्फ़ विश्वसनीय खातों के साथ किया जाना चाहिए.</translation> <translation id="8353683614194668312">यह निम्न कर सकता है:</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 87d23e27..2d1ec22 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Odaberi datoteku</translation> <translation id="7366415735885268578">Dodavanje web-lokacije</translation> <translation id="7366909168761621528">Podaci o pregledavanju</translation> -<translation id="7367483872576694328">Usluga raščlanjivača za traženje BLE uređaja</translation> <translation id="736877393389250337">Otvaranje web-lokacije <ph name="URL" /> u pregledniku <ph name="ALTERNATIVE_BROWSER_NAME" /> nije uspjelo. Obratite se administratoru sustava.</translation> <translation id="7371006317849674875">Vrijeme početka</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">Ovu postavku nametnuo je vaš administrator.</translation> <translation id="8206581664590136590">Slanje podataka o upotrebi i dijagnostici. Pomognite poboljšati djetetov doživljaj Androida automatskim slanjem dijagnostičkih podataka i podataka o upotrebi uređaja i aplikacija Googleu. Ti se podaci neće upotrebljavati za identifikaciju vašeg djeteta, a pomoći će poboljšati sustav, stabilnost aplikacija i drugo. Neki skupni podaci pomoći će i Googleovim aplikacijama i partnerima, na primjer razvojnim programerima za Android. Ako je za vaše dijete uključena dodatna postavka Aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na djetetov Google račun. <ph name="BEGIN_LINK1" />Saznajte više<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesy</translation> +<translation id="8206859287963243715">Mobitel</translation> <translation id="8209677645716428427">Nadzirani korisnik može istraživati web uz vaše vodstvo. Kao upravitelj nadziranog korisnika na pregledniku Chrome možete:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Preuzimanje u tijeku}one{Preuzimanja u tijeku}few{Preuzimanja u tijeku}other{Preuzimanja u tijeku}}</translation> <translation id="8213449224684199188">Ušli ste u način fotografije</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 79abcc5e..7c59e5bf 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -4174,7 +4174,6 @@ <translation id="7364796246159120393">Fájl kiválasztása</translation> <translation id="7366415735885268578">Webhely hozzáadása</translation> <translation id="7366909168761621528">Böngészési adatok</translation> -<translation id="7367483872576694328">BLE-ellenőrzés elemzési szolgáltatása</translation> <translation id="736877393389250337">Nem sikerült a(z) <ph name="URL" /> webhely megnyitása a(z) <ph name="ALTERNATIVE_BROWSER_NAME" /> böngészőben. Forduljon a rendszergazdához.</translation> <translation id="7371006317849674875">Kezdés ideje</translation> <translation id="7375053625150546623">EAP</translation> @@ -4750,6 +4749,7 @@ <translation id="8206354486702514201">Ezt a beállítást rendszergazdája lépteti életbe.</translation> <translation id="8206581664590136590">Használati és diagnosztikai adatok küldése. Segítsen gyermeke Android-élményének továbbfejlesztésében azzal, hogy automatikusan diagnosztikai, valamint eszköz- és alkalmazáshasználati adatokat küld a Google-nak. Az adatok a rendszer- és alkalmazásstabilitás javításában, valamint más fejlesztésekben segítenek, nem használjuk fel őket az Ön gyermekének azonosítására. Bizonyos összesített adatok a Google-alkalmazásoknak és -partnereknek, például az Android-fejlesztőknek is segítenek. Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva a gyermekénél, akkor a rendszer ezeket az adatokat mentheti a gyermek Google-fiókjába. <ph name="BEGIN_LINK1" />További információ.<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Énekes</translation> +<translation id="8206859287963243715">Mobil</translation> <translation id="8209677645716428427">A felügyelt felhasználó az Ön engedélyei szerint böngészhet az interneten. A Chrome felügyelt felhasználójának feletteseként Ön a következőket teheti:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Letöltés folyamatban}other{Letöltések folyamatban}}</translation> <translation id="8213449224684199188">Fotó mód bekapcsolva</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 32b531f..88fd8f2e 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -4170,7 +4170,6 @@ <translation id="7364796246159120393">Pilih File</translation> <translation id="7366415735885268578">Tambahkan situs</translation> <translation id="7366909168761621528">Data browsing</translation> -<translation id="7367483872576694328">Layanan Parser Pemindaian BLE</translation> <translation id="736877393389250337"><ph name="URL" /> tidak dapat dibuka di <ph name="ALTERNATIVE_BROWSER_NAME" />. Harap hubungi administrator sistem Anda.</translation> <translation id="7371006317849674875">Waktu mulai</translation> <translation id="7375053625150546623">EAP</translation> @@ -4746,6 +4745,7 @@ <translation id="8206354486702514201">Setelan ini diberlakukan oleh administrator Anda.</translation> <translation id="8206581664590136590">Kirim data penggunaan dan diagnostik. Bantu sempurnakan pengalaman Android Anak Anda dengan otomatis mengirim data diagnostik, perangkat, dan penggunaan aplikasi ke Google. Data ini tidak akan digunakan untuk mengidentifikasi anak Anda serta akan membantu sistem dan stabilitas aplikasi serta penyempurnaan lainnya. Beberapa data gabungan juga akan membantu aplikasi dan partner Google, seperti developer Android. Jika setelan Aktivitas Web & Aplikasi tambahan diaktifkan untuk anak Anda, data ini mungkin akan disimpan ke Akun Google miliknya. <ph name="BEGIN_LINK1" />Pelajari Lebih Lanjut<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Jazzy</translation> +<translation id="8206859287963243715">Seluler</translation> <translation id="8209677645716428427">Pengguna yang diawasi dapat menjelajah web dengan panduan Anda. Sebagai pengelola pengguna yang dilindungi di Chrome, Anda dapat:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Proses download sedang berlangsung}other{Proses download sedang berlangsung}}</translation> <translation id="8213449224684199188">Masuk ke mode foto</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 8b2e874d..ad2d34a 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -4168,7 +4168,6 @@ <translation id="7364796246159120393">Scegli file</translation> <translation id="7366415735885268578">Aggiunta di un sito</translation> <translation id="7366909168761621528">Dati di navigazione</translation> -<translation id="7367483872576694328">Servizio di analisi di scansione BLE</translation> <translation id="736877393389250337">Impossibile aprire <ph name="URL" /> in <ph name="ALTERNATIVE_BROWSER_NAME" />. Contatta l'amministratore di sistema.</translation> <translation id="7371006317849674875">Ora di inizio</translation> <translation id="7375053625150546623">EAP</translation> @@ -4741,6 +4740,7 @@ <translation id="8206354486702514201">Questa impostazione è stata applicata dall'amministratore.</translation> <translation id="8206581664590136590">Invia dati diagnostici e sull'utilizzo. Contribuisci a migliorare l'esperienza Android di tuo figlio tramite l'invio automatico a Google di dati diagnostici e sull'utilizzo delle app e del dispositivo. Non verranno utilizzati per identificare tuo figlio e contribuiranno alla stabilità di app e sistema, nonché ad altri miglioramenti. Alcuni dati aggregati saranno utili anche alle app e ai partner di Google, ad esempio agli sviluppatori Android. Se l'impostazione Attività web e app aggiuntiva è attiva per tuo figlio, questi dati potrebbero essere salvati nel suo Account Google. <ph name="BEGIN_LINK1" />Ulteriori informazioni<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesy</translation> +<translation id="8206859287963243715">Cellulare</translation> <translation id="8209677645716428427">Un utente supervisionato può navigare sul Web sotto la tua guida. In qualità di gestore di un utente supervisionato in Chome, puoi:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Download in corso}other{Download in corso}}</translation> <translation id="8213449224684199188">Modalità foto attivata</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index ff269c8a..ba70ad2 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -4169,7 +4169,6 @@ <translation id="7364796246159120393">בחירת קובץ</translation> <translation id="7366415735885268578">הוספת אתר</translation> <translation id="7366909168761621528">נתוני גלישה</translation> -<translation id="7367483872576694328">שירות מנתח של סריקת BLE</translation> <translation id="736877393389250337">לא ניתן היה לפתוח את <ph name="URL" /> ב-<ph name="ALTERNATIVE_BROWSER_NAME" />. יש לפנות אל מנהל המערכת.</translation> <translation id="7371006317849674875">שעת התחלה</translation> <translation id="7375053625150546623">EAP</translation> @@ -4744,6 +4743,7 @@ <translation id="8206354486702514201">הגדרה זו נאכפת על ידי מנהל המערכת שלך.</translation> <translation id="8206581664590136590">שליחה של נתוני אבחון ונתונים על השימוש. אפשר לעזור בשיפור החוויה של הילד/ה שלך ב-Android. לשם כך יש לשלוח אל Google באופן אוטומטי נתוני אבחון ונתונים לגבי השימוש במכשיר ובאפליקציות. נתונים אלה לא ישמשו כדי לזהות את הילד/ה שלך, והם יעזרו לשמור על יציבות המערכת והאפליקציות, כמו גם לביצוע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לאפליקציות ולשותפים של Google, כמו מפתחי Android. אם הופעלה בשביל הילד/ה שלך האפשרות 'פעילות באתרי אינטרנט ובאפליקציות נוספים', ייתכן שהנתונים יישמרו בחשבון Google שלו/ה. <ph name="BEGIN_LINK1" />מידע נוסף<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">בלוז</translation> +<translation id="8206859287963243715">סלולארי</translation> <translation id="8209677645716428427">משתמש בפיקוח יכול לסייר באינטרנט בהדרכתך. כמנהל של משתמש בפיקוח ב-Chrome, אתה יכול:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{הורדה מתבצעת}two{הורדות מתבצעות}many{הורדות מתבצעות}other{הורדות מתבצעות}}</translation> <translation id="8213449224684199188">עברת למצב תמונות</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index eeeef80..c8359db2 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">ファイルを選択</translation> <translation id="7366415735885268578">サイトの追加</translation> <translation id="7366909168761621528">閲覧履歴データ</translation> -<translation id="7367483872576694328">BLE スキャン パーサー サービス</translation> <translation id="736877393389250337"><ph name="URL" /> を <ph name="ALTERNATIVE_BROWSER_NAME" /> で開けませんでした。システム管理者にお問い合わせください。</translation> <translation id="7371006317849674875">開始時間</translation> <translation id="7375053625150546623">EAP</translation> @@ -4749,6 +4748,7 @@ <translation id="8206354486702514201">この設定は管理者によって制御されています。</translation> <translation id="8206581664590136590">使用状況データや診断データを送信します。診断データやデバイスとアプリの使用状況データを Google に自動送信して、お子様向けの Android 機能の向上にご協力ください。この情報を使ってお子様個人が特定されることはありません。この情報は、システムとアプリの安定性の向上やその他の機能の改善に役立てられます。また、Google のアプリやパートナー(Android デベロッパーなど)も、集計データとしてこの情報を活用します。お子様の [その他のウェブとアプリのアクティビティ] の設定がオンになっている場合、このデータはお子様の Google アカウントに保存されます。<ph name="BEGIN_LINK1" />詳細<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">ブルース</translation> +<translation id="8206859287963243715">携帯電話</translation> <translation id="8209677645716428427">監視対象ユーザーは、あなたの案内に従ってウェブにアクセスできます。Chrome の監視対象ユーザーの管理者として、あなたができることは次のとおりです。</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{ダウンロードが進行中です}other{ダウンロードが進行中です}}</translation> <translation id="8213449224684199188">写真モードに切り替えました</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index c6bd7556..d2371fb 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -4176,7 +4176,6 @@ <translation id="7364796246159120393">ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="7366415735885268578">ಸೈಟ್ ಸೇರಿಸಿ</translation> <translation id="7366909168761621528">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾ</translation> -<translation id="7367483872576694328">BLE ಸ್ಕ್ಯಾನ್ ವಿಶ್ಲೇಷಕ ಸೇವೆ</translation> <translation id="736877393389250337"><ph name="URL" /> ಅನ್ನು <ph name="ALTERNATIVE_BROWSER_NAME" /> ನಲ್ಲಿ ತೆರೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> <translation id="7371006317849674875">ಪ್ರಾರಂಭ ಸಮಯ</translation> <translation id="7375053625150546623">EAP</translation> @@ -4749,6 +4748,7 @@ <translation id="8206354486702514201">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಜಾರಿಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="8206581664590136590">ಬಳಕೆ ಮತ್ತು ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಿ. ಡಯಾಗ್ನಾಸ್ಟಿಕ್, ಸಾಧನ, ಹಾಗೂ ಆ್ಯಪ್ ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಮಗುವಿನ Android ಅನುಭವವನ್ನು ಉತ್ತಮಗೊಳಿಸುವುದಕ್ಕೆ ಸಹಾಯ ಮಾಡಿ. ಈ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಮಗುವನ್ನು ಗುರುತಿಸುವುದಕ್ಕೆ ಬಳಸುವುದಿಲ್ಲ, ಹಾಗೂ ಇದು ಸಿಸ್ಟಮ್ ಮತ್ತು ಆ್ಯಪ್ ಸ್ಥಿರತೆಗೆ, ಹಾಗೂ ಇತರ ಸುಧಾರಣೆಗಳಿಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಕೆಲವು ಒಟ್ಟುಗೂಡಿಸಿದ ಡೇಟಾವು, Google ಆ್ಯಪ್ಗಳಿಗೆ ಮತ್ತು ಪಾಲುದಾರರಿಗೂ ಸಹ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, Android ಡೆವಲಪರ್ಗಳು. ನಿಮ್ಮ ಮಗುವಿಗಾಗಿ ಹೆಚ್ಚುವರಿ ವೆಬ್ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆನ್ ಮಾಡಿದ್ದಲ್ಲಿ, ಈ ಡೇಟಾವು ಅವರ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲ್ಪಡಬಹುದು. <ph name="BEGIN_LINK1" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">ಬ್ಲೂಸಿ</translation> +<translation id="8206859287963243715">ಸೆಲ್ಯುಲಾರ್</translation> <translation id="8209677645716428427">ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರು ನಿಮ್ಮ ಮಾರ್ಗದರ್ಶನದೊಂದಿಗೆ ವೆಬ್ ಅನ್ನು ಎಕ್ಸ್ಪ್ಲೋರ್ ಮಾಡಬಹುದು. Chrome ನಲ್ಲಿ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರ ನಿರ್ವಾಹಕರಾಗಿ, ನೀವು ಈ ಎಲ್ಲವನ್ನೂ ಮಾಡಬಹುದು:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{ಡೌನ್ಲೋಡ್ ಪ್ರಗತಿಯಲ್ಲಿದೆ}one{ಡೌನ್ಲೋಡ್ಗಳು ಪ್ರಗತಿಯಲ್ಲಿವೆ}other{ಡೌನ್ಲೋಡ್ಗಳು ಪ್ರಗತಿಯಲ್ಲಿವೆ}}</translation> <translation id="8213449224684199188">ಫೋಟೋ ಮೋಡ್ ನಮೂದಿಸಲಾಗಿದೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 97bd1f32..d08ac6d 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -4170,7 +4170,6 @@ <translation id="7364796246159120393">파일 선택</translation> <translation id="7366415735885268578">사이트 추가</translation> <translation id="7366909168761621528">인터넷 사용정보</translation> -<translation id="7367483872576694328">BLE 검사 파서 서비스</translation> <translation id="736877393389250337"><ph name="ALTERNATIVE_BROWSER_NAME" />에서 <ph name="URL" /> 페이지를 열 수 없습니다. 시스템 관리자에게 문의하세요.</translation> <translation id="7371006317849674875">시작 시간</translation> <translation id="7375053625150546623">EAP</translation> @@ -4746,6 +4745,7 @@ <translation id="8206354486702514201">이 설정은 관리자가 강제로 설정해 놓았습니다.</translation> <translation id="8206581664590136590">사용 및 진단 데이터를 보냅니다. 진단, 기기, 앱 사용 데이터를 Google에 자동으로 보내 자녀의 Android 사용 환경 개선에 참여합니다. 이 데이터는 자녀를 식별하는 용도로 사용되지 않으며, 시스템 및 앱 안정성 등을 개선하는 데 활용됩니다. 일부 수집 데이터는 Google 앱과 파트너(Android 개발자 등)에게도 도움을 줍니다. 자녀의 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 자녀의 Google 계정에 저장될 수 있습니다. <ph name="BEGIN_LINK1" />자세히 알아보기<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">음악</translation> +<translation id="8206859287963243715">휴대전화</translation> <translation id="8209677645716428427">관리 대상 사용자는 내가 정한 범위 내에서 웹을 탐색할 수 있습니다. 관리 대상 사용자의 관리자는 Chrome에서 다음을 수행할 수 있습니다.</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{다운로드 진행 중}other{다운로드 진행 중}}</translation> <translation id="8213449224684199188">사진 모드 시작됨</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index e667498..ce71117 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -4173,7 +4173,6 @@ <translation id="7364796246159120393">Pasirinkti failą</translation> <translation id="7366415735885268578">Svetainės pridėjimas</translation> <translation id="7366909168761621528">Naršymo duomenys</translation> -<translation id="7367483872576694328">BLE nuskaitymo analizavimo įrankio paslauga</translation> <translation id="736877393389250337">Nepavyko atidaryti <ph name="URL" /> naršyklėje „<ph name="ALTERNATIVE_BROWSER_NAME" />“. Susisiekite su sistemos administratoriumi.</translation> <translation id="7371006317849674875">Pradžios laikas</translation> <translation id="7375053625150546623">EAP</translation> @@ -4749,6 +4748,7 @@ <translation id="8206354486702514201">Šį nustatymą vykdo jūsų administratorius.</translation> <translation id="8206581664590136590">Siųskite naudojimo ir diagnostikos duomenis. Padėkite tobulinti vaiko „Android“ funkcijas automatiškai siųsdami „Google“ diagnostikos, įrenginio ir programų naudojimo duomenis. Tai nebus naudojama siekiant nustatyti jūsų vaiko tapatybę ir padės pagerinti sistemos bei programos stabilumą ir teikti kitus patobulinimus. Kai kurie sukaupti duomenys taip pat bus naudingi „Google“ programoms ir partneriams, pvz., „Android“ kūrėjams. Jei papildomas „Žiniatinklio ir programų veiklos“ nustatymas įjungtas vaiko įrenginyje, šie duomenys gali būti išsaugoti vaiko „Google“ paskyroje. <ph name="BEGIN_LINK1" />Sužinokite daugiau<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bliuzas</translation> +<translation id="8206859287963243715">Mobilusis</translation> <translation id="8209677645716428427">Prižiūrimas naudotojas gali naršyti žiniatinklį jums prižiūrint. Kaip prižiūrimo naudotojo valdytojas „Chrome“, jūs galite:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Vykdomas atsisiuntimas}one{Vykdomi atsisiuntimai}few{Vykdomi atsisiuntimai}many{Vykdomi atsisiuntimai}other{Vykdomi atsisiuntimai}}</translation> <translation id="8213449224684199188">Įjungtas nuotraukų režimas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index a342953..94f0ed14 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Izvēlēties failu</translation> <translation id="7366415735885268578">Vietnes pievienošana</translation> <translation id="7366909168761621528">Pārlūkošanas dati</translation> -<translation id="7367483872576694328">BLE skenēšanas parsētāja pakalpojums</translation> <translation id="736877393389250337">Nevarēja atvērti vietni <ph name="URL" /> pārlūkprogrammā <ph name="ALTERNATIVE_BROWSER_NAME" />. Lūdzu, sazinieties ar sistēmas administratoru.</translation> <translation id="7371006317849674875">Sākuma laiks</translation> <translation id="7375053625150546623">EAP</translation> @@ -4747,6 +4746,7 @@ <translation id="8206354486702514201">Šo iestatījumu ievieš jūsu administrators.</translation> <translation id="8206581664590136590">Lietojuma un diagnostikas datu sūtīšana. Palīdziet uzlabot bērna Android lietošanas pieredzi, automātiski nosūtot diagnostikas, ierīces un lietotņu lietojuma datus uzņēmumam Google. Šī informācija netiks izmantota jūsu bērna identificēšanai, un tā palīdzēs uzlabot sistēmas un lietotņu stabilitāti un daudz ko citu. Noteiktus apkopotus datus izmantos arī Google lietotņu izstrādātāji un partneri, piemēram, Android izstrādātāji. Ja jūsu bērnam ir ieslēgts papildu iestatījums “Darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti bērna Google kontā. <ph name="BEGIN_LINK1" />Uzzināt vairāk<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Blūzs</translation> +<translation id="8206859287963243715">Mobilais tālrunis</translation> <translation id="8209677645716428427">Uzraudzīts lietotājs var pārlūkot tīmekli ar jūsu palīdzību. Kā uzraudzīta lietotāja pārzinis pārlūkā Chrome jūs varat:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Notiek lejupielāde}zero{Notiek lejupielāde}one{Notiek lejupielāde}other{Notiek lejupielāde}}</translation> <translation id="8213449224684199188">Ievadīts foto režīms</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 1ae2c0b..474d1c7 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1611,7 +1611,7 @@ <translation id="3450157232394774192">നിഷ്ക്രിയ നില ഒക്യുപ്പൻസി ശതമാനം</translation> <translation id="3453612417627951340">അംഗീകാരം ആവശ്യമാണ്</translation> <translation id="3454157711543303649">സജീവമാക്കല് പൂര്ത്തിയായി</translation> -<translation id="3454213325559396544">ഈ <ph name="DEVICE_TYPE" />-ന് സ്വയമേവയുള്ള അവസാനത്തെ സോഫ്റ്റ്വെയർ, സുരക്ഷാ അപ്ഡേറ്റ് ആണിത്. 2ഭാവി അപ്ഡേറ്റുകൾ ലഭിക്കാൻ പുതിയൊരു മോഡലിലേക്ക് അപ്ഗ്രേഡ് ചെയ്യൂ.</translation> +<translation id="3454213325559396544">ഈ <ph name="DEVICE_TYPE" />-ന് സ്വയമേവയുള്ള അവസാനത്തെ സോഫ്റ്റ്വെയർ, സുരക്ഷാ അപ്ഡേറ്റ് ആണിത്. ഭാവി അപ്ഡേറ്റുകൾ ലഭിക്കാൻ പുതിയൊരു മോഡലിലേക്ക് അപ്ഗ്രേഡ് ചെയ്യൂ.</translation> <translation id="345693547134384690">പുതിയ ടാബിൽ ചിത്രം തുറക്കുക</translation> <translation id="3457500881955698515">നിങ്ങളുടെ കമ്പനിയോ ഓർഗനൈസേഷനോ ഇപ്പോൾ ഈ ഉപകരണത്തിൽ ഒരു അപ്ഡേറ്റ് നടത്താൻ ആവശ്യപ്പെടുന്നു</translation> <translation id="3459509316159669723">പ്രിന്റിംഗ്</translation> @@ -4170,7 +4170,6 @@ <translation id="7364796246159120393">ഫയല് തിരഞ്ഞെടുക്കൂ</translation> <translation id="7366415735885268578">ഒരു സൈറ്റ് ചേർക്കുക</translation> <translation id="7366909168761621528">ഡാറ്റ ബ്രൌസ് ചെയ്യുന്നു</translation> -<translation id="7367483872576694328">BLE സ്കാൻ പാർസർ സേവനം</translation> <translation id="736877393389250337"><ph name="URL" />, <ph name="ALTERNATIVE_BROWSER_NAME" />-ൽ തുറക്കാനായില്ല. നിങ്ങളുടെ സിസ്റ്റം അഡ്മിനെ ബന്ധപ്പെടുക.</translation> <translation id="7371006317849674875">ആരംഭിക്കുന്ന സമയം</translation> <translation id="7375053625150546623">EAP</translation> @@ -4746,6 +4745,7 @@ <translation id="8206354486702514201">ഈ ക്രമീകരണം നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ നടപ്പിലാക്കിയതാണ്.</translation> <translation id="8206581664590136590">ഉപയോഗവും പ്രശ്നനിർണ്ണയവുമായി ബന്ധപ്പെട്ട ഡാറ്റ അയയ്ക്കുക. പ്രശ്നനിർണ്ണയം, ഉപകരണം, ആപ്പ് ഉപയോഗം എന്നിവയുമായി ബന്ധപ്പെട്ട ഡാറ്റ സ്വയമേവ Google-ന് അയച്ച്, കുട്ടിയുടെ Android അനുഭവം മെച്ചപ്പെടുത്താൻ സഹായിക്കുക. കുട്ടിയെ തിരിച്ചറിയാൻ ഇത് ഉപയോഗിക്കില്ല, സിസ്റ്റം, ആപ്പ് സ്ഥിരത, മറ്റ് മെച്ചപ്പെടുത്തൽ എന്നിവയ്ക്ക് സഹായിക്കുകയും ചെയ്യും. ചില സംഗ്രഹ ഡാറ്റ, Google ആപ്പുകളെയും Android ഡെവലപ്പർമാരെപ്പോലുള്ള പങ്കാളികളെയും സഹായിക്കുകയും ചെയ്യും. കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. <ph name="BEGIN_LINK1" />കൂടുതലറിയുക<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">ബ്ലൂസി</translation> +<translation id="8206859287963243715">സെല്ലുലാര്</translation> <translation id="8209677645716428427">മേൽനോട്ടത്തിലുള്ള ഉപയോക്താവിന് നിങ്ങളുടെ മാർഗനിർദ്ദേശം ഉപയോഗിച്ച് വെബ് പര്യവേക്ഷണം ചെയ്യാനാകും. Chrome-ലെ മേൽനോട്ടത്തിലുള്ള മാനേജരെന്ന നിലയിൽ നിങ്ങൾക്ക് ഇനിപ്പറയുന്നത് ചെയ്യാനാകും:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{ഡൗൺലോഡ് പുരോഗമിക്കുന്നു}other{ഡൗൺലോഡുകൾ പുരോഗമിക്കുന്നു}}</translation> <translation id="8213449224684199188">ഫോട്ടോ മോഡിലേക്ക് പ്രവേശിച്ചു</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 8b44451..f6cd21f1 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">फाइल निवडा</translation> <translation id="7366415735885268578">एक साइट जोडा</translation> <translation id="7366909168761621528">ब्राउझिंग डेटा</translation> -<translation id="7367483872576694328">BLE स्कॅन पार्सर सेवा</translation> <translation id="736877393389250337"><ph name="ALTERNATIVE_BROWSER_NAME" /> मध्ये <ph name="URL" /> उघडता आली नाही. कृपया तुमच्या सिस्टम अॅडमिनिस्ट्रेटरशी संपर्क साधा.</translation> <translation id="7371006317849674875">सुरू होण्याची वेळ</translation> <translation id="7375053625150546623">EAP</translation> @@ -4746,6 +4745,7 @@ <translation id="8206354486702514201">या सेटिंगची अंमलबजावणी तुमच्या अॅडमिनिस्ट्रेटरकडून होते.</translation> <translation id="8206581664590136590">वापर आणि निदान डेटा पाठवा. Google ला आपोआप निदान आणि डिव्हाइस आणि अॅप वापर डेटा पाठवून तुमच्या लहान मुलाचा Android अनुभव सुधारण्यात मदत करा. हे तुमच्या लहान मुलाला ओळखण्यासाठी वापरले जाणार नाही आणि सिस्ट्म आणि अॅप स्थिरता आणि इतर सुधारणा करण्यात मदत करेल. काही एकत्रित केलेला डेटा Google अॅप्स आणि Android डेव्हलपर सारख्या भागीदारांना देखील मदत करेल. तुमच्या लहान मुलासाठी अतिरिक्त वेब आणि अॅप अॅक्टिव्हिटी सुरू केलेली असल्यास, ही माहिती त्याच्या Google खात्यामध्ये स्टोअर केली जाऊ शकते. <ph name="BEGIN_LINK1" />अधिक जाणून घ्या<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesy</translation> +<translation id="8206859287963243715">सेल्यूलर</translation> <translation id="8209677645716428427">एक पर्यवेक्षित वापरकर्ता तुमच्या मार्गदर्शनाने वेब एक्सप्लोर करू शकतो. Chrome मधील पर्यवेक्षित वापरकर्त्याचा व्यवस्थापक म्हणून, तुम्ही हे करू शकता:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{डाउनलोड सुरू आहे}other{डाउनलोड सुरू आहेत}}</translation> <translation id="8213449224684199188">फोटो मोड टाकला</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 068498fa..f0a9cc8c 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -4173,7 +4173,6 @@ <translation id="7364796246159120393">Pilih Fail</translation> <translation id="7366415735885268578">Tambahkan tapak</translation> <translation id="7366909168761621528">Data penyemakan imbas</translation> -<translation id="7367483872576694328">Perkhidmatan Penghurai Imbasan BLE</translation> <translation id="736877393389250337"><ph name="URL" /> tidak dapat dibuka dalam <ph name="ALTERNATIVE_BROWSER_NAME" />. Sila hubungi pentadbir sistem anda.</translation> <translation id="7371006317849674875">Masa mula</translation> <translation id="7375053625150546623">EAP</translation> @@ -4749,6 +4748,7 @@ <translation id="8206354486702514201">Tetapan ini dikuatkuasakan oleh pentadbir anda.</translation> <translation id="8206581664590136590">Hantar data penggunaan dan diagnostik. Bantu kami meningkatkan pengalaman Android anak anda dengan menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini tidak akan digunakan untuk mengenal pasti anak anda dan akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. Jika tetapan Aktiviti Web & Apl tambahan dihidupkan untuk anak anda, data ini mungkin disimpan ke Akaun Googlenya. <ph name="BEGIN_LINK1" />Ketahui Lebih Lanjut<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Sayu</translation> +<translation id="8206859287963243715">Selular</translation> <translation id="8209677645716428427">Pengguna diselia boleh meneroka web dengan bimbingan anda. Sebagai pengurus pengguna diselia dalam Chrome, anda boleh:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Muat turun sedang berlangsung}other{Muat turun sedang berlangsung}}</translation> <translation id="8213449224684199188">Mod foto dimasukkan</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 108d235d..64b1e20 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Bestand kiezen</translation> <translation id="7366415735885268578">Een site toevoegen</translation> <translation id="7366909168761621528">Browsegegevens</translation> -<translation id="7367483872576694328">Parserservice voor BLE-scans</translation> <translation id="736877393389250337"><ph name="URL" /> kan niet worden geopend in <ph name="ALTERNATIVE_BROWSER_NAME" />. Neem contact op met je systeembeheerder.</translation> <translation id="7371006317849674875">Starttijd</translation> <translation id="7375053625150546623">EAP</translation> @@ -4747,6 +4746,7 @@ <translation id="8206354486702514201">Deze instelling wordt door je beheerder afgedwongen.</translation> <translation id="8206581664590136590">Verzend gebruiks- en diagnostische gegevens. Verbeter de Android-functionaliteit voor je kind door automatisch diagnostische, apparaat- en app-gebruiksgegevens naar Google te verzenden. Deze gegevens worden niet gebruikt om je kind te identificeren en kunnen helpen om de systeem- en app-stabiliteit te verbeteren en andere optimalisaties mogelijk te maken. Daarnaast zijn bepaalde verzamelde gegevens nuttig voor Google-apps en -partners, zoals Android-ontwikkelaars. Als je de instelling voor aanvullende Web- en app-activiteit hebt ingeschakeld voor je kind, kunnen deze gegevens worden opgeslagen in het Google-account van je kind. <ph name="BEGIN_LINK1" />Meer informatie<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesy</translation> +<translation id="8206859287963243715">Mobiel</translation> <translation id="8209677645716428427">Een gebruiker met beperkte rechten kan internet verkennen onder je toezicht. Als beheerder van een gebruiker met beperkte rechten in Chrome, kun je:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Download wordt uitgevoerd}other{Downloads worden uitgevoerd}}</translation> <translation id="8213449224684199188">Fotomodus geopend</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index c0efa91..3c41ec5 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -533,7 +533,7 @@ <translation id="1799071797295057738">Utvidelsen «<ph name="EXTENSION_NAME" />» ble slått av automatisk.</translation> <translation id="1802687198411089702">Siden svarer ikke. Du kan vente på den eller avslutte.</translation> <translation id="1802931390041703523">Flash ble blokkert på denne siden</translation> -<translation id="1803531841600994172">Språket det skal oversettes til</translation> +<translation id="1803531841600994172">Språket du vil oversette til</translation> <translation id="1803545009660609783">Lær opp på nytt</translation> <translation id="1805472176602625930">Trykk på knappen på sikkerhetsnøkkelen</translation> <translation id="1805738995123446102">En fane i bakgrunnen bruker mikrofonen din</translation> @@ -2345,7 +2345,7 @@ <translation id="4562155214028662640">Legg til fingeravtrykk</translation> <translation id="4563880231729913339">Finger 3</translation> <translation id="4565377596337484307">Skjul passord</translation> -<translation id="456717285308019641">Sidespråket som skal oversettes</translation> +<translation id="456717285308019641">Sidespråket du vil oversette</translation> <translation id="4567772783389002344">Legg til ord</translation> <translation id="4568025708905928793">En sikkerhetsnøkkel blir forespurt</translation> <translation id="4568213207643490790">Beklager, men Google-kontoer er ikke tillatt på denne enheten.</translation> @@ -2907,7 +2907,7 @@ <translation id="5449716055534515760">Lukk vin&du</translation> <translation id="5453630479789469584">Kunne ikke sette opp VM for programtillegg</translation> <translation id="5454166040603940656">med <ph name="PROVIDER" /></translation> -<translation id="545426320101607695">Språket det skal oversettes til</translation> +<translation id="545426320101607695">Språket du vil oversette til</translation> <translation id="5457113250005438886">Ugyldig</translation> <translation id="5457459357461771897">lese og slette bilder, musikk og andre medier fra datamaskinen din</translation> <translation id="5457599981699367932">Surf som gjest</translation> @@ -4165,7 +4165,6 @@ <translation id="7364796246159120393">Velg fil</translation> <translation id="7366415735885268578">Legg til et nettsted</translation> <translation id="7366909168761621528">Nettleserdata</translation> -<translation id="7367483872576694328">Parsertjeneste for BLE-gjennomsøking</translation> <translation id="736877393389250337">Kunne ikke åpne <ph name="URL" /> i <ph name="ALTERNATIVE_BROWSER_NAME" />. Kontakt systemadministratoren din.</translation> <translation id="7371006317849674875">Starttid</translation> <translation id="7375053625150546623">EAP</translation> @@ -4739,6 +4738,7 @@ <translation id="8206354486702514201">Denne innstillingen håndheves av administratoren din.</translation> <translation id="8206581664590136590">Send bruks- og diagnostikkdata. Hjelp til med å gjøre Android-opplevelsen bedre for barnet ditt ved å sende diagnostikk-, enhets- og appbruksdata til Google automatisk. Disse dataene brukes ikke til å identifisere barnet ditt, men bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Hvis du har slått på innstillingen for annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Plystre</translation> +<translation id="8206859287963243715">Mobil</translation> <translation id="8209677645716428427">En administrert bruker kan utforske nettet med veiledning fra deg. Som administrator for en administrert bruker i Chrome kan du:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Nedlasting pågår}other{Nedlastinger pågår}}</translation> <translation id="8213449224684199188">Fotomodus er aktivert</translation> @@ -4747,7 +4747,7 @@ <translation id="8214489666383623925">Åpne fil</translation> <translation id="8214962590150211830">Fjern denne personen</translation> <translation id="8217399928341212914">Fortsett blokkeringen av automatisk nedlasting av flere filer</translation> -<translation id="822519928942492333">Sidespråket som skal oversettes</translation> +<translation id="822519928942492333">Sidespråket du vil oversette</translation> <translation id="8225265270453771718">Del et programvindu</translation> <translation id="8225753906568652947">Løs inn tilbudene dine</translation> <translation id="8226222018808695353">Forbudt</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 70eacf5..f5598eb 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Wybierz plik</translation> <translation id="7366415735885268578">Dodawanie strony</translation> <translation id="7366909168761621528">Dane przeglądania</translation> -<translation id="7367483872576694328">Usługa parsera skanowania BLE</translation> <translation id="736877393389250337">Nie udało się otworzyć strony <ph name="URL" /> w przeglądarce <ph name="ALTERNATIVE_BROWSER_NAME" />. Skontaktuj się z administratorem systemu.</translation> <translation id="7371006317849674875">Godzina rozpoczęcia</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">O tym ustawieniu decyduje administrator.</translation> <translation id="8206581664590136590">Wysyłaj dane diagnostyczne oraz informacje o użyciu. Pomóż ulepszyć działanie Androida na urządzeniu dziecka, automatycznie wysyłając do Google dane diagnostyczne oraz informacje o używaniu urządzenia i aplikacji. Nie zostaną one użyte do zidentyfikowania Twojego dziecka. Wykorzystamy je, by poprawić stabilność systemu i aplikacji oraz wprowadzić inne ulepszenia. Niektóre dane zbiorcze pomogą nam też udoskonalić aplikacje Google lub zostaną wykorzystane przez naszych partnerów, na przykład deweloperów aplikacji na Androida. Jeśli na koncie Google dziecka włączysz ustawienie Dodatkowa aktywność w internecie i aplikacjach, te dane mogą być zapisywane na tym koncie. <ph name="BEGIN_LINK1" />Więcej informacji<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesowy</translation> +<translation id="8206859287963243715">Komórka</translation> <translation id="8209677645716428427">Użytkownik nadzorowany może przeglądać internet zgodnie z Twoimi wytycznymi. Jako jego menedżer w Chrome możesz:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Trwa pobieranie pliku}few{Trwa pobieranie plików}many{Trwa pobieranie plików}other{Trwa pobieranie plików}}</translation> <translation id="8213449224684199188">Włączono tryb fotografowania</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 2aaa7e4..a051345 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -4174,7 +4174,6 @@ <translation id="7364796246159120393">Escolher arquivo</translation> <translation id="7366415735885268578">Adicionar um site</translation> <translation id="7366909168761621528">Dados de navegação</translation> -<translation id="7367483872576694328">Serviço de analisador de verificação de BLE</translation> <translation id="736877393389250337">Não foi possível abrir <ph name="URL" /> no <ph name="ALTERNATIVE_BROWSER_NAME" />. Entre em contato com o administrador do sistema.</translation> <translation id="7371006317849674875">Horário de início</translation> <translation id="7375053625150546623">EAP</translation> @@ -4750,6 +4749,7 @@ <translation id="8206354486702514201">Esta configuração é aplicada por seu administrador.</translation> <translation id="8206581664590136590">Envie dados de uso e diagnóstico. Ajude a melhorar a experiência do seu filho com o Android enviando automaticamente ao Google dados de diagnóstico, de uso de apps e do dispositivo. Eles não serão usados para identificar seu filho e ajudarão a melhorar o sistema, a estabilidade de apps e muito mais. Alguns dados agregados também ajudarão os apps do Google e os nossos parceiros, como os desenvolvedores Android. Se a configuração "Atividade na Web e de apps adicional" estiver ativada para seu filho, esses dados poderão ser salvos na Conta do Google dele. <ph name="BEGIN_LINK1" />Saiba mais<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Chorinho</translation> +<translation id="8206859287963243715">Celular</translation> <translation id="8209677645716428427">Um usuário supervisionado pode explorar a Web sob sua orientação. Como gerente de um usuário supervisionado no Google Chrome, você pode:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{O download está em andamento}one{O download está em andamento}other{Os downloads estão em andamento}}</translation> <translation id="8213449224684199188">Alterado para o modo de foto</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 78ae3fe..3ccbcef 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -4173,7 +4173,6 @@ <translation id="7364796246159120393">Escolher ficheiro</translation> <translation id="7366415735885268578">Adicionar um site</translation> <translation id="7366909168761621528">Dados de navegação</translation> -<translation id="7367483872576694328">Serviço do analisador de procura por BLE</translation> <translation id="736877393389250337">Não foi possível abrir <ph name="URL" /> no <ph name="ALTERNATIVE_BROWSER_NAME" />. Contacte o administrador do sistema.</translation> <translation id="7371006317849674875">Hora de início</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">Esta definição é aplicada pelo gestor.</translation> <translation id="8206581664590136590">Envie dados de utilização e diagnóstico. Ajude a melhorar a experiência Android da criança ao enviar automaticamente dados de diagnóstico, de utilização de aplicações e do dispositivo para a Google. Estes dados não serão utilizados para identificar a criança e ajudarão a melhorar a estabilidade das aplicações e do sistema, entre outras melhorias. Alguns dados agregados também ajudarão as aplicações e os parceiros Google, como os programadores Android. Se a definição Atividade da Web e de aplicações adicional estiver ativada para a criança, estes dados podem ser guardados na respetiva Conta Google. <ph name="BEGIN_LINK1" />Saiba mais<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesy</translation> +<translation id="8206859287963243715">Telemóvel</translation> <translation id="8209677645716428427">Os utilizadores supervisionados podem explorar a Web com a sua orientação. Enquanto gestor de utilizadores supervisionados no Chrome, pode:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Transferência em curso}other{Transferências em curso}}</translation> <translation id="8213449224684199188">Entrou no modo de foto</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 476b91a..2d63105c 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Alege fișierul</translation> <translation id="7366415735885268578">Adaugă un site</translation> <translation id="7366909168761621528">Date de navigare</translation> -<translation id="7367483872576694328">Serviciul de analiză a scanărilor BLE</translation> <translation id="736877393389250337">Adresa URL <ph name="URL" /> nu a putut fi deschisă în <ph name="ALTERNATIVE_BROWSER_NAME" />. Contactează administratorul de sistem.</translation> <translation id="7371006317849674875">Ora de începere</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">Această setare este impusă de administratorul dvs.</translation> <translation id="8206581664590136590">Trimite date de utilizare și diagnosticare. Contribuie la îmbunătățirea experienței Android a copilului trimițând automat la Google date de diagnosticare și utilizare a dispozitivului și a aplicațiilor. Acestea nu vor fi folosite la identificarea copilului și vor ajuta la stabilitatea sistemului, a aplicațiilor și altele. Unele date cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android. Dacă ai activat setarea Activitatea suplimentară de pe web și din aplicații pentru copilul tău, aceste date pot fi salvate în Contul său Google. <ph name="BEGIN_LINK1" />Află mai multe<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Albăstrel</translation> +<translation id="8206859287963243715">Celular</translation> <translation id="8209677645716428427">Un utilizator monitorizat poate naviga pe web sub îndrumarea dvs. În calitate de manager al unui utilizator monitorizat în Chrome, puteți să:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Descărcarea este în desfășurare}few{Descărcările sunt în desfășurare}other{Descărcările sunt în desfășurare}}</translation> <translation id="8213449224684199188">Modul foto a fost activat</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 956729e..28682fa4 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Выберите файл</translation> <translation id="7366415735885268578">Добавление сайта</translation> <translation id="7366909168761621528">Данные о работе в браузере</translation> -<translation id="7367483872576694328">Служба BLE Scan Parser</translation> <translation id="736877393389250337">Не удалось открыть страницу <ph name="URL" /> в <ph name="ALTERNATIVE_BROWSER_NAME" />. Обратитесь к системному администратору.</translation> <translation id="7371006317849674875">Время начала</translation> <translation id="7375053625150546623">EAP</translation> @@ -4747,6 +4746,7 @@ <translation id="8206354486702514201">Этот параметр включен администратором.</translation> <translation id="8206581664590136590">Отправка данных о работе устройства. Помогите сделать Android ещё лучше – разрешите автоматически отправлять в Google диагностическую информацию, данные об использовании приложений и самого устройства. Установить личность ребенка по этим данным нельзя. Они нужны нам, чтобы в будущем повысить стабильность приложений и внести другие улучшения. Некоторые данные в обобщенном виде пригодятся партнерам Google, например разработчикам Android. Если запись дополнительной истории приложений и веб-поиска включена, эта информация может сохраняться в аккаунте ребенка. <ph name="BEGIN_LINK1" />Подробнее…<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Блюз</translation> +<translation id="8206859287963243715">Сотовый</translation> <translation id="8209677645716428427">Пользователь контролируемого аккаунта может посещать веб-страницы под вашим руководством. Как менеджер профиля в Chrome вы можете выполнять следующие операции:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Выполняется скачивание}one{Выполняется скачивание}few{Выполняется скачивание}many{Выполняется скачивание}other{Выполняется скачивание}}</translation> <translation id="8213449224684199188">Включён режим фотосъёмки</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index e16c072e7a..486ab4d3 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -4170,7 +4170,6 @@ <translation id="7364796246159120393">Vybrať súbor</translation> <translation id="7366415735885268578">Pridanie webu</translation> <translation id="7366909168761621528">Údaje prehliadania</translation> -<translation id="7367483872576694328">Služba analýzy vyhľadávania cez Bluetooth s nízkou spotrebou energie</translation> <translation id="736877393389250337"><ph name="URL" /> sa nedá otvoriť v prehliadači <ph name="ALTERNATIVE_BROWSER_NAME" />. Obráťte sa na správcu systému.</translation> <translation id="7371006317849674875">Čas začiatku</translation> <translation id="7375053625150546623">EAP</translation> @@ -4745,6 +4744,7 @@ <translation id="8206354486702514201">Toto nastavenie je vynútené správcom.</translation> <translation id="8206581664590136590">Odosielať údaje o využití a diagnostiky. Pomôžte zlepšiť prostredie Androidu svojho dieťaťa automatickým odosielaním diagnostík a údajov o používaní zariadenia a aplikácií do Googlu. Nebudú slúžiť na zistenie totožnosti vášho dieťaťa. Pomôžu zvýšiť stabilitu systému a aplikácií a poskytovať ďalšie vylepšenia. Niektoré súhrnné údaje tiež pomôžu aplikáciám Google a partnerom, ako napríklad vývojárom Androidu. Ak pre dieťa aktivujete nastavenie dodatočnej aktivity na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google. <ph name="BEGIN_LINK1" />Ďalšie informácie<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesový</translation> +<translation id="8206859287963243715">Mobilné</translation> <translation id="8209677645716428427">Kontrolovaný používateľ môže preskúmať web pod vaším dohľadom. Ako správca kontrolovaného používateľa v prehliadači Chrome môžete:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Sťahuje sa}few{Sťahujú sa}many{Sťahujú sa}other{Sťahujú sa}}</translation> <translation id="8213449224684199188">Bol aktivovaný fotografický režim</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index b84b721..a02feda 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -4174,7 +4174,6 @@ <translation id="7364796246159120393">Izberite datoteko</translation> <translation id="7366415735885268578">Dodajanje spletnega mesta</translation> <translation id="7366909168761621528">Podatki brskanja</translation> -<translation id="7367483872576694328">Storitev razčlenjevalnika iskanja BLE</translation> <translation id="736877393389250337"><ph name="URL" /> v brskalniku <ph name="ALTERNATIVE_BROWSER_NAME" /> ni bilo mogoče odpreti. Obrnite se na skrbnika sistema.</translation> <translation id="7371006317849674875">Začetni čas</translation> <translation id="7375053625150546623">EAP</translation> @@ -4750,6 +4749,7 @@ <translation id="8206354486702514201">To nastavitev je uveljavil skrbnik.</translation> <translation id="8206581664590136590">Pošiljanje podatkov o uporabi in diagnostičnih podatkov. Pomagajte izboljšati otrokovo izkušnjo z Androidom s samodejnim pošiljanjem diagnostičnih podatkov ter podatkov o uporabi naprave in aplikacij Googlu. Teh podatkov ne bomo uporabljali, da bi prepoznali vašega otroka, temveč za izboljšanje stabilnosti sistema in izvajanja aplikacij ter drugega. Nekateri združeni podatki bodo pomagali tudi Googlovim aplikacijam in partnerjem, na primer razvijalcem za Android. Če ste za otroka vklopili dodatno beleženje dejavnosti v spletu in aplikacijah, bodo ti podatki morda shranjeni v njegovem računu za Google. <ph name="BEGIN_LINK1" />Več o tem<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Glasbenik</translation> +<translation id="8206859287963243715">Prenosni</translation> <translation id="8209677645716428427">Zaščiteni uporabnik lahko prek vašega vodenja raziskuje splet. Kot upravitelj zaščitenega uporabnika v Chromu imate te možnosti:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Poteka prenos}one{Poteka prenos}two{Potekata prenosa}few{Potekajo prenosi}other{Potekajo prenosi}}</translation> <translation id="8213449224684199188">Izbran je način za fotografije</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 06b5bf4..afab51a 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -4170,7 +4170,6 @@ <translation id="7364796246159120393">Одабери датотеку</translation> <translation id="7366415735885268578">Додајте сајт</translation> <translation id="7366909168761621528">Подаци прегледања</translation> -<translation id="7367483872576694328">Услуга рашчлањивања BLE скенирања</translation> <translation id="736877393389250337">Прегледач <ph name="ALTERNATIVE_BROWSER_NAME" /> није успео да отвори <ph name="URL" />. Контактирајте администратора система.</translation> <translation id="7371006317849674875">Време почетка</translation> <translation id="7375053625150546623">EAP</translation> @@ -4746,6 +4745,7 @@ <translation id="8206354486702514201">Ово подешавање примењује администратор.</translation> <translation id="8206581664590136590">Шаљите податке о коришћењу и дијагностичке податке. Помозите нам да побољшамо Android доживљај за дете тако што ћете аутоматски слати Google-у податке о дијагностици и коришћењу уређаја и апликација. Те информације се неће користити за идентификацију детета и помоћи ће у одржавању стабилности система и апликације и другим подешавањима. Неки обједињени подаци ће такође помоћи Google апликацијама и партнерима, попут Android програмера. Ако за дете укључите подешавање додатне активности на вебу и у апликацијама, ти подаци ће се можда чувати на Google налогу детета. <ph name="BEGIN_LINK1" />Сазнајте више<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Блузи</translation> +<translation id="8206859287963243715">Мобилни уређај</translation> <translation id="8209677645716428427">Корисник под надзором може да истражује веб под вашом контролом. Као менаџер корисника под надзором у Chrome-у, можете:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Преузимање је у току}one{Преузимања су у току}few{Преузимања су у току}other{Преузимања су у току}}</translation> <translation id="8213449224684199188">Активиран је режим слика</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 60360e9..7967719 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -4171,7 +4171,6 @@ <translation id="7364796246159120393">Välj fil</translation> <translation id="7366415735885268578">Lägg till en webbplats</translation> <translation id="7366909168761621528">Webbinformation</translation> -<translation id="7367483872576694328">Analystjänst för BLE-sökningar</translation> <translation id="736877393389250337">Det gick inte att öppna <ph name="URL" /> i <ph name="ALTERNATIVE_BROWSER_NAME" />. Kontakta systemadministratören.</translation> <translation id="7371006317849674875">Starttid</translation> <translation id="7375053625150546623">EAP</translation> @@ -4747,6 +4746,7 @@ <translation id="8206354486702514201">Administratören har gjort den här inställningen obligatorisk.</translation> <translation id="8206581664590136590">Skicka diagnostik- och användningsdata. Hjälp till att göra Android bättre för ditt barn genom att skicka diagnostikdata, enhetsdata och data om appanvändning till Google automatiskt. Denna data används till att förbättra systemets och apparnas stabilitet med mera och inte till att identifiera ditt barn. Viss samlad data används även till att förbättra appar från Google och partner, till exempel Android-utvecklare. Om ytterligare webb- och appaktivitet har aktiverats för ditt barn kan denna data sparas i Google-kontot. <ph name="BEGIN_LINK1" />Läs mer<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Bluesig</translation> +<translation id="8206859287963243715">Mobil</translation> <translation id="8209677645716428427">En kontrollerad användare kan utforska webben med dig som guide. Du som hanterar en kontrollerad användare i Chrome kan:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Nedladdning pågår}other{Nedladdningar pågår}}</translation> <translation id="8213449224684199188">Fotoläget har aktiverats</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index fa4ea68..2be523fd 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -4163,7 +4163,6 @@ <translation id="7364796246159120393">Chagua Faili</translation> <translation id="7366415735885268578">Ongeza tovuti</translation> <translation id="7366909168761621528">Data ya kuvinjari</translation> -<translation id="7367483872576694328">Huduma ya Kuchanganua Skani za BLE</translation> <translation id="736877393389250337">Tumeshindwa kufungua <ph name="URL" /> katika <ph name="ALTERNATIVE_BROWSER_NAME" />. Tafadhali wasiliana na msimamizi wako wa mfumo.</translation> <translation id="7371006317849674875">Wakati wa kuanza</translation> <translation id="7375053625150546623">EAP</translation> @@ -4741,6 +4740,7 @@ <translation id="8206354486702514201">Mpangilio huu umetekelezwa na msimamizi wako.</translation> <translation id="8206581664590136590">Tuma data ya matumizi na uchunguzi. Tusaidie kuboresha jinsi mtoto wako anavyotumia Android kwa kutuma kiotomatiki data ya uchunguzi na matumizi ya kifaa na programu kwa Google. Hatutatumia data hii kumtambulisha mtoto wako na itatusaidia kuboresha uthabiti wa programu na mfumo na maboresho mengine. Baadhi ya maelezo yaliyojumlishwa pia yatasaidia programu za Google na washirika kama vile wasanidi programu za Android. Ikiwa umewasha mipangilio ya historia ya Shughuli za ziada kwenye Wavuti na Programu ya mtoto wako, data hii inaweza kuhifadhiwa kwenye Akaunti yake ya Google. <ph name="BEGIN_LINK1" />Pata maelezo zaidi<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Kimuziki</translation> +<translation id="8206859287963243715">Simu ya Mkononi</translation> <translation id="8209677645716428427">Mtumiaji anayesimamiwa anaweza kugundua wavuti kwa mwongozo wako. Kama mdhibiti wa mtumiaji anayesimamiwa katika Chrome, unaweza:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Inaendelea kupakua}other{Inaendelea kupakua}}</translation> <translation id="8213449224684199188">Umeweka hali ya picha</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 2ee1ceb..9ef69ca06 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ta"> +<translation id="1002469766576243227"><ph name="EXTENSION_NAME" /> நிறுவனத்தின் மூலம் அடையாளச் சேவை ஹோஸ்ட் செய்யப்படுகிறது</translation> <translation id="1003088604756913841">புதிய <ph name="APP" /> சாளரத்தில் இணைப்பைத் திற</translation> <translation id="1004218526896219317">தள அணுகல்</translation> <translation id="1005274289863221750">உங்கள் மைக்ரோஃபோன் மற்றும் கேமராவைப் பயன்படுத்தலாம்</translation> @@ -288,6 +289,7 @@ <translation id="1429300045468813835">அனைத்தும் அழிக்கப்பட்டன</translation> <translation id="143027896309062157">உங்கள் கம்ப்யூட்டரிலும் நீங்கள் பார்வையிடும் இணையதளங்களிலும் உங்கள் எல்லா தரவையும் படிக்கலாம், திருத்தலாம்</translation> <translation id="1430915738399379752">அச்சிடுக</translation> +<translation id="1431188203598586230">மென்பொருளின் இறுதி புதுப்பிப்பு</translation> <translation id="1432581352905426595">தேடல் இன்ஜின்களை நிர்வகி</translation> <translation id="1433811987160647649">அணுகும் முன் கேள்</translation> <translation id="1434696352799406980">இது உங்கள் துவக்கப் பக்கம், புதிய தாவல் பக்கம், தேடல் இன்ஜின் மற்றும் பொருத்தப்பட்ட தாவல்கள் ஆகியவற்றை மீட்டமைக்கும். மேலும் இது எல்லா நீட்டிப்புகளையும் முடக்கி, குக்கீகள் போன்ற தற்காலிகத் தரவையும் அழிக்கும். உங்கள் புக்மார்க்கள், வரலாறு மற்றும் சேமித்த கடவுச்சொற்கள் அழிக்கப்படாது.</translation> @@ -526,6 +528,7 @@ <translation id="1781771911845953849">கணக்குகளும் ஒத்திசைவும்</translation> <translation id="1782196717298160133">ஃபோனைக் கண்டறிகிறது</translation> <translation id="1784849162047402014">சாதனத்தில் சேமிப்பிடம் குறைவாக உள்ளது</translation> +<translation id="1790194216133135334"><ph name="DEVICE_NAME" /> சாதனத்திற்கு இணைப்பை அனுப்பு</translation> <translation id="1792619191750875668">நீட்டிக்கப்பட்ட திரை</translation> <translation id="1794791083288629568">இந்தச் சிக்கலைத் தீர்ப்பதற்கு உதவ, கருத்தை அனுப்பவும்.</translation> <translation id="1795214765651529549">கிளாசிக்கைப் பயன்படுத்து</translation> @@ -588,6 +591,7 @@ <translation id="1875312262568496299">தொடங்குக</translation> <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" /> இலிருந்து மட்டுமே இதைச் சேர்க்க முடியும்</translation> <translation id="1877520246462554164">அங்கீகரிப்பு டோக்கனைப் பெற முடியவில்லை. மீண்டும் முயல, வெளியேறி மீண்டும் உள்நுழையவும்.</translation> +<translation id="1877860345998737529">சுவிட்ச் செயலை நியமித்தல்</translation> <translation id="1879000426787380528">உள்நுழையும் கணக்கு</translation> <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" சான்றிதழை நீக்கவா?</translation> <translation id="1886996562706621347">நெறிமுறைகளுக்கு இயல்புநிலை ஹேண்ட்லர்களாக இருக்கும்படி கேட்க தளங்களை அனுமதி (பரிந்துரைத்தது)</translation> @@ -865,6 +869,7 @@ <translation id="230927227160767054">இந்தப் பக்கம் சேவை ஹேண்ட்லரை நிறுவ உள்ளது.</translation> <translation id="2309620859903500144">இந்தத் தளம் உங்கள் நகர்வு அல்லது ஒளி சென்சார்களை அணுகுவதிலிருந்து தடைசெய்யப்பட்டுள்ளது.</translation> <translation id="2315414688463285945">Linux கோப்புகளை உள்ளமைப்பதில் பிழை. மீண்டும் முயலவும்.</translation> +<translation id="2315587498123194634"><ph name="DEVICE_NAME" /> சாதனத்திற்கு இணைப்பை அனுப்பு</translation> <translation id="2316129865977710310">வேண்டாம், நன்றி</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% முடிந்தது</translation> <translation id="2318143611928805047">தாளின் அளவு</translation> @@ -905,6 +910,7 @@ <translation id="2365507699358342471">கிளிப்போர்டுக்கு நகலெடுத்த உரையையும் படங்களையும், இந்தத் தளத்தால் பார்க்க முடியும்.</translation> <translation id="2367199180085172140">கோப்புப் பகிர்வைச் சேர்</translation> <translation id="2367972762794486313">பயன்பாடுகளைக் காட்டு</translation> +<translation id="2369105924912929484">எளிமையான பக்க உள்ளடக்கத்திற்கு நிலைமாற்று</translation> <translation id="2371076942591664043">&முடிந்ததும் திற</translation> <translation id="2375406435414127095">உங்கள் ஃபோனுடன் இணைத்தல்</translation> <translation id="2377667304966270281">ஹார்டு ஃபால்ட்கள்</translation> @@ -1156,6 +1162,7 @@ <translation id="2739191690716947896">பிழைத்திருத்து</translation> <translation id="2739240477418971307">உங்கள் அணுகல்தன்மை அமைப்புகளை மாற்றலாம்</translation> <translation id="2740393541869613458">மேற்பார்வையிடப்படும் பயனர் பார்வையிட்ட இணையதளங்களைச் சரிபார்க்கலாம், மேலும்</translation> +<translation id="2741912629735277980">உள்நுழைவுத் திரையில் UIயைக் காட்டு</translation> <translation id="274290345632688601">Linux ஆப்ஸ் & கோப்புகள் மீட்டமைக்கப்படுகின்றன.</translation> <translation id="2743387203779672305">கிளிப்போர்டுக்கு நகலெடு</translation> <translation id="2745080116229976798">Microsoft Qualified Subordination</translation> @@ -1272,6 +1279,7 @@ <translation id="2910318910161511225">நெட்வொர்க்குடன் இணைத்து, மீண்டும் முயலவும்</translation> <translation id="2913331724188855103">குக்கீத் தரவை, தளங்கள் சேமிக்கவும் படிக்கவும் அனுமதி (பரிந்துரைக்கப்பட்டது)</translation> <translation id="2915102088417824677">செயல்பாட்டுப் பதிவைக் காட்டு</translation> +<translation id="2915873080513663243">தானியங்கு ஸ்கேன்</translation> <translation id="2916073183900451334">ஒரு வலைப்பக்கத்தில் Tab விசையை அழுத்துவதால், இணைப்புகளும், படிவப்புலங்களும் தனிப்படுத்தி காண்பிக்கப்படுகின்றன</translation> <translation id="2916745397441987255">நீட்டிப்புகளைத் தேடுக</translation> <translation id="2921081876747860777">அகத் தரவைப் பாதுகாக்க, கடவுச்சொல்லை உருவாக்கவும்.</translation> @@ -1479,6 +1487,7 @@ <translation id="327147043223061465">எல்லாக் குக்கீகளையும் தளத்தின் தரவையும் காட்டு</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> இணைய விரும்புகிறது</translation> <translation id="3274763671541996799">முழுத் திரைக்கு வந்துவிட்டீர்கள்.</translation> +<translation id="3275778809241512831">உங்கள் அகப் பாதுகாப்பு விசை தற்சமயம் பாதுகாப்பாக இல்லை. ஏதேனும் சேவையுடன் இணைந்திருந்தால் அதனை அகற்றவும். இந்தச் சிக்கலை சரிசெய்ய பாதுகாப்பு விசையை ரீசெட் செய்யவும்.</translation> <translation id="3275778913554317645">சாளரமாகத் திற</translation> <translation id="3278001907972365362">உங்கள் Google கணக்கு(கள்) மதிப்பாய்வு செய்யப்பட வேண்டும்.</translation> <translation id="3279230909244266691">இதற்குச் சில நிமிடங்கள் ஆகலாம். விர்ச்சுவல் மெஷினைத் தொடங்குகிறது.</translation> @@ -1570,6 +1579,7 @@ <translation id="3412265149091626468">தேர்வுக்கு செல்</translation> <translation id="3413122095806433232">CA வழங்குநர்கள்: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">அளவு:</translation> +<translation id="3420501302812554910">அகப் பாதுகாப்பு விசையை ரீசெட் செய்ய வேண்டும்</translation> <translation id="3421387094817716717">நீள்வட்ட வளைவான பொதுக் குறியீடு</translation> <translation id="3423463006624419153">உங்கள் '<ph name="PHONE_NAME_1" />' மற்றும் '<ph name="PHONE_NAME_2" />' இல்:</translation> <translation id="3423858849633684918">தயவுசெய்து <ph name="PRODUCT_NAME" /> ஐ மீண்டும் தொடங்கவும்</translation> @@ -1598,6 +1608,7 @@ <translation id="3450157232394774192">செயல்படா நிலையின் பணிசெயல் சதவீதம்</translation> <translation id="3453612417627951340">அங்கீகாரம் தேவை</translation> <translation id="3454157711543303649">செயலாக்கம் நிறைவுற்றது</translation> +<translation id="3454213325559396544"><ph name="DEVICE_TYPE" /> சாதனத்தின் மென்பொருளுக்கும் பாதுகாப்பிற்கும் தானாக செய்யப்படும் கடைசிப் புதுப்பிப்பு இது தான். எதிர்வரும் புதுப்பிப்புகளைப் பெற புதிய வகை சாதனங்களுக்கு மாறவும்.</translation> <translation id="345693547134384690">&படத்தை புதிய தாவலில் திற</translation> <translation id="3457500881955698515">இந்தச் சாதனத்தை உடனடியாகப் புதுப்பிக்கும்படி உங்கள் நிறுவனமோ அமைப்போ வலியுறுத்துகிறது.</translation> <translation id="3459509316159669723">அச்சிடல்</translation> @@ -1755,6 +1766,7 @@ <translation id="3672681487849735243">முக்கியப் பிழை கண்டறியப்பட்டது</translation> <translation id="367645871420407123">மூல கடவுச்சொல்லை இயல்புநிலை சோதனைப் பட மதிப்பாக அமைக்க விரும்பினால், வெறுமையாக விடவும்</translation> <translation id="3677657024345889897">குறைவு</translation> +<translation id="3677911431265050325">மொபைல் தளத்தைக் கோரு</translation> <translation id="3678156199662914018">நீட்டிப்பு: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">உங்கள் கருத்திற்கு நன்றி. இப்போது ஆஃப்லைனில் உள்ளீர்கள், உங்கள் அறிக்கை பின்னர் அனுப்பப்படும்.</translation> <translation id="3682824389861648626">நகர்வு வரம்பு</translation> @@ -2206,6 +2218,7 @@ <translation id="4350019051035968019">இந்தச் சாதனத்தை உங்கள் கணக்கிற்குச் சொந்தமான களத்தில் பதிவுசெய்ய முடியாது, ஏனெனில் சாதனமானது வேறு களத்தால் நிர்வகிக்கப்படுவதற்காகக் குறிக்கப்பட்டுள்ளது.</translation> <translation id="4354344420232759511">நீங்கள் பார்வையிட்ட தளங்கள் இங்கே தோன்றும்</translation> <translation id="435527878592612277">உங்கள் படத்தைத் தேர்ந்தெடுக்கவும்</translation> +<translation id="4358313196493694334">கிளிக் செய்யும் இடத்தை நிலைப்படுத்துவும்</translation> <translation id="4359408040881008151">நீட்டிப்பு(கள்) சார்ந்திருப்பதன் காரணமாக நிறுவப்பட்டது.</translation> <translation id="4359717112757026264">நகரக் காட்சி</translation> <translation id="4361142739114356624">இந்தக் கிளையண்ட் சான்றிதழுக்கான தனிப்பட்ட குறியீடு இல்லை அல்லது தவறானது</translation> @@ -2328,6 +2341,7 @@ <translation id="4558426062282641716">தானியங்கு துவக்கத்திற்கான அனுமதி கோரப்பட்டது</translation> <translation id="4558491878126948419"><ph name="DEVICE_TYPE" /> உதவிக்குறிப்புகள் மற்றும் Google தயாரிப்புகள் தொடர்பான அறிவிப்புகளைப் பெறலாம், கருத்தைப் பகிரலாம். எந்த நேரத்திலும் குழுவிலகலாம்.</translation> <translation id="4559617833001311418">நகர்வு அல்லது ஒளி சென்சார்களை இந்தத் தளம் பயன்படுத்துகிறது.</translation> +<translation id="4561098487691395071">அல்லது உங்கள் பிரிண்டரின் PPDயைக் குறிப்பிடவும்</translation> <translation id="4562155214028662640">கைரேகையைச் சேர்</translation> <translation id="4563880231729913339">விரல் 3</translation> <translation id="4565377596337484307">கடவுச்சொல்லை மறைக்கும்</translation> @@ -2572,6 +2586,7 @@ <translation id="494286511941020793">பதிலி உள்ளமைவு உதவி</translation> <translation id="4943368462779413526">கால்பந்து</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ஒரு சீரியல் போர்ட்டுடன் இணைக்க விரும்புகிறது</translation> +<translation id="4944310289250773232"><ph name="SAML_DOMAIN" /> நிறுவனத்தின் மூலம் அடையாளச் சேவை ஹோஸ்ட் செய்யப்படுகிறது</translation> <translation id="495170559598752135">செயல்கள்</translation> <translation id="4953689047182316270">அணுகல்தன்மை நிகழ்வுகளுக்குப் பதிலளித்தல்</translation> <translation id="4953808748584563296">இயல்பு ஆரஞ்சுநிற அவதார்</translation> @@ -2664,6 +2679,7 @@ <translation id="5094721898978802975">ஒண்றிணைந்த குறிப்பிட்ட சாதனத்திற்கான பயன்பாடுகளுடன் தொடர்புகொள்ளவும்</translation> <translation id="5097002363526479830">'<ph name="NAME" />' நெட்வொர்க்குடன் இணைய முடியவில்லை: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">புக்மார்க்குகள் அனைத்தையும் திற</translation> +<translation id="5101839224773798795">கர்சர் நிற்கும் போது தானாகக் கிளிக் செய்</translation> <translation id="5108967062857032718">அமைப்புகள் - Android பயன்பாடுகளை அகற்றவும்</translation> <translation id="5109044022078737958">மியா</translation> <translation id="5111646998522066203">மறைநிலையிலிருந்து வெளியேறு</translation> @@ -3148,6 +3164,7 @@ <translation id="5852112051279473187">அச்சச்சோ! இந்தச் சாதனத்தைப் பதிவுசெய்யும்போது, ஏதோ தவறு நடந்துவிட்டது. மீண்டும் முயற்சி செய்க அல்லது உங்கள் ஆதரவு பிரதிநிதியைத் தொடர்புகொள்ளவும்.</translation> <translation id="5852137567692933493">மீண்டும் தொடங்கி, பவர்வாஷ் செய்க</translation> <translation id="5854912040170951372">ஸ்லைஸ்</translation> +<translation id="5855643921295613558">0.6 வினாடிகள்</translation> <translation id="5855773610748894548">அச்சச்சோ, பாதுகாப்பு மாட்யூலில் பிழை.</translation> <translation id="5856721540245522153">பிழைத் திருத்த அம்சங்களை இயக்குதல்</translation> <translation id="5857090052475505287">புதிய கோப்புறை</translation> @@ -3437,6 +3454,7 @@ <translation id="6279183038361895380">உங்கள் சுட்டியைக் காட்ட |<ph name="ACCELERATOR" />| என்பதை அழுத்தவும்</translation> <translation id="6280215091796946657">வேறொரு கணக்கு மூலம் உள்நுழைக</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 வினாடிகள்</translation> <translation id="6285120108426285413">பொதுவாக <ph name="FILE_NAME" /> பதிவிறக்கப்படாது, அத்துடன் இது ஆபத்துக்குரியதாக இருக்கலாம்.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{உங்கள் நெட்வொர்க்கில் புதிய பிரிண்டர் உள்ளது}other{உங்கள் நெட்வொர்க்கில் புதிய பிரிண்டர்கள் உள்ளன}}</translation> <translation id="6286708577777130801">சேமித்த கடவுச்சொல் விவரங்கள்</translation> @@ -3643,6 +3661,7 @@ <translation id="6612358246767739896">பாதுகாக்கப்பட்ட உள்ளடக்கம்</translation> <translation id="6613452264606394692">இந்தப் பக்கத்தைப் புத்தகக்குறியிடுவதன் மூலம், விரைவாக இதை அணுகலாம்</translation> <translation id="6615455863669487791">எனக்கு காண்பி</translation> +<translation id="6617100836880592260">ஸ்கேனிங் வேகம்: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">பரவாயில்லை, வைத்திரு</translation> <translation id="6619058681307408113">லைன் பிரிண்டர் டீமன் (LPD)</translation> <translation id="661907246513853610">தளத்தால் உங்கள் இருப்பிடத்தைக் கண்காணிக்க முடியும்</translation> @@ -4457,6 +4476,7 @@ <translation id="7831491651892296503">நெட்வொர்க்கை உள்ளமைப்பதில் பிழை</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">முடிவு நேரம்</translation> +<translation id="783214144752121388">தளங்கள் ஃபிளாஷை இயக்குவதிலிருந்து தடுக்கும் (பரிந்துரைக்கப்படுவது)</translation> <translation id="7833720883933317473">சேமித்த தனிப்பயன் சொற்கள் இங்கே தோன்றும்</translation> <translation id="7835178595033117206">புக்மார்க் அகற்றப்பட்டது</translation> <translation id="7837776265184002579">முகப்புப்பக்கம் <ph name="URL" />க்கு மாற்றப்பட்டது.</translation> @@ -4512,6 +4532,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">சேவையகத்தில் உங்கள் கடவுச்சொல் மாற்றப்பட்டது. வெளியேறி, மீண்டும் உள்நுழையவும்.</translation> <translation id="7915471803647590281">மறுமொழி அனுப்புவதற்கு முன், என்ன நடந்துகொண்டிருக்கிறது என்பதை எங்களிடம் தெரியப்படுத்துங்கள்.</translation> +<translation id="7919210519031517829"><ph name="DURATION" />வி</translation> <translation id="792514962475806987">டாக் செய்யப்பட்ட பெரிதாக்கியின் அளவை மாற்றுவதற்கான நிலை:</translation> <translation id="7925247922861151263">AAA சோதனை தோல்வியுற்றது</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> க்காக காத்திருக்கிறது...</translation> @@ -4569,6 +4590,7 @@ <translation id="7987814697832569482">எப்போதும் இந்த VPN மூலம் இணை</translation> <translation id="798835209536175951">உங்கள் Chromebookகில் இருந்து மெசேஜ்களை அனுப்பலாம், பெறலாம். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="7988355189918024273">அணுகல்தன்மை அம்சங்களை இயக்கு</translation> +<translation id="7991296728590311172">சுவிட்ச் அணுகலுக்கான அமைப்புகள்</translation> <translation id="7994702968232966508">EAP முறை</translation> <translation id="7997826902155442747">செயல்படுத்தல் முன்னுரிமை</translation> <translation id="7999229196265990314">பின்வரும் கோப்புகள் உருவாக்கப்பட்டன: @@ -4712,6 +4734,7 @@ <translation id="8206354486702514201">இந்த அமைப்பு உங்கள் நிர்வாகியால் செயலாக்கப்பட்டுள்ளது.</translation> <translation id="8206581664590136590">உபயோகம் & கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை Googleளுக்குத் தானாக அனுப்புவதன் மூலம் உங்கள் பிள்ளையின் Android அனுபவத்தை மேம்படுத்த உதவுக. இது உங்கள் பிள்ளையை அடையாளம் கண்டறியப் பயன்படுத்தப்படாது, இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் & ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவரது Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK1" />மேலும் அறிக<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">ப்ளூஸி</translation> +<translation id="8206859287963243715">செல்லுலர்</translation> <translation id="8209677645716428427">உங்கள் வழிகாட்டுதல் மூலம் மேற்பார்வையிடப்படும் பயனர் இணையத்தை உலாவலாம். Chrome இல் மேற்பார்வையிடப்படும் பயனரின் நிர்வாகியாக நீங்கள் இதைச் செய்யலாம்:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{பதிவிறக்கம் செயலில் உள்ளது}other{பதிவிறக்கங்கள் செயலில் உள்ளன}}</translation> <translation id="8213449224684199188">படப் பயன்முறைக்குச் சென்றது</translation> @@ -4782,6 +4805,8 @@ <translation id="8308179586020895837"><ph name="HOST" /> உங்கள் கேமராவை அணுக விரும்புகிறதா எனக் கேட்கவும்</translation> <translation id="830868413617744215">பீட்டா</translation> <translation id="8309458809024885768">சான்றிதழ் ஏற்கனவே உள்ளது</translation> +<translation id="8314381333424235892">விடுபட்ட அல்லது நிறுவல் நீக்கப்பட்ட நீட்டிப்பு</translation> +<translation id="8316618172731049784"><ph name="DEVICE_NAME" /> சாதனத்துக்கு அனுப்பு</translation> <translation id="8317671367883557781">நெட்வொர்க் இணைப்பைச் சேர்</translation> <translation id="8319414634934645341">நீட்டிக்கப்பட்ட விசைப் பயன்பாடு</translation> <translation id="8320459152843401447">உங்கள் முழுத் திரை</translation> @@ -4938,6 +4963,7 @@ <translation id="8588866096426746242">சுயவிவரப் புள்ளிவிவரங்களைக் காட்டு</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - ஹெட்செட்டுடன் VR பகிரப்படுகிறது</translation> <translation id="8590375307970699841">தானாக புதுப்பித்தலை அமைக்கவும்</translation> +<translation id="8591783563402255548">1 வினாடி</translation> <translation id="8592141010104017453">ஒருபோதும் அறிவிப்புகளைக் காட்டாதே</translation> <translation id="8593121833493516339">உபயோகம் & கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை Googleளுக்குத் தானாக அனுப்புவதன் மூலம் உங்கள் பிள்ளையின் Android அனுபவத்தை மேம்படுத்த உதவுக. இது உங்கள் பிள்ளையை அடையாளம் கண்டறியப் பயன்படுத்தப்படாது, இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் & ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவரது Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK1" />மேலும் அறிக<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">வீடியோ எடு</translation> @@ -4967,6 +4993,7 @@ <translation id="8637688295594795546">கணினிப் புதுப்பிப்பு உள்ளது. பதிவிறக்கத் தயாராகிறது...</translation> <translation id="8639047128869322042">தீங்கிழைக்கும் மென்பொருள் உள்ளதா எனத் தேடுகிறது...</translation> <translation id="8642171459927087831">அணுகல் டோக்கன்</translation> +<translation id="8642900771896232685">2 வினாடிகள்</translation> <translation id="8642947597466641025">உரையை இன்னும் பெரிதாக்கு</translation> <translation id="8643418457919840804">தொடர, விருப்பத்தைத் தேர்வுசெய்யவும்:</translation> <translation id="8644655801811752511">இந்தப் பாதுகாப்பு விசையை மீட்டமைக்க முடியவில்லை. விசையைச் செருகிய உடனே அதை மீட்டமைக்க முயலவும்.</translation> @@ -5167,6 +5194,7 @@ <translation id="8910222113987937043">புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகள் உங்கள் Google கணக்கிற்கு இனி ஒத்திசைக்கப்படாது. இருப்பினும், ஏற்கனவே உங்களிடம் உள்ள தரவு தொடர்ந்து Google கணக்கில் சேமிக்கப்படும். அவற்றை <ph name="BEGIN_LINK" />Google டாஷ்போர்டில்<ph name="END_LINK" /> நிர்வகிக்கலாம்.</translation> <translation id="8912362522468806198">Google கணக்கு</translation> <translation id="8912793549644936705">விரிவாக்கு</translation> +<translation id="8912810933860534797">தானியங்கு ஸ்கேனை இயக்கு</translation> <translation id="891365694296252935">உபயோகம் & கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை இந்தச் சாதனம் தற்போது Googleளுக்குத் தானாக அனுப்புகிறது. இது உங்கள் பிள்ளையை அடையாளம் கண்டறியப் பயன்படுத்தப்படாது, இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உரிமையாளர் இந்த அமைப்பைச் செயல்படுத்தியுள்ளார். உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் & ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவருடைய Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK1" />மேலும் அறிக<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">பரிந்துரைகளை ஏற்றுகிறது</translation> <translation id="8916476537757519021">மறைநிலை துணைச்சட்டகம்: <ph name="SUBFRAME_SITE" /></translation> @@ -5320,6 +5348,7 @@ <translation id="9153934054460603056">அடையாளம் மற்றும் கடவுச்சொல்லைச் சேமி</translation> <translation id="9154194610265714752">புதுப்பிக்கப்பட்டது</translation> <translation id="91568222606626347">ஷார்ட்கட்டை உருவாக்கு...</translation> +<translation id="9157096865782046368">0.8 வினாடிகள்</translation> <translation id="9157697743260533322">அனைத்து பயனர்களுக்கும் தானியங்கு புதுப்பிப்புகளை அமைக்க முடியவில்லை (ப்ரீஃபிளைட் செயலாக்கப் பிழை: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">அச்சச்சோ! அங்கீகரிப்பின்போது நெட்வொர்க்கைத் தொடர்புகொள்வதில் சிக்கல் ஏற்பட்டது. உங்கள் நெட்வொர்க் இணைப்பைச் சோதித்து மீண்டும் முயலவும்.</translation> <translation id="916607977885256133">பிக்ச்சர்-இன்-பிக்ச்சர்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 9a3a4e1..d0ee3ad 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -4171,7 +4171,6 @@ <translation id="7364796246159120393">ఫైల్ను ఎంచుకోండి</translation> <translation id="7366415735885268578">సైట్ను జోడించండి</translation> <translation id="7366909168761621528">బ్రౌజింగ్ డేటా</translation> -<translation id="7367483872576694328">BLE స్కాన్ పదనిరూపణ సేవ</translation> <translation id="736877393389250337"><ph name="URL" />ను <ph name="ALTERNATIVE_BROWSER_NAME" />లో తెరవలేకపోయింది. దయచేసి మీ సిస్టమ్ నిర్వాహకుడిని సంప్రదించండి.</translation> <translation id="7371006317849674875">ప్రారంభ సమయం</translation> <translation id="7375053625150546623">EAP</translation> @@ -4743,6 +4742,7 @@ <translation id="8206354486702514201">ఈ సెట్టింగ్ మీ నిర్వాహకుడి ద్వారా అమలు చేయబడింది.</translation> <translation id="8206581664590136590">వినియోగం & విశ్లేషణల డేటాను పంపండి. సమస్య విశ్లేషణ, పరికరం, యాప్ వినియోగ డేటాను ఆటోమేటిక్గా Googleకి పంపడం ద్వారా మీ చిన్నారి Android అనుభవాన్ని మెరుగుపరచడంలో సహాయపడండి. ఇది మీ చిన్నారి గురించి గుర్తించడానికి ఉపయోగించబడదు, ఇది కేవలం సిస్టమ్, యాప్ స్థిరత్వానికి, ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత సముదాయ డేటా కూడా Google యాప్లకు, అలాగే Android డెవలపర్ల లాంటి భాగస్వాములకు సహాయపడుతుంది. మీ చిన్నారి కోసం అదనపు వెబ్ & యాప్ కార్యకలాపం సెట్టింగ్ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు. <ph name="BEGIN_LINK1" />మరింత తెలుసుకోండి<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">బ్లూసై</translation> +<translation id="8206859287963243715">సెల్యులార్</translation> <translation id="8209677645716428427">పర్యవేక్షించబడే వినియోగదారు మీ మార్గదర్శకత్వంతో వెబ్ను విశ్లేషించవచ్చు. Chromeలో పర్యవేక్షించబడే వినియోగదారు యొక్క నిర్వాహకునిగా మీరు వీటిని చేయవచ్చు:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{డౌన్లోడ్ ప్రోగ్రెస్లో ఉంది}other{డౌన్లోడ్లు ప్రోగ్రెస్లో ఉన్నాయి}}</translation> <translation id="8213449224684199188">ఫోటో మోడ్లోకి ప్రవేశించింది</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 7700004..f90fd95 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">เลือกไฟล์</translation> <translation id="7366415735885268578">เพิ่มเว็บไซต์</translation> <translation id="7366909168761621528">ข้อมูลการท่องเว็บ</translation> -<translation id="7367483872576694328">บริการโปรแกรมแยกวิเคราะห์การสแกน BLE</translation> <translation id="736877393389250337">เปิด <ph name="URL" /> ใน <ph name="ALTERNATIVE_BROWSER_NAME" /> ไม่ได้ โปรดติดต่อผู้ดูแลระบบ</translation> <translation id="7371006317849674875">เวลาเริ่มต้น</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">ผู้ดูแลระบบของคุณกำหนดให้ใช้การตั้งค่านี้</translation> <translation id="8206581664590136590">ส่งข้อมูลการใช้งานและการวินิจฉัย ช่วยปรับปรุงประสบการณ์การใช้งาน Android ของบุตรหลานให้ดีขึ้นด้วยการส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ โดยจะไม่มีการใช้ข้อมูลนี้ในการระบุชื่อบุตรหลานของคุณ และจะช่วยปรับปรุงความเสถียรของแอปและระบบ และอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาซอฟต์แวร์ Android หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน <ph name="BEGIN_LINK1" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">บลูซี</translation> +<translation id="8206859287963243715">โทรศัพท์มือถือ</translation> <translation id="8209677645716428427">ผู้ใช้ภายใต้การดูแลสามารถสำรวจเว็บด้วยคำแนะนำของคุณ ในฐานะที่เป็นผู้จัดการผู้ใช้ภายใต้การดูแลใน Chrome คุณสามารถ</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{อยู่ระหว่างการดาวน์โหลด}other{อยู่ระหว่างการดาวน์โหลด}}</translation> <translation id="8213449224684199188">เข้าสู่โหมดรูปภาพแล้ว</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index be0051f..65b3468 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -4173,7 +4173,6 @@ <translation id="7364796246159120393">Dosya Seç</translation> <translation id="7366415735885268578">Site ekle</translation> <translation id="7366909168761621528">Göz atma verileri</translation> -<translation id="7367483872576694328">BLE Tarama Ayrıştırma Hizmeti</translation> <translation id="736877393389250337"><ph name="URL" /> <ph name="ALTERNATIVE_BROWSER_NAME" /> tarayıcıda açılamadı. Lütfen sistem yöneticinizle iletişim kurun.</translation> <translation id="7371006317849674875">Başlangıç zamanı</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">Bu seçenek, yöneticiniz tarafınızdan denetleniyor.</translation> <translation id="8206581664590136590">Kullanım ve teşhis verilerini gönder. Teşhis, cihaz ve uygulama kullanımı verilerini otomatik olarak Google'a göndererek çocuğunuzun Android deneyiminin iyileştirilmesine yardımcı olun. Bu veriler, çocuğunuzun kimliğini tespit etmek için kullanılmaz; sistem ve uygulama kararlılığı ile diğer özellikleri iyileştirmeye yardımcı olur. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur. Çocuğunuz için ek Web ve Uygulama Etkinliği açıksa bu veriler çocuğunuzun Google Hesabına kaydedilebilir. <ph name="BEGIN_LINK1" />Daha Fazla Bilgi<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Melodi</translation> +<translation id="8206859287963243715">Cep telefonu</translation> <translation id="8209677645716428427">Denetlenen bir kullanıcı web'i sizin rehberliğinizde keşfedebilir. Chrome'da denetlenen bir kullanıcının yöneticisi olarak şunları yapabilirsiniz:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{İndirme işlemi devam ediyor}other{İndirme işlemleri devam ediyor}}</translation> <translation id="8213449224684199188">Fotoğraf moduna girildi</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index f5d66d66..dbd6b52 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Вибрати файл</translation> <translation id="7366415735885268578">Додати сайт</translation> <translation id="7366909168761621528">Дані веб-перегляду</translation> -<translation id="7367483872576694328">Сервіс для синтактичного аналізу сканувань режиму енергозбереження Bluetooth</translation> <translation id="736877393389250337">Не вдається відкрити сторінку <ph name="URL" /> в <ph name="ALTERNATIVE_BROWSER_NAME" />. Зверніться до свого системного адміністратора.</translation> <translation id="7371006317849674875">Час початку</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">Це налаштування застосовується вашим адміністратором.</translation> <translation id="8206581664590136590">Надсилати дані про використання й діагностику. Допоможіть покращити роботу Android для вашої дитини, автоматично надсилаючи в Google дані про діагностику та використання пристрою і додатків. Ця інформація не використовуватиметься для встановлення особи вашої дитини, а допоможе покращити стабільність системи, додатків тощо. Деякі зведені дані також корисні для додатків і партнерів Google, як-от розробників Android. Якщо ввімкнено додаткову Історію додатків і веб-пошуку, ці дані зберігаються в обліковому записі Google дитини. <ph name="BEGIN_LINK1" />Докладніше<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Блюз</translation> +<translation id="8206859287963243715">Мобільний</translation> <translation id="8209677645716428427">Контрольований користувач може переглядати веб-сайти під вашим наглядом. Як менеджер контрольованого користувача в Chrome ви можете:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Триває завантаження}one{Тривають завантаження}few{Тривають завантаження}many{Тривають завантаження}other{Тривають завантаження}}</translation> <translation id="8213449224684199188">Увімкнено режим фото</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 1b538f15..9c04062b 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -4172,7 +4172,6 @@ <translation id="7364796246159120393">Chọn tệp</translation> <translation id="7366415735885268578">Thêm trang web</translation> <translation id="7366909168761621528">Dữ liệu duyệt web</translation> -<translation id="7367483872576694328">Dịch vụ phân tích cú pháp bản quét BLE</translation> <translation id="736877393389250337">Không mở được <ph name="URL" /> trong <ph name="ALTERNATIVE_BROWSER_NAME" />. Vui lòng liên hệ với quản trị viên hệ thống.</translation> <translation id="7371006317849674875">Thời gian bắt đầu</translation> <translation id="7375053625150546623">EAP</translation> @@ -4748,6 +4747,7 @@ <translation id="8206354486702514201">Cài đặt này được quản trị viên của bạn thực thi.</translation> <translation id="8206581664590136590">Gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng. Giúp cải thiện trải nghiệm Android của con bạn bằng cách tự động gửi dữ liệu chẩn đoán cũng như dữ liệu về mức sử dụng ứng dụng và thiết bị cho Google. Những thông tin này sẽ không dùng để nhận dạng con bạn mà giúp tăng độ ổn định của hệ thống và ứng dụng cũng như cải thiện các mặt khác. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android. Nếu bạn bật mục cài đặt bổ sung Hoạt động web và ứng dụng cho con mình thì dữ liệu này có thể được lưu vào Tài khoản Google của trẻ. <ph name="BEGIN_LINK1" />Tìm hiểu thêm<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">Nốt nhạc xanh</translation> +<translation id="8206859287963243715">Di động</translation> <translation id="8209677645716428427">Người dùng được giám sát có thể khám phá web dưới sự hướng dẫn của bạn. Là người quản lý của người dùng được giám sát trong Chrome, bạn có thể:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Đang tải xuống}other{Đang tải xuống}}</translation> <translation id="8213449224684199188">Đã chuyển sang chế độ ảnh</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 75ca756..e7a83de 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -4164,7 +4164,6 @@ <translation id="7364796246159120393">选择文件</translation> <translation id="7366415735885268578">添加网站</translation> <translation id="7366909168761621528">浏览数据</translation> -<translation id="7367483872576694328">BLE 扫描解析器服务</translation> <translation id="736877393389250337">无法在<ph name="ALTERNATIVE_BROWSER_NAME" />中打开 <ph name="URL" />。请与您的系统管理员联系。</translation> <translation id="7371006317849674875">开始时间</translation> <translation id="7375053625150546623">EAP</translation> @@ -4737,6 +4736,7 @@ <translation id="8206354486702514201">此设置是由您的管理员执行的。</translation> <translation id="8206581664590136590">发送使用情况数据和诊断数据。通过自动向 Google 发送诊断数据、设备数据和应用使用情况数据,帮助改善您孩子的 Android 使用体验。这些数据不会被用来辨识您孩子的身份,而是会被用来帮助提高系统和应用的稳定性以及实现其他方面的改进。部分汇总数据也会对 Google 应用和合作伙伴(例如 Android 开发者)有所帮助。如果您已为孩子开启“其他网络与应用活动记录”设置,这些数据可能会被保存到其 Google 帐号中。<ph name="BEGIN_LINK1" />了解详情<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">音符</translation> +<translation id="8206859287963243715">蜂窝网络设备</translation> <translation id="8209677645716428427">受监管用户可在您的指导下浏览网页。在 Chrome 中,受监管用户的管理员可执行以下操作:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{有 1 项下载正在进行中}other{有多项下载正在进行中}}</translation> <translation id="8213449224684199188">已进入照片模式</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index f016be5..bd13723 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -4170,7 +4170,6 @@ <translation id="7364796246159120393">選擇檔案</translation> <translation id="7366415735885268578">新增網站</translation> <translation id="7366909168761621528">瀏覽資料</translation> -<translation id="7367483872576694328">BLE 掃描剖析器服務</translation> <translation id="736877393389250337">無法在 <ph name="ALTERNATIVE_BROWSER_NAME" /> 中開啟 <ph name="URL" />。請與你的系統管理員聯絡。</translation> <translation id="7371006317849674875">開始時間</translation> <translation id="7375053625150546623">EAP</translation> @@ -4744,6 +4743,7 @@ <translation id="8206354486702514201">這項設定由管理員執行。</translation> <translation id="8206581664590136590">傳送使用狀況與診斷資料。讓系統自動將診斷資料以及裝置和應用程式的使用狀況資料傳送給 Google,協助改善你的 Android 使用體驗。這些資料將有助於系統和應用程式提高穩定性及做出其他改善,並不會用於識別貴子女的身分。部分匯總資料還能夠為 Google 應用程式和合作夥伴 (例如 Android 開發人員) 提供幫助。如果貴子女的「其他網路和應用程式活動」設定為開啟,系統可能會將這些資料儲存到他們的 Google 帳戶。<ph name="BEGIN_LINK1" />瞭解詳情<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">藍調</translation> +<translation id="8206859287963243715">手機</translation> <translation id="8209677645716428427">受監管的使用者可以在你的指導下瀏覽網路。在 Chrome 中,受監管使用者的管理員可以:</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{正在執行一項下載作業}other{正在執行多項下載作業}}</translation> <translation id="8213449224684199188">已進入相片模式</translation>
diff --git a/chrome/browser/android/tab_web_contents_delegate_android_unittest.cc b/chrome/browser/android/tab_web_contents_delegate_android_unittest.cc index 454fb44..1db57314 100644 --- a/chrome/browser/android/tab_web_contents_delegate_android_unittest.cc +++ b/chrome/browser/android/tab_web_contents_delegate_android_unittest.cc
@@ -40,10 +40,6 @@ browser_display_delegate.AdjustPreviewsStateForNavigation( nullptr, &noscript_previews_state); EXPECT_EQ(content::NOSCRIPT_ON, noscript_previews_state); - content::PreviewsState lofi_previews_state = content::CLIENT_LOFI_ON; - browser_display_delegate.AdjustPreviewsStateForNavigation( - nullptr, &lofi_previews_state); - EXPECT_EQ(content::CLIENT_LOFI_ON, lofi_previews_state); } TEST(TabWebContentsDelegateAndroidTest, @@ -55,26 +51,12 @@ nullptr, &noscript_previews_state); EXPECT_EQ(content::PREVIEWS_OFF, noscript_previews_state); - TestTabWebContentsDelegateAndroid fullscreen_display_delegate( - blink::kWebDisplayModeFullscreen); - content::PreviewsState lofi_previews_state = content::CLIENT_LOFI_ON; - fullscreen_display_delegate.AdjustPreviewsStateForNavigation( - nullptr, &lofi_previews_state); - EXPECT_EQ(content::PREVIEWS_OFF, lofi_previews_state); - TestTabWebContentsDelegateAndroid minimal_ui_display_delegate( blink::kWebDisplayModeMinimalUi); content::PreviewsState litepage_previews_state = content::SERVER_LITE_PAGE_ON; minimal_ui_display_delegate.AdjustPreviewsStateForNavigation( nullptr, &litepage_previews_state); EXPECT_EQ(content::PREVIEWS_OFF, litepage_previews_state); - - TestTabWebContentsDelegateAndroid undefined_display_delegate( - blink::kWebDisplayModeUndefined); - content::PreviewsState server_lofi_previews_state = content::SERVER_LOFI_ON; - undefined_display_delegate.AdjustPreviewsStateForNavigation( - nullptr, &server_lofi_previews_state); - EXPECT_EQ(content::PREVIEWS_OFF, server_lofi_previews_state); } } // namespace android
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 9b35070f..611a448 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc
@@ -135,8 +135,6 @@ #include "extensions/buildflags/buildflags.h" #include "extensions/common/constants.h" #include "media/media_buildflags.h" -#include "net/socket/client_socket_pool_manager.h" -#include "net/url_request/url_request_context_getter.h" #include "ppapi/buildflags/buildflags.h" #include "printing/buildflags/buildflags.h" #include "services/network/public/cpp/features.h" @@ -320,13 +318,6 @@ base::Bind(&ApplyMetricsReportingPolicy)); #endif - int max_per_proxy = local_state_->GetInteger(prefs::kMaxConnectionsPerProxy); - net::ClientSocketPoolManager::set_max_sockets_per_proxy_server( - net::HttpNetworkSession::NORMAL_SOCKET_POOL, - std::max(std::min(max_per_proxy, 99), - net::ClientSocketPoolManager::max_sockets_per_group( - net::HttpNetworkSession::NORMAL_SOCKET_POOL))); - DCHECK(!webrtc_event_log_manager_); webrtc_event_log_manager_ = WebRtcEventLogManager::CreateSingletonInstance(); @@ -909,10 +900,6 @@ void BrowserProcessImpl::RegisterPrefs(PrefRegistrySimple* registry) { registry->RegisterBooleanPref(prefs::kDefaultBrowserSettingEnabled, false); - // This policy needs to be defined before the net subsystem is initialized, - // so we do it here. - registry->RegisterIntegerPref(prefs::kMaxConnectionsPerProxy, - net::kDefaultMaxSocketsPerProxyServer); registry->RegisterBooleanPref(prefs::kAllowCrossOriginAuthPrompt, false);
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 2c45195..e18e924 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5411,7 +5411,7 @@ navigation_handle->GetReloadType() != content::ReloadType::NONE; content::PreviewsState server_previews_enabled_state = - content::SERVER_LOFI_ON | content::SERVER_LITE_PAGE_ON; + content::SERVER_LITE_PAGE_ON; // For now, treat server previews types as a single decision, and do not // re-evaluate upon redirect. Plumbing does not exist to modify the CPAT
diff --git a/chrome/browser/chromeos/android_sms/android_sms_app_manager_impl.cc b/chrome/browser/chromeos/android_sms/android_sms_app_manager_impl.cc index 2d6d6df6..b02f67c 100644 --- a/chrome/browser/chromeos/android_sms/android_sms_app_manager_impl.cc +++ b/chrome/browser/chromeos/android_sms/android_sms_app_manager_impl.cc
@@ -159,11 +159,8 @@ const extensions::Extension* new_pwa = setup_controller_->GetPwa( GetAndroidMessagesURL(true /* use_install_url */)); - // If the installation succeeded, a PWA should exist at the new URL. - DCHECK_EQ(success, new_pwa != nullptr); - - // If the app failed to install, it should no longer be launched. - if (!success) { + // If the app failed to install or the PWA does not exist, do not launch. + if (!success || !new_pwa) { is_app_launch_pending_ = false; return; }
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc index cc4195ac..a051e4c6 100644 --- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc +++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
@@ -298,12 +298,6 @@ case data_reduction_proxy::TRANSFORM_LITE_PAGE: data->set_lite_page_received(true); break; - case data_reduction_proxy::TRANSFORM_PAGE_POLICIES_EMPTY_IMAGE: - data->set_lofi_policy_received(true); - break; - case data_reduction_proxy::TRANSFORM_EMPTY_IMAGE: - data->set_lofi_received(true); - break; case data_reduction_proxy::TRANSFORM_IDENTITY: case data_reduction_proxy::TRANSFORM_COMPRESSED_VIDEO: case data_reduction_proxy::TRANSFORM_NONE:
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc index 7d206ca..2aae4e12 100644 --- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc +++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc
@@ -468,38 +468,4 @@ &handle, headers.get()); EXPECT_TRUE(data->lite_page_received()); - EXPECT_FALSE(data->lofi_received()); - EXPECT_FALSE(data->lofi_policy_received()); -} - -TEST_F(DataReductionProxyChromeSettingsTest, CreateDataWithLofiPolicyReceived) { - std::string raw_headers = - "HTTP/1.0 200 OK\n" - "chrome-proxy: page-policies=empty-image\n"; - content::MockNavigationHandle handle(GURL(kUrl), main_rfh()); - auto headers = base::MakeRefCounted<net::HttpResponseHeaders>( - net::HttpUtil::AssembleRawHeaders(raw_headers)); - handle.set_response_headers(headers); - auto data = drp_chrome_settings_->CreateDataFromNavigationHandle( - &handle, headers.get()); - - EXPECT_FALSE(data->lite_page_received()); - EXPECT_FALSE(data->lofi_received()); - EXPECT_TRUE(data->lofi_policy_received()); -} - -TEST_F(DataReductionProxyChromeSettingsTest, CreateDataWithLofiReceived) { - std::string raw_headers = - "HTTP/1.0 200 OK\n" - "chrome-proxy-content-transform: empty-image\n"; - content::MockNavigationHandle handle(GURL(kUrl), main_rfh()); - auto headers = base::MakeRefCounted<net::HttpResponseHeaders>( - net::HttpUtil::AssembleRawHeaders(raw_headers)); - handle.set_response_headers(headers); - auto data = drp_chrome_settings_->CreateDataFromNavigationHandle( - &handle, headers.get()); - - EXPECT_FALSE(data->lite_page_received()); - EXPECT_TRUE(data->lofi_received()); - EXPECT_FALSE(data->lofi_policy_received()); }
diff --git a/chrome/browser/devtools/devtools_eye_dropper.cc b/chrome/browser/devtools/devtools_eye_dropper.cc index 66528e57..443a47b 100644 --- a/chrome/browser/devtools/devtools_eye_dropper.cc +++ b/chrome/browser/devtools/devtools_eye_dropper.cc
@@ -81,7 +81,7 @@ return; host_->RemoveMouseEventCallback(mouse_event_callback_); content::CursorInfo cursor_info; - cursor_info.type = blink::WebCursorInfo::kTypePointer; + cursor_info.type = ui::CursorType::kPointer; host_->SetCursor(cursor_info); video_capturer_.reset(); host_ = nullptr; @@ -255,7 +255,7 @@ canvas.drawCircle(kCursorSize / 2, kCursorSize / 2, kDiameter / 2, paint); content::CursorInfo cursor_info; - cursor_info.type = blink::WebCursorInfo::kTypeCustom; + cursor_info.type = ui::CursorType::kCustom; cursor_info.image_scale_factor = device_scale_factor; cursor_info.custom_image = result; cursor_info.hotspot = gfx::Point(kHotspotOffset * device_scale_factor,
diff --git a/chrome/browser/devtools/protocol/browser_handler.cc b/chrome/browser/devtools/protocol/browser_handler.cc index 75068d39..2bc97ef 100644 --- a/chrome/browser/devtools/protocol/browser_handler.cc +++ b/chrome/browser/devtools/protocol/browser_handler.cc
@@ -256,10 +256,9 @@ return response; PermissionOverrides overrides; - for (size_t i = 0; i < permissions->length(); ++i) { + for (const std::string& permission : *permissions) { content::PermissionType type; - Response type_response = - FromProtocolPermissionType(permissions->get(i), &type); + Response type_response = FromProtocolPermissionType(permission, &type); if (!type_response.isSuccess()) return type_response; overrides.insert(type);
diff --git a/chrome/browser/devtools/protocol/cast_handler.cc b/chrome/browser/devtools/protocol/cast_handler.cc index f77cfa5..99df84c 100644 --- a/chrome/browser/devtools/protocol/cast_handler.cc +++ b/chrome/browser/devtools/protocol/cast_handler.cc
@@ -238,8 +238,7 @@ if (!frontend_) return; - std::unique_ptr<protocol::Array<Sink>> protocol_sinks = - protocol::Array<Sink>::create(); + auto protocol_sinks = std::make_unique<protocol::Array<Sink>>(); for (const media_router::MediaSinkWithCastModes& sink_with_modes : sinks_) { auto route_it = std::find_if( routes_observer_->routes().begin(), routes_observer_->routes().end(), @@ -256,7 +255,7 @@ if (!session.empty()) sink->SetSession(session); - protocol_sinks->addItem(std::move(sink)); + protocol_sinks->emplace_back(std::move(sink)); } frontend_->SinksUpdated(std::move(protocol_sinks)); }
diff --git a/chrome/browser/devtools/protocol/page_handler.cc b/chrome/browser/devtools/protocol/page_handler.cc index eea7f9c..5dcd7d1 100644 --- a/chrome/browser/devtools/protocol/page_handler.cc +++ b/chrome/browser/devtools/protocol/page_handler.cc
@@ -51,7 +51,7 @@ void PageHandler::GetInstallabilityErrors( std::unique_ptr<GetInstallabilityErrorsCallback> callback) { - auto errors = protocol::Array<std::string>::create(); + auto errors = std::make_unique<protocol::Array<std::string>>(); InstallableManager* manager = web_contents() ? InstallableManager::FromWebContents(web_contents()) : nullptr; @@ -68,8 +68,6 @@ void PageHandler::GotInstallabilityErrors( std::unique_ptr<GetInstallabilityErrorsCallback> callback, std::vector<std::string> errors) { - auto result = protocol::Array<std::string>::create(); - for (const auto& error : errors) - result->addItem(error); - callback->sendSuccess(std::move(result)); + callback->sendSuccess( + std::make_unique<protocol::Array<std::string>>(std::move(errors))); }
diff --git a/chrome/browser/devtools/protocol/target_handler.cc b/chrome/browser/devtools/protocol/target_handler.cc index cee0c2e1..6947f16 100644 --- a/chrome/browser/devtools/protocol/target_handler.cc +++ b/chrome/browser/devtools/protocol/target_handler.cc
@@ -53,10 +53,9 @@ if (!locations) return protocol::Response::OK(); - for (size_t i = 0; i < locations->length(); ++i) { - auto* item = locations->get(i); + for (const auto& location : *locations) { remote_locations_.insert( - net::HostPortPair(item->GetHost(), item->GetPort())); + net::HostPortPair(location->GetHost(), location->GetPort())); } ChromeDevToolsManagerDelegate* delegate =
diff --git a/chrome/browser/devtools/protocol/window_manager_handler.cc b/chrome/browser/devtools/protocol/window_manager_handler.cc index 2db2187..3e8fce9c 100644 --- a/chrome/browser/devtools/protocol/window_manager_handler.cc +++ b/chrome/browser/devtools/protocol/window_manager_handler.cc
@@ -17,14 +17,14 @@ protocol::Response WindowManagerHandler::EnterOverviewMode() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - bool toggled = ash::Shell::Get()->overview_controller()->ToggleOverview(); - return toggled ? protocol::Response::OK() + bool success = ash::Shell::Get()->overview_controller()->StartOverview(); + return success ? protocol::Response::OK() : protocol::Response::Error("Overview failed"); } protocol::Response WindowManagerHandler::ExitOverviewMode() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - bool toggled = ash::Shell::Get()->overview_controller()->ToggleOverview(); - return toggled ? protocol::Response::OK() + bool success = ash::Shell::Get()->overview_controller()->EndOverview(); + return success ? protocol::Response::OK() : protocol::Response::Error("Overview failed"); }
diff --git a/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc b/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc index 372a012..117d716 100644 --- a/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc +++ b/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc
@@ -49,10 +49,8 @@ return true; } // Allow about:blank and about:srcdoc. - if (url.spec() == url::kAboutBlankURL || - url.spec() == content::kAboutSrcDocURL) { + if (url.IsAboutBlank() || url.IsAboutSrcdoc()) return true; - } return allow_extension_scheme_ && url.scheme() == kExtensionScheme; }
diff --git a/chrome/browser/interstitials/enterprise_util.cc b/chrome/browser/interstitials/enterprise_util.cc index edc03d35..6098f26 100644 --- a/chrome/browser/interstitials/enterprise_util.cc +++ b/chrome/browser/interstitials/enterprise_util.cc
@@ -83,9 +83,11 @@ DEPRECATED_SB_THREAT_TYPE_URL_PASSWORD_PROTECTION_PHISHING: case safe_browsing::SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE: case safe_browsing::SB_THREAT_TYPE_AD_SAMPLE: + case safe_browsing::SB_THREAT_TYPE_BLOCKED_AD_POPUP: case safe_browsing::SB_THREAT_TYPE_SUSPICIOUS_SITE: case safe_browsing::SB_THREAT_TYPE_ENTERPRISE_PASSWORD_REUSE: case safe_browsing::SB_THREAT_TYPE_APK_DOWNLOAD: + case safe_browsing::SB_THREAT_TYPE_HIGH_CONFIDENCE_ALLOWLIST: NOTREACHED(); break; }
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc index 315fe08..4c8625d 100644 --- a/chrome/browser/net/system_network_context_manager.cc +++ b/chrome/browser/net/system_network_context_manager.cc
@@ -477,6 +477,8 @@ registry->RegisterBooleanPref(prefs::kEnableReferrers, true); registry->RegisterBooleanPref(prefs::kQuickCheckEnabled, true); + + registry->RegisterIntegerPref(prefs::kMaxConnectionsPerProxy, -1); } void SystemNetworkContextManager::OnNetworkServiceCreated( @@ -533,6 +535,11 @@ "text/csv"}); } + int max_connections_per_proxy = + local_state_->GetInteger(prefs::kMaxConnectionsPerProxy); + if (max_connections_per_proxy != -1) + network_service->SetMaxConnectionsPerProxy(max_connections_per_proxy); + // The system NetworkContext must be created first, since it sets // |primary_network_context| to true. network_service->CreateNetworkContext(
diff --git a/chrome/browser/offline_pages/background_loader_offliner_unittest.cc b/chrome/browser/offline_pages/background_loader_offliner_unittest.cc index 149f057..2b0213c 100644 --- a/chrome/browser/offline_pages/background_loader_offliner_unittest.cc +++ b/chrome/browser/offline_pages/background_loader_offliner_unittest.cc
@@ -880,7 +880,7 @@ PreviewsUITabHelper::CreateForWebContents(offliner()->web_contents()); PreviewsUITabHelper::FromWebContents(offliner()->web_contents()) ->CreatePreviewsUserDataForNavigationHandle(&handle, 1u) - ->set_committed_previews_state(content::PreviewsTypes::CLIENT_LOFI_ON); + ->set_committed_previews_state(content::PreviewsTypes::NOSCRIPT_ON); scoped_refptr<net::HttpResponseHeaders> header( new net::HttpResponseHeaders("HTTP/1.1 200 OK")); handle.set_response_headers(header.get());
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc index 57042173..10440d9 100644 --- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc +++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc
@@ -334,11 +334,6 @@ const page_load_metrics::ExtraRequestCompleteInfo& extra_request_complete_info) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (extra_request_complete_info.data_reduction_proxy_data && - extra_request_complete_info.data_reduction_proxy_data->lofi_received()) { - data_->set_lofi_received(true); - } - if (extra_request_complete_info.resource_type == content::ResourceType::kMainFrame) { main_frame_fetch_start_ =
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.cc b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.cc index c66f3abf..f04642e5 100644 --- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.cc +++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.cc
@@ -173,12 +173,6 @@ pingback_client_->timing()->renderer_memory_usage_kb); } -void DataReductionProxyMetricsObserverTestBase::ValidateLoFiInPingback( - bool lofi_expected) { - EXPECT_TRUE(pingback_client_->send_pingback_called()); - EXPECT_EQ(lofi_expected, pingback_client_->data().lofi_received()); -} - void DataReductionProxyMetricsObserverTestBase::ValidateBlackListInPingback( bool black_listed) { EXPECT_TRUE(pingback_client_->send_pingback_called());
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h index cb7758c0..66063aa1 100644 --- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h +++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h
@@ -111,9 +111,6 @@ // Validates the times in the pingback. void ValidateTimes(); - // Validates the LoFi state in the pingback. - void ValidateLoFiInPingback(bool lofi_expected); - // Validates the blacklist state in the pingback. void ValidateBlackListInPingback(bool black_listed);
diff --git a/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc index 71975e61..22070632 100644 --- a/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc
@@ -55,9 +55,6 @@ data->set_request_url(handle->GetURL()); data->set_black_listed(previews_data->black_listed_for_lite_page()); data->set_used_data_reduction_proxy(true); - data->set_client_lofi_requested(false); - data->set_lofi_policy_received(false); - data->set_lofi_received(false); data->set_was_cached_data_reduction_proxy_response(false); base::TimeDelta penalty =
diff --git a/chrome/browser/page_load_metrics/observers/previews_ukm_observer.cc b/chrome/browser/page_load_metrics/observers/previews_ukm_observer.cc index 52d526b..e73ad14 100644 --- a/chrome/browser/page_load_metrics/observers/previews_ukm_observer.cc +++ b/chrome/browser/page_load_metrics/observers/previews_ukm_observer.cc
@@ -217,8 +217,7 @@ // |navigation_restart_penalty_| is included here because a Lite Page Redirect // preview can be attempted and not commit. This incurs the penalty but may // also cause no preview to be committed. - if (!server_lofi_seen_ && !client_lofi_seen_ && !lite_page_seen_ && - !noscript_seen_ && !resource_loading_hints_seen_ && + if (!lite_page_seen_ && !noscript_seen_ && !resource_loading_hints_seen_ && !offline_preview_seen_ && !origin_opt_out_occurred_ && !save_data_enabled_ && !lite_page_redirect_seen_ && !navigation_restart_penalty_.has_value()) { @@ -227,10 +226,6 @@ ukm::builders::Previews builder(info.source_id); builder.Setcoin_flip_result(static_cast<int>(coin_flip_result_)); - if (server_lofi_seen_) - builder.Setserver_lofi(1); - if (client_lofi_seen_) - builder.Setclient_lofi(1); if (lite_page_seen_) builder.Setlite_page(1); if (lite_page_redirect_seen_) @@ -308,22 +303,6 @@ builder.Record(ukm::UkmRecorder::Get()); } -void PreviewsUKMObserver::OnLoadedResource( - const page_load_metrics::ExtraRequestCompleteInfo& - extra_request_complete_info) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (extra_request_complete_info.data_reduction_proxy_data) { - if (extra_request_complete_info.data_reduction_proxy_data - ->lofi_received()) { - server_lofi_seen_ = true; - } - if (extra_request_complete_info.data_reduction_proxy_data - ->client_lofi_requested()) { - client_lofi_seen_ = true; - } - } -} - void PreviewsUKMObserver::OnEventOccurred(const void* const event_key) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (event_key == PreviewsUITabHelper::OptOutEventKey())
diff --git a/chrome/browser/page_load_metrics/observers/previews_ukm_observer.h b/chrome/browser/page_load_metrics/observers/previews_ukm_observer.h index dd7259e..cd31d37 100644 --- a/chrome/browser/page_load_metrics/observers/previews_ukm_observer.h +++ b/chrome/browser/page_load_metrics/observers/previews_ukm_observer.h
@@ -42,8 +42,6 @@ const page_load_metrics::PageLoadExtraInfo& info) override; void OnComplete(const page_load_metrics::mojom::PageLoadTiming& timing, const page_load_metrics::PageLoadExtraInfo& info) override; - void OnLoadedResource(const page_load_metrics::ExtraRequestCompleteInfo& - extra_request_complete_info) override; void OnEventOccurred(const void* const event_key) override; ObservePolicy ShouldObserveMimeType( const std::string& mime_type) const override; @@ -67,8 +65,6 @@ // The preview type that was most recently committed. PreviewsType committed_preview_; - bool server_lofi_seen_ = false; - bool client_lofi_seen_ = false; bool lite_page_seen_ = false; bool lite_page_redirect_seen_ = false; bool noscript_seen_ = false;
diff --git a/chrome/browser/prefs/pref_service_incognito_whitelist.cc b/chrome/browser/prefs/pref_service_incognito_whitelist.cc index 3f54148..aaea15c 100644 --- a/chrome/browser/prefs/pref_service_incognito_whitelist.cc +++ b/chrome/browser/prefs/pref_service_incognito_whitelist.cc
@@ -15,7 +15,6 @@ #include "components/rappor/rappor_pref_names.h" #include "components/reading_list/core/reading_list_pref_names.h" #include "components/ukm/ukm_pref_names.h" -#include "components/variations/pref_names.h" #if !defined(OS_ANDROID) #include "chrome/browser/accessibility/animation_policy_prefs.h" @@ -212,25 +211,6 @@ ukm::prefs::kUkmClientId, ukm::prefs::kUkmUnsentLogStore, ukm::prefs::kUkmSessionId, - - // Variations preferences maybe changed from incognito mode and should be - // kept in sync between incognito and regular modes. - variations::prefs::kVariationsCompressedSeed, - variations::prefs::kVariationsCountry, - variations::prefs::kVariationsCrashStreak, - variations::prefs::kVariationsFailedToFetchSeedStreak, - variations::prefs::kVariationsLastFetchTime, - variations::prefs::kVariationsPermanentConsistencyCountry, - variations::prefs::kVariationsRestrictParameter, - variations::prefs::kVariationsSafeCompressedSeed, - variations::prefs::kVariationsSafeSeedDate, - variations::prefs::kVariationsSafeSeedFetchTime, - variations::prefs::kVariationsSafeSeedLocale, - variations::prefs::kVariationsSafeSeedPermanentConsistencyCountry, - variations::prefs::kVariationsSafeSeedSessionConsistencyCountry, - variations::prefs::kVariationsSafeSeedSignature, - variations::prefs::kVariationsSeedDate, - variations::prefs::kVariationsSeedSignature, }; } // namespace
diff --git a/chrome/browser/previews/previews_content_util.cc b/chrome/browser/previews/previews_content_util.cc index b2f6363..9ade042d 100644 --- a/chrome/browser/previews/previews_content_util.cc +++ b/chrome/browser/previews/previews_content_util.cc
@@ -306,23 +306,13 @@ data_reduction_proxy::DataReductionProxyData* data, content::PreviewsState initial_state) { if (!data) { - return initial_state &= - ~(content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON); + return initial_state &= ~(content::SERVER_LITE_PAGE_ON); } content::PreviewsState updated_state = initial_state; if (!data->lite_page_received()) { // Turn off LitePage bit. updated_state &= ~(content::SERVER_LITE_PAGE_ON); } - if (!data->lofi_policy_received()) { - // Turn off LoFi bit(s). - updated_state &= ~(content::SERVER_LOFI_ON); - if (data->used_data_reduction_proxy()) { - // Turn off Client LoFi bit also if using proxy but proxy did not - // request LoFi. - updated_state &= ~(content::CLIENT_LOFI_ON); - } - } return updated_state; } @@ -360,13 +350,10 @@ // If a server preview is set, retain only the bits determined for the server. // |previews_state| must already have been updated for server previews from // the main frame response headers (so if they are set here, then they are - // the specify the committed preview). Note: for Server LoFi we keep the - // Client LoFi bit on so that it is applied to both HTTP and HTTPS images. - if (previews_state & - (content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON)) { + // the specify the committed preview). + if (previews_state & content::SERVER_LITE_PAGE_ON) { LogCommittedPreview(previews_data, PreviewsType::LITE_PAGE); - return previews_state & (content::SERVER_LITE_PAGE_ON | - content::SERVER_LOFI_ON | content::CLIENT_LOFI_ON); + return previews_state & content::SERVER_LITE_PAGE_ON; } if (previews_data && previews_data->cache_control_no_transform_directive()) {
diff --git a/chrome/browser/previews/previews_content_util.h b/chrome/browser/previews/previews_content_util.h index 0312956..39b3835 100644 --- a/chrome/browser/previews/previews_content_util.h +++ b/chrome/browser/previews/previews_content_util.h
@@ -21,8 +21,8 @@ // This bit mask is all the preview types that are fully decided // before commit. static const content::PreviewsState kPreCommitPreviews = - content::SERVER_LOFI_ON | content::SERVER_LITE_PAGE_ON | - content::OFFLINE_PAGE_ON | content::LITE_PAGE_REDIRECT_ON; + content::SERVER_LITE_PAGE_ON | content::OFFLINE_PAGE_ON | + content::LITE_PAGE_REDIRECT_ON; // Returns whether |previews_state| has any enabled previews. bool HasEnabledPreviews(content::PreviewsState previews_state);
diff --git a/chrome/browser/previews/previews_content_util_unittest.cc b/chrome/browser/previews/previews_content_util_unittest.cc index 9577191..34aa05cd 100644 --- a/chrome/browser/previews/previews_content_util_unittest.cc +++ b/chrome/browser/previews/previews_content_util_unittest.cc
@@ -393,8 +393,7 @@ TEST_F(PreviewsContentUtilTest, DetermineCommittedClientPreviewsStateNoScriptCheckIfStillAllowed) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitFromCommandLine("Previews,ClientLoFi", - "NoScriptPreviews"); + scoped_feature_list.InitFromCommandLine("Previews", "NoScriptPreviews"); PreviewsUserData user_data(1); // NoScript not allowed at commit time so no previews chosen: EXPECT_EQ(content::PREVIEWS_OFF, @@ -411,7 +410,6 @@ data_reduction_proxy::DataReductionProxyData data_reduction_proxy_data; data_reduction_proxy_data.set_used_data_reduction_proxy(true); data_reduction_proxy_data.set_lite_page_received(true); - data_reduction_proxy_data.set_lofi_policy_received(false); // Verify selects LitePage bit but doesn't touch client-only NoScript bit. EXPECT_EQ(content::SERVER_LITE_PAGE_ON | content::NOSCRIPT_ON,
diff --git a/chrome/browser/previews/previews_lite_page_browsertest.cc b/chrome/browser/previews/previews_lite_page_browsertest.cc index 8baa47e..eb86ba9 100644 --- a/chrome/browser/previews/previews_lite_page_browsertest.cc +++ b/chrome/browser/previews/previews_lite_page_browsertest.cc
@@ -1597,8 +1597,6 @@ pingback_client->data(); EXPECT_TRUE(data->used_data_reduction_proxy()); EXPECT_TRUE(data->lite_page_received()); - EXPECT_FALSE(data->lofi_policy_received()); - EXPECT_FALSE(data->lofi_received()); EXPECT_FALSE(data->was_cached_data_reduction_proxy_response()); EXPECT_EQ(data->page_id().value(), expected_page_id); EXPECT_EQ(data->page_id().value(), got_page_id());
diff --git a/chrome/browser/previews/previews_lite_page_predictor.cc b/chrome/browser/previews/previews_lite_page_predictor.cc index d3604c26..c00d9ceef 100644 --- a/chrome/browser/previews/previews_lite_page_predictor.cc +++ b/chrome/browser/previews/previews_lite_page_predictor.cc
@@ -14,17 +14,29 @@ #include "chrome/browser/predictors/loading_predictor.h" #include "chrome/browser/predictors/loading_predictor_factory.h" #include "chrome/browser/previews/previews_lite_page_navigation_throttle.h" +#include "chrome/browser/previews/previews_service.h" +#include "chrome/browser/previews/previews_service_factory.h" +#include "chrome/browser/profiles/profile.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" +#include "components/previews/content/previews_decider_impl.h" +#include "components/previews/content/previews_optimization_guide.h" +#include "components/previews/content/previews_ui_service.h" #include "components/previews/core/previews_experiments.h" #include "components/previews/core/previews_features.h" #include "components/previews/core/previews_lite_page_redirect.h" #include "content/public/browser/browser_context.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" #include "url/gurl.h" -PreviewsLitePagePredictor::~PreviewsLitePagePredictor() = default; +PreviewsLitePagePredictor::~PreviewsLitePagePredictor() { + if (g_browser_process->network_quality_tracker()) { + g_browser_process->network_quality_tracker() + ->RemoveEffectiveConnectionTypeObserver(this); + } +} PreviewsLitePagePredictor::PreviewsLitePagePredictor( content::WebContents* web_contents) @@ -33,6 +45,20 @@ drp_settings_ = DataReductionProxyChromeSettingsFactory::GetForBrowserContext( web_contents->GetBrowserContext()); + + PreviewsService* previews_service = PreviewsServiceFactory::GetForProfile( + Profile::FromBrowserContext(web_contents->GetBrowserContext())); + if (previews_service && previews_service->previews_ui_service() && + previews_service->previews_ui_service()->previews_decider_impl()) { + opt_guide_ = previews_service->previews_ui_service() + ->previews_decider_impl() + ->previews_opt_guide(); + } + + if (g_browser_process->network_quality_tracker()) { + g_browser_process->network_quality_tracker() + ->AddEffectiveConnectionTypeObserver(this); + } } bool PreviewsLitePagePredictor::DataSaverIsEnabled() const { @@ -40,6 +66,42 @@ return drp_settings_ && drp_settings_->IsDataReductionProxyEnabled(); } +bool PreviewsLitePagePredictor::ECTIsSlow() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (!g_browser_process->network_quality_tracker()) + return false; + + switch (g_browser_process->network_quality_tracker() + ->GetEffectiveConnectionType()) { + case net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G: + case net::EFFECTIVE_CONNECTION_TYPE_2G: + return true; + case net::EFFECTIVE_CONNECTION_TYPE_3G: + case net::EFFECTIVE_CONNECTION_TYPE_4G: + case net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN: + case net::EFFECTIVE_CONNECTION_TYPE_OFFLINE: + case net::EFFECTIVE_CONNECTION_TYPE_LAST: + return false; + } +} + +bool PreviewsLitePagePredictor::PageIsBlacklisted(const GURL& url) const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // Assume the page is blacklisted if there is no optimization guide available. + // This matches the behavior of the preview triggering itself. + if (!opt_guide_) + return true; + + return opt_guide_->IsBlacklisted(url, + previews::PreviewsType::LITE_PAGE_REDIRECT); +} + +bool PreviewsLitePagePredictor::IsVisible() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return web_contents()->GetVisibility() == content::Visibility::VISIBLE; +} + bool PreviewsLitePagePredictor::ShouldPreresolveOnPage() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -60,11 +122,23 @@ if (!previews::params::IsLitePageServerPreviewsEnabled()) return false; + if (!ECTIsSlow()) + return false; + GURL url = web_contents()->GetController().GetLastCommittedEntry()->GetURL(); + if (!url.SchemeIs(url::kHttpsScheme)) + return false; + + if (PageIsBlacklisted(url)) + return false; + if (previews::IsLitePageRedirectPreviewDomain(url)) return false; + if (!IsVisible()) + return false; + return true; } @@ -101,7 +175,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(timer_); - // TODO(crbug.com/971918): Add remaining conditions. + // TODO(crbug.com/971918): Also need to preconnect to origin. return; GURL previews_url = PreviewsLitePageNavigationThrottle::GetPreviewsURLForURL( @@ -140,4 +214,16 @@ MaybeTogglePreresolveTimer(); } +void PreviewsLitePagePredictor::OnVisibilityChanged( + content::Visibility visibility) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + MaybeTogglePreresolveTimer(); +} + +void PreviewsLitePagePredictor::OnEffectiveConnectionTypeChanged( + net::EffectiveConnectionType ect) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + MaybeTogglePreresolveTimer(); +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(PreviewsLitePagePredictor)
diff --git a/chrome/browser/previews/previews_lite_page_predictor.h b/chrome/browser/previews/previews_lite_page_predictor.h index 8324d1f..89d2e45 100644 --- a/chrome/browser/previews/previews_lite_page_predictor.h +++ b/chrome/browser/previews/previews_lite_page_predictor.h
@@ -25,6 +25,10 @@ class DataReductionProxySettings; } +namespace previews { +class PreviewsOptimizationGuide; +} + // Manages background preresolving or preconnecting for lite page redirect // previews. When a set of conditions are met, this class causes the litepage // version of the current committed page URL to be preresolved in a loop so that @@ -45,7 +49,8 @@ // * Chrome is in the foreground. // * This' |web_contents| is in the foreground. class PreviewsLitePagePredictor - : public content::WebContentsObserver, + : public network::NetworkQualityTracker::EffectiveConnectionTypeObserver, + public content::WebContentsObserver, public content::WebContentsUserData<PreviewsLitePagePredictor> { public: ~PreviewsLitePagePredictor() override; @@ -53,12 +58,23 @@ // content::WebContentsObserver: void DidFinishNavigation(content::NavigationHandle* handle) override; void DidStartNavigation(content::NavigationHandle* handle) override; + void OnVisibilityChanged(content::Visibility visibility) override; + + // network::NetworkQualityTracker::EffectiveConnectionTypeObserver: + void OnEffectiveConnectionTypeChanged( + net::EffectiveConnectionType ect) override; protected: explicit PreviewsLitePagePredictor(content::WebContents* web_contents); // Virtual for testing. virtual bool DataSaverIsEnabled() const; + virtual bool ECTIsSlow() const; + virtual bool PageIsBlacklisted(const GURL& url) const; + + // Returns true when this |web_contents| is the active tab and Chrome is in + // the foreground. Virtual for testing. + virtual bool IsVisible() const; private: friend class content::WebContentsUserData<PreviewsLitePagePredictor>; @@ -67,8 +83,16 @@ FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, DataSaverDisabled); FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, NoNavigation); + FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, ECTNotSlow); + FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, PageBlacklisted); + FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, NotVisible); + FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, InsecurePage); FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, ToggleMultipleTimes_Navigations); + FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, + ToggleMultipleTimes_ECT); + FRIEND_TEST_ALL_PREFIXES(PreviewsLitePagePredictorUnitTest, + ToggleMultipleTimes_Visibility); // Returns true if the current page should be preresolved. bool ShouldPreresolveOnPage() const; @@ -88,6 +112,9 @@ // A reference to the DRP Settings. data_reduction_proxy::DataReductionProxySettings* drp_settings_; + // A reference to the PreviewsOptimizationGuide. + previews::PreviewsOptimizationGuide* opt_guide_; + WEB_CONTENTS_USER_DATA_KEY_DECL(); SEQUENCE_CHECKER(sequence_checker_);
diff --git a/chrome/browser/previews/previews_lite_page_predictor_unittest.cc b/chrome/browser/previews/previews_lite_page_predictor_unittest.cc index 93fbd1e3..72b8d459 100644 --- a/chrome/browser/previews/previews_lite_page_predictor_unittest.cc +++ b/chrome/browser/previews/previews_lite_page_predictor_unittest.cc
@@ -14,31 +14,53 @@ #include "url/gurl.h" namespace { -const char kTestUrl[] = "http://www.test.com/"; +const char kTestUrl[] = "https://www.test.com/"; } class TestPreviewsLitePagePredictor : public PreviewsLitePagePredictor { public: TestPreviewsLitePagePredictor(content::WebContents* web_contents, - bool data_saver_enabled) + bool data_saver_enabled, + bool ect_is_slow, + bool page_is_blacklisted, + bool is_visible) : PreviewsLitePagePredictor(web_contents), - data_saver_enabled_(data_saver_enabled) {} + data_saver_enabled_(data_saver_enabled), + ect_is_slow_(ect_is_slow), + page_is_blacklisted_(page_is_blacklisted), + is_visible_(is_visible) {} // PreviewsLitePagePredictor: bool DataSaverIsEnabled() const override { return data_saver_enabled_; } + bool ECTIsSlow() const override { return ect_is_slow_; } + bool PageIsBlacklisted(const GURL& url) const override { + return page_is_blacklisted_; + } + bool IsVisible() const override { return is_visible_; } + + void set_ect_is_slow(bool ect_is_slow) { ect_is_slow_ = ect_is_slow; } + void set_is_visible(bool is_visible) { is_visible_ = is_visible; } private: bool data_saver_enabled_; + bool ect_is_slow_; + bool page_is_blacklisted_; + bool is_visible_; }; class PreviewsLitePagePredictorUnitTest : public ChromeRenderViewHostTestHarness { public: - void RunTest(bool feature_enabled, bool data_saver_enabled) { + void RunTest(bool feature_enabled, + bool data_saver_enabled, + bool ect_is_slow, + bool page_is_blacklisted, + bool is_visible) { scoped_feature_list_.InitWithFeatureState( previews::features::kLitePageServerPreviews, feature_enabled); - preresolver_.reset( - new TestPreviewsLitePagePredictor(web_contents(), data_saver_enabled)); + preresolver_.reset(new TestPreviewsLitePagePredictor( + web_contents(), data_saver_enabled, ect_is_slow, page_is_blacklisted, + is_visible)); test_handle_.reset( new content::MockNavigationHandle(GURL(kTestUrl), main_rfh())); std::vector<GURL> redirect_chain; @@ -70,7 +92,9 @@ }; TEST_F(PreviewsLitePagePredictorUnitTest, AllConditionsMet) { - RunTest(true /* feature_enabled */, true /* data_saver_enabled */); + RunTest(true /* feature_enabled */, true /* data_saver_enabled */, + true /* ect_is_slow */, false /* page_is_blacklisted */, + true /* is_visible */); base::HistogramTester histogram_tester; @@ -83,7 +107,9 @@ } TEST_F(PreviewsLitePagePredictorUnitTest, FeatureDisabled) { - RunTest(false /* feature_enabled */, true /* data_saver_enabled */); + RunTest(false /* feature_enabled */, true /* data_saver_enabled */, + true /* ect_is_slow */, false /* page_is_blacklisted */, + true /* is_visible */); content::WebContentsTester::For(web_contents()) ->NavigateAndCommit(GURL(kTestUrl)); @@ -92,7 +118,9 @@ } TEST_F(PreviewsLitePagePredictorUnitTest, DataSaverDisabled) { - RunTest(true /* feature_enabled */, false /* data_saver_enabled */); + RunTest(true /* feature_enabled */, false /* data_saver_enabled */, + true /* ect_is_slow */, false /* page_is_blacklisted */, + true /* is_visible */); content::WebContentsTester::For(web_contents()) ->NavigateAndCommit(GURL(kTestUrl)); @@ -100,14 +128,54 @@ EXPECT_FALSE(preresolver()->ShouldPreresolveOnPage()); } -TEST_F(PreviewsLitePagePredictorUnitTest, NoNavigation) { - RunTest(true /* feature_enabled */, true /* data_saver_enabled */); +TEST_F(PreviewsLitePagePredictorUnitTest, ECTNotSlow) { + RunTest(true /* feature_enabled */, true /* data_saver_enabled */, + false /* ect_is_slow */, false /* page_is_blacklisted */, + true /* is_visible */); + + content::WebContentsTester::For(web_contents()) + ->NavigateAndCommit(GURL(kTestUrl)); + + EXPECT_FALSE(preresolver()->ShouldPreresolveOnPage()); +} + +TEST_F(PreviewsLitePagePredictorUnitTest, PageBlacklisted) { + RunTest(true /* feature_enabled */, true /* data_saver_enabled */, + true /* ect_is_slow */, true /* page_is_blacklisted */, + true /* is_visible */); + + content::WebContentsTester::For(web_contents()) + ->NavigateAndCommit(GURL(kTestUrl)); + + EXPECT_FALSE(preresolver()->ShouldPreresolveOnPage()); +} + +TEST_F(PreviewsLitePagePredictorUnitTest, NotVisible) { + RunTest(true /* feature_enabled */, true /* data_saver_enabled */, + true /* ect_is_slow */, false /* page_is_blacklisted */, + false /* is_visible */); + + content::WebContentsTester::For(web_contents()) + ->NavigateAndCommit(GURL(kTestUrl)); + + EXPECT_FALSE(preresolver()->ShouldPreresolveOnPage()); +} + +TEST_F(PreviewsLitePagePredictorUnitTest, InsecurePage) { + RunTest(true /* feature_enabled */, true /* data_saver_enabled */, + true /* ect_is_slow */, false /* page_is_blacklisted */, + true /* is_visible */); + + content::WebContentsTester::For(web_contents()) + ->NavigateAndCommit(GURL("http://test.com")); EXPECT_FALSE(preresolver()->ShouldPreresolveOnPage()); } TEST_F(PreviewsLitePagePredictorUnitTest, ToggleMultipleTimes_Navigations) { - RunTest(true /* feature_enabled */, true /* data_saver_enabled */); + RunTest(true /* feature_enabled */, true /* data_saver_enabled */, + true /* ect_is_slow */, false /* page_is_blacklisted */, + true /* is_visible */); base::HistogramTester histogram_tester; @@ -124,3 +192,46 @@ histogram_tester.ExpectBucketCount( "Previews.ServerLitePage.ToggledPreresolve", false, 1); } + +TEST_F(PreviewsLitePagePredictorUnitTest, ToggleMultipleTimes_ECT) { + RunTest(true /* feature_enabled */, true /* data_saver_enabled */, + true /* ect_is_slow */, false /* page_is_blacklisted */, + true /* is_visible */); + + base::HistogramTester histogram_tester; + + content::WebContentsTester::For(web_contents()) + ->NavigateAndCommit(GURL(kTestUrl)); + EXPECT_TRUE(preresolver()->ShouldPreresolveOnPage()); + + preresolver()->set_ect_is_slow(false); + preresolver()->OnEffectiveConnectionTypeChanged( + net::EFFECTIVE_CONNECTION_TYPE_4G); + EXPECT_FALSE(preresolver()->ShouldPreresolveOnPage()); + + histogram_tester.ExpectBucketCount( + "Previews.ServerLitePage.ToggledPreresolve", true, 1); + histogram_tester.ExpectBucketCount( + "Previews.ServerLitePage.ToggledPreresolve", false, 1); +} + +TEST_F(PreviewsLitePagePredictorUnitTest, ToggleMultipleTimes_Visibility) { + RunTest(true /* feature_enabled */, true /* data_saver_enabled */, + true /* ect_is_slow */, false /* page_is_blacklisted */, + true /* is_visible */); + + base::HistogramTester histogram_tester; + + content::WebContentsTester::For(web_contents()) + ->NavigateAndCommit(GURL(kTestUrl)); + EXPECT_TRUE(preresolver()->ShouldPreresolveOnPage()); + + preresolver()->set_is_visible(false); + preresolver()->OnVisibilityChanged(content::Visibility::HIDDEN); + EXPECT_FALSE(preresolver()->ShouldPreresolveOnPage()); + + histogram_tester.ExpectBucketCount( + "Previews.ServerLitePage.ToggledPreresolve", true, 1); + histogram_tester.ExpectBucketCount( + "Previews.ServerLitePage.ToggledPreresolve", false, 1); +}
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 321ce82..478e8ca 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -1341,28 +1341,14 @@ } void RenderViewContextMenu::AppendImageItems() { - std::map<std::string, std::string>::const_iterator it = - params_.properties.find( - data_reduction_proxy::chrome_proxy_content_transform_header()); - if ((it != params_.properties.end() && - it->second == data_reduction_proxy::empty_image_directive()) || - (!params_.has_image_contents && - base::FeatureList::IsEnabled( - features::kLoadBrokenImagesFromContextMenu))) { + if (!params_.has_image_contents && + base::FeatureList::IsEnabled( + features::kLoadBrokenImagesFromContextMenu)) { menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_LOAD_IMAGE, IDS_CONTENT_CONTEXT_LOAD_IMAGE); } - DataReductionProxyChromeSettings* settings = - DataReductionProxyChromeSettingsFactory::GetForBrowserContext( - browser_context_); - if (settings && settings->CanUseDataReductionProxy(params_.src_url)) { - menu_model_.AddItemWithStringId( - IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB, - IDS_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB); - } else { - menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB, - IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB); - } + menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB, + IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB); menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, IDS_CONTENT_CONTEXT_SAVEIMAGEAS); menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGE,
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc index d9fafee..eb3e9f53 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -817,37 +817,6 @@ ASSERT_TRUE(suggested_filename.empty()); } -IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, DataSaverOpenOrigImageInNewTab) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - data_reduction_proxy::features:: - kDataReductionProxyEnabledWithNetworkService); - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - command_line->AppendSwitch( - data_reduction_proxy::switches::kEnableDataReductionProxy); - - std::unique_ptr<TestRenderViewContextMenu> menu = - CreateContextMenuMediaTypeImage(GURL("http://url.com/image.png")); - - ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB)); - ASSERT_TRUE( - menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB)); -} - -IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, - DataSaverHttpsOpenImageInNewTab) { - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - command_line->AppendSwitch( - data_reduction_proxy::switches::kEnableDataReductionProxy); - - std::unique_ptr<TestRenderViewContextMenu> menu = - CreateContextMenuMediaTypeImage(GURL("https://url.com/image.png")); - - ASSERT_FALSE( - menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB)); - ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB)); -} - IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, OpenImageInNewTab) { std::unique_ptr<TestRenderViewContextMenu> menu = CreateContextMenuMediaTypeImage(GURL("http://url.com/image.png"));
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc index 01dd677..2439944 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -548,24 +548,6 @@ DestroyDataReductionProxySettings(); } -// Verify that the Chrome-Proxy Lo-Fi directive causes the context menu to -// display the "Load Image" menu item. -TEST_F(RenderViewContextMenuPrefsTest, DataSaverLoadImage) { - SetupDataReductionProxy(true); - content::ContextMenuParams params = CreateParams(MenuItem::IMAGE); - params.properties[ - data_reduction_proxy::chrome_proxy_content_transform_header()] = - data_reduction_proxy::empty_image_directive(); - params.unfiltered_link_url = params.link_url; - auto menu = std::make_unique<TestRenderViewContextMenu>( - web_contents()->GetMainFrame(), params); - AppendImageItems(menu.get()); - - ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_LOAD_IMAGE)); - - DestroyDataReductionProxySettings(); -} - // Check that if image is broken "Load image" menu item is present. TEST_F(RenderViewContextMenuPrefsTest, LoadBrokenImage) { base::test::ScopedFeatureList scoped_feature_list;
diff --git a/chrome/browser/resources/app_management/permission_item.js b/chrome/browser/resources/app_management/permission_item.js index 20592d6..760aaf7 100644 --- a/chrome/browser/resources/app_management/permission_item.js +++ b/chrome/browser/resources/app_management/permission_item.js
@@ -76,8 +76,8 @@ onClick_: function(e) { e.preventDefault(); - const toggle = /** @type {AppManagementPermissionToggleElement} */ - assert(this.$$('#permission-toggle')); + const toggle = /** @type {AppManagementPermissionToggleElement} */ ( + assert(this.$$('#permission-toggle'))); toggle.togglePermission_(); }, });
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ta.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ta.xtb index 464c23e..6d057773 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ta.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ta.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">எதுவும் பதிவுசெய்யப்படவில்லை</translation> <translation id="1862930711583847113"><ph name="FILE" /> கோப்பை இடமாற்ற முடியவில்லை</translation> +<translation id="1899697626337024495">படத் தெளிவுத்திறன்</translation> <translation id="2008689030244369546">முற்றிலும் புதிய தோற்றம்</translation> <translation id="2036868001356139588">டைமர் காலஅளவு</translation> <translation id="2050339315714019657">செங்குத்து நிலை</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">பதிவுசெய்வது நிறுத்தப்பட்டது</translation> <translation id="2501953888035679275">உங்கள் கேமராவைப் பயன்படுத்தி, படங்களை எடுக்கலாம், வீடியோக்களை ரெக்கார்டு செய்யலாம்.</translation> <translation id="2549985041256363841">பதிவுசெய்யத் தொடங்கு</translation> +<translation id="2599796128805996109">பின்பக்கக் கேமரா</translation> <translation id="2968794441791257519">கேமராவில் எடுக்கப்படும் படங்களும் வீடியோக்களும் ‘பதிவிறக்கங்கள்’ கோப்புறைக்கு நகர்த்தப்படும். அவற்றை Filesஸில் பார்க்கலாம். சேமிப்பக அனுமதிகள் உள்ள ஆப்ஸால் அவற்றை அணுக முடியும்.</translation> <translation id="3081586908890909590">வீடியோவைப் பதிவுசெய்யும் பயன்முறைக்கு மாறு</translation> <translation id="3183731565330012717">கட்ட வகை</translation> <translation id="3227137524299004712">மைக்ரோஃபோன்</translation> +<translation id="3259149966178251584">கேமரா தெளிவுத்திறன்</translation> <translation id="3517926952904427380">படத்தை நீளவாக்கில் எடுக்க முடியவில்லை</translation> <translation id="3569311554794739032"><ph name="FILE" /> கோப்பை நிச்சயமாக அகற்ற விரும்புகிறீர்களா?</translation> <translation id="3810838688059735925">வீடியோ</translation> <translation id="4279490309300973883">பிரதிபலிக்கிறது</translation> <translation id="4329152592498422850">சதுர வடிவத்தில் படமெடுக்குமாறு மாற்றவும்</translation> <translation id="4445542136948522167">படமெடுப்பதை நிறுத்து</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> மெகாபிக்சல்</translation> +<translation id="4570032796877367747">முன்பக்கக் கேமரா</translation> <translation id="4628948037717959914">படம்</translation> <translation id="4649291346448517080">கோப்பைச் சேமிக்க முடியவில்லை</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">மேலும் அறிக</translation> <translation id="6233780560267770709">3 x 3</translation> <translation id="6243827288366940320">கோல்டன் விகிதம்</translation> +<translation id="6248749904681914629">இணைக்கப்பட்ட வேறு கேமரா</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> மெகா பிக்சல்</translation> <translation id="6681668084120808868">புகைப்படம் எடு</translation> <translation id="6778482348691154169">படம் எடுக்க முடியவில்லை</translation> <translation id="6965382102122355670">சரி</translation> <translation id="698156982839284926">3 வினாடிகள்</translation> <translation id="712848772518857951"><ph name="COUNT" /> உள்ளடக்கங்களை நிச்சயமாக அகற்ற விரும்புகிறீர்களா?</translation> +<translation id="7243947652761655814">வீடியோ தெளிவுத்திறன்</translation> <translation id="7337660886763914220">கோப்பு அமைப்புப் பிழைகள்.</translation> <translation id="7557677699350329807">அடுத்த கேமராவுக்கு மாறு</translation> <translation id="7608223098072244877">4 x 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">படமெடுக்கும் பயன்முறைக்கு மாறு</translation> <translation id="8261506727792406068">நீக்கு</translation> <translation id="8428213095426709021">அமைப்புகள்</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />பி (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">நீளவாக்கில் படமெடுக்குமாறு மாற்றவும்</translation> <translation id="8870695351537079478">பதிவுசெய்வதைத் தொடங்க முடியவில்லை</translation> <translation id="9045155556724273246">10 விநாடிகள்</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs index 9795b73..ed469a24 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
@@ -1551,7 +1551,7 @@ }); }); -TEST_F('ChromeVoxBackgroundTest', 'NavigationSyncsSelect', function() { +TEST_F('ChromeVoxBackgroundTest', 'DISABLED_NavigationSyncsSelect', function() { var mockFeedback = this.createMockFeedback(); this.runWithLoadedTree(function() {/*! <select>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb index 6077dca..68a746b 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
@@ -457,7 +457,7 @@ <translation id="4215733775853809057">次のスライダ</translation> <translation id="42164919740161077">カデットブルー</translation> <translation id="4218529045364428769">{COUNT,plural, =1{ダッシュ}other{# 個のダッシュ}}</translation> -<translation id="421884353938374759">色の選択</translation> +<translation id="421884353938374759">カラー選択ツール</translation> <translation id="4221071177874897997">太字を表す:</translation> <translation id="4229646983878045487">日時</translation> <translation id="4230834257931120629">ライト スレートグレー</translation> @@ -514,7 +514,7 @@ <translation id="461613135510474570">文</translation> <translation id="4623097797855662355">奥付</translation> <translation id="463135993322337640">ChromeVox+o+n キーを押すと新機能を確認できます</translation> -<translation id="4647836961514597010">色の選択</translation> +<translation id="4647836961514597010">カラー選択ツール</translation> <translation id="4652110509054054146">検索、左または右矢印でホームまたはエンドになります。検索、コントロール、左または右矢印で、コントロール ホームまたはコントロール エンドになります。検索、上または下矢印でページアップまたはページダウンになります。</translation> <translation id="4660783501463101648">クラシックの削除。ChromeVox クラシックに戻るキーボード切り替えは削除されました。</translation> <translation id="4661075872484491155">ツリー</translation>
diff --git a/chrome/browser/resources/extensions/BUILD.gn b/chrome/browser/resources/extensions/BUILD.gn index 375e5e5..7a60d45 100644 --- a/chrome/browser/resources/extensions/BUILD.gn +++ b/chrome/browser/resources/extensions/BUILD.gn
@@ -115,11 +115,11 @@ js_library("drag_and_drop_handler") { deps = [ + ":service", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr", "//ui/webui/resources/js/cr/ui:drag_wrapper", ] - externs_list = [ "$externs_path/developer_private.js" ] } js_library("drop_overlay") {
diff --git a/chrome/browser/resources/extensions/drag_and_drop_handler.html b/chrome/browser/resources/extensions/drag_and_drop_handler.html index 2626f1e..5e959f2d 100644 --- a/chrome/browser/resources/extensions/drag_and_drop_handler.html +++ b/chrome/browser/resources/extensions/drag_and_drop_handler.html
@@ -1,2 +1,3 @@ <link rel="import" href="chrome://resources/html/cr.html"> +<link rel="import" href="service.html"> <script src="drag_and_drop_handler.js"></script>
diff --git a/chrome/browser/resources/extensions/drag_and_drop_handler.js b/chrome/browser/resources/extensions/drag_and_drop_handler.js index 30bdc57..15324ad 100644 --- a/chrome/browser/resources/extensions/drag_and_drop_handler.js +++ b/chrome/browser/resources/extensions/drag_and_drop_handler.js
@@ -36,7 +36,7 @@ /** @override */ doDragEnter() { - chrome.developerPrivate.notifyDragInstallInProgress(); + extensions.Service.getInstance().notifyDragInstallInProgress(); this.eventTarget_.dispatchEvent( new CustomEvent('extension-drag-started')); } @@ -83,7 +83,7 @@ * @private */ handleFileDrop_() { - chrome.developerPrivate.installDroppedFile(); + extensions.Service.getInstance().installDroppedFile(); } /** @@ -91,15 +91,10 @@ * @private */ handleDirectoryDrop_() { - // TODO(devlin): Update this to use extensions.Service when it's not - // shared between the MD and non-MD pages. - chrome.developerPrivate.loadUnpacked( - {failQuietly: true, populateError: true, useDraggedPath: true}, - (loadError) => { - if (loadError) { - this.eventTarget_.dispatchEvent(new CustomEvent( - 'drag-and-drop-load-error', {detail: loadError})); - } + extensions.Service.getInstance().loadUnpackedFromDrag().catch( + loadError => { + this.eventTarget_.dispatchEvent(new CustomEvent( + 'drag-and-drop-load-error', {detail: loadError})); }); }
diff --git a/chrome/browser/resources/extensions/options_dialog.html b/chrome/browser/resources/extensions/options_dialog.html index 0824582..f31b1c8 100644 --- a/chrome/browser/resources/extensions/options_dialog.html +++ b/chrome/browser/resources/extensions/options_dialog.html
@@ -38,6 +38,12 @@ width: var(--dialog-width); } + cr-dialog::part(wrapper) { + height: 100%; + max-height: initial; + overflow: hidden; + } + cr-dialog { --cr-dialog-body: { height: 100%; @@ -52,11 +58,6 @@ height: 100%; min-height: initial; } - --cr-dialog-wrapper: { - height: 100%; - max-height: initial; - overflow: hidden; - } --scroll-border: none; } </style>
diff --git a/chrome/browser/resources/extensions/service.js b/chrome/browser/resources/extensions/service.js index b6dd8b6b..6ad397e 100644 --- a/chrome/browser/resources/extensions/service.js +++ b/chrome/browser/resources/extensions/service.js
@@ -146,18 +146,22 @@ } /** - * Attempts to load an unpacked extension, optionally as another attempt at - * a previously-specified load. - * @param {string=} opt_retryGuid + * @param {chrome.developerPrivate.LoadUnpackedOptions=} opt_options * @return {!Promise} A signal that loading finished, rejected if any error * occurred. * @private */ - loadUnpackedHelper_(opt_retryGuid) { + loadUnpackedHelper_(opt_options) { return new Promise(function(resolve, reject) { + const options = Object.assign( + { + failQuietly: true, + populateError: true, + }, + opt_options); + chrome.developerPrivate.loadUnpacked( - {failQuietly: true, populateError: true, retryGuid: opt_retryGuid}, - (loadError) => { + options, (loadError) => { if (chrome.runtime.lastError && chrome.runtime.lastError.message != 'File selection was canceled.') { @@ -290,7 +294,9 @@ /** @override */ retryLoadUnpacked(retryGuid) { - return this.loadUnpackedHelper_(retryGuid); + // Attempt to load an unpacked extension, optionally as another attempt at + // a previously-specified load. + return this.loadUnpackedHelper_({retryGuid: retryGuid}); } /** @override */ @@ -428,6 +434,22 @@ a.download = fileName; a.click(); } + + /** + * Attempts to load an unpacked extension via a drag-n-drop gesture. + * @return {!Promise} + */ + loadUnpackedFromDrag() { + return this.loadUnpackedHelper_({useDraggedPath: true}); + } + + installDroppedFile() { + chrome.developerPrivate.installDroppedFile(); + } + + notifyDragInstallInProgress() { + chrome.developerPrivate.notifyDragInstallInProgress(); + } } cr.addSingletonGetter(Service);
diff --git a/chrome/browser/resources/print_preview/cloud_print_interface_js.js b/chrome/browser/resources/print_preview/cloud_print_interface_js.js index 553a082..96361c6c3 100644 --- a/chrome/browser/resources/print_preview/cloud_print_interface_js.js +++ b/chrome/browser/resources/print_preview/cloud_print_interface_js.js
@@ -198,29 +198,35 @@ * @private */ buildRequest_(method, action, params, origin, account, callback) { - let url = this.baseUrl_ + '/' + action + '?xsrf='; + const url = new URL(this.baseUrl_ + '/' + action); + const searchParams = url.searchParams; if (origin == print_preview.DestinationOrigin.COOKIES) { const xsrfToken = this.xsrfTokens_[account]; if (!xsrfToken) { + searchParams.append('xsrf', ''); // TODO(rltoscano): Should throw an error if not a read-only action or // issue an xsrf token request. } else { - url = url + xsrfToken; + searchParams.append('xsrf', xsrfToken); } if (account) { const index = this.userSessionIndex_[account] || 0; if (index > 0) { - url += '&authuser=' + index; + searchParams.append('authuser', index.toString()); } } + } else { + searchParams.append('xsrf', ''); } + + // Add locale + searchParams.append('hl', window.navigator.language); let body = null; if (params) { if (method == 'GET') { - url = params.reduce(function(partialUrl, param) { - return partialUrl + '&' + param.name + '=' + - encodeURIComponent(param.value); - }, url); + params.forEach(param => { + searchParams.append(param.name, encodeURIComponent(param.value)); + }); } else if (method == 'POST') { body = params.reduce(function(partialBody, param) { return partialBody + 'Content-Disposition: form-data; name=\"' + @@ -239,7 +245,7 @@ } const xhr = new XMLHttpRequest(); - xhr.open(method, url, true); + xhr.open(method, url.toString(), true); xhr.withCredentials = (origin == print_preview.DestinationOrigin.COOKIES); for (const header in headers) { xhr.setRequestHeader(header, headers[header]);
diff --git a/chrome/browser/resources/print_preview/ui/destination_dialog.html b/chrome/browser/resources/print_preview/ui/destination_dialog.html index 85f1d20..5e5301e 100644 --- a/chrome/browser/resources/print_preview/ui/destination_dialog.html +++ b/chrome/browser/resources/print_preview/ui/destination_dialog.html
@@ -42,10 +42,11 @@ width: calc(100vw - 2 * var(--print-preview-dialog-margin)); } + #dialog::part(wrapper) { + height: calc(100vh - 2 * var(--print-preview-dialog-margin)); + } + #dialog { - --cr-dialog-wrapper: { - height: calc(100vh - 2 * var(--print-preview-dialog-margin)); - }; --cr-dialog-body-container: { flex: 1; };
diff --git a/chrome/browser/resources/print_preview/ui/print_preview_shared_css.html b/chrome/browser/resources/print_preview/ui/print_preview_shared_css.html index b4de0e7..3ba2c31 100644 --- a/chrome/browser/resources/print_preview/ui/print_preview_shared_css.html +++ b/chrome/browser/resources/print_preview/ui/print_preview_shared_css.html
@@ -55,12 +55,13 @@ } /* Default print preview dialog styles. */ + cr-dialog::part(wrapper) { + max-height: calc(100vh - 68px); + max-width: 100%; + width: calc(100vw - 68px); + } + cr-dialog { - --cr-dialog-wrapper: { - max-height: calc(100vh - 68px); - width: calc(100vw - 68px); - max-width: 100%; - }; --cr-dialog-body: { box-sizing: border-box; padding-inline-end: 20px;
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn index 22604a5..b03d7a1 100644 --- a/chrome/browser/safe_browsing/BUILD.gn +++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -102,6 +102,7 @@ "//components/safe_browsing/db:whitelist_checker_client", "//components/safe_browsing/password_protection", "//components/safe_browsing/triggers", + "//components/safe_browsing/triggers:ad_popup_trigger", "//components/safe_browsing/triggers:ad_sampler_trigger", "//components/safe_browsing/triggers:suspicious_site_trigger", "//components/safe_browsing/triggers:trigger_throttler",
diff --git a/chrome/browser/safe_browsing/trigger_creator.cc b/chrome/browser/safe_browsing/trigger_creator.cc index 94765c2..3208dc2 100644 --- a/chrome/browser/safe_browsing/trigger_creator.cc +++ b/chrome/browser/safe_browsing/trigger_creator.cc
@@ -9,6 +9,8 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "components/prefs/pref_service.h" +#include "components/safe_browsing/features.h" +#include "components/safe_browsing/triggers/ad_popup_trigger.h" #include "components/safe_browsing/triggers/ad_sampler_trigger.h" #include "components/safe_browsing/triggers/suspicious_site_trigger.h" #include "components/safe_browsing/triggers/trigger_manager.h" @@ -57,6 +59,13 @@ HistoryServiceFactory::GetForProfile( profile, ServiceAccessType::EXPLICIT_ACCESS)); } + if (base::FeatureList::IsEnabled(kAdPopupTriggerFeature) && + trigger_manager->CanStartDataCollection(options, TriggerType::AD_POPUP)) { + safe_browsing::AdPopupTrigger::CreateForWebContents( + web_contents, trigger_manager, profile->GetPrefs(), url_loader_factory, + HistoryServiceFactory::GetForProfile( + profile, ServiceAccessType::EXPLICIT_ACCESS)); + } TriggerManagerReason reason; if (trigger_manager->CanStartDataCollectionWithReason( options, TriggerType::SUSPICIOUS_SITE, &reason) ||
diff --git a/chrome/browser/ssl/security_state_tab_helper.cc b/chrome/browser/ssl/security_state_tab_helper.cc index 83bfd274..703c2e6 100644 --- a/chrome/browser/ssl/security_state_tab_helper.cc +++ b/chrome/browser/ssl/security_state_tab_helper.cc
@@ -209,8 +209,10 @@ case safe_browsing::SB_THREAT_TYPE_SUBRESOURCE_FILTER: case safe_browsing::SB_THREAT_TYPE_CSD_WHITELIST: case safe_browsing::SB_THREAT_TYPE_AD_SAMPLE: + case safe_browsing::SB_THREAT_TYPE_BLOCKED_AD_POPUP: case safe_browsing::SB_THREAT_TYPE_SUSPICIOUS_SITE: case safe_browsing::SB_THREAT_TYPE_APK_DOWNLOAD: + case safe_browsing::SB_THREAT_TYPE_HIGH_CONFIDENCE_ALLOWLIST: // These threat types are not currently associated with // interstitials, and thus resources with these threat types are // not ever whitelisted or pending whitelisting.
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 70d4d12..a504487 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -476,6 +476,7 @@ "//components/safe_browsing/db:database_manager", "//components/safe_browsing/db:util", "//components/safe_browsing/password_protection", + "//components/safe_browsing/triggers:ad_popup_trigger", "//components/safe_browsing/web_ui", "//components/search", "//components/search_engines", @@ -2393,6 +2394,10 @@ if (use_dbus) { sources += [ + "views/status_icons/concat_menu_model.cc", + "views/status_icons/concat_menu_model.h", + "views/status_icons/dbus_menu.cc", + "views/status_icons/dbus_menu.h", "views/status_icons/dbus_properties_interface.cc", "views/status_icons/dbus_properties_interface.h", "views/status_icons/dbus_types.cc",
diff --git a/chrome/browser/ui/android/context_menu_helper.cc b/chrome/browser/ui/android/context_menu_helper.cc index 462140c..e5308ae 100644 --- a/chrome/browser/ui/android/context_menu_helper.cc +++ b/chrome/browser/ui/android/context_menu_helper.cc
@@ -140,12 +140,6 @@ GURL sanitizedReferrer = (params.frame_url.is_empty() ? params.page_url : params.frame_url).GetAsReferrer(); - std::map<std::string, std::string>::const_iterator it = - params.properties.find( - data_reduction_proxy::chrome_proxy_content_transform_header()); - bool image_was_fetched_lo_fi = - it != params.properties.end() && - it->second == data_reduction_proxy::empty_image_directive(); bool can_save = params.media_flags & blink::WebContextMenuData::kMediaCanSave; JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef<jobject> jmenu_info = @@ -157,7 +151,6 @@ ConvertUTF8ToJavaString(env, params.unfiltered_link_url.spec()), ConvertUTF8ToJavaString(env, params.src_url.spec()), ConvertUTF16ToJavaString(env, params.title_text), - image_was_fetched_lo_fi, ConvertUTF8ToJavaString(env, sanitizedReferrer.spec()), static_cast<int>(params.referrer_policy), can_save, params.x, params.y, params.source_type);
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc index b72c3f5f..038fffb5 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -40,6 +40,7 @@ #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/crostini/crostini_test_helper.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" +#include "chrome/browser/chromeos/file_manager/app_id.h" #include "chrome/browser/chromeos/login/demo_mode/demo_mode_test_helper.h" #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/browser/extensions/extension_service.h" @@ -4509,3 +4510,16 @@ .app_id, item.id.app_id); } + +// Tests behavior for ensuring some component apps can be marked unpinnable. +TEST_F(ChromeLauncherControllerTest, UnpinnableComponentApps) { + InitLauncherController(); + + const char* kPinnableApp = file_manager::kFileManagerAppId; + const char* kUnpinnableApp = file_manager::kGalleryAppId; + + EXPECT_EQ(AppListControllerDelegate::PIN_EDITABLE, + GetPinnableForAppID(kPinnableApp, profile())); + EXPECT_EQ(AppListControllerDelegate::NO_PIN, + GetPinnableForAppID(kUnpinnableApp, profile())); +}
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.cc index 90f15a3..81c6e3a9 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h" +#include "base/stl_util.h" +#include "chrome/browser/chromeos/file_manager/app_id.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" @@ -27,6 +29,17 @@ AppListControllerDelegate::Pinnable GetPinnableForAppID( const std::string& app_id, Profile* profile) { + // These file manager apps have a shelf presence, but can only be launched + // when provided a filename to open. Pinning them creates an item that does + // nothing. + const char* kUnpinnableAppIds[] = { + file_manager::kVideoPlayerAppId, + file_manager::kGalleryAppId, + file_manager::kAudioPlayerAppId, + }; + if (base::Contains(kUnpinnableAppIds, app_id)) + return AppListControllerDelegate::NO_PIN; + const base::ListValue* pref = profile->GetPrefs()->GetList(prefs::kPolicyPinnedLauncherApps); if (!pref)
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 9b106e4..d6a1fda 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -366,7 +366,7 @@ #endif } -void ChromeAutofillClient::CreditCardUploadCompleted() { +void ChromeAutofillClient::CreditCardUploadCompleted(bool card_saved) { #if defined(OS_ANDROID) // TODO(hozhng@): Placeholder for Clank Notification. #else @@ -376,10 +376,11 @@ } // Do lazy initialization of SaveCardBubbleControllerImpl. - // TODO(crbug.com/964127): Add success branch. autofill::SaveCardBubbleControllerImpl::CreateForWebContents(web_contents()); - autofill::SaveCardBubbleControllerImpl::FromWebContents(web_contents()) - ->UpdateIconForSaveCardFailure(); + SaveCardBubbleControllerImpl* controller = + autofill::SaveCardBubbleControllerImpl::FromWebContents(web_contents()); + card_saved ? controller->UpdateIconForSaveCardSuccess() + : controller->UpdateIconForSaveCardFailure(); #endif }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index 77d3013..f58da06 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -100,7 +100,7 @@ std::unique_ptr<base::DictionaryValue> legal_message, SaveCreditCardOptions options, UploadSaveCardPromptCallback callback) override; - void CreditCardUploadCompleted() override; + void CreditCardUploadCompleted(bool card_saved) override; void ConfirmCreditCardFillAssist(const CreditCard& card, base::OnceClosure callback) override; bool HasCreditCardScanFeature() override;
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc index 796f1e16..d8888dd7 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
@@ -164,6 +164,11 @@ ShowBubble(); } +void SaveCardBubbleControllerImpl::UpdateIconForSaveCardSuccess() { + // TODO(crbug.com/964127): Dismisses the icon and triggers a highlight + // animation of the avatar button. +} + void SaveCardBubbleControllerImpl::UpdateIconForSaveCardFailure() { current_bubble_type_ = BubbleType::FAILURE; ShowIconOnly();
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h index 1d95530..b24341e4a9 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
@@ -85,6 +85,10 @@ // just saved and links the user to manage their other cards. void ShowBubbleForManageCardsForTesting(const CreditCard& card); + // Update the icon when card is successfully saved. This will dismiss the icon + // and trigger a highlight animation of the avatar button. + void UpdateIconForSaveCardSuccess(); + // Updates the save card icon when credit card upload failed. This will only // update the icon image and stop icon from animating. The actual bubble will // be shown when users click on the icon.
diff --git a/chrome/browser/ui/blocked_content/popup_blocker.cc b/chrome/browser/ui/blocked_content/popup_blocker.cc index 826490b..950bc0db 100644 --- a/chrome/browser/ui/blocked_content/popup_blocker.cc +++ b/chrome/browser/ui/blocked_content/popup_blocker.cc
@@ -14,6 +14,7 @@ #include "chrome/common/chrome_switches.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" +#include "components/safe_browsing/triggers/ad_popup_trigger.h" #include "content/public/browser/page_navigator.h" #include "content/public/browser/web_contents.h" @@ -91,7 +92,33 @@ auto* popup_blocker = PopupBlockerTabHelper::FromWebContents(web_contents); if (popup_blocker && block_type != PopupBlockType::kNotBlocked) { popup_blocker->AddBlockedPopup(params, window_features, block_type); + if (safe_browsing::AdPopupTrigger::FromWebContents(web_contents)) { + content::RenderFrameHost* source_frame = + GetSourceFrameForPopup(params, open_url_params, web_contents); + safe_browsing::AdPopupTrigger::FromWebContents(web_contents) + ->PopupWasBlocked(source_frame); + } return true; } return false; } + +content::RenderFrameHost* GetSourceFrameForPopup( + NavigateParams* params, + const content::OpenURLParams* open_url_params, + content::WebContents* web_contents) { + if (params->opener) + return params->opener; + // Make sure the source render frame host is alive before we attempt to + // retrieve it from |open_url_params|. + if (open_url_params) { + content::RenderFrameHost* source = content::RenderFrameHost::FromID( + open_url_params->source_render_frame_id, + open_url_params->source_render_process_id); + if (source) + return source; + } + // The focused frame is not always the frame initiating the popup navigation + // and is used as a fallback in case opener information is not available. + return web_contents->GetFocusedFrame(); +}
diff --git a/chrome/browser/ui/blocked_content/popup_blocker.h b/chrome/browser/ui/blocked_content/popup_blocker.h index 1cb99b9..c926be6 100644 --- a/chrome/browser/ui/blocked_content/popup_blocker.h +++ b/chrome/browser/ui/blocked_content/popup_blocker.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_BLOCKED_CONTENT_POPUP_BLOCKER_H_ #include "base/optional.h" +#include "content/public/browser/render_frame_host.h" #include "third_party/blink/public/mojom/window_features/window_features.mojom.h" #include "ui/base/window_open_disposition.h" #include "url/gurl.h" @@ -48,4 +49,11 @@ const content::OpenURLParams* open_url_params, const blink::mojom::WindowFeatures& window_features); +// Tries to get the opener from either the |params| or |open_url_params|, +// otherwise uses the focused frame from |web_contents| as a proxy. +content::RenderFrameHost* GetSourceFrameForPopup( + NavigateParams* params, + const content::OpenURLParams* open_url_params, + content::WebContents* web_contents); + #endif // CHROME_BROWSER_UI_BLOCKED_CONTENT_POPUP_BLOCKER_H_
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc index 50e7c52..a9c3d01 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
@@ -379,6 +379,15 @@ #endif } +#if defined(OS_WIN) +int BrowserNonClientFrameView::GetSystemMenuY() const { + if (!browser_view()->IsTabStripVisible()) + return GetTopInset(false); + return GetBoundsForTabStripRegion(browser_view()->tabstrip()).bottom() - + GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP); +} +#endif + void BrowserNonClientFrameView::MaybeObserveTabstrip() { if (browser_view_->tabstrip()) { DCHECK(!tab_strip_observer_.IsObserving(browser_view_->tabstrip()));
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h index 81b7db40..fcab0ed 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
@@ -172,6 +172,11 @@ } private: + // views::NonClientFrameView: +#if defined(OS_WIN) + int GetSystemMenuY() const override; +#endif + void MaybeObserveTabstrip(); // Gets a theme provider that should be non-null even before we're added to a
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc index ecf4131a..57f7aeb7 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -130,8 +130,12 @@ waiter.Wait(); } -void ToggleOverview() { - ash::Shell::Get()->overview_controller()->ToggleOverview(); +void StartOverview() { + ash::Shell::Get()->overview_controller()->StartOverview(); +} + +void EndOverview() { + ash::Shell::Get()->overview_controller()->EndOverview(); } bool IsShelfVisible() { @@ -906,9 +910,9 @@ SetUpHostedApp(); EXPECT_TRUE(hosted_app_button_container_->GetVisible()); - ToggleOverview(); + StartOverview(); EXPECT_FALSE(hosted_app_button_container_->GetVisible()); - ToggleOverview(); + EndOverview(); EXPECT_TRUE(hosted_app_button_container_->GetVisible()); } @@ -1260,17 +1264,17 @@ aura::client::kResizeBehaviorCanResize); EXPECT_TRUE(frame_view->caption_button_container_->GetVisible()); - ToggleOverview(); + StartOverview(); EXPECT_FALSE(frame_view->caption_button_container_->GetVisible()); - ToggleOverview(); + EndOverview(); EXPECT_TRUE(frame_view->caption_button_container_->GetVisible()); ASSERT_NO_FATAL_FAILURE( ash::ShellTestApi().SetTabletModeEnabledForTest(true)); EXPECT_FALSE(frame_view->caption_button_container_->GetVisible()); - ToggleOverview(); + StartOverview(); EXPECT_FALSE(frame_view->caption_button_container_->GetVisible()); - ToggleOverview(); + EndOverview(); EXPECT_FALSE(frame_view->caption_button_container_->GetVisible()); ash::Shell::Get()->split_view_controller()->SnapWindow( widget->GetNativeWindow(), ash::SplitViewController::LEFT); @@ -1295,17 +1299,17 @@ aura::client::kResizeBehaviorKey, aura::client::kResizeBehaviorCanMaximize | aura::client::kResizeBehaviorCanResize); - ToggleOverview(); + StartOverview(); EXPECT_FALSE(frame_view2->caption_button_container_->GetVisible()); - ToggleOverview(); + EndOverview(); EXPECT_TRUE(frame_view2->caption_button_container_->GetVisible()); ASSERT_NO_FATAL_FAILURE( ash::ShellTestApi().SetTabletModeEnabledForTest(true)); - ToggleOverview(); + StartOverview(); EXPECT_FALSE(frame_view2->caption_button_container_->GetVisible()); - ToggleOverview(); + EndOverview(); EXPECT_TRUE(frame_view2->caption_button_container_->GetVisible()); ash::Shell::Get()->split_view_controller()->SnapWindow( @@ -1373,7 +1377,7 @@ // The kTopViewInset is the same as in overview mode. const int inset_normal = window->GetProperty(aura::client::kTopViewInset); - ToggleOverview(); + StartOverview(); const int inset_in_overview_mode = window->GetProperty(aura::client::kTopViewInset); EXPECT_EQ(inset_normal, inset_in_overview_mode); @@ -1410,9 +1414,9 @@ ash::ShellTestApi().SetTabletModeEnabledForTest(true)); EXPECT_FALSE(frame_view->caption_button_container_->GetVisible()); - ToggleOverview(); + StartOverview(); EXPECT_FALSE(frame_view->caption_button_container_->GetVisible()); - ToggleOverview(); + EndOverview(); EXPECT_FALSE(frame_view->caption_button_container_->GetVisible()); ASSERT_NO_FATAL_FAILURE( @@ -1443,9 +1447,9 @@ EXPECT_TRUE(frame_view->caption_button_container_->GetVisible()); // However, overview mode does. - ToggleOverview(); + StartOverview(); EXPECT_FALSE(frame_view->caption_button_container_->GetVisible()); - ToggleOverview(); + EndOverview(); EXPECT_TRUE(frame_view->caption_button_container_->GetVisible()); ASSERT_NO_FATAL_FAILURE(
diff --git a/chrome/browser/ui/views/status_icons/concat_menu_model.cc b/chrome/browser/ui/views/status_icons/concat_menu_model.cc new file mode 100644 index 0000000..44f29f7 --- /dev/null +++ b/chrome/browser/ui/views/status_icons/concat_menu_model.cc
@@ -0,0 +1,111 @@ +// 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/ui/views/status_icons/concat_menu_model.h" + +ConcatMenuModel::ConcatMenuModel(ui::MenuModel* m1, ui::MenuModel* m2) + : m1_(m1), m2_(m2) {} + +ConcatMenuModel::~ConcatMenuModel() = default; + +bool ConcatMenuModel::HasIcons() const { + return m1_->HasIcons() || m2_->HasIcons(); +} + +int ConcatMenuModel::GetItemCount() const { + return m1_->GetItemCount() + m2_->GetItemCount(); +} + +ui::MenuModel::ItemType ConcatMenuModel::GetTypeAt(int index) const { + return GetterImpl(&ui::MenuModel::GetTypeAt, index); +} + +ui::MenuSeparatorType ConcatMenuModel::GetSeparatorTypeAt(int index) const { + return GetterImpl(&ui::MenuModel::GetSeparatorTypeAt, index); +} + +int ConcatMenuModel::GetCommandIdAt(int index) const { + return GetterImpl(&ui::MenuModel::GetCommandIdAt, index); +} + +base::string16 ConcatMenuModel::GetLabelAt(int index) const { + return GetterImpl(&ui::MenuModel::GetLabelAt, index); +} + +base::string16 ConcatMenuModel::GetSublabelAt(int index) const { + return GetterImpl(&ui::MenuModel::GetSublabelAt, index); +} + +base::string16 ConcatMenuModel::GetMinorTextAt(int index) const { + return GetterImpl(&ui::MenuModel::GetMinorTextAt, index); +} + +const gfx::VectorIcon* ConcatMenuModel::GetMinorIconAt(int index) const { + return GetterImpl(&ui::MenuModel::GetMinorIconAt, index); +} + +bool ConcatMenuModel::IsItemDynamicAt(int index) const { + return GetterImpl(&ui::MenuModel::IsItemDynamicAt, index); +} + +bool ConcatMenuModel::GetAcceleratorAt(int index, + ui::Accelerator* accelerator) const { + return GetterImpl(&ui::MenuModel::GetAcceleratorAt, index, accelerator); +} + +bool ConcatMenuModel::IsItemCheckedAt(int index) const { + return GetterImpl(&ui::MenuModel::IsItemCheckedAt, index); +} + +int ConcatMenuModel::GetGroupIdAt(int index) const { + return GetterImpl(&ui::MenuModel::GetGroupIdAt, index); +} + +bool ConcatMenuModel::GetIconAt(int index, gfx::Image* icon) { + return GetterImpl(&ui::MenuModel::GetGroupIdAt, index); +} + +ui::ButtonMenuItemModel* ConcatMenuModel::GetButtonMenuItemAt(int index) const { + return GetterImpl(&ui::MenuModel::GetButtonMenuItemAt, index); +} + +bool ConcatMenuModel::IsEnabledAt(int index) const { + return GetterImpl(&ui::MenuModel::IsEnabledAt, index); +} + +bool ConcatMenuModel::IsVisibleAt(int index) const { + return GetterImpl(&ui::MenuModel::IsVisibleAt, index); +} + +void ConcatMenuModel::ActivatedAt(int index) { + GetMenuAndIndex(&index)->ActivatedAt(index); +} + +void ConcatMenuModel::ActivatedAt(int index, int event_flags) { + GetMenuAndIndex(&index)->ActivatedAt(index, event_flags); +} + +ui::MenuModel* ConcatMenuModel::GetSubmenuModelAt(int index) const { + return GetterImpl(&ui::MenuModel::GetSubmenuModelAt, index); +} + +void ConcatMenuModel::MenuWillShow() { + m1_->MenuWillShow(); + m2_->MenuWillShow(); +} + +void ConcatMenuModel::MenuWillClose() { + m1_->MenuWillClose(); + m2_->MenuWillClose(); +} + +ui::MenuModel* ConcatMenuModel::GetMenuAndIndex(int* index) const { + int m1_count = m1_->GetItemCount(); + if (*index < m1_count) + return m1_; + + DCHECK_LT(*index - m1_count, m2_->GetItemCount()); + *index -= m1_count; + return m2_; +}
diff --git a/chrome/browser/ui/views/status_icons/concat_menu_model.h b/chrome/browser/ui/views/status_icons/concat_menu_model.h new file mode 100644 index 0000000..7b4f695 --- /dev/null +++ b/chrome/browser/ui/views/status_icons/concat_menu_model.h
@@ -0,0 +1,59 @@ +// 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_VIEWS_STATUS_ICONS_CONCAT_MENU_MODEL_H_ +#define CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_CONCAT_MENU_MODEL_H_ + +#include <utility> + +#include "base/macros.h" +#include "ui/base/models/menu_model.h" + +// Combines two menu models (without using submenus). +class ConcatMenuModel : public ui::MenuModel { + public: + ConcatMenuModel(ui::MenuModel* m1, ui::MenuModel* m2); + ~ConcatMenuModel() override; + + // MenuModel: + bool HasIcons() const override; + int GetItemCount() const override; + ItemType GetTypeAt(int index) const override; + ui::MenuSeparatorType GetSeparatorTypeAt(int index) const override; + int GetCommandIdAt(int index) const override; + base::string16 GetLabelAt(int index) const override; + base::string16 GetSublabelAt(int index) const override; + base::string16 GetMinorTextAt(int index) const override; + const gfx::VectorIcon* GetMinorIconAt(int index) const override; + bool IsItemDynamicAt(int index) const override; + bool GetAcceleratorAt(int index, ui::Accelerator* accelerator) const override; + bool IsItemCheckedAt(int index) const override; + int GetGroupIdAt(int index) const override; + bool GetIconAt(int index, gfx::Image* icon) override; + ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override; + bool IsEnabledAt(int index) const override; + bool IsVisibleAt(int index) const override; + void ActivatedAt(int index) override; + void ActivatedAt(int index, int event_flags) override; + MenuModel* GetSubmenuModelAt(int index) const override; + void MenuWillShow() override; + void MenuWillClose() override; + + private: + template <typename F, typename... Ts> + auto GetterImpl(F&& f, int index, Ts&&... args) const { + return (GetMenuAndIndex(&index)->*f)(index, args...); + } + + // Returns either |m1_| or |m2_| for the input |index|. |index| will be + // adjusted for the returned menu. + ui::MenuModel* GetMenuAndIndex(int* index) const; + + ui::MenuModel* const m1_; + ui::MenuModel* const m2_; + + DISALLOW_COPY_AND_ASSIGN(ConcatMenuModel); +}; + +#endif // CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_CONCAT_MENU_MODEL_H_
diff --git a/chrome/browser/ui/views/status_icons/dbus_menu.cc b/chrome/browser/ui/views/status_icons/dbus_menu.cc new file mode 100644 index 0000000..b0c4ec2 --- /dev/null +++ b/chrome/browser/ui/views/status_icons/dbus_menu.cc
@@ -0,0 +1,537 @@ +// 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/ui/views/status_icons/dbus_menu.h" + +#include <limits> +#include <memory> + +#include "base/bind.h" +#include "base/callback.h" +#include "base/i18n/rtl.h" +#include "base/memory/ref_counted_memory.h" +#include "base/memory/scoped_refptr.h" +#include "base/stl_util.h" +#include "base/strings/utf_string_conversions.h" +#include "chrome/browser/ui/views/status_icons/dbus_properties_interface.h" +#include "chrome/browser/ui/views/status_icons/dbus_types.h" +#include "chrome/browser/ui/views/status_icons/success_barrier_callback.h" +#include "ui/base/accelerators/accelerator.h" +#include "ui/base/accelerators/menu_label_accelerator_util_linux.h" +#include "ui/base/models/menu_model.h" +#include "ui/base/models/simple_menu_model.h" + +namespace { + +// Interfaces. +const char kInterfaceDbusMenu[] = "com.canonical.dbusmenu"; + +// Methods. +const char kMethodAboutToShow[] = "AboutToShow"; +const char kMethodAboutToShowGroup[] = "AboutToShowGroup"; +const char kMethodEvent[] = "Event"; +const char kMethodEventGroup[] = "EventGroup"; +const char kMethodGetGroupProperties[] = "GetGroupProperties"; +const char kMethodGetLayout[] = "GetLayout"; +const char kMethodGetProperty[] = "GetProperty"; + +// Properties. +const char kPropertyIconThemePath[] = "IconThemePath"; +const char kPropertyMenuStatus[] = "Status"; +const char kPropertyTextDirection[] = "TextDirection"; +const char kPropertyVersion[] = "Version"; + +// Property values. +const char kPropertyValueStatusNormal[] = "normal"; +uint32_t kPropertyValueVersion = 3; + +// Signals. +const char kSignalLayoutUpdated[] = "LayoutUpdated"; + +// Creates a variant with the default value for |property_name|, or an empty +// variant if |property_name| is invalid. +DbusVariant CreateDefaultPropertyValue(const std::string& property_name) { + if (property_name == "type") + return MakeDbusVariant(DbusString("standard")); + if (property_name == "label") + return MakeDbusVariant(DbusString("")); + if (property_name == "enabled") + return MakeDbusVariant(DbusBoolean(true)); + if (property_name == "visible") + return MakeDbusVariant(DbusBoolean(true)); + if (property_name == "icon-name") + return MakeDbusVariant(DbusString("")); + if (property_name == "icon-data") + return MakeDbusVariant(DbusByteArray()); + if (property_name == "shortcut") + return MakeDbusVariant(DbusArray<DbusArray<DbusString>>()); + if (property_name == "toggle-type") + return MakeDbusVariant(DbusString("")); + if (property_name == "toggle-state") + return MakeDbusVariant(DbusInt32(-1)); + if (property_name == "children-display") + return MakeDbusVariant(DbusString("")); + return DbusVariant(); +} + +DbusString DbusTextDirection() { + return DbusString(base::i18n::IsRTL() ? "rtl " : "ltr"); +} + +} // namespace + +DbusMenu::MenuItem::MenuItem(int32_t id, + std::map<std::string, DbusVariant>&& properties, + std::vector<int32_t>&& children, + ui::MenuModel* menu, + ui::MenuModel* containing_menu, + int containing_menu_index) + : id(id), + properties(std::move(properties)), + children(std::move(children)), + menu(menu), + containing_menu(containing_menu), + containing_menu_index(containing_menu_index) {} + +DbusMenu::MenuItem::~MenuItem() = default; + +DbusMenu::ScopedMethodResponse::ScopedMethodResponse( + dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender* response_sender) + : method_call_(method_call), + response_sender_(response_sender), + reader_(method_call_) {} + +DbusMenu::ScopedMethodResponse::~ScopedMethodResponse() { + response_sender_->Run(std::move(response_)); +} + +dbus::MessageWriter& DbusMenu::ScopedMethodResponse::Writer() { + EnsureResponse(); + if (!writer_) + writer_ = std::make_unique<dbus::MessageWriter>(response_.get()); + return *writer_; +} + +void DbusMenu::ScopedMethodResponse::EnsureResponse() { + if (!response_) + response_ = dbus::Response::FromMethodCall(method_call_); +} + +DbusMenu::DbusMenu(dbus::ExportedObject* exported_object, + InitializedCallback callback) + : menu_(exported_object), weak_factory_(this) { + SetModel(nullptr, false); + + static constexpr struct { + const char* name; + void (DbusMenu::*callback)(ScopedMethodResponse*); + } methods[7] = { + {kMethodAboutToShow, &DbusMenu::OnAboutToShow}, + {kMethodAboutToShowGroup, &DbusMenu::OnAboutToShowGroup}, + {kMethodEvent, &DbusMenu::OnEvent}, + {kMethodEventGroup, &DbusMenu::OnEventGroup}, + {kMethodGetGroupProperties, &DbusMenu::OnGetGroupProperties}, + {kMethodGetLayout, &DbusMenu::OnGetLayout}, + {kMethodGetProperty, &DbusMenu::OnGetProperty}, + }; + + // base::size(methods) calls for method export, 1 call for properties + // initialization. + barrier_ = + SuccessBarrierCallback(base::size(methods) + 1, std::move(callback)); + for (const auto& method : methods) { + menu_->ExportMethod( + kInterfaceDbusMenu, method.name, + WrapMethodCallback( + base::BindRepeating(method.callback, weak_factory_.GetWeakPtr())), + base::BindRepeating(&DbusMenu::OnExported, weak_factory_.GetWeakPtr())); + } + + properties_ = std::make_unique<DbusPropertiesInterface>(menu_, barrier_); + properties_->RegisterInterface(kInterfaceDbusMenu); + auto set_property = [&](const std::string& property_name, auto&& value) { + properties_->SetProperty(kInterfaceDbusMenu, property_name, + std::move(value), false); + }; + set_property(kPropertyIconThemePath, DbusArray<DbusString>()); + set_property(kPropertyMenuStatus, DbusString(kPropertyValueStatusNormal)); + set_property(kPropertyTextDirection, DbusTextDirection()); + set_property(kPropertyVersion, DbusUint32(kPropertyValueVersion)); +} + +DbusMenu::~DbusMenu() = default; + +void DbusMenu::SetModel(ui::MenuModel* model, bool send_signal) { + items_.clear(); + + if (model) { + std::map<std::string, DbusVariant> properties; + properties["children-display"] = MakeDbusVariant(DbusString("submenu")); + items_[0] = std::make_unique<MenuItem>( + 0, std::move(properties), ConvertMenu(model), nullptr, nullptr, -1); + } else { + items_[0] = std::make_unique<MenuItem>( + 0, std::map<std::string, DbusVariant>(), std::vector<int32_t>(), + nullptr, nullptr, -1); + } + + if (send_signal) { + dbus::Signal signal(kInterfaceDbusMenu, kSignalLayoutUpdated); + dbus::MessageWriter writer(&signal); + writer.AppendUint32(++revision_); // Revision of the new layout. + writer.AppendInt32(0); // Parent item whose layout changed. + menu_->SendSignal(&signal); + } +} + +// static +dbus::ExportedObject::MethodCallCallback DbusMenu::WrapMethodCallback( + base::RepeatingCallback<void(ScopedMethodResponse*)> callback) { + return base::BindRepeating( + [](base::RepeatingCallback<void(ScopedMethodResponse*)> bound_callback, + dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender response_sender) { + ScopedMethodResponse response(method_call, &response_sender); + bound_callback.Run(&response); + }, + callback); +} + +void DbusMenu::OnExported(const std::string& interface_name, + const std::string& method_name, + bool success) { + barrier_.Run(success); +} + +void DbusMenu::OnAboutToShow(ScopedMethodResponse* response) { + int32_t id; + if (!response->reader().PopInt32(&id)) + return; + + if (!AboutToShowImpl(id)) + return; + + response->Writer().AppendBool(false); +} + +void DbusMenu::OnAboutToShowGroup(ScopedMethodResponse* response) { + dbus::MessageReader array_reader(nullptr); + if (!response->reader().PopArray(&array_reader)) + return; + std::vector<int32_t> ids; + while (array_reader.HasMoreData()) { + int32_t id; + if (!array_reader.PopInt32(&id)) + return; + ids.push_back(id); + } + + std::vector<int32_t> id_errors; + for (int32_t id : ids) { + if (!AboutToShowImpl(id)) + id_errors.push_back(id); + } + + // IDs of updates needed (none). + response->Writer().AppendArrayOfInt32s(nullptr, 0); + // Invalid IDs. + response->Writer().AppendArrayOfInt32s(id_errors.data(), id_errors.size()); +} + +void DbusMenu::OnEvent(ScopedMethodResponse* response) { + if (!EventImpl(&response->reader(), nullptr)) + return; + + response->EnsureResponse(); +} + +void DbusMenu::OnEventGroup(ScopedMethodResponse* response) { + dbus::MessageReader array_reader(nullptr); + if (!response->reader().PopArray(&array_reader)) + return; + std::vector<int32_t> id_errors; + while (array_reader.HasMoreData()) { + dbus::MessageReader struct_reader(nullptr); + array_reader.PopStruct(&struct_reader); + + int32_t id_error = -1; + if (!EventImpl(&struct_reader, &id_error)) { + if (id_error < 0) + return; + id_errors.push_back(id_error); + } + } + + response->Writer().AppendArrayOfInt32s(id_errors.data(), id_errors.size()); +} + +void DbusMenu::OnGetGroupProperties(ScopedMethodResponse* response) { + dbus::MessageReader id_reader(nullptr); + if (!response->reader().PopArray(&id_reader)) + return; + std::set<int32_t> ids; + while (id_reader.HasMoreData()) { + int32_t id; + if (!id_reader.PopInt32(&id)) + return; + ids.insert(id); + } + + std::set<std::string> property_filter; + dbus::MessageReader property_reader(nullptr); + if (!response->reader().PopArray(&property_reader)) + return; + while (property_reader.HasMoreData()) { + std::string property; + if (!property_reader.PopString(&property)) + return; + property_filter.insert(property); + } + + dbus::MessageWriter& writer = response->Writer(); + dbus::MessageWriter item_writer(nullptr); + writer.OpenArray("(ia{sv})", &item_writer); + for (const auto& item_pair : items_) { + if (!ids.empty() && !base::Contains(ids, item_pair.first)) + continue; + dbus::MessageWriter struct_writer(nullptr); + item_writer.OpenStruct(&struct_writer); + struct_writer.AppendInt32(item_pair.first); + dbus::MessageWriter property_writer(nullptr); + struct_writer.OpenArray("{sv}", &property_writer); + for (const auto& property_pair : item_pair.second->properties) { + if (!property_filter.empty() && + !base::Contains(property_filter, property_pair.first)) { + continue; + } + dbus::MessageWriter dict_entry_writer(nullptr); + property_writer.OpenDictEntry(&dict_entry_writer); + dict_entry_writer.AppendString(property_pair.first); + property_pair.second.Write(&dict_entry_writer); + property_writer.CloseContainer(&dict_entry_writer); + } + struct_writer.CloseContainer(&property_writer); + item_writer.CloseContainer(&struct_writer); + } + writer.CloseContainer(&item_writer); +} + +void DbusMenu::OnGetLayout(ScopedMethodResponse* response) { + dbus::MessageReader& reader = response->reader(); + int32_t id; + int32_t depth; + std::vector<std::string> property_filter; + if (!reader.PopInt32(&id) || !reader.PopInt32(&depth) || depth < -1 || + !reader.PopArrayOfStrings(&property_filter)) { + return; + } + + auto it = items_.find(id); + if (it == items_.end()) + return; + + dbus::MessageWriter& writer = response->Writer(); + writer.AppendUint32(revision_); + WriteMenuItem(it->second.get(), &writer, depth, property_filter); +} + +void DbusMenu::OnGetProperty(ScopedMethodResponse* response) { + dbus::MessageReader& reader = response->reader(); + int32_t id; + std::string name; + if (!reader.PopInt32(&id) || !reader.PopString(&name)) + return; + + auto item_it = items_.find(id); + if (item_it == items_.end()) + return; + + MenuItem* item = item_it->second.get(); + auto property_it = item->properties.find(name); + if (property_it == item->properties.end()) { + DbusVariant default_value = CreateDefaultPropertyValue(name); + if (default_value) + default_value.Write(&response->Writer()); + } else { + property_it->second.Write(&response->Writer()); + } +} + +bool DbusMenu::AboutToShowImpl(int32_t id) { + auto item = items_.find(id); + if (item == items_.end()) + return false; + + ui::MenuModel* menu = item->second->menu; + if (!menu) + return false; + + menu->MenuWillShow(); + + return true; +} + +bool DbusMenu::EventImpl(dbus::MessageReader* reader, int32_t* id_error) { + int32_t id; + if (!reader->PopInt32(&id)) + return false; + auto item_it = items_.find(id); + if (item_it == items_.end()) { + if (id_error) + *id_error = id; + return false; + } + + std::string type; + if (!reader->PopString(&type)) + return false; + + if (type == "clicked") { + MenuItem* item = item_it->second.get(); + if (!item->containing_menu) + return false; + item->containing_menu->ActivatedAt(item->containing_menu_index); + } else { + DCHECK_EQ("hovered", type); + // Nothing to do. + } + + return true; +} + +std::vector<int32_t> DbusMenu::ConvertMenu(ui::MenuModel* menu) { + std::vector<int32_t> items; + if (!menu) + return items; + items.reserve(menu->GetItemCount()); + + for (int i = 0; i < menu->GetItemCount(); ++i) { + // Properties should only be set if they differ from the default values. + std::map<std::string, DbusVariant> properties; + + // The dbusmenu interface has no concept of a "sublabel", "minor text", or + // "minor icon" like MenuModel has. Ignore these rather than trying to + // merge them with the regular label and icon. + base::string16 label = menu->GetLabelAt(i); + if (!label.empty()) { + properties["label"] = MakeDbusVariant(DbusString( + ui::ConvertAcceleratorsFromWindowsStyle(base::UTF16ToUTF8(label)))); + } + + if (!menu->IsEnabledAt(i)) + properties["enabled"] = MakeDbusVariant(DbusBoolean(false)); + if (!menu->IsVisibleAt(i)) + properties["visible"] = MakeDbusVariant(DbusBoolean(false)); + + gfx::Image icon; + if (menu->GetIconAt(i, &icon)) { + properties["icon-data"] = + MakeDbusVariant(DbusByteArray(icon.As1xPNGBytes())); + } + + ui::Accelerator accelerator; + if (menu->GetAcceleratorAt(i, &accelerator)) { + std::vector<DbusString> parts; + if (accelerator.IsCtrlDown()) + parts.push_back(DbusString("Control")); + if (accelerator.IsAltDown()) + parts.push_back(DbusString("Alt")); + if (accelerator.IsShiftDown()) + parts.push_back(DbusString("Shift")); + if (accelerator.IsCmdDown()) + parts.push_back(DbusString("Super")); + parts.push_back( + DbusString(base::UTF16ToUTF8(accelerator.KeyCodeToName()))); + properties["shortcut"] = MakeDbusVariant( + MakeDbusArray(DbusArray<DbusString>(std::move(parts)))); + } + + switch (menu->GetTypeAt(i)) { + case ui::MenuModel::TYPE_COMMAND: + case ui::MenuModel::TYPE_HIGHLIGHTED: + // Nothing special to do. + break; + case ui::MenuModel::TYPE_CHECK: + case ui::MenuModel::TYPE_RADIO: + properties["toggle-type"] = MakeDbusVariant(DbusString( + menu->GetTypeAt(i) == ui::MenuModel::TYPE_CHECK ? "checkmark" + : "radio")); + properties["toggle-state"] = + MakeDbusVariant(DbusInt32(menu->IsItemCheckedAt(i) ? 1 : 0)); + break; + case ui::MenuModel::TYPE_SEPARATOR: + // The dbusmenu interface doesn't have multiple types of separators like + // MenuModel. Just use a regular separator in all cases. + properties["type"] = MakeDbusVariant(DbusString("separator")); + break; + case ui::MenuModel::TYPE_BUTTON_ITEM: + // This type of menu represents a row of buttons, but the dbusmenu + // interface has no equivalent of this. Ignore these items for now + // since there's currently no uses of it that plumb into this codepath. + // If there are button menu items in the future, we'd have to fake them + // with multiple menu items. + NOTIMPLEMENTED(); + continue; + case ui::MenuModel::TYPE_SUBMENU: + case ui::MenuModel::TYPE_ACTIONABLE_SUBMENU: + properties["children-display"] = MakeDbusVariant(DbusString("submenu")); + break; + } + + ui::MenuModel* submenu = menu->GetSubmenuModelAt(i); + std::vector<int32_t> children = ConvertMenu(submenu); + + int32_t id = NextItemId(); + items_[id] = std::make_unique<MenuItem>( + id, std::move(properties), std::move(children), submenu, menu, i); + items.push_back(id); + } + + return items; +} + +int32_t DbusMenu::NextItemId() { + return last_item_id_ = last_item_id_ == std::numeric_limits<int32_t>::max() + ? 1 + : last_item_id_ + 1; +} + +void DbusMenu::WriteMenuItem(const MenuItem* item, + dbus::MessageWriter* writer, + int32_t depth, + const std::vector<std::string>& property_filter) { + dbus::MessageWriter struct_writer(nullptr); + writer->OpenStruct(&struct_writer); + struct_writer.AppendInt32(item->id); + + dbus::MessageWriter properties_writer(nullptr); + struct_writer.OpenArray("{sv}", &properties_writer); + for (const auto& property : item->properties) { + if (property_filter.empty() || + base::Contains(property_filter, property.first)) { + dbus::MessageWriter dict_entry_writer(nullptr); + properties_writer.OpenDictEntry(&dict_entry_writer); + dict_entry_writer.AppendString(property.first); + property.second.Write(&dict_entry_writer); + properties_writer.CloseContainer(&dict_entry_writer); + } + } + struct_writer.CloseContainer(&properties_writer); + + dbus::MessageWriter children_writer(nullptr); + struct_writer.OpenArray("v", &children_writer); + if (depth != 0) { + for (int32_t child : item->children) { + dbus::MessageWriter variant_writer(nullptr); + children_writer.OpenVariant("(ia{sv}av)", &variant_writer); + WriteMenuItem(items_[child].get(), &variant_writer, + depth == -1 ? -1 : depth - 1, property_filter); + children_writer.CloseContainer(&variant_writer); + } + } + struct_writer.CloseContainer(&children_writer); + + writer->CloseContainer(&struct_writer); +}
diff --git a/chrome/browser/ui/views/status_icons/dbus_menu.h b/chrome/browser/ui/views/status_icons/dbus_menu.h new file mode 100644 index 0000000..8360e04 --- /dev/null +++ b/chrome/browser/ui/views/status_icons/dbus_menu.h
@@ -0,0 +1,138 @@ +// 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_VIEWS_STATUS_ICONS_DBUS_MENU_H_ +#define CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_DBUS_MENU_H_ + +#include <map> +#include <memory> +#include <vector> + +#include "base/callback_forward.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/ui/views/status_icons/dbus_types.h" +#include "dbus/bus.h" +#include "dbus/exported_object.h" +#include "dbus/message.h" + +namespace ui { +class MenuModel; +} + +class DbusPropertiesInterface; + +// Implements the com.canonical.dbusmenu interface. +class DbusMenu { + public: + using InitializedCallback = base::OnceCallback<void(bool success)>; + + // The exported DBus object will not be unregistered upon deletion. It is the + // responsibility of the caller to remove it after |this| is deleted. + DbusMenu(dbus::ExportedObject* exported_object, InitializedCallback callback); + ~DbusMenu(); + + void SetModel(ui::MenuModel* model, bool send_signal); + + private: + struct MenuItem { + public: + MenuItem(int32_t id, + std::map<std::string, DbusVariant>&& properties, + std::vector<int32_t>&& children, + ui::MenuModel* menu, + ui::MenuModel* containing_menu, + int containing_menu_index); + ~MenuItem(); + + const int32_t id; + const std::map<std::string, DbusVariant> properties; + const std::vector<int32_t> children; + + // The MenuModel corresponding to this MenuItem, or null if this MenuItem is + // not a submenu. This can happen for leaf items or an empty root item. + ui::MenuModel* const menu; + // |containing_menu| will be null for the root item. If it's null, then + // |containing_menu_index| is meaningless. + ui::MenuModel* const containing_menu; + const int containing_menu_index; + + DISALLOW_COPY_AND_ASSIGN(MenuItem); + }; + + class ScopedMethodResponse { + public: + ScopedMethodResponse(dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender* response_sender); + + ~ScopedMethodResponse(); + + dbus::MessageWriter& Writer(); + + void EnsureResponse(); + + dbus::MessageReader& reader() { return reader_; } + + private: + dbus::MethodCall* method_call_; + dbus::ExportedObject::ResponseSender* response_sender_; + + // |reader_| is always needed for all methods on this interface, so it's not + // created lazily. + dbus::MessageReader reader_; + std::unique_ptr<dbus::MessageWriter> writer_; + std::unique_ptr<dbus::Response> response_; + }; + + static dbus::ExportedObject::MethodCallCallback WrapMethodCallback( + base::RepeatingCallback<void(DbusMenu::ScopedMethodResponse*)> callback); + + void OnExported(const std::string& interface_name, + const std::string& method_name, + bool success); + + // Methods. + void OnAboutToShow(ScopedMethodResponse* response); + void OnAboutToShowGroup(ScopedMethodResponse* response); + void OnEvent(ScopedMethodResponse* response); + void OnEventGroup(ScopedMethodResponse* response); + void OnGetGroupProperties(ScopedMethodResponse* response); + void OnGetLayout(ScopedMethodResponse* response); + void OnGetProperty(ScopedMethodResponse* response); + + bool AboutToShowImpl(int32_t id); + + bool EventImpl(dbus::MessageReader* reader, int32_t* id_error); + + // Get the next item ID, handling overflow and skipping over the root item + // which must have ID 0. + int32_t NextItemId(); + + // Converts |menu| to zero or more MenuItem's and adds them to |items_|. + // Returns a vector of IDs that index into |items_|. + std::vector<int32_t> ConvertMenu(ui::MenuModel* menu); + + // A |depth| of -1 means infinite depth. If |property_filter| is empty, all + // properties will be sent. + void WriteMenuItem(const MenuItem* item, + dbus::MessageWriter* writer, + int32_t depth, + const std::vector<std::string>& property_filter); + + dbus::ExportedObject* menu_ = nullptr; + + base::RepeatingCallback<void(bool)> barrier_; + + std::unique_ptr<DbusPropertiesInterface> properties_; + + uint32_t revision_ = 0; + int32_t last_item_id_ = 0; + std::map<int32_t, std::unique_ptr<MenuItem>> items_; + + base::WeakPtrFactory<DbusMenu> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(DbusMenu); +}; + +#endif // CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_DBUS_MENU_H_
diff --git a/chrome/browser/ui/views/status_icons/dbus_properties_interface.h b/chrome/browser/ui/views/status_icons/dbus_properties_interface.h index 01be730..c9a6007 100644 --- a/chrome/browser/ui/views/status_icons/dbus_properties_interface.h +++ b/chrome/browser/ui/views/status_icons/dbus_properties_interface.h
@@ -18,7 +18,7 @@ public: using InitializedCallback = base::OnceCallback<void(bool success)>; - // Registers method handles for the properties interface. The handles will + // Registers method handlers for the properties interface. The handlers will // not be removed until the bus is shut down. DbusPropertiesInterface(dbus::ExportedObject* exported_object, InitializedCallback callback);
diff --git a/chrome/browser/ui/views/status_icons/dbus_types.cc b/chrome/browser/ui/views/status_icons/dbus_types.cc index 9ede9c8d5..07c8123 100644 --- a/chrome/browser/ui/views/status_icons/dbus_types.cc +++ b/chrome/browser/ui/views/status_icons/dbus_types.cc
@@ -35,6 +35,19 @@ return "i"; } +DbusUint32::DbusUint32(uint32_t value) : value_(value) {} +DbusUint32::DbusUint32(DbusUint32&& other) = default; +DbusUint32::~DbusUint32() = default; + +void DbusUint32::Write(dbus::MessageWriter* writer) const { + writer->AppendUint32(value_); +} + +// static +std::string DbusUint32::GetSignature() { + return "u"; +} + DbusString::DbusString(const std::string& value) : value_(value) {} DbusString::DbusString(DbusString&& other) = default; DbusString::~DbusString() = default; @@ -68,6 +81,10 @@ DbusVariant::~DbusVariant() = default; DbusVariant& DbusVariant::operator=(DbusVariant&& other) = default; +DbusVariant::operator bool() const { + return !!value_; +} + void DbusVariant::Write(dbus::MessageWriter* writer) const { dbus::MessageWriter variant_writer(nullptr); writer->OpenVariant(value_->GetSignatureDynamic(), &variant_writer); @@ -81,13 +98,13 @@ } DbusByteArray::DbusByteArray() = default; -DbusByteArray::DbusByteArray(std::vector<uint8_t>&& value) - : value_(std::move(value)) {} +DbusByteArray::DbusByteArray(scoped_refptr<base::RefCountedMemory> value) + : value_(value) {} DbusByteArray::DbusByteArray(DbusByteArray&& other) = default; DbusByteArray::~DbusByteArray() = default; void DbusByteArray::Write(dbus::MessageWriter* writer) const { - writer->AppendArrayOfBytes(value_.data(), value_.size()); + writer->AppendArrayOfBytes(value_->front(), value_->size()); } // static
diff --git a/chrome/browser/ui/views/status_icons/dbus_types.h b/chrome/browser/ui/views/status_icons/dbus_types.h index 0e3b861..6ffbd6a 100644 --- a/chrome/browser/ui/views/status_icons/dbus_types.h +++ b/chrome/browser/ui/views/status_icons/dbus_types.h
@@ -13,6 +13,7 @@ #include <type_traits> #include <utility> +#include "base/memory/ref_counted_memory.h" #include "dbus/message.h" namespace detail { @@ -114,6 +115,21 @@ int32_t value_; }; +class DbusUint32 : public DbusTypeImpl<DbusUint32> { + public: + explicit DbusUint32(uint32_t value); + DbusUint32(DbusUint32&& other); + ~DbusUint32() override; + + // DbusType: + void Write(dbus::MessageWriter* writer) const override; + + static std::string GetSignature(); + + private: + uint32_t value_; +}; + class DbusString : public DbusTypeImpl<DbusString> { public: explicit DbusString(const std::string& value); @@ -153,6 +169,8 @@ DbusVariant& operator=(DbusVariant&& other); + operator bool() const; + // DbusType: void Write(dbus::MessageWriter* writer) const override; @@ -209,7 +227,7 @@ class DbusByteArray : public DbusTypeImpl<DbusByteArray> { public: DbusByteArray(); - explicit DbusByteArray(std::vector<uint8_t>&& value); + explicit DbusByteArray(scoped_refptr<base::RefCountedMemory> value); DbusByteArray(DbusByteArray&& other); ~DbusByteArray() override; @@ -219,7 +237,7 @@ static std::string GetSignature(); private: - std::vector<uint8_t> value_; + scoped_refptr<base::RefCountedMemory> value_; }; template <typename... Ts>
diff --git a/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.cc b/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.cc index 017bead..50b29e8 100644 --- a/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.cc +++ b/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.cc
@@ -11,10 +11,12 @@ #include "base/bind.h" #include "base/logging.h" +#include "base/memory/ref_counted_memory.h" #include "base/numerics/checked_math.h" #include "base/process/process.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/ui/views/status_icons/dbus_menu.h" #include "chrome/browser/ui/views/status_icons/dbus_properties_interface.h" #include "chrome/browser/ui/views/status_icons/dbus_types.h" #include "chrome/browser/ui/views/status_icons/success_barrier_callback.h" @@ -25,6 +27,9 @@ #include "dbus/object_path.h" #include "dbus/object_proxy.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "ui/base/models/menu_model.h" +#include "ui/base/models/menu_separator_types.h" +#include "ui/base/models/simple_menu_model.h" #include "ui/gfx/image/image_skia.h" #include "ui/views/linux_ui/status_icon_linux.h" @@ -39,6 +44,7 @@ // Object paths. const char kPathStatusNotifierItem[] = "/StatusNotifierItem"; const char kPathStatusNotifierWatcher[] = "/StatusNotifierWatcher"; +const char kPathDbusMenu[] = "/com/canonical/dbusmenu"; // Methods. const char kMethodRegisterStatusNotifierItem[] = "RegisterStatusNotifierItem"; @@ -72,7 +78,6 @@ const char kSignalNewToolTip[] = "NewToolTip"; // Property values. -const char kPropertyValueMenu[] = "/NO_DBUSMENU"; const char kPropertyValueCategory[] = "ApplicationStatus"; const char kPropertyValueStatus[] = "Active"; @@ -91,7 +96,7 @@ std::string ServiceNameFromId(int service_id) { return std::string(kInterfaceStatusNotifierItem) + '-' + - base::NumberToString(base::Process::Current().Pid()) + "-" + + base::NumberToString(base::Process::Current().Pid()) + '-' + base::NumberToString(service_id); } @@ -115,8 +120,9 @@ color_data.push_back(SkColorGetB(color)); } } - return MakeDbusArray(MakeDbusStruct(DbusInt32(width), DbusInt32(height), - DbusByteArray(std::move(color_data)))); + return MakeDbusArray(MakeDbusStruct( + DbusInt32(width), DbusInt32(height), + DbusByteArray(base::RefCountedBytes::TakeVector(&color_data)))); } auto MakeDbusToolTip(const std::string& text) { @@ -165,6 +171,8 @@ if (!properties_) return; + UpdateMenuImpl(delegate_->GetMenuModel(), true); + properties_->SetProperty( kInterfaceStatusNotifierItem, kPropertyToolTip, MakeDbusToolTip(base::UTF16ToUTF8(delegate_->GetToolTip()))); @@ -173,7 +181,20 @@ } void StatusIconLinuxDbus::UpdatePlatformContextMenu(ui::MenuModel* model) { - NOTIMPLEMENTED(); + UpdateMenuImpl(model, true); +} + +void StatusIconLinuxDbus::RefreshPlatformContextMenu() { + // This codepath gets called for property changes like changed labels or + // icons, but also for layout changes like deleted items. + // TODO(thomasanderson): Split this into two methods so we can avoid + // rebuilding the menu for simple property changes. + UpdateMenuImpl(delegate_->GetMenuModel(), true); +} + +void StatusIconLinuxDbus::ExecuteCommand(int command_id, int event_flags) { + DCHECK_EQ(command_id, 0); + delegate_->OnClick(); } void StatusIconLinuxDbus::OnHostRegisteredResponse(dbus::Response* response) { @@ -203,7 +224,6 @@ return; } - // static static constexpr struct { const char* name; void (StatusIconLinuxDbus::*callback)(dbus::MethodCall*, @@ -215,10 +235,11 @@ {kMethodSecondaryActivate, &StatusIconLinuxDbus::OnSecondaryActivate}, }; - // The barrier requires base::size(methods) + 1 calls. base::size(methods) - // for each method exported, and 1 for |properties_| initialization. + // The barrier requires base::size(methods) + 2 calls. base::size(methods) + // for each method exported, 1 for |properties_| initialization, and 1 for + // |menu_| initialization. barrier_ = - SuccessBarrierCallback(base::size(methods) + 1, + SuccessBarrierCallback(base::size(methods) + 2, base::BindOnce(&StatusIconLinuxDbus::OnInitialized, weak_factory_.GetWeakPtr())); @@ -231,6 +252,10 @@ weak_factory_.GetWeakPtr())); } + menu_ = std::make_unique<DbusMenu>( + bus_->GetExportedObject(dbus::ObjectPath(kPathDbusMenu)), barrier_); + UpdateMenuImpl(delegate_->GetMenuModel(), false); + properties_ = std::make_unique<DbusPropertiesInterface>(item_, barrier_); properties_->RegisterInterface(kInterfaceStatusNotifierItem); auto set_property = [&](const std::string& property_name, auto&& value) { @@ -239,8 +264,7 @@ }; set_property(kPropertyItemIsMenu, DbusBoolean(false)); set_property(kPropertyWindowId, DbusInt32(0)); - set_property(kPropertyMenu, - DbusObjectPath(dbus::ObjectPath(kPropertyValueMenu))); + set_property(kPropertyMenu, DbusObjectPath(dbus::ObjectPath(kPathDbusMenu))); set_property(kPropertyAttentionIconName, DbusString("")); set_property(kPropertyAttentionMovieName, DbusString("")); set_property(kPropertyCategory, DbusString(kPropertyValueCategory)); @@ -311,3 +335,25 @@ // to run the same handler as regular activations. sender.Run(dbus::Response::FromMethodCall(method_call)); } + +void StatusIconLinuxDbus::UpdateMenuImpl(ui::MenuModel* model, + bool send_signal) { + if (!menu_) + return; + + if (!model) { + empty_menu_ = std::make_unique<ui::SimpleMenuModel>(nullptr); + model = empty_menu_.get(); + } + + click_action_menu_ = std::make_unique<ui::SimpleMenuModel>(this); + if (delegate_->HasClickAction() && !delegate_->GetToolTip().empty()) { + click_action_menu_->AddItem(0, delegate_->GetToolTip()); + if (model->GetItemCount()) + click_action_menu_->AddSeparator(ui::MenuSeparatorType::NORMAL_SEPARATOR); + } + + concat_menu_ = + std::make_unique<ConcatMenuModel>(click_action_menu_.get(), model); + menu_->SetModel(concat_menu_.get(), send_signal); +}
diff --git a/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h b/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h index 257233e4..fb229ef 100644 --- a/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h +++ b/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h
@@ -10,21 +10,25 @@ #include "base/callback_forward.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/ui/views/status_icons/concat_menu_model.h" #include "dbus/bus.h" #include "dbus/exported_object.h" #include "dbus/message.h" #include "dbus/object_proxy.h" +#include "ui/base/models/simple_menu_model.h" #include "ui/views/linux_ui/status_icon_linux.h" namespace gfx { class ImageSkia; } // namespace gfx +class DbusMenu; class DbusPropertiesInterface; // A status icon following the StatusNotifierItem specification. // https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/ -class StatusIconLinuxDbus : public views::StatusIconLinux { +class StatusIconLinuxDbus : public views::StatusIconLinux, + public ui::SimpleMenuModel::Delegate { public: StatusIconLinuxDbus(); ~StatusIconLinuxDbus() override; @@ -33,6 +37,10 @@ void SetImage(const gfx::ImageSkia& image) override; void SetToolTip(const base::string16& tool_tip) override; void UpdatePlatformContextMenu(ui::MenuModel* model) override; + void RefreshPlatformContextMenu() override; + + // ui::SimpleMenuModel::Delegate: + void ExecuteCommand(int command_id, int event_flags) override; private: // Step 1: verify with the StatusNotifierWatcher that a StatusNotifierHost is @@ -67,6 +75,8 @@ void OnSecondaryActivate(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender sender); + void UpdateMenuImpl(ui::MenuModel* model, bool send_signal); + scoped_refptr<dbus::Bus> bus_; int service_id_ = 0; @@ -77,6 +87,19 @@ std::unique_ptr<DbusPropertiesInterface> properties_; + std::unique_ptr<DbusMenu> menu_; + // A menu that contains the click action (if there is a click action) and a + // separator (if there's a click action and delegate_->GetMenuModel() is + // non-empty). + std::unique_ptr<ui::SimpleMenuModel> click_action_menu_; + // An empty menu for use in |concat_menu_| if delegate_->GetMenuModel() is + // null. + std::unique_ptr<ui::SimpleMenuModel> empty_menu_; + // A concatenation of |click_action_menu_| and either + // delegate_->GetMenuModel() or |empty_menu_| if the delegate's menu is null. + // Appears after the other menus so that it gets destroyed first. + std::unique_ptr<ConcatMenuModel> concat_menu_; + base::WeakPtrFactory<StatusIconLinuxDbus> weak_factory_; DISALLOW_COPY_AND_ASSIGN(StatusIconLinuxDbus);
diff --git a/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.cc b/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.cc index b03600b..6439ec2 100644 --- a/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.cc +++ b/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.cc
@@ -79,7 +79,7 @@ return tool_tip_; } -const ui::MenuModel* StatusIconLinuxWrapper::GetMenuModel() const { +ui::MenuModel* StatusIconLinuxWrapper::GetMenuModel() const { return menu_model_; }
diff --git a/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.h b/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.h index d6f8c011a..a5e5a8d3 100644 --- a/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.h +++ b/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.h
@@ -33,7 +33,7 @@ bool HasClickAction() override; const gfx::ImageSkia& GetImage() const override; const base::string16& GetToolTip() const override; - const ui::MenuModel* GetMenuModel() const override; + ui::MenuModel* GetMenuModel() const override; void OnImplInitialized(bool success) override; // StatusIconMenuModel::Observer overrides:
diff --git a/chrome/browser/ui/views/tabs/new_tab_button.cc b/chrome/browser/ui/views/tabs/new_tab_button.cc index 677455d..6c43c63 100644 --- a/chrome/browser/ui/views/tabs/new_tab_button.cc +++ b/chrome/browser/ui/views/tabs/new_tab_button.cc
@@ -32,7 +32,6 @@ #if defined(OS_WIN) #include "ui/display/win/screen_win.h" -#include "ui/gfx/win/hwnd_util.h" #include "ui/views/win/hwnd_util.h" #endif @@ -152,12 +151,14 @@ return; } + // TODO(pkasting): If we handled right-clicks on the frame, and we made sure + // this event was not handled, it seems like things would Just Work. gfx::Point point = event.location(); views::View::ConvertPointToScreen(this, &point); point = display::win::ScreenWin::DIPToScreenPoint(point); bool destroyed = false; destroyed_ = &destroyed; - gfx::ShowSystemMenuAtPoint(views::HWNDForView(this), point); + views::ShowSystemMenuAtScreenPixelLocation(views::HWNDForView(this), point); if (!destroyed) SetState(views::Button::STATE_NORMAL); }
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 6f86823..c7a20e5 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -224,7 +224,7 @@ // Enables or disables new Desktop PWAs unified |InstallManager| that does not // use extensions. const base::Feature kDesktopPWAsUnifiedInstall{ - "DesktopPWAsUnifiedInstall", base::FEATURE_DISABLED_BY_DEFAULT}; + "DesktopPWAsUnifiedInstall", base::FEATURE_ENABLED_BY_DEFAULT}; // Enables or disables the ability to install PWAs from the omnibox. const base::Feature kDesktopPWAsOmniboxInstall{ @@ -367,14 +367,8 @@ #if !defined(OS_ANDROID) // Enables or disables intent picker. -const base::Feature kIntentPicker { - "IntentPicker", -#if defined(OS_CHROMEOS) - base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif // defined(OS_CHROMEOS) -}; +const base::Feature kIntentPicker{"IntentPicker", + base::FEATURE_ENABLED_BY_DEFAULT}; #endif // !defined(OS_ANDROID) #if defined(OS_CHROMEOS)
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 89a293f..1f1871d 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1463,26 +1463,6 @@ rappor_recorder_->RecordRapporURL(metric, url); } -void ChromeContentRendererClient::AddImageContextMenuProperties( - const WebURLResponse& response, - bool is_image_in_context_a_placeholder_image, - std::map<std::string, std::string>* properties) { - DCHECK(properties); - - WebString cpct_value = response.HttpHeaderField(WebString::FromASCII( - data_reduction_proxy::chrome_proxy_content_transform_header())); - WebString chrome_proxy_value = response.HttpHeaderField( - WebString::FromASCII(data_reduction_proxy::chrome_proxy_header())); - - if (is_image_in_context_a_placeholder_image || - data_reduction_proxy::IsEmptyImagePreview(cpct_value.Utf8(), - chrome_proxy_value.Utf8())) { - (*properties) - [data_reduction_proxy::chrome_proxy_content_transform_header()] = - data_reduction_proxy::empty_image_directive(); - } -} - void ChromeContentRendererClient::RunScriptsAtDocumentStart( content::RenderFrame* render_frame) { #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index c8a58e59..33245a0 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -174,10 +174,6 @@ void RecordRappor(const std::string& metric, const std::string& sample) override; void RecordRapporURL(const std::string& metric, const GURL& url) override; - void AddImageContextMenuProperties( - const blink::WebURLResponse& response, - bool is_image_in_context_a_placeholder_image, - std::map<std::string, std::string>* properties) override; void RunScriptsAtDocumentStart(content::RenderFrame* render_frame) override; void RunScriptsAtDocumentEnd(content::RenderFrame* render_frame) override; void RunScriptsAtDocumentIdle(content::RenderFrame* render_frame) override;
diff --git a/chrome/renderer/chrome_content_renderer_client_unittest.cc b/chrome/renderer/chrome_content_renderer_client_unittest.cc index 31c3966cd..a2dbfe8 100644 --- a/chrome/renderer/chrome_content_renderer_client_unittest.cc +++ b/chrome/renderer/chrome_content_renderer_client_unittest.cc
@@ -249,34 +249,3 @@ SearchBouncer::GetInstance()->SetNewTabPageURL(GURL::EmptyGURL()); } #endif - -TEST_F(ChromeContentRendererClientTest, AddImageContextMenuPropertiesForLoFi) { - ChromeContentRendererClient client; - blink::WebURLResponse web_url_response; - web_url_response.AddHttpHeaderField( - blink::WebString::FromUTF8( - data_reduction_proxy::chrome_proxy_content_transform_header()), - blink::WebString::FromUTF8( - data_reduction_proxy::empty_image_directive())); - std::map<std::string, std::string> properties; - client.AddImageContextMenuProperties( - web_url_response, /*is_image_in_context_a_placeholder_image=*/false, - &properties); - EXPECT_EQ( - data_reduction_proxy::empty_image_directive(), - properties - [data_reduction_proxy::chrome_proxy_content_transform_header()]); -} - -TEST_F(ChromeContentRendererClientTest, - AddImageContextMenuPropertiesForPlaceholder) { - ChromeContentRendererClient client; - std::map<std::string, std::string> properties; - client.AddImageContextMenuProperties( - blink::WebURLResponse(), /*is_image_in_context_a_placeholder_image=*/true, - &properties); - EXPECT_EQ( - data_reduction_proxy::empty_image_directive(), - properties - [data_reduction_proxy::chrome_proxy_content_transform_header()]); -}
diff --git a/chrome/renderer/page_load_metrics/page_resource_data_use.cc b/chrome/renderer/page_load_metrics/page_resource_data_use.cc index 6db086a..ad71297 100644 --- a/chrome/renderer/page_load_metrics/page_resource_data_use.cc +++ b/chrome/renderer/page_load_metrics/page_resource_data_use.cc
@@ -14,13 +14,12 @@ namespace { -// Returns true when the image is a placeholder for lazy load or client LoFi. +// Returns true when the image is a placeholder for lazy load. bool IsPartialImageRequest(content::ResourceType resource_type, content::PreviewsState previews_state) { if (resource_type != content::ResourceType::kImage) return false; - return (previews_state & content::PreviewsTypes::CLIENT_LOFI_ON) || - (previews_state & content::PreviewsTypes::LAZY_IMAGE_LOAD_DEFERRED); + return previews_state & content::PreviewsTypes::LAZY_IMAGE_LOAD_DEFERRED; } // Returns true if this resource was previously fetched as a placeholder. @@ -28,8 +27,7 @@ content::PreviewsState previews_state) { if (resource_type != content::ResourceType::kImage) return false; - return (previews_state & content::PreviewsTypes::CLIENT_LOFI_AUTO_RELOAD) || - (previews_state & content::PreviewsTypes::LAZY_IMAGE_AUTO_RELOAD); + return previews_state & content::PreviewsTypes::LAZY_IMAGE_AUTO_RELOAD; } // Returns the ratio of original data size (without applying interventions) to
diff --git a/chrome/services/isolated_xr_device/xr_runtime_provider.cc b/chrome/services/isolated_xr_device/xr_runtime_provider.cc index 735e193..5a7678d 100644 --- a/chrome/services/isolated_xr_device/xr_runtime_provider.cc +++ b/chrome/services/isolated_xr_device/xr_runtime_provider.cc
@@ -21,123 +21,123 @@ #include "device/vr/windows_mixed_reality/mixed_reality_statics.h" #endif +enum class IsolatedXRRuntimeProvider::RuntimeStatus { + kEnable, + kDisable, +}; + namespace { // Poll for device add/remove every 5 seconds. constexpr base::TimeDelta kTimeBetweenPollingEvents = base::TimeDelta::FromSecondsD(5); -void TraceHardwareAvailable(bool added, device::mojom::XRDeviceId device_id) { - int id = static_cast<int>(device_id); - if (added) { - TRACE_EVENT_INSTANT1("xr", "HardwareAdded", TRACE_EVENT_SCOPE_THREAD, "id", - id); - } else { - TRACE_EVENT_INSTANT1("xr", "HardwareRemoved", TRACE_EVENT_SCOPE_THREAD, - "id", id); +template <typename VrDeviceT> +std::unique_ptr<VrDeviceT> EnableRuntime( + device::mojom::IsolatedXRRuntimeProviderClientPtr& client) { + auto device = std::make_unique<VrDeviceT>(); + TRACE_EVENT_INSTANT1("xr", "HardwareAdded", TRACE_EVENT_SCOPE_THREAD, "id", + static_cast<int>(device->GetId())); + // "Device" here refers to a runtime + hardware pair, not necessarily + // a physical device. + client->OnDeviceAdded(device->BindXRRuntimePtr(), + device->BindGamepadFactory(), + device->BindCompositorHost(), device->GetId()); + return device; +} + +void DisableRuntime(device::mojom::IsolatedXRRuntimeProviderClientPtr& client, + std::unique_ptr<device::VRDeviceBase> device) { + TRACE_EVENT_INSTANT1("xr", "HardwareRemoved", TRACE_EVENT_SCOPE_THREAD, "id", + static_cast<int>(device->GetId())); + // "Device" here refers to a runtime + hardware pair, not necessarily physical + // device. + client->OnDeviceRemoved(device->GetId()); +} + +template <typename VrHardwareT> +void SetRuntimeStatus(device::mojom::IsolatedXRRuntimeProviderClientPtr& client, + IsolatedXRRuntimeProvider::RuntimeStatus status, + std::unique_ptr<VrHardwareT>* out_device) { + if (status == IsolatedXRRuntimeProvider::RuntimeStatus::kEnable && + !*out_device) { + *out_device = EnableRuntime<VrHardwareT>(client); + } else if (status == IsolatedXRRuntimeProvider::RuntimeStatus::kDisable && + *out_device) { + DisableRuntime(client, std::move(*out_device)); } } } // namespace +// This function is called periodically to check the availability of hardware +// backed by the various supported VR runtimes. Only one "device" (hardware + +// runtime) should be enabled at once, so this chooses the most preferred among +// available options. void IsolatedXRRuntimeProvider::PollForDeviceChanges() { - // If we have multiple devices attached, only return one. This typically will - // only happen if a device could be exposed through multiple APIs, such as - // OpenVR exposing a WMR or Oculus device. - bool disable_other_devices = false; + bool preferred_device_enabled = false; #if BUILDFLAG(ENABLE_WINDOWS_MR) - if (check_wmr_) { - bool wmr_available = - !disable_other_devices && wmr_statics_->IsHardwareAvailable(); - disable_other_devices = disable_other_devices || wmr_available; - if (wmr_available && !wmr_device_) { - wmr_device_ = std::make_unique<device::MixedRealityDevice>(); - TraceHardwareAvailable(true, wmr_device_->GetId()); - client_->OnDeviceAdded( - wmr_device_->BindXRRuntimePtr(), wmr_device_->BindGamepadFactory(), - wmr_device_->BindCompositorHost(), wmr_device_->GetId()); - } else if (wmr_device_ && !wmr_available) { - TraceHardwareAvailable(false, wmr_device_->GetId()); - client_->OnDeviceRemoved(wmr_device_->GetId()); - wmr_device_ = nullptr; - } + if (!preferred_device_enabled && IsWMRHardwareAvailable()) { + SetWMRRuntimeStatus(RuntimeStatus::kEnable); + preferred_device_enabled = true; + } else { + SetWMRRuntimeStatus(RuntimeStatus::kDisable); } #endif #if BUILDFLAG(ENABLE_OCULUS_VR) - if (check_oculus_) { - bool oculus_available = - !disable_other_devices && - ((oculus_device_ && oculus_device_->IsAvailable()) || - device::OculusDevice::IsHwAvailable()); - disable_other_devices = disable_other_devices || oculus_available; - if (oculus_available && !oculus_device_) { - oculus_device_ = std::make_unique<device::OculusDevice>(); - TraceHardwareAvailable(true, oculus_device_->GetId()); - client_->OnDeviceAdded(oculus_device_->BindXRRuntimePtr(), - oculus_device_->BindGamepadFactory(), - oculus_device_->BindCompositorHost(), - oculus_device_->GetId()); - } else if (oculus_device_ && !oculus_available) { - TraceHardwareAvailable(false, oculus_device_->GetId()); - client_->OnDeviceRemoved(oculus_device_->GetId()); - oculus_device_ = nullptr; - } + if (!preferred_device_enabled && IsOculusVrHardwareAvailable()) { + SetOculusVrRuntimeStatus(RuntimeStatus::kEnable); + preferred_device_enabled = true; + } else { + SetOculusVrRuntimeStatus(RuntimeStatus::kDisable); } #endif #if BUILDFLAG(ENABLE_OPENVR) - if (check_openvr_) { - bool openvr_available = - !disable_other_devices && - ((openvr_device_ && openvr_device_->IsAvailable()) || - device::OpenVRDevice::IsHwAvailable()); - disable_other_devices = disable_other_devices || openvr_available; - if (openvr_available && !openvr_device_) { - openvr_device_ = std::make_unique<device::OpenVRDevice>(); - TraceHardwareAvailable(true, openvr_device_->GetId()); - client_->OnDeviceAdded(openvr_device_->BindXRRuntimePtr(), - openvr_device_->BindGamepadFactory(), - openvr_device_->BindCompositorHost(), - openvr_device_->GetId()); - } else if (openvr_device_ && !openvr_available) { - TraceHardwareAvailable(false, openvr_device_->GetId()); - client_->OnDeviceRemoved(openvr_device_->GetId()); - openvr_device_ = nullptr; - } + if (!preferred_device_enabled && IsOpenVrHardwareAvailable()) { + SetOpenVrRuntimeStatus(RuntimeStatus::kEnable); + preferred_device_enabled = true; + } else { + SetOpenVrRuntimeStatus(RuntimeStatus::kDisable); } #endif - if (check_openvr_ || check_oculus_ || check_wmr_) { - // Post a task to do this again later. - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, - base::BindOnce(&IsolatedXRRuntimeProvider::PollForDeviceChanges, - weak_ptr_factory_.GetWeakPtr()), - kTimeBetweenPollingEvents); - } + // Schedule this function to run again later. + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&IsolatedXRRuntimeProvider::PollForDeviceChanges, + weak_ptr_factory_.GetWeakPtr()), + kTimeBetweenPollingEvents); } void IsolatedXRRuntimeProvider::SetupPollingForDeviceChanges() { + bool any_runtimes_available = false; + #if BUILDFLAG(ENABLE_OCULUS_VR) - if (base::FeatureList::IsEnabled(features::kOculusVR)) - check_oculus_ = device::OculusDevice::IsApiAvailable(); + if (base::FeatureList::IsEnabled(features::kOculusVR)) { + should_check_oculus_ = device::OculusDevice::IsApiAvailable(); + any_runtimes_available |= should_check_oculus_; + } #endif #if BUILDFLAG(ENABLE_OPENVR) - if (base::FeatureList::IsEnabled(features::kOpenVR)) - check_openvr_ = device::OpenVRDevice::IsApiAvailable(); + if (base::FeatureList::IsEnabled(features::kOpenVR)) { + should_check_openvr_ = device::OpenVRDevice::IsApiAvailable(); + any_runtimes_available |= should_check_openvr_; + } #endif #if BUILDFLAG(ENABLE_WINDOWS_MR) if (base::FeatureList::IsEnabled(features::kWindowsMixedReality)) { wmr_statics_ = device::MixedRealityDeviceStatics::CreateInstance(); - check_wmr_ = wmr_statics_->IsApiAvailable(); + should_check_wmr_ = wmr_statics_->IsApiAvailable(); + any_runtimes_available |= should_check_wmr_; } #endif - // Post a task to call back every periodically. - if (check_openvr_ || check_oculus_ || check_wmr_) { + // Begin polling for devices + if (any_runtimes_available) { PollForDeviceChanges(); } } @@ -150,6 +150,40 @@ client_->OnDevicesEnumerated(); } +#if BUILDFLAG(ENABLE_OCULUS_VR) +bool IsolatedXRRuntimeProvider::IsOculusVrHardwareAvailable() { + return should_check_oculus_ && + ((oculus_device_ && oculus_device_->IsAvailable()) || + device::OculusDevice::IsHwAvailable()); +} + +void IsolatedXRRuntimeProvider::SetOculusVrRuntimeStatus(RuntimeStatus status) { + SetRuntimeStatus(client_, status, &oculus_device_); +} +#endif // BUILDFLAG(ENABLE_OCULUS_VR) + +#if BUILDFLAG(ENABLE_OPENVR) +bool IsolatedXRRuntimeProvider::IsOpenVrHardwareAvailable() { + return should_check_openvr_ && + ((openvr_device_ && openvr_device_->IsAvailable()) || + device::OpenVRDevice::IsHwAvailable()); +} + +void IsolatedXRRuntimeProvider::SetOpenVrRuntimeStatus(RuntimeStatus status) { + SetRuntimeStatus(client_, status, &openvr_device_); +} +#endif // BUILDFLAG(ENABLE_OPENVR) + +#if BUILDFLAG(ENABLE_WINDOWS_MR) +bool IsolatedXRRuntimeProvider::IsWMRHardwareAvailable() { + return should_check_wmr_ && wmr_statics_->IsHardwareAvailable(); +} + +void IsolatedXRRuntimeProvider::SetWMRRuntimeStatus(RuntimeStatus status) { + SetRuntimeStatus(client_, status, &wmr_device_); +} +#endif // BUILDFLAG(ENABLE_WINDOWS_MR) + IsolatedXRRuntimeProvider::IsolatedXRRuntimeProvider( std::unique_ptr<service_manager::ServiceKeepaliveRef> service_ref) : service_ref_(std::move(service_ref)), weak_ptr_factory_(this) {}
diff --git a/chrome/services/isolated_xr_device/xr_runtime_provider.h b/chrome/services/isolated_xr_device/xr_runtime_provider.h index fb60a618..bc43bfc 100644 --- a/chrome/services/isolated_xr_device/xr_runtime_provider.h +++ b/chrome/services/isolated_xr_device/xr_runtime_provider.h
@@ -28,6 +28,8 @@ void RequestDevices( device::mojom::IsolatedXRRuntimeProviderClientPtr client) override; + enum class RuntimeStatus; + private: const std::unique_ptr<service_manager::ServiceKeepaliveRef> service_ref_; @@ -36,22 +38,27 @@ void SetupPollingForDeviceChanges(); #if BUILDFLAG(ENABLE_OCULUS_VR) + bool IsOculusVrHardwareAvailable(); + void SetOculusVrRuntimeStatus(RuntimeStatus status); + bool should_check_oculus_ = false; std::unique_ptr<device::OculusDevice> oculus_device_; #endif #if BUILDFLAG(ENABLE_OPENVR) + bool IsOpenVrHardwareAvailable(); + void SetOpenVrRuntimeStatus(RuntimeStatus status); + bool should_check_openvr_ = false; std::unique_ptr<device::OpenVRDevice> openvr_device_; #endif #if BUILDFLAG(ENABLE_WINDOWS_MR) + bool IsWMRHardwareAvailable(); + void SetWMRRuntimeStatus(RuntimeStatus status); + bool should_check_wmr_ = false; std::unique_ptr<device::MixedRealityDevice> wmr_device_; std::unique_ptr<device::MixedRealityDeviceStatics> wmr_statics_; #endif - bool check_openvr_ = false; - bool check_oculus_ = false; - bool check_wmr_ = false; - device::mojom::IsolatedXRRuntimeProviderClientPtr client_; base::WeakPtrFactory<IsolatedXRRuntimeProvider> weak_ptr_factory_; };
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index b7fe1a2..436aaa5 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1307,6 +1307,7 @@ data_deps += [ "//chrome", "//ash/keyboard/ui:resources", + "//testing/buildbot/filters:chromeos_filters", "//ui/file_manager:unit_test_data", ]
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.cold_state_personalized_signin_promo.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-cold_state_personalized_signin_promo.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.cold_state_personalized_signin_promo.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-cold_state_personalized_signin_promo.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.hot_state_personalized_signin_promo.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-hot_state_personalized_signin_promo.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.hot_state_personalized_signin_promo.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-hot_state_personalized_signin_promo.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_minimal_snippet_narrow.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-long_minimal_snippet_narrow.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.long_minimal_snippet_narrow.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-long_minimal_snippet_narrow.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-long_snippet.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-long_snippet.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-long_snippet_narrow.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-long_snippet_narrow.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.minimal_snippet.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-minimal_snippet.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.minimal_snippet.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-minimal_snippet.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.short_minimal_snippet_narrow.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-short_minimal_snippet_narrow.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.short_minimal_snippet_narrow.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-short_minimal_snippet_narrow.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.short_snippet.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-short_snippet.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.short_snippet.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-short_snippet.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.short_snippet_narrow.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-short_snippet_narrow.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.short_snippet_narrow.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-short_snippet_narrow.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.video_suggestion_with_dark_dominant_color.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-video_suggestion_with_dark_dominant_color.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.video_suggestion_with_dark_dominant_color.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-video_suggestion_with_dark_dominant_color.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.video_suggestion_with_dark_thumbnail.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-video_suggestion_with_dark_thumbnail.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.video_suggestion_with_dark_thumbnail.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-video_suggestion_with_dark_thumbnail.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.video_suggestion_with_light_dominant_color.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-video_suggestion_with_light_dominant_color.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.video_suggestion_with_light_dominant_color.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-video_suggestion_with_light_dominant_color.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.video_suggestion_with_light_thumbnail.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-video_suggestion_with_light_thumbnail.Nexus_5-19.png.sha1 similarity index 100% rename from chrome/test/data/android/render_tests/ArticleSnippetsTest.video_suggestion_with_light_thumbnail.Nexus_5-19.png.sha1 rename to chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeDisabled-video_suggestion_with_light_thumbnail.Nexus_5-19.png.sha1
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-cold_state_personalized_signin_promo.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-cold_state_personalized_signin_promo.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..0853728 --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-cold_state_personalized_signin_promo.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +23f661e9fb7e5743322e4112bb1a1ffd0fbd09c4 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-hot_state_personalized_signin_promo.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-hot_state_personalized_signin_promo.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..5297824 --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-hot_state_personalized_signin_promo.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +bdec60b27e051db7972bacf1ab7669cd3225edec \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_minimal_snippet_narrow.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_minimal_snippet_narrow.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..f588eae --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_minimal_snippet_narrow.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +18005a0d28a086b6f0e66d6b4243b9750952f729 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_snippet.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_snippet.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..e016947 --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_snippet.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +4f921b7930785e2188991ba26d543080d97f70f9 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_snippet_narrow.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_snippet_narrow.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..d40791dd --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-long_snippet_narrow.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +61994fb1efc4d5c4b679b74894abb8fe38f7d8e0 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-minimal_snippet.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-minimal_snippet.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..3447052 --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-minimal_snippet.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +5f5aa0ac71dfea9bac9656ff7b99028e80a12c8c \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_minimal_snippet_narrow.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_minimal_snippet_narrow.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..057836e --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_minimal_snippet_narrow.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +b0bf0a97122aa5979db751a897919389c9b44343 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_snippet.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_snippet.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..548e528b --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_snippet.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +f24dbd82c8006988995a1fb2d4891b73e59f51e3 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_snippet_narrow.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_snippet_narrow.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..e64914d --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-short_snippet_narrow.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +e163bd916b9fcd5972af5c2f425d73fa6cc9f842 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_dark_dominant_color.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_dark_dominant_color.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..7e07dee --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_dark_dominant_color.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +72f22bf38503a3e600cb5b706dad876141a89942 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_dark_thumbnail.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_dark_thumbnail.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..ff8ccb0 --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_dark_thumbnail.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +a31fcf7d5ac0101b683b227787acd5d009e5f07c \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_light_dominant_color.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_light_dominant_color.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..4c9892c3 --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_light_dominant_color.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +20f33f0b89a6fccfae11e461a8ed366568ec479e \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_light_thumbnail.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_light_thumbnail.Nexus_5-19.png.sha1 new file mode 100644 index 0000000..72afb093 --- /dev/null +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.NightModeEnabled-video_suggestion_with_light_thumbnail.Nexus_5-19.png.sha1
@@ -0,0 +1 @@ +316e08cb6a43da2d0ba16f9ea25e4cb89d3a4c92 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.download_snippet_placeholder.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.download_snippet_placeholder.Nexus_5-19.png.sha1 deleted file mode 100644 index 8cb7a57..0000000 --- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.download_snippet_placeholder.Nexus_5-19.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -672732a5a3221f428c99fe5179fe9462519b68b4 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.download_snippet_thumbnail.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.download_snippet_thumbnail.Nexus_5-19.png.sha1 deleted file mode 100644 index b7d3eb3..0000000 --- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.download_snippet_thumbnail.Nexus_5-19.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -1fbf6ff6a3f51a1e2beb7a927ee4df857f114b46 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.signin_promo.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ArticleSnippetsTest.signin_promo.Nexus_5-19.png.sha1 deleted file mode 100644 index 68c13843..0000000 --- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.signin_promo.Nexus_5-19.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -97e1c1173a61fb44940a07652740a9475337bdea \ No newline at end of file
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 d925165..7a316a7c 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
@@ -405,8 +405,6 @@ const containerTop = 10000; const containerWidth = 500; const containerHeight = 500; - const menuWidth = 150; - const menuHeight = 200; suiteSetup(function() { document.body.innerHTML = ` @@ -427,14 +425,6 @@ height: 1000px; width: 1000px; } - - cr-action-menu { - --cr-action-menu-dialog: { - height: ${menuHeight}px; - width: ${menuWidth}px; - padding: 0; - }; - } </style> <div id="container"> <div id="inner-container"> @@ -508,6 +498,8 @@ menu.showAt(dots, {anchorAlignmentX: AnchorAlignment.AFTER_START}); const buttonWidth = dots.offsetWidth; const buttonHeight = dots.offsetHeight; + const menuWidth = dialog.offsetWidth; + const menuHeight = dialog.offsetHeight; assertEquals(containerLeft - menuWidth + buttonWidth, dialog.offsetLeft); assertEquals(containerTop - menuHeight + buttonHeight, dialog.offsetTop); menu.close(); @@ -526,6 +518,7 @@ // Anchor to an item in RTL. document.body.style.direction = 'rtl'; menu.showAt(dots, {anchorAlignmentX: AnchorAlignment.AFTER_START}); + const menuWidth = dialog.offsetWidth; assertEquals( container.offsetLeft + containerWidth - menuWidth, dialog.offsetLeft); assertEquals(containerTop, dialog.offsetTop);
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index 7ff8a5c..a461210 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -154,8 +154,6 @@ connector, media_session_.get(), std::move(battery_monitor), service_->main_task_runner(), background_thread_.task_runner(), network_connection_tracker, service->assistant_state()->locale().value()); - connector->BindInterface(ash::mojom::kServiceName, - &ash_message_center_controller_); media_session::mojom::MediaControllerManagerPtr controller_manager_ptr; connector->BindInterface(media_session::mojom::kServiceName, @@ -911,7 +909,8 @@ if (modify_setting_args.setting_id() == kDoNotDisturbDeviceSettingId) { HandleOnOffChange(modify_setting_args, [&](bool enabled) { - ash_message_center_controller_->SetQuietMode(enabled); + this->service_->assistant_notification_controller()->SetQuietMode( + enabled); }); }
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h index 16975f7..474c32b5 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -9,7 +9,6 @@ #include <string> #include <vector> -#include "ash/public/interfaces/ash_message_center_controller.mojom.h" #include "ash/public/interfaces/assistant_controller.mojom.h" #include "base/synchronization/lock.h" #include "base/threading/thread.h" @@ -307,7 +306,6 @@ nullptr; mojo::InterfacePtrSet<mojom::AssistantInteractionSubscriber> interaction_subscribers_; - ash::mojom::AshMessageCenterControllerPtr ash_message_center_controller_; media_session::mojom::MediaControllerPtr media_controller_; Service* service_; // unowned.
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index 3c7a2e89..ac6f8835f 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -9,7 +9,7 @@ <translation id="2338501278241028356">በአቅራቢያ ያሉ መሣሪያዎችን ለማግኘት ብሉቱዝን ያብሩ</translation> <translation id="2805756323405976993">መተግበሪያዎች</translation> <translation id="2872961005593481000">ዝጋ</translation> -<translation id="3147142846278915599">ማስጀመሪያ (መተግበሪያዎችን በማመሳሰል ላይ...)</translation> +<translation id="3511655281162215899">እባክዎ አዲስ ይለፍ ቃል ወዲያውኑ ይምረጡ።</translation> <translation id="4731797938093519117">የወላጅ መዳረሻ</translation> <translation id="476166673298332917">የዚህ መሣሪያ አስተዳዳሪ የይለፍ ቃላት እና ግንኙነትን ጨምሮ የሁሉንም እንቅስቃሴ መዳረሻ አለው።</translation> <translation id="5212543919916444558">እኔ ላግዝ የምችልበት ምንም ነገር በእርስዎ ማያ ገጽ ላይ አላገኘሁም። @@ -17,6 +17,7 @@ <translation id="5222676887888702881">ዘግተህ ውጣ</translation> <translation id="5457599981699367932">እንደ እንግዳ ያስሱ</translation> <translation id="54609108002486618">የተቀናበረ</translation> +<translation id="5733345267661125295">እባክዎ አሁን አዲስ የይለፍ ቃል ይምረጡ</translation> <translation id="5832805196449965646">ሰው አክል</translation> <translation id="5895138241574237353">እንደገና ጀምር</translation> <translation id="6574601967010742428">የመሣሪያው አስተዳዳሪ የእርስዎን እንቅስቃሴ ሊከታተል ይችላል።</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index db17c28..d6449de 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">تشغيل البلوتوث لاكتشاف الأجهزة القريبة</translation> <translation id="2805756323405976993">التطبيقات</translation> <translation id="2872961005593481000">إيقاف التشغيل</translation> -<translation id="3147142846278915599">Launcher (مزامنة التطبيقات...)</translation> <translation id="3511655281162215899">يُرجى اختيار كلمة مرور جديدة فورًا.</translation> <translation id="4731797938093519117">وصول أحد الوالدين</translation> <translation id="476166673298332917">قد يراقب مشرف الجهاز نشاط التصفُح.</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index 1f5972d6..a04624b 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Включете Bluetooth, за да бъдат открити устройствата в близост</translation> <translation id="2805756323405976993">Приложения</translation> <translation id="2872961005593481000">Изключване</translation> -<translation id="3147142846278915599">Стартов панел (приложенията се синхронизират...)</translation> <translation id="3511655281162215899">Моля, изберете нова парола незабавно</translation> <translation id="4731797938093519117">Достъп на родител</translation> <translation id="476166673298332917">Администраторът на устройството може да наблюдава активността ви при сърфиране.</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index b25ba68..08cab36d 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">আশেপাশের ডিভাইস খুঁজে পেতে ব্লুটুথ চালু করুন</translation> <translation id="2805756323405976993">অ্যাপ্স</translation> <translation id="2872961005593481000">বন্ধ করুন</translation> -<translation id="3147142846278915599">লঞ্চার (অ্যাপ সিঙ্ক করা হচ্ছে...)</translation> <translation id="3511655281162215899">এখনই একটি নতুন পাসওয়ার্ড বেছে নিন</translation> <translation id="4731797938093519117">অভিভাবকীয় অ্যাক্সেস</translation> <translation id="476166673298332917">ডিভাইস প্রশাসক আপনার ব্রাউজিং অ্যাক্টিভিটি পর্যবেক্ষণ করতে পারেন।</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index 7403c5d..30dc3c9 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Activa el Bluetooth per detectar dispositius propers</translation> <translation id="2805756323405976993">Aplicacions</translation> <translation id="2872961005593481000">Apaga</translation> -<translation id="3147142846278915599">Launcher (s'estan sincronitzant les aplicacions...)</translation> <translation id="3511655281162215899">Tria una contrasenya nova immediatament</translation> <translation id="4731797938093519117">Accés parental</translation> <translation id="476166673298332917">És possible que l'administrador del dispositiu supervisi l'activitat de navegació.</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index e2e2374a..c4b51eb 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Chcete-li objevit okolní zařízení, zapněte Bluetooth</translation> <translation id="2805756323405976993">Aplikace</translation> <translation id="2872961005593481000">Vypnout</translation> -<translation id="3147142846278915599">Spouštěč (synchronizace aplikací...)</translation> <translation id="3511655281162215899">Ihned si zvolte nové heslo</translation> <translation id="4731797938093519117">Rodičovský přístup</translation> <translation id="476166673298332917">Správce tohoto zařízení může monitorovat vaše aktivity v prohlížeči.</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index e42c27e..d9ab15a 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Slå Bluetooth til for at opdage enheder i nærheden</translation> <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Sluk</translation> -<translation id="3147142846278915599">Starter (synkronisering af apps...)</translation> <translation id="3511655281162215899">Vælg straks en ny adgangskode</translation> <translation id="4731797938093519117">Forældreadgang</translation> <translation id="476166673298332917">Administratoren af enheden kan overvåge din browseraktivitet.</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 391110b..380bb353 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Aktivieren Sie Bluetooth, damit Geräte in der Nähe gefunden werden</translation> <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Herunterfahren</translation> -<translation id="3147142846278915599">Launcher (Apps werden synchronisiert...)</translation> <translation id="3511655281162215899">Bitte wählen Sie sofort ein neues Passwort aus</translation> <translation id="4731797938093519117">Elternfreigabe</translation> <translation id="476166673298332917">Der Geräteadministrator überwacht unter Umständen Ihre Browseraktivitäten.</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 2f4f8f6..c4d6715 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Ενεργοποιήστε το Bluetooth, για να εντοπίσετε κοντινές συσκευές</translation> <translation id="2805756323405976993">Εφαρμογές </translation> <translation id="2872961005593481000">Τερματισμός λειτουργίας</translation> -<translation id="3147142846278915599">Εφαρμογή εκκίνησης (συγχρονισμός εφαρμογών…)</translation> <translation id="3511655281162215899">Επιλέξτε άμεσα έναν νέο κωδικό πρόσβασης</translation> <translation id="4731797938093519117">Γονική πρόσβαση</translation> <translation id="476166673298332917">Ο διαχειριστής της συσκευής μπορεί να παρακολουθεί τη δραστηριότητα περιήγησής σας.</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index 05ba011..3ce8be5 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Turn on Bluetooth to discover nearby devices</translation> <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Shut down</translation> -<translation id="3147142846278915599">Launcher (syncing apps...)</translation> <translation id="3511655281162215899">Please choose a new password immediately</translation> <translation id="4731797938093519117">Parent access</translation> <translation id="476166673298332917">The device admin may monitor your browsing activity.</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb index e52b78a..7c8fac3d 100644 --- a/chromeos/strings/chromeos_strings_es-419.xtb +++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Activar Bluetooth para buscar los dispositivos cercanos</translation> <translation id="2805756323405976993">Aplicaciones</translation> <translation id="2872961005593481000">Cerrar</translation> -<translation id="3147142846278915599">Selector (sincronizando aplicaciones…)</translation> <translation id="3511655281162215899">Elige una contraseña nueva de inmediato</translation> <translation id="4731797938093519117">Acceso parental</translation> <translation id="476166673298332917">El administrador tiene acceso a toda la actividad, incluidas las contraseñas y comunicaciones.</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index 00ef0a5..747d5e6 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Activa el Bluetooth para encontrar dispositivos cercanos</translation> <translation id="2805756323405976993">Aplicaciones</translation> <translation id="2872961005593481000">Apagar</translation> -<translation id="3147142846278915599">Menú de aplicaciones (sincronizando aplicaciones...)</translation> <translation id="3511655281162215899">Elige una contraseña nueva inmediatamente</translation> <translation id="4731797938093519117">Acceso parental</translation> <translation id="476166673298332917">Es posible que el administrador del dispositivo supervise tu actividad de navegación.</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index f4c29c3..86943a3 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Lülitage Bluetooth sisse, et läheduses olevaid seadmeid avastada</translation> <translation id="2805756323405976993">Rakendused</translation> <translation id="2872961005593481000">Lülita välja</translation> -<translation id="3147142846278915599">Käivitusprogramm (rakenduste sünkroonimine ...)</translation> <translation id="3511655281162215899">Valige kohe uus parool</translation> <translation id="4731797938093519117">Vanema juurdepääs</translation> <translation id="476166673298332917">Seadme administraator võib jälgida teie sirvimistegevust.</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index 794055c..99bba6f 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">برای کاوش دستگاههای همین اطراف، بلوتوث را روشن کنید</translation> <translation id="2805756323405976993">برنامهها</translation> <translation id="2872961005593481000">خاموش کردن</translation> -<translation id="3147142846278915599">راه انداز (همگامسازی برنامهها...)</translation> <translation id="3511655281162215899">لطفاً گذرواژه جدیدی را فوراً انتخاب کنید</translation> <translation id="4731797938093519117">دسترسی والدین</translation> <translation id="476166673298332917">سرپرست دستگاه ممکن است فعالیت مرور شما را پایش کند.</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index 5859a63..a06901f 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Löydä lähellä olevat laitteet ottamalla ensin Bluetooth käyttöön.</translation> <translation id="2805756323405976993">Sovellukset</translation> <translation id="2872961005593481000">Sammuta</translation> -<translation id="3147142846278915599">Käynnistysohjelma (synkronoidaan sovelluksia…)</translation> <translation id="3511655281162215899">Valitse uusi salasana välittömästi</translation> <translation id="4731797938093519117">Avaus vanhemmille</translation> <translation id="476166673298332917">Laitteen järjestelmänvalvoja voi valvoa selaustoimintaasi.</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index 8b1b0a69..19d3454 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -9,7 +9,7 @@ <translation id="2338501278241028356">I-on ang Bluetooth upang tuklasin ang mga kalapit na device</translation> <translation id="2805756323405976993">Mga App</translation> <translation id="2872961005593481000">Shut down</translation> -<translation id="3147142846278915599">Launcher (nagsi-sync ng mga app...)</translation> +<translation id="3511655281162215899">Pumili ng bagong password kaagad</translation> <translation id="4731797938093519117">Pangunahing access</translation> <translation id="476166673298332917">Maaaring subaybayan ng admin ng device na ito ang iyong aktibidad sa pag-browse.</translation> <translation id="5212543919916444558">Wala akong makitang kahit ano sa iyong screen kung saan ako makakatulong. @@ -17,6 +17,7 @@ <translation id="5222676887888702881">Mag-sign out</translation> <translation id="5457599981699367932">Mag-browse bilang Bisita</translation> <translation id="54609108002486618">Pinamamahalaan</translation> +<translation id="5733345267661125295">Pumili ng bagong password ngayon</translation> <translation id="5832805196449965646">Magdagdag ng Tao</translation> <translation id="5895138241574237353">I-restart</translation> <translation id="6574601967010742428">Maaaring masubaybayan ng administrator ng device ang iyong aktibidad.</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 075d455..4a231d21 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Activer le Bluetooth pour découvrir les appareils à proximité</translation> <translation id="2805756323405976993">Applications</translation> <translation id="2872961005593481000">Éteindre</translation> -<translation id="3147142846278915599">Lanceur d'applications (synchronisation des applications en cours…)</translation> <translation id="3511655281162215899">Veuillez choisir un nouveau mot de passe immédiatement</translation> <translation id="4731797938093519117">Accès parental</translation> <translation id="476166673298332917">L'administrateur de cet appareil a accès à toute votre activité de navigation.</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index c2dd264..0083e4a7 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">નજીકનાં ડિવાઇસ શોધવા માટે Bluetooth ચાલુ કરો</translation> <translation id="2805756323405976993">એપ્સ</translation> <translation id="2872961005593481000">શટ ડાઉન કરો</translation> -<translation id="3147142846278915599">લોન્ચર (એપ્લિકેશન્સને સમન્વયિત કરી રહ્યું છે..)</translation> <translation id="3511655281162215899">કૃપા કરીને તરત જ નવો પાસવર્ડ પસંદ કરો</translation> <translation id="4731797938093519117">માતાપિતા માટે ઍક્સેસ</translation> <translation id="476166673298332917">ડિવાઇસ વ્યવસ્થાપક તમારી બ્રાઉઝિંગ પ્રવૃત્તિને મોનિટર કરી શકે છે.</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index 2d7f85f..e14be1f 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">आस-पास के डिवाइस खोजने के लिए ब्लूटूथ चालू करें</translation> <translation id="2805756323405976993">ऐप्स</translation> <translation id="2872961005593481000">शट डाउन करें</translation> -<translation id="3147142846278915599">लॉन्चर (ऐप्स समन्वयित किए जा रहे हैं...)</translation> <translation id="3511655281162215899">कृपया तुरंत कोई नया पासवर्ड चुनें</translation> <translation id="4731797938093519117">अभिभावक एक्सेस</translation> <translation id="476166673298332917">इस डिवाइस का एडमिन आपकी ब्राउज़िंग गतिविधि पर नज़र रख सकता है.</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 71f6090..e9b5872a 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Uključite Bluetooth da biste otkrili uređaje u blizini</translation> <translation id="2805756323405976993">Aplikacije</translation> <translation id="2872961005593481000">Isključi</translation> -<translation id="3147142846278915599">Pokretač (sinkronizacija aplikacija...)</translation> <translation id="3511655281162215899">Odmah odaberite novu zaporku</translation> <translation id="4731797938093519117">Roditeljski pristup</translation> <translation id="476166673298332917">Administrator uređaja može pratiti vašu aktivnost pregledavanja.</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index 5b648d8..2016ef60 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Kapcsolja be a Bluetooth-t a közeli eszközök felfedezéséhez</translation> <translation id="2805756323405976993">Alkalmazások</translation> <translation id="2872961005593481000">Leállítás</translation> -<translation id="3147142846278915599">Indító (alkalmazások szinkronizálása…)</translation> <translation id="3511655281162215899">Válasszon új jelszót most rögtön</translation> <translation id="4731797938093519117">Szülői hozzáférés</translation> <translation id="476166673298332917">Az eszköz rendszergazdája figyelheti a böngészési tevékenységét.</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index c408d84..73a1294 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Aktifkan Bluetooth untuk menemukan perangkat di sekitar</translation> <translation id="2805756323405976993">Apl</translation> <translation id="2872961005593481000">Matikan</translation> -<translation id="3147142846278915599">Peluncur (menyinkronkan aplikasi...)</translation> <translation id="3511655281162215899">Harap segera pilih sandi baru</translation> <translation id="4731797938093519117">Akses orang tua</translation> <translation id="476166673298332917">Admin perangkat dapat memantau aktivitas akses internet Anda.</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index d5495d1..eba7606 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Attiva il Bluetooth per trovare dispositivi nelle vicinanze</translation> <translation id="2805756323405976993">App</translation> <translation id="2872961005593481000">Spegni</translation> -<translation id="3147142846278915599">Avvio applicazioni (sincronizzazione delle app...)</translation> <translation id="3511655281162215899">Scegli subito una nuova password</translation> <translation id="4731797938093519117">Accesso genitore</translation> <translation id="476166673298332917">L'amministratore del dispositivo può controllare l'attività di navigazione.</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index b5f8bce..67e892b 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">יש להפעיל את Bluetooth כדי לאתר מכשירים קרובים</translation> <translation id="2805756323405976993">אפליקציות</translation> <translation id="2872961005593481000">כיבוי</translation> -<translation id="3147142846278915599">מרכז האפליקציות (האפליקציות מסתנכרנות...)</translation> <translation id="3511655281162215899">יש לבחור מיד סיסמה חדשה</translation> <translation id="4731797938093519117">גישת הורים</translation> <translation id="476166673298332917">מנהל המכשיר עשוי לנטר את פעילות הגלישה שלך.</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index 03a39e2..c1115b2 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">近くのデバイスを検出するには Bluetooth をオンにしてください</translation> <translation id="2805756323405976993">アプリ</translation> <translation id="2872961005593481000">終了</translation> -<translation id="3147142846278915599">ランチャー(アプリを同期中...)</translation> <translation id="3511655281162215899">直ちに新しいパスワードを選択してください</translation> <translation id="4731797938093519117">保護者によるアクセス</translation> <translation id="476166673298332917">デバイス管理者が閲覧アクティビティを監視している可能性があります。</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index b86c7a1..7a2cb1b 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">ಸಮೀಪದ ಸಾಧನಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ</translation> <translation id="2805756323405976993">ಆಪ್ಸ್</translation> <translation id="2872961005593481000">ಮುಚ್ಚಿಬಿಡಿ </translation> -<translation id="3147142846278915599">ಲಾಂಚರ್ (ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ...)</translation> <translation id="3511655281162215899">ತಕ್ಷಣವೇ ಹೊಸ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="4731797938093519117">ಪೋಷಕ ಪ್ರವೇಶ ಬಟನ್</translation> <translation id="476166673298332917">ಈ ಡಿವೈಸ್ ನಿರ್ವಾಹಕರು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಗಮನಿಸಬಹುದು.</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 2d953f9..4a0c92f5 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">블루투스를 사용 설정하여 근처 기기 탐색</translation> <translation id="2805756323405976993">앱</translation> <translation id="2872961005593481000">종료</translation> -<translation id="3147142846278915599">런처(앱 동기화 중...)</translation> <translation id="3511655281162215899">즉시 새 비밀번호를 선택해 주세요.</translation> <translation id="4731797938093519117">부모 액세스</translation> <translation id="476166673298332917">기기 관리자가 탐색 활동을 모니터링할 수 있습니다.</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index 988634d4..466565a 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Įjunkite „Bluetooth“, kad aptiktumėte įrenginius netoliese</translation> <translation id="2805756323405976993">Taikomosios programos</translation> <translation id="2872961005593481000">Stabdyti</translation> -<translation id="3147142846278915599">Paleidimo priemonė (sinchronizuojamos programos...)</translation> <translation id="3511655281162215899">Iškart pasirinkite naują slaptažodį</translation> <translation id="4731797938093519117">Tėvų prieiga</translation> <translation id="476166673298332917">Šio įrenginio administratorius gali stebėti jūsų naršymo veiklą.</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb index 2aea884d..708c62f5 100644 --- a/chromeos/strings/chromeos_strings_lv.xtb +++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Ieslēdziet Bluetooth, lai atklātu tuvumā esošas ierīces</translation> <translation id="2805756323405976993">Lietotnes</translation> <translation id="2872961005593481000">Beidzēt</translation> -<translation id="3147142846278915599">Palaišanas programma (notiek lietotņu sinhronizēšana...)</translation> <translation id="3511655281162215899">Lūdzu, nekavējoties izvēlieties jaunu paroli.</translation> <translation id="4731797938093519117">Vecāku piekļuve</translation> <translation id="476166673298332917">Ierīces administrators var novērot visas jūsu pārlūkošanas darbības.</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 4864215..71416d51 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">സമീപത്തുള്ള ഉപകരണങ്ങൾ കണ്ടെത്താൻ Bluetooth ഓണാക്കുക</translation> <translation id="2805756323405976993">ആപ്സ്</translation> <translation id="2872961005593481000">അടയ്ക്കുക</translation> -<translation id="3147142846278915599">ലോഞ്ചർ (അപ്ലിക്കേഷൻ സമന്വയിപ്പിക്കുന്നു...)</translation> <translation id="3511655281162215899">പുതിയ പാസ്വേഡ് എത്രയും പെട്ടെന്ന് തിരഞ്ഞെടുക്കുക</translation> <translation id="4731797938093519117">രക്ഷാകർതൃ ആക്സസ്</translation> <translation id="476166673298332917">ഉപകരണ അഡ്മിൻ നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി നിരീക്ഷിച്ചേക്കാം.</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb index 80b31ff7..08072ee6 100644 --- a/chromeos/strings/chromeos_strings_mr.xtb +++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">जवळपासचे डिव्हाइस शोधण्यासाठी ब्लूटूथ सुरू करा</translation> <translation id="2805756323405976993">ॲप्लिकेशन</translation> <translation id="2872961005593481000">बंद करा</translation> -<translation id="3147142846278915599">लाँचर (संकालन ॲप्स...)</translation> <translation id="3511655281162215899">कृपया लगेच नवीन पासवर्ड निवडा</translation> <translation id="4731797938093519117">पालक अॅक्सेस</translation> <translation id="476166673298332917">डिव्हाइस प्रशासक तुमच्या ब्राउझिंग ॲक्टिव्हिटीचे परीक्षण करू शकतो.</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index 1d6b587..bdf125c 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Hidupkan Bluetooth untuk menemui peranti berdekatan</translation> <translation id="2805756323405976993">Apl</translation> <translation id="2872961005593481000">Mematikan</translation> -<translation id="3147142846278915599">Pelancar (menyegerakkan apl...)</translation> <translation id="3511655281162215899">Sila pilih kata laluan baharu dengan segera</translation> <translation id="4731797938093519117">Akses ibu bapa</translation> <translation id="476166673298332917">Pentadbir peranti boleh memantau aktiviti penyemakan imbas anda.</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index 99f769f..fb331f2 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Schakel Bluetooth in om apparaten in de buurt te vinden</translation> <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Afsluiten</translation> -<translation id="3147142846278915599">Launcher (apps synchroniseren...)</translation> <translation id="3511655281162215899">Kies onmiddellijk een nieuw wachtwoord</translation> <translation id="4731797938093519117">Toegang door ouders</translation> <translation id="476166673298332917">De apparaatbeheerder heeft toegang tot alle activiteit, inclusief wachtwoorden en communicatie.</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index 2ad89bbd..6b0d1f24 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Slå på Bluetooth for å finne enheter i nærheten</translation> <translation id="2805756323405976993">Apper</translation> <translation id="2872961005593481000">Slå av</translation> -<translation id="3147142846278915599">Appoversikt (synkroniserer apper ...)</translation> <translation id="3511655281162215899">Velg et nytt passord umiddelbart</translation> <translation id="4731797938093519117">Foreldretilgang</translation> <translation id="476166673298332917">Enhetsadministratoren har tilgang til nettleseraktiviteten din.</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index 84367101..018d78b 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Włącz Bluetooth, by wykryć urządzenia w pobliżu</translation> <translation id="2805756323405976993">Aplikacje</translation> <translation id="2872961005593481000">Wyłącz</translation> -<translation id="3147142846278915599">Menu z aplikacjami (synchronizuję aplikacje...)</translation> <translation id="3511655281162215899">Jak najszybciej zmień hasło</translation> <translation id="4731797938093519117">Dostęp rodzica</translation> <translation id="476166673298332917">Administrator urządzenia może monitorować Twoją aktywność związaną z przeglądaniem.</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index 014cab36..77d82c3 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Ativar o Bluetooth para descobrir dispositivos nas proximidades</translation> <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Desligar</translation> -<translation id="3147142846278915599">Tela de início (sincronizando aplicativos...)</translation> <translation id="3511655281162215899">Escolha uma nova senha imediatamente</translation> <translation id="4731797938093519117">Acesso de pai/mãe</translation> <translation id="476166673298332917">O administrador deste dispositivo poderá monitorar sua atividade de navegação.</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb index 5f08d30..f5c0f3b 100644 --- a/chromeos/strings/chromeos_strings_pt-PT.xtb +++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Ativar o Bluetooth para detetar dispositivos próximos</translation> <translation id="2805756323405976993">Aplicações</translation> <translation id="2872961005593481000">Encerrar</translation> -<translation id="3147142846278915599">Launcher (a sincronizar aplicações...)</translation> <translation id="3511655281162215899">Escolha uma nova palavra-passe imediatamente.</translation> <translation id="4731797938093519117">Acesso parental</translation> <translation id="476166673298332917">O administrador deste dispositivo poderá monitorizar a sua atividade de navegação.</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index 480e6c34..29d115e 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Pentru a descoperi dispozitivele din apropiere, activează Bluetooth</translation> <translation id="2805756323405976993">Aplicații</translation> <translation id="2872961005593481000">Închide</translation> -<translation id="3147142846278915599">Lansator (se sincronizează aplicațiile...)</translation> <translation id="3511655281162215899">Alege imediat o parolă nouă</translation> <translation id="4731797938093519117">Acces pentru părinți</translation> <translation id="476166673298332917">Administratorul dispozitivului îți poate monitoriza activitatea de navigare.</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index ddb25422..abd4b58 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Включите Bluetooth, чтобы найти устройства</translation> <translation id="2805756323405976993">Приложения</translation> <translation id="2872961005593481000">Завершить работу</translation> -<translation id="3147142846278915599">Панель запуска (синхронизация приложений...)</translation> <translation id="3511655281162215899">Смените его как можно скорее.</translation> <translation id="4731797938093519117">Родительский доступ</translation> <translation id="476166673298332917">Администратору устройства доступна информация о том, какие страницы вы просматриваете в браузере.</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index 666aaea..d219b7e 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Ak chcete nájsť zariadenia v okolí, zapnite Bluetooth</translation> <translation id="2805756323405976993">Aplikácie</translation> <translation id="2872961005593481000">Vypnúť</translation> -<translation id="3147142846278915599">Spúšťač (synchronizujú sa aplikácie...)</translation> <translation id="3511655281162215899">Ihneď vyberte nové heslo</translation> <translation id="4731797938093519117">Rodičovský prístup</translation> <translation id="476166673298332917">Správca zariadenia môže sledovať vašu aktivitu prehliadania.</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index ccd4c00..d3632233 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Vklopite Bluetooth, če želite odkriti naprave v bližini</translation> <translation id="2805756323405976993">Aplikacije</translation> <translation id="2872961005593481000">Zaustavitev</translation> -<translation id="3147142846278915599">Zaganjalnik (sinhronizacija aplikacij ...)</translation> <translation id="3511655281162215899">Takoj izberite novo geslo</translation> <translation id="4731797938093519117">Starševski dostop</translation> <translation id="476166673298332917">Skrbnik naprave morda spremlja vašo dejavnost brskanja.</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 779ae78..52f24ca 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Укључите Bluetooth да бисте открили уређаје у близини</translation> <translation id="2805756323405976993">Апликације</translation> <translation id="2872961005593481000">Искључи</translation> -<translation id="3147142846278915599">Покретач (апликације се синхронизују...)</translation> <translation id="3511655281162215899">Одмах одаберите нову лозинку</translation> <translation id="4731797938093519117">Родитељски приступ</translation> <translation id="476166673298332917">Администратор овог уређаја може да надгледа активности прегледања.</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index d21e9c97..933708d 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Aktivera Bluetooth så att det går att upptäcka enheter i närheten</translation> <translation id="2805756323405976993">Appar</translation> <translation id="2872961005593481000">Stäng av</translation> -<translation id="3147142846278915599">Översikt (appar synkroniseras …)</translation> <translation id="3511655281162215899">Välj ett nytt lösenord genast</translation> <translation id="4731797938093519117">Föräldraåtkomst</translation> <translation id="476166673298332917">Enhetens administratör kan övervaka din webbhistorik</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index d809d80..99064bbd 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Washa Bluetooth ili ugundue vifaa vilivyo karibu</translation> <translation id="2805756323405976993">Programu</translation> <translation id="2872961005593481000">Zima</translation> -<translation id="3147142846278915599">Kifungua programu (inasawazisha programu...)</translation> <translation id="3511655281162215899">Tafadhali chagua nenosiri jipya mara moja</translation> <translation id="4731797938093519117">Idhini ya mzazi</translation> <translation id="476166673298332917">Msimamizi wa kifaa hiki anaweza kufuatilia shughuli zako za kuvinjari.</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index 54e2a56..e19fe354 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -3,12 +3,12 @@ <translationbundle lang="ta"> <translation id="1510238584712386396">துவக்கி</translation> <translation id="1734367976349034509">இந்தச் சாதனத்தை நிர்வகிப்பது: நிறுவனம்</translation> +<translation id="1930797645656624981">Chrome OS உள்ளீட்டு முறை சேவை</translation> <translation id="2049639323467105390"><ph name="DOMAIN" /> ஆல் இந்த சாதனம் நிர்வகிக்கப்படுகிறது.</translation> <translation id="2083960536266308407">திரையில் எதுவுமில்லை</translation> <translation id="2338501278241028356">அருகிலுள்ள சாதனங்களைக் கண்டறிய, புளூடூத்தை இயக்கவும்</translation> <translation id="2805756323405976993">ஆப்ஸ்</translation> <translation id="2872961005593481000">நிறுத்து</translation> -<translation id="3147142846278915599">துவக்கி (பயன்பாடுகளை ஒத்திசைக்கிறது...)</translation> <translation id="4731797938093519117">பெற்றோர் அணுகல்</translation> <translation id="476166673298332917">சாதன நிர்வாகி உங்கள் உலாவல் செயல்பாட்டைக் கண்காணிக்கக்கூடும்.</translation> <translation id="5212543919916444558">உங்களுக்கு நான் உதவும் வகையில், உங்கள் திரையில் எதுவுமில்லை.
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index ceeca14..e69e88c 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">సమీప పరికరాలను కనుగొనడానికి బ్లూటూత్ను ఆన్ చేయండి</translation> <translation id="2805756323405976993">యాప్స్</translation> <translation id="2872961005593481000">షట్ డౌన్ చెయ్యండి</translation> -<translation id="3147142846278915599">లాంచర్ (అనువర్తనాలను సమకాలీకరిస్తోంది...)</translation> <translation id="3511655281162215899">దయచేసి వెంటనే కొత్త పాస్వర్డ్ను ఎంచుకోండి</translation> <translation id="4731797938093519117">తల్లి/తండ్రి యాక్సెస్</translation> <translation id="476166673298332917">పరికర నిర్వాహకులు మీ బ్రౌజింగ్ కార్యకలాపాన్ని పర్యవేక్షించవచ్చు.</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 8d65f54..5d9718a 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">เปิดบลูทูธเพื่อค้นหาอุปกรณ์ใกล้เคียง</translation> <translation id="2805756323405976993">แอป</translation> <translation id="2872961005593481000">ปิด</translation> -<translation id="3147142846278915599">Launcher (กำลังซิงค์แอป...)</translation> <translation id="3511655281162215899">โปรดเลือกรหัสผ่านใหม่ทันที</translation> <translation id="4731797938093519117">การเข้าถึงของผู้ปกครอง</translation> <translation id="476166673298332917">ผู้ดูแลระบบของอุปกรณ์อาจตรวจสอบกิจกรรมการท่องเว็บของคุณ</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index e061721a..d61879f 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Yakındaki cihazları keşfetmek için Bluetooth'u aç</translation> <translation id="2805756323405976993">Uygulamalar</translation> <translation id="2872961005593481000">Kapat</translation> -<translation id="3147142846278915599">Launcher (uygulamalar senkronize ediliyor...)</translation> <translation id="3511655281162215899">Lütfen hemen yeni bir şifre seçin</translation> <translation id="4731797938093519117">Ebeveyn erişimi</translation> <translation id="476166673298332917">Cihaz yöneticisi göz atma etkinliğinizi izleyebilir.</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 818fff9..5d36af0 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Щоб знайти пристрої поблизу, увімкніть Bluetooth</translation> <translation id="2805756323405976993">Додатки</translation> <translation id="2872961005593481000">Завершити роботу</translation> -<translation id="3147142846278915599">Панель запуску (синхронізація додатків…)</translation> <translation id="3511655281162215899">Негайно виберіть новий пароль</translation> <translation id="4731797938093519117">Батьківський доступ</translation> <translation id="476166673298332917">Адміністратор пристрою може бачити, що ви робите в Інтернеті.</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index 375ee99..ba0aecb 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">Bật Bluetooth để khám phá các thiết bị lân cận</translation> <translation id="2805756323405976993">Ứng dụng</translation> <translation id="2872961005593481000">Tắt</translation> -<translation id="3147142846278915599">Trình khởi chạy (đang đồng bộ hóa ứng dụng...)</translation> <translation id="3511655281162215899">Vui lòng chọn một mật khẩu mới ngay lập tức</translation> <translation id="4731797938093519117">Quyền truy cập của cha mẹ</translation> <translation id="476166673298332917">Quản trị viên thiết bị có thể theo dõi hoạt động duyệt web của bạn.</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index c2002c0..f294d43 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">开启蓝牙以发现附近的设备</translation> <translation id="2805756323405976993">应用</translation> <translation id="2872961005593481000">关机</translation> -<translation id="3147142846278915599">启动器(正在同步应用…)</translation> <translation id="3511655281162215899">请立即选择新密码</translation> <translation id="4731797938093519117">家长访问</translation> <translation id="476166673298332917">此设备的管理员可能会监控您的浏览活动。</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index 9710d14..56b8ca19 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -9,7 +9,6 @@ <translation id="2338501278241028356">開啟藍牙即可偵測附近的裝置</translation> <translation id="2805756323405976993">應用程式</translation> <translation id="2872961005593481000">關閉</translation> -<translation id="3147142846278915599">啟動器 (正在同步處理應用程式...)</translation> <translation id="3511655281162215899">請立即選擇新的密碼</translation> <translation id="4731797938093519117">家長存取</translation> <translation id="476166673298332917">裝置管理員可能會監控你的瀏覽活動。</translation>
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h index 84092ec..793b0d3 100644 --- a/components/autofill/core/browser/autofill_client.h +++ b/components/autofill/core/browser/autofill_client.h
@@ -344,10 +344,8 @@ UploadSaveCardPromptCallback callback) = 0; // Called after credit card upload is finished. Will show upload result to - // users. - // TODO(crbug.com/964127): It handles only failure branch now. Success branch - // will be added later. - virtual void CreditCardUploadCompleted() = 0; + // users. |card_saved| indicates if the card is successfully saved. + virtual void CreditCardUploadCompleted(bool card_saved) = 0; // Will show an infobar to get user consent for Credit Card assistive filling. // Will run |callback| on success.
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager.cc b/components/autofill/core/browser/payments/credit_card_save_manager.cc index 3b19991..05520d91 100644 --- a/components/autofill/core/browser/payments/credit_card_save_manager.cc +++ b/components/autofill/core/browser/payments/credit_card_save_manager.cc
@@ -316,19 +316,17 @@ // removed. GetCreditCardSaveStrikeDatabase()->ClearStrikes( base::UTF16ToUTF8(upload_request_.card.LastFourDigits())); - } else { - if (show_save_prompt_.has_value() && show_save_prompt_.value()) { - // If the upload failed and the bubble was actually shown (NOT just the - // icon), count that as a strike against offering upload in the future. - int nth_strike_added = GetCreditCardSaveStrikeDatabase()->AddStrike( - base::UTF16ToUTF8(upload_request_.card.LastFourDigits())); - // Notify the browsertests that a strike was added. - OnStrikeChangeComplete(nth_strike_added); - } - - // Show credit card upload feedback. - client_->CreditCardUploadCompleted(); + } else if (show_save_prompt_.has_value() && show_save_prompt_.value()) { + // If the upload failed and the bubble was actually shown (NOT just the + // icon), count that as a strike against offering upload in the future. + int nth_strike_added = GetCreditCardSaveStrikeDatabase()->AddStrike( + base::UTF16ToUTF8(upload_request_.card.LastFourDigits())); + // Notify the browsertests that a strike was added. + OnStrikeChangeComplete(nth_strike_added); } + + // Show credit card upload feedback. + client_->CreditCardUploadCompleted(result == AutofillClient::SUCCESS); } CreditCardSaveStrikeDatabase*
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc index c0eba6c..541db48 100644 --- a/components/autofill/core/browser/test_autofill_client.cc +++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -152,7 +152,7 @@ std::move(callback).Run(AutofillClient::ACCEPTED, {}); } -void TestAutofillClient::CreditCardUploadCompleted() {} +void TestAutofillClient::CreditCardUploadCompleted(bool card_saved) {} void TestAutofillClient::ConfirmCreditCardFillAssist( const CreditCard& card,
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h index b4a3eb4..2c77cdd 100644 --- a/components/autofill/core/browser/test_autofill_client.h +++ b/components/autofill/core/browser/test_autofill_client.h
@@ -82,7 +82,7 @@ std::unique_ptr<base::DictionaryValue> legal_message, SaveCreditCardOptions options, UploadSaveCardPromptCallback callback) override; - void CreditCardUploadCompleted() override; + void CreditCardUploadCompleted(bool card_saved) override; void ConfirmCreditCardFillAssist(const CreditCard& card, base::OnceClosure callback) override; bool HasCreditCardScanFeature() override;
diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc index 550bbfc..7401fcd 100644 --- a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc +++ b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc
@@ -194,10 +194,7 @@ } bool was_preview_shown = false; - if (request_data.lofi_received() || request_data.client_lofi_requested()) { - request->set_previews_type(PageloadMetrics_PreviewsType_LOFI); - was_preview_shown = true; - } else if (request_data.lite_page_received()) { + if (request_data.lite_page_received()) { request->set_previews_type(PageloadMetrics_PreviewsType_LITE_PAGE); was_preview_shown = true; } else if (request_data.black_listed()) {
diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl_unittest.cc b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl_unittest.cc index d74a19e3..f9917a4 100644 --- a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl_unittest.cc +++ b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl_unittest.cc
@@ -140,9 +140,7 @@ page_id_ = 0u; } - void CreateAndSendPingback(bool lofi_received, - bool client_lofi_requested, - bool lite_page_received, + void CreateAndSendPingback(bool lite_page_received, bool app_background_occurred, bool opt_out_occurred, bool crash, @@ -189,9 +187,7 @@ net::EFFECTIVE_CONNECTION_TYPE_OFFLINE); request_data.set_connection_type( net::NetworkChangeNotifier::CONNECTION_UNKNOWN); - request_data.set_lofi_received(lofi_received); request_data.set_black_listed(black_listed); - request_data.set_client_lofi_requested(client_lofi_requested); request_data.set_lite_page_received(lite_page_received); request_data.set_page_id(page_id_); static_cast<DataReductionProxyPingbackClient*>(pingback_client()) @@ -266,7 +262,6 @@ pingback_client()->set_current_time(current_time); uint64_t data_page_id = page_id(); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -365,7 +360,6 @@ static_cast<DataReductionProxyPingbackClient*>(pingback_client()) ->SetPingbackReportingFraction(1.0f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -392,7 +386,6 @@ pingback_client()->set_current_time(current_time); // First pingback CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -402,14 +395,12 @@ std::list<uint64_t> page_ids; page_ids.push_back(page_id()); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 2); page_ids.push_back(page_id()); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -505,13 +496,11 @@ static_cast<DataReductionProxyPingbackClient*>(pingback_client()) ->SetPingbackReportingFraction(1.0f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -530,7 +519,6 @@ static_cast<DataReductionProxyPingbackClient*>(pingback_client()) ->SetPingbackReportingFraction(0.0f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -549,7 +537,6 @@ ->SetPingbackReportingFraction(0.5f); pingback_client()->OverrideRandom(true, 0.4f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -562,7 +549,6 @@ // the pingback is not created. pingback_client()->OverrideRandom(true, 0.6f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -576,7 +562,6 @@ ->SetPingbackReportingFraction(0.0f); pingback_client()->OverrideRandom(true, 0.0f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -590,7 +575,6 @@ ->SetPingbackReportingFraction(0.0f); pingback_client()->OverrideRandom(true, 1.0f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -610,7 +594,6 @@ factory()->ClearResponses(); factory()->AddResponse(pingback_url().spec(), "", net::HTTP_UNAUTHORIZED); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -620,111 +603,6 @@ histogram_tester().ExpectUniqueSample(kHistogramSucceeded, false, 1); } -TEST_F(DataReductionProxyPingbackClientImplTest, VerifyLoFiContentNoOptOut) { - Init(); - EXPECT_EQ(num_network_requests(), 0); - pingback_client()->OverrideRandom(true, 0.5f); - static_cast<DataReductionProxyPingbackClient*>(pingback_client()) - ->SetPingbackReportingFraction(1.0f); - base::Time current_time = base::Time::UnixEpoch(); - pingback_client()->set_current_time(current_time); - CreateAndSendPingback( - true /* lofi_received */, false /* client_lofi_requested */, - false /* lite_page_received */, false /* app_background_occurred */, - false /* opt_out_occurred */, false /* renderer_crash */, - false /* black_listed */); - EXPECT_EQ(num_network_requests(), 1); - histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1); - EXPECT_EQ(upload_content_type(), "application/x-protobuf"); - RecordPageloadMetricsRequest batched_request; - batched_request.ParseFromString(upload_data()); - EXPECT_EQ(batched_request.pageloads_size(), 1); - PageloadMetrics pageload_metrics = batched_request.pageloads(0); - EXPECT_EQ(PageloadMetrics_PreviewsType_LOFI, - pageload_metrics.previews_type()); - EXPECT_EQ(PageloadMetrics_PreviewsOptOut_NON_OPT_OUT, - pageload_metrics.previews_opt_out()); -} - -TEST_F(DataReductionProxyPingbackClientImplTest, VerifyLoFiContentOptOut) { - Init(); - EXPECT_EQ(num_network_requests(), 0); - pingback_client()->OverrideRandom(true, 0.5f); - static_cast<DataReductionProxyPingbackClient*>(pingback_client()) - ->SetPingbackReportingFraction(1.0f); - base::Time current_time = base::Time::UnixEpoch(); - pingback_client()->set_current_time(current_time); - CreateAndSendPingback( - true /* lofi_received */, false /* client_lofi_requested */, - false /* lite_page_received */, false /* app_background_occurred */, - true /* opt_out_occurred */, false /* renderer_crash */, - false /* black_listed */); - EXPECT_EQ(num_network_requests(), 1); - histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1); - EXPECT_EQ(upload_content_type(), "application/x-protobuf"); - RecordPageloadMetricsRequest batched_request; - batched_request.ParseFromString(upload_data()); - EXPECT_EQ(batched_request.pageloads_size(), 1); - PageloadMetrics pageload_metrics = batched_request.pageloads(0); - EXPECT_EQ(PageloadMetrics_PreviewsType_LOFI, - pageload_metrics.previews_type()); - EXPECT_EQ(PageloadMetrics_PreviewsOptOut_OPT_OUT, - pageload_metrics.previews_opt_out()); -} - -TEST_F(DataReductionProxyPingbackClientImplTest, - VerifyClientLoFiContentOptOut) { - Init(); - EXPECT_EQ(num_network_requests(), 0); - pingback_client()->OverrideRandom(true, 0.5f); - static_cast<DataReductionProxyPingbackClient*>(pingback_client()) - ->SetPingbackReportingFraction(1.0f); - base::Time current_time = base::Time::UnixEpoch(); - pingback_client()->set_current_time(current_time); - CreateAndSendPingback( - false /* lofi_received */, true /* client_lofi_requested */, - false /* lite_page_received */, false /* app_background_occurred */, - true /* opt_out_occurred */, false /* renderer_crash */, - false /* black_listed */); - EXPECT_EQ(num_network_requests(), 1); - histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1); - EXPECT_EQ(upload_content_type(), "application/x-protobuf"); - RecordPageloadMetricsRequest batched_request; - batched_request.ParseFromString(upload_data()); - EXPECT_EQ(batched_request.pageloads_size(), 1); - PageloadMetrics pageload_metrics = batched_request.pageloads(0); - EXPECT_EQ(PageloadMetrics_PreviewsType_LOFI, - pageload_metrics.previews_type()); - EXPECT_EQ(PageloadMetrics_PreviewsOptOut_OPT_OUT, - pageload_metrics.previews_opt_out()); -} - -TEST_F(DataReductionProxyPingbackClientImplTest, VerifyLoFiContentBackground) { - Init(); - EXPECT_EQ(num_network_requests(), 0); - pingback_client()->OverrideRandom(true, 0.5f); - static_cast<DataReductionProxyPingbackClient*>(pingback_client()) - ->SetPingbackReportingFraction(1.0f); - base::Time current_time = base::Time::UnixEpoch(); - pingback_client()->set_current_time(current_time); - CreateAndSendPingback( - true /* lofi_received */, false /* client_lofi_requested */, - false /* lite_page_received */, true /* app_background_occurred */, - true /* opt_out_occurred */, false /* renderer_crash */, - false /* black_listed */); - EXPECT_EQ(num_network_requests(), 1); - histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1); - EXPECT_EQ(upload_content_type(), "application/x-protobuf"); - RecordPageloadMetricsRequest batched_request; - batched_request.ParseFromString(upload_data()); - EXPECT_EQ(batched_request.pageloads_size(), 1); - PageloadMetrics pageload_metrics = batched_request.pageloads(0); - EXPECT_EQ(PageloadMetrics_PreviewsType_LOFI, - pageload_metrics.previews_type()); - EXPECT_EQ(PageloadMetrics_PreviewsOptOut_UNKNOWN, - pageload_metrics.previews_opt_out()); -} - TEST_F(DataReductionProxyPingbackClientImplTest, VerifyBlackListContent) { Init(); EXPECT_EQ(num_network_requests(), 0); @@ -734,7 +612,6 @@ base::Time current_time = base::Time::UnixEpoch(); pingback_client()->set_current_time(current_time); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, false /* renderer_crash */, true /* black_listed */); @@ -760,7 +637,6 @@ base::Time current_time = base::Time::UnixEpoch(); pingback_client()->set_current_time(current_time); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, true /* lite_page_received */, false /* app_background_occurred */, true /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -786,7 +662,6 @@ base::Time current_time = base::Time::UnixEpoch(); pingback_client()->set_current_time(current_time); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, true /* lite_page_received */, false /* app_background_occurred */, true /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -801,7 +676,6 @@ EXPECT_EQ(PageloadMetrics_PreviewsOptOut_OPT_OUT, pageload_metrics.previews_opt_out()); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, true /* lite_page_received */, false /* app_background_occurred */, true /* opt_out_occurred */, false /* renderer_crash */, false /* black_listed */); @@ -824,7 +698,6 @@ ->SetPingbackReportingFraction(1.0f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, true /* renderer_crash */, false /* black_listed */); @@ -855,7 +728,6 @@ ->SetPingbackReportingFraction(1.0f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, true /* renderer_crash */, false /* black_listed */); @@ -887,7 +759,6 @@ ->SetPingbackReportingFraction(1.0f); CreateAndSendPingback( - false /* lofi_received */, false /* client_lofi_requested */, false /* lite_page_received */, false /* app_background_occurred */, false /* opt_out_occurred */, true /* renderer_crash */, false /* black_listed */);
diff --git a/components/data_reduction_proxy/content/common/header_util.cc b/components/data_reduction_proxy/content/common/header_util.cc index 5cfecb71a..74f1910 100644 --- a/components/data_reduction_proxy/content/common/header_util.cc +++ b/components/data_reduction_proxy/content/common/header_util.cc
@@ -39,22 +39,6 @@ if ((previews_state & content::SERVER_LITE_PAGE_ON) && resource_type == content::ResourceType::kMainFrame) { accept_transform_value = lite_page_directive(); - } else if ((previews_state & content::SERVER_LOFI_ON)) { - // Note that for subresource requests, the Lo-Fi bit should only be set - // if the main frame response provided the "empty-image" directive (for - // the client to echo back to the server here for any image resources). - // Also, it should only be set for subresource requests that might be - // image requests. - bool resource_type_supports_empty_image = - !(resource_type == content::ResourceType::kMainFrame || - resource_type == content::ResourceType::kStylesheet || - resource_type == content::ResourceType::kScript || - resource_type == content::ResourceType::kFontResource || - resource_type == content::ResourceType::kMedia || - resource_type == content::ResourceType::kCspReport); - if (resource_type_supports_empty_image) { - accept_transform_value = empty_image_directive(); - } } if (accept_transform_value.empty())
diff --git a/components/data_reduction_proxy/content/common/header_util_unittest.cc b/components/data_reduction_proxy/content/common/header_util_unittest.cc index 23596b0..992ad5e 100644 --- a/components/data_reduction_proxy/content/common/header_util_unittest.cc +++ b/components/data_reduction_proxy/content/common/header_util_unittest.cc
@@ -29,10 +29,7 @@ {GURL(kHttpsUrl), content::ResourceType::kMedia, 0, ""}, {GURL(kUrl), content::ResourceType::kMainFrame, content::SERVER_LITE_PAGE_ON, lite_page_directive()}, - {GURL(kUrl), content::ResourceType::kSubFrame, content::SERVER_LOFI_ON, - empty_image_directive()}, {GURL(kUrl), content::ResourceType::kSubFrame, 0, ""}, - {GURL(kUrl), content::ResourceType::kScript, content::SERVER_LOFI_ON, ""}, }; for (const auto& test : tests) {
diff --git a/components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer.cc b/components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer.cc index dffaed197..76938b6 100644 --- a/components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer.cc +++ b/components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer.cc
@@ -18,37 +18,6 @@ namespace data_reduction_proxy { -namespace { - -bool HasEmptyImageDirective(const blink::WebURLResponse& web_url_response) { - std::string chrome_proxy_value = - web_url_response - .HttpHeaderField(blink::WebString::FromUTF8(chrome_proxy_header())) - .Utf8(); - for (const auto& directive : - base::SplitStringPiece(chrome_proxy_value, ",", base::TRIM_WHITESPACE, - base::SPLIT_WANT_NONEMPTY)) { - if (!base::StartsWith(directive, page_policies_directive(), - base::CompareCase::INSENSITIVE_ASCII)) { - continue; - } - - // Check policy directive for empty-image entry. - base::StringPiece page_policies_value = base::StringPiece(directive).substr( - strlen(page_policies_directive()) + 1); - for (const auto& policy : - base::SplitStringPiece(page_policies_value, "|", base::TRIM_WHITESPACE, - base::SPLIT_WANT_NONEMPTY)) { - if (base::LowerCaseEqualsASCII(policy, empty_image_directive())) { - return true; - } - } - } - return false; -} - -} // namespace - ContentPreviewsRenderFrameObserver::ContentPreviewsRenderFrameObserver( content::RenderFrame* render_frame) : content::RenderFrameObserver(render_frame) {} @@ -69,14 +38,8 @@ DCHECK_EQ(has_lite_page_state, has_lite_page_directive) << "Inconsistent PreviewsState ServerLitePage:" << has_lite_page_state << " header:" << has_lite_page_directive; - bool has_lofi_state = previews_state & content::SERVER_LOFI_ON; - bool has_empty_image_directive = HasEmptyImageDirective(web_url_response); - DCHECK_EQ(has_lofi_state, has_empty_image_directive) - << "Inconsistent PreviewsState ServerLoFi:" << has_lofi_state - << " header:" << has_empty_image_directive; - return (has_lite_page_state == has_lite_page_directive) && - (has_lofi_state == has_empty_image_directive); + return has_lite_page_state == has_lite_page_directive; } void ContentPreviewsRenderFrameObserver::OnDestruct() {
diff --git a/components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer_unittest.cc b/components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer_unittest.cc index 353f597..63fac82 100644 --- a/components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer_unittest.cc +++ b/components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer_unittest.cc
@@ -31,15 +31,9 @@ EXPECT_TRUE( ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( content::NOSCRIPT_ON, response_no_headers)); - EXPECT_TRUE( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::CLIENT_LOFI_ON, response_no_headers)); EXPECT_DCHECK_DEATH( ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::SERVER_LOFI_ON, response_no_headers)); - EXPECT_DCHECK_DEATH( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( content::SERVER_LITE_PAGE_ON, response_no_headers)); } @@ -59,37 +53,6 @@ EXPECT_DCHECK_DEATH( ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( content::NOSCRIPT_ON, response_with_lite_page)); - EXPECT_DCHECK_DEATH( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::CLIENT_LOFI_ON, response_with_lite_page)); - - EXPECT_DCHECK_DEATH( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::SERVER_LOFI_ON, response_with_lite_page)); -} - -TEST(ContentPreviewsRenderFrameObserverTest, - ValidatePreviewsStateWithResponsePagePolicyHeader) { - blink::WebURLResponse response_with_page_policy; - response_with_page_policy.AddHttpHeaderField("Chrome-Proxy", - "Page-Policies=Empty-Image"); - - EXPECT_TRUE( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::SERVER_LOFI_ON, response_with_page_policy)); - - EXPECT_DCHECK_DEATH( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::PREVIEWS_UNSPECIFIED, response_with_page_policy)); - EXPECT_DCHECK_DEATH( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::NOSCRIPT_ON, response_with_page_policy)); - EXPECT_DCHECK_DEATH( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::CLIENT_LOFI_ON, response_with_page_policy)); - EXPECT_DCHECK_DEATH( - ContentPreviewsRenderFrameObserverTest::ValidatePreviewsStateWithResponse( - content::SERVER_LITE_PAGE_ON, response_with_page_policy)); } } // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_unittest.cc index 494a2bb..f832c583 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_unittest.cc
@@ -1241,8 +1241,9 @@ "DataReductionProxy.WarmupURL.FetchInitiated", 2); } +// https://crbug.com/974895: Flaky test. TEST_F(DataReductionProxyConfigTest, - HandleWarmupFetcherRetryWithConnectionChange) { + DISABLED_HandleWarmupFetcherRetryWithConnectionChange) { // The test manually controls the fetch of warmup URL and the response. test_context_->DisableWarmupURLFetchCallback();
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.cc index 28fef4cd..5266b57a3 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.cc
@@ -13,10 +13,7 @@ DataReductionProxyData::DataReductionProxyData() : used_data_reduction_proxy_(false), - client_lofi_requested_(false), lite_page_received_(false), - lofi_policy_received_(false), - lofi_received_(false), black_listed_(false), was_cached_data_reduction_proxy_response_(false), effective_connection_type_(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h index 648bfdfe..fcec3dc 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h
@@ -43,26 +43,6 @@ lite_page_received_ = lite_page_received; } - // Whether a Lo-Fi (or empty-image) page policy directive was received for - // the navigation. - bool lofi_policy_received() const { return lofi_policy_received_; } - void set_lofi_policy_received(bool lofi_policy_received) { - lofi_policy_received_ = lofi_policy_received; - } - - // Whether a server Lo-Fi page response was seen for the request or - // navigation. - bool lofi_received() const { return lofi_received_; } - void set_lofi_received(bool lofi_received) { lofi_received_ = lofi_received; } - - // Whether client Lo-Fi was requested for this request. This is only set on - // image requests that have added a range header to attempt to get a smaller - // file size image. - bool client_lofi_requested() const { return client_lofi_requested_; } - void set_client_lofi_requested(bool client_lofi_requested) { - client_lofi_requested_ = client_lofi_requested; - } - // This response was fetched from cache, but the original request used DRP. bool was_cached_data_reduction_proxy_response() const { return was_cached_data_reduction_proxy_response_; @@ -125,22 +105,10 @@ // Cached responses are not considered to have used DRP. bool used_data_reduction_proxy_; - // Whether client Lo-Fi was requested for this request. This is only set on - // image requests that have added a range header to attempt to get a smaller - // file size image. - bool client_lofi_requested_; - // Whether a proxy-served lite page response was seen for the HTTP request or // navigation. bool lite_page_received_; - // Whether server Lo-Fi directive was received for this navigation. True if - // the proxy returns the empty-image page-policy for the main frame response. - bool lofi_policy_received_; - - // Whether a lite page response was seen for the request or navigation. - bool lofi_received_; - // Whether the blacklist prevented a preview. bool black_listed_;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_unittest.cc index cc8d8f41..a52c12b 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_unittest.cc
@@ -44,12 +44,6 @@ data->set_lite_page_received(false); EXPECT_FALSE(data->lite_page_received()); - EXPECT_FALSE(data->lofi_received()); - data->set_lofi_received(true); - EXPECT_TRUE(data->lofi_received()); - data->set_lofi_received(false); - EXPECT_FALSE(data->lofi_received()); - EXPECT_FALSE(data->black_listed()); data->set_black_listed(true); EXPECT_TRUE(data->black_listed()); @@ -109,7 +103,6 @@ std::unique_ptr<DataReductionProxyData> data(new DataReductionProxyData()); data->set_used_data_reduction_proxy(tests[i].data_reduction_used); data->set_lite_page_received(tests[i].lofi_test_value); - data->set_lofi_received(tests[i].lofi_test_value); data->set_black_listed(tests[i].lofi_test_value); data->set_session_key(kSessionKey); data->set_request_url(kTestURL); @@ -118,7 +111,6 @@ data->set_page_id(2u); std::unique_ptr<DataReductionProxyData> copy = data->DeepCopy(); EXPECT_EQ(tests[i].lofi_test_value, copy->lite_page_received()); - EXPECT_EQ(tests[i].lofi_test_value, copy->lofi_received()); EXPECT_EQ(tests[i].lofi_test_value, copy->black_listed()); EXPECT_EQ(tests[i].data_reduction_used, copy->used_data_reduction_proxy()); EXPECT_EQ(kSessionKey, copy->session_key());
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc index a28b564..c71c745 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc
@@ -39,7 +39,6 @@ const char kActionValueDelimiter = '='; // Previews directives. -const char kEmptyImageDirective[] = "empty-image"; const char kLitePageDirective[] = "lite-page"; const char kCompressedVideoDirective[] = "compressed-video"; const char kIdentityDirective[] = "identity"; @@ -101,30 +100,6 @@ IsPreviewTypeInHeaderValue(value, transform_type); } -data_reduction_proxy::TransformDirective ParsePagePolicyDirective( - const std::string chrome_proxy_header_value) { - for (const auto& directive : base::SplitStringPiece( - chrome_proxy_header_value, ",", base::TRIM_WHITESPACE, - base::SPLIT_WANT_NONEMPTY)) { - if (!base::StartsWith(directive, kChromeProxyPagePoliciesDirective, - base::CompareCase::INSENSITIVE_ASCII)) { - continue; - } - - // Check policy directive for empty-image entry. - base::StringPiece page_policies_value = base::StringPiece(directive).substr( - base::size(kChromeProxyPagePoliciesDirective)); - for (const auto& policy : - base::SplitStringPiece(page_policies_value, "|", base::TRIM_WHITESPACE, - base::SPLIT_WANT_NONEMPTY)) { - if (base::LowerCaseEqualsASCII(policy, kEmptyImageDirective)) { - return data_reduction_proxy::TRANSFORM_PAGE_POLICIES_EMPTY_IMAGE; - } - } - } - return data_reduction_proxy::TRANSFORM_NONE; -} - } // namespace namespace data_reduction_proxy { @@ -149,10 +124,6 @@ return kChromeProxyContentTransformHeader; } -const char* empty_image_directive() { - return kEmptyImageDirective; -} - const char* lite_page_directive() { return kLitePageDirective; } @@ -188,10 +159,6 @@ return TRANSFORM_LITE_PAGE; } if (base::LowerCaseEqualsASCII(accept_transform_value, - empty_image_directive())) { - return TRANSFORM_EMPTY_IMAGE; - } - if (base::LowerCaseEqualsASCII(accept_transform_value, compressed_video_directive())) { return TRANSFORM_COMPRESSED_VIDEO; } @@ -207,22 +174,12 @@ std::string content_transform_value; if (!headers.GetNormalizedHeader(chrome_proxy_content_transform_header(), &content_transform_value)) { - // No content-transform so check for page-policies in chrome-proxy header. - std::string chrome_proxy_header_value; - if (headers.GetNormalizedHeader(chrome_proxy_header(), - &chrome_proxy_header_value)) { - return ParsePagePolicyDirective(chrome_proxy_header_value); - } return TRANSFORM_NONE; } if (base::LowerCaseEqualsASCII(content_transform_value, lite_page_directive())) { return TRANSFORM_LITE_PAGE; } - if (base::LowerCaseEqualsASCII(content_transform_value, - empty_image_directive())) { - return TRANSFORM_EMPTY_IMAGE; - } if (base::LowerCaseEqualsASCII(content_transform_value, kIdentityDirective)) { return TRANSFORM_IDENTITY; } @@ -233,18 +190,6 @@ return TRANSFORM_UNKNOWN; } -bool IsEmptyImagePreview(const net::HttpResponseHeaders& headers) { - return IsPreviewType(headers, kEmptyImageDirective); -} - -bool IsEmptyImagePreview(const std::string& content_transform_value, - const std::string& chrome_proxy_value) { - if (IsPreviewTypeInHeaderValue(content_transform_value, kEmptyImageDirective)) - return true; - - return false; -} - bool IsLitePagePreview(const net::HttpResponseHeaders& headers) { return IsPreviewType(headers, kLitePageDirective); }
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h index a72b270e..9cfed69 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h
@@ -33,9 +33,7 @@ TRANSFORM_UNKNOWN, TRANSFORM_NONE, TRANSFORM_LITE_PAGE, - TRANSFORM_EMPTY_IMAGE, TRANSFORM_COMPRESSED_VIDEO, - TRANSFORM_PAGE_POLICIES_EMPTY_IMAGE, TRANSFORM_IDENTITY, };
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc index 321a38fb..75820289 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc
@@ -24,75 +24,6 @@ namespace data_reduction_proxy { -TEST(DataReductionProxyHeadersTest, IsEmptyImagePreview) { - const struct { - const char* headers; - bool expected_result; - } tests[] = { - { - "HTTP/1.1 200 OK\n" - "Chrome-Proxy-Content-Transform: foo\n", - false, - }, - { - "HTTP/1.1 200 OK\n", false, - }, - { - "HTTP/1.1 200 OK\n" - "Chrome-Proxy-Content-Transform: empty-image\n", - true, - }, - { - "HTTP/1.1 200 OK\n" - "Chrome-Proxy-Content-Transform: empty-image;foo\n", - true, - }, - { - "HTTP/1.1 200 OK\n" - "Chrome-Proxy-Content-Transform: Empty-Image\n", - true, - }, - { - "HTTP/1.1 200 OK\n" - "Chrome-Proxy-Content-Transform: foo;empty-image\n", - false, - }, - { - "HTTP/1.1 200 OK\n" - "Another-Header: empty-image\n", - false, - }, - }; - for (size_t i = 0; i < base::size(tests); ++i) { - std::string headers(tests[i].headers); - HeadersToRaw(&headers); - scoped_refptr<net::HttpResponseHeaders> parsed( - new net::HttpResponseHeaders(headers)); - EXPECT_EQ(tests[i].expected_result, IsEmptyImagePreview(*parsed)); - } -} - -TEST(DataReductionProxyHeadersTest, IsEmptyImagePreviewValue) { - const struct { - const char* chrome_proxy_content_transform_header; - const char* chrome_proxy_header; - bool expected_result; - } tests[] = { - {"", "", false}, - {"foo", "bar", false}, - {"empty-image", "", true}, - {"empty-image;foo", "", true}, - {"Empty-Image", "", true}, - {"foo;empty-image", "", false}, - {"empty-image", "foo", true}, - }; - for (const auto& test : tests) { - EXPECT_EQ(test.expected_result, - IsEmptyImagePreview(test.chrome_proxy_content_transform_header, - test.chrome_proxy_header)); - } -} - TEST(DataReductionProxyHeadersTest, IsLitePagePreview) { const struct { const char* headers;
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn index 419ee87c..285a754 100644 --- a/components/download/internal/common/BUILD.gn +++ b/components/download/internal/common/BUILD.gn
@@ -80,6 +80,10 @@ "//services/service_manager/public/cpp:cpp", ] + if (is_win) { + deps += [ "//components/services/quarantine/public/cpp:features" ] + } + if (is_android) { sources += [ "android/download_collection_bridge.cc",
diff --git a/components/download/internal/common/DEPS b/components/download/internal/common/DEPS index 015703b0..aa97c2f 100644 --- a/components/download/internal/common/DEPS +++ b/components/download/internal/common/DEPS
@@ -5,6 +5,7 @@ "+components/download/quarantine", "+components/filename_generation/filename_generation.h", "+components/leveldb_proto", + "+components/services/quarantine/public/cpp/quarantine_features_win.h", "+components/ukm/test_ukm_recorder.h", "+crypto", "+jni",
diff --git a/components/download/internal/common/base_file.cc b/components/download/internal/common/base_file.cc index d220a7bc..54ea2da 100644 --- a/components/download/internal/common/base_file.cc +++ b/components/download/internal/common/base_file.cc
@@ -13,6 +13,7 @@ #include "base/format_macros.h" #include "base/logging.h" #include "base/macros.h" +#include "base/metrics/histogram_functions.h" #include "base/numerics/safe_conversions.h" #include "base/pickle.h" #include "base/strings/stringprintf.h" @@ -24,6 +25,11 @@ #include "components/download/public/common/download_stats.h" #include "components/download/quarantine/quarantine.h" #include "crypto/secure_hash.h" +#include "services/service_manager/public/cpp/connector.h" + +#if defined(OS_WIN) +#include "components/services/quarantine/public/cpp/quarantine_features_win.h" +#endif // defined(OS_WIN) #if defined(OS_ANDROID) #include "base/android/content_uri_utils.h" @@ -92,7 +98,8 @@ } // namespace -BaseFile::BaseFile(uint32_t download_id) : download_id_(download_id) { +BaseFile::BaseFile(uint32_t download_id) + : download_id_(download_id), weak_factory_(this) { DETACH_FROM_SEQUENCE(sequence_checker_); } @@ -278,6 +285,7 @@ } void BaseFile::Detach() { + weak_factory_.InvalidateWeakPtrs(); detached_ = true; CONDITIONAL_TRACE( INSTANT0("download", "DownloadFileDetached", TRACE_EVENT_SCOPE_THREAD)); @@ -516,10 +524,46 @@ } #endif // defined(OS_ANDROID) -#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) - namespace { +DownloadInterruptReason QuarantineFileResultToReason( + quarantine::mojom::QuarantineFileResult result) { + switch (result) { + case quarantine::mojom::QuarantineFileResult::OK: + return DOWNLOAD_INTERRUPT_REASON_NONE; + case quarantine::mojom::QuarantineFileResult::VIRUS_INFECTED: + return DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED; + case quarantine::mojom::QuarantineFileResult::SECURITY_CHECK_FAILED: + return DOWNLOAD_INTERRUPT_REASON_FILE_SECURITY_CHECK_FAILED; + case quarantine::mojom::QuarantineFileResult::BLOCKED_BY_POLICY: + return DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED; + case quarantine::mojom::QuarantineFileResult::ACCESS_DENIED: + return DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED; + + case quarantine::mojom::QuarantineFileResult::FILE_MISSING: + // Don't have a good interrupt reason here. This return code means that + // the file at |full_path_| went missing before QuarantineFile got to + // look at it. Not expected to happen, but we've seen instances where a + // file goes missing immediately after BaseFile closes the handle. + // + // Intentionally using a different error message than + // SECURITY_CHECK_FAILED in order to distinguish the two. + return DOWNLOAD_INTERRUPT_REASON_FILE_FAILED; + + case quarantine::mojom::QuarantineFileResult::ANNOTATION_FAILED: + // This means that the mark-of-the-web couldn't be applied. The file is + // already on the file system under its final target name. + // + // Causes of failed annotations typically aren't transient. E.g. the + // target file system may not support extended attributes or alternate + // streams. We are going to allow these downloads to progress on the + // assumption that failures to apply MOTW can't reliably be introduced + // remotely. + return DOWNLOAD_INTERRUPT_REASON_NONE; + } + return DOWNLOAD_INTERRUPT_REASON_FILE_FAILED; +} + // Given a source and a referrer, determines the "safest" URL that can be used // to determine the authority of the download source. Returns an empty URL if no // HTTP/S URL can be determined for the <|source_url|, |referrer_url|> pair. @@ -551,7 +595,9 @@ } // namespace -DownloadInterruptReason BaseFile::AnnotateWithSourceInformation( +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) + +DownloadInterruptReason BaseFile::AnnotateWithSourceInformationSync( const std::string& client_guid, const GURL& source_url, const GURL& referrer_url) { @@ -565,43 +611,10 @@ referrer_url, client_guid); CONDITIONAL_TRACE(END0("download", "DownloadFileAnnotate")); - switch (result) { - case QuarantineFileResult::OK: - return DOWNLOAD_INTERRUPT_REASON_NONE; - case QuarantineFileResult::VIRUS_INFECTED: - return DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED; - case QuarantineFileResult::SECURITY_CHECK_FAILED: - return DOWNLOAD_INTERRUPT_REASON_FILE_SECURITY_CHECK_FAILED; - case QuarantineFileResult::BLOCKED_BY_POLICY: - return DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED; - case QuarantineFileResult::ACCESS_DENIED: - return DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED; - - case QuarantineFileResult::FILE_MISSING: - // Don't have a good interrupt reason here. This return code means that - // the file at |full_path_| went missing before QuarantineFile got to look - // at it. Not expected to happen, but we've seen instances where a file - // goes missing immediately after BaseFile closes the handle. - // - // Intentionally using a different error message than - // SECURITY_CHECK_FAILED in order to distinguish the two. - return DOWNLOAD_INTERRUPT_REASON_FILE_FAILED; - - case QuarantineFileResult::ANNOTATION_FAILED: - // This means that the mark-of-the-web couldn't be applied. The file is - // already on the file system under its final target name. - // - // Causes of failed annotations typically aren't transient. E.g. the - // target file system may not support extended attributes or alternate - // streams. We are going to allow these downloads to progress on the - // assumption that failures to apply MOTW can't reliably be introduced - // remotely. - return DOWNLOAD_INTERRUPT_REASON_NONE; - } - return DOWNLOAD_INTERRUPT_REASON_FILE_FAILED; + return QuarantineFileResultToReason(result); } #else // !OS_WIN && !OS_MACOSX && !OS_LINUX -DownloadInterruptReason BaseFile::AnnotateWithSourceInformation( +DownloadInterruptReason BaseFile::AnnotateWithSourceInformationSync( const std::string& client_guid, const GURL& source_url, const GURL& referrer_url) { @@ -609,4 +622,63 @@ } #endif +void BaseFile::OnFileQuarantined( + bool connection_error, + quarantine::mojom::QuarantineFileResult result) { + base::UmaHistogramBoolean("Download.QuarantineService.ConnectionError", + connection_error); + + DCHECK(on_annotation_done_callback_); + quarantine_service_.reset(); + std::move(on_annotation_done_callback_) + .Run(QuarantineFileResultToReason(result)); +} + +void BaseFile::OnQuarantineServiceError(const GURL& source_url, + const GURL& referrer_url) { +#if defined(OS_WIN) + if (base::FeatureList::IsEnabled(quarantine::kOutOfProcessQuarantine)) { + OnFileQuarantined(/*connection_error=*/true, + quarantine::SetInternetZoneIdentifierDirectly( + full_path_, source_url, referrer_url)); + return; + } +#endif // defined(OS_WIN) + + CHECK(false) << "In-process quarantine service should not have failed."; +} + +void BaseFile::AnnotateWithSourceInformation( + const std::string& client_guid, + const GURL& source_url, + const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, + OnAnnotationDoneCallback on_annotation_done_callback) { + GURL authority_url = GetEffectiveAuthorityURL(source_url, referrer_url); + if (!connector) { +#if defined(OS_WIN) + QuarantineFileResult result = quarantine::SetInternetZoneIdentifierDirectly( + full_path_, authority_url, referrer_url); +#else + QuarantineFileResult result = QuarantineFileResult::ANNOTATION_FAILED; +#endif + std::move(on_annotation_done_callback) + .Run(QuarantineFileResultToReason(result)); + } else { + connector->BindInterface(quarantine::mojom::kServiceName, + mojo::MakeRequest(&quarantine_service_)); + + on_annotation_done_callback_ = std::move(on_annotation_done_callback); + + quarantine_service_.set_connection_error_handler(base::BindOnce( + &BaseFile::OnQuarantineServiceError, weak_factory_.GetWeakPtr(), + authority_url, referrer_url)); + + quarantine_service_->QuarantineFile( + full_path_, authority_url, referrer_url, client_guid, + base::BindOnce(&BaseFile::OnFileQuarantined, weak_factory_.GetWeakPtr(), + false)); + } +} + } // namespace download
diff --git a/components/download/internal/common/base_file_win_unittest.cc b/components/download/internal/common/base_file_win_unittest.cc index 43d98e9a..759eb16 100644 --- a/components/download/internal/common/base_file_win_unittest.cc +++ b/components/download/internal/common/base_file_win_unittest.cc
@@ -78,7 +78,7 @@ base_file.AppendDataToFile(kTestFileContents, base::size(kTestFileContents))); ASSERT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, - base_file.AnnotateWithSourceInformation( + base_file.AnnotateWithSourceInformationSync( "7B2CEE7C-DC81-4160-86F1-9C968597118F", url, referrer)); base_file.Detach(); base_file.Finish();
diff --git a/components/download/internal/common/download_file_impl.cc b/components/download/internal/common/download_file_impl.cc index 8a1b78e..6bf70231 100644 --- a/components/download/internal/common/download_file_impl.cc +++ b/components/download/internal/common/download_file_impl.cc
@@ -20,6 +20,7 @@ #include "components/download/internal/common/parallel_download_utils.h" #include "components/download/public/common/download_create_info.h" #include "components/download/public/common/download_destination_observer.h" +#include "components/download/public/common/download_features.h" #include "components/download/public/common/download_interrupt_reasons_utils.h" #include "components/download/public/common/download_stats.h" #include "crypto/secure_hash.h" @@ -27,6 +28,7 @@ #include "mojo/public/c/system/types.h" #include "net/base/io_buffer.h" #include "services/network/public/cpp/features.h" +#include "services/service_manager/public/cpp/connector.h" #if defined(OS_ANDROID) #include "components/download/internal/common/android/download_collection_bridge.h" @@ -355,12 +357,14 @@ const std::string& client_guid, const GURL& source_url, const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, const RenameCompletionCallback& callback) { std::unique_ptr<RenameParameters> parameters(new RenameParameters( ANNOTATE_WITH_SOURCE_INFORMATION, full_path, callback)); parameters->client_guid = client_guid; parameters->source_url = source_url; parameters->referrer_url = referrer_url; + parameters->connector = std::move(connector); RenameWithRetryInternal(std::move(parameters)); } @@ -382,13 +386,13 @@ } if (display_name_.empty()) display_name_ = file_name; - OnRenameComplete(reason, content_path, callback); + OnRenameComplete(content_path, callback, reason); } void DownloadFileImpl::PublishDownload( const RenameCompletionCallback& callback) { DownloadInterruptReason reason = file_.PublishDownload(); - OnRenameComplete(reason, file_.full_path(), callback); + OnRenameComplete(file_.full_path(), callback, reason); } base::FilePath DownloadFileImpl::GetDisplayName() { @@ -466,18 +470,33 @@ // anti-virus scanners on Windows to actually see the data // (http://crbug.com/127999) under the correct name (which is information // it uses). - reason = file_.AnnotateWithSourceInformation(parameters->client_guid, - parameters->source_url, - parameters->referrer_url); + // + // If concurrent downloads with the same target path are allowed, an + // asynchronous quarantine file may cause a file to be stamped with + // incorrect mark-of-the-web data. Therefore, fall back to non-service + // QuarantineFile when kPreventDownloadsWithSamePath is disabled. + if (base::FeatureList::IsEnabled( + download::features::kPreventDownloadsWithSamePath)) { + file_.AnnotateWithSourceInformation( + parameters->client_guid, parameters->source_url, + parameters->referrer_url, std::move(parameters->connector), + base::BindOnce(&DownloadFileImpl::OnRenameComplete, + weak_factory_.GetWeakPtr(), new_path, + parameters->completion_callback)); + return; + } + reason = file_.AnnotateWithSourceInformationSync(parameters->client_guid, + parameters->source_url, + parameters->referrer_url); } - OnRenameComplete(reason, new_path, parameters->completion_callback); + OnRenameComplete(new_path, parameters->completion_callback, reason); } void DownloadFileImpl::OnRenameComplete( - DownloadInterruptReason reason, const base::FilePath& new_path, - const RenameCompletionCallback& callback) { + const RenameCompletionCallback& callback, + DownloadInterruptReason reason) { if (reason != DOWNLOAD_INTERRUPT_REASON_NONE) { // Make sure our information is updated, since we're about to // error out.
diff --git a/components/download/internal/common/download_file_unittest.cc b/components/download/internal/common/download_file_unittest.cc index a3d72dc..41fd65f 100644 --- a/components/download/internal/common/download_file_unittest.cc +++ b/components/download/internal/common/download_file_unittest.cc
@@ -26,6 +26,7 @@ #include "components/download/public/common/download_interrupt_reasons.h" #include "components/download/public/common/mock_input_stream.h" #include "net/base/net_errors.h" +#include "services/service_manager/public/cpp/connector.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -396,7 +397,7 @@ case RENAME_AND_ANNOTATE: download_file_->RenameAndAnnotate( full_path, "12345678-ABCD-1234-DCBA-123456789ABC", GURL(), GURL(), - completion_callback); + nullptr, completion_callback); break; } }
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc index 4d20fcc..4ade4f0 100644 --- a/components/download/internal/common/download_item_impl.cc +++ b/components/download/internal/common/download_item_impl.cc
@@ -59,6 +59,7 @@ #include "net/http/http_response_headers.h" #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/service_manager/public/cpp/connector.h" #if defined(OS_ANDROID) #include "components/download/internal/common/android/download_collection_bridge.h" @@ -1774,6 +1775,13 @@ return; } #endif // defined(OS_ANDROID) + + std::unique_ptr<service_manager::Connector> new_connector; + service_manager::Connector* connector = + delegate_->GetServiceManagerConnector(); + if (connector) + new_connector = connector->Clone(); + GetDownloadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&DownloadFile::RenameAndAnnotate, @@ -1782,7 +1790,7 @@ delegate_->GetApplicationClientIdForFileScanning(), delegate_->IsOffTheRecord() ? GURL() : GetURL(), delegate_->IsOffTheRecord() ? GURL() : GetReferrerUrl(), - std::move(callback))); + std::move(new_connector), std::move(callback))); } void DownloadItemImpl::OnDownloadRenamedToFinalName(
diff --git a/components/download/internal/common/download_item_impl_unittest.cc b/components/download/internal/common/download_item_impl_unittest.cc index f202fda..93a09d6 100644 --- a/components/download/internal/common/download_item_impl_unittest.cc +++ b/components/download/internal/common/download_item_impl_unittest.cc
@@ -200,7 +200,7 @@ // Schedules a task to invoke the RenameCompletionCallback with |new_path| on // the |task_runner|. Should only be used as the action for // MockDownloadFile::RenameAndAnnotate as follows: -// EXPECT_CALL(download_file, RenameAndAnnotate(_,_,_,_,_)) +// EXPECT_CALL(download_file, RenameAndAnnotate(_,_,_,_,_,_)) // .WillOnce(ScheduleRenameAndAnnotateCallback( // DOWNLOAD_INTERRUPT_REASON_NONE, new_path, task_runner)); ACTION_P3(ScheduleRenameAndAnnotateCallback, @@ -208,7 +208,7 @@ new_path, task_runner) { task_runner->PostTask(FROM_HERE, - base::BindOnce(arg4, interrupt_reason, new_path)); + base::BindOnce(arg5, interrupt_reason, new_path)); } // Schedules a task to invoke a callback that's bound to the specified @@ -341,7 +341,7 @@ EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) .WillOnce(Return(true)); base::FilePath final_path(kDummyTargetPath); - EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)) + EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, final_path, base::ThreadTaskRunnerHandle::Get())); @@ -516,7 +516,7 @@ EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) .WillOnce(Return(true)); - EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)); + EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _)); unsafeurl_item->ValidateDangerousDownload(); EXPECT_TRUE(unsafeurl_observer.CheckAndResetDownloadUpdated()); CleanupItem(unsafeurl_item, download_file, DownloadItem::IN_PROGRESS); @@ -534,7 +534,7 @@ EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) .WillOnce(Return(true)); - EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)); + EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _)); unsafefile_item->ValidateDangerousDownload(); EXPECT_TRUE(unsafefile_observer.CheckAndResetDownloadUpdated()); CleanupItem(unsafefile_item, download_file, DownloadItem::IN_PROGRESS); @@ -769,8 +769,9 @@ // Fail final rename with unresumable reason. EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) .WillOnce(Return(true)); - EXPECT_CALL(*download_file, - RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) + EXPECT_CALL( + *download_file, + RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED, base::FilePath(), base::ThreadTaskRunnerHandle::Get())); @@ -1278,7 +1279,7 @@ EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) .WillOnce(Return(true)); - EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _, _, _, _)) + EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, final_path, base::ThreadTaskRunnerHandle::Get())); @@ -1697,7 +1698,7 @@ EXPECT_TRUE(item->CanOpenDownload()); // Complete - EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)) + EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath), base::ThreadTaskRunnerHandle::Get())); @@ -1733,7 +1734,7 @@ // Complete Temporary EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) .WillOnce(Return(true)); - EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)) + EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath), base::ThreadTaskRunnerHandle::Get())); @@ -1799,8 +1800,9 @@ EXPECT_FALSE(item->IsDangerous()); // Make sure the download can complete. - EXPECT_CALL(*download_file, - RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) + EXPECT_CALL( + *download_file, + RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath), base::ThreadTaskRunnerHandle::Get())); @@ -1839,8 +1841,9 @@ EXPECT_FALSE(item->IsDangerous()); // Make sure the download can complete. - EXPECT_CALL(*download_file, - RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) + EXPECT_CALL( + *download_file, + RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath), base::ThreadTaskRunnerHandle::Get())); @@ -1882,8 +1885,9 @@ EXPECT_TRUE(item->IsDangerous()); // Make sure the download doesn't complete until we've validated it. - EXPECT_CALL(*download_file, - RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) + EXPECT_CALL( + *download_file, + RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath), base::ThreadTaskRunnerHandle::Get())); @@ -1934,8 +1938,9 @@ EXPECT_FALSE(item->IsDangerous()); // Make sure the download can complete. - EXPECT_CALL(*download_file, - RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) + EXPECT_CALL( + *download_file, + RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath), base::ThreadTaskRunnerHandle::Get())); @@ -2046,7 +2051,7 @@ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); // Target file should be annotated with the source URL. EXPECT_CALL(*download_file, - RenameAndAnnotate(_, _, create_info()->url(), _, _)) + RenameAndAnnotate(_, _, create_info()->url(), _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath), base::ThreadTaskRunnerHandle::Get())); @@ -2064,7 +2069,7 @@ download_file = DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); // Target file should be annotated with an empty URL. - EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, GURL(), _, _)) + EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, GURL(), _, _, _)) .WillOnce(ScheduleRenameAndAnnotateCallback( DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath), base::ThreadTaskRunnerHandle::Get()));
diff --git a/components/download/public/common/BUILD.gn b/components/download/public/common/BUILD.gn index 5937c553..5883cbbc 100644 --- a/components/download/public/common/BUILD.gn +++ b/components/download/public/common/BUILD.gn
@@ -80,6 +80,7 @@ "//base", "//components/download/database", "//components/download/internal/common:internal", + "//components/services/quarantine:quarantine", "//crypto", "//net", "//services/metrics/public/cpp:metrics_cpp", @@ -142,6 +143,7 @@ ":public", "//base", "//net", + "//services/service_manager/public/cpp:cpp", "//testing/gmock", "//url", ]
diff --git a/components/download/public/common/DEPS b/components/download/public/common/DEPS index 8de1836..cf72027e 100644 --- a/components/download/public/common/DEPS +++ b/components/download/public/common/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+crypto", "+components/keyed_service/core", + "+components/services/quarantine/public/mojom/quarantine.mojom.h", "+mojo/public/cpp/bindings", "+mojo/public/cpp/system", "+net/base/io_buffer.h", @@ -16,6 +17,7 @@ "+services/network/public/cpp", "+services/network/public/mojom", "+services/network/test", + "+services/service_manager/public/cpp/connector.h", "+storage/browser", "+ui/base", ]
diff --git a/components/download/public/common/base_file.h b/components/download/public/common/base_file.h index dd8ed1b1..90e4d8f6 100644 --- a/components/download/public/common/base_file.h +++ b/components/download/public/common/base_file.h
@@ -18,16 +18,22 @@ #include "base/gtest_prod_util.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/optional.h" #include "base/sequence_checker.h" #include "base/time/time.h" #include "build/build_config.h" #include "components/download/public/common/download_export.h" #include "components/download/public/common/download_interrupt_reasons.h" +#include "components/services/quarantine/public/mojom/quarantine.mojom.h" #include "crypto/secure_hash.h" #include "net/base/net_errors.h" #include "url/gurl.h" +namespace service_manager { +class Connector; +} + namespace download { // File being downloaded and saved to disk. This is a base class @@ -152,11 +158,29 @@ // that originated this download. Will be used to annotate source // information and also to determine the relative danger level of the // file. - DownloadInterruptReason AnnotateWithSourceInformation( + DownloadInterruptReason AnnotateWithSourceInformationSync( const std::string& client_guid, const GURL& source_url, const GURL& referrer_url); + // Callback used with AnnotateWithSourceInformation. + // Created by DownloadFileImpl::RenameWithRetryInternal + // to bind DownloadFileImpl::OnRenameComplete. + using OnAnnotationDoneCallback = + base::OnceCallback<void(DownloadInterruptReason)>; + + // Called when a quarantine service is used, + // connector is used to populate a quarantine::mojom::QuarantinePtr, + // and the callback will be called from the service. + // TODO (crbug.com/973497): Remove non-service version when + // kPreventDownloadsWithSamePath feature is removed. + void AnnotateWithSourceInformation( + const std::string& client_guid, + const GURL& source_url, + const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, + OnAnnotationDoneCallback on_annotation_done_callback); + #if defined(OS_ANDROID) // Publishes the intermediate download to public download collection. DownloadInterruptReason PublishDownload(); @@ -244,6 +268,15 @@ int os_error, DownloadInterruptReason reason); + // Callback invoked when quarantine service has an error. + void OnQuarantineServiceError(const GURL& source_url, + const GURL& referrer_url); + + // Callback invoked by quarantine service. Also called by + // OnQuarantineServiceError after manually applying mark-of-the-web. + void OnFileQuarantined(bool connection_error, + quarantine::mojom::QuarantineFileResult result); + // Full path to the file including the file name. base::FilePath full_path_; @@ -271,8 +304,16 @@ // ID of the download, used for trace events. uint32_t download_id_; + // Mojo pointer for quarantine service. + quarantine::mojom::QuarantinePtr quarantine_service_; + + // Callback invoked after quarantine service finishes. + OnAnnotationDoneCallback on_annotation_done_callback_; + SEQUENCE_CHECKER(sequence_checker_); + base::WeakPtrFactory<BaseFile> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(BaseFile); };
diff --git a/components/download/public/common/download_file.h b/components/download/public/common/download_file.h index 545b4d1..98c5a1bd 100644 --- a/components/download/public/common/download_file.h +++ b/components/download/public/common/download_file.h
@@ -22,6 +22,10 @@ class GURL; +namespace service_manager { +class Connector; +} + namespace download { // These objects live exclusively on the download sequence and handle the @@ -82,11 +86,17 @@ // Rename the download file to |full_path| and annotate it with // "Mark of the Web" information about its source. No uniquification // will be performed. - virtual void RenameAndAnnotate(const base::FilePath& full_path, - const std::string& client_guid, - const GURL& source_url, - const GURL& referrer_url, - const RenameCompletionCallback& callback) = 0; + // connector is a clone of the service manager connector from + // DownloadItemImpl's delegate. It used to create the quarantine service. + // In the unexpected case that connector is null, or the service otherwise + // fails, mark-of-the-web is manually applied as a fallback. + virtual void RenameAndAnnotate( + const base::FilePath& full_path, + const std::string& client_guid, + const GURL& source_url, + const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, + const RenameCompletionCallback& callback) = 0; // Detach the file so it is not deleted on destruction. virtual void Detach() = 0;
diff --git a/components/download/public/common/download_file_impl.h b/components/download/public/common/download_file_impl.h index c3dee68..463e25b 100644 --- a/components/download/public/common/download_file_impl.h +++ b/components/download/public/common/download_file_impl.h
@@ -28,9 +28,14 @@ #include "components/download/public/common/download_item.h" #include "components/download/public/common/download_save_info.h" #include "components/download/public/common/rate_estimator.h" +#include "components/services/quarantine/public/mojom/quarantine.mojom.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/simple_watcher.h" +namespace service_manager { +class Connector; +} + namespace download { class DownloadDestinationObserver; @@ -67,6 +72,7 @@ const std::string& client_guid, const GURL& source_url, const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, const RenameCompletionCallback& callback) override; void Detach() override; void Cancel() override; @@ -227,6 +233,7 @@ std::string client_guid; // See BaseFile::AnnotateWithSourceInformation() GURL source_url; // See BaseFile::AnnotateWithSourceInformation() GURL referrer_url; // See BaseFile::AnnotateWithSourceInformation() + std::unique_ptr<service_manager::Connector> connector; int retries_left; // RenameWithRetryInternal() will // automatically retry until this // count reaches 0. Each attempt @@ -241,9 +248,9 @@ void RenameWithRetryInternal(std::unique_ptr<RenameParameters> parameters); // Called after |file_| was renamed. - void OnRenameComplete(DownloadInterruptReason reason, - const base::FilePath& content_path, - const RenameCompletionCallback& callback); + void OnRenameComplete(const base::FilePath& content_path, + const RenameCompletionCallback& callback, + DownloadInterruptReason reason); // Send an update on our progress. void SendUpdate();
diff --git a/components/download/public/common/mock_download_file.h b/components/download/public/common/mock_download_file.h index b30b1672..9c7df15e31 100644 --- a/components/download/public/common/mock_download_file.h +++ b/components/download/public/common/mock_download_file.h
@@ -17,6 +17,7 @@ #include "build/build_config.h" #include "components/download/public/common/download_file.h" #include "components/download/public/common/input_stream.h" +#include "services/service_manager/public/cpp/connector.h" #include "testing/gmock/include/gmock/gmock.h" namespace download { @@ -47,11 +48,12 @@ MOCK_METHOD2(RenameAndUniquify, void(const base::FilePath& full_path, const RenameCompletionCallback& callback)); - MOCK_METHOD5(RenameAndAnnotate, + MOCK_METHOD6(RenameAndAnnotate, void(const base::FilePath& full_path, const std::string& client_guid, const GURL& source_url, const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, const RenameCompletionCallback& callback)); MOCK_METHOD0(Detach, void()); MOCK_METHOD0(Cancel, void());
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc index 506d246..fc381ec 100644 --- a/components/exo/client_controlled_shell_surface_unittest.cc +++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -1234,7 +1234,7 @@ // Drag the window long enough (pass one fourth of the screen vertical // height) to snap the window to splitscreen. - shell->overview_controller()->ToggleOverview(); + shell->overview_controller()->EndOverview(); SendGestureEvents(window, gfx::Point(0, 210)); EXPECT_EQ(ash::wm::GetWindowState(window)->GetStateType(), ash::WindowStateType::kLeftSnapped);
diff --git a/components/exo/wayland/zcr_cursor_shapes.cc b/components/exo/wayland/zcr_cursor_shapes.cc index d7e41c4..55571d3 100644 --- a/components/exo/wayland/zcr_cursor_shapes.cc +++ b/components/exo/wayland/zcr_cursor_shapes.cc
@@ -10,7 +10,7 @@ #include "components/exo/pointer.h" #include "components/exo/wayland/server_util.h" -#include "ui/base/cursor/cursor_type.h" +#include "ui/base/cursor/types/cursor_types.h" namespace exo { namespace wayland {
diff --git a/components/offline_pages/content/background_loader/background_loader_contents.cc b/components/offline_pages/content/background_loader/background_loader_contents.cc index e42fce6..b0b86f1 100644 --- a/components/offline_pages/content/background_loader/background_loader_contents.cc +++ b/components/offline_pages/content/background_loader/background_loader_contents.cc
@@ -134,21 +134,8 @@ void BackgroundLoaderContents::AdjustPreviewsStateForNavigation( content::WebContents* web_contents, content::PreviewsState* previews_state) { - DCHECK(previews_state); - - // If previews are already disabled, do nothing. - if (*previews_state == content::PREVIEWS_OFF || - *previews_state == content::PREVIEWS_NO_TRANSFORM) { - return; - } - - if (*previews_state == content::PREVIEWS_UNSPECIFIED) { - *previews_state = content::PARTIAL_CONTENT_SAFE_PREVIEWS; - } else { - *previews_state &= content::PARTIAL_CONTENT_SAFE_PREVIEWS; if (*previews_state == 0) *previews_state = content::PREVIEWS_OFF; - } } bool BackgroundLoaderContents::ShouldAllowLazyLoad() {
diff --git a/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc b/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc index 455ee6d..7e22d0e 100644 --- a/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc +++ b/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc
@@ -195,24 +195,6 @@ previews_state = content::PREVIEWS_NO_TRANSFORM; contents()->AdjustPreviewsStateForNavigation(nullptr, &previews_state); EXPECT_EQ(previews_state, content::PREVIEWS_NO_TRANSFORM); - - // If the state starts out as a state unfriendly to offlining, we should - // and out the unfriendly previews. - previews_state = content::SERVER_LOFI_ON | content::CLIENT_LOFI_ON; - contents()->AdjustPreviewsStateForNavigation(nullptr, &previews_state); - EXPECT_EQ(previews_state, content::SERVER_LOFI_ON); - - // If the state starts out as offlining friendly previews, we should preserve - // them. - previews_state = content::PARTIAL_CONTENT_SAFE_PREVIEWS; - contents()->AdjustPreviewsStateForNavigation(nullptr, &previews_state); - EXPECT_EQ(previews_state, content::PARTIAL_CONTENT_SAFE_PREVIEWS); - - // If there are only offlining unfriendly previews, they should all get turned - // off. - previews_state = content::CLIENT_LOFI_ON; - contents()->AdjustPreviewsStateForNavigation(nullptr, &previews_state); - EXPECT_EQ(previews_state, content::PREVIEWS_OFF); } } // namespace background_loader
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index b777aca..bae7b014 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -439,6 +439,12 @@ መመሪያው ካልተዋቀረ ወይም ከተሰናከለ ተጠቃሚው ይህን ቅንብር መቀየር ይችላል (ለምሳሌ፦ በ chrome://flags ውስጥ «የጣቢያ ማግለልን አሰናክል» ግቤትን መጠቀም)። </translation> <translation id="1767673020408652620">የመተግበሪያ የሚመከርን የፍለጋ ሳጥን ዜሮ ሁኔታ አንቃ</translation> +<translation id="17719159826324007"> + ይህ መመሪያ ወደ ArcSession ሲዋቀር Android ጀምሮ ከሆነ ተጠቃሚው ዘግቶ ሲወጣ መሣሪያው ዳግም እንዲነሳ ያስገድደዋል። + ወደ ሁልጊዜ ሲዋቀር እያንዳንዱ የተጠቃሚ ዘግቶ መውጣት ላይ መሣሪያው ዳግም እንዲነሳ ያስገድደዋል። + እንዳልተዋቀረ ከተተወ ምንም ውጤት አይኖረውም፣ እና ተጠቃሚው ዘግቶ ሲወጣ በግዳጅ ዳግም መነሳት የለም። ወደ በጭራሽ ከተዋቀረም እንዲሁ። + ይህ መመሪያ የሚተገበረው ላልተገናኙ ተጠቃሚዎች ብቻ ነው። + </translation> <translation id="1781356041596378058">ይህ መመሪያ እንዲሁም ማን የAndroid ገንቢ አማራጮች መዳረሻ እንዳለው ይቆጣጠራል። ይህን መመሪያ ወደ እውነት ካዋቀሩት ተጠቃሚዎች የገንቢ አማራጮችን መድረስ አይችሉም። ይህን መመሪያ ወደ ሐሰት ካዋቀሩት ወይም እንዳልተዋቀረ ከተዉት ተጠቃሚዎች በAndroid ቅንብሮች መተግበሪያው ውስጥ ያለውን የግንብ ቁጥሩን ሰባት ጊዜ መታ በማድረግ የገንቢ አማራጮችን መድረስ ይችላሉ።</translation> <translation id="1793346220873697538">በነባሪነት በፒን ማተም ያሰናክል</translation> <translation id="1797233582739332495">ዳግም ማስጀመር የሚያስፈልግ መሆኑን የሚያሳይ ተደጋጋሚ ጥያቄ ለተጠቃሚ ያሳዩ</translation> @@ -937,6 +943,7 @@ ይህ መመሪያ የ«DefaultSearchProviderEnabled» መመሪያ ከነቃ ብቻ ነው የሚከበረው።</translation> <translation id="268577405881275241">የውሂብ መጭመቂያ ተኪ ባህሪን ያንቁ</translation> <translation id="2693108589792503178">የይለፍ ቃል ለውጥ ዩአርኤልን ያዋቅሩ።</translation> +<translation id="2694143893026486692">የተተከለ ማጉያ ነቅቷል</translation> <translation id="2706708761587205154">በፒን ብቻ ማተምን ይፍቀዱ</translation> <translation id="2710534340210290498">ይህ መመሪያ ወደ ሐሰት ከተዋቀረ ተጠቃሚዎች ማያ ገጹን መቆለፍ አይችሉም (ከተጠቃሚው ክፍለ-ጊዜ መውጣት ብቻ ነው የሚቻለው)። ይህ ቅንብር ወደ እውነት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ በይለፍ ቃል ያረጋገጡ ተጠቃሚዎች ማያ ገጹን መቆለፍ ይችላሉ።</translation> <translation id="2731627323327011390">በኤአርሲ መተግበሪያዎች ላይ የ<ph name="PRODUCT_OS_NAME" /> እውቅና ማረጋገጫዎችን መጠቀም አሰናክል</translation> @@ -1173,6 +1180,7 @@ ይህ መመሪያ ከተፈለገ ነው። ካልተዋቀረ ምንም የፍለጋ ቃል መተካት አይከናወንም። ይህ መመሪያ የ«DefaultSearchProviderEnabled» መመሪያ ከነቃ ብቻ ነው የሚከበረው።</translation> +<translation id="3053265701996417839">Microsoft Windows 7</translation> <translation id="306887062252197004">ይህ መመሪያ የWebDrive ባህሪው ተጠቃሚዎች በክወናው ላይ ጣልቃ ሊገቡ የሚችሉ መመሪያዎችን እንዲሽሩ ያስችላቸዋል። በአሁኑ ጊዜ ይህ መመሪያ የSitePerProcess እና IsolateOrigins መመሪያዎችን ያሰናክላል።
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index 6f0067b..e30c8f8 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -2672,7 +2672,7 @@ Aquesta política permet als administradors proporcionar configuracions d'impressores als usuaris. - <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> són cadenes de format lliure que es poden personalitzar per facilitar la selecció de la impressora. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> serveixen perquè els usuaris finals puguin identificar la impressora més fàcilment. Representen el fabricant i el model de la impressora. <ph name="PRINTER_URI" /> ha de ser una adreça accessible des d'un ordinador de client i ha d'incloure <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> i <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> és opcional. Si s'indica, s'utilitza per eliminar la duplicació d'impressores <ph name="ZEROCONF_DISCOVERY" />. + <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> són cadenes de format lliure que es poden personalitzar per facilitar la selecció de la impressora. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> serveixen perquè els usuaris finals puguin identificar la impressora més fàcilment. Representen el fabricant i el model de la impressora. <ph name="PRINTER_URI" /> ha de ser una adreça accessible des d'un client i ha d'incloure <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> i <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> és opcional. Si s'indica, s'utilitza per eliminar la duplicació d'impressores <ph name="ZEROCONF_DISCOVERY" />. <ph name="PRINTER_EFFECTIVE_MODEL" /> ha de contenir el nom de la impressora o bé <ph name="PRINTER_AUTOCONF" /> s'ha d'establir en "true". Les impressores que no tinguin cap d'aquestes propietats o que les tinguin totes dues s'ignoraran. @@ -2680,8 +2680,7 @@ Aquesta política no repercuteix en la possibilitat dels usuaris de configurar impressores en dispositius concrets, sinó que s'ha creat per complementar la configuració d'impressores per part dels usuaris. - En el cas dels dispositius gestionats d'Active Directory, aquesta política permet ampliar <ph name="MACHINE_NAME_VARIABLE" /> per incloure-hi el nom del dispositiu d'Active Directory o una subcadena d'aquest directori. Si, per exemple, el nom del dispositiu és <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> se substituirà pels 4 caràcters posteriors a la sisena posició, és a dir, <ph name="MACHINE_NAME_PART_EXAMPLE" />. Fixa't que la posició es basa en zero. - </translation> + En el cas dels dispositius gestionats d'Active Directory, aquesta política permet ampliar <ph name="MACHINE_NAME_VARIABLE" /> per incloure-hi el nom del dispositiu d'Active Directory o una subcadena d'aquest directori. Si, per exemple, el nom del dispositiu és <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> se substituirà pels 4 caràcters posteriors a la sisena posició, és a dir, <ph name="MACHINE_NAME_PART_EXAMPLE" />. Fixa't que la posició es basa en zero.</translation> <translation id="6598235178374410284">Imatge d'avatar de l'usuari</translation> <translation id="6603004149426829878">Envia sempre els senyals d'ubicació disponibles al servidor mentre es determina la zona horària</translation> <translation id="6628120204569232711">Informa de l'estat de l'emmagatzematge</translation>
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index 86b2ffe..efa87f5 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -456,6 +456,12 @@ Kung hindi naka-configure o naka-disable ang patakaran, mababago ng user ang setting na ito (hal. paggamit ng entry na "I-disable ang pag-isolate ng site" sa chrome://flags). </translation> <translation id="1767673020408652620">I-enable ang Mga Rekomendasyon sa App sa Zero State ng Box para sa Paghahanap</translation> +<translation id="17719159826324007"> + Pupuwersahin ng patakarang ito, kapag nakatakda sa ArcSession, na mag-reboot ang device kapag may user na nag-sign out kung nagsimula ang Android. + Kapag nakatakda sa Palagi, pupuwersahin nito ang device na mag-reboot sa tuwing pag-sign out ng user. + Kung iiwanang hindi nakatakda, wala itong epekto at hindi pupuwersahin ang pag-reboot sa pag-sign out ng user. Nalalapat din ito kung nakatakda sa Hindi Kailanman. + May epekto lang ang patakarang ito sa mga hindi naka-affiliate na user. + </translation> <translation id="1781356041596378058">Kinokontrol ng patakarang ito ang access sa Mga Opsyon ng Developer sa Android. Kung itatakda mo ang patakarang ito sa true, hindi maa-access ng mga user ang Mga Opsyon ng Developer. Kung itatakda mo ang patakarang ito sa false o iiwan itong hindi nakatakda, maa-access ng mga user ang Mga Opsyon ng Developer sa pamamagitan ng pag-tap nang pitong beses sa app na Mga setting ng Android.</translation> <translation id="1793346220873697538">I-disable ang pag-print gamit ang PIN bilang default</translation> <translation id="1797233582739332495">Magpakita sa user ng umuulit na prompt na nagsasaad na kinakailangan ang muling paglulunsad</translation> @@ -956,6 +962,7 @@ Kinikilala lamang ang patakarang ito kung pinagana ang patakaran ng 'DefaultSearchProviderEnabled.'</translation> <translation id="268577405881275241">Ine-enable ang feature na proxy ng compression ng data</translation> <translation id="2693108589792503178">I-configure ang URL ng pagpapalit ng password.</translation> +<translation id="2694143893026486692">Na-enable ang naka-dock na magnifier</translation> <translation id="2706708761587205154">Payagan lang ang pag-print gamit ang PIN</translation> <translation id="2710534340210290498">Kung itatakda ang patakarang ito sa false, hindi magagawa ng mga user na i-lock ang screen (tanging pag-sign out lang mula sa session ng user ang magiging posible). Kung itatakda ang setting na ito sa true o kung hindi ito itatakda, magagawa ng mga user na nag-authenticate gamit ang password na i-lock ang screen.</translation> <translation id="2731627323327011390">I-disable ang paggamit ng mga certificate ng <ph name="PRODUCT_OS_NAME" /> sa mga ARC app</translation> @@ -1192,6 +1199,7 @@ Opsyonal ang patakarang ito. Kung hindi nakatakda, hindi magpapalit ng termino para sa paghahanap. Sinusunod lang ang patakarang ito kung pinagana ang patakarang 'DefaultSearchProviderEnabled.'</translation> +<translation id="3053265701996417839">Microsoft Windows 7</translation> <translation id="306887062252197004">Pinapayagan ng patakarang ito ang mga user ng feature na WebDriver na mag-override ng mga patakarang makakaapekto sa mga pagpapatakbo nito.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index a25315a..2276ff5 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -4384,7 +4384,7 @@ <translation id="915194831143859291">अगर यह नीति 'गलत' पर सेट है या कॉन्फ़िगर नहीं है तो, <ph name="PRODUCT_OS_NAME" /> उपयोगकर्ता को डिवाइस बंद करने देगा. अगर यह नीति 'सही' पर सेट है तो, <ph name="PRODUCT_OS_NAME" /> उपयोगकर्ता के डिवाइस को बंद करने पर उसे फिर से चालू (रीबूट) कर देगा. <ph name="PRODUCT_OS_NAME" /> यूज़र इंटरफ़ेस (यूआई) में हर बार 'शटडाउन बटन' को 'रीबूट बटन' से बदल देता है. अगर उपयोगकर्ता 'पावर बटन' से डिवाइस को बंद कर देता है तो, वह अपने आप चालू नहीं होगा, भले ही नीति चालू हो.</translation> <translation id="9152473318295429890">मिलते-जुलते वेब पेज के प्रासंगिक सुझावों को चालू करें</translation> -<translation id="9153446010242995516">अगर टारगेट के मुकाबले OS वर्शन नया है, तो रोलबैक करें और टारगेट वर्शन पर बने रहें. अगर हो सके, तो रोलबैक की मदद से डिवाइस-लेवल कॉन्फ़िगरेशन (जिसमें नेटवर्क क्रेडेंशियल शामिल हैं) को आगे ले जाएं. हालांकि, अगर डेटा को बहाल नहीं किया जा सकता हो, तब भी पूरे पावरवॉश के साथ रोलबैक करें (क्योंकि टारगेट वर्शन के साथ डेटा बहाल नहीं किया जा सकता है या किसी पुराने वर्शन में बदलाव की वजह से ). +<translation id="9153446010242995516">अगर टारगेट के मुकाबले OS वर्शन नया है, तो रोलबैक करें और टारगेट वर्शन पर बने रहें. अगर हो सके, तो रोलबैक की मदद से डिवाइस-लेवल कॉन्फ़िगरेशन (जिसमें नेटवर्क क्रेडेंशियल शामिल हैं) को आगे ले जाएं. हालांकि, अगर डेटा को बहाल नहीं किया जा सकता हो, तब भी पूरे पावरवॉश के साथ रोलबैक करें (क्योंकि टारगेट वर्शन के साथ डेटा बहाल नहीं किया जा सकता है या किसी पुराने वर्शन में बदलाव की वजह से). यह <ph name="PRODUCT_OS_NAME" /> के वर्शन 75 और उसके बाद वाले वर्शन के साथ काम करता है. पुराने क्लाइंट के लिए, इस मान का मतलब है कि वह रोलबैक रोक दिया गया है.</translation> <translation id="9158929520101169054">ब्राउज़र के अंदर एक से ज़्यादा साइन इन की अनुमति दें</translation> <translation id="9159126470527871268">उपयोगकर्ताओं को सूचित करें कि <ph name="PRODUCT_NAME" /> को फिर से लॉन्च किया जाना चाहिए या <ph name="PRODUCT_OS_NAME" /> को फिर से शुरू करना होगा ताकि उन अपडेट को लागू किया जा सके जिन्हें मंज़ूरी नहीं मिली है.
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index 1719e256..4748aa3 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -1978,7 +1978,7 @@ <translation id="4639407427807680016">שמות של מארחי העברת ההודעות המקומית שיש להוציא מהרשימה השחורה</translation> <translation id="4650759511838826572">השבת סכימות פרוטוקול של כתובות אתר</translation> <translation id="465099050592230505">כתובת אתר של חנות אינטרנט של ארגון (הוצא משימוש)</translation> -<translation id="4661889655253181651">הגדרות תוכן מאפשרות לך לציין את אופן הטיפול בתוכן מסוג מסוים (למשל קובצי Cookie, תמונות או JavaScript).</translation> +<translation id="4661889655253181651">הגדרות תוכן מאפשרות לך לציין את אופן הטיפול בתוכן מסוג מסוים (למשל: קובצי Cookie, תמונות או JavaScript).</translation> <translation id="4665897631924472251">הגדרות ניהול תוספים</translation> <translation id="4668325077104657568">הגדרת ברירת מחדל של תמונות</translation> <translation id="4670865688564083639">מינימום:</translation>
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index b91af5d..12d27bd 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -1113,15 +1113,15 @@ ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ കൂടുതൽ വ്യക്തമാക്കിയ നയങ്ങളുടെ പ്രവർത്തനരീതി ബാധിക്കപ്പെടാതെ തുടരുന്നു.</translation> <translation id="2987155890997901449">ARC പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="2987227569419001736">വെബ് Bluetooth API ഉപയോഗം നിയന്ത്രിക്കുക</translation> -<translation id="2990018289267778247">ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചാൽ, ഉപയോഗ സഹായി ഓപ്ഷനുകൾ എപ്പോഴും സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകും. +<translation id="2990018289267778247">ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചാൽ, ഉപയോഗസഹായി ഓപ്ഷനുകൾ എപ്പോഴും സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകും. - ഈ നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചാൽ, ഉപയോഗ സഹായി ഓപ്ഷനുകൾ ഒരിക്കലും സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകില്ല. + ഈ നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചാൽ, ഉപയോഗസഹായി ഓപ്ഷനുകൾ ഒരിക്കലും സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകില്ല. ഈ നയം സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല. - ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ ഉപയോഗ സഹായി ഓപ്ഷനുകൾ സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകില്ല, എന്നാൽ ഉപയോക്താവിന് ക്രമീകരണ പേജ് വഴി പയോഗ സഹായി ഓപ്ഷനുകൾ ദൃശ്യമാക്കാം. + ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ ഉപയോഗസഹായി ഓപ്ഷനുകൾ സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകില്ല, എന്നാൽ ഉപയോക്താവിന് ക്രമീകരണ പേജ് വഴി ഉപയോഗസഹായി ഓപ്ഷനുകൾ ദൃശ്യമാക്കാം. - ഉപയോഗ സഹായി ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമായിരിക്കുമ്പോൾ (മറ്റ് മാർഗ്ഗങ്ങൾ മുഖേന, ഉദാ: ഒരു കീ കോമ്പിനേഷൻ വഴി) ഉപയോഗ സഹായി ഓപ്ഷനുകൾ എപ്പോഴും സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകും.</translation> + ഉപയോഗസഹായി ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമായിരിക്കുമ്പോൾ (മറ്റ് മാർഗ്ഗങ്ങൾ മുഖേന, ഉദാ: ഒരു കീ കോമ്പിനേഷൻ വഴി) ഉപയോഗസഹായി ഓപ്ഷനുകൾ എപ്പോഴും സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകും.</translation> <translation id="3011301228198307065"><ph name="PRODUCT_NAME" />-ൽ ഡിഫോൾട്ട് ഹോം പേജ് URL കോൺഫിഗർ ചെയ്യുകയും അത് മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുന്നു. ഹോം ബട്ടൺ ഉപയോഗിച്ച് തുറക്കുന്ന പേജാണ് ഹോം പേജ്. ആദ്യം തുറക്കുന്ന പേജുകൾ നിയന്ത്രിക്കുന്നത് RestoreOnStartup നയങ്ങളാണ്. @@ -1823,11 +1823,11 @@ 'DefaultSearchProviderEnabled' നയം പ്രവർത്തനക്ഷമമാകിയിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ നയം ബാധകമാകൂ.</translation> <translation id="4285674129118156176">അഫിലിയേറ്റ് ചെയ്യാത്ത ഉപയോക്താക്കളെ ARC ഉപയോഗിക്കാൻ അനുവദിക്കുക</translation> -<translation id="4289903996435140853">നൽകിയിരിക്കുന്ന വെണ്ടർ, ഉൽപ്പന്ന ഐഡികൾ ഉപയോഗിച്ച് USB ഉപകരണം ആക്സസ് ചെയ്യാൻ ഏതെല്ലാം സൈറ്റുകൾക്ക് സ്വമേധയാ അനുമതി നൽകണമെന്ന് വ്യക്തമാക്കുന്ന URL പാറ്റേണുകളുടെ ലിസ്റ്റ് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. നയം സാധുവാകാൻ, ലിസ്റ്റിലെ ഓരോ ഇനത്തിലും ഉപകരണങ്ങളും URLകളും അടങ്ങിയിരിക്കണം. ഉപകരണങ്ങളിലെ ഓരോ ഇനത്തിലും ഒരു വെണ്ടർ ഐഡി ഫീൽഡും ഉൽപ്പന്ന ഐഡി ഫീൽഡും അടങ്ങിയിരിക്കാം. ഒഴിവാക്കപ്പെട്ട ഏതൊരു ഐഡിയും, വെണ്ടർ ഐഡി കൂടി വ്യക്തമാക്കാതെ ഉൽപ്പന്ന ഐഡി വ്യക്തമാക്കാനാവില്ല എന്ന വ്യവസ്ഥയോടെ, വൈൽഡ്കാർഡ് ആയി പരിഗണിക്കപ്പെടും. അല്ലെങ്കിൽ, നയം സാധുവായിരിക്കില്ല, ഇത് അവഗണിക്കപ്പെടുന്നു. +<translation id="4289903996435140853">നൽകിയിരിക്കുന്ന വെണ്ടർ, ഉൽപ്പന്ന ഐഡികൾ ഉപയോഗിച്ച് USB ഉപകരണം ആക്സസ് ചെയ്യാൻ ഏതെല്ലാം സൈറ്റുകൾക്ക് സ്വയമേവ അനുമതി നൽകണമെന്ന് വ്യക്തമാക്കുന്ന URL പാറ്റേണുകളുടെ ലിസ്റ്റ് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. നയം സാധുവാകാൻ, ലിസ്റ്റിലെ ഓരോ ഇനത്തിലും ഉപകരണങ്ങളും URLകളും അടങ്ങിയിരിക്കണം. ഉപകരണങ്ങളിലെ ഓരോ ഇനത്തിലും ഒരു വെണ്ടർ ഐഡി ഫീൽഡും ഉൽപ്പന്ന ഐഡി ഫീൽഡും അടങ്ങിയിരിക്കാം. ഒഴിവാക്കപ്പെട്ട ഏതൊരു ഐഡിയും, വെണ്ടർ ഐഡി കൂടി വ്യക്തമാക്കാതെ ഉൽപ്പന്ന ഐഡി വ്യക്തമാക്കാനാവില്ല എന്ന വ്യവസ്ഥയോടെ, വൈൽഡ്കാർഡ് ആയി പരിഗണിക്കപ്പെടും. അല്ലെങ്കിൽ, നയം സാധുവായിരിക്കില്ല, ഇത് അവഗണിക്കപ്പെടുന്നു. അഭ്യർത്ഥിക്കുന്ന URL-ന് USB ഉപകരണം ആക്സസ് ചെയ്യാനുള്ള അനുമതി നൽകാനായി, USB അനുമതി മാതൃക, അഭ്യർത്ഥിക്കുന്ന സൈറ്റിൻ്റെയും ("അഭ്യർത്ഥിക്കുന്ന URL") ഉന്നത ലെവലിൽ ഫ്രെയിം ചെയ്ത സൈറ്റിൻ്റെയും ("ഉൾച്ചേർക്കുന്ന URL") URL ഉപയോഗിക്കുന്നു. അഭ്യർത്ഥിക്കുന്ന സൈറ്റ് ഒരു iframe-ൽ ലോഡ് ചെയ്തിരിക്കുമ്പോൾ, അഭ്യർത്ഥിക്കുന്ന URL ഉൾച്ചേർക്കുന്ന URL-ൽ നിന്ന് വ്യത്യസ്തമായേക്കാം. അതിനാൽ, "URL-കൾ" ഫീൽഡിൽ, അഭ്യർത്ഥിക്കുന്ന URL-ഉം ഉൾച്ചേർക്കുന്ന URL-ഉം വ്യക്തമാക്കുന്നതിനായി കോമയാൽ വേർതിരിച്ച രണ്ട് URL സ്ട്രിംഗുകൾ വരെ അടങ്ങിയിരിക്കാം. ഒരു URL മാത്രമാണ് വ്യക്തമാക്കിയിട്ടുള്ളതെങ്കിൽ, ഉൾച്ചേർക്കുന്ന നില പരിഗണിക്കാതെ തന്നെ അഭ്യർത്ഥിക്കുന്ന സൈറ്റിൻ്റെ URL ഈ URL-മായി പൊരുത്തപ്പെടുമ്പോൾ അനുയോജ്യമായ USB ഉപകരണങ്ങളിലേക്ക് ആക്സസ് അനുവദിക്കപ്പെടും. "URL-കൾ" എന്നതിലെ URL-കൾ സാധുതയുള്ളവയായിരിക്കണം, അല്ലെങ്കിൽ നയം അവഗണിക്കപ്പെടും. - ഈ നയം സജ്ജീകരിക്കാതെ നിലയിലാണെങ്കിൽ, എല്ലാ സൈറ്റുകൾക്കും വേണ്ടി, ആഗോള സ്ഥിര മൂല്യം ഉപയോഗിക്കപ്പെടും; 'DefaultWebUsbGuardSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ, സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിൻ്റെ വ്യക്തിഗത കോൺഫിഗറേഷനിൽ നിന്നോ ഉള്ള മൂല്യമാണ് ഉപയോഗിക്കപ്പെടുക. + ഈ നയം സജ്ജീകരിക്കാത്ത നിലയിലാണെങ്കിൽ, എല്ലാ സൈറ്റുകൾക്കും വേണ്ടി, ആഗോള സ്ഥിര മൂല്യം ഉപയോഗിക്കപ്പെടും; 'DefaultWebUsbGuardSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ, സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിൻ്റെ വ്യക്തിഗത കോൺഫിഗറേഷനിൽ നിന്നോ ഉള്ള മൂല്യമാണ് ഉപയോഗിക്കപ്പെടുക. ഈ നയത്തിലെ URL പാറ്റേണുകളും WebUsbBlockedForUrls വഴി കോൺഫിഗർ ചെയ്യപ്പെട്ടിട്ടുള്ളവയും തമ്മിൽ പൊരുത്തക്കേട് ഉണ്ടാകരുത്. വൈരുദ്ധ്യമുണ്ടെങ്കിൽ, ഈ നയം WebUsbBlockedForUrls, WebUsbAskForUrls എന്നിവയ്ക്ക്മേൽ പ്രാധാന്യം നേടും. @@ -2030,7 +2030,7 @@ ഈ ക്രമീകരണം തെറ്റ് എന്നതിലേക്ക് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, നിർദേശങ്ങൾ ലഭ്യമാക്കുകയോ പ്രദർശിപ്പിക്കുകയോ ഇല്ല.</translation> <translation id="4759650396863318477">തീരുമാനമെടുക്കാത്തൊരു അപ്ഡേറ്റ് പ്രയോഗിക്കാൻ, <ph name="PRODUCT_NAME" /> റീലോഞ്ച് ചെയ്യണമെന്നോ <ph name="PRODUCT_OS_NAME" /> ഉപകരണം റീസ്റ്റാർട്ട് ചെയ്യണമെന്നോ ഉപയോക്താക്കളെ അറിയിക്കുന്നതിനുള്ള സമയ കാലയളവ്, മില്ലിസെക്കൻഡിൽ സജ്ജീകരിക്കുന്നതിന് നിങ്ങളെ അനുവദിക്കുന്നു. - ഈ സമയ കാലയളവിൽ, അപ്ഡേറ്റിന്റെ ആവശ്യകതയെ കുറിച്ച് ഉപയോക്താവിന് ആവർത്തിച്ച് അറിയിക്കും. <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങൾക്ക്, ഒരു അപ്ഗ്രേഡ് തിരിച്ചറിയപ്പെടുമ്പോൾ, സിസ്റ്റം ട്രേയിൽ <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> നയത്തിനനുസരിച്ച് ഒരു റീസ്റ്റാർട്ട് അറിയിപ്പ് ദൃശ്യമാകും. <ph name="PRODUCT_NAME" /> ബ്രൗസറുകളുടെ കാര്യത്തിൽ, അറിയിപ്പ് കാലയളവിൻ്റെ മൂന്നിലൊരു ഭാഗം തീർന്നുകഴിഞ്ഞാൽ, ഒരു റീലോഞ്ച് ആവശ്യമാണെന്ന് സൂചിപ്പിക്കുന്ന തരത്തിൽ ആപ്പ് മെനു മാറുന്നു. അറിയിപ്പ് കാലയളവിൻ്റെ മൂന്നിൽ രണ്ടുഭാഗം തീർന്നാൽ, അറിയിപ്പിൻ്റെ നിറം മാറുന്നു, മുഴുവൻ അറിയിപ്പ് കാലയളവും പൂർത്തിയായിക്കഴിഞ്ഞാൽ വീണ്ടും നിറം മാറും. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> നയം മുഖേന പ്രവർത്തനക്ഷമമാക്കിയിട്ടുള്ള അധിക അറിയിപ്പുകളും ഇതേ ഷെഡ്യൂൾ പിന്തുടരുന്നു. + ഈ സമയ കാലയളവിൽ, അപ്ഡേറ്റിന്റെ ആവശ്യകതയെ കുറിച്ച് ഉപയോക്താവിനെ ആവർത്തിച്ച് അറിയിക്കും. <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങൾക്ക്, ഒരു അപ്ഗ്രേഡ് തിരിച്ചറിയപ്പെടുമ്പോൾ, സിസ്റ്റം ട്രേയിൽ <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> നയത്തിനനുസരിച്ച് ഒരു റീസ്റ്റാർട്ട് അറിയിപ്പ് ദൃശ്യമാകും. <ph name="PRODUCT_NAME" /> ബ്രൗസറുകളുടെ കാര്യത്തിൽ, അറിയിപ്പ് കാലയളവിൻ്റെ മൂന്നിലൊരു ഭാഗം തീർന്നുകഴിഞ്ഞാൽ, ഒരു റീലോഞ്ച് ആവശ്യമാണെന്ന് സൂചിപ്പിക്കുന്ന തരത്തിൽ ആപ്പ് മെനു മാറുന്നു. അറിയിപ്പ് കാലയളവിൻ്റെ മൂന്നിൽ രണ്ടുഭാഗം തീർന്നാൽ, അറിയിപ്പിൻ്റെ നിറം മാറുന്നു, മുഴുവൻ അറിയിപ്പ് കാലയളവും പൂർത്തിയായിക്കഴിഞ്ഞാൽ വീണ്ടും നിറം മാറും. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> നയം മുഖേന പ്രവർത്തനക്ഷമമാക്കിയിട്ടുള്ള അധിക അറിയിപ്പുകളും ഇതേ ഷെഡ്യൂൾ പിന്തുടരുന്നു. സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങൾക്ക് 345600000 മില്ലിസെക്കൻഡിൻ്റെയും (നാല് ദിവസം) <ph name="PRODUCT_NAME" />-ന് 604800000 മില്ലിസെക്കൻഡിൻ്റെയും (ഒരു ആഴ്ച) ഡിഫോൾട്ട് കാലയളവ് ഉപയോഗിക്കപ്പെടുന്നു.</translation> <translation id="4788252609789586009"><ph name="PRODUCT_NAME" />-ന്റെ സ്വമേധയാ പൂരിപ്പിക്കൽ ഫീച്ചർ പ്രവർത്തനക്ഷമമാക്കുകയും മുമ്പ് സംഭരിച്ച വിവരം ഉപയോഗിച്ച് വെബ് ഫോമുകളിൽ ക്രെഡിറ്റ് കാർഡ് വിവരം സ്വമേധയാ പൂർത്തിയാക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കുകയും ചെയ്യുന്നു. @@ -2243,11 +2243,11 @@ ഈ നയം ആഗോള ഡിഫോൾട്ട് മൂല്യത്തെ സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിൽ, അത് സജ്ജമാക്കിയ 'DefaultNotificationsSetting' നയത്തിൽനിന്നോ ഉപയോക്താവിന്റെ സ്വകാര്യ കോൺഫിഗറേഷനിൽ നിന്നോ എല്ലാ സൈറ്റുകൾക്കുമായുള്ള മൂല്യം ഉപയോഗിക്കും.</translation> <translation id="5213038356678567351">ഒരിക്കലും ബ്രൗസർ മാറ്റം ട്രിഗ്ഗർ ചെയ്യരുതാത്ത വെബ്സൈറ്റുകൾ.</translation> <translation id="5219844027738217407">Android ആപ്പുകളിൽ മൈക്രോഫോണിന് മാത്രമേ ഈ നയം ബാധകമാകൂ. ഈ നയം ശരി എന്ന് സജ്ജമാക്കിയാൽ, ഒഴിവാക്കലുകളൊന്നുമില്ലാതെ എല്ലാ Android ആപ്പുകൾക്കുമായി മൈക്രോഫോൺ മ്യൂട്ട് ചെയ്യും.</translation> -<translation id="5221394278852982313">നൽകിയിരിക്കുന്ന വെണ്ടർ, ഉൽപ്പന്ന ഐഡികൾ ഉപയോഗിച്ച് USB ഉപകരണം ആക്സസ് ചെയ്യാൻ ഏതെല്ലാം സൈറ്റുകൾക്ക് സ്വമേധയാ അനുമതി നൽകണമെന്ന് വ്യക്തമാക്കുന്ന URL പാറ്റേണുകളുടെ ലിസ്റ്റ് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. നയം സാധുവാകാൻ, ലിസ്റ്റിലെ ഓരോ ഇനത്തിലും ഉപകരണങ്ങളും URLകളും അടങ്ങിയിരിക്കണം. ഉപകരണങ്ങളിലെ ഓരോ ഇനത്തിലും ഒരു വെണ്ടർ ഐഡി ഫീൽഡും ഉൽപ്പന്ന ഐഡി ഫീൽഡും അടങ്ങിയിരിക്കാം. ഒഴിവാക്കപ്പെട്ട ഏതൊരു ഐഡിയും, വെണ്ടർ ഐഡി കൂടി വ്യക്തമാക്കാതെ ഉൽപ്പന്ന ഐഡി വ്യക്തമാക്കാനാവില്ല എന്ന വ്യവസ്ഥയോടെ, വൈൽഡ്കാർഡ് ആയി പരിഗണിക്കപ്പെടും. അല്ലെങ്കിൽ, നയം സാധുവായിരിക്കില്ല, ഇത് അവഗണിക്കപ്പെടുന്നു. +<translation id="5221394278852982313">നൽകിയിരിക്കുന്ന വെണ്ടർ, ഉൽപ്പന്ന ഐഡികൾ ഉപയോഗിച്ച് USB ഉപകരണം ആക്സസ് ചെയ്യാൻ ഏതെല്ലാം സൈറ്റുകൾക്ക് സ്വയമേവ അനുമതി നൽകണമെന്ന് വ്യക്തമാക്കുന്ന URL പാറ്റേണുകളുടെ ലിസ്റ്റ് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. നയം സാധുവാകാൻ, ലിസ്റ്റിലെ ഓരോ ഇനത്തിലും ഉപകരണങ്ങളും URLകളും അടങ്ങിയിരിക്കണം. ഉപകരണങ്ങളിലെ ഓരോ ഇനത്തിലും ഒരു വെണ്ടർ ഐഡി ഫീൽഡും ഉൽപ്പന്ന ഐഡി ഫീൽഡും അടങ്ങിയിരിക്കാം. ഒഴിവാക്കപ്പെട്ട ഏതൊരു ഐഡിയും, വെണ്ടർ ഐഡി കൂടി വ്യക്തമാക്കാതെ ഉൽപ്പന്ന ഐഡി വ്യക്തമാക്കാനാവില്ല എന്ന വ്യവസ്ഥയോടെ, വൈൽഡ്കാർഡ് ആയി പരിഗണിക്കപ്പെടും. അല്ലെങ്കിൽ, നയം സാധുവായിരിക്കില്ല, ഇത് അവഗണിക്കപ്പെടുന്നു. അഭ്യർത്ഥിക്കുന്ന URL-ന് USB ഉപകരണം ആക്സസ് ചെയ്യാനുള്ള അനുമതി നൽകാനായി, USB അനുമതി മാതൃക, അഭ്യർത്ഥിക്കുന്ന സൈറ്റിൻ്റെയും ("അഭ്യർത്ഥിക്കുന്ന URL") ഉന്നത ലെവലിൽ ഫ്രെയിം ചെയ്ത സൈറ്റിൻ്റെയും ("ഉൾച്ചേർക്കുന്ന URL") URL ഉപയോഗിക്കുന്നു. അഭ്യർത്ഥിക്കുന്ന സൈറ്റ് ഒരു iframe-ൽ ലോഡ് ചെയ്തിരിക്കുമ്പോൾ, അഭ്യർത്ഥിക്കുന്ന URL ഉൾച്ചേർക്കുന്ന URL-ൽ നിന്ന് വ്യത്യസ്തമായേക്കാം. അതിനാൽ, "URL-കൾ" ഫീൽഡിൽ, അഭ്യർത്ഥിക്കുന്ന URL-ഉം ഉൾച്ചേർക്കുന്ന URL-ഉം വ്യക്തമാക്കുന്നതിനായി കോമയാൽ വേർതിരിച്ച രണ്ട് URL സ്ട്രിംഗുകൾ വരെ അടങ്ങിയിരിക്കാം. ഒരു URL മാത്രമാണ് വ്യക്തമാക്കിയിട്ടുള്ളതെങ്കിൽ, ഉൾച്ചേർക്കുന്ന നില പരിഗണിക്കാതെ തന്നെ അഭ്യർത്ഥിക്കുന്ന സൈറ്റിൻ്റെ URL ഈ URL-മായി പൊരുത്തപ്പെടുമ്പോൾ അനുയോജ്യമായ USB ഉപകരണങ്ങളിലേക്ക് ആക്സസ് അനുവദിക്കപ്പെടും. "URL-കൾ" എന്നതിലെ URL-കൾ സാധുതയുള്ളവയായിരിക്കണം, അല്ലെങ്കിൽ നയം അവഗണിക്കപ്പെടും. - ഈ നയം സജ്ജീകരിക്കാതെ നിലയിലാണെങ്കിൽ, എല്ലാ സൈറ്റുകൾക്കും വേണ്ടി, ആഗോള സ്ഥിര മൂല്യം ഉപയോഗിക്കപ്പെടും; 'DefaultWebUsbGuardSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ, സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിന്റെ വ്യക്തിഗത കോൺഫിഗറേഷനിൽ നിന്നോ ഉള്ള മൂല്യമാണ് ഉപയോഗിക്കപ്പെടുക. + ഈ നയം സജ്ജീകരിക്കാത്ത നിലയിലാണെങ്കിൽ, എല്ലാ സൈറ്റുകൾക്കും വേണ്ടി, ആഗോള സ്ഥിര മൂല്യം ഉപയോഗിക്കപ്പെടും; 'DefaultWebUsbGuardSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ, സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിന്റെ വ്യക്തിഗത കോൺഫിഗറേഷനിൽ നിന്നോ ഉള്ള മൂല്യമാണ് ഉപയോഗിക്കപ്പെടുക. ഈ നയത്തിലെ URL പാറ്റേണുകളും WebUsbBlockedForUrls വഴി കോൺഫിഗർ ചെയ്യപ്പെട്ടിട്ടുള്ളവയും തമ്മിൽ പൊരുത്തക്കേട് ഉണ്ടാകരുത്. വൈരുദ്ധ്യമുണ്ടെങ്കിൽ, ഈ നയം WebUsbBlockedForUrls, WebUsbAskForUrls എന്നിവയ്ക്ക്മേൽ പ്രാധാന്യം നേടും.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index 7cc8c59..b81c551c 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -1093,6 +1093,15 @@ இந்தக் கொள்கை அமைக்கப்படவில்லை எனில் இதைவிடத் தெளிவான கொள்கைகளின் நடத்தையில் எந்த மாற்றமும் இருக்காது.</translation> <translation id="2987155890997901449">ARCஐ இயக்கு</translation> <translation id="2987227569419001736">இணைய புளூடூத் API இன் பயன்பாட்டைக் கட்டுப்படுத்தும்</translation> +<translation id="2990018289267778247">இந்தக் கொள்கை 'சரி' என அமைக்கப்பட்டால் சிஸ்டம் ட்ரேயில் அணுகல்தன்மை விருப்பங்கள் எப்போதும் தோன்றும். + + இந்தக் கொள்கை 'தவறு' என அமைக்கப்பட்டால் சிஸ்டம் ட்ரேயில் அணுகல்தன்மை விருப்பங்கள் தோன்றாது. + + இந்தக் கொள்கையை அமைத்தால் அதைப் பயனர்கள் மாற்றவோ மேலெழுதவோ இயலாது. + + இந்தக் கொள்கை அமைக்கப்படவில்லை எனில் சிஸ்டம் ட்ரே மெனுவில் அணுகல்தன்மை விருப்பங்கள் தோன்றாது, ஆனால் பயனர்கள் 'அமைப்புகள்' பக்கத்திற்குச் சென்று அணுகல்தன்மை விருப்பங்கள் தோன்றும்படி செய்யலாம். + + அணுகலம்சங்கள் இயக்கப்பட்டு இருக்கும்போது (எ.கா விசை சேர்க்கையின் மூலம் இயக்கப்படுதல்), அணுகலம்சங்களின் விருப்பங்கள் சிஸ்டம் டிரே மெனுவில் எப்போதும் தோன்றும்.</translation> <translation id="3011301228198307065"><ph name="PRODUCT_NAME" /> இல் இயல்பு முகப்புப் பக்க URLலை உள்ளமைத்துப் பயனர்கள் அதை மாற்றுவதைத் தடுக்கிறது. முகப்புப் பக்கம் என்பது ‘முகப்பு’ பட்டனை அழுத்தும்போது திறக்கப்படும் பக்கமாகும். துவக்கத்தில் திறக்கப்படும் பக்கங்கள் RestoreOnStartup கொள்கைகளால் கட்டுப்படுத்தப்படும். @@ -1406,6 +1415,7 @@ இந்தக் கொள்கை, டெஸ்க்டாப்பில் சாதன வரம்பு கிளவுட் கொள்கைப் பதிவினால் பயன்படுத்தப்படும், இதை Windowsஸில் ‘பதிவகம்’ அல்லது GPO என்பதில் அமைக்கலாம், Macகில் ‘plist' என்பதிலும் Linuxஸில் JSON கொள்கைக் கோப்பிலும் அமைக்கலாம்.</translation> <translation id="3660562134618097814">உள்நுழைவின் போது SAML IdP குக்கீகளைப் பரிமாற்றும்</translation> <translation id="3701121231485832347"><ph name="MS_AD_NAME" /> நிர்வகிக்கும் <ph name="PRODUCT_OS_NAME" /> சாதனங்களுக்கான அமைப்புகளைக் கட்டுப்படுத்துகிறது.</translation> +<translation id="3702518095257671450">தொலைநிலை சான்றொப்பம்</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (இந்த ஒற்றை வரி புலம் தடுக்கப்பட்டது. எதிர்காலத்தில், அது நீக்கப்படும். கீழே உள்ள பல வரிகளுக்கான உரைப்பெட்டியைப் பயன்படுத்தத் தொடங்கவும்.)</translation> <translation id="3709266154059827597">நீட்டிப்பு நிறுவுதல் தடுப்புப்பட்டியலை உள்ளமை</translation> <translation id="3711895659073496551">இடைநிறுத்தப்பட்டது</translation> @@ -1784,6 +1794,15 @@ 'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டிருந்தால் மட்டுமே இந்தக் கொள்கையானது ஆதரிக்கப்படும்.</translation> <translation id="4285674129118156176">ARCஐப் பயன்படுத்த, அதிகாரப்பூர்வமாக இணைக்கப்படாத பயனர்களை அனுமதிக்கவும்</translation> +<translation id="4289903996435140853">குறிப்பிட்ட விற்பனையாளர் ஐடியையும் தயாரிப்பு ஐடிகளையும் கொண்ட ஒரு USB சாதனத்தை அணுகுவதற்குத் தானாக அனுமதி வழங்கப்படும் தளங்களைக் குறிப்பிடுகின்ற urlகளின் பட்டியலை அமைக்க உங்களை அனுமதிக்கும். கொள்கை செல்லுபடியாவதற்கு இந்தப் பட்டியலில் உள்ள அனைத்திலும் சாதனங்களும் urlகளும் இருக்க வேண்டும். சாதனங்களிலுள்ள ஒவ்வொன்றிலும் ஒரு விற்பனையாளர் ஐடி புலமும் தயாரிப்பு ஐடி புலமும் இருக்கலாம். தவிர்க்கப்படும் எந்தவொரு ஐடியும் விதிவிலக்குள்ள ஒரு வைல்டுகார்டாகக் கருதப்படும், விற்பனையாளர் ஐடி இல்லாமல் தயாரிப்பு ஐடியைக் குறிப்பிட முடியாது என்பதே அந்த விதிவிலக்கு. அப்படி இல்லாவிட்டால் கொள்கை செல்லுபடியாகாது. செல்லுபடியாகாத கொள்கை மதிப்புகள் புறக்கணிக்கப்படும். + + USB சாதனத்தை அணுகுவதற்குக் கோருகின்ற URLலுக்கு அனுமதியை வழங்க, கோருகின்ற தளத்தின் URLலையும் (”கோருகின்ற URL”) மேல் நிலை ஃபிரேம் தளத்தின் URLலையும் (”உட்பொதிக்கின்ற URL”) USB அனுமதி மாதிரி பயன்படுத்தும். கோருகின்ற தளத்தை iframeமில் ஏற்றும்போது, கோருகின்ற URLலும் உட்பொதிக்கின்ற URLலும் வெவ்வேறாக இருக்கலாம். அதனால் கோருகின்ற URLலையும் உட்பொதிக்கின்ற URLலையும் முறையே குறிப்பிடுவதற்காக, "urlகள்” புலத்தில் காற்புள்ளியால் பிரிக்கப்பட்ட இரண்டு URLகள் வரை இருக்கலாம். ஒரு URL மட்டும் குறிப்பிடப்பட்டிருந்தால் உட்பொதிக்கும் நிலை எதுவாக இருந்தாலும் கோருகின்ற தளத்தின் URLலும் இந்த URLலும் பொருந்தும்போது, தொடர்புடைய USB சாதனங்களுக்கான அணுகல் அளிக்கப்படும். "urlகளில்” உள்ள URLகள் செல்லுபடியாகும் URLகளாக இருக்க வேண்டும், இல்லாவிட்டால் அந்தக் கொள்கை புறக்கணிக்கப்படும். + + இந்தக் கொள்கையை அமைக்கவில்லை எனில் அனைத்துத் தளங்களுக்கும் ஒட்டுமொத்த இயல்பு மதிப்பு பயன்படுத்தப்படும். அப்படி அமைக்கப்படும் மதிப்பு 'DefaultWebUsbGuardSetting' கொள்கையில் குறிப்பிடப்பட்டிருக்கும் மதிப்பாகவோ (ஏற்கனவே அமைக்கப்பட்டிருந்தால்) பயனரின் தனிப்பட்ட உள்ளமைவின் மதிப்பாகவோ இருக்கும். + + இந்தக் கொள்கையின் URL பேட்டர்ன்கள் WebUsbBlockedForUrls கொள்கை மூலம் உள்ளமைக்கப்பட்டுள்ளவற்றுடன் முரண்படக்கூடாது. அப்படி முரண்பட்டால், WebUsbBlockedForUrls மற்றும் WebUsbAskForUrls கொள்கைகளை விட இந்தக் கொள்கைக்கே முன்னுரிமை வழங்கப்படும். + +இந்தக் கொள்கைக்கான மதிப்பும் WebUsbAllowDevicesForUrls கொள்கையும் ஒன்றிணைக்கப்பட்டுள்ளன.</translation> <translation id="4298509794364745131"><ph name="PRODUCT_OS_NAME" /> லாக் ஸ்கிரீனில், குறிப்பெடுக்கும் பயன்பாடாக இயக்கக்கூடிய பயன்பாடுகளின் பட்டியலைக் குறிப்பிடுகிறது. தேர்ந்தெடுத்த குறிப்பெடுக்கும் பயன்பாடானது லாக் ஸ்கிரீனில் இயக்கப்பட்டால், தேர்ந்தெடுத்த குறிப்பெடுக்கும் ஆப்ஸைத் தொடங்குவதற்கான பயனர் இடைமுக உறுப்பானது லாக் ஸ்கிரீனில் காட்டப்படும். @@ -1927,6 +1946,7 @@ <translation id="4639407427807680016">தடுப்புப்பட்டியலிலிருந்து விலக்குவதற்கான நேட்டிவ் செய்தியிடல் ஹோஸ்ட்களின் பெயர்கள்</translation> <translation id="4650759511838826572">URL நெறிமுறை திட்டங்களை முடக்கு</translation> <translation id="465099050592230505">நிறுவன இணைய அங்காடி URL (தடுக்கப்பட்டது)</translation> +<translation id="4661889655253181651">குறிப்பிட்ட வகையான உள்ளடக்கங்கள் (எடுத்துக்காட்டாக, குக்கீகள், படங்கள் அல்லது JavaScript போன்றவை) எவ்வாறு கையாளப்பட வேண்டும் என்பதை, குறிப்பிட்ட உள்ளடக்க அமைப்புகள் அனுமதிக்கிறது.</translation> <translation id="4665897631924472251">நீட்டிப்பு நிர்வகிப்பு அமைப்புகள்</translation> <translation id="4668325077104657568">இயல்புநிலை படங்கள் அமைப்பு</translation> <translation id="4670865688564083639">குறைந்தபட்சம்:</translation> @@ -1973,6 +1993,11 @@ இந்தப் பரிந்துரைகள், Google சேவையகங்களிலிருந்து தொலைநிலையில் பெறப்படும். இந்த அமைப்பு ’தவறு’ என அமைக்கப்பட்டால், பரிந்துரைகள் பெறப்படாது அல்லது காட்டப்படாது.</translation> +<translation id="4759650396863318477">இது மில்லிவினாடிகளில் காலகட்டத்தை அமைக்க அனுமதிக்கும். இந்தக் காலகட்டத்தில் நிலுவையிலுள்ள ஒரு புதுப்பிப்பைப் பயன்படுத்த <ph name="PRODUCT_NAME" />ஐ மீண்டும் தொடங்குவதற்கோ, <ph name="PRODUCT_OS_NAME" /> சாதனத்தை மீண்டும் தொடங்குவதற்கோ பயனருக்கு அறிவுறுத்தப்படும். + +இந்தக் காலகட்டத்தில் புதுப்பிப்பு தேவை என்பதைப் பற்றி பயனருக்குத் தொடர்ச்சியாகத் தெரிவிக்கப்படும். <ph name="PRODUCT_OS_NAME" /> சாதனங்களுக்கு <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> கொள்கையின் படி சிஸ்டம் ட்ரேயில் சாதனத்தை மீண்டும் தொடங்குமாறு அறிவுறுத்தும் அறிவிப்பு தோன்றும். <ph name="PRODUCT_NAME" /> உலாவிகளுக்கு அறிவிப்புகளுக்கான காலகட்டத்தில் மூன்றில் ஒருபங்கு நேரம் முடிந்தவுடன், உலாவியை மீண்டும் தொடங்கவேண்டும் என்பதைச் சுட்டிக்காட்டும் வகையில் ஆப்ஸ் மெனு மாறும். காலகட்டத்தில் மூன்றில் இரண்டு பங்கு நேரம் முடிந்தவுடன் இந்த அறிவிப்பின் நிறம் மாறும். அறிவிப்புக் காலம் முழுமையாக முடிந்தவுடன் மீண்டும் நிறம் மாறும். <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> கொள்கையால் இயக்கப்பட்ட கூடுதல் அறிவிப்புகளும் இதே கால அட்டவணையைப் பயன்படுத்தும். + +அமைக்கவில்லை என்றால் இயல்பாக <ph name="PRODUCT_OS_NAME" /> சாதனங்களுக்கு 345600000 மில்லிவினாடிகள் (நான்கு நாட்கள்) காலகட்டமும் <ph name="PRODUCT_NAME" />க்கு 604800000 மில்லிவினாடிகள் (ஒரு வாரம்) காலகட்டமும் பயன்படுத்தப்படும்.</translation> <translation id="4788252609789586009"><ph name="PRODUCT_NAME" /> இன் தன்னிரப்பி அம்சத்தை இயக்கும். மேலும் ஏற்கனவே சேமிக்கப்பட்ட தகவல்களைப் பயன்படுத்தி, இணையதளப் படிவங்களில் பயனர்கள் தங்களுடைய கிரெடிட் கார்டு தகவலைத் தானாக நிரப்ப அனுமதிக்கும். . @@ -2168,6 +2193,15 @@ <translation id="5208240613060747912">அறிவிப்புகளைக் காண்பிக்க அனுமதிக்காத தளங்களைக் குறிக்கும் url வகைகளின் பட்டியலை அமைக்க, உங்களை அனுமதிக்கிறது.ஒட்டுமொத்தமாக அமைக்காமல் இந்தப் பாலிசி விடப்பட்டிருந்தால் இயல்புநிலை மதிப்பானது, அமைக்கப்பட்டிருந்தால் 'DefaultNotificationsSetting' கொள்கை அல்லது பயனரின் தனிப்பட்ட உள்ளமைவிலிருந்து அனைத்து தளங்களுக்கும் பயன்படுத்தப்படும்.</translation> <translation id="5213038356678567351">உலாவி மாற்றத்தை ஒருபோதும் தூண்டக்கூடாத இணையதளங்கள்.</translation> <translation id="5219844027738217407">Android பயன்பாடுகளில், இந்தக் கொள்கையானது மைக்ரோஃபோனை மட்டுமே பாதிக்கும். இந்தக் கொள்கை "சரி" என அமைக்கப்பட்டிருக்கும் போது, விதிவிலக்குகள் இல்லாமல் எல்லா Android பயன்பாடுகளுக்கும் மைக்ரோஃபோன் முடக்கப்படும்.</translation> +<translation id="5221394278852982313">குறிப்பிட்ட விற்பனையாளர் ஐடியையும் தயாரிப்பு ஐடிகளையும் கொண்ட ஒரு USB சாதனத்தை அணுகுவதற்குத் தானாக அனுமதி வழங்கப்படும் தளங்களைக் குறிப்பிடுகின்ற urlகளின் பட்டியலை அமைக்க உங்களை அனுமதிக்கும். கொள்கை செல்லுபடியாவதற்கு இந்தப் பட்டியலில் உள்ள அனைத்திலும் சாதனங்களும் urlகளும் இருக்க வேண்டும். சாதனங்களிலுள்ள ஒவ்வொன்றிலும் ஒரு விற்பனையாளர் ஐடி புலமும் தயாரிப்பு ஐடி புலமும் இருக்கலாம். தவிர்க்கப்படும் எந்தவொரு ஐடியும் விதிவிலக்குள்ள ஒரு வைல்டுகார்டாகக் கருதப்படும், விற்பனையாளர் ஐடி இல்லாமல் தயாரிப்பு ஐடியைக் குறிப்பிட முடியாது என்பதே அந்த விதிவிலக்கு. அப்படி இல்லாவிட்டால் கொள்கை செல்லுபடியாகாது. செல்லுபடியாகாத கொள்கை மதிப்புகள் புறக்கணிக்கப்படும். + + USB சாதனத்தை அணுகுவதற்குக் கோருகின்ற URLலுக்கு அனுமதியை வழங்க, கோருகின்ற தளத்தின் URLலையும் (”கோருகின்ற URL”) மேல் நிலை ஃபிரேம் தளத்தின் URLலையும் (”உட்பொதிக்கின்ற URL”) USB அனுமதி மாதிரி பயன்படுத்தும். கோருகின்ற தளத்தை iframeமில் ஏற்றும்போது, கோருகின்ற URLலும் உட்பொதிக்கின்ற URLலும் வெவ்வேறாக இருக்கலாம். அதனால் கோருகின்ற URLலையும் உட்பொதிக்கின்ற URLலையும் முறையே குறிப்பிடுவதற்காக, "urlகள்” புலத்தில் காற்புள்ளியால் பிரிக்கப்பட்ட இரண்டு URLகள் வரை இருக்கலாம். ஒரு URL மட்டும் குறிப்பிடப்பட்டிருந்தால் உட்பொதிக்கும் நிலை எதுவாக இருந்தாலும் கோருகின்ற தளத்தின் URLலும் இந்த URLலும் பொருந்தும்போது, தொடர்புடைய USB சாதனங்களுக்கான அணுகல் அளிக்கப்படும். "urlகளில்” உள்ள URLகள் செல்லுபடியாகும் URLகளாக இருக்க வேண்டும், இல்லாவிட்டால் அந்தக் கொள்கை புறக்கணிக்கப்படும். + + இந்தக் கொள்கையை அமைக்கவில்லை எனில் அனைத்துத் தளங்களுக்கும் ஒட்டுமொத்த இயல்பு மதிப்பு பயன்படுத்தப்படும். அப்படி அமைக்கப்படும் மதிப்பு 'DefaultWebUsbGuardSetting' கொள்கையில் குறிப்பிடப்பட்டிருக்கும் மதிப்பாகவோ (ஏற்கனவே அமைக்கப்பட்டிருந்தால்) பயனரின் தனிப்பட்ட உள்ளமைவின் மதிப்பாகவோ இருக்கும். + + இந்தக் கொள்கையின் URL பேட்டர்ன்கள் WebUsbBlockedForUrls கொள்கை மூலம் உள்ளமைக்கப்பட்டுள்ளவற்றுடன் முரண்படக்கூடாது. அப்படி முரண்பட்டால், WebUsbBlockedForUrls மற்றும் WebUsbAskForUrls கொள்கைகளை விட இந்தக் கொள்கைக்கே முன்னுரிமை வழங்கப்படும். + +இந்தக் கொள்கைக்கான மதிப்பும் DeviceWebUsbAllowDevicesForUrls கொள்கையும் ஒன்றிணைக்கப்பட்டுள்ளன.</translation> <translation id="5228316810085661003">சாதன அகக் கணக்குத் தானியங்கு உள்நுழைவுத் தாமதம். |DeviceLocalAccountAutoLoginId| கொள்கையை அமைக்காவிட்டால், இந்தக் கொள்கை பயன்படுத்தப்படாது. இல்லாவிட்டால்: @@ -2877,6 +2911,21 @@ இதனை ''சான்றிதழ்களை நிர்வகிப்பதற்குப் பயனர்களை அனுமதிக்காதே'' என அமைத்தால், பயனர்களால் சான்றிதழ்களை நிர்வகிக்க முடியாது. அவர்களால் சான்றிதழ்களைப் பார்க்க மட்டுமே முடியும்.</translation> <translation id="6573305661369899995">URL கட்டுப்பாடுகளின் வெளிப்புற மூலத்தை அமைக்கவும்</translation> +<translation id="6583851521569686409">சில வகையான பிரிண்ட்டர்களை உள்ளமைக்கும். + + பிரிண்ட்டருக்கான உள்ளமைவுகளைப் பயனர்களுக்கு நிர்வாகிகள் வழங்கிட + இந்தக் கொள்கை அனுமதிக்கும். + + <ph name="PRINTER_DISPLAY_NAME" />, <ph name="PRINTER_DESCRIPTION" /> ஆகியவை பிரிண்ட்டர் தேர்வை எளிதாக்கும் வகையில் உள்ளமைக்கக்கூடிய வார்த்தைகளாகும். இறுதிப் பயனர்கள் பிரிண்ட்டரை எளிதாக அடையாளம் காண்பதற்கு <ph name="PRINTER_MANUFACTURER" />, <ph name="PRINTER_MODEL" /> ஆகியவை உதவும். அவை பிரிண்ட்டரின் உற்பத்தியாளரையும் மாடலையும் குறிக்கின்றன. <ph name="PRINTER_URI" /> என்பது கிளையண்ட் கம்ப்யூட்டரிலிருந்து தொடர்புகொள்ளத்தக்க முகவரியாக இருக்க வேண்டும் அதில் <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, <ph name="URI_QUEUE" /> ஆகியவற்றைக் கொண்டிருக்க வேண்டும். <ph name="PRINTER_UUID" />ஐ விரும்பினால் வழங்கலாம். அவ்வாறு வழங்கினால் அது <ph name="ZEROCONF_DISCOVERY" /> பிரிண்ட்டர்களின் நகல்களை நீக்குவதற்குப் பயன்படுத்தப்படும். + + <ph name="PRINTER_EFFECTIVE_MODEL" /> என்பதில் பிரிண்ட்டரின் பெயர் குறிப்பிடப்பட்டிருக்கவோ <ph name="PRINTER_AUTOCONF" /> என்பது 'சரி' என அமைக்கப்பட்டிருக்கவோ வேண்டும். இந்த இரண்டையும் கொண்டிருந்தாலோ இதில் பண்புகள் எதுவுமே இல்லாமல் இருந்தாலோ ஏற்றுக் கொள்ளப்படாது. + + பிரிண்ட்டரை முதல்முறை பயன்படுத்தும்போதே அது அமைக்கப்பட்டுவிடும். பிரிண்ட்டரைப் பயன்படுத்தும் வரை PPDகள் பதிவிறக்கப்படாது. அதன் பின்னர் அடிக்கடிப் பயன்படுத்தும் PPDகள் தற்காலிகமாகச் சேமிக்கப்படும். + + தனிநபர் சாதனங்களில் பிரிண்ட்டர்களைப் பயனர்கள் உள்ளமைப்பது குறித்து இந்தக் கொள்கையில் வரம்பிடப்படவில்லை. தனிப்பட்ட பயனர்கள் பிரிண்ட்டர்களை உள்ளமைக்க உதவியாக இருக்கவே இது உருவாக்கப்பட்டது. + + ‘ஆக்டிவ் டைரக்டரி’ நிர்வகிக்கும் சாதனங்களுக்கு <ph name="MACHINE_NAME_VARIABLE" />ஐ ‘ஆக்டிவ் டைரக்டரி’ சாதனத்தின் பெயருக்கோ அதன் உட்சரத்திற்கோ நீட்டிப்பதை இந்தக் கொள்கை அனுமதிக்கும். எடுத்துக்காட்டாக, சாதனத்தின் பெயர் <ph name="MACHINE_NAME_EXAMPLE" /> எனில் 6வது நிலைக்குப் (அதாவது <ph name="MACHINE_NAME_PART_EXAMPLE" /> இலிருந்து) பிறகு தொடங்கும் 4 எழுத்துகளால் <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> மாற்றியமைக்கப்படும். கவனத்திற்கு: அந்த நிலையானது பூஜ்ஜியத்தை அடிப்படையாகக் கொண்டது. + </translation> <translation id="6598235178374410284">பயனரின் தோற்றப் படம்</translation> <translation id="6603004149426829878">நேரமண்டலத்தைத் தானாகக் கண்டறியும் போது, கிடைக்கும் எல்லா இருப்பிடச் சிக்னல்களையும் எப்போதும் சேவையகத்திற்கு அனுப்பு</translation> <translation id="6628120204569232711">சேமிப்பகத்தின் நிலை குறித்து அறிக்கையளிக்கவும்</translation> @@ -4163,6 +4212,8 @@ <translation id="915194831143859291">இந்தக் கொள்கை false என அமைக்கப்பட்டிருந்தாலோ அல்லது உள்ளமைக்கப்படாமல் இருந்தாலோ, சாதனத்தை இயக்க நிறுத்தம் செய்ய, பயனரை <ph name="PRODUCT_OS_NAME" /> அனுமதிக்கும். இந்தக் கொள்கை true என அமைக்கப்பட்டால், சாதனத்தைப் பயனர் இயக்க நிறுத்தம் செய்யும்போது, மறுதொடக்கத்தை <ph name="PRODUCT_OS_NAME" /> செயல்படுத்தும். UI இல் உள்ள எல்லா இயக்க நிறுத்தப் பொத்தான்களையும், மறுதொடக்கப் பொத்தான்களாக <ph name="PRODUCT_OS_NAME" /> மாற்றியமைக்கும். பவர் பொத்தானைப் பயன்படுத்திச் சாதனத்தைப் பயனர் இயக்க நிறுத்தம் செய்யும் போது, கொள்கை இயக்கப்பட்டிருந்தாலும் சாதனம் தானாக மறுதொடக்கமாகாது.</translation> <translation id="9152473318295429890">தொடர்புடைய இணையப் பக்கங்களின் சூழல்சார்ந்த பரிந்துரைகளை இயக்கும்</translation> +<translation id="9153446010242995516">OS பதிப்பானது இலக்குப் பதிப்பை விடப் புதியதாக இருந்தால் இலக்குப் பதிப்புக்கு மீட்டமைத்து அதைப் பயன்படுத்தவும். முடிந்தால் பின்னோக்கி மீட்டமைப்பதன் மூலம் சாதன நிலை உள்ளமைவை (நெட்வொர்க் அனுமதிச் சான்றுகள் உட்பட) மாற்றாமல் வைத்திருக்க முயலவும், எனினும் தரவை மீட்டெடுக்க முடியாவிட்டால் கூட, பின்னோக்கி மீட்டமைப்பதை முழு பவர்வாஷுடன் செய்யவும். (இலக்குப் பதிப்பானது தரவு மீட்டமைப்பதை ஆதரிக்காததாலோ பின்னோக்கிய இணக்கமற்ற ஒரு மாற்றம் காரணமாகவோ தரவை மீட்டெடுக்க முடியாமல் போகலாம்). + <ph name="PRODUCT_OS_NAME" /> பதிப்பு 75 மற்றும் பிந்தையவற்றில் ஆதரிக்கப்படும். பழைய கிளையண்ட்களுக்கு, பின்னோக்கி மீட்டமைப்பது முடக்கப்பட்டுள்ளது என்பது இந்த மதிப்பின் பொருள்.</translation> <translation id="9158929520101169054">உலாவிக்குள் பல உள்நுழைவை அனுமதி</translation> <translation id="9159126470527871268">நிலுவையிலுள்ள ஒரு புதுப்பிப்பைப் பயன்படுத்துவதற்காக, <ph name="PRODUCT_NAME" /> அல்லது <ph name="PRODUCT_OS_NAME" />ஐ மீண்டும் தொடங்க வேண்டும் என்று பயனர்களுக்கு அறிவிக்கும்.
diff --git a/components/safe_browsing/BUILD.gn b/components/safe_browsing/BUILD.gn index f518f0d..7d8a539 100644 --- a/components/safe_browsing/BUILD.gn +++ b/components/safe_browsing/BUILD.gn
@@ -39,10 +39,6 @@ deps = [ ":features", ":ping_manager", - - # TODO(vakh): This is here temporarily until we start actually using the - # proto. If it isn't a DEP, it isn't built. - ":realtimeapi_proto", "//base:base", "//base:i18n", "//components/safe_browsing/common:common",
diff --git a/components/safe_browsing/browser/threat_details.cc b/components/safe_browsing/browser/threat_details.cc index dbc8385..dc40a03 100644 --- a/components/safe_browsing/browser/threat_details.cc +++ b/components/safe_browsing/browser/threat_details.cc
@@ -93,6 +93,8 @@ return ClientSafeBrowsingReportRequest::URL_CLIENT_SIDE_PHISHING; case SB_THREAT_TYPE_URL_CLIENT_SIDE_MALWARE: return ClientSafeBrowsingReportRequest::URL_CLIENT_SIDE_MALWARE; + case SB_THREAT_TYPE_BLOCKED_AD_POPUP: + return ClientSafeBrowsingReportRequest::BLOCKED_AD_POPUP; case SB_THREAT_TYPE_AD_SAMPLE: return ClientSafeBrowsingReportRequest::AD_SAMPLE; case SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE: @@ -112,6 +114,7 @@ case SB_THREAT_TYPE_API_ABUSE: case SB_THREAT_TYPE_SUBRESOURCE_FILTER: case SB_THREAT_TYPE_CSD_WHITELIST: + case SB_THREAT_TYPE_HIGH_CONFIDENCE_ALLOWLIST: case DEPRECATED_SB_THREAT_TYPE_URL_PASSWORD_PROTECTION_PHISHING: // Gated by SafeBrowsingBlockingPage::ShouldReportThreatDetails. NOTREACHED() << "We should not send report for threat type: "
diff --git a/components/safe_browsing/db/BUILD.gn b/components/safe_browsing/db/BUILD.gn index 5d2364b..57beea1 100644 --- a/components/safe_browsing/db/BUILD.gn +++ b/components/safe_browsing/db/BUILD.gn
@@ -168,6 +168,7 @@ ":v4_update_protocol_manager", "//base", "//components/safe_browsing:webui_proto", + "//components/safe_browsing/realtime:policy_engine", "//content/public/browser", "//crypto", "//net",
diff --git a/components/safe_browsing/db/v4_local_database_manager.cc b/components/safe_browsing/db/v4_local_database_manager.cc index a42a052..7f59fbf 100644 --- a/components/safe_browsing/db/v4_local_database_manager.cc +++ b/components/safe_browsing/db/v4_local_database_manager.cc
@@ -20,6 +20,7 @@ #include "base/strings/string_tokenizer.h" #include "base/task/post_task.h" #include "components/safe_browsing/db/v4_protocol_manager_util.h" +#include "components/safe_browsing/realtime/policy_engine.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "crypto/sha2.h" @@ -63,6 +64,8 @@ #endif const bool kSyncAlways = true; const bool kSyncNever = false; + const bool kSyncRealTimeLookupList = + RealTimePolicyEngine::CanFetchAllowlist(); return ListInfos({ ListInfo(kSyncAlways, "IpMalware.store", GetIpMalwareId(), SB_THREAT_TYPE_UNUSED), @@ -92,6 +95,9 @@ ListInfo(kSyncOnlyOnChromeBuilds, "UrlSuspiciousSite.store", GetUrlSuspiciousSiteId(), SB_THREAT_TYPE_SUSPICIOUS_SITE), ListInfo(kSyncNever, "", GetChromeUrlApiId(), SB_THREAT_TYPE_API_ABUSE), + ListInfo(kSyncRealTimeLookupList, "UrlHighConfidenceAllowlist.store", + GetUrlHighConfidenceAllowlistId(), + SB_THREAT_TYPE_HIGH_CONFIDENCE_ALLOWLIST), }); // NOTE(vakh): IMPORTANT: Please make sure that the server already supports // any list before adding it to this list otherwise the prefix updates break
diff --git a/components/safe_browsing/db/v4_protocol_manager_util.cc b/components/safe_browsing/db/v4_protocol_manager_util.cc index ade50e0a..59736f6 100644 --- a/components/safe_browsing/db/v4_protocol_manager_util.cc +++ b/components/safe_browsing/db/v4_protocol_manager_util.cc
@@ -157,6 +157,11 @@ return ListIdentifier(GetCurrentPlatformType(), URL, CSD_WHITELIST); } +ListIdentifier GetUrlHighConfidenceAllowlistId() { + return ListIdentifier(GetCurrentPlatformType(), URL, + HIGH_CONFIDENCE_ALLOWLIST); +} + ListIdentifier GetUrlMalwareId() { return ListIdentifier(GetCurrentPlatformType(), URL, MALWARE_THREAT); }
diff --git a/components/safe_browsing/db/v4_protocol_manager_util.h b/components/safe_browsing/db/v4_protocol_manager_util.h index 10dffda..dd21935 100644 --- a/components/safe_browsing/db/v4_protocol_manager_util.h +++ b/components/safe_browsing/db/v4_protocol_manager_util.h
@@ -149,6 +149,9 @@ // A sample of an ad was collected SB_THREAT_TYPE_AD_SAMPLE, + // A report of Google ad that caused a blocked popup was collected. + SB_THREAT_TYPE_BLOCKED_AD_POPUP, + // The page loaded a resource from the Suspicious Site list. SB_THREAT_TYPE_SUSPICIOUS_SITE, @@ -160,6 +163,9 @@ // Off-market APK file downloaded, which could be potentially dangerous. SB_THREAT_TYPE_APK_DOWNLOAD, + + // Match found in the local high-confidence allowlist. + SB_THREAT_TYPE_HIGH_CONFIDENCE_ALLOWLIST, }; using SBThreatTypeSet = base::flat_set<SBThreatType>; @@ -216,6 +222,7 @@ ListIdentifier GetUrlBillingId(); ListIdentifier GetUrlCsdDownloadWhitelistId(); ListIdentifier GetUrlCsdWhitelistId(); +ListIdentifier GetUrlHighConfidenceAllowlistId(); ListIdentifier GetUrlMalBinId(); ListIdentifier GetUrlMalwareId(); ListIdentifier GetUrlSocEngId();
diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/features.cc index 98e0073..a7f3e307 100644 --- a/components/safe_browsing/features.cc +++ b/components/safe_browsing/features.cc
@@ -17,6 +17,8 @@ // Please define any new SafeBrowsing related features in this file, and add // them to the ExperimentalFeaturesList below to start displaying their status // on the chrome://safe-browsing page. +const base::Feature kAdPopupTriggerFeature{"SafeBrowsingAdPopupTrigger", + base::FEATURE_DISABLED_BY_DEFAULT}; // Controls various parameters related to occasionally collecting ad samples, // for example to control how often collection should occur. @@ -49,6 +51,10 @@ "SafeBrowsingPasswordProtectionForSignedInUsers", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kRealTimeUrlLookupFetchAllowlist{ + "SafeBrowsingRealTimeUrlLookupFetchAllowlist", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kSuspiciousSiteTriggerQuotaFeature{ "SafeBrowsingSuspiciousSiteTriggerQuota", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -77,6 +83,7 @@ // True if the feature's state should be listed on chrome://safe-browsing. bool show_state; } kExperimentalFeatures[]{ + {&kAdPopupTriggerFeature, true}, {&kAdSamplerTriggerFeature, false}, {&kCaptureInlineJavascriptForGoogleAds, true}, {&kCaptureSafetyNetId, true}, @@ -84,6 +91,7 @@ {&kCommittedSBInterstitials, true}, {&kForceUseAPDownloadProtection, false}, {&kPasswordProtectionForSignedInUsers, true}, + {&kRealTimeUrlLookupFetchAllowlist, true}, {&kSuspiciousSiteTriggerQuotaFeature, true}, {&kThreatDomDetailsTagAndAttributeFeature, false}, {&kTriggerThrottlerDailyQuotaFeature, false},
diff --git a/components/safe_browsing/features.h b/components/safe_browsing/features.h index e9c8ba67..def545b 100644 --- a/components/safe_browsing/features.h +++ b/components/safe_browsing/features.h
@@ -19,6 +19,10 @@ namespace safe_browsing { // Features list +// Controls whether we send RIND reports when a popup originating from a Google +// ad is blocked. +extern const base::Feature kAdPopupTriggerFeature; + extern const base::Feature kAdSamplerTriggerFeature; // Controls whether we sample inline JavaScript for ads in RIND @@ -45,6 +49,10 @@ // Controls the daily quota for the suspicious site trigger. extern const base::Feature kSuspiciousSiteTriggerQuotaFeature; +// Controls whether the high confidence allowlist for real time URL lookup be +// fetched. +extern const base::Feature kRealTimeUrlLookupFetchAllowlist; + // Specifies which non-resource HTML Elements to collect based on their tag and // attributes. It's a single param containing a comma-separated list of pairs. // For example: "tag1,id,tag1,height,tag2,foo" - this will collect elements with
diff --git a/components/safe_browsing/proto/csd.proto b/components/safe_browsing/proto/csd.proto index 1dfe8e2..9e164c3 100644 --- a/components/safe_browsing/proto/csd.proto +++ b/components/safe_browsing/proto/csd.proto
@@ -1155,6 +1155,7 @@ URL_SUSPICIOUS = 15; BILLING = 16; APK_DOWNLOAD = 17; + BLOCKED_AD_POPUP = 20; } message HTTPHeader {
diff --git a/components/safe_browsing/realtime/BUILD.gn b/components/safe_browsing/realtime/BUILD.gn new file mode 100644 index 0000000..8b34808 --- /dev/null +++ b/components/safe_browsing/realtime/BUILD.gn
@@ -0,0 +1,16 @@ +# 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. + +static_library("policy_engine") { + sources = [ + "policy_engine.cc", + "policy_engine.h", + ] + + deps = [ + "//base:base", + "//components/safe_browsing:features", + "//components/safe_browsing:realtimeapi_proto", + ] +}
diff --git a/components/safe_browsing/realtime/policy_engine.cc b/components/safe_browsing/realtime/policy_engine.cc new file mode 100644 index 0000000..dd2c33d5 --- /dev/null +++ b/components/safe_browsing/realtime/policy_engine.cc
@@ -0,0 +1,17 @@ +// 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/safe_browsing/realtime/policy_engine.h" + +#include "base/feature_list.h" +#include "components/safe_browsing/features.h" + +namespace safe_browsing { + +// static +bool RealTimePolicyEngine::CanFetchAllowlist() { + return base::FeatureList::IsEnabled(kRealTimeUrlLookupFetchAllowlist); +} + +} // namespace safe_browsing
diff --git a/components/safe_browsing/realtime/policy_engine.h b/components/safe_browsing/realtime/policy_engine.h new file mode 100644 index 0000000..62c8b4ce --- /dev/null +++ b/components/safe_browsing/realtime/policy_engine.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 COMPONENTS_SAFE_BROWSING_REALTIME_POLICY_ENGINE_H_ +#define COMPONENTS_SAFE_BROWSING_REALTIME_POLICY_ENGINE_H_ + +namespace safe_browsing { + +// This class implements the logic to decide whether the real time lookup +// feature is enabled for a given user/profile. +class RealTimePolicyEngine { + private: + RealTimePolicyEngine() = delete; + ~RealTimePolicyEngine() = delete; + + public: + // Can the high confidence allowlist be sync'd? + static bool CanFetchAllowlist(); +}; // class RealTimePolicyEngine + +} // namespace safe_browsing + +#endif // COMPONENTS_SAFE_BROWSING_REALTIME_POLICY_ENGINE_H_
diff --git a/components/safe_browsing/triggers/BUILD.gn b/components/safe_browsing/triggers/BUILD.gn index 94e713b5..ea0d45ecb 100644 --- a/components/safe_browsing/triggers/BUILD.gn +++ b/components/safe_browsing/triggers/BUILD.gn
@@ -65,6 +65,21 @@ ] } +source_set("ad_popup_trigger") { + sources = [ + "ad_popup_trigger.cc", + "ad_popup_trigger.h", + ] + deps = [ + ":trigger_throttler", + ":trigger_util", + ":triggers", + "//base:base", + "//components/safe_browsing:features", + "//content/public/browser", + ] +} + source_set("suspicious_site_trigger") { sources = [ "suspicious_site_trigger.cc", @@ -85,6 +100,7 @@ source_set("unit_tests") { testonly = true sources = [ + "ad_popup_trigger_unittest.cc", "ad_sampler_trigger_unittest.cc", "mock_trigger_manager.cc", "mock_trigger_manager.h", @@ -93,6 +109,7 @@ "trigger_throttler_unittest.cc", ] deps = [ + ":ad_popup_trigger", ":ad_sampler_trigger", ":suspicious_site_trigger", ":trigger_throttler", @@ -102,6 +119,7 @@ "//components/prefs:test_support", "//components/safe_browsing:features", "//components/safe_browsing/browser:browser", + "//components/subresource_filter/content/browser:test_support", "//content/test:test_support", "//testing/gmock", "//testing/gtest",
diff --git a/components/safe_browsing/triggers/ad_popup_trigger.cc b/components/safe_browsing/triggers/ad_popup_trigger.cc new file mode 100644 index 0000000..df1f0b8 --- /dev/null +++ b/components/safe_browsing/triggers/ad_popup_trigger.cc
@@ -0,0 +1,148 @@ +// 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/safe_browsing/triggers/ad_popup_trigger.h" + +#include <string> + +#include "base/bind.h" +#include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" +#include "base/metrics/histogram_macros.h" +#include "base/rand_util.h" +#include "base/single_thread_task_runner.h" +#include "base/strings/string_number_conversions.h" +#include "base/task/post_task.h" +#include "components/safe_browsing/features.h" +#include "components/safe_browsing/triggers/trigger_manager.h" +#include "components/safe_browsing/triggers/trigger_throttler.h" +#include "components/safe_browsing/triggers/trigger_util.h" +#include "components/security_interstitials/content/unsafe_resource.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_handle.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/browser/web_contents.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" + +namespace safe_browsing { + +// Number of milliseconds to allow data collection to run before sending a +// report (since this trigger runs in the background). +const int64_t kAdPopupCollectionPeriodMilliseconds = 5000; + +// Range of number of milliseconds to wait after a page finished loading before +// starting a report. Allows ads which load in the background to finish loading. +const int64_t kMaxAdPopupCollectionStartDelayMilliseconds = 5000; +const int64_t kMinAdPopupCollectionStartDelayMilliseconds = 500; + +// Metric for tracking what the Ad Popup trigger does on each navigation. +const char kAdPopupTriggerActionMetricName[] = + "SafeBrowsing.Triggers.AdPopup.Action"; + +AdPopupTrigger::AdPopupTrigger( + content::WebContents* web_contents, + TriggerManager* trigger_manager, + PrefService* prefs, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + history::HistoryService* history_service) + : web_contents_(web_contents), + start_report_delay_ms_( + base::RandInt(kMinAdPopupCollectionStartDelayMilliseconds, + kMaxAdPopupCollectionStartDelayMilliseconds)), + finish_report_delay_ms_(kAdPopupCollectionPeriodMilliseconds), + trigger_manager_(trigger_manager), + prefs_(prefs), + url_loader_factory_(url_loader_factory), + history_service_(history_service), + task_runner_(base::CreateSingleThreadTaskRunnerWithTraits( + {content::BrowserThread::UI})), + weak_ptr_factory_(this) {} + +AdPopupTrigger::~AdPopupTrigger() {} + +// static +void AdPopupTrigger::CreateForWebContents( + content::WebContents* web_contents, + TriggerManager* trigger_manager, + PrefService* prefs, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + history::HistoryService* history_service) { + DCHECK(web_contents); + if (!FromWebContents(web_contents)) { + web_contents->SetUserData(UserDataKey(), + base::WrapUnique(new AdPopupTrigger( + web_contents, trigger_manager, prefs, + url_loader_factory, history_service))); + } +} + +void AdPopupTrigger::CreateAdPopupReport() { + SBErrorOptions error_options = + TriggerManager::GetSBErrorDisplayOptions(*prefs_, web_contents_); + security_interstitials::UnsafeResource resource; + resource.threat_type = SB_THREAT_TYPE_BLOCKED_AD_POPUP; + resource.url = web_contents_->GetURL(); + resource.web_contents_getter = resource.GetWebContentsGetter( + web_contents_->GetMainFrame()->GetProcess()->GetID(), + web_contents_->GetMainFrame()->GetRoutingID()); + TriggerManagerReason reason; + if (!trigger_manager_->StartCollectingThreatDetailsWithReason( + TriggerType::AD_POPUP, web_contents_, resource, url_loader_factory_, + history_service_, error_options, &reason)) { + if (reason == TriggerManagerReason::DAILY_QUOTA_EXCEEDED) { + UMA_HISTOGRAM_ENUMERATION( + kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_DAILY_QUOTA_EXCEEDED); + } else { + UMA_HISTOGRAM_ENUMERATION( + kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_COULD_NOT_START_REPORT); + } + return; + } + // Call into TriggerManager to finish the reports after a short delay. Any + // ads that are detected during this delay will be rejected by TriggerManager + // because a report is already being collected, so we won't send multiple + // reports for the same page. + task_runner_->PostDelayedTask( + FROM_HERE, + base::BindOnce( + IgnoreResult(&TriggerManager::FinishCollectingThreatDetails), + base::Unretained(trigger_manager_), TriggerType::AD_POPUP, + base::Unretained(web_contents_), base::TimeDelta(), + /*did_proceed=*/false, /*num_visits=*/0, error_options), + base::TimeDelta::FromMilliseconds(finish_report_delay_ms_)); + + UMA_HISTOGRAM_ENUMERATION(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_REPORTED); +} + +void AdPopupTrigger::PopupWasBlocked(content::RenderFrameHost* render_frame) { + UMA_HISTOGRAM_ENUMERATION(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_CHECK); + if (!DetectGoogleAd(render_frame, web_contents_->GetURL())) { + UMA_HISTOGRAM_ENUMERATION(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_NO_GOOGLE_AD); + return; + } + // Create a report after a short delay. The delay gives more time for ads to + // finish loading in the background. This is best-effort. + task_runner_->PostDelayedTask( + FROM_HERE, + base::BindOnce(&AdPopupTrigger::CreateAdPopupReport, + weak_ptr_factory_.GetWeakPtr()), + base::TimeDelta::FromMilliseconds(start_report_delay_ms_)); +} + +void AdPopupTrigger::SetTaskRunnerForTest( + scoped_refptr<base::SingleThreadTaskRunner> task_runner) { + task_runner_ = task_runner; +} + +WEB_CONTENTS_USER_DATA_KEY_IMPL(AdPopupTrigger) + +} // namespace safe_browsing
diff --git a/components/safe_browsing/triggers/ad_popup_trigger.h b/components/safe_browsing/triggers/ad_popup_trigger.h new file mode 100644 index 0000000..8523323 --- /dev/null +++ b/components/safe_browsing/triggers/ad_popup_trigger.h
@@ -0,0 +1,111 @@ +// 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_SAFE_BROWSING_TRIGGERS_AD_POPUP_TRIGGER_H_ +#define COMPONENTS_SAFE_BROWSING_TRIGGERS_AD_POPUP_TRIGGER_H_ + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "content/public/browser/web_contents_user_data.h" + +class PrefService; + +namespace history { +class HistoryService; +} + +namespace network { +class SharedURLLoaderFactory; +} // namespace network + +namespace safe_browsing { +class TriggerManager; + +// Metric for tracking what the Ad Popup trigger does on each navigation. +extern const char kAdPopupTriggerActionMetricName[]; + +enum class AdPopupTriggerAction { + // An event occurred that caused the trigger to perform its checks. + POPUP_CHECK = 0, + // A popup cause by an ad was detected and a report was collected. + POPUP_REPORTED = 1, + // No ad was detected. + POPUP_NO_GOOGLE_AD = 2, + // An ad was detected on the page causing a popup and could have been + // reported, but the trigger manager rejected the report (eg: because user is + // incognito or has not opted into extended reporting). + POPUP_COULD_NOT_START_REPORT = 3, + // Daily quota for ads that caused blocked popups was met. + POPUP_DAILY_QUOTA_EXCEEDED = 4, + // New events must be added before kMaxValue, and the value of kMaxValue + // updated. + kMaxValue = POPUP_DAILY_QUOTA_EXCEEDED +}; + +// This class is notified when a popup caused by an ad in the browser is +// blocked. If the Ad is a Google Ad, this class sends a report to Google. +// Design doc: go/extending-chrind-q2-2019-1 +class AdPopupTrigger : public content::WebContentsUserData<AdPopupTrigger> { + public: + ~AdPopupTrigger() override; + + static void CreateForWebContents( + content::WebContents* web_contents, + TriggerManager* trigger_manager, + PrefService* prefs, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + history::HistoryService* history_service); + + void PopupWasBlocked(content::RenderFrameHost* render_frame); + + private: + friend class AdPopupTriggerTest; + friend class content::WebContentsUserData<AdPopupTrigger>; + + AdPopupTrigger( + content::WebContents* web_contents, + TriggerManager* trigger_manager, + PrefService* prefs, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + history::HistoryService* history_service); + + // Called to create an ad popup report. + void CreateAdPopupReport(); + + // Sets a task runner to use for tests. + void SetTaskRunnerForTest( + scoped_refptr<base::SingleThreadTaskRunner> task_runner); + + // WebContents of the current tab. + content::WebContents* web_contents_; + + // The delay (in milliseconds) to wait before starting a report. Can be + // ovewritten for tests. + int64_t start_report_delay_ms_; + + // The delay (in milliseconds) to wait before finishing a report. Can be + // overwritten for tests. + int64_t finish_report_delay_ms_; + + // TriggerManager gets called if this trigger detects apopup caused by ad and + // wants to collect some data about it. Not owned. + TriggerManager* trigger_manager_; + + PrefService* prefs_; + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; + history::HistoryService* history_service_; + + // Task runner for posting delayed tasks. Normally set to the runner for the + // UI thread, but can be overwritten for tests. + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + + base::WeakPtrFactory<AdPopupTrigger> weak_ptr_factory_; + WEB_CONTENTS_USER_DATA_KEY_DECL(); + + DISALLOW_COPY_AND_ASSIGN(AdPopupTrigger); +}; + +} // namespace safe_browsing + +#endif // COMPONENTS_SAFE_BROWSING_TRIGGERS_AD_POPUP_TRIGGER_H_
diff --git a/components/safe_browsing/triggers/ad_popup_trigger_unittest.cc b/components/safe_browsing/triggers/ad_popup_trigger_unittest.cc new file mode 100644 index 0000000..c654921 --- /dev/null +++ b/components/safe_browsing/triggers/ad_popup_trigger_unittest.cc
@@ -0,0 +1,211 @@ +// 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/safe_browsing/triggers/ad_popup_trigger.h" + +#include "base/metrics/field_trial_params.h" +#include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/test_simple_task_runner.h" +#include "components/prefs/testing_pref_service.h" +#include "components/safe_browsing/features.h" +#include "components/safe_browsing/triggers/mock_trigger_manager.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/navigation_simulator.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "content/public/test/test_renderer_host.h" +#include "testing/gmock/include/gmock/gmock-generated-function-mockers.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using content::NavigationSimulator; +using content::RenderFrameHost; +using content::RenderFrameHostTester; + +using testing::_; +using testing::Return; + +namespace safe_browsing { + +namespace { +const char kAdUrl[] = "https://tpc.googlesyndication.com/safeframe/1"; +const char kNonAdUrl[] = "https://foo.com/"; +const char kAdName[] = "google_ads_iframe_1"; +const char kNonAdName[] = "foo"; +} // namespace + +class AdPopupTriggerTest : public content::RenderViewHostTestHarness { + public: + AdPopupTriggerTest() : task_runner_(new base::TestSimpleTaskRunner) {} + ~AdPopupTriggerTest() override {} + + void SetUp() override { + content::RenderViewHostTestHarness::SetUp(); + + // Enable any prefs required for the trigger to run. + safe_browsing::RegisterProfilePrefs(prefs_.registry()); + prefs_.SetBoolean(prefs::kSafeBrowsingExtendedReportingOptInAllowed, true); + prefs_.SetBoolean(prefs::kSafeBrowsingScoutReportingEnabled, true); + } + + void CreateTrigger() { + safe_browsing::AdPopupTrigger::CreateForWebContents( + web_contents(), &trigger_manager_, &prefs_, nullptr, nullptr); + + safe_browsing::AdPopupTrigger* ad_popup_trigger = + safe_browsing::AdPopupTrigger::FromWebContents(web_contents()); + + // Give the trigger a test task runner that we can synchronize on. + ad_popup_trigger->SetTaskRunnerForTest(task_runner_); + } + + // Returns the final RenderFrameHost after navigation commits. + RenderFrameHost* NavigateFrame(const std::string& url, + RenderFrameHost* frame) { + GURL gurl(url); + auto navigation_simulator = + NavigationSimulator::CreateRendererInitiated(gurl, frame); + navigation_simulator->Commit(); + return navigation_simulator->GetFinalRenderFrameHost(); + } + + // Returns the final RenderFrameHost after navigation commits. + RenderFrameHost* NavigateMainFrame(const std::string& url) { + return NavigateFrame(url, web_contents()->GetMainFrame()); + } + + // Returns the final RenderFrameHost after navigation commits. + RenderFrameHost* CreateAndNavigatePopup(const std::string& url, + const std::string& frame_name, + RenderFrameHost* parent) { + RenderFrameHost* popup_opener_frame = + RenderFrameHostTester::For(parent)->AppendChild(frame_name); + RenderFrameHost* final_frame_host = NavigateFrame(url, popup_opener_frame); + // Call the trigger's PopupWasBlocked event handler directly since it + // doesn't happen as part of the navigation. This should check if the frame + // opening the popup is an ad. + safe_browsing::AdPopupTrigger::FromWebContents(web_contents()) + ->PopupWasBlocked(final_frame_host); + return final_frame_host; + } + + void WaitForTaskRunnerIdle() { + task_runner_->RunUntilIdle(); + base::RunLoop().RunUntilIdle(); + } + + MockTriggerManager* get_trigger_manager() { return &trigger_manager_; } + base::HistogramTester* get_histograms() { return &histograms_; } + + private: + TestingPrefServiceSimple prefs_; + MockTriggerManager trigger_manager_; + base::HistogramTester histograms_; + scoped_refptr<base::TestSimpleTaskRunner> task_runner_; +}; + +TEST_F(AdPopupTriggerTest, PopupWithAds) { + // Make sure the trigger fires when there are ads on the page. + CreateTrigger(); + EXPECT_CALL(*get_trigger_manager(), + StartCollectingThreatDetailsWithReason( + TriggerType::AD_POPUP, web_contents(), _, _, _, _, _)) + .Times(1) + .WillRepeatedly(Return(true)); + EXPECT_CALL(*get_trigger_manager(), + FinishCollectingThreatDetails(TriggerType::AD_POPUP, + web_contents(), _, _, _, _)) + .Times(1); + + // This page contains two popups - one originating from an ad subframe and one + // from a non ad subframe. + RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); + CreateAndNavigatePopup(kNonAdUrl, kNonAdName, main_frame); + CreateAndNavigatePopup(kNonAdUrl, kAdName, main_frame); + + // Wait for any posted tasks to finish. + WaitForTaskRunnerIdle(); + + // Two popup navigations, one will cause a report + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_CHECK, 2); + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_REPORTED, 1); + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_NO_GOOGLE_AD, + 1); +} + +TEST_F(AdPopupTriggerTest, ReportRejectedByTriggerManager) { + // If the trigger manager rejects the report, we don't try to finish/send the + // report. + CreateTrigger(); + EXPECT_CALL(*get_trigger_manager(), + StartCollectingThreatDetailsWithReason(_, _, _, _, _, _, _)) + .Times(2); + EXPECT_CALL(*get_trigger_manager(), + FinishCollectingThreatDetails(_, _, _, _, _, _)) + .Times(0); + + RenderFrameHost* main_frame = NavigateMainFrame(kAdUrl); + CreateAndNavigatePopup(kAdUrl, kAdName, main_frame); + CreateAndNavigatePopup(kNonAdUrl, kAdName, main_frame); + + WaitForTaskRunnerIdle(); + + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_CHECK, 2); + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_REPORTED, 0); + get_histograms()->ExpectBucketCount( + kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_COULD_NOT_START_REPORT, 2); +} + +TEST_F(AdPopupTriggerTest, PopupWithNoAds) { + // Make sure the trigger doesn't fire when there are no ads on the page. + CreateTrigger(); + EXPECT_CALL(*get_trigger_manager(), + StartCollectingThreatDetailsWithReason(_, _, _, _, _, _, _)) + .Times(0); + EXPECT_CALL(*get_trigger_manager(), + FinishCollectingThreatDetails(_, _, _, _, _, _)) + .Times(0); + + RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); + CreateAndNavigatePopup(kNonAdUrl, kNonAdName, main_frame); + CreateAndNavigatePopup(kNonAdUrl, kNonAdName, main_frame); + + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_CHECK, 2); + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_NO_GOOGLE_AD, + 2); +} + +TEST_F(AdPopupTriggerTest, PopupNotFromAdForPageWithAd) { + // Make sure that no report is generated when there is an ad on the page but + // the popup is caused from a different frame. + CreateTrigger(); + EXPECT_CALL(*get_trigger_manager(), + StartCollectingThreatDetailsWithReason(_, _, _, _, _, _, _)) + .Times(0); + EXPECT_CALL(*get_trigger_manager(), + FinishCollectingThreatDetails(_, _, _, _, _, _)) + .Times(0); + + RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); + RenderFrameHostTester::For(main_frame)->AppendChild(kAdName); + CreateAndNavigatePopup(kNonAdUrl, kNonAdName, main_frame); + + // Two navigations (main frame, one subframe), each with no ad. + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_CHECK, 1); + get_histograms()->ExpectBucketCount(kAdPopupTriggerActionMetricName, + AdPopupTriggerAction::POPUP_NO_GOOGLE_AD, + 1); +} + +} // namespace safe_browsing
diff --git a/components/safe_browsing/triggers/trigger_manager.cc b/components/safe_browsing/triggers/trigger_manager.cc index ee7457a..9158ec9 100644 --- a/components/safe_browsing/triggers/trigger_manager.cc +++ b/components/safe_browsing/triggers/trigger_manager.cc
@@ -26,6 +26,7 @@ // For security interstitials, users can change the opt-in while the // trigger runs, so collection can begin without opt-in. return false; + case TriggerType::AD_POPUP: case TriggerType::AD_SAMPLE: // Ad samples happen in the background so the user must already be opted // in before the trigger is allowed to run. @@ -111,7 +112,6 @@ bool optin_required_check_ok = !TriggerNeedsOptInForCollection(trigger_type) || error_display_options.is_extended_reporting_enabled; - // We start data collection as long as user is not incognito and is able to // change the Extended Reporting opt-in, and the |trigger_type| has available // quota. For some triggers we also require extended reporting opt-in in @@ -128,6 +128,7 @@ return false; } } + bool TriggerManager::StartCollectingThreatDetails( const TriggerType trigger_type, content::WebContents* web_contents, @@ -160,7 +161,8 @@ if (collectors->threat_details != nullptr) return false; - bool should_trim_threat_details = trigger_type == TriggerType::AD_SAMPLE; + bool should_trim_threat_details = (trigger_type == TriggerType::AD_POPUP || + trigger_type == TriggerType::AD_SAMPLE); collectors->threat_details = ThreatDetails::NewThreatDetails( ui_manager_, web_contents, resource, url_loader_factory, history_service, referrer_chain_provider_, should_trim_threat_details,
diff --git a/components/safe_browsing/triggers/trigger_throttler.cc b/components/safe_browsing/triggers/trigger_throttler.cc index 13777d7c..f8f4ed08a 100644 --- a/components/safe_browsing/triggers/trigger_throttler.cc +++ b/components/safe_browsing/triggers/trigger_throttler.cc
@@ -15,8 +15,10 @@ #include "components/safe_browsing/features.h" namespace safe_browsing { +const size_t kAdPopupTriggerDefaultQuota = 1; const size_t kAdSamplerTriggerDefaultQuota = 10; const size_t kSuspiciousSiteTriggerDefaultQuota = 5; +const char kAdPopupTriggerQuotaParam[] = "ad_popup_trigger_quota"; const char kSuspiciousSiteTriggerQuotaParam[] = "suspicious_site_trigger_quota"; const char kTriggerTypeAndQuotaParam[] = "trigger_type_and_quota_csv"; @@ -50,6 +52,14 @@ std::make_pair(TriggerType::SUSPICIOUS_SITE, suspicious_site_quota)); } + int ad_popup_quota = base::GetFieldTrialParamByFeatureAsInt( + kAdPopupTriggerFeature, kAdPopupTriggerQuotaParam, + kAdPopupTriggerDefaultQuota); + if (ad_popup_quota > 0) { + trigger_type_and_quota_list->push_back( + std::make_pair(TriggerType::AD_POPUP, ad_popup_quota)); + } + // If the feature is disabled we just use the default list. Otherwise the list // from the Finch param will be the one used. if (!base::FeatureList::IsEnabled(kTriggerThrottlerDailyQuotaFeature)) { @@ -247,6 +257,13 @@ case TriggerType::GAIA_PASSWORD_REUSE: case TriggerType::APK_DOWNLOAD: return kUnlimitedTriggerQuota; + case TriggerType::AD_POPUP: + // Ad Popup reports are disabled unless they are configured through Finch. + if (TryFindQuotaForTrigger(trigger_type, trigger_type_and_quota_list_, + "a_from_finch)) { + return quota_from_finch; + } + break; case TriggerType::AD_SAMPLE: // Ad Samples have a non-zero default quota, but it can be overwritten // through Finch.
diff --git a/components/safe_browsing/triggers/trigger_throttler.h b/components/safe_browsing/triggers/trigger_throttler.h index 10cbcf6..0d8621b 100644 --- a/components/safe_browsing/triggers/trigger_throttler.h +++ b/components/safe_browsing/triggers/trigger_throttler.h
@@ -40,8 +40,9 @@ GAIA_PASSWORD_REUSE = 3, SUSPICIOUS_SITE = 4, APK_DOWNLOAD = 5, + AD_POPUP = 6, kMinTriggerType = SECURITY_INTERSTITIAL, - kMaxTriggerType = APK_DOWNLOAD, + kMaxTriggerType = AD_POPUP, }; struct TriggerTypeHash {
diff --git a/components/security_interstitials/content/unsafe_resource.cc b/components/security_interstitials/content/unsafe_resource.cc index f9ed7717..ae046912 100644 --- a/components/security_interstitials/content/unsafe_resource.cc +++ b/components/security_interstitials/content/unsafe_resource.cc
@@ -45,6 +45,8 @@ // frame load, since they happen after the page is finished loading. case safe_browsing::SB_THREAT_TYPE_URL_CLIENT_SIDE_PHISHING: case safe_browsing::SB_THREAT_TYPE_URL_CLIENT_SIDE_MALWARE: + // Malicious ad activity reporting happens in the background. + case safe_browsing::SB_THREAT_TYPE_BLOCKED_AD_POPUP: // Ad sampling happens in the background. case safe_browsing::SB_THREAT_TYPE_AD_SAMPLE: // Sign-in password reuse warning happens after the page is finished
diff --git a/components/services/quarantine/BUILD.gn b/components/services/quarantine/BUILD.gn index 995cf2a..15d15dd 100644 --- a/components/services/quarantine/BUILD.gn +++ b/components/services/quarantine/BUILD.gn
@@ -94,6 +94,7 @@ sources = [ "quarantine_mac_unittest.mm", + "quarantine_service_unittest.cc", "quarantine_win_unittest.cc", ] @@ -111,7 +112,11 @@ ":test_support", "//base", "//base/test:test_support", + "//components/services/quarantine/public/mojom", "//net", + "//services/service_manager/public/cpp:cpp", + "//services/service_manager/public/cpp/test:test_support", + "//testing/gmock", "//testing/gtest", "//url", ]
diff --git a/components/services/quarantine/public/mojom/quarantine.mojom b/components/services/quarantine/public/mojom/quarantine.mojom index b0c61e0..a852bde 100644 --- a/components/services/quarantine/public/mojom/quarantine.mojom +++ b/components/services/quarantine/public/mojom/quarantine.mojom
@@ -4,11 +4,33 @@ module quarantine.mojom; +import "mojo/public/mojom/base/file_path.mojom"; +import "url/mojom/url.mojom"; + const string kServiceName = "quarantine"; const string kQuarantineFileCapability = "quarantine_file"; -// The Quarantine interface will define a QuarantineFile -// method to be called when a file should be annotated with Mark-Of-The-Web. -// The implementation will be moved from components/download/quarantine. +enum QuarantineFileResult { + OK, // Success. + ACCESS_DENIED, // Access to the file was denied. The safety of the file + // could not be determined. + BLOCKED_BY_POLICY, // Downloads from the source url are not allowed by + // policy. The file has been deleted. + ANNOTATION_FAILED, // Unable to write the mark-of-the-web or otherwise + // annotate the file as being downloaded from + // the source url. + FILE_MISSING, // The file does not name a valid file. + SECURITY_CHECK_FAILED, // An unknown error occurred while checking the file. + // The file may have been deleted. + VIRUS_INFECTED // The file was found to be infected by a virus and was + // deleted. +}; + interface Quarantine { + + QuarantineFile(mojo_base.mojom.FilePath full_path, + url.mojom.Url source_url, + url.mojom.Url referrer_url, + string client_guid) + => (QuarantineFileResult result); };
diff --git a/components/services/quarantine/quarantine.h b/components/services/quarantine/quarantine.h index 18fd1db8..7ec0eac 100644 --- a/components/services/quarantine/quarantine.h +++ b/components/services/quarantine/quarantine.h
@@ -7,6 +7,9 @@ #include <string> +#include "build/build_config.h" +#include "components/services/quarantine/public/mojom/quarantine.mojom.h" + class GURL; namespace base { @@ -15,21 +18,7 @@ namespace quarantine { -// Return value for QuarantineFile. -enum class QuarantineFileResult { - OK, // Success. - ACCESS_DENIED, // Access to the file was denied. The safety of the file could - // not be determined. - BLOCKED_BY_POLICY, // Downloads from |source_url| are not allowed by policy. - // The file has been deleted. - ANNOTATION_FAILED, // Unable to write the mark-of-the-web or otherwise - // annotate the file as being downloaded from - // |source_url|. - FILE_MISSING, // |file| does not name a valid file. - SECURITY_CHECK_FAILED, // An unknown error occurred while checking |file|. - // The file may have been deleted. - VIRUS_INFECTED // |file| was found to be infected by a virus and was deleted. -}; +using mojom::QuarantineFileResult; // Quarantine a file that was downloaded from the internet. // @@ -76,6 +65,13 @@ const GURL& referrer_url, const std::string& client_guid); +#if defined(OS_WIN) +QuarantineFileResult SetInternetZoneIdentifierDirectly( + const base::FilePath& full_path, + const GURL& source_url, + const GURL& referrer_url); +#endif + } // namespace quarantine #endif // COMPONENTS_SERVICES_QUARANTINE_QUARANTINE_H_
diff --git a/components/services/quarantine/quarantine_impl.cc b/components/services/quarantine/quarantine_impl.cc index d807fef..ffe9c2f 100644 --- a/components/services/quarantine/quarantine_impl.cc +++ b/components/services/quarantine/quarantine_impl.cc
@@ -3,7 +3,18 @@ // found in the LICENSE file. #include "components/services/quarantine/quarantine_impl.h" + +#include "base/bind.h" #include "base/files/file_util.h" +#include "base/task/post_task.h" +#include "base/task_runner_util.h" +#include "build/build_config.h" +#include "components/services/quarantine/quarantine.h" + +#if defined(OS_WIN) +#include "base/win/scoped_com_initializer.h" +#include "components/services/quarantine/public/cpp/quarantine_features_win.h" +#endif // OS_WIN namespace quarantine { @@ -13,4 +24,48 @@ QuarantineImpl::~QuarantineImpl() = default; +namespace { + +#if defined(OS_WIN) +scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() { + return base::CreateCOMSTATaskRunnerWithTraits( + {base::MayBlock(), base::TaskPriority::USER_VISIBLE}); +} +#else // OS_WIN +scoped_refptr<base::TaskRunner> GetTaskRunner() { + return base::CreateTaskRunnerWithTraits( + {base::MayBlock(), base::TaskPriority::USER_VISIBLE}); +} +#endif // OS_WIN + +} // namespace + +void QuarantineImpl::QuarantineFile( + const base::FilePath& full_path, + const GURL& source_url, + const GURL& referrer_url, + const std::string& client_guid, + mojom::Quarantine::QuarantineFileCallback callback) { +#if defined(OS_WIN) + if (base::FeatureList::IsEnabled(quarantine::kOutOfProcessQuarantine)) { + // In out of process case, we are running in a utility process, + // so directly call QuarantineFile and send the result. + base::win::ScopedCOMInitializer com_initializer; + + QuarantineFileResult result = quarantine::QuarantineFile( + full_path, source_url, referrer_url, client_guid); + + std::move(callback).Run(result); + return; + } +#endif // OS_WIN + // For in-proc case, or non-Windows platforms, we are running in the browser + // process, so post a task to do the potentially blocking quarantine work. + base::PostTaskAndReplyWithResult( + GetTaskRunner().get(), FROM_HERE, + base::BindOnce(&quarantine::QuarantineFile, full_path, source_url, + referrer_url, client_guid), + std::move(callback)); +} + } // namespace quarantine
diff --git a/components/services/quarantine/quarantine_impl.h b/components/services/quarantine/quarantine_impl.h index 21e1df3..a742454 100644 --- a/components/services/quarantine/quarantine_impl.h +++ b/components/services/quarantine/quarantine_impl.h
@@ -18,6 +18,14 @@ std::unique_ptr<service_manager::ServiceContextRef> service_ref); ~QuarantineImpl() override; + // mojom::Quarantine: + void QuarantineFile( + const base::FilePath& full_path, + const GURL& source_url, + const GURL& referrer_url, + const std::string& client_guid, + mojom::Quarantine::QuarantineFileCallback callback) override; + private: const std::unique_ptr<service_manager::ServiceContextRef> service_ref_; };
diff --git a/components/services/quarantine/quarantine_service_unittest.cc b/components/services/quarantine/quarantine_service_unittest.cc new file mode 100644 index 0000000..c14d33b --- /dev/null +++ b/components/services/quarantine/quarantine_service_unittest.cc
@@ -0,0 +1,84 @@ +// 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 <memory> +#include <utility> + +#include "base/bind.h" +#include "base/callback.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" +#include "components/services/quarantine/public/mojom/quarantine.mojom.h" +#include "components/services/quarantine/quarantine_service.h" +#include "services/service_manager/public/cpp/test/test_connector_factory.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace quarantine { + +const char kTestData[] = "It's okay to have a trailing nul."; +const char kInternetURL[] = "http://example.com/some-url"; +const char kInternetReferrerURL[] = "http://example.com/some-other-url"; + +class QuarantineServiceTest : public testing::Test { + public: + QuarantineServiceTest() + : connector_(test_connector_factory_.CreateConnector()), + service_( + test_connector_factory_.RegisterInstance(mojom::kServiceName)) {} + + ~QuarantineServiceTest() override = default; + + void OnFileQuarantined(const base::FilePath& test_file, + base::OnceClosure quit_closure, + mojom::QuarantineFileResult result) { + base::DeleteFile(test_file, false); + result_ = result; + std::move(quit_closure).Run(); + } + + protected: + service_manager::Connector* connector() { return connector_.get(); } + void SetUp() override { + ASSERT_FALSE(quarantine_); + connector()->BindInterface(mojom::kServiceName, &quarantine_); + ASSERT_TRUE(quarantine_); + } + + void TearDown() override { quarantine_.reset(); } + + base::test::ScopedTaskEnvironment task_environment_; + mojom::QuarantinePtr quarantine_; + mojom::QuarantineFileResult result_; + + private: + service_manager::TestConnectorFactory test_connector_factory_; + std::unique_ptr<service_manager::Connector> connector_; + QuarantineService service_; + DISALLOW_COPY_AND_ASSIGN(QuarantineServiceTest); +}; + +TEST_F(QuarantineServiceTest, QuarantineFile) { + base::ScopedTempDir test_dir; + ASSERT_TRUE(test_dir.CreateUniqueTempDir()); + + base::FilePath test_file = test_dir.GetPath().AppendASCII("foo.class"); + ASSERT_EQ(static_cast<int>(base::size(kTestData)), + base::WriteFile(test_file, kTestData, base::size(kTestData))); + + base::RunLoop run_loop; + + quarantine_->QuarantineFile( + test_file, GURL(kInternetURL), GURL(kInternetReferrerURL), std::string(), + base::BindOnce(&QuarantineServiceTest::OnFileQuarantined, + base::Unretained(this), test_file, + run_loop.QuitClosure())); + run_loop.Run(); + EXPECT_EQ(result_, mojom::QuarantineFileResult::OK); +} + +} // namespace quarantine
diff --git a/components/services/quarantine/quarantine_win.cc b/components/services/quarantine/quarantine_win.cc index d3201eb81..adc0c82 100644 --- a/components/services/quarantine/quarantine_win.cc +++ b/components/services/quarantine/quarantine_win.cc
@@ -43,55 +43,6 @@ return url.is_valid() && url.spec().size() <= INTERNET_MAX_URL_LENGTH; } -// Sets the Zone Identifier on the file to "Internet" (3). Returns true if the -// function succeeds, false otherwise. A failure is expected if alternate -// streams are not supported, like a file on a FAT32 filesystem. This function -// does not invoke Windows Attachment Execution Services. -// -// On Windows 10 or higher, the ReferrerUrl and HostUrl values are set according -// to the behavior of the IAttachmentExecute interface. -// -// |full_path| is the path to the downloaded file. -QuarantineFileResult SetInternetZoneIdentifierDirectly( - const base::FilePath& full_path, - const GURL& source_url, - const GURL& referrer_url) { - const DWORD kShare = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; - std::wstring path = full_path.value() + kZoneIdentifierStreamSuffix; - base::win::ScopedHandle file(::CreateFile(path.c_str(), GENERIC_WRITE, kShare, - nullptr, OPEN_ALWAYS, - FILE_ATTRIBUTE_NORMAL, nullptr)); - if (!file.IsValid()) - return QuarantineFileResult::ANNOTATION_FAILED; - - static const char kReferrerUrlFormat[] = "ReferrerUrl=%s\r\n"; - static const char kHostUrlFormat[] = "HostUrl=%s\r\n"; - - std::string identifier = "[ZoneTransfer]\r\nZoneId=3\r\n"; - if (base::win::GetVersion() >= base::win::Version::WIN10) { - // Match what the InvokeAttachmentServices() function will output, including - // the order of the values. - if (IsValidUrlForAttachmentServices(referrer_url)) { - identifier.append( - base::StringPrintf(kReferrerUrlFormat, referrer_url.spec().c_str())); - } - identifier.append(base::StringPrintf( - kHostUrlFormat, IsValidUrlForAttachmentServices(source_url) - ? source_url.spec().c_str() - : "about:internet")); - } - - // Don't include trailing null in data written. - DWORD written = 0; - BOOL write_result = ::WriteFile(file.Get(), identifier.c_str(), - identifier.length(), &written, nullptr); - BOOL flush_result = FlushFileBuffers(file.Get()); - - return write_result && flush_result && written == identifier.length() - ? QuarantineFileResult::OK - : QuarantineFileResult::ANNOTATION_FAILED; -} - // Maps a return code from an unsuccessful IAttachmentExecute::Save() call to a // QuarantineFileResult. // @@ -228,6 +179,55 @@ } // namespace +// Sets the Zone Identifier on the file to "Internet" (3). Returns true if the +// function succeeds, false otherwise. A failure is expected if alternate +// streams are not supported, like a file on a FAT32 filesystem. This function +// does not invoke Windows Attachment Execution Services. +// +// On Windows 10 or higher, the ReferrerUrl and HostUrl values are set according +// to the behavior of the IAttachmentExecute interface. +// +// |full_path| is the path to the downloaded file. +QuarantineFileResult SetInternetZoneIdentifierDirectly( + const base::FilePath& full_path, + const GURL& source_url, + const GURL& referrer_url) { + const DWORD kShare = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; + std::wstring path = full_path.value() + kZoneIdentifierStreamSuffix; + base::win::ScopedHandle file(::CreateFile(path.c_str(), GENERIC_WRITE, kShare, + nullptr, OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, nullptr)); + if (!file.IsValid()) + return QuarantineFileResult::ANNOTATION_FAILED; + + static const char kReferrerUrlFormat[] = "ReferrerUrl=%s\r\n"; + static const char kHostUrlFormat[] = "HostUrl=%s\r\n"; + + std::string identifier = "[ZoneTransfer]\r\nZoneId=3\r\n"; + if (base::win::GetVersion() >= base::win::Version::WIN10) { + // Match what the InvokeAttachmentServices() function will output, including + // the order of the values. + if (IsValidUrlForAttachmentServices(referrer_url)) { + identifier.append( + base::StringPrintf(kReferrerUrlFormat, referrer_url.spec().c_str())); + } + identifier.append(base::StringPrintf( + kHostUrlFormat, IsValidUrlForAttachmentServices(source_url) + ? source_url.spec().c_str() + : "about:internet")); + } + + // Don't include trailing null in data written. + DWORD written = 0; + BOOL write_result = ::WriteFile(file.Get(), identifier.c_str(), + identifier.length(), &written, nullptr); + BOOL flush_result = FlushFileBuffers(file.Get()); + + return write_result && flush_result && written == identifier.length() + ? QuarantineFileResult::OK + : QuarantineFileResult::ANNOTATION_FAILED; +} + QuarantineFileResult QuarantineFile(const base::FilePath& file, const GURL& source_url, const GURL& referrer_url,
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 0d88430..3786e0c7 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -1149,6 +1149,7 @@ <translation id="7334320624316649418">&ማስተካከልን ድገም</translation> <translation id="733923710415886693">የአገልጋዩ የእውቅና ማረጋገጫ በእውቅና ማረጋገጫ ግልጽነት በኩል አልተገለጸም።</translation> <translation id="734600844861828519">11x15</translation> +<translation id="7346048084945669753">ከዚህ ጋር ግንኙነት አለው፦</translation> <translation id="7349430561505560861">A4-ተጨማሪ</translation> <translation id="7353601530677266744">የትእዛዝ መስመር</translation> <translation id="7372973238305370288">የፍለጋ ውጤት</translation> @@ -1181,6 +1182,7 @@ <translation id="7451311239929941790">ስለዚህ ችግር <ph name="BEGIN_LINK" />ይበልጥ በመረዳት ላይ<ph name="END_LINK" />።</translation> <translation id="7455133967321480974">ሁለንተናዊ ነባሪውን ተጠቀም (አግድ)</translation> <translation id="7460618730930299168">ማያ ገጹ አቀራረብ እርስዎ ከመረጡት የተለየ ነው። ይቀጥል?</translation> +<translation id="7465410862124366659">ይህ ገጽ በ<ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />] ባለቤትነት እንደተያዘ ተለይቷል።</translation> <translation id="7473891865547856676">አይ፣ አመሰግናለሁ</translation> <translation id="7481312909269577407">ወደ ፊት</translation> <translation id="7485870689360869515">ምንም ውሂብ አልተገኘም።</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 5ec3272..ef823e15 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -1159,6 +1159,7 @@ <translation id="7334320624316649418">&Gawing muli ang pagbabago sa ayos</translation> <translation id="733923710415886693">Ang certificate ng server ay hindi inihayag sa pamamagitan ng Transparency ng Certificate.</translation> <translation id="734600844861828519">11x15</translation> +<translation id="7346048084945669753">Naka-affiliate:</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Command Line</translation> <translation id="7372973238305370288">resulta ng paghahanap</translation> @@ -1191,6 +1192,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /> tungkol sa problemang ito.</translation> <translation id="7455133967321480974">Gamitin ang pangkalahatang default (I-block)</translation> <translation id="7460618730930299168">Iba ang screening sa napili mo. Magpatuloy?</translation> +<translation id="7465410862124366659">Natukoy ang page na ito bilang pagmamay-ari ng <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />].</translation> <translation id="7473891865547856676">Hindi, Salamat</translation> <translation id="7481312909269577407">Sumulong</translation> <translation id="7485870689360869515">Walang nahanap na data.</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 64c19ee6..1744872 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -1351,7 +1351,7 @@ <translation id="8281084378435768645">बड़े आकार वाली फ़ोटो</translation> <translation id="8286036467436129157">साइन इन करें</translation> <translation id="8288807391153049143">प्रमाणपत्र दिखाएं</translation> -<translation id="8289355894181816810">अगर आप सुनिश्चित नहीं हैं कि इसका क्या मतलब है, तो अपने नेटवर्क व्यवस्थापक से संपर्क करें.</translation> +<translation id="8289355894181816810">अगर आप पक्का नहीं हैं कि इसका क्या मतलब है, तो अपने नेटवर्क व्यवस्थापक से संपर्क करें.</translation> <translation id="8293206222192510085">बुकमार्क जोड़ें</translation> <translation id="8294431847097064396">स्रोत</translation> <translation id="8298115750975731693">आप जिस वाई-फ़ाई का उपयोग कर रहे हैं (<ph name="WIFI_NAME" />) उसके लिए आपको <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> पर जाने की ज़रूरत हो सकती है.</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 8a04dbe..fda35d3 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -1099,6 +1099,7 @@ <translation id="7053983685419859001">தடு</translation> <translation id="7062635574500127092">பசும் நீலம்</translation> <translation id="7064851114919012435">தொடர்புத் தகவல்</translation> +<translation id="7075452647191940183">கோரிக்கையின் அளவு மிகப் பெரியதாக உள்ளது</translation> <translation id="7079718277001814089">இந்தத் தளத்தில் தீம்பொருள் உள்ளது</translation> <translation id="7087282848513945231">மாகாணம்</translation> <translation id="7090678807593890770">Googleளில் <ph name="LINK" />ஐத் தேடவும்</translation>
diff --git a/components/translate/translate_internals/translate_internals.js b/components/translate/translate_internals/translate_internals.js index 543f686..e83f03f5 100644 --- a/components/translate/translate_internals/translate_internals.js +++ b/components/translate/translate_internals/translate_internals.js
@@ -271,14 +271,26 @@ const h2 = $('override-variations-country'); h2.title = ('Changing this value will override the permanent country stored ' + - 'by variations. Normally, this value gets automatically updated ' + - 'with a new value received from the variations server when ' + - 'Chrome is updated.'); + 'by variations. The overridden country is not automatically ' + + 'updated when Chrome is updated and overrides all variations ' + + 'country settings. After clicking clear button or the overridden ' + + 'country is not set, the text box shows the country used by ' + + 'permanent consistency studies. The value that this is overriding ' + + 'gets automatically updated with a new value received from the ' + + 'variations server when Chrome is updated.'); + // Add the button to override the country. Note: The country-override + // component is re-created on country update, so there is no issue of this + // being called multiple times. appendTextFieldWithButton(p, country, function(value) { chrome.send('overrideCountry', [value]); }); + appendClearButton( + p, 'overridden' in details && details['overridden'], function() { + chrome.send('overrideCountry', ['']); + }); + if ('update' in details && details['update']) { const div1 = document.createElement('div'); div1.textContent = 'Permanent stored country updated.'; @@ -525,6 +537,30 @@ } /** + * Appends a clear button to `elt`. When the button is clicked, + * `clearCallback` is called. + * + * @param {HTMLElement} elt Container element to append to. + * @param {boolean} enabled Whether the button is clickable. + * @param {Function} clearCallback Function to call when the button is + * clicked. + */ + function appendClearButton(elt, enabled, clearCallback) { + const button = document.createElement('button'); + button.textContent = 'clear'; + button.style.marginLeft = '10px'; + button.disabled = !enabled; + if (enabled) { + button.addEventListener('click', clearCallback, false); + } else { + // Used for tooltip when the button is unclickable. + button.title = 'No pref values to clear.' + } + + elt.appendChild(button); + } + + /** * The callback entry point from the browser. This function will be * called by the browser. *
diff --git a/components/translate/translate_internals/translate_internals_handler.cc b/components/translate/translate_internals/translate_internals_handler.cc index a943fff..bdb4d63 100644 --- a/components/translate/translate_internals/translate_internals_handler.cc +++ b/components/translate/translate_internals/translate_internals_handler.cc
@@ -216,10 +216,8 @@ std::string country; if (args->GetString(0, &country)) { variations::VariationsService* variations_service = GetVariationsService(); - if (variations_service) { - SendCountryToJs( - variations_service->OverrideStoredPermanentCountry(country)); - } + SendCountryToJs( + variations_service->OverrideStoredPermanentCountry(country)); } } @@ -287,15 +285,19 @@ } void TranslateInternalsHandler::SendCountryToJs(bool was_updated) { - std::string country; + std::string country, overridden_country; variations::VariationsService* variations_service = GetVariationsService(); - if (variations_service) - country = variations_service->GetStoredPermanentCountry(); + // The |country| will get the overridden country when it exists. The + // |overridden_country| is used to check if the overridden country exists or + // not and disable/enable the clear button. + country = variations_service->GetStoredPermanentCountry(); + overridden_country = variations_service->GetOverriddenPermanentCountry(); base::DictionaryValue dict; if (!country.empty()) { dict.SetString("country", country); dict.SetBoolean("update", was_updated); + dict.SetBoolean("overridden", !overridden_country.empty()); } SendMessageToJs("countryUpdated", dict); }
diff --git a/components/ui_devtools/css_agent.cc b/components/ui_devtools/css_agent.cc index 82ee5d2..10b88b2c 100644 --- a/components/ui_devtools/css_agent.cc +++ b/components/ui_devtools/css_agent.cc
@@ -52,11 +52,11 @@ std::unique_ptr<Array<CSS::CSSProperty>> BuildCSSPropertyArray( const gfx::Rect& bounds) { - auto cssProperties = Array<CSS::CSSProperty>::create(); - cssProperties->addItem(BuildCSSProperty(kHeight, bounds.height())); - cssProperties->addItem(BuildCSSProperty(kWidth, bounds.width())); - cssProperties->addItem(BuildCSSProperty(kX, bounds.x())); - cssProperties->addItem(BuildCSSProperty(kY, bounds.y())); + auto cssProperties = std::make_unique<Array<CSS::CSSProperty>>(); + cssProperties->emplace_back(BuildCSSProperty(kHeight, bounds.height())); + cssProperties->emplace_back(BuildCSSProperty(kWidth, bounds.width())); + cssProperties->emplace_back(BuildCSSProperty(kX, bounds.x())); + cssProperties->emplace_back(BuildCSSProperty(kY, bounds.y())); return cssProperties; } @@ -69,19 +69,20 @@ if (ui_element->type() != VIEW) { bool visible; ui_element->GetVisible(&visible); - css_properties->addItem(BuildCSSProperty(kVisibility, visible)); + css_properties->emplace_back(BuildCSSProperty(kVisibility, visible)); } const std::vector<std::pair<std::string, std::string>> properties( ui_element->GetCustomProperties()); for (const auto& it : properties) - css_properties->addItem(BuildCSSProperty(it.first, it.second)); + css_properties->emplace_back(BuildCSSProperty(it.first, it.second)); return CSS::CSSStyle::create() .setRange(BuildDefaultSourceRange()) .setStyleSheetId(base::NumberToString(ui_element->node_id())) .setCssProperties(std::move(css_properties)) - .setShorthandEntries(Array<protocol::CSS::ShorthandEntry>::create()) + .setShorthandEntries( + std::make_unique<Array<protocol::CSS::ShorthandEntry>>()) .build(); } @@ -149,10 +150,8 @@ Response CSSAgent::setStyleTexts( std::unique_ptr<Array<CSS::StyleDeclarationEdit>> edits, std::unique_ptr<Array<CSS::CSSStyle>>* result) { - std::unique_ptr<Array<CSS::CSSStyle>> updated_styles = - Array<CSS::CSSStyle>::create(); - for (size_t i = 0; i < edits->length(); i++) { - auto* edit = edits->get(i); + auto updated_styles = std::make_unique<Array<CSS::CSSStyle>>(); + for (const auto& edit : *edits) { int node_id; if (!base::StringToInt(edit->getStyleSheetId(), &node_id)) return Response::Error("Invalid node id"); @@ -175,7 +174,7 @@ if (!SetPropertiesForUIElement(ui_element, updated_bounds, visible)) return NodeNotFoundError(node_id); - updated_styles->addItem(BuildCSSStyle(ui_element)); + updated_styles->emplace_back(BuildCSSStyle(ui_element)); } *result = std::move(updated_styles); return Response::OK();
diff --git a/components/ui_devtools/dom_agent.cc b/components/ui_devtools/dom_agent.cc index 99de980..5acc4d0 100644 --- a/components/ui_devtools/dom_agent.cc +++ b/components/ui_devtools/dom_agent.cc
@@ -50,9 +50,7 @@ Response DOMAgent::pushNodesByBackendIdsToFrontend( std::unique_ptr<protocol::Array<int>> backend_node_ids, std::unique_ptr<protocol::Array<int>>* result) { - *result = protocol::Array<int>::create(); - for (size_t index = 0; index < backend_node_ids->length(); ++index) - (*result)->addItem(backend_node_ids->get(index)); + *result = std::move(backend_node_ids); return Response::OK(); } @@ -137,7 +135,7 @@ std::unique_ptr<Node> DOMAgent::BuildNode( const std::string& name, - std::unique_ptr<Array<std::string>> attributes, + std::unique_ptr<std::vector<std::string>> attributes, std::unique_ptr<Array<Node>> children, int node_ids) { constexpr int kDomElementNodeType = 1; @@ -148,28 +146,30 @@ .setNodeType(kDomElementNodeType) .setAttributes(std::move(attributes)) .build(); - node->setChildNodeCount(static_cast<int>(children->length())); + node->setChildNodeCount(static_cast<int>(children->size())); node->setChildren(std::move(children)); return node; } std::unique_ptr<Node> DOMAgent::BuildDomNodeFromUIElement(UIElement* root) { - std::unique_ptr<Array<Node>> children = Array<Node>::create(); + auto children = std::make_unique<protocol::Array<Node>>(); for (auto* it : root->children()) - children->addItem(BuildDomNodeFromUIElement(it)); + children->emplace_back(BuildDomNodeFromUIElement(it)); - return BuildNode(root->GetTypeName(), root->GetAttributes(), - std::move(children), root->node_id()); + return BuildNode( + root->GetTypeName(), + std::make_unique<std::vector<std::string>>(root->GetAttributes()), + std::move(children), root->node_id()); } std::unique_ptr<Node> DOMAgent::BuildInitialTree() { - std::unique_ptr<Array<Node>> children = Array<Node>::create(); + auto children = std::make_unique<protocol::Array<Node>>(); element_root_ = std::make_unique<RootElement>(this); element_root_->set_is_updating(true); for (auto* child : CreateChildrenForRoot()) { - children->addItem(BuildTreeForUIElement(child)); + children->emplace_back(BuildTreeForUIElement(child)); element_root_->AddChild(child); } std::unique_ptr<Node> root_node = @@ -257,12 +257,7 @@ continue; } - std::unique_ptr<protocol::Array<std::string>> attribute_array = - node->GetAttributes(); - if (!attribute_array->length()) - continue; - for (size_t i = 0; i < attribute_array->length(); ++i) { - protocol::String data = attribute_array->get(i); + for (std::string& data : node->GetAttributes()) { std::transform(data.begin(), data.end(), data.begin(), ::tolower); if (data.find(query) != protocol::String::npos) { result_collector.push_back(node->node_id()); @@ -298,9 +293,9 @@ if (from_index < 0 || to_index > size || from_index >= to_index) return Response::Error("Invalid search result range"); - *node_ids = protocol::Array<int>::create(); + *node_ids = std::make_unique<protocol::Array<int>>(); for (int i = from_index; i < to_index; ++i) - (*node_ids)->addItem((it->second)[i]); + (*node_ids)->emplace_back((it->second)[i]); return Response::OK(); }
diff --git a/components/ui_devtools/dom_agent.h b/components/ui_devtools/dom_agent.h index 833fb30..e9bc304 100644 --- a/components/ui_devtools/dom_agent.h +++ b/components/ui_devtools/dom_agent.h
@@ -71,7 +71,7 @@ protected: std::unique_ptr<protocol::DOM::Node> BuildNode( const std::string& name, - std::unique_ptr<protocol::Array<std::string>> attributes, + std::unique_ptr<std::vector<std::string>> attributes, std::unique_ptr<protocol::Array<protocol::DOM::Node>> children, int node_ids); std::unique_ptr<protocol::DOM::Node> BuildDomNodeFromUIElement(
diff --git a/components/ui_devtools/root_element.cc b/components/ui_devtools/root_element.cc index 5b508aa..6ca9be95 100644 --- a/components/ui_devtools/root_element.cc +++ b/components/ui_devtools/root_element.cc
@@ -35,10 +35,10 @@ void RootElement::SetVisible(bool visible) { NOTREACHED(); } -std::unique_ptr<protocol::Array<std::string>> RootElement::GetAttributes() - const { + +std::vector<std::string> RootElement::GetAttributes() const { NOTREACHED(); - return nullptr; + return {}; } std::pair<gfx::NativeWindow, gfx::Rect>
diff --git a/components/ui_devtools/root_element.h b/components/ui_devtools/root_element.h index e0156baa..c1ded3a 100644 --- a/components/ui_devtools/root_element.h +++ b/components/ui_devtools/root_element.h
@@ -22,7 +22,7 @@ void SetBounds(const gfx::Rect& bounds) override; void GetVisible(bool* visible) const override; void SetVisible(bool visible) override; - std::unique_ptr<protocol::Array<std::string>> GetAttributes() const override; + std::vector<std::string> GetAttributes() const override; std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds() const override;
diff --git a/components/ui_devtools/ui_element.h b/components/ui_devtools/ui_element.h index e249759..6991c69 100644 --- a/components/ui_devtools/ui_element.h +++ b/components/ui_devtools/ui_element.h
@@ -19,11 +19,6 @@ class UIElementDelegate; -namespace protocol { -template <typename T> -class Array; -} - // UIElement type. enum UIElementType { WINDOW, WIDGET, VIEW, ROOT, FRAMESINK, SURFACE }; @@ -95,8 +90,7 @@ // Returns a list of interleaved keys and values of attributes to be displayed // on the element in the dev tools hierarchy view. - virtual std::unique_ptr<protocol::Array<std::string>> GetAttributes() - const = 0; + virtual std::vector<std::string> GetAttributes() const = 0; template <typename BackingT, typename T> static BackingT* GetBackingElement(const UIElement* element) {
diff --git a/components/ui_devtools/views/dom_agent_aura.cc b/components/ui_devtools/views/dom_agent_aura.cc index 998938e..745b63a 100644 --- a/components/ui_devtools/views/dom_agent_aura.cc +++ b/components/ui_devtools/views/dom_agent_aura.cc
@@ -57,24 +57,26 @@ aura::Window* window = UIElement::GetBackingElement<aura::Window, WindowElement>( window_element_root); - std::unique_ptr<Array<Node>> children = Array<Node>::create(); + auto children = std::make_unique<protocol::Array<Node>>(); views::Widget* widget = views::Widget::GetWidgetForNativeView(window); if (widget) { UIElement* widget_element = new WidgetElement(widget, this, window_element_root); - children->addItem(BuildTreeForRootWidget(widget_element)); + children->emplace_back(BuildTreeForRootWidget(widget_element)); window_element_root->AddChild(widget_element); } for (aura::Window* child : window->children()) { UIElement* window_element = new WindowElement(child, this, window_element_root); - children->addItem(BuildTreeForWindow(window_element)); + children->emplace_back(BuildTreeForWindow(window_element)); window_element_root->AddChild(window_element); } std::unique_ptr<Node> node = - BuildNode("Window", window_element_root->GetAttributes(), + BuildNode("Window", + std::make_unique<std::vector<std::string>>( + window_element_root->GetAttributes()), std::move(children), window_element_root->node_id()); return node; }
diff --git a/components/ui_devtools/views/dom_agent_unittest.cc b/components/ui_devtools/views/dom_agent_unittest.cc index 3d3b1fb..5b5d89bd 100644 --- a/components/ui_devtools/views/dom_agent_unittest.cc +++ b/components/ui_devtools/views/dom_agent_unittest.cc
@@ -45,9 +45,9 @@ std::string GetAttributeValue(const std::string& attribute, DOM::Node* node) { EXPECT_TRUE(node->hasAttributes()); Array<std::string>* attributes = node->getAttributes(nullptr); - for (size_t i = 0; i < attributes->length() - 1; i++) { - if (attributes->get(i) == attribute) - return attributes->get(i + 1); + for (size_t i = 0; i < attributes->size() - 1; i += 2) { + if ((*attributes)[i] == attribute) + return (*attributes)[i + 1]; } return std::string(); } @@ -57,8 +57,8 @@ return root; } Array<DOM::Node>* children = root->getChildren(nullptr); - for (size_t i = 0; i < children->length(); i++) { - if (DOM::Node* node = FindNodeWithID(id, children->get(i))) + for (size_t i = 0; i < children->size(); i++) { + if (DOM::Node* node = FindNodeWithID(id, (*children)[i].get())) return node; } return nullptr; @@ -201,16 +201,16 @@ size_t child_index = 0; views::Widget* widget = views::Widget::GetWidgetForNativeView(window); if (widget && - !ElementTreeMatchesDOMTree(widget, children->get(child_index++))) { + !ElementTreeMatchesDOMTree(widget, (*children)[child_index++].get())) { return false; } for (aura::Window* child_window : window->children()) { if (!ElementTreeMatchesDOMTree(child_window, - children->get(child_index++))) + (*children)[child_index++].get())) return false; } // Make sure there are no stray children. - return child_index == children->length(); + return child_index == children->size(); } #endif @@ -223,10 +223,9 @@ Array<DOM::Node>* children = root->getChildren(nullptr); views::View* root_view = widget->GetRootView(); - if (!root_view) - return children->length() == 0; - else - return ElementTreeMatchesDOMTree(root_view, children->get(0)); + return root_view + ? ElementTreeMatchesDOMTree(root_view, (*children)[0].get()) + : children->empty(); } bool ElementTreeMatchesDOMTree(views::View* view, DOM::Node* root) { @@ -239,11 +238,11 @@ Array<DOM::Node>* children = root->getChildren(nullptr); std::vector<views::View*> child_views = view->GetChildrenInZOrder(); const size_t child_count = child_views.size(); - if (child_count != children->length()) + if (child_count != children->size()) return false; for (size_t i = 0; i < child_count; i++) { - if (!ElementTreeMatchesDOMTree(child_views[i], children->get(i))) + if (!ElementTreeMatchesDOMTree(child_views[i], (*children)[i].get())) return false; } return true; @@ -576,7 +575,7 @@ dom_agent()->performSearch("child_a1", false, &search_id, &result_count); EXPECT_EQ(result_count, 1); dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); - EXPECT_EQ(node_ids->length(), 1u); + EXPECT_EQ(node_ids->size(), 1u); dom_agent()->discardSearchResults(search_id); node_ids.reset(); @@ -603,7 +602,7 @@ dom_agent()->performSearch("child_a", false, &search_id, &result_count); EXPECT_EQ(result_count, 2); dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); - EXPECT_EQ(node_ids->length(), 2u); + EXPECT_EQ(node_ids->size(), 2u); dom_agent()->discardSearchResults(search_id); node_ids.reset(); @@ -611,7 +610,7 @@ dom_agent()->performSearch("\"child_a\"", false, &search_id, &result_count); EXPECT_EQ(result_count, 1); dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); - EXPECT_EQ(node_ids->length(), 1u); + EXPECT_EQ(node_ids->size(), 1u); dom_agent()->discardSearchResults(search_id); node_ids.reset(); @@ -641,7 +640,7 @@ dom_agent()->performSearch("widget", false, &search_id, &result_count); EXPECT_EQ(result_count, 4); dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); - EXPECT_EQ(node_ids->length(), 4u); + EXPECT_EQ(node_ids->size(), 4u); dom_agent()->discardSearchResults(search_id); node_ids.reset(); @@ -649,7 +648,7 @@ dom_agent()->performSearch("<widget>", false, &search_id, &result_count); EXPECT_EQ(result_count, 3); dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); - EXPECT_EQ(node_ids->length(), 3u); + EXPECT_EQ(node_ids->size(), 3u); } } // namespace ui_devtools
diff --git a/components/ui_devtools/views/dom_agent_views.cc b/components/ui_devtools/views/dom_agent_views.cc index 31e6c96..b6394ed2 100644 --- a/components/ui_devtools/views/dom_agent_views.cc +++ b/components/ui_devtools/views/dom_agent_views.cc
@@ -45,17 +45,18 @@ views::Widget* widget = UIElement::GetBackingElement<views::Widget, WidgetElement>( widget_element); - std::unique_ptr<Array<Node>> children = Array<Node>::create(); - UIElement* view_element = + auto children = std::make_unique<protocol::Array<Node>>(); + ViewElement* view_element = new ViewElement(widget->GetRootView(), this, widget_element); - - children->addItem(BuildTreeForView(view_element)); + children->emplace_back(BuildTreeForView(view_element)); widget_element->AddChild(view_element); std::unique_ptr<Node> node = - BuildNode("Widget", widget_element->GetAttributes(), std::move(children), - widget_element->node_id()); + BuildNode("Widget", + std::make_unique<std::vector<std::string>>( + widget_element->GetAttributes()), + std::move(children), widget_element->node_id()); return node; } @@ -63,7 +64,7 @@ DCHECK(view_element->type() == UIElementType::VIEW); views::View* view = UIElement::GetBackingElement<views::View, ViewElement>(view_element); - std::unique_ptr<Array<Node>> children = Array<Node>::create(); + auto children = std::make_unique<protocol::Array<Node>>(); for (auto* child : view->GetChildrenInZOrder()) { // When building the subtree, a particular view could be visited multiple @@ -81,12 +82,12 @@ view_element->AddChild(view_element_child); } - children->addItem(BuildTreeForView(view_element_child)); + children->emplace_back(BuildTreeForView(view_element_child)); } - std::unique_ptr<Node> node = - BuildNode("View", view_element->GetAttributes(), std::move(children), - view_element->node_id()); - return node; + return BuildNode( + "View", + std::make_unique<std::vector<std::string>>(view_element->GetAttributes()), + std::move(children), view_element->node_id()); } } // namespace ui_devtools
diff --git a/components/ui_devtools/views/view_element.cc b/components/ui_devtools/views/view_element.cc index 2133320..b99f774 100644 --- a/components/ui_devtools/views/view_element.cc +++ b/components/ui_devtools/views/view_element.cc
@@ -136,13 +136,9 @@ return true; } -std::unique_ptr<protocol::Array<std::string>> ViewElement::GetAttributes() - const { - auto attributes = protocol::Array<std::string>::create(); +std::vector<std::string> ViewElement::GetAttributes() const { // TODO(lgrey): Change name to class after updating tests. - attributes->addItem("name"); - attributes->addItem(view_->GetClassName()); - return attributes; + return {"name", view_->GetClassName()}; } std::pair<gfx::NativeWindow, gfx::Rect>
diff --git a/components/ui_devtools/views/view_element.h b/components/ui_devtools/views/view_element.h index 1c1bf31..184bb4cd 100644 --- a/components/ui_devtools/views/view_element.h +++ b/components/ui_devtools/views/view_element.h
@@ -38,7 +38,7 @@ void GetVisible(bool* visible) const override; void SetVisible(bool visible) override; bool SetPropertiesFromString(const std::string& text) override; - std::unique_ptr<protocol::Array<std::string>> GetAttributes() const override; + std::vector<std::string> GetAttributes() const override; std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds() const override; static views::View* From(const UIElement* element);
diff --git a/components/ui_devtools/views/view_element_unittest.cc b/components/ui_devtools/views/view_element_unittest.cc index 81626b1..826eac8 100644 --- a/components/ui_devtools/views/view_element_unittest.cc +++ b/components/ui_devtools/views/view_element_unittest.cc
@@ -150,12 +150,9 @@ } TEST_F(ViewElementTest, GetAttributes) { - std::unique_ptr<protocol::Array<std::string>> attrs = - element()->GetAttributes(); - DCHECK_EQ(attrs->length(), 2U); - - EXPECT_EQ(attrs->get(0), "name"); - EXPECT_EQ(attrs->get(1), NamedTestView::kViewClassName); + std::vector<std::string> attrs = element()->GetAttributes(); + EXPECT_THAT(attrs, + testing::ElementsAre("name", NamedTestView::kViewClassName)); } TEST_F(ViewElementTest, GetCustomProperties) {
diff --git a/components/ui_devtools/views/widget_element.cc b/components/ui_devtools/views/widget_element.cc index 78cb0f8..7be557d 100644 --- a/components/ui_devtools/views/widget_element.cc +++ b/components/ui_devtools/views/widget_element.cc
@@ -72,14 +72,9 @@ widget_->Hide(); } -std::unique_ptr<protocol::Array<std::string>> WidgetElement::GetAttributes() - const { - auto attributes = protocol::Array<std::string>::create(); - attributes->addItem("name"); - attributes->addItem(widget_->GetName()); - attributes->addItem("active"); - attributes->addItem(widget_->IsActive() ? "true" : "false"); - return attributes; +std::vector<std::string> WidgetElement::GetAttributes() const { + return {"name", widget_->GetName(), "active", + widget_->IsActive() ? "true" : "false"}; } std::pair<gfx::NativeWindow, gfx::Rect>
diff --git a/components/ui_devtools/views/widget_element.h b/components/ui_devtools/views/widget_element.h index b041e4d0..d37e6c2 100644 --- a/components/ui_devtools/views/widget_element.h +++ b/components/ui_devtools/views/widget_element.h
@@ -42,7 +42,7 @@ void SetBounds(const gfx::Rect& bounds) override; void GetVisible(bool* visible) const override; void SetVisible(bool visible) override; - std::unique_ptr<protocol::Array<std::string>> GetAttributes() const override; + std::vector<std::string> GetAttributes() const override; std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds() const override;
diff --git a/components/ui_devtools/views/widget_element_unittest.cc b/components/ui_devtools/views/widget_element_unittest.cc index 31a5352..4fef1df 100644 --- a/components/ui_devtools/views/widget_element_unittest.cc +++ b/components/ui_devtools/views/widget_element_unittest.cc
@@ -111,23 +111,16 @@ } TEST_F(WidgetElementTest, GetAttributes) { - std::unique_ptr<protocol::Array<std::string>> attrs = - element()->GetAttributes(); + std::vector<std::string> attrs = element()->GetAttributes(); - DCHECK_EQ(attrs->length(), 4U); - - EXPECT_EQ(attrs->get(0), "name"); - EXPECT_EQ(attrs->get(1), kWidgetName); - - DCHECK(!widget()->IsActive()); - EXPECT_EQ(attrs->get(2), "active"); - EXPECT_EQ(attrs->get(3), "false"); + ASSERT_FALSE(widget()->IsActive()); + EXPECT_THAT(attrs, + testing::ElementsAre("name", kWidgetName, "active", "false")); widget()->Activate(); attrs = element()->GetAttributes(); - DCHECK_EQ(attrs->length(), 4U); - EXPECT_EQ(attrs->get(2), "active"); - EXPECT_EQ(attrs->get(3), "true"); + EXPECT_THAT(attrs, + testing::ElementsAre("name", kWidgetName, "active", "true")); } TEST_F(WidgetElementTest, GetNodeWindowAndScreenBounds) {
diff --git a/components/ui_devtools/views/window_element.cc b/components/ui_devtools/views/window_element.cc index eb8aa28..649a5a0 100644 --- a/components/ui_devtools/views/window_element.cc +++ b/components/ui_devtools/views/window_element.cc
@@ -106,14 +106,9 @@ window_->Hide(); } -std::unique_ptr<protocol::Array<std::string>> WindowElement::GetAttributes() - const { - auto attributes = protocol::Array<std::string>::create(); - attributes->addItem("name"); - attributes->addItem(window_->GetName()); - attributes->addItem("active"); - attributes->addItem(::wm::IsActiveWindow(window_) ? "true" : "false"); - return attributes; +std::vector<std::string> WindowElement::GetAttributes() const { + return {"name", window_->GetName(), "active", + ::wm::IsActiveWindow(window_) ? "true" : "false"}; } std::pair<gfx::NativeWindow, gfx::Rect>
diff --git a/components/ui_devtools/views/window_element.h b/components/ui_devtools/views/window_element.h index d32b858..20b375c 100644 --- a/components/ui_devtools/views/window_element.h +++ b/components/ui_devtools/views/window_element.h
@@ -40,7 +40,7 @@ void SetBounds(const gfx::Rect& bounds) override; void GetVisible(bool* visible) const override; void SetVisible(bool visible) override; - std::unique_ptr<protocol::Array<std::string>> GetAttributes() const override; + std::vector<std::string> GetAttributes() const override; std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds() const override;
diff --git a/components/ui_devtools/views/window_element_unittest.cc b/components/ui_devtools/views/window_element_unittest.cc index bada0b542..8dc11c3 100644 --- a/components/ui_devtools/views/window_element_unittest.cc +++ b/components/ui_devtools/views/window_element_unittest.cc
@@ -103,22 +103,15 @@ std::string window_name("A window name"); window()->SetName(window_name); - std::unique_ptr<protocol::Array<std::string>> attrs = - element()->GetAttributes(); + std::vector<std::string> attrs = element()->GetAttributes(); - DCHECK_EQ(attrs->length(), 4U); - - EXPECT_EQ(attrs->get(0), "name"); - EXPECT_EQ(attrs->get(1), window_name); - - DCHECK(!wm::IsActiveWindow(window())); - EXPECT_EQ(attrs->get(2), "active"); - EXPECT_EQ(attrs->get(3), "false"); + ASSERT_FALSE(wm::IsActiveWindow(window())); + EXPECT_THAT(attrs, + testing::ElementsAre("name", window_name, "active", "false")); wm::ActivateWindow(window()); attrs = element()->GetAttributes(); - DCHECK_EQ(attrs->length(), 4U); - EXPECT_EQ(attrs->get(2), "active"); - EXPECT_EQ(attrs->get(3), "true"); + EXPECT_THAT(attrs, + testing::ElementsAre("name", window_name, "active", "true")); } } // namespace ui_devtools
diff --git a/components/ui_devtools/viz/dom_agent_viz.cc b/components/ui_devtools/viz/dom_agent_viz.cc index a82e2690..9e536df 100644 --- a/components/ui_devtools/viz/dom_agent_viz.cc +++ b/components/ui_devtools/viz/dom_agent_viz.cc
@@ -245,7 +245,7 @@ std::unique_ptr<DOM::Node> DOMAgentViz::BuildTreeForFrameSink( UIElement* parent_element, const viz::FrameSinkId& parent_id) { - std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); + auto children = std::make_unique<Array<DOM::Node>>(); // Once the FrameSinkElement is created it calls this function to build its // subtree. We iterate through |parent_element|'s children and @@ -257,18 +257,20 @@ FrameSinkElement* child_element = CreateFrameSinkElement( child_id, parent_element, /*is_root=*/false, has_created_frame_sink); - children->addItem(BuildTreeForFrameSink(child_element, child_id)); + children->emplace_back(BuildTreeForFrameSink(child_element, child_id)); child_element->AddToParentSorted(parent_element); } - return BuildNode("FrameSink", parent_element->GetAttributes(), + return BuildNode("FrameSink", + std::make_unique<std::vector<std::string>>( + parent_element->GetAttributes()), std::move(children), parent_element->node_id()); } std::unique_ptr<DOM::Node> DOMAgentViz::BuildTreeForSurface( UIElement* parent_element, const viz::SurfaceId& parent_id) { - std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); + auto children = std::make_unique<Array<DOM::Node>>(); // Once the SurfaceElement is created it calls this function to build its // subtree. We iterate through |parent_element|'s children and @@ -286,10 +288,12 @@ child_element->AddToParentSorted(parent_element); } - children->addItem(BuildTreeForSurface(child_element, child_id)); + children->emplace_back(BuildTreeForSurface(child_element, child_id)); } - return BuildNode("Surface", parent_element->GetAttributes(), + return BuildNode("Surface", + std::make_unique<std::vector<std::string>>( + parent_element->GetAttributes()), std::move(children), parent_element->node_id()); }
diff --git a/components/ui_devtools/viz/frame_sink_element.cc b/components/ui_devtools/viz/frame_sink_element.cc index 4ee4a9c0..90c0b03a 100644 --- a/components/ui_devtools/viz/frame_sink_element.cc +++ b/components/ui_devtools/viz/frame_sink_element.cc
@@ -86,15 +86,9 @@ void FrameSinkElement::SetVisible(bool visible) {} -std::unique_ptr<protocol::Array<std::string>> FrameSinkElement::GetAttributes() - const { - auto attributes = protocol::Array<std::string>::create(); - attributes->addItem("FrameSinkId"); - attributes->addItem(frame_sink_id_.ToString()); - attributes->addItem("Title"); - attributes->addItem( - (frame_sink_manager_->GetFrameSinkDebugLabel(frame_sink_id_)).data()); - return attributes; +std::vector<std::string> FrameSinkElement::GetAttributes() const { + return {"FrameSinkId", frame_sink_id_.ToString(), "Title", + (frame_sink_manager_->GetFrameSinkDebugLabel(frame_sink_id_)).data()}; } std::pair<gfx::NativeWindow, gfx::Rect>
diff --git a/components/ui_devtools/viz/frame_sink_element.h b/components/ui_devtools/viz/frame_sink_element.h index 37bb480..152048f5 100644 --- a/components/ui_devtools/viz/frame_sink_element.h +++ b/components/ui_devtools/viz/frame_sink_element.h
@@ -42,7 +42,7 @@ void SetBounds(const gfx::Rect& bounds) override; void GetVisible(bool* visible) const override; void SetVisible(bool visible) override; - std::unique_ptr<protocol::Array<std::string>> GetAttributes() const override; + std::vector<std::string> GetAttributes() const override; std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds() const override;
diff --git a/components/ui_devtools/viz/surface_element.cc b/components/ui_devtools/viz/surface_element.cc index bb44354..54838ed 100644 --- a/components/ui_devtools/viz/surface_element.cc +++ b/components/ui_devtools/viz/surface_element.cc
@@ -57,16 +57,11 @@ void SurfaceElement::SetVisible(bool visible) {} -std::unique_ptr<protocol::Array<std::string>> SurfaceElement::GetAttributes() - const { - auto attributes = protocol::Array<std::string>::create(); - attributes->addItem("SurfaceId"); - attributes->addItem(surface_id_.ToString()); - attributes->addItem("FrameSink Debug Label"); - attributes->addItem( +std::vector<std::string> SurfaceElement::GetAttributes() const { + return { + "SurfaceId", surface_id_.ToString(), "FrameSink Debug Label", frame_sink_manager_->GetFrameSinkDebugLabel(surface_id_.frame_sink_id()) - .as_string()); - return attributes; + .as_string()}; } std::pair<gfx::NativeWindow, gfx::Rect>
diff --git a/components/ui_devtools/viz/surface_element.h b/components/ui_devtools/viz/surface_element.h index 93d34c1..547a100e 100644 --- a/components/ui_devtools/viz/surface_element.h +++ b/components/ui_devtools/viz/surface_element.h
@@ -31,7 +31,7 @@ void SetBounds(const gfx::Rect& bounds) override; void GetVisible(bool* visible) const override; void SetVisible(bool visible) override; - std::unique_ptr<protocol::Array<std::string>> GetAttributes() const override; + std::vector<std::string> GetAttributes() const override; std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds() const override;
diff --git a/components/ui_devtools/viz/viz_devtools_unittest.cc b/components/ui_devtools/viz/viz_devtools_unittest.cc index eca35980..2c0cb503 100644 --- a/components/ui_devtools/viz/viz_devtools_unittest.cc +++ b/components/ui_devtools/viz/viz_devtools_unittest.cc
@@ -38,9 +38,9 @@ if (!node->hasAttributes()) return false; Array<std::string>* attributes = node->getAttributes(nullptr); - for (size_t i = 0; i < attributes->length() - 1; i += 2) { - if (attributes->get(i) == attribute) { - return attributes->get(i + 1) == value; + for (size_t i = 0; i < attributes->size() - 1; i += 2) { + if ((*attributes)[i] == attribute) { + return (*attributes)[i + 1] == value; } } return false; @@ -54,8 +54,9 @@ return root; Array<DOM::Node>* children = root->getChildren(nullptr); - for (size_t i = 0; i < children->length(); ++i) { - DOM::Node* node = FindNodeByAttribute(attribute, value, children->get(i)); + for (size_t i = 0; i < children->size(); ++i) { + DOM::Node* node = + FindNodeByAttribute(attribute, value, (*children)[i].get()); if (node) return node; } @@ -285,9 +286,9 @@ DOM::Node* node3 = FindFrameSinkNode(kFrameSink3, root()); // The first and third frame sinks are children of the root element. - EXPECT_EQ(node1, root()->getChildren(nullptr)->get(0)); - EXPECT_EQ(node2, node1->getChildren(nullptr)->get(0)); - EXPECT_EQ(node3, root()->getChildren(nullptr)->get(1)); + EXPECT_EQ(node1, (*(root()->getChildren(nullptr)))[0].get()); + EXPECT_EQ(node2, (*(node1->getChildren(nullptr)))[0].get()); + EXPECT_EQ(node3, (*(root()->getChildren(nullptr)))[1].get()); } // Verify that FrameSinkElements are inserted into the tree according to the @@ -523,8 +524,8 @@ FindSurfaceNode(surface_manager()->GetRootSurfaceId(), root()); // The frame sink should be before the root surface node. - EXPECT_EQ(frame_sink_node, root()->getChildren(nullptr)->get(0)); - EXPECT_EQ(root_surface_node, root()->getChildren(nullptr)->get(1)); + EXPECT_EQ(frame_sink_node, (*(root()->getChildren(nullptr)))[0].get()); + EXPECT_EQ(root_surface_node, (*(root()->getChildren(nullptr)))[1].get()); // Create a frame sink element with a large id, it should still be inserted // before the root surface element.
diff --git a/components/variations/pref_names.cc b/components/variations/pref_names.cc index 2c950993..b75b75a 100644 --- a/components/variations/pref_names.cc +++ b/components/variations/pref_names.cc
@@ -33,6 +33,13 @@ const char kVariationsPermanentConsistencyCountry[] = "variations_permanent_consistency_country"; +// A country code string representing the country used for filtering permanent +// consistency studies and will not be updated on Chrome updated. It can be +// changed via chrome://translate-internals and is intended for +// testing / developer use. +const char kVariationsPermanentOverriddenCountry[] = + "variations_permanent_overridden_country"; + // String for the restrict parameter to be appended to the variations URL. const char kVariationsRestrictParameter[] = "variations_restrict_parameter";
diff --git a/components/variations/pref_names.h b/components/variations/pref_names.h index 2b86485..a1f2e1d 100644 --- a/components/variations/pref_names.h +++ b/components/variations/pref_names.h
@@ -17,6 +17,7 @@ extern const char kVariationsFailedToFetchSeedStreak[]; extern const char kVariationsLastFetchTime[]; extern const char kVariationsPermanentConsistencyCountry[]; +extern const char kVariationsPermanentOverriddenCountry[]; extern const char kVariationsRestrictParameter[]; extern const char kVariationsSafeCompressedSeed[]; extern const char kVariationsSafeSeedDate[];
diff --git a/components/variations/service/variations_field_trial_creator.cc b/components/variations/service/variations_field_trial_creator.cc index 7c6a2a7e..b31f3cad 100644 --- a/components/variations/service/variations_field_trial_creator.cc +++ b/components/variations/service/variations_field_trial_creator.cc
@@ -55,23 +55,6 @@ VARIATIONS_SEED_EXPIRY_ENUM_SIZE, }; -// Set of different possible values to report for the -// Variations.LoadPermanentConsistencyCountryResult histogram. Values are -// persisted to logs, and should therefore never be renumbered nor reused. -enum LoadPermanentConsistencyCountryResult { - LOAD_COUNTRY_NO_PREF_NO_SEED = 0, - LOAD_COUNTRY_NO_PREF_HAS_SEED, - LOAD_COUNTRY_INVALID_PREF_NO_SEED, - LOAD_COUNTRY_INVALID_PREF_HAS_SEED, - LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_EQ, - LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_NEQ, - LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_EQ, - LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_NEQ, - LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_EQ, - LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_NEQ, - LOAD_COUNTRY_MAX, -}; - // Gets current form factor and converts it from enum DeviceFormFactor to enum // Study_FormFactor. Study::FormFactor GetCurrentFormFactor() { @@ -303,6 +286,16 @@ if (!override_country.empty()) return override_country; + const std::string permanent_overridden_country = + local_state()->GetString(prefs::kVariationsPermanentOverriddenCountry); + + if (!permanent_overridden_country.empty()) { + base::UmaHistogramEnumeration( + "Variations.LoadPermanentConsistencyCountryResult", + LOAD_COUNTRY_HAS_PERMANENT_OVERRIDDEN_COUNTRY, LOAD_COUNTRY_MAX); + return permanent_overridden_country; + } + const base::ListValue* list_value = local_state()->GetList(prefs::kVariationsPermanentConsistencyCountry); std::string stored_version_string; @@ -376,6 +369,12 @@ new_list_value); } +void VariationsFieldTrialCreator::StoreVariationsOverriddenCountry( + const std::string& country) { + local_state()->SetString(prefs::kVariationsPermanentOverriddenCountry, + country); +} + void VariationsFieldTrialCreator::OverrideVariationsPlatform( Study::Platform platform_override) { has_platform_override_ = true;
diff --git a/components/variations/service/variations_field_trial_creator.h b/components/variations/service/variations_field_trial_creator.h index def6af0..5159583 100644 --- a/components/variations/service/variations_field_trial_creator.h +++ b/components/variations/service/variations_field_trial_creator.h
@@ -22,6 +22,21 @@ namespace variations { +enum LoadPermanentConsistencyCountryResult { + LOAD_COUNTRY_NO_PREF_NO_SEED = 0, + LOAD_COUNTRY_NO_PREF_HAS_SEED, + LOAD_COUNTRY_INVALID_PREF_NO_SEED, + LOAD_COUNTRY_INVALID_PREF_HAS_SEED, + LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_EQ, + LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_NEQ, + LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_EQ, + LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_NEQ, + LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_EQ, + LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_NEQ, + LOAD_COUNTRY_HAS_PERMANENT_OVERRIDDEN_COUNTRY, + LOAD_COUNTRY_MAX, +}; + class PlatformFieldTrials; class SafeSeedManager; class VariationsServiceClient; @@ -87,6 +102,10 @@ void StorePermanentCountry(const base::Version& version, const std::string& country); + // Sets the stored permanent variations overridden country pref for this + // client. + void StoreVariationsOverriddenCountry(const std::string& country); + // Records the time of the most recent successful fetch. void RecordLastFetchTime();
diff --git a/components/variations/service/variations_service.cc b/components/variations/service/variations_service.cc index 2066c21..fc59394 100644 --- a/components/variations/service/variations_service.cc +++ b/components/variations/service/variations_service.cc
@@ -454,6 +454,10 @@ // it according to a value stored in the User Policy. registry->RegisterStringPref(prefs::kVariationsRestrictParameter, std::string()); + // This preference is used to override the variations country code which is + // consistent across different chrome version. + registry->RegisterStringPref(prefs::kVariationsPermanentOverriddenCountry, + std::string()); // This preference keeps track of the country code used to filter // permanent-consistency studies. registry->RegisterListPref(prefs::kVariationsPermanentConsistencyCountry); @@ -925,7 +929,16 @@ return StartRepeatedVariationsSeedFetch(); } +std::string VariationsService::GetOverriddenPermanentCountry() { + return local_state_->GetString(prefs::kVariationsPermanentOverriddenCountry); +} + std::string VariationsService::GetStoredPermanentCountry() { + const std::string variations_overridden_country = + GetOverriddenPermanentCountry(); + if (!variations_overridden_country.empty()) + return variations_overridden_country; + const base::ListValue* list_value = local_state_->GetList(prefs::kVariationsPermanentConsistencyCountry); std::string stored_country; @@ -941,21 +954,13 @@ const std::string& country_override) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (country_override.empty()) + const std::string stored_country = + local_state_->GetString(prefs::kVariationsPermanentOverriddenCountry); + + if (stored_country == country_override) return false; - const base::ListValue* list_value = - local_state_->GetList(prefs::kVariationsPermanentConsistencyCountry); - - std::string stored_country; - const bool got_stored_country = - list_value->GetSize() == 2 && list_value->GetString(1, &stored_country); - - if (got_stored_country && stored_country == country_override) - return false; - - base::Version version(version_info::GetVersionNumber()); - field_trial_creator_.StorePermanentCountry(version, country_override); + field_trial_creator_.StoreVariationsOverriddenCountry(country_override); return true; }
diff --git a/components/variations/service/variations_service.h b/components/variations/service/variations_service.h index ebe1a83..8ab1f61 100644 --- a/components/variations/service/variations_service.h +++ b/components/variations/service/variations_service.h
@@ -120,6 +120,10 @@ // should happen in that case. GURL GetVariationsServerURL(HttpOptions http_options); + // Returns the permanent overridden country code stored for this client. This + // value will not be updated on Chrome updates. + std::string GetOverriddenPermanentCountry(); + // Returns the permanent country code stored for this client. Country code is // in the format of lowercase ISO 3166-1 alpha-2. Example: us, br, in std::string GetStoredPermanentCountry(); @@ -290,23 +294,6 @@ FRIEND_TEST_ALL_PREFIXES(VariationsServiceTest, DoNotRetryIfInsecureURLIsHTTPS); - // Set of different possible values to report for the - // Variations.LoadPermanentConsistencyCountryResult histogram. This enum must - // be kept consistent with its counterpart in histograms.xml. - enum LoadPermanentConsistencyCountryResult { - LOAD_COUNTRY_NO_PREF_NO_SEED = 0, - LOAD_COUNTRY_NO_PREF_HAS_SEED, - LOAD_COUNTRY_INVALID_PREF_NO_SEED, - LOAD_COUNTRY_INVALID_PREF_HAS_SEED, - LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_EQ, - LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_NEQ, - LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_EQ, - LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_NEQ, - LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_EQ, - LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_NEQ, - LOAD_COUNTRY_MAX, - }; - void InitResourceRequestedAllowedNotifier(); // Calls FetchVariationsSeed once and repeats this periodically. See
diff --git a/components/variations/service/variations_service_unittest.cc b/components/variations/service/variations_service_unittest.cc index ace3b64b..8528050 100644 --- a/components/variations/service/variations_service_unittest.cc +++ b/components/variations/service/variations_service_unittest.cc
@@ -649,55 +649,62 @@ TEST_F(VariationsServiceTest, LoadPermanentConsistencyCountry) { struct { + const char* permanent_overridden_country_before; // Comma separated list, NULL if the pref isn't set initially. - const char* pref_value_before; + const char* permanent_consistency_country_before; const char* version; // NULL indicates that no latest country code is present. const char* latest_country_code; // Comma separated list. - const char* expected_pref_value_after; + const char* permanent_consistency_country_after; std::string expected_country; - VariationsService::LoadPermanentConsistencyCountryResult expected_result; + LoadPermanentConsistencyCountryResult expected_result; } test_cases[] = { + // Existing permanent overridden country. + {"ca", "20.0.0.0,us", "20.0.0.0", "us", "20.0.0.0,us", "ca", + LOAD_COUNTRY_HAS_PERMANENT_OVERRIDDEN_COUNTRY}, + {"us", "20.0.0.0,us", "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_HAS_PERMANENT_OVERRIDDEN_COUNTRY}, + {"ca", nullptr, "20.0.0.0", nullptr, nullptr, "ca", + LOAD_COUNTRY_HAS_PERMANENT_OVERRIDDEN_COUNTRY}, + // Existing pref value present for this version. - {"20.0.0.0,us", "20.0.0.0", "ca", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_NEQ}, - {"20.0.0.0,us", "20.0.0.0", "us", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_EQ}, - {"20.0.0.0,us", "20.0.0.0", nullptr, "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_EQ}, + {"", "20.0.0.0,us", "20.0.0.0", "ca", "20.0.0.0,us", "us", + LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_NEQ}, + {"", "20.0.0.0,us", "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_HAS_BOTH_VERSION_EQ_COUNTRY_EQ}, + {"", "20.0.0.0,us", "20.0.0.0", nullptr, "20.0.0.0,us", "us", + LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_EQ}, // Existing pref value present for a different version. - {"19.0.0.0,ca", "20.0.0.0", "us", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_NEQ}, - {"19.0.0.0,us", "20.0.0.0", "us", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_EQ}, - {"19.0.0.0,ca", "20.0.0.0", nullptr, "19.0.0.0,ca", "", - VariationsService::LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_NEQ}, + {"", "19.0.0.0,ca", "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_NEQ}, + {"", "19.0.0.0,us", "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_HAS_BOTH_VERSION_NEQ_COUNTRY_EQ}, + {"", "19.0.0.0,ca", "20.0.0.0", nullptr, "19.0.0.0,ca", "", + LOAD_COUNTRY_HAS_PREF_NO_SEED_VERSION_NEQ}, // No existing pref value present. - {nullptr, "20.0.0.0", "us", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_NO_PREF_HAS_SEED}, - {nullptr, "20.0.0.0", nullptr, "", "", - VariationsService::LOAD_COUNTRY_NO_PREF_NO_SEED}, - {"", "20.0.0.0", "us", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_NO_PREF_HAS_SEED}, - {"", "20.0.0.0", nullptr, "", "", - VariationsService::LOAD_COUNTRY_NO_PREF_NO_SEED}, + {"", nullptr, "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_NO_PREF_HAS_SEED}, + {"", nullptr, "20.0.0.0", nullptr, "", "", LOAD_COUNTRY_NO_PREF_NO_SEED}, + {"", "", "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_NO_PREF_HAS_SEED}, + {"", "", "20.0.0.0", nullptr, "", "", LOAD_COUNTRY_NO_PREF_NO_SEED}, // Invalid existing pref value. - {"20.0.0.0", "20.0.0.0", "us", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_INVALID_PREF_HAS_SEED}, - {"20.0.0.0", "20.0.0.0", nullptr, "", "", - VariationsService::LOAD_COUNTRY_INVALID_PREF_NO_SEED}, - {"20.0.0.0,us,element3", "20.0.0.0", "us", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_INVALID_PREF_HAS_SEED}, - {"20.0.0.0,us,element3", "20.0.0.0", nullptr, "", "", - VariationsService::LOAD_COUNTRY_INVALID_PREF_NO_SEED}, - {"badversion,ca", "20.0.0.0", "us", "20.0.0.0,us", "us", - VariationsService::LOAD_COUNTRY_INVALID_PREF_HAS_SEED}, - {"badversion,ca", "20.0.0.0", nullptr, "", "", - VariationsService::LOAD_COUNTRY_INVALID_PREF_NO_SEED}, + {"", "20.0.0.0", "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_INVALID_PREF_HAS_SEED}, + {"", "20.0.0.0", "20.0.0.0", nullptr, "", "", + LOAD_COUNTRY_INVALID_PREF_NO_SEED}, + {"", "20.0.0.0,us,element3", "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_INVALID_PREF_HAS_SEED}, + {"", "20.0.0.0,us,element3", "20.0.0.0", nullptr, "", "", + LOAD_COUNTRY_INVALID_PREF_NO_SEED}, + {"", "badversion,ca", "20.0.0.0", "us", "20.0.0.0,us", "us", + LOAD_COUNTRY_INVALID_PREF_HAS_SEED}, + {"", "badversion,ca", "20.0.0.0", nullptr, "", "", + LOAD_COUNTRY_INVALID_PREF_NO_SEED}, }; for (const auto& test : test_cases) { @@ -707,13 +714,20 @@ &prefs_, network_tracker_), &prefs_, GetMetricsStateManager(), UIStringOverrider()); - if (!test.pref_value_before) { + if (!test.permanent_overridden_country_before) { + prefs_.ClearPref(prefs::kVariationsPermanentOverriddenCountry); + } else { + prefs_.SetString(prefs::kVariationsPermanentOverriddenCountry, + test.permanent_overridden_country_before); + } + + if (!test.permanent_consistency_country_before) { prefs_.ClearPref(prefs::kVariationsPermanentConsistencyCountry); } else { base::ListValue list_value; for (const std::string& component : - base::SplitString(test.pref_value_before, ",", base::TRIM_WHITESPACE, - base::SPLIT_WANT_ALL)) { + base::SplitString(test.permanent_consistency_country_before, ",", + base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { list_value.AppendString(component); } prefs_.Set(prefs::kVariationsPermanentConsistencyCountry, list_value); @@ -728,12 +742,12 @@ EXPECT_EQ(test.expected_country, service.LoadPermanentConsistencyCountry( base::Version(test.version), latest_country)) - << test.pref_value_before << ", " << test.version << ", " - << test.latest_country_code; + << test.permanent_consistency_country_before << ", " << test.version + << ", " << test.latest_country_code; base::ListValue expected_list_value; for (const std::string& component : - base::SplitString(test.expected_pref_value_after, ",", + base::SplitString(test.permanent_consistency_country_after, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { expected_list_value.AppendString(component); } @@ -741,8 +755,8 @@ prefs_.GetList(prefs::kVariationsPermanentConsistencyCountry); EXPECT_EQ(ListValueToString(expected_list_value), ListValueToString(*pref_value)) - << test.pref_value_before << ", " << test.version << ", " - << test.latest_country_code; + << test.permanent_consistency_country_before << ", " << test.version + << ", " << test.latest_country_code; histogram_tester.ExpectUniqueSample( "Variations.LoadPermanentConsistencyCountryResult", @@ -750,27 +764,70 @@ } } +TEST_F(VariationsServiceTest, GetStoredPermanentCountry) { + struct { + // The old overridden country, empty string if the pref isn't set initially. + const std::string permanent_overridden_country_before; + // Comma separated list, NULL if the pref isn't set initially. + const std::string permanent_consistency_country_before; + const std::string expected_country; + } test_cases[] = { + {"", "20.0.0.0,us", "us"}, + {"us", "20.0.0.0,us", "us"}, + {"ca", "20.0.0.0,us", "ca"}, + {"ca", "", "ca"}, + }; + + for (const auto& test : test_cases) { + TestVariationsService service( + std::make_unique<web_resource::TestRequestAllowedNotifier>( + &prefs_, network_tracker_), + &prefs_, GetMetricsStateManager(), true); + + if (test.permanent_overridden_country_before.empty()) { + prefs_.ClearPref(prefs::kVariationsPermanentOverriddenCountry); + } else { + prefs_.SetString(prefs::kVariationsPermanentOverriddenCountry, + test.permanent_overridden_country_before); + } + + if (test.permanent_consistency_country_before.empty()) { + prefs_.ClearPref(prefs::kVariationsPermanentConsistencyCountry); + } else { + base::ListValue list_value; + for (const std::string& component : + base::SplitString(test.permanent_consistency_country_before, ",", + base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { + list_value.AppendString(component); + } + prefs_.Set(prefs::kVariationsPermanentConsistencyCountry, list_value); + } + + VariationsSeed seed(CreateTestSeed()); + + EXPECT_EQ(test.expected_country, service.GetStoredPermanentCountry()) + << test.permanent_overridden_country_before << ", " + << test.permanent_consistency_country_before; + } +} + TEST_F(VariationsServiceTest, OverrideStoredPermanentCountry) { - const std::string kTestVersion = version_info::GetVersionNumber(); - const std::string kPrefCa = version_info::GetVersionNumber() + ",ca"; - const std::string kPrefUs = version_info::GetVersionNumber() + ",us"; + const std::string kPrefCa = "ca"; + const std::string kPrefUs = "us"; struct { - // Comma separated list, empty string if the pref isn't set initially. + // The old overridden country, empty string if the pref isn't set initially. const std::string pref_value_before; const std::string country_code_override; - // Comma separated list. + // The expected override country. const std::string expected_pref_value_after; // Is the pref expected to be updated or not. const bool has_updated; } test_cases[] = { {kPrefUs, "ca", kPrefCa, true}, {kPrefUs, "us", kPrefUs, false}, - {kPrefUs, "", kPrefUs, false}, + {kPrefUs, "", "", true}, {"", "ca", kPrefCa, true}, - {"", "", "", false}, - {"19.0.0.0,us", "ca", kPrefCa, true}, - {"19.0.0.0,us", "us", "19.0.0.0,us", false}, }; for (const auto& test : test_cases) { @@ -780,15 +837,10 @@ &prefs_, GetMetricsStateManager(), true); if (test.pref_value_before.empty()) { - prefs_.ClearPref(prefs::kVariationsPermanentConsistencyCountry); + prefs_.ClearPref(prefs::kVariationsPermanentOverriddenCountry); } else { - base::ListValue list_value; - for (const std::string& component : - base::SplitString(test.pref_value_before, ",", base::TRIM_WHITESPACE, - base::SPLIT_WANT_ALL)) { - list_value.AppendString(component); - } - prefs_.Set(prefs::kVariationsPermanentConsistencyCountry, list_value); + prefs_.SetString(prefs::kVariationsPermanentOverriddenCountry, + test.pref_value_before); } VariationsSeed seed(CreateTestSeed()); @@ -797,16 +849,9 @@ test.country_code_override)) << test.pref_value_before << ", " << test.country_code_override; - base::ListValue expected_list_value; - for (const std::string& component : - base::SplitString(test.expected_pref_value_after, ",", - base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { - expected_list_value.AppendString(component); - } - const base::ListValue* pref_value = - prefs_.GetList(prefs::kVariationsPermanentConsistencyCountry); - EXPECT_EQ(ListValueToString(expected_list_value), - ListValueToString(*pref_value)) + const std::string pref_value = + prefs_.GetString(prefs::kVariationsPermanentOverriddenCountry); + EXPECT_EQ(test.expected_pref_value_after, pref_value) << test.pref_value_before << ", " << test.country_code_override; } }
diff --git a/content/app/strings/translations/content_strings_ja.xtb b/content/app/strings/translations/content_strings_ja.xtb index 7839107..e845163 100644 --- a/content/app/strings/translations/content_strings_ja.xtb +++ b/content/app/strings/translations/content_strings_ja.xtb
@@ -89,7 +89,7 @@ <translation id="4151657705144244502">グラフィック</translation> <translation id="4193965531860883258">前書き</translation> <translation id="4201051445878709314">前の月を表示</translation> -<translation id="421884353938374759">色の選択</translation> +<translation id="421884353938374759">カラー選択ツール</translation> <translation id="4248100235867064564">メニューバー</translation> <translation id="4254339807215791271">コンテンツ情報</translation> <translation id="4360991593054037559">有効な値を入力してください。有効な値として最も近いのは <ph name="VALID_VALUE_LOW" /> と <ph name="VALID_VALUE_HIGHER" /> です。</translation>
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc index 7a6ddd8..d5fcd89c7 100644 --- a/content/browser/child_process_security_policy_impl.cc +++ b/content/browser/child_process_security_policy_impl.cc
@@ -868,7 +868,7 @@ // TODO(dcheng): Figure out why this check is different from CanCommitURL, // which checks for direct equality with kAboutBlankURL. if (IsPseudoScheme(scheme)) - return url.IsAboutBlank() || url == kAboutSrcDocURL; + return url.IsAboutBlank() || url.IsAboutSrcdoc(); // Blob and filesystem URLs require special treatment; validate the inner // origin they embed. @@ -940,7 +940,7 @@ // Of all the pseudo schemes, only about:blank and about:srcdoc are allowed to // commit. if (IsPseudoScheme(scheme)) - return url == url::kAboutBlankURL || url == kAboutSrcDocURL; + return url.IsAboutBlank() || url.IsAboutSrcdoc(); // Blob and filesystem URLs require special treatment; validate the inner // origin they embed. @@ -995,7 +995,7 @@ return false; // Can't set invalid URLs as origin headers. // about:srcdoc cannot be used as an origin - if (url == kAboutSrcDocURL) + if (url.IsAboutSrcdoc()) return false; // If this process can commit |url|, it can use |url| as an origin for
diff --git a/content/browser/devtools/protocol/background_service_handler.cc b/content/browser/devtools/protocol/background_service_handler.cc index d5a174a..52afbfa 100644 --- a/content/browser/devtools/protocol/background_service_handler.cc +++ b/content/browser/devtools/protocol/background_service_handler.cc
@@ -52,15 +52,15 @@ std::unique_ptr<protocol::Array<protocol::BackgroundService::EventMetadata>> ProtoMapToArray( const google::protobuf::Map<std::string, std::string>& event_metadata_map) { - auto metadata_array = - protocol::Array<protocol::BackgroundService::EventMetadata>::create(); + auto metadata_array = std::make_unique< + protocol::Array<protocol::BackgroundService::EventMetadata>>(); for (const auto& entry : event_metadata_map) { auto event_metadata = protocol::BackgroundService::EventMetadata::Create() .SetKey(entry.first) .SetValue(entry.second) .Build(); - metadata_array->addItem(std::move(event_metadata)); + metadata_array->emplace_back(std::move(event_metadata)); } return metadata_array;
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc index 09229d26..a1093fc 100644 --- a/content/browser/devtools/protocol/browser_handler.cc +++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -90,11 +90,11 @@ base::HistogramBase::Sample low; int64_t high; bucket_it->Get(&low, &high, &count); - out_buckets->addItem(Browser::Bucket::Create() - .SetLow(low) - .SetHigh(high) - .SetCount(count) - .Build()); + out_buckets->emplace_back(Browser::Bucket::Create() + .SetLow(low) + .SetHigh(high) + .SetCount(count) + .Build()); } return Browser::Histogram::Create() @@ -171,7 +171,7 @@ base::StatisticsRecorder::GetHistograms(), in_query.fromMaybe("")))) { DCHECK(h); - (*out_histograms)->addItem(Convert(*h, in_delta.fromMaybe(false))); + (*out_histograms)->emplace_back(Convert(*h, in_delta.fromMaybe(false))); } return Response::OK(); @@ -212,10 +212,9 @@ if (!response.isSuccess()) return response; PermissionControllerImpl::PermissionOverrides overrides; - for (size_t i = 0; i < permissions->length(); ++i) { + for (const protocol::Browser::PermissionType& t : *permissions) { PermissionType type; - Response type_response = - FromProtocolPermissionType(permissions->get(i), &type); + Response type_response = FromProtocolPermissionType(t, &type); if (!type_response.isSuccess()) return type_response; overrides.insert(type); @@ -262,16 +261,16 @@ Response BrowserHandler::GetBrowserCommandLine( std::unique_ptr<protocol::Array<std::string>>* arguments) { - *arguments = protocol::Array<std::string>::create(); + *arguments = std::make_unique<protocol::Array<std::string>>(); base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); // The commandline is potentially sensitive, only return it if it // contains kEnableAutomation. if (command_line->HasSwitch(switches::kEnableAutomation)) { for (const auto& arg : command_line->argv()) { #if defined(OS_WIN) - (*arguments)->addItem(base::UTF16ToUTF8(arg.c_str())); + (*arguments)->emplace_back(base::UTF16ToUTF8(arg)); #else - (*arguments)->addItem(arg.c_str()); + (*arguments)->emplace_back(arg); #endif } return Response::OK();
diff --git a/content/browser/devtools/protocol/dom_handler.cc b/content/browser/devtools/protocol/dom_handler.cc index bd8f2951..8d10ae6 100644 --- a/content/browser/devtools/protocol/dom_handler.cc +++ b/content/browser/devtools/protocol/dom_handler.cc
@@ -41,16 +41,9 @@ if (!allow_file_access_) return Response::Error("Not allowed"); if (host_) { - for (size_t i = 0; i < files->length(); i++) { -#if defined(OS_WIN) + for (const std::string& file : *files) { ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile( - host_->GetProcess()->GetID(), - base::FilePath(base::UTF8ToUTF16(files->get(i)))); -#else - ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile( - host_->GetProcess()->GetID(), - base::FilePath(files->get(i))); -#endif // OS_WIN + host_->GetProcess()->GetID(), base::FilePath::FromUTF8Unsafe(file)); } } return Response::FallThrough();
diff --git a/content/browser/devtools/protocol/fetch_handler.cc b/content/browser/devtools/protocol/fetch_handler.cc index 23ec0172..0f69893 100644 --- a/content/browser/devtools/protocol/fetch_handler.cc +++ b/content/browser/devtools/protocol/fetch_handler.cc
@@ -60,14 +60,14 @@ std::vector<DevToolsNetworkInterceptor::Pattern>* result) { result->clear(); if (!maybe_patterns.isJust()) { - result->push_back(DevToolsNetworkInterceptor::Pattern( - "*", {}, DevToolsNetworkInterceptor::REQUEST)); + result->emplace_back("*", base::flat_set<ResourceType>(), + DevToolsNetworkInterceptor::REQUEST); return Response::OK(); } Array<Fetch::RequestPattern>& patterns = *maybe_patterns.fromJust(); - for (size_t i = 0; i < patterns.length(); ++i) { + for (const std::unique_ptr<Fetch::RequestPattern>& pattern : patterns) { base::flat_set<ResourceType> resource_types; - std::string resource_type = patterns.get(i)->GetResourceType(""); + std::string resource_type = pattern->GetResourceType(""); if (!resource_type.empty()) { if (!NetworkHandler::AddInterceptedResourceType(resource_type, &resource_types)) { @@ -76,10 +76,10 @@ resource_type.c_str())); } } - result->push_back(DevToolsNetworkInterceptor::Pattern( - patterns.get(i)->GetUrlPattern("*"), std::move(resource_types), - RequestStageToInterceptorStage(patterns.get(i)->GetRequestStage( - Fetch::RequestStageEnum::Request)))); + result->emplace_back( + pattern->GetUrlPattern("*"), std::move(resource_types), + RequestStageToInterceptorStage( + pattern->GetRequestStage(Fetch::RequestStageEnum::Request))); } return Response::OK(); } @@ -222,9 +222,8 @@ base::StringPrintf("HTTP/1.1 %d %s", responseCode, status_phrase.c_str()); headers.append(1, '\0'); if (responseHeaders) { - for (size_t i = 0; i < responseHeaders->length(); ++i) { - auto* entry = responseHeaders->get(i); - if (!ValidateHeaders(entry, callback.get())) + for (const std::unique_ptr<Fetch::HeaderEntry>& entry : *responseHeaders) { + if (!ValidateHeaders(entry.get(), callback.get())) return; headers.append(entry->GetName()); headers.append(":"); @@ -257,9 +256,9 @@ if (headers.isJust()) { request_headers = std::make_unique< DevToolsNetworkInterceptor::Modifications::HeadersVector>(); - for (size_t i = 0; i < headers.fromJust()->length(); ++i) { - auto* entry = headers.fromJust()->get(i); - if (!ValidateHeaders(entry, callback.get())) + for (const std::unique_ptr<Fetch::HeaderEntry>& entry : + *headers.fromJust()) { + if (!ValidateHeaders(entry.get(), callback.get())) return; request_headers->emplace_back(entry->GetName(), entry->GetValue()); } @@ -353,7 +352,7 @@ std::string name; std::string value; while (headers->EnumerateHeaderLines(&iterator, &name, &value)) { - result->addItem( + result->emplace_back( Fetch::HeaderEntry::Create().SetName(name).SetValue(value).Build()); } return result;
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc index fdd1744..5f1e02d8 100644 --- a/content/browser/devtools/protocol/input_handler.cc +++ b/content/browser/devtools/protocol/input_handler.cc
@@ -765,14 +765,14 @@ if ((type == blink::WebInputEvent::kTouchStart || type == blink::WebInputEvent::kTouchMove) && - touch_points->length() == 0) { + touch_points->empty()) { callback->sendFailure(Response::InvalidParams( "TouchStart and TouchMove must have at least one touch point.")); return; } if ((type == blink::WebInputEvent::kTouchEnd || type == blink::WebInputEvent::kTouchCancel) && - touch_points->length() > 0) { + !touch_points->empty()) { callback->sendFailure(Response::InvalidParams( "TouchEnd and TouchCancel must not have any touch points.")); return; @@ -790,9 +790,9 @@ base::flat_map<int, blink::WebTouchPoint> points; size_t with_id = 0; - for (size_t i = 0; i < touch_points->length(); ++i) { - Input::TouchPoint* point = touch_points->get(i); - int id = point->GetId(i); + for (size_t i = 0; i < touch_points->size(); ++i) { + Input::TouchPoint* point = (*touch_points)[i].get(); + int id = point->GetId(i); // index |i| is default for the id. if (point->HasId()) with_id++; points[id].id = id; @@ -806,7 +806,7 @@ points[id].SetPositionInScreen(point->GetX() * page_scale_factor_, point->GetY() * page_scale_factor_); } - if (with_id > 0 && with_id < touch_points->length()) { + if (with_id > 0 && with_id < touch_points->size()) { callback->sendFailure(Response::InvalidParams( "All or none of the provided TouchPoints must supply ids.")); return; @@ -913,7 +913,7 @@ SyntheticPointerActionParams::PointerActionType::PRESS || pointer_action_type == SyntheticPointerActionParams::PointerActionType::MOVE) && - touch_points->length() == 0) { + touch_points->empty()) { callback->sendFailure(Response::InvalidParams( "TouchStart and TouchMove must have at least one touch point.")); return; @@ -922,7 +922,7 @@ SyntheticPointerActionParams::PointerActionType::RELEASE || pointer_action_type == SyntheticPointerActionParams::PointerActionType::CANCEL) && - touch_points->length() > 0) { + !touch_points->empty()) { callback->sendFailure(Response::InvalidParams( "TouchEnd and TouchCancel must not have any touch points.")); return; @@ -963,9 +963,9 @@ size_t with_id = 0; gfx::PointF original; std::set<int> current_pointer_ids; - for (size_t i = 0; i < touch_points->length(); ++i) { - Input::TouchPoint* point = touch_points->get(i); - int id = point->GetId(i); + for (size_t i = 0; i < touch_points->size(); ++i) { + Input::TouchPoint* point = (*touch_points)[i].get(); + int id = point->GetId(i); // index |i| is default for the id. if (point->HasId()) with_id++; @@ -984,7 +984,7 @@ original = gfx::PointF(point->GetX(), point->GetY()); current_pointer_ids.insert(id); } - if (with_id > 0 && with_id < touch_points->length()) { + if (with_id > 0 && with_id < touch_points->size()) { callback->sendFailure(Response::InvalidParams( "All or none of the provided TouchPoints must supply ids.")); return;
diff --git a/content/browser/devtools/protocol/memory_handler.cc b/content/browser/devtools/protocol/memory_handler.cc index af4fcb5e..e54548c3 100644 --- a/content/browser/devtools/protocol/memory_handler.cc +++ b/content/browser/devtools/protocol/memory_handler.cc
@@ -37,29 +37,27 @@ Response MemoryHandler::GetBrowserSamplingProfile( std::unique_ptr<Memory::SamplingProfile>* out_profile) { base::ModuleCache module_cache; - std::unique_ptr<Array<Memory::SamplingProfileNode>> samples = - Array<Memory::SamplingProfileNode>::create(); + auto samples = std::make_unique<Array<Memory::SamplingProfileNode>>(); std::vector<base::SamplingHeapProfiler::Sample> raw_samples = base::SamplingHeapProfiler::Get()->GetSamples(0); for (auto& sample : raw_samples) { - std::unique_ptr<Array<String>> stack = Array<String>::create(); + auto stack = std::make_unique<Array<String>>(); for (const void* frame : sample.stack) { uintptr_t address = reinterpret_cast<uintptr_t>(frame); module_cache.GetModuleForAddress(address); // Populates module_cache. - stack->addItem(base::StringPrintf("0x%" PRIxPTR, address)); + stack->emplace_back(base::StringPrintf("0x%" PRIxPTR, address)); } - samples->addItem(Memory::SamplingProfileNode::Create() - .SetSize(sample.size) - .SetTotal(sample.total) - .SetStack(std::move(stack)) - .Build()); + samples->emplace_back(Memory::SamplingProfileNode::Create() + .SetSize(sample.size) + .SetTotal(sample.total) + .SetStack(std::move(stack)) + .Build()); } - std::unique_ptr<Array<Memory::Module>> modules = - Array<Memory::Module>::create(); + auto modules = std::make_unique<Array<Memory::Module>>(); for (const auto* module : module_cache.GetModules()) { - modules->addItem( + modules->emplace_back( Memory::Module::Create() .SetName(base::StringPrintf( "%" PRFilePath, module->GetDebugBasename().value().c_str()))
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index aa0d62ca..353d0559 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -154,7 +154,7 @@ auto cookies = std::make_unique<ProtocolCookieArray>(); for (const net::CanonicalCookie& cookie : cookie_list) - cookies->addItem(BuildCookie(cookie)); + cookies->emplace_back(BuildCookie(cookie)); return cookies; } @@ -287,7 +287,7 @@ ~CookieRetrieverNetworkService() { auto cookies = std::make_unique<ProtocolCookieArray>(); for (const auto& entry : all_cookies_) - cookies->addItem(BuildCookie(entry.second)); + cookies->emplace_back(BuildCookie(entry.second)); callback_->sendSuccess(std::move(cookies)); } @@ -511,10 +511,8 @@ std::vector<GURL> urls; if (protocol_urls.isJust()) { - std::unique_ptr<Array<std::string>> actual_urls = protocol_urls.takeJust(); - - for (size_t i = 0; i < actual_urls->length(); i++) - urls.push_back(GURL(actual_urls->get(i))); + for (const std::string& url : *protocol_urls.fromJust()) + urls.emplace_back(url); } else { base::queue<FrameTreeNode*> queue; queue.push(frame_host->frame_tree_node()); @@ -808,10 +806,10 @@ std::unique_ptr<Array<Network::SignedExchangeError>> BuildSignedExchangeErrors( const std::vector<SignedExchangeError>& errors) { - std::unique_ptr<Array<Network::SignedExchangeError>> signed_exchange_errors = - Array<Network::SignedExchangeError>::create(); + auto signed_exchange_errors = + std::make_unique<protocol::Array<Network::SignedExchangeError>>(); for (const auto& error : errors) - signed_exchange_errors->addItem(BuildSignedExchangeError(error)); + signed_exchange_errors->emplace_back(BuildSignedExchangeError(error)); return signed_exchange_errors; } @@ -1328,8 +1326,7 @@ } std::vector<std::unique_ptr<net::CanonicalCookie>> net_cookies; - for (size_t i = 0; i < cookies->length(); i++) { - Network::CookieParam* cookie = cookies->get(i); + for (const std::unique_ptr<Network::CookieParam>& cookie : *cookies) { std::unique_ptr<net::CanonicalCookie> net_cookie = MakeCookieFromProtocolValues( cookie->GetName(), cookie->GetValue(), cookie->GetUrl(""), @@ -1476,10 +1473,8 @@ const net::SSLInfo& ssl_info) { if (!ssl_info.cert) return nullptr; - std::unique_ptr< - protocol::Array<protocol::Network::SignedCertificateTimestamp>> - signed_certificate_timestamp_list = - protocol::Array<Network::SignedCertificateTimestamp>::create(); + auto signed_certificate_timestamp_list = + std::make_unique<protocol::Array<Network::SignedCertificateTimestamp>>(); for (auto const& sct : ssl_info.signed_certificate_timestamps) { std::unique_ptr<protocol::Network::SignedCertificateTimestamp> signed_certificate_timestamp = @@ -1499,17 +1494,15 @@ base::HexEncode(sct.sct->signature.signature_data.c_str(), sct.sct->signature.signature_data.length())) .Build(); - signed_certificate_timestamp_list->addItem( + signed_certificate_timestamp_list->emplace_back( std::move(signed_certificate_timestamp)); } std::vector<std::string> san_dns; std::vector<std::string> san_ip; ssl_info.cert->GetSubjectAltName(&san_dns, &san_ip); - std::unique_ptr<Array<String>> san_list = Array<String>::create(); - for (const std::string& san : san_dns) - san_list->addItem(san); + auto san_list = std::make_unique<protocol::Array<String>>(std::move(san_dns)); for (const std::string& san : san_ip) { - san_list->addItem( + san_list->emplace_back( net::IPAddress(reinterpret_cast<const uint8_t*>(san.data()), san.size()) .ToString()); } @@ -1847,8 +1840,8 @@ const SignedExchangeSignatureHeaderField::Signature& sig = envelope->signature(); - std::unique_ptr<Array<Network::SignedExchangeSignature>> signatures = - Array<Network::SignedExchangeSignature>::create(); + auto signatures = + std::make_unique<protocol::Array<Network::SignedExchangeSignature>>(); std::unique_ptr<Network::SignedExchangeSignature> signature = Network::SignedExchangeSignature::Create() .SetLabel(sig.label) @@ -1864,21 +1857,20 @@ sizeof(sig.cert_sha256->data))); } if (certificate) { - std::unique_ptr<Array<String>> encoded_certificates = - Array<String>::create(); - std::string encoded; + auto encoded_certificates = std::make_unique<protocol::Array<String>>(); + encoded_certificates->emplace_back(); base::Base64Encode( net::x509_util::CryptoBufferAsStringPiece(certificate->cert_buffer()), - &encoded); - encoded_certificates->addItem(std::move(encoded)); + &encoded_certificates->back()); for (const auto& cert : certificate->intermediate_buffers()) { + encoded_certificates->emplace_back(); base::Base64Encode( - net::x509_util::CryptoBufferAsStringPiece(cert.get()), &encoded); - encoded_certificates->addItem(std::move(encoded)); + net::x509_util::CryptoBufferAsStringPiece(cert.get()), + &encoded_certificates->back()); } signature->SetCertificates(std::move(encoded_certificates)); } - signatures->addItem(std::move(signature)); + signatures->emplace_back(std::move(signature)); signed_exchange_info->SetHeader( Network::SignedExchangeHeader::Create() @@ -1901,7 +1893,7 @@ DispatchResponse NetworkHandler::SetRequestInterception( std::unique_ptr<protocol::Array<protocol::Network::RequestPattern>> patterns) { - if (!patterns->length()) { + if (patterns->empty()) { interception_handle_.reset(); if (url_loader_interceptor_) { url_loader_interceptor_.reset(); @@ -1911,19 +1903,20 @@ } std::vector<DevToolsNetworkInterceptor::Pattern> interceptor_patterns; - for (size_t i = 0; i < patterns->length(); ++i) { + for (const std::unique_ptr<protocol::Network::RequestPattern>& pattern : + *patterns) { base::flat_set<ResourceType> resource_types; - std::string resource_type = patterns->get(i)->GetResourceType(""); + std::string resource_type = pattern->GetResourceType(""); if (!resource_type.empty()) { if (!AddInterceptedResourceType(resource_type, &resource_types)) { return Response::InvalidParams(base::StringPrintf( "Cannot intercept resources of type '%s'", resource_type.c_str())); } } - interceptor_patterns.push_back(DevToolsNetworkInterceptor::Pattern( - patterns->get(i)->GetUrlPattern("*"), std::move(resource_types), - ToInterceptorStage(patterns->get(i)->GetInterceptionStage( - protocol::Network::InterceptionStageEnum::Request)))); + interceptor_patterns.emplace_back( + pattern->GetUrlPattern("*"), std::move(resource_types), + ToInterceptorStage(pattern->GetInterceptionStage( + protocol::Network::InterceptionStageEnum::Request))); } if (!host_)
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 04c0ffcc..97d8387f 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -566,10 +566,10 @@ NavigationController& controller = web_contents->GetController(); *current_index = controller.GetCurrentEntryIndex(); - *entries = NavigationEntries::create(); + *entries = std::make_unique<NavigationEntries>(); for (int i = 0; i != controller.GetEntryCount(); ++i) { auto* entry = controller.GetEntryAtIndex(i); - (*entries)->addItem( + (*entries)->emplace_back( Page::NavigationEntry::Create() .SetId(entry->GetUniqueID()) .SetUrl(entry->GetURL().spec()) @@ -1113,18 +1113,17 @@ void PageHandler::GotManifest(std::unique_ptr<GetAppManifestCallback> callback, const GURL& manifest_url, blink::mojom::ManifestDebugInfoPtr debug_info) { - std::unique_ptr<Array<Page::AppManifestError>> errors = - Array<Page::AppManifestError>::create(); + auto errors = std::make_unique<protocol::Array<Page::AppManifestError>>(); bool failed = true; if (debug_info) { failed = false; for (const auto& error : debug_info->errors) { - errors->addItem(Page::AppManifestError::Create() - .SetMessage(error->message) - .SetCritical(error->critical) - .SetLine(error->line) - .SetColumn(error->column) - .Build()); + errors->emplace_back(Page::AppManifestError::Create() + .SetMessage(error->message) + .SetCritical(error->critical) + .SetLine(error->line) + .SetColumn(error->column) + .Build()); if (error->critical) failed = true; } @@ -1162,7 +1161,7 @@ void PageHandler::GetInstallabilityErrors( std::unique_ptr<GetInstallabilityErrorsCallback> callback) { - auto errors = protocol::Array<std::string>::create(); + auto errors = std::make_unique<protocol::Array<std::string>>(); // TODO: Use InstallableManager once it moves into content/. // Until then, this code is only used to return empty array in the tests. callback->sendSuccess(std::move(errors));
diff --git a/content/browser/devtools/protocol/schema_handler.cc b/content/browser/devtools/protocol/schema_handler.cc index 938fcc6..ef3e2d3 100644 --- a/content/browser/devtools/protocol/schema_handler.cc +++ b/content/browser/devtools/protocol/schema_handler.cc
@@ -34,12 +34,10 @@ "Log", "Runtime", "Debugger", "Profiler", "HeapProfiler", "Schema", "Target", "Overlay", "Performance", "Audits", "HeadlessExperimental"}; - *domains = protocol::Array<Schema::Domain>::create(); - for (size_t i = 0; i < base::size(kDomains); ++i) { - (*domains)->addItem(Schema::Domain::Create() - .SetName(kDomains[i]) - .SetVersion(kVersion) - .Build()); + *domains = std::make_unique<protocol::Array<Schema::Domain>>(); + for (const char* domain : kDomains) { + (*domains)->emplace_back( + Schema::Domain::Create().SetName(domain).SetVersion(kVersion).Build()); } return Response::OK(); }
diff --git a/content/browser/devtools/protocol/security_handler.cc b/content/browser/devtools/protocol/security_handler.cc index a6c87f6c..6a46ce4 100644 --- a/content/browser/devtools/protocol/security_handler.cc +++ b/content/browser/devtools/protocol/security_handler.cc
@@ -70,29 +70,25 @@ const std::vector<SecurityStyleExplanation>& explanations_to_add, Explanations* explanations) { for (const auto& it : explanations_to_add) { - std::unique_ptr<protocol::Array<String>> certificate = - protocol::Array<String>::create(); + auto certificate = std::make_unique<protocol::Array<String>>(); if (it.certificate) { - std::string encoded; + certificate->emplace_back(); base::Base64Encode(net::x509_util::CryptoBufferAsStringPiece( it.certificate->cert_buffer()), - &encoded); - certificate->addItem(encoded); + &certificate->back()); for (const auto& cert : it.certificate->intermediate_buffers()) { + certificate->emplace_back(); base::Base64Encode( - net::x509_util::CryptoBufferAsStringPiece(cert.get()), &encoded); - certificate->addItem(encoded); + net::x509_util::CryptoBufferAsStringPiece(cert.get()), + &certificate->back()); } } - std::unique_ptr<protocol::Array<String>> recommendations = - protocol::Array<String>::create(); - for (const auto& recommendation : it.recommendations) { - recommendations->addItem(recommendation); - } + auto recommendations = + std::make_unique<protocol::Array<String>>(it.recommendations); - explanations->addItem( + explanations->emplace_back( Security::SecurityStateExplanation::Create() .SetSecurityState(security_style) .SetTitle(it.title) @@ -158,7 +154,7 @@ const std::string security_state = SecurityStyleToProtocolSecurityState(security_style); - std::unique_ptr<Explanations> explanations = Explanations::create(); + auto explanations = std::make_unique<Explanations>(); AddExplanations(Security::SecurityStateEnum::Insecure, security_style_explanations.insecure_explanations, explanations.get());
diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc index 01b95114..593c377 100644 --- a/content/browser/devtools/protocol/service_worker_handler.cc +++ b/content/browser/devtools/protocol/service_worker_handler.cc
@@ -361,16 +361,16 @@ void ServiceWorkerHandler::OnWorkerRegistrationUpdated( const std::vector<ServiceWorkerRegistrationInfo>& registrations) { using Registration = ServiceWorker::ServiceWorkerRegistration; - std::unique_ptr<protocol::Array<Registration>> result = - protocol::Array<Registration>::create(); + auto result = std::make_unique<protocol::Array<Registration>>(); for (const auto& registration : registrations) { - result->addItem(Registration::Create() - .SetRegistrationId( - base::NumberToString(registration.registration_id)) - .SetScopeURL(registration.scope.spec()) - .SetIsDeleted(registration.delete_flag == - ServiceWorkerRegistrationInfo::IS_DELETED) - .Build()); + result->emplace_back( + Registration::Create() + .SetRegistrationId( + base::NumberToString(registration.registration_id)) + .SetScopeURL(registration.scope.spec()) + .SetIsDeleted(registration.delete_flag == + ServiceWorkerRegistrationInfo::IS_DELETED) + .Build()); } frontend_->WorkerRegistrationUpdated(std::move(result)); } @@ -378,8 +378,7 @@ void ServiceWorkerHandler::OnWorkerVersionUpdated( const std::vector<ServiceWorkerVersionInfo>& versions) { using Version = ServiceWorker::ServiceWorkerVersion; - std::unique_ptr<protocol::Array<Version>> result = - protocol::Array<Version>::create(); + auto result = std::make_unique<protocol::Array<Version>>(); for (const auto& version : versions) { base::flat_set<std::string> client_set; @@ -401,10 +400,9 @@ DevToolsAgentHost::GetOrCreateFor(web_contents)->GetId()); } } - std::unique_ptr<protocol::Array<std::string>> clients = - protocol::Array<std::string>::create(); - for (auto& c : client_set) - clients->addItem(c); + auto clients = std::make_unique<protocol::Array<std::string>>(); + for (std::string& client : client_set) + clients->emplace_back(std::move(client)); std::unique_ptr<Version> version_value = Version::Create() @@ -425,7 +423,7 @@ version.devtools_agent_route_id)); if (host) version_value->SetTargetId(host->GetId()); - result->addItem(std::move(version_value)); + result->emplace_back(std::move(version_value)); } frontend_->WorkerVersionUpdated(std::move(result)); }
diff --git a/content/browser/devtools/protocol/storage_handler.cc b/content/browser/devtools/protocol/storage_handler.cc index a6586fa..03c26a86 100644 --- a/content/browser/devtools/protocol/storage_handler.cc +++ b/content/browser/devtools/protocol/storage_handler.cc
@@ -60,8 +60,7 @@ Response::Error("Quota information is not available")); } - std::unique_ptr<Array<Storage::UsageForType>> usageList = - Array<Storage::UsageForType>::create(); + auto usageList = std::make_unique<Array<Storage::UsageForType>>(); blink::mojom::UsageBreakdown* breakdown_ptr = usage_breakdown.get(); for (const auto initializer : initializers) { @@ -70,7 +69,7 @@ .SetStorageType(initializer.type) .SetUsage(breakdown_ptr->*(initializer.usage_member)) .Build(); - usageList->addItem(std::move(entry)); + usageList->emplace_back(std::move(entry)); } callback->sendSuccess(usage, quota, std::move(usageList));
diff --git a/content/browser/devtools/protocol/system_info_handler.cc b/content/browser/devtools/protocol/system_info_handler.cc index 4fcc026a..9ca271f 100644 --- a/content/browser/devtools/protocol/system_info_handler.cc +++ b/content/browser/devtools/protocol/system_info_handler.cc
@@ -164,13 +164,13 @@ for (const auto subsampling : profile.subsamplings) { switch (subsampling) { case gpu::ImageDecodeAcceleratorSubsampling::k420: - subsamplings->addItem(SystemInfo::SubsamplingFormatEnum::Yuv420); + subsamplings->emplace_back(SystemInfo::SubsamplingFormatEnum::Yuv420); break; case gpu::ImageDecodeAcceleratorSubsampling::k422: - subsamplings->addItem(SystemInfo::SubsamplingFormatEnum::Yuv422); + subsamplings->emplace_back(SystemInfo::SubsamplingFormatEnum::Yuv422); break; case gpu::ImageDecodeAcceleratorSubsampling::k444: - subsamplings->addItem(SystemInfo::SubsamplingFormatEnum::Yuv444); + subsamplings->emplace_back(SystemInfo::SubsamplingFormatEnum::Yuv444); break; } } @@ -187,11 +187,10 @@ void SendGetInfoResponse(std::unique_ptr<GetInfoCallback> callback) { gpu::GPUInfo gpu_info = GpuDataManagerImpl::GetInstance()->GetGPUInfo(); - std::unique_ptr<protocol::Array<GPUDevice>> devices = - protocol::Array<GPUDevice>::create(); - devices->addItem(GPUDeviceToProtocol(gpu_info.gpu)); + auto devices = std::make_unique<protocol::Array<GPUDevice>>(); + devices->emplace_back(GPUDeviceToProtocol(gpu_info.gpu)); for (const auto& device : gpu_info.secondary_gpus) - devices->addItem(GPUDeviceToProtocol(device)); + devices->emplace_back(GPUDeviceToProtocol(device)); std::unique_ptr<protocol::DictionaryValue> aux_attributes = protocol::DictionaryValue::create(); @@ -207,32 +206,30 @@ protocol::DictionaryValue::cast( protocol::toProtocolValue(base_feature_status.get(), 1000)); - std::unique_ptr<protocol::Array<std::string>> driver_bug_workarounds = - protocol::Array<std::string>::create(); - for (const std::string& s : GetDriverBugWorkarounds()) - driver_bug_workarounds->addItem(s); + auto driver_bug_workarounds = + std::make_unique<protocol::Array<std::string>>(GetDriverBugWorkarounds()); - auto decoding_profiles = - protocol::Array<SystemInfo::VideoDecodeAcceleratorCapability>::create(); + auto decoding_profiles = std::make_unique< + protocol::Array<SystemInfo::VideoDecodeAcceleratorCapability>>(); for (const auto& profile : gpu_info.video_decode_accelerator_capabilities.supported_profiles) { - decoding_profiles->addItem( + decoding_profiles->emplace_back( VideoDecodeAcceleratorSupportedProfileToProtocol(profile)); } - auto encoding_profiles = - protocol::Array<SystemInfo::VideoEncodeAcceleratorCapability>::create(); + auto encoding_profiles = std::make_unique< + protocol::Array<SystemInfo::VideoEncodeAcceleratorCapability>>(); for (const auto& profile : gpu_info.video_encode_accelerator_supported_profiles) { - encoding_profiles->addItem( + encoding_profiles->emplace_back( VideoEncodeAcceleratorSupportedProfileToProtocol(profile)); } - auto image_profiles = - protocol::Array<SystemInfo::ImageDecodeAcceleratorCapability>::create(); + auto image_profiles = std::make_unique< + protocol::Array<SystemInfo::ImageDecodeAcceleratorCapability>>(); for (const auto& profile : gpu_info.image_decode_accelerator_supported_profiles) { - image_profiles->addItem( + image_profiles->emplace_back( ImageDecodeAcceleratorSupportedProfileToProtocol(profile)); } @@ -359,7 +356,8 @@ protocol::Array<protocol::SystemInfo::ProcessInfo>* process_info) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - process_info->addItem(MakeProcessInfo(base::Process::Current(), "browser")); + process_info->emplace_back( + MakeProcessInfo(base::Process::Current(), "browser")); } void AddRendererProcessInfo( @@ -370,7 +368,8 @@ !it.IsAtEnd(); it.Advance()) { RenderProcessHost* host = it.GetCurrentValue(); if (host->GetProcess().IsValid()) { - process_info->addItem(MakeProcessInfo(host->GetProcess(), "renderer")); + process_info->emplace_back( + MakeProcessInfo(host->GetProcess(), "renderer")); } } } @@ -385,7 +384,7 @@ const ChildProcessData& process_data = it.GetData(); const base::Process& process = process_data.GetProcess(); if (process.IsValid()) { - process_info->addItem( + process_info->emplace_back( MakeProcessInfo(process, process_data.metrics_name)); } } @@ -397,8 +396,8 @@ void SystemInfoHandler::GetProcessInfo( std::unique_ptr<GetProcessInfoCallback> callback) { - std::unique_ptr<protocol::Array<protocol::SystemInfo::ProcessInfo>> - process_info = protocol::Array<SystemInfo::ProcessInfo>::create(); + auto process_info = + std::make_unique<protocol::Array<SystemInfo::ProcessInfo>>(); // Collect browser and renderer processes info on the UI thread. AddBrowserProcessInfo(process_info.get());
diff --git a/content/browser/devtools/protocol/target_handler.cc b/content/browser/devtools/protocol/target_handler.cc index 6295cd7..310015b 100644 --- a/content/browser/devtools/protocol/target_handler.cc +++ b/content/browser/devtools/protocol/target_handler.cc
@@ -731,9 +731,9 @@ std::unique_ptr<protocol::Array<Target::TargetInfo>>* target_infos) { if (access_mode_ == AccessMode::kAutoAttachOnly) return Response::Error(kNotAllowedError); - *target_infos = protocol::Array<Target::TargetInfo>::create(); + *target_infos = std::make_unique<protocol::Array<Target::TargetInfo>>(); for (const auto& host : DevToolsAgentHost::GetOrCreateAll()) - (*target_infos)->addItem(CreateInfo(host.get())); + (*target_infos)->emplace_back(CreateInfo(host.get())); return Response::OK(); } @@ -816,7 +816,7 @@ delegate->GetBrowserContexts(); *browser_context_ids = std::make_unique<protocol::Array<protocol::String>>(); for (auto* context : contexts) - (*browser_context_ids)->addItem(context->UniqueId()); + (*browser_context_ids)->emplace_back(context->UniqueId()); return Response::OK(); }
diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc index 25bc114..7c85d7f9 100644 --- a/content/browser/devtools/protocol/tracing_handler.cc +++ b/content/browser/devtools/protocol/tracing_handler.cc
@@ -939,10 +939,8 @@ void TracingHandler::OnCategoriesReceived( std::unique_ptr<GetCategoriesCallback> callback, const std::set<std::string>& category_set) { - std::unique_ptr<protocol::Array<std::string>> categories = - protocol::Array<std::string>::create(); - for (const std::string& category : category_set) - categories->addItem(category); + auto categories = std::make_unique<protocol::Array<std::string>>( + category_set.begin(), category_set.end()); callback->sendSuccess(std::move(categories)); }
diff --git a/content/browser/devtools/protocol/webauthn_handler.cc b/content/browser/devtools/protocol/webauthn_handler.cc index 708fdfd..432e1de 100644 --- a/content/browser/devtools/protocol/webauthn_handler.cc +++ b/content/browser/devtools/protocol/webauthn_handler.cc
@@ -158,19 +158,20 @@ if (!response.isSuccess()) return response; - *out_credentials = Array<WebAuthn::Credential>::create(); + *out_credentials = std::make_unique<Array<WebAuthn::Credential>>(); for (const auto& credential : authenticator->registrations()) { const auto& rp_id_hash = credential.second.application_parameter; std::vector<uint8_t> private_key; credential.second.private_key->ExportPrivateKey(&private_key); (*out_credentials) - ->addItem(WebAuthn::Credential::Create() - .SetCredentialId(Binary::fromVector(credential.first)) - .SetRpIdHash(Binary::fromSpan(rp_id_hash.data(), - rp_id_hash.size())) - .SetPrivateKey(Binary::fromVector(std::move(private_key))) - .SetSignCount(credential.second.counter) - .Build()); + ->emplace_back( + WebAuthn::Credential::Create() + .SetCredentialId(Binary::fromVector(credential.first)) + .SetRpIdHash( + Binary::fromSpan(rp_id_hash.data(), rp_id_hash.size())) + .SetPrivateKey(Binary::fromVector(std::move(private_key))) + .SetSignCount(credential.second.counter) + .Build()); } return Response::OK(); }
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc index 6eedee9..9bfae65 100644 --- a/content/browser/download/download_browsertest.cc +++ b/content/browser/download/download_browsertest.cc
@@ -69,6 +69,7 @@ #include "net/test/embedded_test_server/http_response.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "ppapi/buildflags/buildflags.h" +#include "services/service_manager/public/cpp/connector.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/features.h" @@ -197,6 +198,7 @@ const std::string& client_guid, const GURL& source_url, const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, const RenameCompletionCallback& callback) override; private: @@ -274,10 +276,11 @@ const std::string& client_guid, const GURL& source_url, const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, const RenameCompletionCallback& callback) { DCHECK(download::GetDownloadTaskRunner()->RunsTasksInCurrentSequence()); download::DownloadFileImpl::RenameAndAnnotate( - full_path, client_guid, source_url, referrer_url, + full_path, client_guid, source_url, referrer_url, nullptr, base::Bind(DownloadFileWithDelay::RenameCallbackWrapper, owner_, callback)); }
diff --git a/content/browser/frame_host/frame_tree_browsertest.cc b/content/browser/frame_host/frame_tree_browsertest.cc index 0be281e1..5421001 100644 --- a/content/browser/frame_host/frame_tree_browsertest.cc +++ b/content/browser/frame_host/frame_tree_browsertest.cc
@@ -527,7 +527,7 @@ EXPECT_EQ(2U, root->child_count()); observer.Wait(); - EXPECT_EQ(GURL(kAboutSrcDocURL), root->child_at(1)->current_url()); + EXPECT_TRUE(root->child_at(1)->current_url().IsAboutSrcdoc()); EvalJsResult frame_origin = EvalJs(root->child_at(1), "self.origin"); EXPECT_EQ(root->current_frame_host()->GetLastCommittedURL().GetOrigin(), GURL(frame_origin.ExtractString())); @@ -544,7 +544,7 @@ EXPECT_TRUE(ExecJs(root, script)); observer.Wait(); - EXPECT_EQ(GURL(kAboutSrcDocURL), child->current_url()); + EXPECT_TRUE(child->current_url().IsAboutSrcdoc()); EXPECT_EQ( url::Origin::Create(root->current_frame_host()->GetLastCommittedURL()) .Serialize(),
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc index c48efc27..639f749 100644 --- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -3456,7 +3456,6 @@ // nested iframe. GURL main_url(embedded_test_server()->GetURL( "/navigation_controller/inject_iframe_srcdoc_with_nested_frame.html")); - GURL srcdoc_url(content::kAboutSrcDocURL); GURL inner_url( embedded_test_server()->GetURL("/navigation_controller/form.html")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -3471,7 +3470,7 @@ ASSERT_EQ(1U, root->child_at(0)->child_count()); ASSERT_EQ(0U, root->child_at(0)->child_at(0)->child_count()); EXPECT_EQ(main_url, root->current_url()); - EXPECT_EQ(srcdoc_url, root->child_at(0)->current_url()); + EXPECT_TRUE(root->child_at(0)->current_url().IsAboutSrcdoc()); EXPECT_EQ(inner_url, root->child_at(0)->child_at(0)->current_url()); EXPECT_EQ(1, controller.GetEntryCount()); @@ -3480,7 +3479,8 @@ // The entry should have FrameNavigationEntries for the subframes. ASSERT_EQ(1U, entry->root_node()->children.size()); - EXPECT_EQ(srcdoc_url, entry->root_node()->children[0]->frame_entry->url()); + EXPECT_TRUE( + entry->root_node()->children[0]->frame_entry->url().IsAboutSrcdoc()); EXPECT_EQ(inner_url, entry->root_node()->children[0]->children[0]->frame_entry->url()); @@ -3508,7 +3508,7 @@ ASSERT_EQ(1U, root->child_at(0)->child_count()); ASSERT_EQ(0U, root->child_at(0)->child_at(0)->child_count()); EXPECT_EQ(main_url, root->current_url()); - EXPECT_EQ(srcdoc_url, root->child_at(0)->current_url()); + EXPECT_TRUE(root->child_at(0)->current_url().IsAboutSrcdoc()); // Verify that the inner iframe went to the correct URL. EXPECT_EQ(inner_url, root->child_at(0)->child_at(0)->current_url()); @@ -3524,7 +3524,8 @@ ASSERT_EQ(1U, entry->root_node()->children.size()); // The entry should have FrameNavigationEntries for the subframes. - EXPECT_EQ(srcdoc_url, entry->root_node()->children[0]->frame_entry->url()); + EXPECT_TRUE( + entry->root_node()->children[0]->frame_entry->url().IsAboutSrcdoc()); EXPECT_EQ(inner_url, entry->root_node()->children[0]->children[0]->frame_entry->url());
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc index 0b40d95..b176f594 100644 --- a/content/browser/frame_host/navigation_controller_impl_unittest.cc +++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -4726,7 +4726,7 @@ } bool SrcDocRewriter(GURL* url, BrowserContext* browser_context) { - if (*url == GURL("about:srcdoc")) { + if (url->IsAboutSrcdoc()) { *url = GURL("chrome://srcdoc"); return true; }
diff --git a/content/browser/frame_host/navigation_handle_impl_browsertest.cc b/content/browser/frame_host/navigation_handle_impl_browsertest.cc index 34d19c7..02aab9b 100644 --- a/content/browser/frame_host/navigation_handle_impl_browsertest.cc +++ b/content/browser/frame_host/navigation_handle_impl_browsertest.cc
@@ -705,13 +705,13 @@ GURL url(embedded_test_server()->GetURL( "/frame_tree/page_with_srcdoc_frame.html")); NavigationHandleObserver observer(shell()->web_contents(), - GURL(kAboutSrcDocURL)); + GURL("about:srcdoc")); EXPECT_TRUE(NavigateToURL(shell(), url)); EXPECT_TRUE(observer.has_committed()); EXPECT_FALSE(observer.is_error()); - EXPECT_EQ(GURL(kAboutSrcDocURL), observer.last_committed_url()); + EXPECT_TRUE(observer.last_committed_url().IsAboutSrcdoc()); } // Ensure that the IsSameDocument() method on NavigationHandle behaves
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc index be24ce1c..1a54254 100644 --- a/content/browser/frame_host/render_frame_host_manager.cc +++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -67,8 +67,7 @@ namespace { bool IsDataOrAbout(const GURL& url) { - GURL about_srcdoc(content::kAboutSrcDocURL); - return url == about_srcdoc || url.IsAboutBlank() || + return url.IsAboutSrcdoc() || url.IsAboutBlank() || url.scheme() == url::kDataScheme; } @@ -2809,8 +2808,7 @@ // arbitary requests to those URLs using the chrome.webRequest or // chrome.declarativeWebRequest API, which will end up here (for an // example, see ExtensionWebRequestApiTest.WebRequestDeclarative1).) - if (resolved_url.IsAboutBlank() || - resolved_url == GURL(content::kAboutSrcDocURL)) { + if (resolved_url.IsAboutBlank() || resolved_url.IsAboutSrcdoc()) { return false; } }
diff --git a/content/browser/hyphenation/hyphenation_impl.cc b/content/browser/hyphenation/hyphenation_impl.cc index aa05d6ba..35e84f0 100644 --- a/content/browser/hyphenation/hyphenation_impl.cc +++ b/content/browser/hyphenation/hyphenation_impl.cc
@@ -15,7 +15,6 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/task/post_task.h" -#include "base/timer/elapsed_timer.h" #include "mojo/public/cpp/bindings/strong_binding.h" namespace { @@ -46,9 +45,7 @@ #endif std::string filename = base::StringPrintf("hyph-%s.hyb", locale.c_str()); base::FilePath path = dir.AppendASCII(filename); - base::ElapsedTimer timer; file.Initialize(path, base::File::FLAG_OPEN | base::File::FLAG_READ); - UMA_HISTOGRAM_TIMES("Hyphenation.Open.File", timer.Elapsed()); return file.Duplicate(); }
diff --git a/content/browser/loader/cross_site_document_blocking_browsertest.cc b/content/browser/loader/cross_site_document_blocking_browsertest.cc index 82b6a80..76f7816b 100644 --- a/content/browser/loader/cross_site_document_blocking_browsertest.cc +++ b/content/browser/loader/cross_site_document_blocking_browsertest.cc
@@ -63,7 +63,6 @@ enum CorbExpectations { kShouldBeBlocked = 1 << 0, kShouldBeSniffed = 1 << 1, - kShouldLogContentLengthUma = 1 << 2, kShouldBeAllowedWithoutSniffing = 0, kShouldBeBlockedWithoutSniffing = kShouldBeBlocked, @@ -71,11 +70,6 @@ kShouldBeSniffedAndBlocked = kShouldBeSniffed | kShouldBeBlocked, }; -CorbExpectations operator|(CorbExpectations a, CorbExpectations b) { - return static_cast<CorbExpectations>(static_cast<int>(a) | - static_cast<int>(b)); -} - std::ostream& operator<<(std::ostream& os, const CorbExpectations& value) { if (value == 0) { os << "(none)"; @@ -87,8 +81,6 @@ os << "kShouldBeBlocked "; if (0 != (value & kShouldBeSniffed)) os << "kShouldBeSniffed "; - if (0 != (value & kShouldLogContentLengthUma)) - os << "kShouldLogContentLengthUma "; os << ")"; return os; } @@ -154,8 +146,6 @@ (0 != (expectations & kShouldBeBlocked)) && !is_restricted_uma_expected) { expected_counts[base + ".BlockedForParserBreaker"] = 1; } - if (0 != (expectations & kShouldBeSniffed)) - expected_counts[base + ".BytesReadForSniffing"] = 1; if (0 != (expectations & kShouldBeBlocked && !is_restricted_uma_expected)) { expected_counts[base + ".Blocked"] = 1; if (!bucket.empty()) @@ -163,14 +153,6 @@ } if (0 != (expectations & kShouldBeBlocked)) { expected_counts[base + ".Blocked.CanonicalMimeType"] = 1; - expected_counts[base + ".Blocked.ContentLength.WasAvailable"] = 1; - bool should_have_content_length = - 0 != (expectations & kShouldLogContentLengthUma); - histograms.ExpectBucketCount(base + ".Blocked.ContentLength.WasAvailable", - should_have_content_length, 1); - - if (should_have_content_length) - expected_counts[base + ".Blocked.ContentLength.ValueIfAvailable"] = 1; } // Make sure that the expected metrics, and only those metrics, were @@ -585,8 +567,7 @@ "nosniff.json-prefixed.js"}; for (const char* resource : blocked_resources) { SCOPED_TRACE(base::StringPrintf("... while testing page: %s", resource)); - VerifyImgRequest(resource, - kShouldBeSniffedAndBlocked | kShouldLogContentLengthUma); + VerifyImgRequest(resource, kShouldBeSniffedAndBlocked); } // These files should be disallowed without sniffing. @@ -834,8 +815,7 @@ // Verify that the response completed successfully, was blocked and was logged // as having initially a non-empty body. - interceptor.Verify(kShouldBeBlockedWithoutSniffing | - kShouldLogContentLengthUma); + interceptor.Verify(kShouldBeBlockedWithoutSniffing); // Verify that most response headers have been removed by CORB. const std::string& headers = @@ -925,8 +905,7 @@ // only possible when NetworkService is enabled). if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { interceptor.WaitForRequestCompletion(); - interceptor.Verify(kShouldBeBlockedWithoutSniffing | - kShouldLogContentLengthUma); + interceptor.Verify(kShouldBeBlockedWithoutSniffing); } // Wait for fetch result (really needed only without NetworkService, if no
diff --git a/content/browser/loader/cross_site_document_resource_handler_unittest.cc b/content/browser/loader/cross_site_document_resource_handler_unittest.cc index c0b60b7..64a18012 100644 --- a/content/browser/loader/cross_site_document_resource_handler_unittest.cc +++ b/content/browser/loader/cross_site_document_resource_handler_unittest.cc
@@ -1601,24 +1601,9 @@ testing::ElementsAre(base::Bucket(start_action, 1), base::Bucket(end_action, 1))) << "Should have incremented the right actions."; - // Expect to hear the number of bytes in the first read when sniffing is - // required. - if (expected_to_sniff) { - expected_counts[histogram_base + ".BytesReadForSniffing"] = 1; - - // Only the packets up to verdict_packet are sniffed. - int expected_sniff_bytes = 0; - for (int i = 0; i <= effective_verdict_packet; i++) { - expected_sniff_bytes += strlen(packets_vector[i]); - } - EXPECT_EQ( - 1, histograms.GetBucketCount(histogram_base + ".BytesReadForSniffing", - expected_sniff_bytes)); - } if (should_be_blocked) { expected_counts[histogram_base + ".Blocked"] = 1; expected_counts[histogram_base + ".Blocked.CanonicalMimeType"] = 1; - expected_counts[histogram_base + ".Blocked.ContentLength.WasAvailable"] = 1; expected_counts[histogram_base + ".Blocked." + bucket] = 1; EXPECT_THAT(histograms.GetAllSamples(histogram_base + ".Blocked"), testing::ElementsAre(
diff --git a/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc b/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc index 0075be2..73768c5 100644 --- a/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc +++ b/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc
@@ -8,7 +8,6 @@ #include "ui/aura/window_tree_host.h" #include "ui/base/cursor/cursor.h" #include "ui/base/cursor/cursor_loader.h" -#include "ui/base/cursor/cursor_type.h" #include "ui/events/event.h" #include "ui/events/event_handler.h" #include "ui/wm/public/activation_client.h" @@ -208,8 +207,8 @@ observer_->StopTracking(); - // The default cursor is ui::CursorType::kNone. Make it kPointer so the tests - // have a non-empty cursor bitmap to work with. + // The default cursor is ui::CursorType::kNone. Make it kPointer + // so the tests have a non-empty cursor bitmap to work with. auto* const window = Observer::GetTargetWindow(observer_); CHECK(window); auto* const host = window->GetHost();
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index 716a27c..5f94e9c 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc
@@ -1519,37 +1519,14 @@ std::unique_ptr<PreviewsStateContentBrowserClient> client_; }; -// Test that navigating calls GetPreviewsState with SERVER_LOFI_ON. -IN_PROC_BROWSER_TEST_F(PreviewsStateBrowserTest, ShouldEnableLoFiModeOn) { - // Navigate with LoFi on. - Reset(SERVER_LOFI_ON); - NavigateToURLBlockUntilNavigationsComplete( - shell(), embedded_test_server()->GetURL("/title1.html"), 1); - CheckResourcesRequested(); -} - // Test that navigating calls GetPreviewsState returning PREVIEWS_OFF. -IN_PROC_BROWSER_TEST_F(PreviewsStateBrowserTest, ShouldEnableLoFiModeOff) { +IN_PROC_BROWSER_TEST_F(PreviewsStateBrowserTest, ShouldEnablePreviewsOff) { // Navigate with No Previews. NavigateToURLBlockUntilNavigationsComplete( shell(), embedded_test_server()->GetURL("/title1.html"), 1); CheckResourcesRequested(); } -// Test that reloading calls GetPreviewsState again and changes the Previews -// state. -IN_PROC_BROWSER_TEST_F(PreviewsStateBrowserTest, ShouldEnableLoFiModeReload) { - // Navigate with GetPreviewsState returning PREVIEWS_OFF. - NavigateToURLBlockUntilNavigationsComplete( - shell(), embedded_test_server()->GetURL("/title1.html"), 1); - CheckResourcesRequested(); - - // Reload. GetPreviewsState should be called. - Reset(SERVER_LOFI_ON); - ReloadBlockUntilNavigationsComplete(shell(), 1); - CheckResourcesRequested(); -} - // Ensure the renderer process doesn't send too many IPC to the browser process // when history.pushState() and history.back() are called in a loop. // Failing to do so causes the browser to become unresponsive.
diff --git a/content/browser/navigation_mhtml_browsertest.cc b/content/browser/navigation_mhtml_browsertest.cc index a9722a9..2a440a79 100644 --- a/content/browser/navigation_mhtml_browsertest.cc +++ b/content/browser/navigation_mhtml_browsertest.cc
@@ -229,7 +229,7 @@ ASSERT_EQ(1u, main_document->child_count()); RenderFrameHostImpl* sub_document = main_document->child_at(0)->current_frame_host(); - EXPECT_EQ(GURL("about:srcdoc"), sub_document->GetLastCommittedURL()); + EXPECT_TRUE(sub_document->GetLastCommittedURL().IsAboutSrcdoc()); // Check the iframe is properly loaded. EvalJs("document.body.innerHTML") // can't be used, because javascript is disabled. Instead, check it was able @@ -252,7 +252,7 @@ ASSERT_EQ(1u, main_document->child_count()); RenderFrameHostImpl* sub_document = main_document->child_at(0)->current_frame_host(); - EXPECT_EQ(GURL("about:srcdoc"), sub_document->GetLastCommittedURL()); + EXPECT_TRUE(sub_document->GetLastCommittedURL().IsAboutSrcdoc()); // Check the iframe is properly loaded. EvalJs("document.body.innerHTML") // can't be used, because javascript is disabled. Instead, check it was able
diff --git a/content/browser/renderer_host/cursor_manager_unittest.cc b/content/browser/renderer_host/cursor_manager_unittest.cc index b9e6f97..ccecf4ec 100644 --- a/content/browser/renderer_host/cursor_manager_unittest.cc +++ b/content/browser/renderer_host/cursor_manager_unittest.cc
@@ -130,7 +130,7 @@ // The view should be using the default cursor. EXPECT_EQ(top_view_->cursor(), WebCursor()); - CursorInfo cursor_info(blink::WebCursorInfo::kTypeHand); + CursorInfo cursor_info(ui::CursorType::kHand); WebCursor cursor_hand(cursor_info); // Update the view with a non-default cursor. @@ -147,7 +147,7 @@ std::unique_ptr<MockRenderWidgetHostViewForCursors> child_view( new MockRenderWidgetHostViewForCursors(widget_host.get(), false)); - CursorInfo cursor_info(blink::WebCursorInfo::kTypeHand); + CursorInfo cursor_info(ui::CursorType::kHand); WebCursor cursor_hand(cursor_info); // Set the child frame's cursor to a hand. This should not propagate to the @@ -175,13 +175,13 @@ std::unique_ptr<MockRenderWidgetHostViewForCursors> child_view2( new MockRenderWidgetHostViewForCursors(widget_host2.get(), false)); - CursorInfo cursor_info_hand(blink::WebCursorInfo::kTypeHand); + CursorInfo cursor_info_hand(ui::CursorType::kHand); WebCursor cursor_hand(cursor_info_hand); - CursorInfo cursor_info_cross(blink::WebCursorInfo::kTypeCross); + CursorInfo cursor_info_cross(ui::CursorType::kCross); WebCursor cursor_cross(cursor_info_cross); - CursorInfo cursor_info_pointer(blink::WebCursorInfo::kTypePointer); + CursorInfo cursor_info_pointer(ui::CursorType::kPointer); WebCursor cursor_pointer(cursor_info_pointer); // Initialize each View to a different cursor.
diff --git a/content/browser/renderer_host/input/touch_emulator.cc b/content/browser/renderer_host/input/touch_emulator.cc index 0fa780b6..26498b6 100644 --- a/content/browser/renderer_host/input/touch_emulator.cc +++ b/content/browser/renderer_host/input/touch_emulator.cc
@@ -158,7 +158,7 @@ use_2x ? IDR_DEVTOOLS_PINCH_CURSOR_ICON_2X : IDR_DEVTOOLS_PINCH_CURSOR_ICON); - pointer_cursor_ = WebCursor(CursorInfo(blink::WebCursorInfo::kTypePointer)); + pointer_cursor_ = WebCursor(CursorInfo(ui::CursorType::kPointer)); return true; } @@ -167,7 +167,7 @@ gfx::Image& cursor_image = content::GetContentClient()->GetNativeImageNamed(resource_id); CursorInfo cursor_info; - cursor_info.type = blink::WebCursorInfo::kTypeCustom; + cursor_info.type = ui::CursorType::kCustom; cursor_info.image_scale_factor = scale; cursor_info.custom_image = cursor_image.AsBitmap(); cursor_info.hotspot =
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 8c00e392..61ea618 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -545,7 +545,8 @@ void RenderWidgetHostViewAndroid::UpdateCursor(const WebCursor& cursor) { const CursorInfo& info = cursor.info(); - view_.OnCursorChanged(info.type, info.custom_image, info.hotspot); + view_.OnCursorChanged(static_cast<int>(info.type), info.custom_image, + info.hotspot); } void RenderWidgetHostViewAndroid::SetIsLoading(bool is_loading) {
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index a7bd3e3..5ad48024 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -7839,8 +7839,7 @@ } ASSERT_EQ(1U, new_root->child_count()); EXPECT_EQ(main_url, new_root->current_url()); - EXPECT_EQ(GURL(content::kAboutSrcDocURL), - new_root->child_at(0)->current_url()); + EXPECT_TRUE(new_root->child_at(0)->current_url().IsAboutSrcdoc()); EXPECT_EQ(new_root->current_frame_host()->GetSiteInstance(), new_root->child_at(0)->current_frame_host()->GetSiteInstance()); @@ -9009,7 +9008,6 @@ "a.com", "/cross_site_iframe_factory.html?a(b)")); GURL child_url(embedded_test_server()->GetURL( "b.com", "/cross_site_iframe_factory.html?b()")); - GURL srcdoc_url(kAboutSrcDocURL); // #1 Navigate to a page with a cross-site iframe. EXPECT_TRUE(NavigateToURL(shell(), parent_url)); @@ -9032,7 +9030,7 @@ load_observer.Wait(); // Ensure that the iframe reuses its parent's process. - EXPECT_EQ(srcdoc_url, child->current_url()); + EXPECT_TRUE(child->current_url().IsAboutSrcdoc()); EXPECT_EQ(root->current_frame_host()->GetSiteInstance(), child->current_frame_host()->GetSiteInstance()); EXPECT_EQ(root->current_frame_host()->GetProcess(),
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc index f72407a..91427708 100644 --- a/content/browser/site_per_process_hit_test_browsertest.cc +++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -3894,7 +3894,7 @@ EXPECT_TRUE( root_view->GetCursorManager()->GetCursorForTesting(child_view, cursor)); // Since this moused over a text box, this should not be the default cursor. - EXPECT_EQ(cursor.info().type, blink::WebCursorInfo::kTypeIBeam); + EXPECT_EQ(cursor.info().type, ui::CursorType::kIBeam); } } // namespace
diff --git a/content/common/common_param_traits_unittest.cc b/content/common/common_param_traits_unittest.cc index 74c2bad..cfb0e5d 100644 --- a/content/common/common_param_traits_unittest.cc +++ b/content/common/common_param_traits_unittest.cc
@@ -304,7 +304,7 @@ } TEST(IPCMessageTest, WebCursor) { - content::CursorInfo info(blink::WebCursorInfo::kTypeCustom); + content::CursorInfo info(ui::CursorType::kCustom); info.custom_image.allocN32Pixels(32, 32); info.hotspot = gfx::Point(10, 20); info.image_scale_factor = 1.5f;
diff --git a/content/common/content_param_traits.cc b/content/common/content_param_traits.cc index 2791cb8..09dc04c 100644 --- a/content/common/content_param_traits.cc +++ b/content/common/content_param_traits.cc
@@ -31,7 +31,7 @@ void ParamTraits<content::WebCursor>::Write(base::Pickle* m, const param_type& p) { WriteParam(m, p.info().type); - if (p.info().type == blink::WebCursorInfo::kTypeCustom) { + if (p.info().type == ui::CursorType::kCustom) { WriteParam(m, p.info().hotspot); WriteParam(m, p.info().image_scale_factor); WriteParam(m, p.info().custom_image); @@ -45,7 +45,7 @@ if (!ReadParam(m, iter, &info.type)) return false; - if (info.type == blink::WebCursorInfo::kTypeCustom && + if (info.type == ui::CursorType::kCustom && (!ReadParam(m, iter, &info.hotspot) || !ReadParam(m, iter, &info.image_scale_factor) || !ReadParam(m, iter, &info.custom_image))) {
diff --git a/content/common/content_param_traits_macros.h b/content/common/content_param_traits_macros.h index 815f068..58b0ac4 100644 --- a/content/common/content_param_traits_macros.h +++ b/content/common/content_param_traits_macros.h
@@ -39,8 +39,7 @@ blink::kWebContentSecurityPolicySourceLast) IPC_ENUM_TRAITS_MAX_VALUE(blink::mojom::ContentSecurityPolicyType, blink::mojom::ContentSecurityPolicyType::kMaxValue) -IPC_ENUM_TRAITS_MAX_VALUE(blink::WebCursorInfo::Type, - blink::WebCursorInfo::Type::kTypeMaxValue) +IPC_ENUM_TRAITS_MAX_VALUE(ui::CursorType, ui::CursorType::kMaxValue) IPC_ENUM_TRAITS_MIN_MAX_VALUE(blink::WebInputEvent::Type, blink::WebInputEvent::kTypeFirst, blink::WebInputEvent::kTypeLast)
diff --git a/content/common/cursors/webcursor.cc b/content/common/cursors/webcursor.cc index 3d7c97a..2f5f76a9 100644 --- a/content/common/cursors/webcursor.cc +++ b/content/common/cursors/webcursor.cc
@@ -43,7 +43,7 @@ info_ = info; // Clamp the hotspot to the custom image's dimensions. - if (info_.type == blink::WebCursorInfo::kTypeCustom) { + if (info_.type == ui::CursorType::kCustom) { info_.hotspot.set_x(std::max( 0, std::min(info_.custom_image.width() - 1, info_.hotspot.x()))); info_.hotspot.set_y(std::max(
diff --git a/content/common/cursors/webcursor_aura.cc b/content/common/cursors/webcursor_aura.cc index 5a3b5c0..1ca7692 100644 --- a/content/common/cursors/webcursor_aura.cc +++ b/content/common/cursors/webcursor_aura.cc
@@ -9,118 +9,22 @@ #include "ui/base/cursor/cursor.h" #include "ui/base/cursor/cursor_util.h" -using blink::WebCursorInfo; - namespace content { gfx::NativeCursor WebCursor::GetNativeCursor() { - switch (info_.type) { - case WebCursorInfo::kTypePointer: - return ui::CursorType::kPointer; - case WebCursorInfo::kTypeCross: - return ui::CursorType::kCross; - case WebCursorInfo::kTypeHand: - return ui::CursorType::kHand; - case WebCursorInfo::kTypeIBeam: - return ui::CursorType::kIBeam; - case WebCursorInfo::kTypeWait: - return ui::CursorType::kWait; - case WebCursorInfo::kTypeHelp: - return ui::CursorType::kHelp; - case WebCursorInfo::kTypeEastResize: - return ui::CursorType::kEastResize; - case WebCursorInfo::kTypeNorthResize: - return ui::CursorType::kNorthResize; - case WebCursorInfo::kTypeNorthEastResize: - return ui::CursorType::kNorthEastResize; - case WebCursorInfo::kTypeNorthWestResize: - return ui::CursorType::kNorthWestResize; - case WebCursorInfo::kTypeSouthResize: - return ui::CursorType::kSouthResize; - case WebCursorInfo::kTypeSouthEastResize: - return ui::CursorType::kSouthEastResize; - case WebCursorInfo::kTypeSouthWestResize: - return ui::CursorType::kSouthWestResize; - case WebCursorInfo::kTypeWestResize: - return ui::CursorType::kWestResize; - case WebCursorInfo::kTypeNorthSouthResize: - return ui::CursorType::kNorthSouthResize; - case WebCursorInfo::kTypeEastWestResize: - return ui::CursorType::kEastWestResize; - case WebCursorInfo::kTypeNorthEastSouthWestResize: - return ui::CursorType::kNorthEastSouthWestResize; - case WebCursorInfo::kTypeNorthWestSouthEastResize: - return ui::CursorType::kNorthWestSouthEastResize; - case WebCursorInfo::kTypeColumnResize: - return ui::CursorType::kColumnResize; - case WebCursorInfo::kTypeRowResize: - return ui::CursorType::kRowResize; - case WebCursorInfo::kTypeMiddlePanning: - return ui::CursorType::kMiddlePanning; - case WebCursorInfo::kTypeMiddlePanningVertical: - return ui::CursorType::kMiddlePanningVertical; - case WebCursorInfo::kTypeMiddlePanningHorizontal: - return ui::CursorType::kMiddlePanningHorizontal; - case WebCursorInfo::kTypeEastPanning: - return ui::CursorType::kEastPanning; - case WebCursorInfo::kTypeNorthPanning: - return ui::CursorType::kNorthPanning; - case WebCursorInfo::kTypeNorthEastPanning: - return ui::CursorType::kNorthEastPanning; - case WebCursorInfo::kTypeNorthWestPanning: - return ui::CursorType::kNorthWestPanning; - case WebCursorInfo::kTypeSouthPanning: - return ui::CursorType::kSouthPanning; - case WebCursorInfo::kTypeSouthEastPanning: - return ui::CursorType::kSouthEastPanning; - case WebCursorInfo::kTypeSouthWestPanning: - return ui::CursorType::kSouthWestPanning; - case WebCursorInfo::kTypeWestPanning: - return ui::CursorType::kWestPanning; - case WebCursorInfo::kTypeMove: - return ui::CursorType::kMove; - case WebCursorInfo::kTypeVerticalText: - return ui::CursorType::kVerticalText; - case WebCursorInfo::kTypeCell: - return ui::CursorType::kCell; - case WebCursorInfo::kTypeContextMenu: - return ui::CursorType::kContextMenu; - case WebCursorInfo::kTypeAlias: - return ui::CursorType::kAlias; - case WebCursorInfo::kTypeProgress: - return ui::CursorType::kProgress; - case WebCursorInfo::kTypeNoDrop: - return ui::CursorType::kNoDrop; - case WebCursorInfo::kTypeCopy: - return ui::CursorType::kCopy; - case WebCursorInfo::kTypeNone: - return ui::CursorType::kNone; - case WebCursorInfo::kTypeNotAllowed: - return ui::CursorType::kNotAllowed; - case WebCursorInfo::kTypeZoomIn: - return ui::CursorType::kZoomIn; - case WebCursorInfo::kTypeZoomOut: - return ui::CursorType::kZoomOut; - case WebCursorInfo::kTypeGrab: - return ui::CursorType::kGrab; - case WebCursorInfo::kTypeGrabbing: - return ui::CursorType::kGrabbing; - case WebCursorInfo::kTypeCustom: { - ui::Cursor cursor(ui::CursorType::kCustom); - SkBitmap bitmap; - gfx::Point hotspot; - float scale; - CreateScaledBitmapAndHotspotFromCustomData(&bitmap, &hotspot, &scale); - cursor.set_custom_bitmap(bitmap); - cursor.set_custom_hotspot(hotspot); - cursor.set_device_scale_factor(scale); - cursor.SetPlatformCursor(GetPlatformCursor(cursor)); - return cursor; - } - default: - NOTREACHED(); - return gfx::kNullCursor; + if (info_.type == ui::CursorType::kCustom) { + ui::Cursor cursor(ui::CursorType::kCustom); + SkBitmap bitmap; + gfx::Point hotspot; + float scale; + CreateScaledBitmapAndHotspotFromCustomData(&bitmap, &hotspot, &scale); + cursor.set_custom_bitmap(bitmap); + cursor.set_custom_hotspot(hotspot); + cursor.set_device_scale_factor(scale); + cursor.SetPlatformCursor(GetPlatformCursor(cursor)); + return cursor; } + return info_.type; } void WebCursor::CreateScaledBitmapAndHotspotFromCustomData(SkBitmap* bitmap,
diff --git a/content/common/cursors/webcursor_aurawin.cc b/content/common/cursors/webcursor_aurawin.cc index 0fb5ee6..435b85c 100644 --- a/content/common/cursors/webcursor_aurawin.cc +++ b/content/common/cursors/webcursor_aurawin.cc
@@ -12,7 +12,7 @@ namespace content { ui::PlatformCursor WebCursor::GetPlatformCursor(const ui::Cursor& cursor) { - if (info_.type != blink::WebCursorInfo::kTypeCustom) + if (info_.type != ui::CursorType::kCustom) return LoadCursor(nullptr, IDC_ARROW); if (platform_cursor_)
diff --git a/content/common/cursors/webcursor_mac.mm b/content/common/cursors/webcursor_mac.mm index cd5ebb3..5227138 100644 --- a/content/common/cursors/webcursor_mac.mm +++ b/content/common/cursors/webcursor_mac.mm
@@ -19,7 +19,6 @@ #include "ui/gfx/geometry/size_conversions.h" #include "ui/gfx/image/image.h" -using blink::WebCursorInfo; using blink::WebSize; // Private interface to CoreCursor, as of Mac OS X 10.7. This is essentially the @@ -159,112 +158,119 @@ // Match Safari's cursor choices; see platform/mac/CursorMac.mm . gfx::NativeCursor WebCursor::GetNativeCursor() { switch (info_.type) { - case WebCursorInfo::kTypePointer: + case ui::CursorType::kPointer: return [NSCursor arrowCursor]; - case WebCursorInfo::kTypeCross: + case ui::CursorType::kCross: return [NSCursor crosshairCursor]; - case WebCursorInfo::kTypeHand: + case ui::CursorType::kHand: return [NSCursor pointingHandCursor]; - case WebCursorInfo::kTypeIBeam: + case ui::CursorType::kIBeam: return [NSCursor IBeamCursor]; - case WebCursorInfo::kTypeWait: + case ui::CursorType::kWait: return GetCoreCursorWithFallback(kBusyButClickableCursor, IDR_WAIT_CURSOR, 7, 7); - case WebCursorInfo::kTypeHelp: + case ui::CursorType::kHelp: return GetCoreCursorWithFallback(kHelpCursor, IDR_HELP_CURSOR, 8, 8); - case WebCursorInfo::kTypeEastResize: - case WebCursorInfo::kTypeEastPanning: + case ui::CursorType::kEastResize: + case ui::CursorType::kEastPanning: return GetCoreCursorWithFallback(kResizeEastCursor, IDR_EAST_RESIZE_CURSOR, 14, 7); - case WebCursorInfo::kTypeNorthResize: - case WebCursorInfo::kTypeNorthPanning: + case ui::CursorType::kNorthResize: + case ui::CursorType::kNorthPanning: return GetCoreCursorWithFallback(kResizeNorthCursor, IDR_NORTH_RESIZE_CURSOR, 7, 1); - case WebCursorInfo::kTypeNorthEastResize: - case WebCursorInfo::kTypeNorthEastPanning: + case ui::CursorType::kNorthEastResize: + case ui::CursorType::kNorthEastPanning: return GetCoreCursorWithFallback(kResizeNortheastCursor, IDR_NORTHEAST_RESIZE_CURSOR, 14, 1); - case WebCursorInfo::kTypeNorthWestResize: - case WebCursorInfo::kTypeNorthWestPanning: + case ui::CursorType::kNorthWestResize: + case ui::CursorType::kNorthWestPanning: return GetCoreCursorWithFallback(kResizeNorthwestCursor, IDR_NORTHWEST_RESIZE_CURSOR, 0, 0); - case WebCursorInfo::kTypeSouthResize: - case WebCursorInfo::kTypeSouthPanning: + case ui::CursorType::kSouthResize: + case ui::CursorType::kSouthPanning: return GetCoreCursorWithFallback(kResizeSouthCursor, IDR_SOUTH_RESIZE_CURSOR, 7, 14); - case WebCursorInfo::kTypeSouthEastResize: - case WebCursorInfo::kTypeSouthEastPanning: + case ui::CursorType::kSouthEastResize: + case ui::CursorType::kSouthEastPanning: return GetCoreCursorWithFallback(kResizeSoutheastCursor, IDR_SOUTHEAST_RESIZE_CURSOR, 14, 14); - case WebCursorInfo::kTypeSouthWestResize: - case WebCursorInfo::kTypeSouthWestPanning: + case ui::CursorType::kSouthWestResize: + case ui::CursorType::kSouthWestPanning: return GetCoreCursorWithFallback(kResizeSouthwestCursor, IDR_SOUTHWEST_RESIZE_CURSOR, 1, 14); - case WebCursorInfo::kTypeWestResize: - case WebCursorInfo::kTypeWestPanning: + case ui::CursorType::kWestResize: + case ui::CursorType::kWestPanning: return GetCoreCursorWithFallback(kResizeWestCursor, IDR_WEST_RESIZE_CURSOR, 1, 7); - case WebCursorInfo::kTypeNorthSouthResize: + case ui::CursorType::kNorthSouthResize: return GetCoreCursorWithFallback(kResizeNorthSouthCursor, IDR_NORTHSOUTH_RESIZE_CURSOR, 7, 7); - case WebCursorInfo::kTypeEastWestResize: + case ui::CursorType::kEastWestResize: return GetCoreCursorWithFallback(kResizeEastWestCursor, IDR_EASTWEST_RESIZE_CURSOR, 7, 7); - case WebCursorInfo::kTypeNorthEastSouthWestResize: + case ui::CursorType::kNorthEastSouthWestResize: return GetCoreCursorWithFallback(kResizeNortheastSouthwestCursor, IDR_NORTHEASTSOUTHWEST_RESIZE_CURSOR, 7, 7); - case WebCursorInfo::kTypeNorthWestSouthEastResize: + case ui::CursorType::kNorthWestSouthEastResize: return GetCoreCursorWithFallback(kResizeNorthwestSoutheastCursor, IDR_NORTHWESTSOUTHEAST_RESIZE_CURSOR, 7, 7); - case WebCursorInfo::kTypeColumnResize: + case ui::CursorType::kColumnResize: return [NSCursor resizeLeftRightCursor]; - case WebCursorInfo::kTypeRowResize: + case ui::CursorType::kRowResize: return [NSCursor resizeUpDownCursor]; - case WebCursorInfo::kTypeMiddlePanning: - case WebCursorInfo::kTypeMiddlePanningVertical: - case WebCursorInfo::kTypeMiddlePanningHorizontal: - case WebCursorInfo::kTypeMove: + case ui::CursorType::kMiddlePanning: + case ui::CursorType::kMiddlePanningVertical: + case ui::CursorType::kMiddlePanningHorizontal: + case ui::CursorType::kMove: return GetCoreCursorWithFallback(kMoveCursor, IDR_MOVE_CURSOR, 7, 7); - case WebCursorInfo::kTypeVerticalText: + case ui::CursorType::kVerticalText: // IBeamCursorForVerticalLayout is >= 10.7. if ([NSCursor respondsToSelector:@selector(IBeamCursorForVerticalLayout)]) return [NSCursor IBeamCursorForVerticalLayout]; else return LoadCursor(IDR_VERTICALTEXT_CURSOR, 7, 7); - case WebCursorInfo::kTypeCell: + case ui::CursorType::kCell: return GetCoreCursorWithFallback(kCellCursor, IDR_CELL_CURSOR, 7, 7); - case WebCursorInfo::kTypeContextMenu: + case ui::CursorType::kContextMenu: return [NSCursor contextualMenuCursor]; - case WebCursorInfo::kTypeAlias: + case ui::CursorType::kAlias: return GetCoreCursorWithFallback(kMakeAliasCursor, IDR_ALIAS_CURSOR, 11, 3); - case WebCursorInfo::kTypeProgress: + case ui::CursorType::kProgress: return GetCoreCursorWithFallback(kBusyButClickableCursor, IDR_PROGRESS_CURSOR, 3, 2); - case WebCursorInfo::kTypeNoDrop: - case WebCursorInfo::kTypeNotAllowed: + case ui::CursorType::kNoDrop: + case ui::CursorType::kNotAllowed: return [NSCursor operationNotAllowedCursor]; - case WebCursorInfo::kTypeCopy: + case ui::CursorType::kCopy: return [NSCursor dragCopyCursor]; - case WebCursorInfo::kTypeNone: + case ui::CursorType::kNone: return LoadCursor(IDR_NONE_CURSOR, 7, 7); - case WebCursorInfo::kTypeZoomIn: + case ui::CursorType::kZoomIn: return GetCoreCursorWithFallback(kZoomInCursor, IDR_ZOOMIN_CURSOR, 7, 7); - case WebCursorInfo::kTypeZoomOut: + case ui::CursorType::kZoomOut: return GetCoreCursorWithFallback(kZoomOutCursor, IDR_ZOOMOUT_CURSOR, 7, 7); - case WebCursorInfo::kTypeGrab: + case ui::CursorType::kGrab: return [NSCursor openHandCursor]; - case WebCursorInfo::kTypeGrabbing: + case ui::CursorType::kGrabbing: return [NSCursor closedHandCursor]; - case WebCursorInfo::kTypeCustom: + case ui::CursorType::kCustom: return CreateCustomCursor(info_); + case ui::CursorType::kNull: + case ui::CursorType::kDndNone: + case ui::CursorType::kDndMove: + case ui::CursorType::kDndCopy: + case ui::CursorType::kDndLink: + // These cursors do not apply on Mac. + break; } NOTREACHED(); return nil;
diff --git a/content/common/cursors/webcursor_unittest.cc b/content/common/cursors/webcursor_unittest.cc index 0c48c9fa..ce38fc08 100644 --- a/content/common/cursors/webcursor_unittest.cc +++ b/content/common/cursors/webcursor_unittest.cc
@@ -26,20 +26,20 @@ TEST(WebCursorTest, DefaultConstructor) { WebCursor cursor; - EXPECT_EQ(blink::WebCursorInfo::kTypePointer, cursor.info().type); + EXPECT_EQ(ui::CursorType::kPointer, cursor.info().type); EXPECT_TRUE(cursor.info().custom_image.isNull()); EXPECT_TRUE(cursor.info().hotspot.IsOrigin()); EXPECT_EQ(1.f, cursor.info().image_scale_factor); } TEST(WebCursorTest, CursorInfoConstructor) { - CursorInfo info(blink::WebCursorInfo::kTypeHand); + CursorInfo info(ui::CursorType::kHand); WebCursor cursor(info); EXPECT_EQ(info, cursor.info()); } TEST(WebCursorTest, CursorInfoConstructorCustom) { - CursorInfo info(blink::WebCursorInfo::kTypeCustom); + CursorInfo info(ui::CursorType::kCustom); info.custom_image = CreateTestBitmap(32, 32); info.hotspot = gfx::Point(10, 20); info.image_scale_factor = 1.5f; @@ -48,14 +48,14 @@ } TEST(WebCursorTest, CopyConstructorType) { - CursorInfo info(blink::WebCursorInfo::kTypeHand); + CursorInfo info(ui::CursorType::kHand); WebCursor cursor(info); WebCursor copy(cursor); EXPECT_EQ(cursor, copy); } TEST(WebCursorTest, CopyConstructorCustom) { - CursorInfo info(blink::WebCursorInfo::kTypeCustom); + CursorInfo info(ui::CursorType::kCustom); info.custom_image = CreateTestBitmap(32, 32); info.hotspot = gfx::Point(10, 20); info.image_scale_factor = 1.5f; @@ -66,7 +66,7 @@ TEST(WebCursorTest, ClampHotspot) { // Initialize a cursor with an invalid hotspot; it should be clamped. - CursorInfo info(blink::WebCursorInfo::kTypeCustom); + CursorInfo info(ui::CursorType::kCustom); info.hotspot = gfx::Point(100, 100); info.custom_image = CreateTestBitmap(5, 7); WebCursor cursor(info); @@ -79,10 +79,10 @@ TEST(WebCursorTest, SetInfo) { WebCursor cursor; EXPECT_TRUE(cursor.SetInfo(CursorInfo())); - EXPECT_TRUE(cursor.SetInfo(CursorInfo(blink::WebCursorInfo::kTypeHand))); - EXPECT_TRUE(cursor.SetInfo(CursorInfo(blink::WebCursorInfo::kTypeCustom))); + EXPECT_TRUE(cursor.SetInfo(CursorInfo(ui::CursorType::kHand))); + EXPECT_TRUE(cursor.SetInfo(CursorInfo(ui::CursorType::kCustom))); - CursorInfo info(blink::WebCursorInfo::kTypeCustom); + CursorInfo info(ui::CursorType::kCustom); info.custom_image = CreateTestBitmap(32, 32); info.hotspot = gfx::Point(10, 20); info.image_scale_factor = 1.5f; @@ -119,7 +119,7 @@ #if defined(USE_AURA) TEST(WebCursorTest, CursorScaleFactor) { CursorInfo info; - info.type = blink::WebCursorInfo::kTypeCustom; + info.type = ui::CursorType::kCustom; info.hotspot = gfx::Point(0, 1); info.image_scale_factor = 2.0f; info.custom_image = CreateTestBitmap(128, 128); @@ -145,7 +145,7 @@ TEST(WebCursorTest, UnscaledImageCopy) { CursorInfo info; - info.type = blink::WebCursorInfo::kTypeCustom; + info.type = ui::CursorType::kCustom; info.hotspot = gfx::Point(0, 1); info.custom_image = CreateTestBitmap(2, 2); WebCursor cursor(info); @@ -165,7 +165,7 @@ #if defined(OS_WIN) void ScaleCursor(float scale, int hotspot_x, int hotspot_y) { CursorInfo info; - info.type = blink::WebCursorInfo::kTypeCustom; + info.type = ui::CursorType::kCustom; info.hotspot = gfx::Point(hotspot_x, hotspot_y); info.custom_image = CreateTestBitmap(10, 10); WebCursor cursor(info);
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn index b43789e..99c6583 100644 --- a/content/public/android/BUILD.gn +++ b/content/public/android/BUILD.gn
@@ -450,7 +450,7 @@ srcjar_deps = [ "//content/shell/android:content_javatests_aidl", - "//third_party/blink/public:blink_cursor_type_java_enums_srcjar", + "//ui/base:ui_base_cursor_type_java_enums_srcjar", ] deps = [
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java index 9665afa..ab5400c 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java
@@ -18,13 +18,13 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.UrlUtils; -import org.chromium.blink_public.web.WebCursorInfoType; import org.chromium.content_public.browser.test.ContentJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.DOMUtils; import org.chromium.content_shell.ShellViewAndroidDelegate; import org.chromium.content_shell.ShellViewAndroidDelegate.OnCursorUpdateHelper; import org.chromium.content_shell_apk.ContentShellActivity; import org.chromium.content_shell_apk.ContentShellActivityTestRule; +import org.chromium.ui_base.web.CursorType; /** * Tests that we can move mouse cursor and test cursor icon. @@ -113,8 +113,8 @@ //@Feature({"Main"}) @DisabledTest(message = "crbug.com/755112") public void testPointerType() throws Throwable { - checkPointerTypeForNode("hand", WebCursorInfoType.HAND); - checkPointerTypeForNode("text", WebCursorInfoType.I_BEAM); - checkPointerTypeForNode("help", WebCursorInfoType.HELP); + checkPointerTypeForNode("hand", CursorType.HAND); + checkPointerTypeForNode("text", CursorType.I_BEAM); + checkPointerTypeForNode("help", CursorType.HELP); } }
diff --git a/content/public/common/cursor_info.cc b/content/public/common/cursor_info.cc index f3e50e1..086c99f0 100644 --- a/content/public/common/cursor_info.cc +++ b/content/public/common/cursor_info.cc
@@ -8,7 +8,7 @@ namespace content { -CursorInfo::CursorInfo(blink::WebCursorInfo::Type cursor) : type(cursor) {} +CursorInfo::CursorInfo(ui::CursorType cursor) : type(cursor) {} CursorInfo::CursorInfo(const blink::WebCursorInfo& info) : type(info.type),
diff --git a/content/public/common/cursor_info.h b/content/public/common/cursor_info.h index 963fff2..3419bec 100644 --- a/content/public/common/cursor_info.h +++ b/content/public/common/cursor_info.h
@@ -16,7 +16,7 @@ // This structure is highly similar to blink::WebCursorInfo. struct CONTENT_EXPORT CursorInfo { CursorInfo() = default; - explicit CursorInfo(blink::WebCursorInfo::Type cursor); + explicit CursorInfo(ui::CursorType cursor); explicit CursorInfo(const blink::WebCursorInfo& info); // Equality operator; performs bitmap content comparison as needed. @@ -26,7 +26,7 @@ blink::WebCursorInfo GetWebCursorInfo() const; // One of the predefined cursors. - blink::WebCursorInfo::Type type = blink::WebCursorInfo::kTypePointer; + ui::CursorType type = ui::CursorType::kPointer; // Custom cursor image. SkBitmap custom_image;
diff --git a/content/public/common/previews_state.h b/content/public/common/previews_state.h index a54af41..c8cad44 100644 --- a/content/public/common/previews_state.h +++ b/content/public/common/previews_state.h
@@ -23,10 +23,12 @@ enum PreviewsTypes { PREVIEWS_UNSPECIFIED = 0, // Let the browser process decide whether or // not to request Preview types. - SERVER_LOFI_ON = 1 << 0, // Request a Lo-Fi version of the resource - // from the server. - CLIENT_LOFI_ON = 1 << 1, // Request a Lo-Fi version of the resource - // from the client. + // DEPRECATED: SERVER_LOFI_ON = 1 << 0, Request a Lo-Fi version of the + // resource from the server. This preview type has been deprecated and should + // no longer be used. + // DEPRECATED: CLIENT_LOFI_ON = 1 << 1, Request a Lo-Fi version of the + // resource from the client. This preview type has been deprecated and should + // no longer be used. CLIENT_LOFI_AUTO_RELOAD = 1 << 2, // Request the original version of the // resource after a decoding error occurred // when attempting to use Client Lo-Fi. @@ -55,7 +57,8 @@ // Combination of all previews that are guaranteed not to provide partial // content. -const PreviewsState PARTIAL_CONTENT_SAFE_PREVIEWS = SERVER_LOFI_ON; +// const PreviewsState PARTIAL_CONTENT_SAFE_PREVIEWS = SERVER_LOFI_ON; +// deprecated // Combination of all currently supported previews. const PreviewsState ALL_SUPPORTED_PREVIEWS = @@ -66,10 +69,6 @@ // are kept in sync. STATIC_ASSERT_PREVIEWS_ENUM(PREVIEWS_UNSPECIFIED, blink::WebURLRequest::kPreviewsUnspecified); -STATIC_ASSERT_PREVIEWS_ENUM(SERVER_LOFI_ON, - blink::WebURLRequest::kServerLoFiOn); -STATIC_ASSERT_PREVIEWS_ENUM(CLIENT_LOFI_ON, - blink::WebURLRequest::kClientLoFiOn); STATIC_ASSERT_PREVIEWS_ENUM(CLIENT_LOFI_AUTO_RELOAD, blink::WebURLRequest::kClientLoFiAutoReload); STATIC_ASSERT_PREVIEWS_ENUM(SERVER_LITE_PAGE_ON,
diff --git a/content/public/common/url_constants.cc b/content/public/common/url_constants.cc index c0cce59..4d662cb 100644 --- a/content/public/common/url_constants.cc +++ b/content/public/common/url_constants.cc
@@ -18,8 +18,6 @@ const char kExternalFileScheme[] = "externalfile"; #endif -const char kAboutSrcDocURL[] = "about:srcdoc"; - const char kChromeUIAppCacheInternalsHost[] = "appcache-internals"; const char kChromeUIIndexedDBInternalsHost[] = "indexeddb-internals"; const char kChromeUIBlobInternalsHost[] = "blob-internals";
diff --git a/content/public/common/url_constants.h b/content/public/common/url_constants.h index 6bb00d8..2508ad6b 100644 --- a/content/public/common/url_constants.h +++ b/content/public/common/url_constants.h
@@ -26,9 +26,6 @@ CONTENT_EXPORT extern const char kExternalFileScheme[]; #endif -// Hosts for about URLs. -CONTENT_EXPORT extern const char kAboutSrcDocURL[]; - CONTENT_EXPORT extern const char kChromeUIAccessibilityHost[]; CONTENT_EXPORT extern const char kChromeUIAppCacheInternalsHost[]; CONTENT_EXPORT extern const char kChromeUIBlobInternalsHost[];
diff --git a/content/public/common/url_utils.cc b/content/public/common/url_utils.cc index 5fcc9b7..0242fe3 100644 --- a/content/public/common/url_utils.cc +++ b/content/public/common/url_utils.cc
@@ -36,7 +36,7 @@ // Javascript URLs, srcdoc, schemes that don't load data should not send a // request to the network stack. if (url.SchemeIs(url::kJavaScriptScheme) || url.is_empty() || - url == content::kAboutSrcDocURL) { + url.IsAboutSrcdoc()) { return false; }
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h index 31fcd7d..6ef4f14 100644 --- a/content/public/renderer/content_renderer_client.h +++ b/content/public/renderer/content_renderer_client.h
@@ -51,7 +51,6 @@ class WebThemeEngine; class WebURL; class WebURLRequest; -class WebURLResponse; struct WebPluginParams; struct WebURLError; } // namespace blink @@ -313,13 +312,6 @@ // metric. See: https://www.chromium.org/developers/design-documents/rappor virtual void RecordRapporURL(const std::string& metric, const GURL& url) {} - // Gives the embedder a chance to add properties to the context menu. - // Currently only called when the context menu is for an image. - virtual void AddImageContextMenuProperties( - const blink::WebURLResponse& response, - bool is_image_in_context_a_placeholder_image, - std::map<std::string, std::string>* properties) {} - // Notifies that a document element has been inserted in the frame's document. // This may be called multiple times for the same document. This method may // invalidate the frame.
diff --git a/content/public/test/test_file_error_injector.cc b/content/public/test/test_file_error_injector.cc index f26dd9fa..a8d250a5 100644 --- a/content/public/test/test_file_error_injector.cc +++ b/content/public/test/test_file_error_injector.cc
@@ -20,6 +20,7 @@ #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" +#include "services/service_manager/public/cpp/connector.h" #include "url/gurl.h" namespace net { @@ -67,6 +68,7 @@ const std::string& client_guid, const GURL& source_url, const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, const RenameCompletionCallback& callback) override; private: @@ -237,6 +239,7 @@ const std::string& client_guid, const GURL& source_url, const GURL& referrer_url, + std::unique_ptr<service_manager::Connector> connector, const RenameCompletionCallback& callback) { download::DownloadInterruptReason error_to_return = download::DOWNLOAD_INTERRUPT_REASON_NONE; @@ -260,9 +263,9 @@ error_to_return); } - download::DownloadFileImpl::RenameAndAnnotate(full_path, client_guid, - source_url, referrer_url, - std::move(callback_to_use)); + download::DownloadFileImpl::RenameAndAnnotate( + full_path, client_guid, source_url, referrer_url, nullptr, + std::move(callback_to_use)); } bool DownloadFileWithError::OverwriteError(
diff --git a/content/renderer/context_menu_params_builder.cc b/content/renderer/context_menu_params_builder.cc index 2adab17..50280485 100644 --- a/content/renderer/context_menu_params_builder.cc +++ b/content/renderer/context_menu_params_builder.cc
@@ -42,11 +42,6 @@ params.suggested_filename = data.suggested_filename.Utf16(); params.input_field_type = data.input_field_type; - if (!data.image_response.IsNull()) { - GetContentClient()->renderer()->AddImageContextMenuProperties( - data.image_response, data.is_placeholder_image, ¶ms.properties); - } - for (size_t i = 0; i < data.dictionary_suggestions.size(); ++i) params.dictionary_suggestions.push_back( data.dictionary_suggestions[i].Utf16());
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index b01ab89..c33ea4e 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -221,74 +221,69 @@ const char kBorder[] = "border"; // According to w3c, deprecated. const char kStyle[] = "style"; -#define STATIC_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ - static_assert(static_cast<int>(WebCursorInfo::webkit_name) == \ - static_cast<int>(np_name), \ +#define STATIC_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ + static_assert(static_cast<int>(ui::CursorType::webkit_name) == \ + static_cast<int>(np_name), \ "mismatching enums: " #webkit_name) -STATIC_ASSERT_MATCHING_ENUM(kTypePointer, PP_MOUSECURSOR_TYPE_POINTER); -STATIC_ASSERT_MATCHING_ENUM(kTypeCross, PP_MOUSECURSOR_TYPE_CROSS); -STATIC_ASSERT_MATCHING_ENUM(kTypeHand, PP_MOUSECURSOR_TYPE_HAND); -STATIC_ASSERT_MATCHING_ENUM(kTypeIBeam, PP_MOUSECURSOR_TYPE_IBEAM); -STATIC_ASSERT_MATCHING_ENUM(kTypeWait, PP_MOUSECURSOR_TYPE_WAIT); -STATIC_ASSERT_MATCHING_ENUM(kTypeHelp, PP_MOUSECURSOR_TYPE_HELP); -STATIC_ASSERT_MATCHING_ENUM(kTypeEastResize, PP_MOUSECURSOR_TYPE_EASTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthResize, PP_MOUSECURSOR_TYPE_NORTHRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthEastResize, +STATIC_ASSERT_MATCHING_ENUM(kPointer, PP_MOUSECURSOR_TYPE_POINTER); +STATIC_ASSERT_MATCHING_ENUM(kCross, PP_MOUSECURSOR_TYPE_CROSS); +STATIC_ASSERT_MATCHING_ENUM(kHand, PP_MOUSECURSOR_TYPE_HAND); +STATIC_ASSERT_MATCHING_ENUM(kIBeam, PP_MOUSECURSOR_TYPE_IBEAM); +STATIC_ASSERT_MATCHING_ENUM(kWait, PP_MOUSECURSOR_TYPE_WAIT); +STATIC_ASSERT_MATCHING_ENUM(kHelp, PP_MOUSECURSOR_TYPE_HELP); +STATIC_ASSERT_MATCHING_ENUM(kEastResize, PP_MOUSECURSOR_TYPE_EASTRESIZE); +STATIC_ASSERT_MATCHING_ENUM(kNorthResize, PP_MOUSECURSOR_TYPE_NORTHRESIZE); +STATIC_ASSERT_MATCHING_ENUM(kNorthEastResize, PP_MOUSECURSOR_TYPE_NORTHEASTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthWestResize, +STATIC_ASSERT_MATCHING_ENUM(kNorthWestResize, PP_MOUSECURSOR_TYPE_NORTHWESTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeSouthResize, PP_MOUSECURSOR_TYPE_SOUTHRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeSouthEastResize, +STATIC_ASSERT_MATCHING_ENUM(kSouthResize, PP_MOUSECURSOR_TYPE_SOUTHRESIZE); +STATIC_ASSERT_MATCHING_ENUM(kSouthEastResize, PP_MOUSECURSOR_TYPE_SOUTHEASTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeSouthWestResize, +STATIC_ASSERT_MATCHING_ENUM(kSouthWestResize, PP_MOUSECURSOR_TYPE_SOUTHWESTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeWestResize, PP_MOUSECURSOR_TYPE_WESTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthSouthResize, +STATIC_ASSERT_MATCHING_ENUM(kWestResize, PP_MOUSECURSOR_TYPE_WESTRESIZE); +STATIC_ASSERT_MATCHING_ENUM(kNorthSouthResize, PP_MOUSECURSOR_TYPE_NORTHSOUTHRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeEastWestResize, +STATIC_ASSERT_MATCHING_ENUM(kEastWestResize, PP_MOUSECURSOR_TYPE_EASTWESTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthEastSouthWestResize, +STATIC_ASSERT_MATCHING_ENUM(kNorthEastSouthWestResize, PP_MOUSECURSOR_TYPE_NORTHEASTSOUTHWESTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthWestSouthEastResize, +STATIC_ASSERT_MATCHING_ENUM(kNorthWestSouthEastResize, PP_MOUSECURSOR_TYPE_NORTHWESTSOUTHEASTRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeColumnResize, - PP_MOUSECURSOR_TYPE_COLUMNRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeRowResize, PP_MOUSECURSOR_TYPE_ROWRESIZE); -STATIC_ASSERT_MATCHING_ENUM(kTypeMiddlePanning, - PP_MOUSECURSOR_TYPE_MIDDLEPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeEastPanning, PP_MOUSECURSOR_TYPE_EASTPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthPanning, - PP_MOUSECURSOR_TYPE_NORTHPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthEastPanning, +STATIC_ASSERT_MATCHING_ENUM(kColumnResize, PP_MOUSECURSOR_TYPE_COLUMNRESIZE); +STATIC_ASSERT_MATCHING_ENUM(kRowResize, PP_MOUSECURSOR_TYPE_ROWRESIZE); +STATIC_ASSERT_MATCHING_ENUM(kMiddlePanning, PP_MOUSECURSOR_TYPE_MIDDLEPANNING); +STATIC_ASSERT_MATCHING_ENUM(kEastPanning, PP_MOUSECURSOR_TYPE_EASTPANNING); +STATIC_ASSERT_MATCHING_ENUM(kNorthPanning, PP_MOUSECURSOR_TYPE_NORTHPANNING); +STATIC_ASSERT_MATCHING_ENUM(kNorthEastPanning, PP_MOUSECURSOR_TYPE_NORTHEASTPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeNorthWestPanning, +STATIC_ASSERT_MATCHING_ENUM(kNorthWestPanning, PP_MOUSECURSOR_TYPE_NORTHWESTPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeSouthPanning, - PP_MOUSECURSOR_TYPE_SOUTHPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeSouthEastPanning, +STATIC_ASSERT_MATCHING_ENUM(kSouthPanning, PP_MOUSECURSOR_TYPE_SOUTHPANNING); +STATIC_ASSERT_MATCHING_ENUM(kSouthEastPanning, PP_MOUSECURSOR_TYPE_SOUTHEASTPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeSouthWestPanning, +STATIC_ASSERT_MATCHING_ENUM(kSouthWestPanning, PP_MOUSECURSOR_TYPE_SOUTHWESTPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeWestPanning, PP_MOUSECURSOR_TYPE_WESTPANNING); -STATIC_ASSERT_MATCHING_ENUM(kTypeMove, PP_MOUSECURSOR_TYPE_MOVE); -STATIC_ASSERT_MATCHING_ENUM(kTypeVerticalText, - PP_MOUSECURSOR_TYPE_VERTICALTEXT); -STATIC_ASSERT_MATCHING_ENUM(kTypeCell, PP_MOUSECURSOR_TYPE_CELL); -STATIC_ASSERT_MATCHING_ENUM(kTypeContextMenu, PP_MOUSECURSOR_TYPE_CONTEXTMENU); -STATIC_ASSERT_MATCHING_ENUM(kTypeAlias, PP_MOUSECURSOR_TYPE_ALIAS); -STATIC_ASSERT_MATCHING_ENUM(kTypeProgress, PP_MOUSECURSOR_TYPE_PROGRESS); -STATIC_ASSERT_MATCHING_ENUM(kTypeNoDrop, PP_MOUSECURSOR_TYPE_NODROP); -STATIC_ASSERT_MATCHING_ENUM(kTypeCopy, PP_MOUSECURSOR_TYPE_COPY); -STATIC_ASSERT_MATCHING_ENUM(kTypeNone, PP_MOUSECURSOR_TYPE_NONE); -STATIC_ASSERT_MATCHING_ENUM(kTypeNotAllowed, PP_MOUSECURSOR_TYPE_NOTALLOWED); -STATIC_ASSERT_MATCHING_ENUM(kTypeZoomIn, PP_MOUSECURSOR_TYPE_ZOOMIN); -STATIC_ASSERT_MATCHING_ENUM(kTypeZoomOut, PP_MOUSECURSOR_TYPE_ZOOMOUT); -STATIC_ASSERT_MATCHING_ENUM(kTypeGrab, PP_MOUSECURSOR_TYPE_GRAB); -STATIC_ASSERT_MATCHING_ENUM(kTypeGrabbing, PP_MOUSECURSOR_TYPE_GRABBING); -STATIC_ASSERT_MATCHING_ENUM(kTypeMiddlePanningVertical, +STATIC_ASSERT_MATCHING_ENUM(kWestPanning, PP_MOUSECURSOR_TYPE_WESTPANNING); +STATIC_ASSERT_MATCHING_ENUM(kMove, PP_MOUSECURSOR_TYPE_MOVE); +STATIC_ASSERT_MATCHING_ENUM(kVerticalText, PP_MOUSECURSOR_TYPE_VERTICALTEXT); +STATIC_ASSERT_MATCHING_ENUM(kCell, PP_MOUSECURSOR_TYPE_CELL); +STATIC_ASSERT_MATCHING_ENUM(kContextMenu, PP_MOUSECURSOR_TYPE_CONTEXTMENU); +STATIC_ASSERT_MATCHING_ENUM(kAlias, PP_MOUSECURSOR_TYPE_ALIAS); +STATIC_ASSERT_MATCHING_ENUM(kProgress, PP_MOUSECURSOR_TYPE_PROGRESS); +STATIC_ASSERT_MATCHING_ENUM(kNoDrop, PP_MOUSECURSOR_TYPE_NODROP); +STATIC_ASSERT_MATCHING_ENUM(kCopy, PP_MOUSECURSOR_TYPE_COPY); +STATIC_ASSERT_MATCHING_ENUM(kNone, PP_MOUSECURSOR_TYPE_NONE); +STATIC_ASSERT_MATCHING_ENUM(kNotAllowed, PP_MOUSECURSOR_TYPE_NOTALLOWED); +STATIC_ASSERT_MATCHING_ENUM(kZoomIn, PP_MOUSECURSOR_TYPE_ZOOMIN); +STATIC_ASSERT_MATCHING_ENUM(kZoomOut, PP_MOUSECURSOR_TYPE_ZOOMOUT); +STATIC_ASSERT_MATCHING_ENUM(kGrab, PP_MOUSECURSOR_TYPE_GRAB); +STATIC_ASSERT_MATCHING_ENUM(kGrabbing, PP_MOUSECURSOR_TYPE_GRABBING); +STATIC_ASSERT_MATCHING_ENUM(kMiddlePanningVertical, PP_MOUSECURSOR_TYPE_MIDDLEPANNINGVERTICAL); -STATIC_ASSERT_MATCHING_ENUM(kTypeMiddlePanningHorizontal, +STATIC_ASSERT_MATCHING_ENUM(kMiddlePanningHorizontal, PP_MOUSECURSOR_TYPE_MIDDLEPANNINGHORIZONTAL); // Do not assert WebCursorInfo::TypeCustom == PP_CURSORTYPE_CUSTOM; // PP_CURSORTYPE_CUSTOM is pinned to allow new cursor types. @@ -2753,8 +2748,8 @@ return PP_FALSE; if (type != PP_MOUSECURSOR_TYPE_CUSTOM) { - DoSetCursor(std::make_unique<WebCursorInfo>( - static_cast<WebCursorInfo::Type>(type))); + DoSetCursor( + std::make_unique<WebCursorInfo>(static_cast<ui::CursorType>(type))); return PP_TRUE; } @@ -2768,8 +2763,7 @@ if (!auto_mapper.is_valid()) return PP_FALSE; - auto custom_cursor = - std::make_unique<WebCursorInfo>(WebCursorInfo::kTypeCustom); + auto custom_cursor = std::make_unique<WebCursorInfo>(ui::CursorType::kCustom); custom_cursor->hot_spot.x = hot_spot->x; custom_cursor->hot_spot.y = hot_spot->y;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 6d48cd2c..ceeca7a0 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -5333,7 +5333,6 @@ // The decision of whether or not to enable Client Lo-Fi is made earlier // in the request lifetime, in LocalFrame::MaybeAllowImagePlaceholder(), // so don't add the Client Lo-Fi bit to the request here. - request_previews_state &= ~(WebURLRequest::kClientLoFiOn); request_previews_state &= ~(WebURLRequest::kLazyImageLoadDeferred); if (request_previews_state == WebURLRequest::kPreviewsUnspecified) request_previews_state = WebURLRequest::kPreviewsOff; @@ -6495,8 +6494,7 @@ // process. // TODO(arthursonzogni): Remove this. Everything should use the default code // path and be driven by the browser process. - if (((url == content::kAboutSrcDocURL) || - WebDocumentLoader::WillLoadUrlAsEmpty(url)) && + if ((url.IsAboutSrcdoc() || WebDocumentLoader::WillLoadUrlAsEmpty(url)) && !is_history_navigation_in_new_child_frame) { if (!frame_->WillStartNavigation( *info, false /* is_history_navigation_in_new_child_frame */))
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index 88f1661b..0ed20199 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -285,53 +285,6 @@ EXPECT_TRUE(observer.visible()); } -// Test that LoFi state only updates for new main frame documents. Subframes -// inherit from the main frame and should not change at commit time. -TEST_F(RenderFrameImplTest, LoFiNotUpdatedOnSubframeCommits) { - SetPreviewsState(GetMainRenderFrame(), SERVER_LOFI_ON); - SetPreviewsState(frame(), SERVER_LOFI_ON); - EXPECT_EQ(SERVER_LOFI_ON, GetMainRenderFrame()->GetPreviewsState()); - EXPECT_EQ(SERVER_LOFI_ON, frame()->GetPreviewsState()); - - blink::WebHistoryItem item; - item.Initialize(); - - // The main frame's and subframe's LoFi states should stay the same on - // same-document navigations. - frame()->DidFinishSameDocumentNavigation(item, blink::kWebStandardCommit, - false /* content_initiated */); - EXPECT_EQ(SERVER_LOFI_ON, frame()->GetPreviewsState()); - GetMainRenderFrame()->DidFinishSameDocumentNavigation( - item, blink::kWebStandardCommit, false /* content_initiated */); - EXPECT_EQ(SERVER_LOFI_ON, GetMainRenderFrame()->GetPreviewsState()); - - // The subframe's LoFi state should not be reset on commit. - NavigationState* navigation_state = NavigationState::FromDocumentLoader( - frame()->GetWebFrame()->GetDocumentLoader()); - navigation_state->set_was_within_same_document(false); - - blink::mojom::DocumentInterfaceBrokerPtr stub_document_interface_broker; - frame()->DidCommitProvisionalLoad( - item, blink::kWebStandardCommit, - mojo::MakeRequest(&stub_document_interface_broker).PassMessagePipe()); - EXPECT_EQ(SERVER_LOFI_ON, frame()->GetPreviewsState()); - - // The main frame's LoFi state should be reset to off on commit. - navigation_state = NavigationState::FromDocumentLoader( - GetMainRenderFrame()->GetWebFrame()->GetDocumentLoader()); - navigation_state->set_was_within_same_document(false); - - // Calling didCommitProvisionalLoad is not representative of a full navigation - // but serves the purpose of testing the LoFi state logic. - GetMainRenderFrame()->DidCommitProvisionalLoad( - item, blink::kWebStandardCommit, - mojo::MakeRequest(&stub_document_interface_broker).PassMessagePipe()); - EXPECT_EQ(PREVIEWS_UNSPECIFIED, GetMainRenderFrame()->GetPreviewsState()); - // The subframe would be deleted here after a cross-document navigation. It - // happens to be left around in this test because this does not simulate the - // frame detach. -} - // Test that effective connection type only updates for new main frame // documents. TEST_F(RenderFrameImplTest, EffectiveConnectionType) { @@ -558,79 +511,13 @@ } #endif -TEST_F(RenderFrameImplTest, PreviewsStateAfterWillSendRequest) { - const struct { - PreviewsState frame_previews_state; - WebURLRequest::PreviewsState initial_request_previews_state; - WebURLRequest::PreviewsState expected_final_request_previews_state; - } tests[] = { - // With no previews enabled for the frame, no previews should be - // activated. - {PREVIEWS_UNSPECIFIED, WebURLRequest::kPreviewsUnspecified, - WebURLRequest::kPreviewsOff}, - - // If the request already has a previews state set, then it shouldn't be - // overridden. - {SERVER_LOFI_ON, WebURLRequest::kPreviewsNoTransform, - WebURLRequest::kPreviewsNoTransform}, - {SERVER_LOFI_ON, WebURLRequest::kPreviewsOff, - WebURLRequest::kPreviewsOff}, - - // Server Lo-Fi and Server Lite Pages should be enabled for the request - // when they're enabled for the frame. - {SERVER_LOFI_ON, WebURLRequest::kPreviewsUnspecified, - WebURLRequest::kServerLoFiOn}, - {SERVER_LITE_PAGE_ON, WebURLRequest::kPreviewsUnspecified, - WebURLRequest::kServerLitePageOn}, - {SERVER_LITE_PAGE_ON | SERVER_LOFI_ON, - WebURLRequest::kPreviewsUnspecified, - WebURLRequest::kServerLitePageOn | WebURLRequest::kServerLoFiOn}, - - // The CLIENT_LOFI_ON frame flag should be ignored at this point in the - // request. - {CLIENT_LOFI_ON, WebURLRequest::kPreviewsUnspecified, - WebURLRequest::kPreviewsOff}, - {SERVER_LOFI_ON | CLIENT_LOFI_ON, WebURLRequest::kPreviewsUnspecified, - WebURLRequest::kServerLoFiOn}, - - // A request that's using Client Lo-Fi should continue using Client Lo-Fi. - {SERVER_LOFI_ON | CLIENT_LOFI_ON, WebURLRequest::kClientLoFiOn, - WebURLRequest::kClientLoFiOn}, - {CLIENT_LOFI_ON, WebURLRequest::kClientLoFiOn, - WebURLRequest::kClientLoFiOn}, - {SERVER_LITE_PAGE_ON, WebURLRequest::kClientLoFiOn, - WebURLRequest::kClientLoFiOn}, - }; - - for (const auto& test : tests) { - SetPreviewsState(frame(), test.frame_previews_state); - - WebURLRequest request; - request.SetUrl(GURL("http://example.com")); - request.SetPreviewsState(test.initial_request_previews_state); - - frame()->WillSendRequest(request); - - EXPECT_EQ(test.expected_final_request_previews_state, - request.GetPreviewsState()) - << (&test - tests); - } -} - TEST_F(RenderFrameImplTest, GetPreviewsStateForFrame) { - SetPreviewsState(frame(), CLIENT_LOFI_ON | SERVER_LOFI_ON); - EXPECT_EQ(WebURLRequest::kClientLoFiOn | WebURLRequest::kServerLoFiOn, - frame()->GetPreviewsStateForFrame()); - SetPreviewsState(frame(), PREVIEWS_OFF); EXPECT_EQ(WebURLRequest::kPreviewsOff, frame()->GetPreviewsStateForFrame()); SetPreviewsState(frame(), PREVIEWS_OFF | PREVIEWS_NO_TRANSFORM); EXPECT_EQ(WebURLRequest::kPreviewsOff | WebURLRequest::kPreviewsNoTransform, frame()->GetPreviewsStateForFrame()); - - SetPreviewsState(frame(), CLIENT_LOFI_ON | PREVIEWS_OFF); - EXPECT_DCHECK_DEATH(frame()->GetPreviewsStateForFrame()); } TEST_F(RenderFrameImplTest, AutoplayFlags) {
diff --git a/content/renderer/render_widget_unittest.cc b/content/renderer/render_widget_unittest.cc index 2736f85..005fcf29 100644 --- a/content/renderer/render_widget_unittest.cc +++ b/content/renderer/render_widget_unittest.cc
@@ -296,7 +296,7 @@ TEST_F(RenderWidgetUnittest, CursorChange) { blink::WebCursorInfo cursor_info; - cursor_info.type = blink::WebCursorInfo::Type::kTypePointer; + cursor_info.type = ui::CursorType::kPointer; widget()->DidChangeCursor(cursor_info); EXPECT_EQ(widget()->sink()->message_count(), 1U);
diff --git a/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java b/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java index 8cd7bd6..56c69a4 100644 --- a/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java +++ b/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java
@@ -7,8 +7,8 @@ import android.graphics.Bitmap; import android.view.ViewGroup; -import org.chromium.blink_public.web.WebCursorInfoType; import org.chromium.ui.base.ViewAndroidDelegate; +import org.chromium.ui_base.web.CursorType; /** * Implementation of the abstract class {@link ViewAndroidDelegate} for content shell. @@ -45,7 +45,7 @@ public void onCursorChangedToCustom(Bitmap customCursorBitmap, int hotspotX, int hotspotY) { super.onCursorChangedToCustom(customCursorBitmap, hotspotX, hotspotY); if (mOnCursorUpdateHelper != null) { - mOnCursorUpdateHelper.notifyCalled(WebCursorInfoType.CUSTOM); + mOnCursorUpdateHelper.notifyCalled(CursorType.CUSTOM); } }
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test.py b/content/test/gpu/gpu_tests/gpu_integration_test.py index 472232a70..9bdea120 100644 --- a/content/test/gpu/gpu_tests/gpu_integration_test.py +++ b/content/test/gpu/gpu_tests/gpu_integration_test.py
@@ -86,6 +86,13 @@ browser_args.append( '--disable-gpu-process-for-dx12-vulkan-info-collection') + if not ('--force_low_power_gpu' in browser_args or + '--force_high_performance_gpu' in browser_args): + # Force the GPU tests to use the high-performance GPU on dual-GPU machines + # by default. In Chromium's hardware fleet this currently only has an + # effect on the dual-GPU MacBook Pros. + browser_args.append('--force_high_performance_gpu') + # 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/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index 3c3ccc0f..b546c362d 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -113,7 +113,7 @@ # TODO(kbr): temporary suppression for new test. crbug.com/575305 [ linux ] Pixel_WebGLSadCanvas [ Failure ] -crbug.com/575305 [ win ] Pixel_WebGLSadCanvas [ RetryOnFailure ] +crbug.com/575305 [ win ] Pixel_WebGLSadCanvas [ Failure ] crbug.com/872423 [ mac ] Pixel_WebGLSadCanvas [ Failure ] crbug.com/575305 [ android ] Pixel_WebGLSadCanvas [ Skip ] @@ -179,9 +179,11 @@ # Failing on Pixel 2 FYI. crbug.com/966069 [ android qualcomm-adreno-(tm)-540 ] Pixel_CanvasLowLatency2D [ Failure ] -# Failing on Linux, both Intel HD 630 and NVIDIA Quadro P400 +# Failing on Linux and Windows, both Intel HD 630 and NVIDIA Quadro P400 crbug.com/974380 [ linux ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing [ Failure ] +crbug.com/974380 [ win ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing [ Failure ] crbug.com/974380 [ linux ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker [ Failure ] +crbug.com/974380 [ win ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker [ Failure ] # Producing blank images on Macmini and Macbook Pro crbug.com/974380 [ mac ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker [ Failure ]
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc index c7788ad..7391e92 100644 --- a/content/test/test_render_frame.cc +++ b/content/test/test_render_frame.cc
@@ -343,7 +343,7 @@ GURL url = info->url_request.Url(); auto navigation_params = std::make_unique<blink::WebNavigationParams>(); navigation_params->url = url; - if (!url.IsAboutBlank() && url != content::kAboutSrcDocURL) { + if (!url.IsAboutBlank() && !url.IsAboutSrcdoc()) { std::string mime_type, charset, data; if (!net::DataURL::Parse(url, &mime_type, &charset, &data)) { // This case is only here to allow cluster fuzz pass any url,
diff --git a/device/bluetooth/chromeos/bluetooth_utils.cc b/device/bluetooth/chromeos/bluetooth_utils.cc index 7b5a658..f2e4e51 100644 --- a/device/bluetooth/chromeos/bluetooth_utils.cc +++ b/device/bluetooth/chromeos/bluetooth_utils.cc
@@ -89,14 +89,30 @@ result.push_back(device); } break; - // For classic and dual mode devices, only filter out if the name is empty - // because the device could have an unknown or even known type and still - // also provide audio/HID functionality. + // For classic mode devices, only filter out if the name is empty because + // the device could have an unknown or even known type and still also + // provide audio/HID functionality. case BLUETOOTH_TRANSPORT_CLASSIC: - case BLUETOOTH_TRANSPORT_DUAL: if (device->GetName()) result.push_back(device); break; + // For dual mode devices, a device::BluetoothDevice object without a name + // and type/appearance most likely signals that it is truly only a LE + // advertisement for a peripheral which is active, but not pairable. Many + // popular headphones behave in this exact way. Filter them out until they + // provide a type/appearance; this means they've become pairable. See + // https://crbug.com/1656971 for more. + case BLUETOOTH_TRANSPORT_DUAL: + if (device->GetName()) { + if (base::FeatureList::IsEnabled( + chromeos::features::kBluetoothAggressiveAppearanceFilter) && + device->GetDeviceType() == BluetoothDeviceType::UNKNOWN) { + continue; + } + + result.push_back(device); + } + break; } } return result;
diff --git a/device/bluetooth/chromeos/bluetooth_utils_unittest.cc b/device/bluetooth/chromeos/bluetooth_utils_unittest.cc index fa143b2..d3c41508 100644 --- a/device/bluetooth/chromeos/bluetooth_utils_unittest.cc +++ b/device/bluetooth/chromeos/bluetooth_utils_unittest.cc
@@ -4,19 +4,78 @@ #include "device/bluetooth/chromeos/bluetooth_utils.h" +#include "base/bind_helpers.h" #include "base/command_line.h" #include "base/logging.h" #include "base/macros.h" +#include "base/run_loop.h" #include "base/test/scoped_feature_list.h" +#include "base/test/scoped_task_environment.h" #include "chromeos/constants/chromeos_features.h" +#include "device/bluetooth/bluetooth_adapter_factory.h" +#include "device/bluetooth/bluetooth_device.h" +#include "device/bluetooth/test/mock_bluetooth_adapter.h" +#include "device/bluetooth/test/mock_bluetooth_device.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace device { +namespace { + +constexpr char kTestBluetoothDisplayName[] = "test_device_name"; +constexpr char kTestBluetoothDeviceAddress[] = "01:02:03:04:05:06"; +constexpr char kHIDServiceUUID[] = "1812"; +constexpr char kSecurityKeyServiceUUID[] = "FFFD"; +constexpr char kUnexpectedServiceUUID[] = "1234"; +const size_t kMaxDevicesForFilter = 5; + +} // namespace + class BluetoothUtilsTest : public testing::Test { protected: BluetoothUtilsTest() = default; + void SetUp() override { + BluetoothAdapterFactory::SetAdapterForTesting(adapter_); + } + + MockBluetoothDevice* AddMockBluetoothDeviceToAdapter( + BluetoothTransport transport) { + auto mock_bluetooth_device = + std::make_unique<testing::NiceMock<MockBluetoothDevice>>( + adapter_.get(), 0 /* bluetooth_class */, kTestBluetoothDisplayName, + kTestBluetoothDeviceAddress, false /* paired */, + false /* connected */); + + ON_CALL(*mock_bluetooth_device, GetType) + .WillByDefault(testing::Return(transport)); + + auto* mock_bluetooth_device_ptr = mock_bluetooth_device.get(); + adapter_->AddMockDevice(std::move(mock_bluetooth_device)); + return mock_bluetooth_device_ptr; + } + + MockBluetoothAdapter* adapter() { return adapter_.get(); } + + MockBluetoothDevice* GetMockBluetoothDevice(size_t index) { + return static_cast<MockBluetoothDevice*>( + adapter()->GetMockDevices()[index]); + } + + void VerifyFilterBluetoothDeviceList(BluetoothFilterType filter_type, + size_t num_expected_remaining_devices) { + BluetoothAdapter::DeviceList filtered_device_list = + FilterBluetoothDeviceList(adapter_->GetMockDevices(), filter_type, + kMaxDevicesForFilter); + EXPECT_EQ(num_expected_remaining_devices, filtered_device_list.size()); + } + + void EnableAggressiveAppearanceFilter() { + feature_list_.InitAndEnableFeature( + chromeos::features::kBluetoothAggressiveAppearanceFilter); + } + void SetLongTermKeys(const std::string& keys) { feature_list_.InitAndEnableFeatureWithParameters( chromeos::features::kBlueZLongTermKeyBlocklist, @@ -24,12 +83,135 @@ } private: + base::test::ScopedTaskEnvironment scoped_task_environment_; + scoped_refptr<MockBluetoothAdapter> adapter_ = + base::MakeRefCounted<testing::NiceMock<MockBluetoothAdapter>>(); base::test::ScopedFeatureList feature_list_; DISALLOW_COPY_AND_ASSIGN(BluetoothUtilsTest); }; -TEST_F(BluetoothUtilsTest, TestListIncludesBadLtks) { +TEST_F(BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterAll_NoDevicesFiltered) { + // If BluetoothFilterType::KNOWN were passed, this device would otherwise be + // filtered out, but we expect it to not be. + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_INVALID); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::ALL, + 1u /* num_expected_remaining_devices */); +} + +TEST_F(BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterAll_MaxDevicesExceeded) { + for (size_t i = 0; i < kMaxDevicesForFilter * 2; ++i) + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_INVALID); + + VerifyFilterBluetoothDeviceList( + BluetoothFilterType::ALL, + kMaxDevicesForFilter /* num_expected_remaining_devices */); +} + +TEST_F(BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_AlwaysKeepPairedDevices) { + auto* mock_bluetooth_device = + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_INVALID); + EXPECT_CALL(*mock_bluetooth_device, IsPaired) + .WillRepeatedly(testing::Return(true)); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 1u /* num_expected_remaining_devices */); +} + +TEST_F(BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_RemoveInvalidDevices) { + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_INVALID); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 0u /* num_expected_remaining_devices */); +} + +TEST_F(BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_KeepClassicDevicesWithNames) { + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_CLASSIC); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 1u /* num_expected_remaining_devices */); +} + +TEST_F( + BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_RemoveClassicDevicesWithoutNames) { + auto* mock_bluetooth_device = + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_CLASSIC); + EXPECT_CALL(*mock_bluetooth_device, GetName) + .WillOnce(testing::Return(base::nullopt)); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 0u /* num_expected_remaining_devices */); +} + +TEST_F( + BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_RemoveBleDevicesWithoutExpectedUuids) { + auto* mock_bluetooth_device = + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_LE); + mock_bluetooth_device->AddUUID(device::BluetoothUUID(kUnexpectedServiceUUID)); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 0u /* num_expected_remaining_devices */); +} + +TEST_F( + BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_KeepBleDevicesWithExpectedUuids) { + auto* mock_bluetooth_device_1 = + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_LE); + mock_bluetooth_device_1->AddUUID(device::BluetoothUUID(kHIDServiceUUID)); + + auto* mock_bluetooth_device_2 = + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_LE); + mock_bluetooth_device_2->AddUUID( + device::BluetoothUUID(kSecurityKeyServiceUUID)); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 2u /* num_expected_remaining_devices */); +} + +TEST_F( + BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_KeepDualDevicesWithNamesAndAppearances) { + EnableAggressiveAppearanceFilter(); + + auto* mock_bluetooth_device = + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_DUAL); + EXPECT_CALL(*mock_bluetooth_device, GetDeviceType) + .WillOnce(testing::Return(BluetoothDeviceType::AUDIO)); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 1u /* num_expected_remaining_devices */); +} + +TEST_F( + BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_DualDevicesWithoutAppearances_KeepWithFilterFlagDisabled) { + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_DUAL); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 1u /* num_expected_remaining_devices */); +} + +TEST_F( + BluetoothUtilsTest, + TestFilterBluetoothDeviceList_FilterKnown_DualDevicesWithoutAppearances_RemoveWithFilterFlagEnabled) { + EnableAggressiveAppearanceFilter(); + + AddMockBluetoothDeviceToAdapter(BLUETOOTH_TRANSPORT_DUAL); + + VerifyFilterBluetoothDeviceList(BluetoothFilterType::KNOWN, + 0u /* num_expected_remaining_devices */); +} + +TEST_F(BluetoothUtilsTest, TestGetBlockedLongTermKeys_ListIncludesBadLtks) { // One nibble too long, one nibble too short, and one nibble just right. std::string hex_key_1 = "000000000000000000000000000012345"; std::string hex_key_2 = "0000000000000000000000000000123"; @@ -45,7 +227,7 @@ EXPECT_EQ(expected_array, device::GetBlockedLongTermKeys()); } -TEST_F(BluetoothUtilsTest, TestListIncludesNonHexInput) { +TEST_F(BluetoothUtilsTest, TestGetBlockedLongTermKeys_ListIncludesNonHexInput) { std::string hex_key_1 = "bad00input00but00correct00length"; std::string hex_key_2 = "00000000000000000000000000001234"; SetLongTermKeys(hex_key_1 + ',' + hex_key_2); @@ -67,7 +249,7 @@ EXPECT_EQ(expected_array, device::GetBlockedLongTermKeys()); } -TEST_F(BluetoothUtilsTest, TestOneElementList) { +TEST_F(BluetoothUtilsTest, TestGetBlockedLongTermKeys_OneElementList) { std::string hex_key_1 = "012300004567000089ab0000cdef0000"; std::vector<uint8_t> expected_key_1 = {0x01, 0x23, 0x00, 0x00, 0x45, 0x67, 0x00, 0x00, 0x89, 0xab, 0x00, 0x00, @@ -81,7 +263,7 @@ EXPECT_EQ(expected_array, device::GetBlockedLongTermKeys()); } -TEST_F(BluetoothUtilsTest, TestMultipleElementList) { +TEST_F(BluetoothUtilsTest, TestGetBlockedLongTermKeys_MultipleElementList) { std::string hex_key_1 = "012300004567000089ab0000cdef0000"; std::vector<uint8_t> expected_key_1 = {0x01, 0x23, 0x00, 0x00, 0x45, 0x67, 0x00, 0x00, 0x89, 0xab, 0x00, 0x00,
diff --git a/device/fido/fido_device_authenticator.cc b/device/fido/fido_device_authenticator.cc index 339ed50e..a3e09286 100644 --- a/device/fido/fido_device_authenticator.cc +++ b/device/fido/fido_device_authenticator.cc
@@ -523,7 +523,8 @@ BioEnrollmentRequest::ForEnrollBegin(response), base::BindOnce(&FidoDeviceAuthenticator::OnBioEnroll, weak_factory_.GetWeakPtr(), std::move(response), - std::move(callback)), + std::move(callback), + /*current_template_id=*/base::nullopt), base::BindOnce(&BioEnrollmentResponse::Parse)); } @@ -558,22 +559,31 @@ void FidoDeviceAuthenticator::OnBioEnroll( pin::TokenResponse token, BioEnrollmentCallback callback, + base::Optional<std::vector<uint8_t>> current_template_id, CtapDeviceResponseCode code, base::Optional<BioEnrollmentResponse> bio) { - static base::Optional<std::vector<uint8_t>> template_id_; if (code != CtapDeviceResponseCode::kSuccess || bio->remaining_samples == 0) { std::move(callback).Run(code, std::move(bio)); return; } - if (bio->template_id) { - template_id_ = std::move(bio->template_id); + if (!current_template_id) { + if (!bio->template_id) { + // The templateId response field is required in the first response of each + // enrollment. + std::move(callback).Run(CtapDeviceResponseCode::kCtap2ErrOther, + base::nullopt); + return; + } + current_template_id = *bio->template_id; } + auto request = + BioEnrollmentRequest::ForEnrollNextSample(token, *current_template_id); RunOperation<BioEnrollmentRequest, BioEnrollmentResponse>( - BioEnrollmentRequest::ForEnrollNextSample(token, *template_id_), + std::move(request), base::BindOnce(&FidoDeviceAuthenticator::OnBioEnroll, weak_factory_.GetWeakPtr(), std::move(token), - std::move(callback)), + std::move(callback), std::move(current_template_id)), base::BindOnce(&BioEnrollmentResponse::Parse)); }
diff --git a/device/fido/fido_device_authenticator.h b/device/fido/fido_device_authenticator.h index 79a5187..1660294 100644 --- a/device/fido/fido_device_authenticator.h +++ b/device/fido/fido_device_authenticator.h
@@ -151,6 +151,7 @@ void OnBioEnroll(pin::TokenResponse, BioEnrollmentCallback callback, + base::Optional<std::vector<uint8_t>> current_template_id, CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>);
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index de22b07..26a144c 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -509,6 +509,7 @@ "command_buffer/service/shader_manager_unittest.cc", "command_buffer/service/shader_translator_cache_unittest.cc", "command_buffer/service/shader_translator_unittest.cc", + "command_buffer/service/shared_context_state_unittest.cc", "command_buffer/service/sync_point_manager_unittest.cc", "command_buffer/service/test_helper.cc", "command_buffer/service/test_helper.h",
diff --git a/gpu/command_buffer/service/external_vk_image_backing.cc b/gpu/command_buffer/service/external_vk_image_backing.cc index c21202e..886badb 100644 --- a/gpu/command_buffer/service/external_vk_image_backing.cc +++ b/gpu/command_buffer/service/external_vk_image_backing.cc
@@ -142,8 +142,8 @@ context_state->vk_context_provider()->GetDeviceQueue()->GetVulkanDevice(); VkFormat vk_format = ToVkFormat(format); VkImage image; - bool is_transfer_dst = using_gmb || !pixel_data.empty(); bool is_external = context_state->support_vulkan_external_object(); + bool is_transfer_dst = using_gmb || !pixel_data.empty() || !is_external; VkResult result = CreateVkImage(context_state, vk_format, size, is_transfer_dst, is_external, &image); if (result != VK_SUCCESS) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index e40c171..c16fda7c 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4082,6 +4082,18 @@ api()->glHintFn(GL_TEXTURE_FILTERING_HINT_CHROMIUM, GL_NICEST); } + if (CheckResetStatus()) { + // If the context was lost at any point before or during initialization, the + // values queried from the driver could be bogus, and potentially + // inconsistent between various ContextStates on the same underlying real GL + // context. Make sure to report the failure early, to not allow virtualized + // context switches in that case. + LOG(ERROR) + << " GLES2DecoderImpl: Context reset detected after initialization."; + group_->LoseContexts(error::kUnknown); + return gpu::ContextResult::kTransientFailure; + } + return gpu::ContextResult::kSuccess; }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index af6398c..797187ad 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
@@ -582,6 +582,14 @@ EXPECT_EQ(GL_NO_ERROR, GetGLError()); } +TEST_P(GLES2DecoderManualInitTest, InitFailsIfLostContext) { + InitState init; + init.extensions = "GL_KHR_robustness"; + init.lose_context_on_init = true; + EXPECT_EQ(ContextResult::kTransientFailure, + MaybeInitDecoderWithWorkarounds(init, GpuDriverBugWorkarounds())); +} + TEST_P(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) { InitState init; InitDecoder(init);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 222b2d42..02138c0 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -169,21 +169,10 @@ } } -GLES2DecoderTestBase::InitState::InitState() - : extensions("GL_EXT_framebuffer_object"), - gl_version("2.1"), - has_alpha(false), - has_depth(false), - has_stencil(false), - request_alpha(false), - request_depth(false), - request_stencil(false), - bind_generates_resource(false), - lose_context_when_out_of_memory(false), - use_native_vao(true), - context_type(CONTEXT_TYPE_OPENGLES2) {} - +GLES2DecoderTestBase::InitState::InitState() = default; GLES2DecoderTestBase::InitState::InitState(const InitState& other) = default; +GLES2DecoderTestBase::InitState& GLES2DecoderTestBase::InitState::operator=( + const InitState& other) = default; void GLES2DecoderTestBase::InitDecoder(const InitState& init) { gpu::GpuDriverBugWorkarounds workarounds; @@ -193,6 +182,13 @@ void GLES2DecoderTestBase::InitDecoderWithWorkarounds( const InitState& init, const gpu::GpuDriverBugWorkarounds& workarounds) { + ContextResult result = MaybeInitDecoderWithWorkarounds(init, workarounds); + ASSERT_EQ(result, gpu::ContextResult::kSuccess); +} + +ContextResult GLES2DecoderTestBase::MaybeInitDecoderWithWorkarounds( + const InitState& init, + const gpu::GpuDriverBugWorkarounds& workarounds) { InitState normalized_init = init; NormalizeInitState(&normalized_init); // For easier substring/extension matching @@ -482,6 +478,12 @@ } #endif + if (context_->WasAllocatedUsingRobustnessExtension()) { + EXPECT_CALL(*gl_, GetGraphicsResetStatusARB()) + .WillOnce(Return(init.lose_context_on_init ? GL_GUILTY_CONTEXT_RESET_ARB + : GL_NO_ERROR)); + } + scoped_refptr<gpu::Buffer> buffer = command_buffer_service_->CreateTransferBufferHelper(kSharedBufferSize, &shared_memory_id_); @@ -512,9 +514,14 @@ decoder_->SetCopyTexImageBlitterForTest(copy_tex_image_blitter_); } - ASSERT_EQ(decoder_->Initialize(surface_, context_, false, - DisallowedFeatures(), attribs), - gpu::ContextResult::kSuccess); + gpu::ContextResult result = decoder_->Initialize( + surface_, context_, false, DisallowedFeatures(), attribs); + if (result != gpu::ContextResult::kSuccess) { + decoder_->Destroy(false /* have_context */); + decoder_.reset(); + group_->Destroy(mock_decoder_.get(), false); + return result; + } EXPECT_CALL(*context_, MakeCurrent(surface_.get())).WillOnce(Return(true)); if (context_->WasAllocatedUsingRobustnessExtension()) { @@ -566,6 +573,7 @@ } EXPECT_EQ(GL_NO_ERROR, GetGLError()); + return result; } void GLES2DecoderTestBase::ResetDecoder() {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h index 9bfb9e6..74ace1d 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
@@ -216,24 +216,29 @@ struct InitState { InitState(); InitState(const InitState& other); + InitState& operator=(const InitState& other); - std::string extensions; - std::string gl_version; - bool has_alpha; - bool has_depth; - bool has_stencil; - bool request_alpha; - bool request_depth; - bool request_stencil; - bool bind_generates_resource; - bool lose_context_when_out_of_memory; - bool use_native_vao; // default is true. - ContextType context_type; + std::string extensions = "GL_EXT_framebuffer_object"; + std::string gl_version = "2.1"; + bool has_alpha = false; + bool has_depth = false; + bool has_stencil = false; + bool request_alpha = false; + bool request_depth = false; + bool request_stencil = false; + bool bind_generates_resource = false; + bool lose_context_when_out_of_memory = false; + bool lose_context_on_init = false; + bool use_native_vao = true; + ContextType context_type = CONTEXT_TYPE_OPENGLES2; }; void InitDecoder(const InitState& init); void InitDecoderWithWorkarounds(const InitState& init, const GpuDriverBugWorkarounds& workarounds); + ContextResult MaybeInitDecoderWithWorkarounds( + const InitState& init, + const GpuDriverBugWorkarounds& workarounds); void ResetDecoder();
diff --git a/gpu/command_buffer/service/raster_decoder_unittest_base.cc b/gpu/command_buffer/service/raster_decoder_unittest_base.cc index 572b163..820717f 100644 --- a/gpu/command_buffer/service/raster_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/raster_decoder_unittest_base.cc
@@ -175,6 +175,11 @@ ContextStateTestHelpers::SetupInitState(gl_.get(), feature_info(), gfx::Size(1, 1)); + if (context_->WasAllocatedUsingRobustnessExtension()) { + EXPECT_CALL(*gl_, GetGraphicsResetStatusARB()) + .WillOnce(Return(GL_NO_ERROR)); + } + shared_context_state_ = base::MakeRefCounted<SharedContextState>( new gl::GLShareGroup(), surface_, context_, feature_info()->workarounds().use_virtualized_gl_contexts,
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc index 061c1ccb..d14fae3 100644 --- a/gpu/command_buffer/service/shared_context_state.cc +++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -17,6 +17,7 @@ #include "ui/gl/gl_context.h" #include "ui/gl/gl_share_group.h" #include "ui/gl/gl_surface.h" +#include "ui/gl/gl_version_info.h" #include "ui/gl/init/create_gr_gl_interface.h" #if BUILDFLAG(ENABLE_VULKAN) @@ -211,6 +212,24 @@ context_state_->InitCapabilities(nullptr); context_state_->InitState(nullptr); + bool has_robustness = (feature_info_->feature_flags().arb_robustness || + feature_info_->feature_flags().khr_robustness || + feature_info_->feature_flags().ext_robustness) && + real_context_->WasAllocatedUsingRobustnessExtension(); + if (has_robustness) { + GLenum driver_status = api->glGetGraphicsResetStatusARBFn(); + if (driver_status != GL_NO_ERROR) { + // If the context was lost at any point before or during initialization, + // the values queried from the driver could be bogus, and potentially + // inconsistent between various ContextStates on the same underlying real + // GL context. Make sure to report the failure early, to not allow + // virtualized context switches in that case. + feature_info_ = nullptr; + context_state_ = nullptr; + return false; + } + } + if (use_virtualized_gl_contexts_) { auto virtual_context = base::MakeRefCounted<GLContextVirtual>( share_group_.get(), real_context_.get(), @@ -224,9 +243,13 @@ MakeCurrent(nullptr); } - // TODO(penghuang): query extension from VulkanInstance. + // Swiftshader GL and Vulkan report supporting external objects extensions, + // but they don't. support_vulkan_external_object_ = - gpu_preferences.use_vulkan == gpu::VulkanImplementationName::kNative; + !gl::g_current_gl_version->is_swiftshader && + gpu_preferences.use_vulkan == gpu::VulkanImplementationName::kNative && + gl::g_current_gl_driver->ext.b_GL_EXT_memory_object_fd && + gl::g_current_gl_driver->ext.b_GL_EXT_semaphore_fd; return true; }
diff --git a/gpu/command_buffer/service/shared_context_state_unittest.cc b/gpu/command_buffer/service/shared_context_state_unittest.cc new file mode 100644 index 0000000..9fdab5d --- /dev/null +++ b/gpu/command_buffer/service/shared_context_state_unittest.cc
@@ -0,0 +1,93 @@ +// 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 "gpu/command_buffer/service/shared_context_state.h" + +#include <limits> +#include <memory> +#include <string> +#include <utility> + +#include "base/bind_helpers.h" +#include "base/command_line.h" +#include "base/memory/ptr_util.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/service/context_state_test_helpers.h" +#include "gpu/command_buffer/service/feature_info.h" +#include "gpu/command_buffer/service/gl_context_mock.h" +#include "gpu/command_buffer/service/shared_context_state.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "gpu/config/gpu_driver_bug_workarounds.h" +#include "gpu/config/gpu_feature_info.h" +#include "gpu/config/gpu_preferences.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" +#include "ui/gl/init/gl_factory.h" +#include "ui/gl/test/gl_surface_test_support.h" + +using ::testing::_; +using ::testing::InSequence; +using ::testing::Return; +using ::testing::SetArgPointee; +using ::testing::StrictMock; + +namespace gpu { + +class SharedContextStateTest : public ::testing::Test { + public: + SharedContextStateTest() = default; +}; + +TEST_F(SharedContextStateTest, InitFailsIfLostContext) { + const ContextType context_type = CONTEXT_TYPE_OPENGLES2; + + // For easier substring/extension matching + gl::SetGLGetProcAddressProc(gl::MockGLInterface::GetGLProcAddress); + gl::GLSurfaceTestSupport::InitializeOneOffWithMockBindings(); + + StrictMock<gl::MockGLInterface> gl_interface; + gl::MockGLInterface::SetGLInterface(&gl_interface); + + InSequence sequence; + + auto surface = base::MakeRefCounted<gl::GLSurfaceStub>(); + auto context = base::MakeRefCounted<StrictMock<GLContextMock>>(); + const char gl_version[] = "2.1"; + context->SetGLVersionString(gl_version); + const char gl_extensions[] = "GL_KHR_robustness"; + context->SetExtensionsString(gl_extensions); + + context->GLContextStub::MakeCurrent(surface.get()); + + GpuFeatureInfo gpu_feature_info; + GpuDriverBugWorkarounds workarounds; + auto feature_info = + base::MakeRefCounted<gles2::FeatureInfo>(workarounds, gpu_feature_info); + gles2::TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( + &gl_interface, gl_extensions, "", gl_version, context_type); + feature_info->Initialize(gpu::CONTEXT_TYPE_OPENGLES2, false /* passthrough */, + gles2::DisallowedFeatures()); + + // Setup expectations for SharedContextState::InitializeGL(). + EXPECT_CALL(gl_interface, GetIntegerv(GL_MAX_VERTEX_ATTRIBS, _)) + .WillOnce(SetArgPointee<1>(8u)) + .RetiresOnSaturation(); + ContextStateTestHelpers::SetupInitState(&gl_interface, feature_info.get(), + gfx::Size(1, 1)); + + EXPECT_TRUE(context->WasAllocatedUsingRobustnessExtension()); + EXPECT_CALL(gl_interface, GetGraphicsResetStatusARB()) + .WillOnce(Return(GL_GUILTY_CONTEXT_RESET_ARB)); + + auto shared_context_state = base::MakeRefCounted<SharedContextState>( + new gl::GLShareGroup(), surface, context, + false /* use_virtualized_gl_contexts */, base::DoNothing()); + + bool result = + shared_context_state->InitializeGL(GpuPreferences(), feature_info); + EXPECT_FALSE(result); +} + +} // namespace gpu
diff --git a/gpu/ipc/service/gpu_watchdog_thread.cc b/gpu/ipc/service/gpu_watchdog_thread.cc index 78125a3..b7cf127 100644 --- a/gpu/ipc/service/gpu_watchdog_thread.cc +++ b/gpu/ipc/service/gpu_watchdog_thread.cc
@@ -346,11 +346,6 @@ return; } - if (alternative_terminate_for_testing_) { - alternative_terminate_for_testing_.Run(); - return; - } - #if defined(OS_WIN) // Defer termination until a certain amount of CPU time has elapsed on the // watched thread. @@ -623,15 +618,6 @@ } #endif -void GpuWatchdogThreadImplV1::SetAlternativeTerminateFunctionForTesting( - base::RepeatingClosure on_terminate) { - alternative_terminate_for_testing_ = std::move(on_terminate); -} - -void GpuWatchdogThreadImplV1::SetTimeoutForTesting(base::TimeDelta timeout) { - timeout_ = timeout; -} - GpuWatchdogThread::GpuWatchdogThread() : base::Thread("GpuWatchdog") {} GpuWatchdogThread::~GpuWatchdogThread() {}
diff --git a/gpu/ipc/service/gpu_watchdog_thread.h b/gpu/ipc/service/gpu_watchdog_thread.h index 9b14468..9083776 100644 --- a/gpu/ipc/service/gpu_watchdog_thread.h +++ b/gpu/ipc/service/gpu_watchdog_thread.h
@@ -70,11 +70,6 @@ void OnBackgrounded() override; void OnForegrounded() override; - // Test only functions. Not thread safe - set before arming. - void SetAlternativeTerminateFunctionForTesting( - base::RepeatingClosure on_terminate); - void SetTimeoutForTesting(base::TimeDelta timeout); - protected: void Init() override; void CleanUp() override; @@ -215,8 +210,6 @@ int host_tty_; #endif - base::RepeatingClosure alternative_terminate_for_testing_; - base::WeakPtrFactory<GpuWatchdogThreadImplV1> weak_factory_; DISALLOW_COPY_AND_ASSIGN(GpuWatchdogThreadImplV1);
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.cc b/gpu/ipc/service/gpu_watchdog_thread_v2.cc index ca85214..8d14b37 100644 --- a/gpu/ipc/service/gpu_watchdog_thread_v2.cc +++ b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
@@ -6,6 +6,8 @@ #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/message_loop/message_loop_current.h" +#include "base/power_monitor/power_monitor.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" @@ -23,13 +25,21 @@ GpuWatchdogThreadImplV2::GpuWatchdogThreadImplV2() : timeout_(base::TimeDelta::FromMilliseconds(kGpuTimeoutInMs)), - task_observer_(this), watched_task_runner_(base::ThreadTaskRunnerHandle::Get()), - weak_factory_(this) {} + weak_factory_(this) { + Disarm(); + + base::MessageLoopCurrent::Get()->AddTaskObserver(this); +} GpuWatchdogThreadImplV2::~GpuWatchdogThreadImplV2() { DCHECK(watched_task_runner_->BelongsToCurrentThread()); - Stop(); + Stop(); // stop the watchdog thread + + base::MessageLoopCurrent::Get()->RemoveTaskObserver(this); + base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); + if (power_monitor) + power_monitor->RemoveObserver(this); } // static @@ -46,7 +56,14 @@ return watchdog_thread; } -void GpuWatchdogThreadImplV2::AddPowerObserver() {} +// Do not add power observer during watchdog init, PowerMonitor might not be up +// running yet. +void GpuWatchdogThreadImplV2::AddPowerObserver() { + base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); + DCHECK(power_monitor); + if (power_monitor) + power_monitor->AddObserver(this); +} void GpuWatchdogThreadImplV2::OnBackgrounded() {} @@ -60,19 +77,14 @@ weak_factory_.InvalidateWeakPtrs(); } -GpuWatchdogThreadImplV2::GpuWatchdogTaskObserver::GpuWatchdogTaskObserver( - GpuWatchdogThreadImplV2* watchdog) - : watchdog_(watchdog) {} - -GpuWatchdogThreadImplV2::GpuWatchdogTaskObserver::~GpuWatchdogTaskObserver() = - default; - -void GpuWatchdogThreadImplV2::GpuWatchdogTaskObserver::WillProcessTask( - const base::PendingTask& pending_task) {} - -void GpuWatchdogThreadImplV2::GpuWatchdogTaskObserver::DidProcessTask( +void GpuWatchdogThreadImplV2::WillProcessTask( const base::PendingTask& pending_task) { - watchdog_->Disarm(); + Arm(); +} + +void GpuWatchdogThreadImplV2::DidProcessTask( + const base::PendingTask& pending_task) { + Disarm(); } void GpuWatchdogThreadImplV2::Arm() {}
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.h b/gpu/ipc/service/gpu_watchdog_thread_v2.h index 64075f9..52d38fb 100644 --- a/gpu/ipc/service/gpu_watchdog_thread_v2.h +++ b/gpu/ipc/service/gpu_watchdog_thread_v2.h
@@ -10,7 +10,8 @@ namespace gpu { class GPU_IPC_SERVICE_EXPORT GpuWatchdogThreadImplV2 - : public GpuWatchdogThread { + : public GpuWatchdogThread, + public base::MessageLoopCurrent::TaskObserver { public: static std::unique_ptr<GpuWatchdogThreadImplV2> Create( bool start_backgrounded); @@ -30,22 +31,6 @@ void CleanUp() override; private: - // An object of this type intercepts the reception and completion of all tasks - // on the watched thread and checks whether the watchdog is armed. - class GpuWatchdogTaskObserver - : public base::MessageLoopCurrent::TaskObserver { - public: - explicit GpuWatchdogTaskObserver(GpuWatchdogThreadImplV2* watchdog); - ~GpuWatchdogTaskObserver() override; - - // Implements MessageLoopCurrent::TaskObserver. - void WillProcessTask(const base::PendingTask& pending_task) override; - void DidProcessTask(const base::PendingTask& pending_task) override; - - private: - GpuWatchdogThreadImplV2* watchdog_; - }; - GpuWatchdogThreadImplV2(); void Arm(); void Disarm(); @@ -54,11 +39,14 @@ void OnSuspend() override; void OnResume() override; + // Implements MessageLoopCurrent::TaskObserver. + void WillProcessTask(const base::PendingTask& pending_task) override; + void DidProcessTask(const base::PendingTask& pending_task) override; + // Implements GpuWatchdogThread void DeliberatelyTerminateToRecoverFromHang() override; base::TimeDelta timeout_; - GpuWatchdogTaskObserver task_observer_; scoped_refptr<base::SingleThreadTaskRunner> watched_task_runner_; base::WeakPtrFactory<GpuWatchdogThreadImplV2> weak_factory_;
diff --git a/gpu/vulkan/vulkan_instance.cc b/gpu/vulkan/vulkan_instance.cc index 85aa153..be186b4 100644 --- a/gpu/vulkan/vulkan_instance.cc +++ b/gpu/vulkan/vulkan_instance.cc
@@ -148,26 +148,19 @@ // TODO(crbug.com/843346): Make validation work in combination with // VK_KHR_xlib_surface or switch to VK_KHR_xcb_surface. - constexpr base::StringPiece xlib_surface_extension_name( - "VK_KHR_xlib_surface"); - bool require_xlib_surface_extension = + const base::StringPiece xlib_surface_extension_name("VK_KHR_xlib_surface"); + bool enable_validation = std::find_if(enabled_extensions.begin(), enabled_extensions.end(), [xlib_surface_extension_name](const char* e) { return xlib_surface_extension_name == e; - }) != enabled_extensions.end(); - - // VK_LAYER_LUNARG_standard_validation 1.0.106 is required to support - // VK_KHR_xlib_surface. - constexpr base::StringPiece standard_validation( - "VK_LAYER_LUNARG_standard_validation"); - for (const VkLayerProperties& layer_property : instance_layers) { - if (standard_validation != layer_property.layerName) - continue; - if (!require_xlib_surface_extension || - layer_property.specVersion >= VK_MAKE_VERSION(1, 0, 106)) { - enabled_layer_names.push_back(standard_validation.data()); + }) == enabled_extensions.end(); + if (enable_validation) { + constexpr base::StringPiece standard_validation( + "VK_LAYER_LUNARG_standard_validation"); + for (const VkLayerProperties& layer_property : instance_layers) { + if (standard_validation == layer_property.layerName) + enabled_layer_names.push_back(standard_validation.data()); } - break; } #endif // DCHECK_IS_ON()
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg index 5f79993d..b85bf90 100644 --- a/infra/config/cr-buildbucket.cfg +++ b/infra/config/cr-buildbucket.cfg
@@ -4182,7 +4182,7 @@ builders { mixins: "linux-try" mixins: "linux-xenial" - mixins: "goma-rbe-prod-j150" + mixins: "goma-j150" mixins: "builderless" name: "linux-rel" }
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index ddf210e..4b4eb3d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -25,7 +25,7 @@ <translation id="1254117744268754948">בחר תיקייה</translation> <translation id="1265739287306757398">איך עושים זאת?</translation> <translation id="1272079795634619415">הפסק</translation> -<translation id="1283524564873030414">מהיום האחרון</translation> +<translation id="1283524564873030414">מ-24 השעות האחרונות</translation> <translation id="1323735185997015385">מחק</translation> <translation id="132683371494960526">הקש פעמיים כדי לשנות את תיקיית האב.</translation> <translation id="1340643665687018190">סגור את התפריט</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index d9627e7..fe8d0c3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">கோப்புறையைத் தேர்வுசெய்யவும்</translation> <translation id="1265739287306757398">எப்படி என அறிக</translation> <translation id="1272079795634619415">நிறுத்து</translation> +<translation id="1283524564873030414">கடந்த 24 மணிநேரம்</translation> <translation id="1323735185997015385">நீக்கு</translation> <translation id="132683371494960526">மூலக் கோப்புறையை மாற்ற, இருமுறை தட்டவும்.</translation> <translation id="1340643665687018190">மூடு மெனு</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">மேம்பட்டவை</translation> <translation id="1989112275319619282">உலாவு</translation> <translation id="2015722694326466240">கடவுச்சொற்களைப் பார்க்க, முதலில் உங்கள் சாதனத்தில் கடவுக்குறியீட்டை அமைக்க வேண்டும்.</translation> +<translation id="2073572773299281212"><ph name="DAYS" /> நாட்களுக்கு முன் பயன்படுத்தியுள்ளார்</translation> <translation id="2074131957428911366">எவற்றை ஒத்திசைக்க வேண்டும் என்பதை <ph name="BEGIN_LINK" />அமைப்புகளில்<ph name="END_LINK" /> எப்போது வேண்டுமானாலும் தேர்வுசெய்யலாம்.</translation> <translation id="2079545284768500474">செயல்தவிர்</translation> <translation id="209018056901015185">டெஸ்க்டாப் தளத்தைக் கோரு</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">எல்லாவற்றையும் திற</translation> <translation id="2570206273416014374">முகவரிப் பட்டியிலிருந்தும் தேடல் பெட்டியிலிருந்தும் சில குக்கீகளையும் தேடல்களையும் நீங்கள் அமைத்துள்ள இயல்புநிலைத் தேடல் இன்ஜினுக்கு அனுப்பும்.</translation> <translation id="2572712655377361602">உங்கள் படங்களுக்கான அணுகலை ஒரு சாதனக் கொள்கை தடுத்துள்ளது</translation> +<translation id="2578571896248130439">இணையப்பக்கத்தை அனுப்புதல்</translation> <translation id="2584132361465095047">கணக்கைச் சேர்...</translation> <translation id="2625189173221582860">கடவுச்சொல் நகலெடுக்கப்பட்டது</translation> <translation id="2648803196158606475">படித்தவற்றை நீக்கு</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">குறி…</translation> <translation id="3157684681743766797">அனைத்தையும் குறி…</translation> <translation id="3175081911749765310">இணைய சேவைகள்</translation> +<translation id="3178650076442119961">இன்று பயன்படுத்தியுள்ளார்</translation> <translation id="3207960819495026254">புக்மார்க் செய்யப்பட்டது</translation> <translation id="3224641773458703735">கடவுச்சொற்களை ஏற்ற, முதலில் உங்கள் சாதனத்தில் கடவுக்குறியீட்டை அமைக்க வேண்டும்.</translation> <translation id="3240426699337459095">இணைப்பு நகலெடுக்கப்பட்டது</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">QR குறியீட்டை ஸ்கேன் செய்ய, அமைப்புகளிலிருந்து கேமராவை இயக்கவும்</translation> <translation id="4281844954008187215">சேவை விதிமுறைகள்</translation> <translation id="430793432425771671">எல்லாவற்றையும் ஒத்திசை</translation> +<translation id="430967081421617822">முழுமையும்</translation> <translation id="4338650699862464074">நீங்கள் பார்வையிடும் பக்கங்களின் URLகளை Googleளுக்கு அனுப்பும்.</translation> <translation id="4359125752503270327">இந்தப் பக்கம் மற்றொரு பயன்பாட்டில் திறக்கப்படும்.</translation> <translation id="4370827530403103842">ஒத்திசைவு வேலை செய்யவில்லை. சரிசெய்ய, தட்டவும்.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">ஒத்திசைவு முடக்கத்தில்</translation> <translation id="5132942445612118989">எல்லாச் சாதனங்களிலும் உங்கள் கடவுச்சொற்கள், வரலாறு மற்றும் பலவற்றை ஒத்திசைக்கலாம்</translation> <translation id="5140288047769711648">உங்களுக்காக Chrome இந்தக் கடவுச்சொல்லை நினைவில் வைத்திருக்கும். நீங்கள் நினைவில் வைக்கவேண்டிய அவசியமில்லை.</translation> +<translation id="5150492518600715772">வேறு சாதனத்திற்கு அனுப்பு</translation> <translation id="5181140330217080051">பதிவிறக்குகிறது</translation> <translation id="5186185447130319458">தனிப்பட்டது</translation> <translation id="5190835502935405962">புக்மார்க் பட்டி</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">பெயர்</translation> <translation id="5388358297987318779">படத்தைத் திற</translation> <translation id="5409365236829784218">இந்தக் கோப்பைத் திறக்கக்கூடிய பயன்பாடுகள் எதுவும் நிறுவப்படவில்லை.</translation> +<translation id="5416022985862681400">கடந்த 7 நாட்கள்</translation> <translation id="5433691172869980887">பயனர்பெயர் நகலெடுக்கப்பட்டது</translation> <translation id="54401264925851789">பக்க பாதுகாப்புத் தகவல்</translation> <translation id="5443952882982198570">கிரெடிட் கார்டுகள்</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">மின்னஞ்சல்</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">பதிப்பு <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">கடைசியாக 1 நாளுக்கு முன் பயன்படுத்தியுள்ளார்</translation> <translation id="5711039611392265845">தனியுரிமை, பாதுகாப்பு மற்றும் தரவுச் சேகரிப்புடன் தொடர்புடைய மேலும் பல அமைப்புகளுக்கு <ph name="BEGIN_LINK" />ஒத்திசைவும் Google சேவைகளும்<ph name="END_LINK" /> என்பதைப் பார்க்கவும்.</translation> <translation id="5728700505257787410">மன்னிக்கவும், உங்கள் கணக்கில் உள்நுழைவதில் பிழை.</translation> <translation id="5737974891429562743">கணக்கு உள்நுழைவு விவரங்கள் காலாவதியாகிவிட்டன. ஒத்திசைவைத் தொடங்க, புதுப்பிக்கவும்.</translation>
diff --git a/ios/chrome/browser/autofill/automation/automation_action.h b/ios/chrome/browser/autofill/automation/automation_action.h index fc9fdf6b8..1126e97c 100644 --- a/ios/chrome/browser/autofill/automation/automation_action.h +++ b/ios/chrome/browser/autofill/automation/automation_action.h
@@ -17,14 +17,14 @@ // Returns an concrete instance of a subclass of AutomationAction. + (instancetype)actionWithValueDictionary: - (const base::DictionaryValue&)actionDictionary - error:(NSError**)error; + (const base::DictionaryValue&)actionDictionary; // Prevents creating rogue instances, the init methods are private. - (instancetype)init NS_UNAVAILABLE; -// For subclasses to implement, execute the action. -- (NSError*)execute WARN_UNUSED_RESULT; +// For subclasses to implement, execute the action. Use GREYAssert in case of +// issue. +- (void)execute; @end #endif // IOS_CHROME_BROWSER_AUTOFILL_AUTOMATION_AUTOMATION_ACTION_H_
diff --git a/ios/chrome/browser/autofill/automation/automation_action.mm b/ios/chrome/browser/autofill/automation/automation_action.mm index 1a5a3ca..0a92f03 100644 --- a/ios/chrome/browser/autofill/automation/automation_action.mm +++ b/ios/chrome/browser/autofill/automation/automation_action.mm
@@ -152,22 +152,13 @@ @implementation AutomationAction + (instancetype)actionWithValueDictionary: - (const base::DictionaryValue&)actionDictionary - error:(NSError**)error { + (const base::DictionaryValue&)actionDictionary { const base::Value* typeValue = actionDictionary.FindKeyOfType("type", base::Value::Type::STRING); - if (!typeValue) { - *error = - testing::NSErrorWithLocalizedDescription(@"Type is missing in action."); - return nil; - } + GREYAssert(typeValue, @"Type is missing in action."); const std::string type(typeValue->GetString()); - if (type.empty()) { - *error = - testing::NSErrorWithLocalizedDescription(@"Type is an empty value."); - return nil; - } + GREYAssert(!type.empty(), @"Type is an empty value."); return [[[self classForType:base::SysUTF8ToNSString(type)] alloc] initWithValueDictionary:actionDictionary]; @@ -199,9 +190,8 @@ return self; } -- (NSError*)execute { - return testing::NSErrorWithLocalizedDescription( - @"Default AutomationAction::execute should not be called!"); +- (void)execute { + GREYAssert(NO, @"Should not be called!"); } - (const std::unique_ptr<const base::DictionaryValue>&)actionDictionary { @@ -235,12 +225,8 @@ } // Creates a selector targeting the element specified in the action. -- (ElementSelector*)selectorForTarget:(NSError**)error { - const std::string xpath = [self getStringFromDictionaryWithKey:"selector" - error:error]; - if (*error) { - return nil; - } +- (ElementSelector*)selectorForTarget { + const std::string xpath = [self getStringFromDictionaryWithKey:"selector"]; // Creates a selector from the action dictionary. ElementSelector* selector = [ElementSelector selectorWithXPathQuery:xpath]; @@ -250,22 +236,13 @@ // Returns a std::string corrensponding to the given key in the action // dictionary. Will raise a test failure if the key is missing or the value is // empty. -- (std::string)getStringFromDictionaryWithKey:(std::string)key - error:(NSError**)error { +- (std::string)getStringFromDictionaryWithKey:(std::string)key { const base::Value* expectedTypeValue( self.actionDictionary->FindKeyOfType(key, base::Value::Type::STRING)); - if (!expectedTypeValue) { - *error = testing::NSErrorWithLocalizedDescription( - [NSString stringWithFormat:@"%s is missing in action.", key.c_str()]); - return ""; - } + GREYAssert(expectedTypeValue, @"%s is missing in action.", key.c_str()); const std::string expectedType(expectedTypeValue->GetString()); - if (expectedType.empty()) { - *error = testing::NSErrorWithLocalizedDescription( - [NSString stringWithFormat:@"%s is an empty value", key.c_str()]); - return ""; - } + GREYAssert(!expectedType.empty(), @"%s is an empty value", key.c_str()); return expectedType; } @@ -273,14 +250,10 @@ // Returns an int corrensponding to the given key in the action // dictionary. Will raise a test failure if the key is missing or the value is // empty. -- (int)getIntFromDictionaryWithKey:(std::string)key error:(NSError**)error { +- (int)getIntFromDictionaryWithKey:(std::string)key { const base::Value* expectedTypeValue( self.actionDictionary->FindKeyOfType(key, base::Value::Type::INTEGER)); - if (!expectedTypeValue) { - *error = testing::NSErrorWithLocalizedDescription( - [NSString stringWithFormat:@"%s is missing in action.", key.c_str()]); - return 0; - } + GREYAssert(expectedTypeValue, @"%s is missing in action.", key.c_str()); return expectedTypeValue->GetInt(); } @@ -290,8 +263,9 @@ // by the name "target", so example JS code is like: // return target.value - (id)executeJavascript:(std::string)function - onTarget:(ElementSelector*)selector - error:(NSError**)error { + onTarget:(ElementSelector*)selector { + NSError* error; + id result = chrome_test_util::ExecuteJavaScript( [NSString stringWithFormat:@" (function() {" @@ -303,8 +277,12 @@ " })();", base::SysUTF8ToNSString(function), selector.selectorScript], - error); + &error); + if (error) { + GREYAssert(NO, @"Javascript execution error: %@", result); + return nil; + } return result; } @@ -312,66 +290,46 @@ @implementation AutomationActionClick -- (NSError*)execute { - NSError* error; - - ElementSelector* selector = [self selectorForTarget:&error]; - if (error) { - return error; - } - +- (void)execute { + ElementSelector* selector = [self selectorForTarget]; [self tapOnTarget:selector]; - return nil; } @end @implementation AutomationActionLoadPage -- (NSError*)execute { +- (void)execute { // loadPage is a no-op action - perform nothing - return nil; } @end @implementation AutomationActionWaitFor -- (NSError*)execute { +- (void)execute { const base::Value* assertionsValue(self.actionDictionary->FindKeyOfType( "assertions", base::Value::Type::LIST)); - if (!assertionsValue) { - return testing::NSErrorWithLocalizedDescription( - @"Assertions key is missing in WaitFor action."); - } + GREYAssert(assertionsValue, @"Assertions key is missing in action."); const base::Value::ListStorage& assertionsValues(assertionsValue->GetList()); - if (!assertionsValues.size()) { - return testing::NSErrorWithLocalizedDescription( - @"Assertions list is empty in WaitFor action."); - } + GREYAssert(assertionsValues.size(), @"Assertions list is empty."); std::vector<std::string> state_assertions; for (auto const& assertionValue : assertionsValues) { const std::string assertionString(assertionValue.GetString()); - if (assertionString.empty()) { - return testing::NSErrorWithLocalizedDescription( - @"assertionsString is empty in WaitFor action."); - } + GREYAssert(!assertionString.empty(), @"assertionString is an empty value."); state_assertions.push_back(assertionString); } - bool success = base::test::ios::WaitUntilConditionOrTimeout( - base::test::ios::kWaitForActionTimeout, ^{ - return [self CheckForJsAssertionFailures:state_assertions] == nil; - }); - if (!success) { - return testing::NSErrorWithLocalizedDescription( - @"waitFor State change hasn't completed within timeout."); - } - - return nil; + GREYAssert(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForActionTimeout, + ^{ + return [self CheckForJsAssertionFailures:state_assertions] == + nil; + }), + @"waitFor State change hasn't completed within timeout."); } // Executes a vector of Javascript assertions on the webpage, returning the @@ -405,16 +363,11 @@ @implementation AutomationActionAutofill -- (NSError*)execute { +- (void)execute { // The autofill profile is configured in // automation_egtest::prepareAutofillProfileWithValues. - NSError* error = nil; - ElementSelector* selector = [self selectorForTarget:&error]; - if (error) { - return error; - } - + ElementSelector* selector = [self selectorForTarget]; [self tapOnTarget:selector]; // Tap on the autofill suggestion to perform the actual autofill. @@ -422,148 +375,93 @@ selectElementWithMatcher:grey_accessibilityID( kFormSuggestionLabelAccessibilityIdentifier)] performAction:grey_tap()]; - return nil; } @end @implementation AutomationActionValidateField -- (NSError*)execute { - NSError* error = nil; - - ElementSelector* selector = [self selectorForTarget:&error]; - if (error) { - return error; - } +- (void)execute { + ElementSelector* selector = [self selectorForTarget]; // Wait for the element to be visible on the page. [ChromeEarlGrey waitForWebStateContainingElement:selector]; - NSString* expectedType = base::SysUTF8ToNSString([self - getStringFromDictionaryWithKey:"expectedAutofillType" - error:&error]); - if (error) { - return error; - } - + NSString* expectedType = base::SysUTF8ToNSString( + [self getStringFromDictionaryWithKey:"expectedAutofillType"]); NSString* expectedValue = base::SysUTF8ToNSString( - [self getStringFromDictionaryWithKey:"expectedValue" error:&error]); - if (error) { - return error; - } + [self getStringFromDictionaryWithKey:"expectedValue"]); NSString* predictionType = base::mac::ObjCCastStrict<NSString>([self executeJavascript:"return target.placeholder;" - onTarget:selector - error:&error]); - if (error) { - return error; - } + onTarget:[self selectorForTarget]]); - NSString* autofilledValue = base::mac::ObjCCastStrict<NSString>([self - executeJavascript:"return target.value;" - onTarget:selector - error:&error]); - if (error) { - return error; - } + NSString* autofilledValue = base::mac::ObjCCastStrict<NSString>( + [self executeJavascript:"return target.value;" onTarget:selector]); - if (![predictionType isEqualToString:expectedType]) { - return testing::NSErrorWithLocalizedDescription( - [NSString stringWithFormat:@"Expected prediction type %@ but got %@", - expectedType, predictionType]); - } - if (![autofilledValue isEqualToString:expectedValue]) { - return testing::NSErrorWithLocalizedDescription( - [NSString stringWithFormat:@"Expected autofilled value %@ but got %@", - autofilledValue, expectedValue]); - } - return nil; + GREYAssertEqualObjects(predictionType, expectedType, + @"Expected prediction type %@ but got %@", + expectedType, predictionType); + GREYAssertEqualObjects(autofilledValue, expectedValue, + @"Expected autofilled value %@ but got %@", + expectedValue, autofilledValue); } @end @implementation AutomationActionSelectDropdown -- (NSError*)execute { - NSError* error = nil; - - ElementSelector* selector = [self selectorForTarget:&error]; - if (error) { - return error; - } +- (void)execute { + ElementSelector* selector = [self selectorForTarget]; // Wait for the element to be visible on the page. [ChromeEarlGrey waitForWebStateContainingElement:selector]; - int selectedIndex = [self getIntFromDictionaryWithKey:"index" error:&error]; - if (error) { - return error; - } - + int selectedIndex = [self getIntFromDictionaryWithKey:"index"]; [self executeJavascript: base::SysNSStringToUTF8([NSString stringWithFormat:@"target.options.selectedIndex = %d; " @"triggerOnChangeEventOnElement(target);", selectedIndex]) - onTarget:selector - error:&error]; - - return error; + onTarget:selector]; } @end @implementation AutomationActionUnrecognized -- (NSError*)execute { +- (void)execute { const base::Value* typeValue = self.actionDictionary->FindKeyOfType("type", base::Value::Type::STRING); const std::string type(typeValue->GetString()); - return testing::NSErrorWithLocalizedDescription( - [NSString stringWithFormat:@"Unknown action of type %s", type.c_str()]); + GREYAssert(NO, @"Unknown action of type %s", type.c_str()); } @end @implementation AutomationActionType -- (NSError*)execute { - NSError* error = nil; - - ElementSelector* selector = [self selectorForTarget:&error]; - if (error) { - return error; - } - - std::string value = [self getStringFromDictionaryWithKey:"value" - error:&error]; - if (error) { - return error; - } - +- (void)execute { + ElementSelector* selector = [self selectorForTarget]; + std::string value = [self getStringFromDictionaryWithKey:"value"]; [self executeJavascript: base::SysNSStringToUTF8([NSString stringWithFormat: @"__gCrWeb.fill.setInputElementValue(\"%s\", target);", value.c_str()]) - onTarget:selector - error:&error]; - return error; + onTarget:selector]; } @end @implementation AutomationActionConfirmInfobar -- (NSError*)execute { +- (void)execute { [[EarlGrey selectElementWithMatcher: grey_accessibilityID(kConfirmInfobarButton1AccessibilityIdentifier)] performAction:grey_tap()]; - return nil; } @end
diff --git a/ios/chrome/browser/autofill/automation/automation_action_egtest.mm b/ios/chrome/browser/autofill/automation/automation_action_egtest.mm index c7511ef8..678e49ec 100644 --- a/ios/chrome/browser/autofill/automation/automation_action_egtest.mm +++ b/ios/chrome/browser/autofill/automation/automation_action_egtest.mm
@@ -8,7 +8,6 @@ #import "ios/chrome/browser/autofill/automation/automation_action.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/web/public/test/js_test_util.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -45,13 +44,8 @@ base::DictionaryValue dict = base::DictionaryValue(); dict.SetKey("type", base::Value("click")); dict.SetKey("selector", base::Value("//*[@id=\"fill_form\"]")); - - NSError* actionCreationError = nil; - AutomationAction* action = - [AutomationAction actionWithValueDictionary:dict - error:&actionCreationError]; - CHROME_EG_ASSERT_NO_ERROR(actionCreationError); - CHROME_EG_ASSERT_NO_ERROR([action execute]); + AutomationAction* action = [AutomationAction actionWithValueDictionary:dict]; + [action execute]; NSError* error; id result = chrome_test_util::ExecuteJavaScript( @@ -69,13 +63,9 @@ base::DictionaryValue clickDict = base::DictionaryValue(); clickDict.SetKey("type", base::Value("click")); clickDict.SetKey("selector", base::Value("//*[@id=\"fill_form_delay\"]")); - - NSError* actionCreationError = nil; AutomationAction* clickAction = - [AutomationAction actionWithValueDictionary:clickDict - error:&actionCreationError]; - CHROME_EG_ASSERT_NO_ERROR(actionCreationError); - CHROME_EG_ASSERT_NO_ERROR([clickAction execute]); + [AutomationAction actionWithValueDictionary:clickDict]; + [clickAction execute]; base::DictionaryValue waitForDict = base::DictionaryValue(); waitForDict.SetKey("type", base::Value("waitFor")); @@ -85,10 +75,8 @@ "Smith\";")); waitForDict.SetKey("assertions", std::move(assertions)); AutomationAction* waitForAction = - [AutomationAction actionWithValueDictionary:waitForDict - error:&actionCreationError]; - CHROME_EG_ASSERT_NO_ERROR(actionCreationError); - CHROME_EG_ASSERT_NO_ERROR([waitForAction execute]); + [AutomationAction actionWithValueDictionary:waitForDict]; + [waitForAction execute]; } - (void)testAutomationActionSelectDropdown { @@ -96,13 +84,9 @@ selectDict.SetKey("type", base::Value("select")); selectDict.SetKey("selector", base::Value("//*[@name=\"cc_month_exp\"]")); selectDict.SetKey("index", base::Value(5)); - - NSError* actionCreationError = nil; - AutomationAction* clickAction = - [AutomationAction actionWithValueDictionary:selectDict - error:&actionCreationError]; - CHROME_EG_ASSERT_NO_ERROR(actionCreationError); - CHROME_EG_ASSERT_NO_ERROR([clickAction execute]); + AutomationAction* selectAction = + [AutomationAction actionWithValueDictionary:selectDict]; + [selectAction execute]; NSError* error; id result = chrome_test_util::ExecuteJavaScript(
diff --git a/ios/chrome/browser/autofill/automation/automation_egtest.mm b/ios/chrome/browser/autofill/automation/automation_egtest.mm index c3b215b..5344226 100644 --- a/ios/chrome/browser/autofill/automation/automation_egtest.mm +++ b/ios/chrome/browser/autofill/automation/automation_egtest.mm
@@ -230,14 +230,10 @@ for (auto const& actionValue : actionsValues) { GREYAssert(actionValue.is_dict(), @"Expecting each action to be a dictionary in the JSON file."); - - NSError* actionCreationError = nil; - AutomationAction* action = [AutomationAction - actionWithValueDictionary:static_cast<const base::DictionaryValue&>( - actionValue) - error:&actionCreationError]; - CHROME_EG_ASSERT_NO_ERROR(actionCreationError); - [actions_ addObject:action]; + [actions_ addObject:[AutomationAction + actionWithValueDictionary: + static_cast<const base::DictionaryValue&>( + actionValue)]]; } } @@ -286,7 +282,7 @@ [ChromeEarlGrey loadURL:startUrl]; for (AutomationAction* action in actions_) { - CHROME_EG_ASSERT_NO_ERROR([action execute]); + [action execute]; } } @catch (NSException* e) { return false;
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h index 9bdfcaa..8498897f 100644 --- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h +++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
@@ -87,7 +87,7 @@ std::unique_ptr<base::DictionaryValue> legal_message, SaveCreditCardOptions options, UploadSaveCardPromptCallback callback) override; - void CreditCardUploadCompleted() override; + void CreditCardUploadCompleted(bool card_saved) override; void ConfirmCreditCardFillAssist(const CreditCard& card, base::OnceClosure callback) override; bool HasCreditCardScanFeature() override;
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm index a109158f..d25dac1 100644 --- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm +++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
@@ -264,7 +264,7 @@ } } -void ChromeAutofillClientIOS::CreditCardUploadCompleted() { +void ChromeAutofillClientIOS::CreditCardUploadCompleted(bool card_saved) { NOTIMPLEMENTED(); }
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index 562e2c2..4ad2948d7 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -1644,6 +1644,14 @@ if (!self.presentedViewController) activeWebState->SetKeepRenderProcessAlive(false); } + + // TODO(crbug.com/976411):This should probably move to the BannerVC once/if + // the dismiss event from BVC is observable. + if (IsInfobarUIRebootEnabled() && + [self.infobarContainerCoordinator isPresentingInfobarBanner]) { + [self.infobarContainerCoordinator dismissInfobarBannerAnimated:NO + completion:nil]; + } [_bookmarkInteractionController dismissSnackbar]; [super viewWillDisappear:animated]; }
diff --git a/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_am.xtb b/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_am.xtb index afc43bea..4997dfb 100644 --- a/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_am.xtb +++ b/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_am.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="am"> <translation id="1613742542373525524">APPLICATION_NAME ይህን አገናኝ መያዝ አይችልም።</translation> +<translation id="4655616150233109325">በChrome ውስጥ ክፈት</translation> <translation id="4743991241988563337">በኋላ ላይ ያንብቡ</translation> <translation id="6930009216791986919">ወደ ዕልባቶች አክል</translation> <translation id="6965382102122355670">እሺ</translation>
diff --git a/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_fil.xtb b/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_fil.xtb index 5cdfc2a1..525b2d2 100644 --- a/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_fil.xtb +++ b/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_fil.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="fil"> <translation id="1613742542373525524">Hindi maaaring pamahalaan ng APPLICATION_NAME ang link na ito.</translation> +<translation id="4655616150233109325">Buksan sa Chrome</translation> <translation id="4743991241988563337">Basahin Sa Ibang Pagkakataon</translation> <translation id="6930009216791986919">Idagdag sa Mga Bookmark</translation> <translation id="6965382102122355670">OK</translation>
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h index 050001d6..f7cd61b 100644 --- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h +++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
@@ -80,7 +80,7 @@ std::unique_ptr<base::DictionaryValue> legal_message, SaveCreditCardOptions options, UploadSaveCardPromptCallback callback) override; - void CreditCardUploadCompleted() override; + void CreditCardUploadCompleted(bool card_saved) override; void ConfirmCreditCardFillAssist(const CreditCard& card, base::OnceClosure callback) override; bool HasCreditCardScanFeature() override;
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm index 530fa7cd..d63134a2 100644 --- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm +++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
@@ -176,7 +176,7 @@ DCHECK(options.show_prompt); } -void WebViewAutofillClientIOS::CreditCardUploadCompleted() { +void WebViewAutofillClientIOS::CreditCardUploadCompleted(bool card_saved) { NOTIMPLEMENTED(); }
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc index d651773..12ba25d 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc +++ b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc
@@ -114,7 +114,6 @@ screen_observer_delegate_( ScreenObserverDelegate::Create(this, ui_task_runner)), lens_facing_(device_descriptor.facing), - camera_orientation_(0), // External cameras have lens_facing as MEDIA_VIDEO_FACING_NONE. // We don't want to rotate the frame even if the device rotates. rotates_with_device_(lens_facing_ != @@ -293,9 +292,7 @@ // Therefore, for back camera, we need to rotate (360 - |rotation|). rotation = (360 - rotation) % 360; } - // Take into account camera orientation w.r.t. the display. External cameras - // would have camera_orientation_ as 0. - rotation_ = (rotation + camera_orientation_) % 360; + rotation_ = rotation; if (camera_device_ipc_thread_.IsRunning()) { camera_device_ipc_thread_.task_runner()->PostTask( FROM_HERE,
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h index f1fe54f..e0214aa 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h +++ b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h
@@ -91,7 +91,6 @@ scoped_refptr<ScreenObserverDelegate> screen_observer_delegate_; const VideoFacingMode lens_facing_; - const int camera_orientation_; // Whether the incoming frames should rotate when the device rotates. const bool rotates_with_device_; int rotation_;
diff --git a/remoting/resources/remoting_strings_de.xtb b/remoting/resources/remoting_strings_de.xtb index f75931f..19be8c5d 100644 --- a/remoting/resources/remoting_strings_de.xtb +++ b/remoting/resources/remoting_strings_de.xtb
@@ -259,7 +259,7 @@ <translation id="6570205395680337606">App zurücksetzen. Alle nicht gespeicherten Daten gehen verloren.</translation> <translation id="6583902294974160967">Hilfe</translation> <translation id="6612717000975622067">Strg-Alt-Entf senden</translation> -<translation id="6654753848497929428">Teilen</translation> +<translation id="6654753848497929428">Freigeben</translation> <translation id="6668065415969892472">Ihre PIN wurde aktualisiert.</translation> <translation id="6681800064886881394">Copyright 2013 Google Inc. Alle Rechte vorbehalten</translation> <translation id="6705482892455291412">Sobald der Code eingegeben wurde, werden Sie aufgefordert, der Verbindung zuzustimmen und die Freigabesitzung zu starten.</translation>
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb index 293900ee..f36cb6a 100644 --- a/remoting/resources/remoting_strings_hi.xtb +++ b/remoting/resources/remoting_strings_hi.xtb
@@ -73,7 +73,7 @@ <translation id="2405928220797050937">पुराना होने के कारण अब यह ऐप्लिकेशन नहीं चलता है. यह पक्का करने के लिए कि आपको सबसे नई सुविधाएं और सुरक्षा अपडेट मिलते रहें, कृपया <ph name="LINK_BEGIN" />Chrome रिमोट डेस्कटॉप वेब ऐप्लिकेशन<ph name="LINK_END" /> का उपयोग करें.</translation> <translation id="2499160551253595098">हमें इस्तेमाल के आंकड़े और खराबी रिपोर्ट एकत्रित करने की अनुमति देते हुए Chrome रिमोट डेस्कटॉप को सुधारने में हमारी मदद करें.</translation> <translation id="2509394361235492552"><ph name="HOSTNAME" /> से कनेक्ट है</translation> -<translation id="2512228156274966424">ध्यान दें: सभी कीबोर्ड शॉर्टकट की उपलब्धता सुनिश्चित करने के लिए, आप Chrome रिमोट डेस्कटॉप को ‘विंडो के रूप में खोलें’ पर कॉन्फ़िगर कर सकते हैं.</translation> +<translation id="2512228156274966424">ध्यान दें: सभी कीबोर्ड शॉर्टकट की उपलब्धता पक्का करने के लिए, आप Chrome रिमोट डेस्कटॉप को ‘विंडो के रूप में खोलें’ पर कॉन्फ़िगर कर सकते हैं.</translation> <translation id="2540992418118313681">क्या आप इस कंप्यूटर को किसी दूसरे उपयोगकर्ता से शेयर करना चाहते हैं ताकि वह इसे देख और नियंत्रित कर सके?</translation> <translation id="2579271889603567289">होस्ट बंद हो गया या चालू नहीं हो पाया.</translation> <translation id="2599300881200251572">यह सेवा Chrome दूरस्थ डेस्कटॉप क्लाइंट के इनकमिंग कनेक्शन सक्षम करती है.</translation> @@ -161,7 +161,7 @@ <translation id="4472575034687746823">शुरू करें</translation> <translation id="4481276415609939789">आपके पास कोई रजिस्टर किया हुआ कंप्यूटर नहीं हैं. कंप्यूटर पर रिमोट (दूर के) कनेक्शन चालू करने के लिए, Chromoting इंस्टॉल करें और “<ph name="BUTTON_NAME" />” क्लिक करें.</translation> <translation id="4513946894732546136">सुझाव</translation> -<translation id="4517233780764084060">ध्यान दें: यह सुनिश्चित करने के लिए कि सभी कीबोर्ड शॉर्टकट उपलब्ध हैं, आप Chromoting को ‘विंडो के रूप में खोलें’ पर कॉन्फ़िगर कर सकते हैं.</translation> +<translation id="4517233780764084060">ध्यान दें: यह पक्का करने के लिए कि सभी कीबोर्ड शॉर्टकट उपलब्ध हैं, आप Chromoting को ‘विंडो के रूप में खोलें’ पर कॉन्फ़िगर कर सकते हैं.</translation> <translation id="4563926062592110512">क्लाइंट डिसकनेक्ट किया गया: <ph name="CLIENT_USERNAME" />.</translation> <translation id="4572065712096155137">एक्सेस करें</translation> <translation id="4592037108270173918">मोबाइल नेटवर्क के ज़रिए किसी डिवाइस से कनेक्ट होने पर डेटा शुल्क लागू हो सकते हैं. क्या आप जारी रखना चाहते हैं?</translation>
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb index c5bbc60..aaa63c9 100644 --- a/remoting/resources/remoting_strings_ta.xtb +++ b/remoting/resources/remoting_strings_ta.xtb
@@ -285,6 +285,7 @@ <translation id="7116737094673640201">Chrome தொலைநிலை டெஸ்க்டாப்பிற்கு வரவேற்கிறோம்</translation> <translation id="7144878232160441200">மீண்டும் முயலவும்</translation> <translation id="7149517134817561223">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட்டிற்குக் கட்டளைகளை வழங்கும் ஆப்ஸ்.</translation> +<translation id="7213491505512310433">நிலைப்புத்தன்மை மேம்பாடுகளும் பிழை திருத்தங்களும் சேர்க்கப்பட்டுள்ளன.</translation> <translation id="7215059001581613786">நான்கு அல்லது அதற்கு மேற்பட்ட இலக்கங்களைக் கொண்ட PIN ஐ உள்ளிடுக.</translation> <translation id="7312846573060934304">ஹோஸ்ட் ஆஃப்லைனில் உள்ளது.</translation> <translation id="7319983568955948908">பகிர்தலை நிறுத்து</translation>
diff --git a/services/network/cross_origin_read_blocking.cc b/services/network/cross_origin_read_blocking.cc index 7d0dcc9..2712cb8 100644 --- a/services/network/cross_origin_read_blocking.cc +++ b/services/network/cross_origin_read_blocking.cc
@@ -931,13 +931,6 @@ return true; } -void CrossOriginReadBlocking::ResponseAnalyzer::LogBytesReadForSniffing() { - if (bytes_read_for_sniffing_ >= 0) { - UMA_HISTOGRAM_COUNTS_1M("SiteIsolation.XSD.Browser.BytesReadForSniffing", - bytes_read_for_sniffing_); - } -} - void CrossOriginReadBlocking::ResponseAnalyzer::LogAllowedResponse() { // Note that if a response is allowed because of hitting EOF or // kMaxBytesToSniff, then |sniffers_| are not emptied and consequently @@ -955,8 +948,6 @@ needs_sniffing() ? network::CrossOriginReadBlocking::Action::kAllowedAfterSniffing : network::CrossOriginReadBlocking::Action::kAllowedWithoutSniffing); - - LogBytesReadForSniffing(); } void CrossOriginReadBlocking::ResponseAnalyzer::LogBlockedResponse() { @@ -969,20 +960,9 @@ ? network::CrossOriginReadBlocking::Action::kBlockedAfterSniffing : network::CrossOriginReadBlocking::Action::kBlockedWithoutSniffing); - UMA_HISTOGRAM_BOOLEAN( - "SiteIsolation.XSD.Browser.Blocked.ContentLength.WasAvailable", - content_length() >= 0); - if (content_length() >= 0) { - UMA_HISTOGRAM_COUNTS_10000( - "SiteIsolation.XSD.Browser.Blocked.ContentLength.ValueIfAvailable", - content_length()); - } - UMA_HISTOGRAM_ENUMERATION( "SiteIsolation.XSD.Browser.Blocked.CanonicalMimeType", canonical_mime_type_); - - LogBytesReadForSniffing(); } // static
diff --git a/services/network/cross_origin_read_blocking.h b/services/network/cross_origin_read_blocking.h index cd2177d..7b9e6c20 100644 --- a/services/network/cross_origin_read_blocking.h +++ b/services/network/cross_origin_read_blocking.h
@@ -150,9 +150,6 @@ // if ShouldBlockBasedOnHeaders returns kNeedToSniffMore void CreateSniffers(); - // Logs bytes read for sniffing, but only if sniffing actually happened. - void LogBytesReadForSniffing(); - // Outcome of ShouldBlockBasedOnHeaders recorded inside the Create method. BlockingDecision should_block_based_on_headers_;
diff --git a/services/network/network_service.cc b/services/network/network_service.cc index 5ac1b0b..184cc442 100644 --- a/services/network/network_service.cc +++ b/services/network/network_service.cc
@@ -41,6 +41,7 @@ #include "net/log/net_log_capture_mode.h" #include "net/log/net_log_util.h" #include "net/nqe/network_quality_estimator.h" +#include "net/socket/client_socket_pool_manager.h" #include "net/ssl/ssl_key_logger_impl.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_builder.h" @@ -544,6 +545,22 @@ } } +void NetworkService::SetMaxConnectionsPerProxy(int32_t max_connections) { + int new_limit = max_connections; + if (new_limit < 0) + new_limit = net::kDefaultMaxSocketsPerProxyServer; + + // Clamp the value between min_limit and max_limit. + int max_limit = 99; + int min_limit = net::ClientSocketPoolManager::max_sockets_per_group( + net::HttpNetworkSession::NORMAL_SOCKET_POOL); + new_limit = std::max(std::min(new_limit, max_limit), min_limit); + + // Assign the global limit. + net::ClientSocketPoolManager::set_max_sockets_per_proxy_server( + net::HttpNetworkSession::NORMAL_SOCKET_POOL, new_limit); +} + bool NetworkService::HasRawHeadersAccess(uint32_t process_id, const GURL& resource_url) const { // Allow raw headers for browser-initiated requests.
diff --git a/services/network/network_service.h b/services/network/network_service.h index 34c8cd2c..3e891aec 100644 --- a/services/network/network_service.h +++ b/services/network/network_service.h
@@ -159,6 +159,7 @@ mojom::HttpAuthDynamicParamsPtr http_auth_dynamic_params) override; void SetRawHeadersAccess(uint32_t process_id, const std::vector<url::Origin>& origins) override; + void SetMaxConnectionsPerProxy(int32_t max_connections) override; void GetNetworkChangeManager( mojom::NetworkChangeManagerRequest request) override; void GetNetworkQualityEstimatorManager(
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc index 80bf224..4554386 100644 --- a/services/network/network_service_unittest.cc +++ b/services/network/network_service_unittest.cc
@@ -31,6 +31,7 @@ #include "net/http/http_auth_scheme.h" #include "net/net_buildflags.h" #include "net/proxy_resolution/proxy_config.h" +#include "net/socket/client_socket_pool_manager.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" @@ -603,6 +604,42 @@ } #endif // defined(OS_ANDROID) +static int GetGlobalMaxConnectionsPerProxy() { + return net::ClientSocketPoolManager::max_sockets_per_proxy_server( + net::HttpNetworkSession::NORMAL_SOCKET_POOL); +} + +// Tests that NetworkService::SetMaxConnectionsPerProxy() (1) modifies globals +// in net::ClientSocketPoolManager (2) saturates out of bound values. +TEST_F(NetworkServiceTest, SetMaxConnectionsPerProxy) { + const int kDefault = net::kDefaultMaxSocketsPerProxyServer; + const int kMin = 6; + const int kMax = 99; + + // Starts off at default value. + EXPECT_EQ(net::kDefaultMaxSocketsPerProxyServer, + GetGlobalMaxConnectionsPerProxy()); + + // Anything less than kMin saturates to kMin. + service()->SetMaxConnectionsPerProxy(kMin - 1); + EXPECT_EQ(kMin, GetGlobalMaxConnectionsPerProxy()); + + // Anything larger than kMax saturates to kMax + service()->SetMaxConnectionsPerProxy(kMax + 1); + EXPECT_EQ(kMax, GetGlobalMaxConnectionsPerProxy()); + + // Anything in between kMin and kMax should be set exactly. + service()->SetMaxConnectionsPerProxy(58); + EXPECT_EQ(58, GetGlobalMaxConnectionsPerProxy()); + + // Negative values select the default. + service()->SetMaxConnectionsPerProxy(-2); + EXPECT_EQ(kDefault, GetGlobalMaxConnectionsPerProxy()); + + // Restore the default value to minize sideffects. + service()->SetMaxConnectionsPerProxy(kDefault); +} + class NetworkServiceTestWithService : public testing::Test { public: NetworkServiceTestWithService()
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom index d3499ce..561975d 100644 --- a/services/network/public/mojom/network_service.mojom +++ b/services/network/public/mojom/network_service.mojom
@@ -343,6 +343,12 @@ // (e.g. DevTools attached). SetRawHeadersAccess(uint32 process_id, array<url.mojom.Origin> origins); + // Sets the maximum number of connections for a proxy server. + // * Negative values will set the default proxy connection limit (32) + // * Values larger than 99 will saturate to 99. + // * Values smaller than 6 will saturate to 6. + SetMaxConnectionsPerProxy(int32 max_connections); + // Gets the NetworkChangeManager. GetNetworkChangeManager( NetworkChangeManager& network_change_manager);
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index c05ecf4..9712b2197 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -872,6 +872,7 @@ { "platforms": [ "android", + "android_webview", "chromeos", "ios", "linux", @@ -1068,6 +1069,7 @@ { "platforms": [ "android", + "android_webview", "ios" ], "experiments": [ @@ -1346,62 +1348,6 @@ ] } ], - "CerseiFakeboxOnNtp": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "EnabledAlt", - "enable_features": [ - "UseAlternateFakeboxOnNtp" - ] - }, - { - "name": "EnabledAltWithIcon", - "enable_features": [ - "FakeboxSearchIconOnNtp" - ] - }, - { - "name": "EnabledAltWithIconColor", - "enable_features": [ - "FakeboxSearchIconColorOnNtp" - ] - }, - { - "name": "EnabledAltRect", - "enable_features": [ - "UseAlternateFakeboxRectOnNtp" - ] - }, - { - "name": "EnabledAltRectWithIcon", - "enable_features": [ - "FakeboxSearchIconOnNtp", - "UseAlternateFakeboxRectOnNtp" - ] - }, - { - "name": "EnabledAltRectWithIconColor", - "enable_features": [ - "FakeboxSearchIconColorOnNtp", - "UseAlternateFakeboxRectOnNtp" - ] - }, - { - "name": "EnabledShortString", - "enable_features": [ - "FakeboxShortHintTextOnNtp" - ] - } - ] - } - ], "CertDualVerificationTrial": [ { "platforms": [ @@ -3675,7 +3621,8 @@ "OmniboxRichEntitySuggestions", "OmniboxTailSuggestions", "OmniboxUIExperimentMaxAutocompleteMatches", - "QueryInOmnibox" + "QueryInOmnibox", + "UseAlternateFakeboxOnNtp" ] } ]
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn index f02ba9a..9e2f058a 100644 --- a/third_party/blink/public/BUILD.gn +++ b/third_party/blink/public/BUILD.gn
@@ -82,12 +82,6 @@ ] } - java_cpp_enum("blink_cursor_type_java_enums_srcjar") { - sources = [ - "./platform/web_cursor_info.h", - ] - } - android_library("blink_headers_java") { deps = [ "//services/network/public/mojom:mojom_java",
diff --git a/third_party/blink/public/platform/DEPS b/third_party/blink/public/platform/DEPS index 6c7ff59..91bd315 100644 --- a/third_party/blink/public/platform/DEPS +++ b/third_party/blink/public/platform/DEPS
@@ -48,6 +48,7 @@ "+third_party/skia", "+ui/base/ime/text_input_action.h", "+ui/base/page_transition_types.h", + "+ui/base/cursor/types", "+ui/events/types", "+ui/gfx", "+url",
diff --git a/third_party/blink/public/platform/web_cursor_info.h b/third_party/blink/public/platform/web_cursor_info.h index b93b78f..baa94a8b 100644 --- a/third_party/blink/public/platform/web_cursor_info.h +++ b/third_party/blink/public/platform/web_cursor_info.h
@@ -33,6 +33,7 @@ #include "third_party/blink/public/platform/web_point.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "ui/base/cursor/types/cursor_types.h" #ifdef WIN32 typedef struct HICON__* HICON; @@ -44,60 +45,7 @@ class Cursor; struct WebCursorInfo { - // A Java counterpart will be generated for this enum. - // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.blink_public.web - // GENERATED_JAVA_CLASS_NAME_OVERRIDE: WebCursorInfoType - enum Type { - kTypePointer, - kTypeCross, - kTypeHand, - kTypeIBeam, - kTypeWait, - kTypeHelp, - kTypeEastResize, - kTypeNorthResize, - kTypeNorthEastResize, - kTypeNorthWestResize, - kTypeSouthResize, - kTypeSouthEastResize, - kTypeSouthWestResize, - kTypeWestResize, - kTypeNorthSouthResize, - kTypeEastWestResize, - kTypeNorthEastSouthWestResize, - kTypeNorthWestSouthEastResize, - kTypeColumnResize, - kTypeRowResize, - kTypeMiddlePanning, - kTypeEastPanning, - kTypeNorthPanning, - kTypeNorthEastPanning, - kTypeNorthWestPanning, - kTypeSouthPanning, - kTypeSouthEastPanning, - kTypeSouthWestPanning, - kTypeWestPanning, - kTypeMove, - kTypeVerticalText, - kTypeCell, - kTypeContextMenu, - kTypeAlias, - kTypeProgress, - kTypeNoDrop, - kTypeCopy, - kTypeNone, - kTypeNotAllowed, - kTypeZoomIn, - kTypeZoomOut, - kTypeGrab, - kTypeGrabbing, - kTypeMiddlePanningVertical, - kTypeMiddlePanningHorizontal, - kTypeCustom, - kTypeMaxValue = kTypeCustom - }; - - Type type; + ui::CursorType type; WebPoint hot_spot; float image_scale_factor; SkBitmap custom_image; @@ -110,7 +58,7 @@ HCURSOR external_handle; #endif - explicit WebCursorInfo(Type type = kTypePointer) + explicit WebCursorInfo(ui::CursorType type = ui::CursorType::kPointer) : type(type), image_scale_factor(1) { #ifdef WIN32 external_handle = 0;
diff --git a/third_party/blink/public/platform/web_url_request.h b/third_party/blink/public/platform/web_url_request.h index 0461bac0..602f88b2 100644 --- a/third_party/blink/public/platform/web_url_request.h +++ b/third_party/blink/public/platform/web_url_request.h
@@ -85,10 +85,11 @@ enum PreviewsTypes { kPreviewsUnspecified = 0, // Let the browser process decide whether or // not to request Preview types. - kServerLoFiOn = 1 << 0, // Request a Lo-Fi version of the resource - // from the server. - kClientLoFiOn = 1 << 1, // Request a Lo-Fi version of the resource - // from the client. + kServerLoFiOn_DEPRECATED = + 1 << 0, // Request a Lo-Fi version of the resource + // from the server. Deprecated and should not be used. + kClientLoFiOn = 1 << 1, // Request a Lo-Fi version of the resource + // from the client. kClientLoFiAutoReload = 1 << 2, // Request the original version of the // resource after a decoding error occurred // when attempting to use Client Lo-Fi.
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 084a64a..d213f2a 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1318,8 +1318,6 @@ "layout/geometry/physical_rect_test.cc", "layout/geometry/physical_size_test.cc", "layout/grid_test.cc", - "layout/jank_region_test.cc", - "layout/jank_tracker_test.cc", "layout/layout_block_test.cc", "layout/layout_box_model_object_test.cc", "layout/layout_box_test.cc", @@ -1334,6 +1332,8 @@ "layout/layout_object_test.cc", "layout/layout_progress_test.cc", "layout/layout_replaced_test.cc", + "layout/layout_shift_region_test.cc", + "layout/layout_shift_tracker_test.cc", "layout/layout_table_cell_test.cc", "layout/layout_table_col_test.cc", "layout/layout_table_row_test.cc",
diff --git a/third_party/blink/renderer/core/css/font_face_set_document.cc b/third_party/blink/renderer/core/css/font_face_set_document.cc index 22c04c72..05a8a1e 100644 --- a/third_party/blink/renderer/core/css/font_face_set_document.cc +++ b/third_party/blink/renderer/core/css/font_face_set_document.cc
@@ -75,7 +75,6 @@ } void FontFaceSetDocument::BeginFontLoading(FontFace* font_face) { - histogram_.IncrementCount(); AddToLoadingFonts(font_face); } @@ -224,12 +223,6 @@ } void FontFaceSetDocument::FontLoadHistogram::Record() { - if (!recorded_) { - recorded_ = true; - DEFINE_STATIC_LOCAL(CustomCountHistogram, web_fonts_in_page_histogram, - ("WebFont.WebFontsInPage", 1, 100, 50)); - web_fonts_in_page_histogram.Count(count_); - } if (status_ == kHadBlankText || status_ == kDidNotHaveBlankText) { DEFINE_STATIC_LOCAL(EnumerationHistogram, had_blank_text_histogram, ("WebFont.HadBlankText", 2));
diff --git a/third_party/blink/renderer/core/css/font_face_set_document.h b/third_party/blink/renderer/core/css/font_face_set_document.h index d3751dc8..e02777a 100644 --- a/third_party/blink/renderer/core/css/font_face_set_document.h +++ b/third_party/blink/renderer/core/css/font_face_set_document.h
@@ -90,15 +90,12 @@ public: enum Status { kNoWebFonts, kHadBlankText, kDidNotHaveBlankText, kReported }; - FontLoadHistogram() : status_(kNoWebFonts), count_(0), recorded_(false) {} - void IncrementCount() { count_++; } + FontLoadHistogram() : status_(kNoWebFonts) {} void UpdateStatus(FontFace*); void Record(); private: Status status_; - int count_; - bool recorded_; }; FontLoadHistogram histogram_; DISALLOW_COPY_AND_ASSIGN(FontFaceSetDocument);
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 945d807..3cb3fbaa 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -750,23 +750,22 @@ frame_->Client()->DidSetFramePolicyHeaders(GetSandboxFlags(), {}); Document* context_document = ContextDocument(); - if (context_document) { - Frame* context_document_frame = context_document->GetFrame(); - CHECK(context_document_frame); + if (context_document && context_document->GetFrame()) { bool has_potential_universal_access_privilege = false; - if (Settings* settings = context_document_frame->GetSettings()) { + if (Settings* settings = context_document->GetFrame()->GetSettings()) { // TODO(keishi): Also check if AllowUniversalAccessFromFileURLs might // dynamically change. if (!settings->GetWebSecurityEnabled() || settings->GetAllowUniversalAccessFromFileURLs()) has_potential_universal_access_privilege = true; } - SetAgent(context_document_frame->window_agent_factory().GetAgentForOrigin( - has_potential_universal_access_privilege, GetIsolate(), - GetSecurityOrigin())); + SetAgent( + context_document->GetFrame()->window_agent_factory().GetAgentForOrigin( + has_potential_universal_access_privilege, GetIsolate(), + GetSecurityOrigin())); } else { - // ContextDocument is null only for Documents created in unit tests. - // In that case, use a throw away WindowAgent. + // If the ContextDocument or its frame is not available, use a throw away + // WindowAgent as we do in GetScheduler. SetAgent(MakeGarbageCollected<WindowAgent>(GetIsolate())); }
diff --git a/third_party/blink/renderer/core/editing/link_selection_test.cc b/third_party/blink/renderer/core/editing/link_selection_test.cc index 1d017c4..46b3e4f 100644 --- a/third_party/blink/renderer/core/editing/link_selection_test.cc +++ b/third_party/blink/renderer/core/editing/link_selection_test.cc
@@ -194,7 +194,7 @@ test::RunDelayedTasks(TimeDelta::FromMilliseconds(50)); const auto& cursor = main_frame_->GetFrame()->GetChromeClient().LastSetCursorForTesting(); - EXPECT_EQ(Cursor::kHand, cursor.GetType()); + EXPECT_EQ(ui::CursorType::kHand, cursor.GetType()); } TEST_F(LinkSelectionTest, DragOnNothingShowsPointer) { @@ -206,7 +206,7 @@ test::RunDelayedTasks(TimeDelta::FromMilliseconds(50)); const auto& cursor = main_frame_->GetFrame()->GetChromeClient().LastSetCursorForTesting(); - EXPECT_EQ(Cursor::kPointer, cursor.GetType()); + EXPECT_EQ(ui::CursorType::kPointer, cursor.GetType()); } TEST_F(LinkSelectionTest, CaretCursorOverLinkDuringSelection) { @@ -219,7 +219,7 @@ test::RunDelayedTasks(TimeDelta::FromMilliseconds(50)); const auto& cursor = main_frame_->GetFrame()->GetChromeClient().LastSetCursorForTesting(); - EXPECT_EQ(Cursor::kIBeam, cursor.GetType()); + EXPECT_EQ(ui::CursorType::kIBeam, cursor.GetType()); } TEST_F(LinkSelectionTest, HandCursorOverLinkAfterContextMenu) { @@ -238,7 +238,7 @@ test::RunDelayedTasks(TimeDelta::FromMilliseconds(50)); const auto& cursor = main_frame_->GetFrame()->GetChromeClient().LastSetCursorForTesting(); - EXPECT_EQ(Cursor::kHand, cursor.GetType()); + EXPECT_EQ(ui::CursorType::kHand, cursor.GetType()); } TEST_F(LinkSelectionTest, SingleClickWithAltStartsDownload) {
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc index 673066d..fee6033 100644 --- a/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -3235,10 +3235,10 @@ last_cursor_type_ = cursor.type; } - int GetLastCursorType() const { return last_cursor_type_; } + ui::CursorType GetLastCursorType() const { return last_cursor_type_; } private: - int last_cursor_type_ = 0; + ui::CursorType last_cursor_type_ = ui::CursorType::kPointer; }; TEST_F(WebViewTest, MiddleClickAutoscrollCursor) { @@ -3258,7 +3258,7 @@ struct CursorTests { int resize_width; int resize_height; - blink::Cursor::Type expected_cursor; + ui::CursorType expected_cursor; } cursor_tests[] = {{100, 100, MiddlePanningCursor().GetType()}, {1010, 100, MiddlePanningVerticalCursor().GetType()}, {100, 2010, MiddlePanningHorizontalCursor().GetType()}};
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index 75bb862..5facf55 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -144,12 +144,6 @@ if (!(frame_previews_state & WebURLRequest::kClientLoFiOn)) return false; - // Even if this frame is using Server Lo-Fi, https:// images won't be - // handled by Server Lo-Fi since their requests won't be sent to the Data - // Saver proxy, so use Client Lo-Fi instead. - if (frame_previews_state & WebURLRequest::kServerLoFiOn) - return request.Url().ProtocolIs("https"); - return true; } @@ -1367,8 +1361,7 @@ Client()->GetPreviewsStateForFrame(); // Check for any data saving type of preview. return previews_state & - (WebURLRequest::kServerLoFiOn | WebURLRequest::kClientLoFiOn | - WebURLRequest::kNoScriptOn); + (WebURLRequest::kClientLoFiOn | WebURLRequest::kNoScriptOn); } bool LocalFrame::IsAdSubframe() const {
diff --git a/third_party/blink/renderer/core/frame/local_frame_test.cc b/third_party/blink/renderer/core/frame/local_frame_test.cc index b9507054..a28e675 100644 --- a/third_party/blink/renderer/core/frame/local_frame_test.cc +++ b/third_party/blink/renderer/core/frame/local_frame_test.cc
@@ -110,32 +110,6 @@ EXPECT_FALSE(page_holder2->GetFrame().IsUsingDataSavingPreview()); } -TEST_F(LocalFrameTest, - MaybeAllowPlaceholderImageConditionalOnSchemeForServerLoFi) { - ResourceRequest request1; - request1.SetUrl(KURL("https://secure.com")); - request1.SetPreviewsState(WebURLRequest::kPreviewsUnspecified); - FetchParameters params1(request1); - auto page_holder = std::make_unique<DummyPageHolder>( - IntSize(800, 600), nullptr, - MakeGarbageCollected<TestLocalFrameClient>(WebURLRequest::kServerLoFiOn | - WebURLRequest::kClientLoFiOn)); - MaybeAllowImagePlaceholder(page_holder.get(), params1); - EXPECT_EQ(FetchParameters::kAllowPlaceholder, - params1.GetImageRequestOptimization()); - - ResourceRequest request2; - request2.SetUrl(KURL("http://insecure.com")); - request2.SetPreviewsState(WebURLRequest::kPreviewsUnspecified); - FetchParameters params2(request2); - auto page_holder2 = std::make_unique<DummyPageHolder>( - IntSize(800, 600), nullptr, - MakeGarbageCollected<TestLocalFrameClient>(WebURLRequest::kServerLoFiOn | - WebURLRequest::kClientLoFiOn)); - MaybeAllowImagePlaceholder(page_holder2.get(), params2); - EXPECT_EQ(FetchParameters::kNone, params2.GetImageRequestOptimization()); -} - TEST_F(LocalFrameTest, IsUsingDataSavingPreview) { EXPECT_TRUE(std::make_unique<DummyPageHolder>( IntSize(800, 600), nullptr, @@ -146,12 +120,6 @@ EXPECT_TRUE(std::make_unique<DummyPageHolder>( IntSize(800, 600), nullptr, MakeGarbageCollected<TestLocalFrameClient>( - WebURLRequest::kServerLoFiOn)) - ->GetFrame() - .IsUsingDataSavingPreview()); - EXPECT_TRUE(std::make_unique<DummyPageHolder>( - IntSize(800, 600), nullptr, - MakeGarbageCollected<TestLocalFrameClient>( WebURLRequest::kNoScriptOn)) ->GetFrame() .IsUsingDataSavingPreview());
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index c4c392ba..43e745a 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -84,11 +84,11 @@ #include "third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.h" #include "third_party/blink/renderer/core/layout/adjust_for_absolute_zoom.h" #include "third_party/blink/renderer/core/layout/geometry/transform_state.h" -#include "third_party/blink/renderer/core/layout/jank_tracker.h" #include "third_party/blink/renderer/core/layout/layout_analyzer.h" #include "third_party/blink/renderer/core/layout/layout_counter.h" #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/layout/layout_embedded_object.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h" #include "third_party/blink/renderer/core/layout/style_retain_scope.h" @@ -280,7 +280,7 @@ forced_layout_start_time_(TimeTicks()), paint_frame_count_(0), unique_id_(NewUniqueObjectId()), - jank_tracker_(std::make_unique<JankTracker>(this)), + layout_shift_tracker_(std::make_unique<LayoutShiftTracker>(this)), paint_timing_detector_(MakeGarbageCollected<PaintTimingDetector>(this)) #if DCHECK_IS_ON() , @@ -397,7 +397,7 @@ ClearPrintContext(); ukm_aggregator_.reset(); - jank_tracker_->Dispose(); + layout_shift_tracker_->Dispose(); #if DCHECK_IS_ON() has_been_disposed_ = true; @@ -1222,7 +1222,7 @@ return; if (frame_->IsMainFrame()) - jank_tracker_->NotifyViewportSizeChanged(); + layout_shift_tracker_->NotifyViewportSizeChanged(); auto* layout_view = GetLayoutView(); if (layout_view) {
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 29af8150..c0febf0 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -69,12 +69,12 @@ class Frame; class FrameViewAutoSizeInfo; class JSONObject; -class JankTracker; class KURL; class LayoutAnalyzer; class LayoutBox; class LayoutEmbeddedObject; class LayoutObject; +class LayoutShiftTracker; class LayoutSVGRoot; class LayoutView; class LocalFrame; @@ -689,7 +689,7 @@ cc::AnimationHost* GetCompositorAnimationHost() const; CompositorAnimationTimeline* GetCompositorAnimationTimeline() const; - JankTracker& GetJankTracker() { return *jank_tracker_; } + LayoutShiftTracker& GetLayoutShiftTracker() { return *layout_shift_tracker_; } PaintTimingDetector& GetPaintTimingDetector() const { return *paint_timing_detector_; } @@ -995,7 +995,7 @@ size_t paint_frame_count_; UniqueObjectId unique_id_; - std::unique_ptr<JankTracker> jank_tracker_; + std::unique_ptr<LayoutShiftTracker> layout_shift_tracker_; Member<PaintTimingDetector> paint_timing_detector_; HeapHashSet<WeakMember<LifecycleNotificationObserver>> lifecycle_observers_;
diff --git a/third_party/blink/renderer/core/input/event_handler_test.cc b/third_party/blink/renderer/core/input/event_handler_test.cc index 0ef0c05..0fd3e70 100644 --- a/third_party/blink/renderer/core/input/event_handler_test.cc +++ b/third_party/blink/renderer/core/input/event_handler_test.cc
@@ -575,7 +575,7 @@ .SelectCursor(location, result) .GetCursor() .GetType(), - Cursor::Type::kHand); // A hand signals ability to navigate. + ui::CursorType::kHand); // A hand signals ability to navigate. } TEST_F(EventHandlerTest, EditableAnchorTextCanStartSelection) { @@ -598,7 +598,7 @@ .SelectCursor(location, result) .GetCursor() .GetType(), - Cursor::Type::kIBeam); // An I-beam signals editability. + ui::CursorType::kIBeam); // An I-beam signals editability. } // Regression test for http://crbug.com/641403 to verify we use up-to-date @@ -1386,11 +1386,11 @@ mouse_move_event.SetFrameScale(1); GetDocument().GetFrame()->GetEventHandler().HandleMouseMoveEvent( mouse_move_event, Vector<WebMouseEvent>(), Vector<WebMouseEvent>()); - EXPECT_EQ(Cursor::Type::kHelp, GetDocument() - .GetFrame() - ->GetChromeClient() - .LastSetCursorForTesting() - .GetType()); + EXPECT_EQ(ui::CursorType::kHelp, GetDocument() + .GetFrame() + ->GetChromeClient() + .LastSetCursorForTesting() + .GetType()); } // Ensure that tap on element in iframe should apply active state. @@ -1755,7 +1755,7 @@ const Cursor& cursor = GetDocument().GetFrame()->GetChromeClient().LastSetCursorForTesting(); - EXPECT_EQ(Cursor::Type::kCustom, cursor.GetType()); + EXPECT_EQ(ui::CursorType::kCustom, cursor.GetType()); } // Now, move the cursor so that it intersects the visual viewport. The cursor @@ -1771,7 +1771,7 @@ const Cursor& cursor = GetDocument().GetFrame()->GetChromeClient().LastSetCursorForTesting(); - EXPECT_EQ(Cursor::Type::kPointer, cursor.GetType()); + EXPECT_EQ(ui::CursorType::kPointer, cursor.GetType()); } } @@ -1814,7 +1814,7 @@ const Cursor& cursor = GetDocument().GetFrame()->GetChromeClient().LastSetCursorForTesting(); - EXPECT_EQ(Cursor::Type::kCustom, cursor.GetType()); + EXPECT_EQ(ui::CursorType::kCustom, cursor.GetType()); } // Now, move the cursor so that it intersects the visual viewport. The cursor @@ -1831,7 +1831,7 @@ const Cursor& cursor = GetDocument().GetFrame()->GetChromeClient().LastSetCursorForTesting(); - EXPECT_EQ(Cursor::Type::kCustom, cursor.GetType()); + EXPECT_EQ(ui::CursorType::kCustom, cursor.GetType()); } }
diff --git a/third_party/blink/renderer/core/inspector/browser_protocol.pdl b/third_party/blink/renderer/core/inspector/browser_protocol.pdl index 5e5d8391..9fad4285 100644 --- a/third_party/blink/renderer/core/inspector/browser_protocol.pdl +++ b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
@@ -5921,7 +5921,7 @@ # Security state. SecurityState securityState # True if the page was loaded over cryptographic transport such as HTTPS. - boolean schemeIsCryptographic + deprecated boolean schemeIsCryptographic # List of explanations for the security state. If the overall security state is `insecure` or # `warning`, at least one corresponding explanation should be included. array of SecurityStateExplanation explanations
diff --git a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc index b388c705b..a5be459b 100644 --- a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
@@ -127,8 +127,8 @@ const KeyframeEffectModelBase* model = effect->Model(); Vector<double> computed_offsets = KeyframeEffectModelBase::GetComputedOffsets(model->GetFrames()); - std::unique_ptr<protocol::Array<protocol::Animation::KeyframeStyle>> - keyframes = protocol::Array<protocol::Animation::KeyframeStyle>::create(); + auto keyframes = + std::make_unique<protocol::Array<protocol::Animation::KeyframeStyle>>(); for (wtf_size_t i = 0; i < model->GetFrames().size(); i++) { const Keyframe* keyframe = model->GetFrames().at(i); @@ -136,7 +136,7 @@ if (!keyframe->IsStringKeyframe()) continue; const StringKeyframe* string_keyframe = ToStringKeyframe(keyframe); - keyframes->addItem( + keyframes->emplace_back( BuildObjectForStringKeyframe(string_keyframe, computed_offsets.at(i))); } return protocol::Animation::KeyframesRule::create() @@ -239,8 +239,7 @@ Response InspectorAnimationAgent::setPaused( std::unique_ptr<protocol::Array<String>> animation_ids, bool paused) { - for (size_t i = 0; i < animation_ids->length(); ++i) { - String animation_id = animation_ids->get(i); + for (const String& animation_id : *animation_ids) { blink::Animation* animation = nullptr; Response response = AssertAnimation(animation_id, animation); if (!response.isSuccess()) @@ -319,8 +318,7 @@ Response InspectorAnimationAgent::seekAnimations( std::unique_ptr<protocol::Array<String>> animation_ids, double current_time) { - for (size_t i = 0; i < animation_ids->length(); ++i) { - String animation_id = animation_ids->get(i); + for (const String& animation_id : *animation_ids) { blink::Animation* animation = nullptr; Response response = AssertAnimation(animation_id, animation); if (!response.isSuccess()) @@ -337,8 +335,7 @@ Response InspectorAnimationAgent::releaseAnimations( std::unique_ptr<protocol::Array<String>> animation_ids) { - for (size_t i = 0; i < animation_ids->length(); ++i) { - String animation_id = animation_ids->get(i); + for (const String& animation_id : *animation_ids) { blink::Animation* animation = id_to_animation_.at(animation_id); if (animation) animation->SetEffectSuppressed(false);
diff --git a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc index ea3346c..7f17efc 100644 --- a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc
@@ -92,8 +92,8 @@ std::unique_ptr< protocol::Array<protocol::ApplicationCache::FrameWithManifest>>* result) { - *result = - protocol::Array<protocol::ApplicationCache::FrameWithManifest>::create(); + *result = std::make_unique< + protocol::Array<protocol::ApplicationCache::FrameWithManifest>>(); for (LocalFrame* frame : *inspected_frames_) { DocumentLoader* document_loader = frame->Loader().GetDocumentLoader(); @@ -110,7 +110,7 @@ .setManifestURL(manifest_url) .setStatus(static_cast<int>(host->GetStatus())) .build(); - (*result)->addItem(std::move(value)); + (*result)->emplace_back(std::move(value)); } } return Response::OK(); @@ -183,17 +183,11 @@ InspectorApplicationCacheAgent::BuildArrayForApplicationCacheResources( const Vector<mojom::blink::AppCacheResourceInfo>& application_cache_resources) { - std::unique_ptr< - protocol::Array<protocol::ApplicationCache::ApplicationCacheResource>> - resources = protocol::Array< - protocol::ApplicationCache::ApplicationCacheResource>::create(); + auto resources = std::make_unique< + protocol::Array<protocol::ApplicationCache::ApplicationCacheResource>>(); - Vector<mojom::blink::AppCacheResourceInfo>::const_iterator end = - application_cache_resources.end(); - Vector<mojom::blink::AppCacheResourceInfo>::const_iterator it = - application_cache_resources.begin(); - for (int i = 0; it != end; ++it, i++) - resources->addItem(BuildObjectForApplicationCacheResource(*it)); + for (const auto& resource : application_cache_resources) + resources->emplace_back(BuildObjectForApplicationCacheResource(resource)); return resources; }
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc index 15123d6d..0c65cee 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -347,12 +347,11 @@ DEFINE_STATIC_LOCAL(String, focusVisible, ("focus-visible")); DEFINE_STATIC_LOCAL(String, focusWithin, ("focus-within")); DEFINE_STATIC_LOCAL(String, visited, ("visited")); - if (!pseudo_class_array || !pseudo_class_array->length()) + if (!pseudo_class_array || pseudo_class_array->empty()) return kPseudoNone; unsigned result = kPseudoNone; - for (size_t i = 0; i < pseudo_class_array->length(); ++i) { - String pseudo_class = pseudo_class_array->get(i); + for (const String& pseudo_class : *pseudo_class_array) { if (pseudo_class == active) result |= kPseudoActive; else if (pseudo_class == hover) @@ -895,7 +894,7 @@ Response InspectorCSSAgent::getMediaQueries( std::unique_ptr<protocol::Array<protocol::CSS::CSSMedia>>* medias) { - *medias = protocol::Array<protocol::CSS::CSSMedia>::create(); + *medias = std::make_unique<protocol::Array<protocol::CSS::CSSMedia>>(); for (auto& style : id_to_inspector_style_sheet_) { InspectorStyleSheet* style_sheet = style.value; CollectMediaQueriesFromStyleSheet(style_sheet->PageStyleSheet(), @@ -969,7 +968,7 @@ } *pseudo_id_matches = - protocol::Array<protocol::CSS::PseudoElementMatches>::create(); + std::make_unique<protocol::Array<protocol::CSS::PseudoElementMatches>>(); for (PseudoId pseudo_id = kFirstPublicPseudoId; pseudo_id < kAfterLastInternalPseudoId; pseudo_id = static_cast<PseudoId>(pseudo_id + 1)) { @@ -978,7 +977,7 @@ protocol::DOM::PseudoType pseudo_type; if (matched_rules && matched_rules->length() && dom_agent_->GetPseudoElementType(pseudo_id, &pseudo_type)) { - pseudo_id_matches->fromJust()->addItem( + pseudo_id_matches->fromJust()->emplace_back( protocol::CSS::PseudoElementMatches::create() .setPseudoType(pseudo_type) .setMatches(BuildArrayForMatchedRuleList(matched_rules, element, @@ -989,7 +988,7 @@ // Inherited styles. *inherited_entries = - protocol::Array<protocol::CSS::InheritedStyleEntry>::create(); + std::make_unique<protocol::Array<protocol::CSS::InheritedStyleEntry>>(); Element* parent_element = element->ParentOrShadowHostElement(); while (parent_element) { StyleResolver& parent_style_resolver = @@ -1010,7 +1009,7 @@ style_sheet->BuildObjectForStyle(style_sheet->InlineStyle())); } - inherited_entries->fromJust()->addItem(std::move(entry)); + inherited_entries->fromJust()->emplace_back(std::move(entry)); parent_element = parent_element->ParentOrShadowHostElement(); } @@ -1038,9 +1037,8 @@ std::unique_ptr<protocol::Array<protocol::CSS::CSSKeyframesRule>> InspectorCSSAgent::AnimationsForNode(Element* element) { - std::unique_ptr<protocol::Array<protocol::CSS::CSSKeyframesRule>> - css_keyframes_rules = - protocol::Array<protocol::CSS::CSSKeyframesRule>::create(); + auto css_keyframes_rules = + std::make_unique<protocol::Array<protocol::CSS::CSSKeyframesRule>>(); Document* owner_document = element->ownerDocument(); StyleResolver& style_resolver = owner_document->EnsureStyleResolver(); @@ -1069,12 +1067,12 @@ if (!css_keyframes_rule) continue; - std::unique_ptr<protocol::Array<protocol::CSS::CSSKeyframeRule>> keyframes = - protocol::Array<protocol::CSS::CSSKeyframeRule>::create(); + auto keyframes = + std::make_unique<protocol::Array<protocol::CSS::CSSKeyframeRule>>(); for (unsigned j = 0; j < css_keyframes_rule->length(); ++j) { InspectorStyleSheet* inspector_style_sheet = BindStyleSheet(css_keyframes_rule->parentStyleSheet()); - keyframes->addItem(inspector_style_sheet->BuildObjectForKeyframeRule( + keyframes->emplace_back(inspector_style_sheet->BuildObjectForKeyframeRule( css_keyframes_rule->Item(j))); } @@ -1089,10 +1087,10 @@ if (source_data) name->setRange(inspector_style_sheet->BuildSourceRangeObject( source_data->rule_header_range)); - css_keyframes_rules->addItem(protocol::CSS::CSSKeyframesRule::create() - .setAnimationName(std::move(name)) - .setKeyframes(std::move(keyframes)) - .build()); + css_keyframes_rules->emplace_back(protocol::CSS::CSSKeyframesRule::create() + .setAnimationName(std::move(name)) + .setKeyframes(std::move(keyframes)) + .build()); } return css_keyframes_rules; } @@ -1133,14 +1131,15 @@ auto* computed_style_info = MakeGarbageCollected<CSSComputedStyleDeclaration>(node, true); - *style = protocol::Array<protocol::CSS::CSSComputedStyleProperty>::create(); + *style = std::make_unique< + protocol::Array<protocol::CSS::CSSComputedStyleProperty>>(); for (CSSPropertyID property_id : CSSPropertyIDList()) { const CSSProperty& property_class = CSSProperty::Get(resolveCSSPropertyID(property_id)); if (!property_class.IsEnabled() || property_class.IsShorthand() || !property_class.IsProperty()) continue; - (*style)->addItem( + (*style)->emplace_back( protocol::CSS::CSSComputedStyleProperty::create() .setName(property_class.GetPropertyNameString()) .setValue(computed_style_info->GetPropertyValue(property_id)) @@ -1148,10 +1147,10 @@ } for (const auto& it : computed_style_info->GetVariables()) { - (*style)->addItem(protocol::CSS::CSSComputedStyleProperty::create() - .setName(it.key) - .setValue(it.value->CssText()) - .build()); + (*style)->emplace_back(protocol::CSS::CSSComputedStyleProperty::create() + .setName(it.key) + .setValue(it.value->CssText()) + .build()); } return Response::OK(); } @@ -1238,17 +1237,18 @@ const unsigned descendants_depth = 2; CollectPlatformFontsForLayoutObject(root, &font_stats, descendants_depth); } - *platform_fonts = protocol::Array<protocol::CSS::PlatformFontUsage>::create(); + *platform_fonts = + std::make_unique<protocol::Array<protocol::CSS::PlatformFontUsage>>(); for (auto& font : font_stats) { std::pair<int, String>& font_description = font.key; bool is_custom_font = font_description.first == 1; String font_name = font_description.second; (*platform_fonts) - ->addItem(protocol::CSS::PlatformFontUsage::create() - .setFamilyName(font_name) - .setIsCustomFont(is_custom_font) - .setGlyphCount(font.value) - .build()); + ->emplace_back(protocol::CSS::PlatformFontUsage::create() + .setFamilyName(font_name) + .setIsCustomFont(is_custom_font) + .setGlyphCount(font.value) + .build()); } return Response::OK(); } @@ -1406,12 +1406,12 @@ Response InspectorCSSAgent::MultipleStyleTextsActions( std::unique_ptr<protocol::Array<protocol::CSS::StyleDeclarationEdit>> edits, HeapVector<Member<StyleSheetAction>>* actions) { - size_t n = edits->length(); + size_t n = edits->size(); if (n == 0) return Response::Error("Edits should not be empty"); for (size_t i = 0; i < n; ++i) { - protocol::CSS::StyleDeclarationEdit* edit = edits->get(i); + protocol::CSS::StyleDeclarationEdit* edit = (*edits)[i].get(); InspectorStyleSheetBase* inspector_style_sheet = nullptr; Response response = AssertStyleSheetForId(edit->getStyleSheetId(), inspector_style_sheet); @@ -1457,8 +1457,8 @@ DummyExceptionStateForTesting exception_state; int n = actions.size(); - std::unique_ptr<protocol::Array<protocol::CSS::CSSStyle>> serialized_styles = - protocol::Array<protocol::CSS::CSSStyle>::create(); + auto serialized_styles = + std::make_unique<protocol::Array<protocol::CSS::CSSStyle>>(); for (int i = 0; i < n; ++i) { Member<StyleSheetAction> action = actions.at(i); bool success = action->Perform(exception_state); @@ -1473,7 +1473,7 @@ String::Format("Failed applying edit #%d: ", i) + InspectorDOMAgent::ToResponse(exception_state).errorMessage()); } - serialized_styles->addItem(action->TakeSerializedStyle()); + serialized_styles->emplace_back(action->TakeSerializedStyle()); } for (int i = 0; i < n; ++i) { @@ -1673,16 +1673,15 @@ parent_style_sheet ? css_style_sheet_to_inspector_style_sheet_.at(parent_style_sheet) : nullptr; - std::unique_ptr<protocol::Array<protocol::CSS::MediaQuery>> media_list_array = - protocol::Array<protocol::CSS::MediaQuery>::create(); + auto media_list_array = + std::make_unique<protocol::Array<protocol::CSS::MediaQuery>>(); MediaValues* media_values = MediaValues::CreateDynamicIfFrameExists(frame); bool has_media_query_items = false; for (wtf_size_t i = 0; i < query_vector.size(); ++i) { MediaQuery& query = *query_vector.at(i); const ExpressionHeapVector& expressions = query.Expressions(); - std::unique_ptr<protocol::Array<protocol::CSS::MediaQueryExpression>> - expression_array = - protocol::Array<protocol::CSS::MediaQueryExpression>::create(); + auto expression_array = std::make_unique< + protocol::Array<protocol::CSS::MediaQueryExpression>>(); bool has_expression_items = false; for (wtf_size_t j = 0; j < expressions.size(); ++j) { const MediaQueryExp& media_query_exp = expressions.at(j); @@ -1709,7 +1708,7 @@ computed_length)) media_query_expression->setComputedLength(computed_length); - expression_array->addItem(std::move(media_query_expression)); + expression_array->emplace_back(std::move(media_query_expression)); has_expression_items = true; } if (!has_expression_items) @@ -1719,7 +1718,7 @@ .setActive(media_evaluator->Eval(query, nullptr)) .setExpressions(std::move(expression_array)) .build(); - media_list_array->addItem(std::move(media_query)); + media_list_array->emplace_back(std::move(media_query)); has_media_query_items = true; } @@ -1761,11 +1760,11 @@ source_url = style_sheet->Contents()->BaseURL(); else source_url = ""; - media_array->addItem(BuildMediaObject(media_list, - style_sheet->ownerNode() - ? kMediaListSourceLinkedSheet - : kMediaListSourceInlineSheet, - source_url, style_sheet)); + media_array->emplace_back( + BuildMediaObject(media_list, + style_sheet->ownerNode() ? kMediaListSourceLinkedSheet + : kMediaListSourceInlineSheet, + source_url, style_sheet)); } } @@ -1797,7 +1796,7 @@ } if (media_list && media_list->length()) - media_array->addItem(BuildMediaObject( + media_array->emplace_back(BuildMediaObject( media_list, is_media_rule ? kMediaListSourceMediaRule : kMediaListSourceImportRule, source_url, parent_style_sheet)); @@ -1807,8 +1806,8 @@ InspectorCSSAgent::BuildMediaListChain(CSSRule* rule) { if (!rule) return nullptr; - std::unique_ptr<protocol::Array<protocol::CSS::CSSMedia>> media_array = - protocol::Array<protocol::CSS::CSSMedia>::create(); + auto media_array = + std::make_unique<protocol::Array<protocol::CSS::CSSMedia>>(); CSSRule* parent_rule = rule; while (parent_rule) { CollectMediaQueriesFromRule(parent_rule, media_array.get()); @@ -2025,8 +2024,7 @@ CSSRuleList* rule_list, Element* element, PseudoId matches_for_pseudo_id) { - std::unique_ptr<protocol::Array<protocol::CSS::RuleMatch>> result = - protocol::Array<protocol::CSS::RuleMatch>::create(); + auto result = std::make_unique<protocol::Array<protocol::CSS::RuleMatch>>(); if (!rule_list) return result; @@ -2037,8 +2035,7 @@ BuildObjectForRule(rule); if (!rule_object) continue; - std::unique_ptr<protocol::Array<int>> matching_selectors = - protocol::Array<int>::create(); + auto matching_selectors = std::make_unique<protocol::Array<int>>(); const CSSSelectorList& selector_list = rule->GetStyleRule()->SelectorList(); wtf_size_t index = 0; PseudoId element_pseudo_id = @@ -2055,13 +2052,14 @@ AtomicString(first_tag_history_selector->SelectorText()), IGNORE_EXCEPTION_FOR_TESTING); if (matched) - matching_selectors->addItem(index); + matching_selectors->emplace_back(index); ++index; } - result->addItem(protocol::CSS::RuleMatch::create() - .setRule(std::move(rule_object)) - .setMatchingSelectors(std::move(matching_selectors)) - .build()); + result->emplace_back( + protocol::CSS::RuleMatch::create() + .setRule(std::move(rule_object)) + .setMatchingSelectors(std::move(matching_selectors)) + .build()); } return result; @@ -2318,9 +2316,9 @@ InspectorCSSAgent::GetBackgroundColors(element, &bgcolors, &fs, &fw); if (bgcolors.size()) { - *background_colors = protocol::Array<String>::create(); + *background_colors = std::make_unique<protocol::Array<String>>(); for (const auto& color : bgcolors) { - background_colors->fromJust()->addItem( + background_colors->fromJust()->emplace_back( cssvalue::CSSColorValue::SerializeAsCSSComponentValue(color)); } } @@ -2426,7 +2424,7 @@ StyleRuleUsageTracker::RuleListByStyleSheet coverage_delta = tracker_->TakeDelta(); - *result = protocol::Array<protocol::CSS::RuleUsage>::create(); + *result = std::make_unique<protocol::Array<protocol::CSS::RuleUsage>>(); for (const auto& entry : coverage_delta) { const CSSStyleSheet* css_style_sheet = entry.key.Get(); @@ -2448,7 +2446,7 @@ CSSStyleRule* css_style_rule = rule_to_css_rule.at(used_rule); if (std::unique_ptr<protocol::CSS::RuleUsage> rule_usage_object = style_sheet->BuildObjectForRuleUsage(css_style_rule, true)) { - (*result)->addItem(std::move(rule_usage_object)); + (*result)->emplace_back(std::move(rule_usage_object)); } } }
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc index 9e3524b5..b893efba 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -513,7 +513,7 @@ sanitized_depth = INT_MAX; nodes->reset(new protocol::Array<protocol::DOM::Node>()); - (*nodes)->addItem(BuildObjectForNode( + (*nodes)->emplace_back(BuildObjectForNode( document_.Get(), sanitized_depth, pierce.fromMaybe(false), document_node_to_id_map_.Get(), nodes->get())); return Response::OK(); @@ -577,7 +577,7 @@ int node_id, std::unique_ptr<protocol::Array<String>>* class_names) { HashSet<String> unique_names; - *class_names = protocol::Array<String>::create(); + *class_names = std::make_unique<protocol::Array<String>>(); Node* parent_node = NodeForId(node_id); if (!parent_node || (!parent_node->IsElementNode() && !parent_node->IsDocumentNode() && @@ -596,7 +596,7 @@ } } for (const String& class_name : unique_names) - (*class_names)->addItem(class_name); + (*class_names)->emplace_back(class_name); return Response::OK(); } @@ -659,10 +659,10 @@ if (exception_state.HadException()) return Response::Error("DOM Error while querying"); - *result = protocol::Array<int>::create(); + *result = std::make_unique<protocol::Array<int>>(); for (unsigned i = 0; i < elements->length(); ++i) - (*result)->addItem(PushNodePathToFrontend(elements->item(i))); + (*result)->emplace_back(PushNodePathToFrontend(elements->item(i))); return Response::OK(); } @@ -718,9 +718,8 @@ NodeToIdMap* new_map = MakeGarbageCollected<NodeToIdMap>(); NodeToIdMap* dangling_map = new_map; dangling_node_to_id_maps_.push_back(new_map); - std::unique_ptr<protocol::Array<protocol::DOM::Node>> children = - protocol::Array<protocol::DOM::Node>::create(); - children->addItem(BuildObjectForNode(node, 0, false, dangling_map)); + auto children = std::make_unique<protocol::Array<protocol::DOM::Node>>(); + children->emplace_back(BuildObjectForNode(node, 0, false, dangling_map)); GetFrontend()->setChildNodes(0, std::move(children)); return PushNodePathToFrontend(node_to_push, dangling_map); @@ -1121,9 +1120,9 @@ if (from_index < 0 || to_index > size || from_index >= to_index) return Response::Error("Invalid search result range"); - *node_ids = protocol::Array<int>::create(); + *node_ids = std::make_unique<protocol::Array<int>>(); for (int i = from_index; i < to_index; ++i) - (*node_ids)->addItem(PushNodePathToFrontend((it->value)[i].Get())); + (*node_ids)->emplace_back(PushNodePathToFrontend((it->value)[i].Get())); return Response::OK(); } @@ -1275,8 +1274,8 @@ return Response::Error("Node is not a file input element"); Vector<String> paths; - for (size_t index = 0; index < files->length(); ++index) - paths.push_back(files->get(index)); + for (const String& file : *files) + paths.push_back(file); ToHTMLInputElement(node)->SetFilesFromPaths(paths); return Response::OK(); } @@ -1485,10 +1484,10 @@ } if (ShadowRoot* root = element->GetShadowRoot()) { - std::unique_ptr<protocol::Array<protocol::DOM::Node>> shadow_roots = - protocol::Array<protocol::DOM::Node>::create(); - shadow_roots->addItem(BuildObjectForNode(root, pierce ? depth : 0, pierce, - nodes_map, flatten_result)); + auto shadow_roots = + std::make_unique<protocol::Array<protocol::DOM::Node>>(); + shadow_roots->emplace_back(BuildObjectForNode( + root, pierce ? depth : 0, pierce, nodes_map, flatten_result)); value->setShadowRoots(std::move(shadow_roots)); force_push_children = true; } @@ -1560,7 +1559,7 @@ std::unique_ptr<protocol::Array<protocol::DOM::Node>> children = BuildArrayForContainerChildren(node, depth, pierce, nodes_map, flatten_result); - if (children->length() > 0 || + if (!children->empty() || depth) // Push children along with shadow in any case. value->setChildren(std::move(children)); } @@ -1570,14 +1569,12 @@ std::unique_ptr<protocol::Array<String>> InspectorDOMAgent::BuildArrayForElementAttributes(Element* element) { - std::unique_ptr<protocol::Array<String>> attributes_value = - protocol::Array<String>::create(); + auto attributes_value = std::make_unique<protocol::Array<String>>(); // Go through all attributes and serialize them. - AttributeCollection attributes = element->Attributes(); - for (auto& attribute : attributes) { + for (const blink::Attribute& attribute : element->Attributes()) { // Add attribute pair - attributes_value->addItem(attribute.GetName().ToString()); - attributes_value->addItem(attribute.Value()); + attributes_value->emplace_back(attribute.GetName().ToString()); + attributes_value->emplace_back(attribute.Value()); } return attributes_value; } @@ -1589,8 +1586,7 @@ bool pierce, NodeToIdMap* nodes_map, protocol::Array<protocol::DOM::Node>* flatten_result) { - std::unique_ptr<protocol::Array<protocol::DOM::Node>> children = - protocol::Array<protocol::DOM::Node>::create(); + auto children = std::make_unique<protocol::Array<protocol::DOM::Node>>(); if (depth == 0) { if (!nodes_map) return children; @@ -1603,9 +1599,9 @@ BuildObjectForNode(first_child, 0, pierce, nodes_map, flatten_result); child_node->setParentId(Bind(container, nodes_map)); if (flatten_result) { - flatten_result->addItem(std::move(child_node)); + flatten_result->emplace_back(std::move(child_node)); } else { - children->addItem(std::move(child_node)); + children->emplace_back(std::move(child_node)); } children_requested_.insert(Bind(container, nodes_map)); } @@ -1622,9 +1618,9 @@ BuildObjectForNode(child, depth, pierce, nodes_map, flatten_result); child_node->setParentId(Bind(container, nodes_map)); if (flatten_result) { - flatten_result->addItem(std::move(child_node)); + flatten_result->emplace_back(std::move(child_node)); } else { - children->addItem(std::move(child_node)); + children->emplace_back(std::move(child_node)); } if (nodes_map) children_requested_.insert(Bind(container, nodes_map)); @@ -1640,14 +1636,14 @@ !element->GetPseudoElement(kPseudoIdAfter)) return nullptr; - std::unique_ptr<protocol::Array<protocol::DOM::Node>> pseudo_elements = - protocol::Array<protocol::DOM::Node>::create(); + auto pseudo_elements = + std::make_unique<protocol::Array<protocol::DOM::Node>>(); if (element->GetPseudoElement(kPseudoIdBefore)) { - pseudo_elements->addItem(BuildObjectForNode( + pseudo_elements->emplace_back(BuildObjectForNode( element->GetPseudoElement(kPseudoIdBefore), 0, false, nodes_map)); } if (element->GetPseudoElement(kPseudoIdAfter)) { - pseudo_elements->addItem(BuildObjectForNode( + pseudo_elements->emplace_back(BuildObjectForNode( element->GetPseudoElement(kPseudoIdAfter), 0, false, nodes_map)); } return pseudo_elements; @@ -1656,8 +1652,8 @@ std::unique_ptr<protocol::Array<protocol::DOM::BackendNode>> InspectorDOMAgent::BuildArrayForDistributedNodes( V0InsertionPoint* insertion_point) { - std::unique_ptr<protocol::Array<protocol::DOM::BackendNode>> - distributed_nodes = protocol::Array<protocol::DOM::BackendNode>::create(); + auto distributed_nodes = + std::make_unique<protocol::Array<protocol::DOM::BackendNode>>(); for (wtf_size_t i = 0; i < insertion_point->DistributedNodesSize(); ++i) { Node* distributed_node = insertion_point->DistributedNodeAt(i); if (IsWhitespace(distributed_node)) @@ -1670,7 +1666,7 @@ .setBackendNodeId( IdentifiersFactory::IntIdForNode(distributed_node)) .build(); - distributed_nodes->addItem(std::move(backend_node)); + distributed_nodes->emplace_back(std::move(backend_node)); } return distributed_nodes; } @@ -1681,8 +1677,8 @@ // not be used anymore. DistributedNodes should be replaced with // AssignedNodes() when IncrementalShadowDOM becomes stable and Shadow DOM v0 // is removed. - std::unique_ptr<protocol::Array<protocol::DOM::BackendNode>> - distributed_nodes = protocol::Array<protocol::DOM::BackendNode>::create(); + auto distributed_nodes = + std::make_unique<protocol::Array<protocol::DOM::BackendNode>>(); for (auto& node : slot_element->AssignedNodes()) { if (IsWhitespace(node)) continue; @@ -1693,7 +1689,7 @@ .setNodeName(node->nodeName()) .setBackendNodeId(IdentifiersFactory::IntIdForNode(node)) .build(); - distributed_nodes->addItem(std::move(backend_node)); + distributed_nodes->emplace_back(std::move(backend_node)); } return distributed_nodes; } @@ -1934,8 +1930,7 @@ void InspectorDOMAgent::StyleAttributeInvalidated( const HeapVector<Member<Element>>& elements) { - std::unique_ptr<protocol::Array<int>> node_ids = - protocol::Array<int>::create(); + auto node_ids = std::make_unique<protocol::Array<int>>(); for (unsigned i = 0, size = elements.size(); i < size; ++i) { Element* element = elements.at(i); int id = BoundNodeId(element); @@ -1945,7 +1940,7 @@ if (dom_listener_) dom_listener_->DidModifyDOMAttr(element); - node_ids->addItem(id); + node_ids->emplace_back(id); } GetFrontend()->inlineStyleInvalidated(std::move(node_ids)); } @@ -2152,14 +2147,14 @@ if (!document_ || !document_node_to_id_map_->Contains(document_)) return Response::Error("Document needs to be requested first"); - *result = protocol::Array<int>::create(); - for (size_t index = 0; index < backend_node_ids->length(); ++index) { - Node* node = DOMNodeIds::NodeForId(backend_node_ids->get(index)); + *result = std::make_unique<protocol::Array<int>>(); + for (int id : *backend_node_ids) { + Node* node = DOMNodeIds::NodeForId(id); if (node && node->GetDocument().GetFrame() && inspected_frames_->Contains(node->GetDocument().GetFrame())) - (*result)->addItem(PushNodePathToFrontend(node)); + (*result)->emplace_back(PushNodePathToFrontend(node)); else - (*result)->addItem(0); + (*result)->emplace_back(0); } return Response::OK(); }
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc index 29d6574..d1bbcbc 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
@@ -423,9 +423,8 @@ const V8EventListenerInfoList& event_information, v8::Local<v8::Context> context, const v8_inspector::StringView& object_group_id) { - std::unique_ptr<protocol::Array<protocol::DOMDebugger::EventListener>> - listeners_array = - protocol::Array<protocol::DOMDebugger::EventListener>::create(); + auto listeners_array = + std::make_unique<protocol::Array<protocol::DOMDebugger::EventListener>>(); // Make sure listeners with |use_capture| true come first because they have // precedence. for (const auto& info : event_information) { @@ -434,7 +433,7 @@ std::unique_ptr<protocol::DOMDebugger::EventListener> listener_object = BuildObjectForEventListener(context, info, object_group_id); if (listener_object) - listeners_array->addItem(std::move(listener_object)); + listeners_array->emplace_back(std::move(listener_object)); } for (const auto& info : event_information) { if (info.use_capture) @@ -442,7 +441,7 @@ std::unique_ptr<protocol::DOMDebugger::EventListener> listener_object = BuildObjectForEventListener(context, info, object_group_id); if (listener_object) - listeners_array->addItem(std::move(listener_object)); + listeners_array->emplace_back(std::move(listener_object)); } return listeners_array; }
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc index 9ba75c8..eb6c249 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc
@@ -60,26 +60,16 @@ std::unique_ptr<protocol::Array<double>> BuildRectForPhysicalRect2( const PhysicalRect& rect) { - std::unique_ptr<protocol::Array<double>> result = - protocol::Array<double>::create(); - result->addItem(rect.X()); - result->addItem(rect.Y()); - result->addItem(rect.Width()); - result->addItem(rect.Height()); - return result; + return std::make_unique<std::vector<double>, std::initializer_list<double>>( + {rect.X(), rect.Y(), rect.Width(), rect.Height()}); } std::unique_ptr<protocol::Array<double>> BuildRectForLayout(const int x, const int y, const int width, const int height) { - std::unique_ptr<protocol::Array<double>> result = - protocol::Array<double>::create(); - result->addItem(x); - result->addItem(y); - result->addItem(width); - result->addItem(height); - return result; + return std::make_unique<std::vector<double>, std::initializer_list<double>>( + {x, y, width, height}); } // Returns |layout_object|'s bounding box in document coordinates. @@ -120,21 +110,21 @@ std::unique_ptr<protocol::DOMSnapshot::RareStringData> StringData() { return protocol::DOMSnapshot::RareStringData::create() - .setIndex(protocol::Array<int>::create()) - .setValue(protocol::Array<int>::create()) + .setIndex(std::make_unique<protocol::Array<int>>()) + .setValue(std::make_unique<protocol::Array<int>>()) .build(); } std::unique_ptr<protocol::DOMSnapshot::RareIntegerData> IntegerData() { return protocol::DOMSnapshot::RareIntegerData::create() - .setIndex(protocol::Array<int>::create()) - .setValue(protocol::Array<int>::create()) + .setIndex(std::make_unique<protocol::Array<int>>()) + .setValue(std::make_unique<protocol::Array<int>>()) .build(); } std::unique_ptr<protocol::DOMSnapshot::RareBooleanData> BooleanData() { return protocol::DOMSnapshot::RareBooleanData::create() - .setIndex(protocol::Array<int>::create()) + .setIndex(std::make_unique<protocol::Array<int>>()) .build(); } @@ -265,21 +255,21 @@ return Response::Error("Document is not available"); // Setup snapshot. - dom_nodes_ = protocol::Array<protocol::DOMSnapshot::DOMNode>::create(); - layout_tree_nodes_ = - protocol::Array<protocol::DOMSnapshot::LayoutTreeNode>::create(); + dom_nodes_ = + std::make_unique<protocol::Array<protocol::DOMSnapshot::DOMNode>>(); + layout_tree_nodes_ = std::make_unique< + protocol::Array<protocol::DOMSnapshot::LayoutTreeNode>>(); computed_styles_ = - protocol::Array<protocol::DOMSnapshot::ComputedStyle>::create(); + std::make_unique<protocol::Array<protocol::DOMSnapshot::ComputedStyle>>(); computed_styles_map_ = std::make_unique<ComputedStylesMap>(); css_property_filter_ = std::make_unique<CSSPropertyFilter>(); // Look up the CSSPropertyIDs for each entry in |style_filter|. - for (wtf_size_t i = 0; i < style_filter->length(); i++) { - CSSPropertyID property_id = cssPropertyID(style_filter->get(i)); + for (const String& entry : *style_filter) { + CSSPropertyID property_id = cssPropertyID(entry); if (property_id == CSSPropertyID::kInvalid) continue; - css_property_filter_->push_back( - std::make_pair(style_filter->get(i), property_id)); + css_property_filter_->emplace_back(entry, property_id); } if (include_paint_order.fromMaybe(false)) { @@ -308,18 +298,18 @@ std::unique_ptr<protocol::Array<protocol::DOMSnapshot::DocumentSnapshot>>* documents, std::unique_ptr<protocol::Array<String>>* strings) { - strings_ = protocol::Array<String>::create(); - documents_ = - protocol::Array<protocol::DOMSnapshot::DocumentSnapshot>::create(); + strings_ = std::make_unique<protocol::Array<String>>(); + documents_ = std::make_unique< + protocol::Array<protocol::DOMSnapshot::DocumentSnapshot>>(); css_property_filter_ = std::make_unique<CSSPropertyFilter>(); // Look up the CSSPropertyIDs for each entry in |computed_styles|. - for (size_t i = 0; i < computed_styles->length(); i++) { - CSSPropertyID property_id = cssPropertyID(computed_styles->get(i)); + for (String& entry : *computed_styles) { + CSSPropertyID property_id = cssPropertyID(entry); if (property_id == CSSPropertyID::kInvalid) continue; - css_property_filter_->push_back( - std::make_pair(computed_styles->get(i), property_id)); + css_property_filter_->emplace_back(std::move(entry), + std::move(property_id)); } include_snapshot_dom_rects_ = include_dom_rects.fromMaybe(false); @@ -387,8 +377,8 @@ } } protocol::DOMSnapshot::DOMNode* value = owned_value.get(); - int index = static_cast<int>(dom_nodes_->length()); - dom_nodes_->addItem(std::move(owned_value)); + int index = static_cast<int>(dom_nodes_->size()); + dom_nodes_->emplace_back(std::move(owned_value)); int layoutNodeIndex = VisitLayoutTreeNode(node->GetLayoutObject(), node, index); @@ -503,8 +493,8 @@ auto it = string_table_.find(string); int index; if (it == string_table_.end()) { - index = static_cast<int>(strings_->length()); - strings_->addItem(string); + index = static_cast<int>(strings_->size()); + strings_->emplace_back(string); string_table_.Set(string, index); } else { index = it->value; @@ -516,22 +506,22 @@ protocol::DOMSnapshot::RareIntegerData* data, int index, int value) { - data->getIndex()->addItem(index); - data->getValue()->addItem(value); + data->getIndex()->emplace_back(index); + data->getValue()->emplace_back(value); } void InspectorDOMSnapshotAgent::SetRare( protocol::DOMSnapshot::RareStringData* data, int index, const String& value) { - data->getIndex()->addItem(index); - data->getValue()->addItem(AddString(value)); + data->getIndex()->emplace_back(index); + data->getValue()->emplace_back(AddString(value)); } void InspectorDOMSnapshotAgent::SetRare( protocol::DOMSnapshot::RareBooleanData* data, int index) { - data->getIndex()->addItem(index); + data->getIndex()->emplace_back(index); } void InspectorDOMSnapshotAgent::VisitDocument2(Document* document) { @@ -554,38 +544,42 @@ AddString(IdentifiersFactory::FrameId(document->GetFrame()))) .setPublicId(AddString(doc_type ? doc_type->publicId() : String())) .setSystemId(AddString(doc_type ? doc_type->systemId() : String())) - .setNodes(protocol::DOMSnapshot::NodeTreeSnapshot::create() - .setParentIndex(protocol::Array<int>::create()) - .setNodeType(protocol::Array<int>::create()) - .setNodeName(protocol::Array<int>::create()) - .setNodeValue(protocol::Array<int>::create()) - .setBackendNodeId(protocol::Array<int>::create()) - .setAttributes( - protocol::Array<protocol::Array<int>>::create()) - .setTextValue(StringData()) - .setInputValue(StringData()) - .setInputChecked(BooleanData()) - .setOptionSelected(BooleanData()) - .setContentDocumentIndex(IntegerData()) - .setPseudoType(StringData()) - .setIsClickable(BooleanData()) - .setCurrentSourceURL(StringData()) - .setOriginURL(StringData()) - .build()) + .setNodes( + protocol::DOMSnapshot::NodeTreeSnapshot::create() + .setParentIndex(std::make_unique<protocol::Array<int>>()) + .setNodeType(std::make_unique<protocol::Array<int>>()) + .setNodeName(std::make_unique<protocol::Array<int>>()) + .setNodeValue(std::make_unique<protocol::Array<int>>()) + .setBackendNodeId(std::make_unique<protocol::Array<int>>()) + .setAttributes( + std::make_unique<protocol::Array<protocol::Array<int>>>()) + .setTextValue(StringData()) + .setInputValue(StringData()) + .setInputChecked(BooleanData()) + .setOptionSelected(BooleanData()) + .setContentDocumentIndex(IntegerData()) + .setPseudoType(StringData()) + .setIsClickable(BooleanData()) + .setCurrentSourceURL(StringData()) + .setOriginURL(StringData()) + .build()) .setLayout( protocol::DOMSnapshot::LayoutTreeSnapshot::create() - .setNodeIndex(protocol::Array<int>::create()) - .setBounds(protocol::Array<protocol::Array<double>>::create()) - .setText(protocol::Array<int>::create()) - .setStyles(protocol::Array<protocol::Array<int>>::create()) + .setNodeIndex(std::make_unique<protocol::Array<int>>()) + .setBounds(std::make_unique< + protocol::Array<protocol::Array<double>>>()) + .setText(std::make_unique<protocol::Array<int>>()) + .setStyles( + std::make_unique<protocol::Array<protocol::Array<int>>>()) .setStackingContexts(BooleanData()) .build()) .setTextBoxes( protocol::DOMSnapshot::TextBoxSnapshot::create() - .setLayoutIndex(protocol::Array<int>::create()) - .setBounds(protocol::Array<protocol::Array<double>>::create()) - .setStart(protocol::Array<int>::create()) - .setLength(protocol::Array<int>::create()) + .setLayoutIndex(std::make_unique<protocol::Array<int>>()) + .setBounds(std::make_unique< + protocol::Array<protocol::Array<double>>>()) + .setStart(std::make_unique<protocol::Array<int>>()) + .setLength(std::make_unique<protocol::Array<int>>()) .build()) .build(); @@ -597,15 +591,15 @@ if (include_snapshot_dom_rects_) { document_->getLayout()->setOffsetRects( - protocol::Array<protocol::Array<double>>::create()); + std::make_unique<protocol::Array<protocol::Array<double>>>()); document_->getLayout()->setClientRects( - protocol::Array<protocol::Array<double>>::create()); + std::make_unique<protocol::Array<protocol::Array<double>>>()); document_->getLayout()->setScrollRects( - protocol::Array<protocol::Array<double>>::create()); + std::make_unique<protocol::Array<protocol::Array<double>>>()); } VisitNode2(document, -1); - documents_->addItem(std::move(document_)); + documents_->emplace_back(std::move(document_)); } int InspectorDOMSnapshotAgent::VisitNode2(Node* node, int parent_index) { @@ -623,19 +617,21 @@ } auto* nodes = document_->getNodes(); - int index = static_cast<int>(nodes->getNodeName(nullptr)->length()); + int index = static_cast<int>(nodes->getNodeName(nullptr)->size()); DOMNodeId backend_node_id = DOMNodeIds::IdForNode(node); // Create DOMNode object and add it to the result array before traversing // children, so that parents appear before their children in the array. - nodes->getParentIndex(nullptr)->addItem(parent_index); + nodes->getParentIndex(nullptr)->emplace_back(parent_index); - nodes->getNodeType(nullptr)->addItem(static_cast<int>(node->getNodeType())); - nodes->getNodeName(nullptr)->addItem(AddString(node->nodeName())); - nodes->getNodeValue(nullptr)->addItem(AddString(node_value)); - nodes->getBackendNodeId(nullptr)->addItem( + nodes->getNodeType(nullptr)->emplace_back( + static_cast<int>(node->getNodeType())); + nodes->getNodeName(nullptr)->emplace_back(AddString(node->nodeName())); + nodes->getNodeValue(nullptr)->emplace_back(AddString(node_value)); + nodes->getBackendNodeId(nullptr)->emplace_back( IdentifiersFactory::IntIdForNode(node)); - nodes->getAttributes(nullptr)->addItem(BuildArrayForElementAttributes2(node)); + nodes->getAttributes(nullptr)->emplace_back( + BuildArrayForElementAttributes2(node)); BuildLayoutTreeNode(node->GetLayoutObject(), node, index); if (origin_url_map_ && origin_url_map_->Contains(backend_node_id)) { @@ -747,15 +743,15 @@ Node* container, bool include_event_listeners, bool include_user_agent_shadow_tree) { - auto children = protocol::Array<int>::create(); + auto children = std::make_unique<protocol::Array<int>>(); if (!HasChildren(*container, include_user_agent_shadow_tree)) return nullptr; Node* child = FirstChild(*container, include_user_agent_shadow_tree); while (child) { - children->addItem(VisitNode(child, include_event_listeners, - include_user_agent_shadow_tree)); + children->emplace_back(VisitNode(child, include_event_listeners, + include_user_agent_shadow_tree)); child = NextSibling(*child, include_user_agent_shadow_tree); } @@ -803,12 +799,13 @@ return nullptr; } - auto pseudo_elements = protocol::Array<int>::create(); + auto pseudo_elements = std::make_unique<protocol::Array<int>>(); for (PseudoId pseudo_id : {kPseudoIdFirstLetter, kPseudoIdBefore, kPseudoIdAfter}) { if (Node* pseudo_node = parent->GetPseudoElement(pseudo_id)) { - pseudo_elements->addItem(VisitNode(pseudo_node, include_event_listeners, - include_user_agent_shadow_tree)); + pseudo_elements->emplace_back(VisitNode(pseudo_node, + include_event_listeners, + include_user_agent_shadow_tree)); } } return pseudo_elements; @@ -825,30 +822,30 @@ std::unique_ptr<protocol::Array<protocol::DOMSnapshot::NameValue>> InspectorDOMSnapshotAgent::BuildArrayForElementAttributes(Element* element) { - auto attributes_value = - protocol::Array<protocol::DOMSnapshot::NameValue>::create(); AttributeCollection attributes = element->Attributes(); - for (const auto& attribute : attributes) { - attributes_value->addItem(protocol::DOMSnapshot::NameValue::create() - .setName(attribute.GetName().ToString()) - .setValue(attribute.Value()) - .build()); - } - if (attributes_value->length() == 0) + if (attributes.IsEmpty()) return nullptr; + auto attributes_value = + std::make_unique<protocol::Array<protocol::DOMSnapshot::NameValue>>(); + for (const auto& attribute : attributes) { + attributes_value->emplace_back(protocol::DOMSnapshot::NameValue::create() + .setName(attribute.GetName().ToString()) + .setValue(attribute.Value()) + .build()); + } return attributes_value; } std::unique_ptr<protocol::Array<int>> InspectorDOMSnapshotAgent::BuildArrayForElementAttributes2(Node* node) { - auto result = protocol::Array<int>::create(); + auto result = std::make_unique<protocol::Array<int>>(); auto* element = DynamicTo<Element>(node); if (!element) return result; AttributeCollection attributes = element->Attributes(); for (const auto& attribute : attributes) { - result->addItem(AddString(attribute.GetName().ToString())); - result->addItem(AddString(attribute.Value())); + result->emplace_back(AddString(attribute.GetName().ToString())); + result->emplace_back(AddString(attribute.Value())); } return result; } @@ -887,11 +884,10 @@ layout_tree_node->setLayoutText(layout_text->GetText()); Vector<LayoutText::TextBoxInfo> text_boxes = layout_text->GetTextBoxInfo(); if (!text_boxes.IsEmpty()) { - std::unique_ptr<protocol::Array<protocol::DOMSnapshot::InlineTextBox>> - inline_text_nodes = - protocol::Array<protocol::DOMSnapshot::InlineTextBox>::create(); + auto inline_text_nodes = std::make_unique< + protocol::Array<protocol::DOMSnapshot::InlineTextBox>>(); for (const auto& text_box : text_boxes) { - inline_text_nodes->addItem( + inline_text_nodes->emplace_back( protocol::DOMSnapshot::InlineTextBox::create() .setStartCharacterIndex(text_box.dom_start_offset) .setNumCharacters(text_box.dom_length) @@ -903,8 +899,8 @@ } } - int index = static_cast<int>(layout_tree_nodes_->length()); - layout_tree_nodes_->addItem(std::move(layout_tree_node)); + int index = static_cast<int>(layout_tree_nodes_->size()); + layout_tree_nodes_->emplace_back(std::move(layout_tree_node)); return index; } @@ -917,10 +913,10 @@ auto* text_box_snapshot = document_->getTextBoxes(); int layout_index = - static_cast<int>(layout_tree_snapshot->getNodeIndex()->length()); - layout_tree_snapshot->getNodeIndex()->addItem(node_index); - layout_tree_snapshot->getStyles()->addItem(BuildStylesForNode(node)); - layout_tree_snapshot->getBounds()->addItem( + static_cast<int>(layout_tree_snapshot->getNodeIndex()->size()); + layout_tree_snapshot->getNodeIndex()->emplace_back(node_index); + layout_tree_snapshot->getStyles()->emplace_back(BuildStylesForNode(node)); + layout_tree_snapshot->getBounds()->emplace_back( BuildRectForPhysicalRect2(RectInDocument(layout_object))); if (include_snapshot_dom_rects_) { @@ -937,21 +933,21 @@ DCHECK(scrollRects); if (auto* element = DynamicTo<Element>(node)) { - offsetRects->addItem( + offsetRects->emplace_back( BuildRectForLayout(element->OffsetLeft(), element->OffsetTop(), element->OffsetWidth(), element->OffsetHeight())); - clientRects->addItem( + clientRects->emplace_back( BuildRectForLayout(element->clientLeft(), element->clientTop(), element->clientWidth(), element->clientHeight())); - scrollRects->addItem( + scrollRects->emplace_back( BuildRectForLayout(element->scrollLeft(), element->scrollTop(), element->scrollWidth(), element->scrollHeight())); } else { - offsetRects->addItem(protocol::Array<double>::create()); - clientRects->addItem(protocol::Array<double>::create()); - scrollRects->addItem(protocol::Array<double>::create()); + offsetRects->emplace_back(std::make_unique<protocol::Array<double>>()); + clientRects->emplace_back(std::make_unique<protocol::Array<double>>()); + scrollRects->emplace_back(std::make_unique<protocol::Array<double>>()); } } @@ -960,7 +956,7 @@ String text = layout_object->IsText() ? ToLayoutText(layout_object)->GetText() : String(); - layout_tree_snapshot->getText()->addItem(AddString(text)); + layout_tree_snapshot->getText()->emplace_back(AddString(text)); if (!layout_object->IsText()) return layout_index; @@ -971,11 +967,11 @@ return layout_index; for (const auto& text_box : text_boxes) { - text_box_snapshot->getLayoutIndex()->addItem(layout_index); - text_box_snapshot->getBounds()->addItem(BuildRectForPhysicalRect2( + text_box_snapshot->getLayoutIndex()->emplace_back(layout_index); + text_box_snapshot->getBounds()->emplace_back(BuildRectForPhysicalRect2( TextFragmentRectInDocument(layout_object, text_box))); - text_box_snapshot->getStart()->addItem(text_box.dom_start_offset); - text_box_snapshot->getLength()->addItem(text_box.dom_length); + text_box_snapshot->getStart()->emplace_back(text_box.dom_start_offset); + text_box_snapshot->getLength()->emplace_back(text_box.dom_length); } return layout_index; @@ -1004,21 +1000,22 @@ // It's a distinct style, so append to |computedStyles|. auto style_properties = - protocol::Array<protocol::DOMSnapshot::NameValue>::create(); + std::make_unique<protocol::Array<protocol::DOMSnapshot::NameValue>>(); for (wtf_size_t i = 0; i < style.size(); i++) { if (style[i].IsEmpty()) continue; - style_properties->addItem(protocol::DOMSnapshot::NameValue::create() - .setName((*css_property_filter_)[i].first) - .setValue(style[i]) - .build()); + style_properties->emplace_back( + protocol::DOMSnapshot::NameValue::create() + .setName((*css_property_filter_)[i].first) + .setValue(style[i]) + .build()); } - wtf_size_t index = static_cast<wtf_size_t>(computed_styles_->length()); - computed_styles_->addItem(protocol::DOMSnapshot::ComputedStyle::create() - .setProperties(std::move(style_properties)) - .build()); + wtf_size_t index = static_cast<wtf_size_t>(computed_styles_->size()); + computed_styles_->emplace_back(protocol::DOMSnapshot::ComputedStyle::create() + .setProperties(std::move(style_properties)) + .build()); computed_styles_map_->insert(std::move(style), index); return index; } @@ -1027,10 +1024,10 @@ InspectorDOMSnapshotAgent::BuildStylesForNode(Node* node) { auto* computed_style_info = MakeGarbageCollected<CSSComputedStyleDeclaration>(node, true); - std::unique_ptr<protocol::Array<int>> result = protocol::Array<int>::create(); + auto result = std::make_unique<protocol::Array<int>>(); for (const auto& pair : *css_property_filter_) { String value = computed_style_info->GetPropertyValue(pair.second); - result->addItem(AddString(value)); + result->emplace_back(AddString(value)); } return result; }
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc index 4a92437..f92775a9 100644 --- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc +++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -139,17 +139,9 @@ std::unique_ptr<protocol::Array<double>> BuildArrayForQuad( const FloatQuad& quad) { - std::unique_ptr<protocol::Array<double>> array = - protocol::Array<double>::create(); - array->addItem(quad.P1().X()); - array->addItem(quad.P1().Y()); - array->addItem(quad.P2().X()); - array->addItem(quad.P2().Y()); - array->addItem(quad.P3().X()); - array->addItem(quad.P3().Y()); - array->addItem(quad.P4().X()); - array->addItem(quad.P4().Y()); - return array; + return std::make_unique<std::vector<double>, std::initializer_list<double>>( + {quad.P1().X(), quad.P1().Y(), quad.P2().X(), quad.P2().Y(), + quad.P3().X(), quad.P3().Y(), quad.P4().X(), quad.P4().Y()}); } Path QuadToPath(const FloatQuad& quad) { @@ -402,14 +394,8 @@ std::unique_ptr<protocol::Array<double>> RectForPhysicalRect( const PhysicalRect& rect) { - std::unique_ptr<protocol::Array<double>> result = - protocol::Array<double>::create(); - - result->addItem(rect.X()); - result->addItem(rect.Y()); - result->addItem(rect.Width()); - result->addItem(rect.Height()); - return result; + return std::make_unique<std::vector<double>, std::initializer_list<double>>( + {rect.X(), rect.Y(), rect.Width(), rect.Height()}); } // Returns |layout_object|'s bounding box in document coordinates. @@ -485,7 +471,7 @@ void InspectorHighlight::AppendDistanceInfo(Node* node) { if (!InspectorHighlight::GetBoxModel(node, &model_, false)) return; - boxes_ = protocol::Array<protocol::Array<double>>::create(); + boxes_ = std::make_unique<protocol::Array<protocol::Array<double>>>(); computed_style_ = protocol::DictionaryValue::create(); node->GetDocument().EnsurePaintLocationDataValidForNode(node); @@ -515,7 +501,7 @@ PhysicalRect document_rect( node->GetDocument().GetLayoutView()->DocumentRect()); LocalFrameView* local_frame_view = node->GetDocument().View(); - boxes_->addItem( + boxes_->emplace_back( RectForPhysicalRect(local_frame_view->ConvertToRootFrame(document_rect))); } @@ -565,11 +551,11 @@ for (const auto& text_box : layout_text->GetTextBoxInfo()) { PhysicalRect text_rect( TextFragmentRectInRootFrame(layout_object, text_box)); - boxes_->addItem(RectForPhysicalRect(text_rect)); + boxes_->emplace_back(RectForPhysicalRect(text_rect)); } } else { PhysicalRect rect(RectInRootFrame(layout_object)); - boxes_->addItem(RectForPhysicalRect(rect)); + boxes_->emplace_back(RectForPhysicalRect(rect)); } } @@ -688,10 +674,19 @@ if (model_) { std::unique_ptr<protocol::DictionaryValue> distance_info = protocol::DictionaryValue::create(); - distance_info->setArray("boxes", boxes_->toValue()); - distance_info->setArray("content", model_->getContent()->toValue()); - distance_info->setArray("padding", model_->getPadding()->toValue()); - distance_info->setArray("border", model_->getBorder()->toValue()); + distance_info->setArray( + "boxes", + protocol::ValueConversions<std::vector< + std::unique_ptr<std::vector<double>>>>::toValue(boxes_.get())); + distance_info->setArray( + "content", protocol::ValueConversions<std::vector<double>>::toValue( + model_->getContent())); + distance_info->setArray( + "padding", protocol::ValueConversions<std::vector<double>>::toValue( + model_->getPadding())); + distance_info->setArray( + "border", protocol::ValueConversions<std::vector<double>>::toValue( + model_->getBorder())); distance_info->setValue("style", computed_style_->clone()); object->setValue("distanceInfo", std::move(distance_info)); } @@ -768,21 +763,19 @@ protocol::ErrorSupport errors; if (const ShapeOutsideInfo* shape_outside_info = ShapeOutsideInfoForNode(node, &paths, &bounds_quad)) { + auto shape = ShapePathBuilder::BuildPath( + *view, *layout_object, *shape_outside_info, paths.shape, 1.f); + auto margin_shape = ShapePathBuilder::BuildPath( + *view, *layout_object, *shape_outside_info, paths.margin_shape, 1.f); (*model)->setShapeOutside( protocol::DOM::ShapeOutsideInfo::create() .setBounds(BuildArrayForQuad(bounds_quad)) - .setShape(protocol::Array<protocol::Value>::fromValue( - ShapePathBuilder::BuildPath(*view, *layout_object, - *shape_outside_info, paths.shape, - 1.f) - .get(), - &errors)) - .setMarginShape(protocol::Array<protocol::Value>::fromValue( - ShapePathBuilder::BuildPath(*view, *layout_object, - *shape_outside_info, - paths.margin_shape, 1.f) - .get(), - &errors)) + .setShape(protocol::ValueConversions< + protocol::Array<protocol::Value>>::fromValue(shape.get(), + &errors)) + .setMarginShape( + protocol::ValueConversions<protocol::Array<protocol::Value>>:: + fromValue(margin_shape.get(), &errors)) .build()); } @@ -819,7 +812,7 @@ result->reset(new protocol::Array<protocol::Array<double>>()); for (FloatQuad& quad : quads) - (*result)->addItem(BuildArrayForQuad(quad)); + (*result)->emplace_back(BuildArrayForQuad(quad)); return true; }
diff --git a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc index 82eab79..0b9a417 100644 --- a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
@@ -96,12 +96,12 @@ static std::unique_ptr<Array<protocol::LayerTree::ScrollRect>> BuildScrollRectsForLayer(const cc::Layer* layer, bool report_wheel_scrollers) { - std::unique_ptr<Array<protocol::LayerTree::ScrollRect>> scroll_rects = - Array<protocol::LayerTree::ScrollRect>::create(); + auto scroll_rects = + std::make_unique<protocol::Array<protocol::LayerTree::ScrollRect>>(); const cc::Region& non_fast_scrollable_rects = layer->non_fast_scrollable_region(); for (const gfx::Rect& rect : non_fast_scrollable_rects) { - scroll_rects->addItem(BuildScrollRect( + scroll_rects->emplace_back(BuildScrollRect( IntRect(rect), protocol::LayerTree::ScrollRect::TypeEnum::RepaintsOnScroll)); } @@ -109,18 +109,18 @@ layer->touch_action_region().region(); for (const gfx::Rect& rect : touch_event_handler_region) { - scroll_rects->addItem(BuildScrollRect( + scroll_rects->emplace_back(BuildScrollRect( IntRect(rect), protocol::LayerTree::ScrollRect::TypeEnum::TouchEventHandler)); } if (report_wheel_scrollers) { - scroll_rects->addItem(BuildScrollRect( + scroll_rects->emplace_back(BuildScrollRect( // TODO(yutak): This truncates the floating point position to integers. gfx::Rect(layer->position().x(), layer->position().y(), layer->bounds().width(), layer->bounds().height()), protocol::LayerTree::ScrollRect::TypeEnum::WheelEventHandler)); } - return scroll_rects->length() ? std::move(scroll_rects) : nullptr; + return scroll_rects->empty() ? nullptr : std::move(scroll_rects); } // TODO(flackr): We should be getting the sticky position constraints from the @@ -215,10 +215,10 @@ } if (!transform.IsIdentity()) { - auto transform_array = Array<double>::create(); + auto transform_array = std::make_unique<protocol::Array<double>>(); for (int col = 0; col < 4; ++col) { for (int row = 0; row < 4; ++row) - transform_array->addItem(transform.matrix().get(row, col)); + transform_array->emplace_back(transform.matrix().get(row, col)); } layer_object->setTransform(std::move(transform_array)); // FIXME: rename these to setTransformOrigin* @@ -336,8 +336,7 @@ if (!root_layer) return nullptr; - std::unique_ptr<Array<protocol::LayerTree::Layer>> layers = - Array<protocol::LayerTree::Layer>::create(); + auto layers = std::make_unique<protocol::Array<protocol::LayerTree::Layer>>(); auto* root_frame = inspected_frames_->Root(); auto* layer_for_scrolling = root_frame->View()->LayoutViewport()->LayerForScrolling(); @@ -361,7 +360,7 @@ if (client_->IsInspectorLayer(layer)) return; int layer_id = layer->id(); - layers->addItem(BuildObjectForLayer( + layers->emplace_back(BuildObjectForLayer( RootLayer(), layer, has_wheel_event_handlers && layer_id == scrolling_layer_id)); for (auto child : layer->children()) { @@ -405,9 +404,9 @@ if (!response.isSuccess()) return response; CompositingReasons reasons = layer->compositing_reasons(); - *reason_strings = Array<String>::create(); + *reason_strings = std::make_unique<protocol::Array<String>>(); for (const char* name : CompositingReason::ShortNames(reasons)) - (*reason_strings)->addItem(name); + (*reason_strings)->emplace_back(name); return Response::OK(); } @@ -450,15 +449,15 @@ Response InspectorLayerTreeAgent::loadSnapshot( std::unique_ptr<Array<protocol::LayerTree::PictureTile>> tiles, String* snapshot_id) { - if (!tiles->length()) + if (tiles->empty()) return Response::Error("Invalid argument, no tiles provided"); - if (tiles->length() > UINT_MAX) + if (tiles->size() > UINT_MAX) return Response::Error("Invalid argument, too many tiles provided"); - wtf_size_t tiles_length = static_cast<wtf_size_t>(tiles->length()); + wtf_size_t tiles_length = static_cast<wtf_size_t>(tiles->size()); Vector<scoped_refptr<PictureSnapshot::TilePictureStream>> decoded_tiles; decoded_tiles.Grow(tiles_length); for (wtf_size_t i = 0; i < tiles_length; ++i) { - protocol::LayerTree::PictureTile* tile = tiles->get(i); + protocol::LayerTree::PictureTile* tile = (*tiles)[i].get(); decoded_tiles[i] = base::AdoptRef(new PictureSnapshot::TilePictureStream()); decoded_tiles[i]->layer_offset.Set(tile->getX(), tile->getY()); const protocol::Binary& data = tile->getPicture(); @@ -540,12 +539,12 @@ snapshot->Profile(min_repeat_count.fromMaybe(1), TimeDelta::FromSecondsD(min_duration.fromMaybe(0)), clip_rect.isJust() ? &rect : nullptr); - *out_timings = Array<Array<double>>::create(); + *out_timings = std::make_unique<Array<Array<double>>>(); for (const auto& row : timings) { - std::unique_ptr<Array<double>> out_row = Array<double>::create(); + auto out_row = std::make_unique<protocol::Array<double>>(); for (TimeDelta delta : row) - out_row->addItem(delta.InSecondsF()); - (*out_timings)->addItem(std::move(out_row)); + out_row->emplace_back(delta.InSecondsF()); + (*out_timings)->emplace_back(std::move(out_row)); } return Response::OK(); } @@ -560,8 +559,9 @@ protocol::ErrorSupport errors; std::unique_ptr<protocol::Value> log_value = protocol::StringUtil::parseJSON( snapshot->SnapshotCommandLog()->ToJSONString()); - *command_log = - Array<protocol::DictionaryValue>::fromValue(log_value.get(), &errors); + *command_log = protocol::ValueConversions< + protocol::Array<protocol::DictionaryValue>>::fromValue(log_value.get(), + &errors); if (errors.hasErrors()) return Response::Error(errors.errors()); return Response::OK();
diff --git a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc index 0c76178..704802d 100644 --- a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
@@ -95,12 +95,12 @@ InnerEnable(); if (violation_thresholds_.IsEmpty()) return; - auto settings = protocol::Array<ViolationSetting>::create(); + auto settings = std::make_unique<protocol::Array<ViolationSetting>>(); for (const WTF::String& key : violation_thresholds_.Keys()) { - settings->addItem(ViolationSetting::create() - .setName(key) - .setThreshold(violation_thresholds_.Get(key)) - .build()); + settings->emplace_back(ViolationSetting::create() + .setName(key) + .setThreshold(violation_thresholds_.Get(key)) + .build()); } startViolationsReport(std::move(settings)); } @@ -133,10 +133,8 @@ if (v8_session_ && message->Frame() && !message->Nodes().IsEmpty()) { ScriptForbiddenScope::AllowUserAgentScript allow_script; - std::unique_ptr< - protocol::Array<v8_inspector::protocol::Runtime::API::RemoteObject>> - remote_objects = protocol::Array< - v8_inspector::protocol::Runtime::API::RemoteObject>::create(); + auto remote_objects = std::make_unique< + protocol::Array<v8_inspector::protocol::Runtime::API::RemoteObject>>(); for (DOMNodeId node_id : message->Nodes()) { std::unique_ptr<v8_inspector::protocol::Runtime::API::RemoteObject> remote_object = nullptr; @@ -150,7 +148,7 @@ NullRemoteObject(v8_session_, message->Frame(), "console"); } if (remote_object) { - remote_objects->addItem(std::move(remote_object)); + remote_objects->emplace_back(std::move(remote_object)); } else { // If a null object could not be referenced, we do not send the message // at all, to avoid situations in which the arguments are misleading. @@ -230,9 +228,9 @@ return Response::Error("Violations are not supported for this target"); performance_monitor_->UnsubscribeAll(this); violation_thresholds_.Clear(); - for (size_t i = 0; i < settings->length(); ++i) { - const WTF::String& name = settings->get(i)->getName(); - double threshold = settings->get(i)->getThreshold(); + for (const std::unique_ptr<ViolationSetting>& setting : *settings) { + const WTF::String& name = setting->getName(); + double threshold = setting->getThreshold(); PerformanceMonitor::Violation violation = ParseViolation(name); if (violation == PerformanceMonitor::kAfterLast) continue;
diff --git a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc index 45fb50f..29aa97fd 100644 --- a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
@@ -129,27 +129,25 @@ std::unique_ptr<protocol::Memory::SamplingProfile> InspectorMemoryAgent::GetSamplingProfileById(uint32_t id) { base::ModuleCache module_cache; - std::unique_ptr<protocol::Array<protocol::Memory::SamplingProfileNode>> - samples = - protocol::Array<protocol::Memory::SamplingProfileNode>::create(); + auto samples = std::make_unique< + protocol::Array<protocol::Memory::SamplingProfileNode>>(); std::vector<base::SamplingHeapProfiler::Sample> raw_samples = base::SamplingHeapProfiler::Get()->GetSamples(id); for (auto& it : raw_samples) { - std::unique_ptr<protocol::Array<protocol::String>> stack = - protocol::Array<protocol::String>::create(); for (const void* frame : it.stack) { uintptr_t address = reinterpret_cast<uintptr_t>(frame); module_cache.GetModuleForAddress(address); // Populates module_cache. } std::vector<std::string> source_stack = Symbolize(it.stack); - for (auto& it2 : source_stack) - stack->addItem(it2.c_str()); - samples->addItem(protocol::Memory::SamplingProfileNode::create() - .setSize(it.size) - .setTotal(it.total) - .setStack(std::move(stack)) - .build()); + auto stack = std::make_unique<protocol::Array<protocol::String>>(); + for (const std::string& frame : source_stack) + stack->emplace_back(frame.c_str()); + samples->emplace_back(protocol::Memory::SamplingProfileNode::create() + .setSize(it.size) + .setTotal(it.total) + .setStack(std::move(stack)) + .build()); } // Mix in v8 main isolate heap size as a synthetic node. @@ -158,26 +156,25 @@ v8::HeapStatistics heap_stats; v8::Isolate::GetCurrent()->GetHeapStatistics(&heap_stats); size_t total_bytes = heap_stats.total_heap_size(); - std::unique_ptr<protocol::Array<protocol::String>> stack = - protocol::Array<protocol::String>::create(); - stack->addItem("<V8 Heap>"); - samples->addItem(protocol::Memory::SamplingProfileNode::create() - .setSize(total_bytes) - .setTotal(total_bytes) - .setStack(std::move(stack)) - .build()); + auto stack = std::make_unique<protocol::Array<protocol::String>>(); + stack->emplace_back("<V8 Heap>"); + samples->emplace_back(protocol::Memory::SamplingProfileNode::create() + .setSize(total_bytes) + .setTotal(total_bytes) + .setStack(std::move(stack)) + .build()); } - std::unique_ptr<protocol::Array<protocol::Memory::Module>> modules = - protocol::Array<protocol::Memory::Module>::create(); + auto modules = std::make_unique<protocol::Array<protocol::Memory::Module>>(); for (const auto* module : module_cache.GetModules()) { - modules->addItem(protocol::Memory::Module::create() - .setName(module->GetDebugBasename().value().c_str()) - .setUuid(module->GetId().c_str()) - .setBaseAddress(String::Format( - "0x%" PRIxPTR, module->GetBaseAddress())) - .setSize(static_cast<double>(module->GetSize())) - .build()); + modules->emplace_back( + protocol::Memory::Module::create() + .setName(module->GetDebugBasename().value().c_str()) + .setUuid(module->GetId().c_str()) + .setBaseAddress( + String::Format("0x%" PRIxPTR, module->GetBaseAddress())) + .setSize(static_cast<double>(module->GetSize())) + .build()); } return protocol::Memory::SamplingProfile::create()
diff --git a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc index ad3cc26e..425ee244 100644 --- a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
@@ -629,15 +629,12 @@ const ResourceResponse::SecurityDetails* response_security_details = response.GetSecurityDetails(); - std::unique_ptr<protocol::Array<String>> san_list = - protocol::Array<String>::create(); - for (auto const& san : response_security_details->san_list) - san_list->addItem(san); + auto san_list = std::make_unique<protocol::Array<String>>( + response_security_details->san_list.begin(), + response_security_details->san_list.end()); - std::unique_ptr< - protocol::Array<protocol::Network::SignedCertificateTimestamp>> - signed_certificate_timestamp_list = protocol::Array< - protocol::Network::SignedCertificateTimestamp>::create(); + auto signed_certificate_timestamp_list = std::make_unique< + protocol::Array<protocol::Network::SignedCertificateTimestamp>>(); for (auto const& sct : response_security_details->sct_list) { std::unique_ptr<protocol::Network::SignedCertificateTimestamp> signed_certificate_timestamp = @@ -651,7 +648,7 @@ .setSignatureAlgorithm(sct.signature_algorithm_) .setSignatureData(sct.signature_data_) .build(); - signed_certificate_timestamp_list->addItem( + signed_certificate_timestamp_list->emplace_back( std::move(signed_certificate_timestamp)); } @@ -1418,8 +1415,8 @@ Response InspectorNetworkAgent::setBlockedURLs( std::unique_ptr<protocol::Array<String>> urls) { blocked_urls_.Clear(); - for (size_t i = 0; i < urls->length(); i++) - blocked_urls_.Set(urls->get(i), true); + for (const String& url : *urls) + blocked_urls_.Set(url, true); return Response::OK(); } @@ -1521,7 +1518,7 @@ Response InspectorNetworkAgent::getCertificate( const String& origin, std::unique_ptr<protocol::Array<String>>* certificate) { - *certificate = protocol::Array<String>::create(); + *certificate = std::make_unique<protocol::Array<String>>(); scoped_refptr<const SecurityOrigin> security_origin = SecurityOrigin::CreateFromString(origin); for (auto& resource : resources_data_->Resources()) { @@ -1530,8 +1527,9 @@ if (resource_origin->IsSameSchemeHostPort(security_origin.get()) && resource->Certificate().size()) { for (auto& cert : resource->Certificate()) { - certificate->get()->addItem( - Base64Encode(base::as_bytes(base::make_span(cert.Latin1())))); + (*certificate) + ->emplace_back( + Base64Encode(base::as_bytes(base::make_span(cert.Latin1())))); } return Response::OK(); } @@ -1617,10 +1615,9 @@ auto results = v8_session_->searchInTextByLines( ToV8InspectorStringView(content), ToV8InspectorStringView(query), case_sensitive.fromMaybe(false), is_regex.fromMaybe(false)); - *matches = protocol::Array< - v8_inspector::protocol::Debugger::API::SearchMatch>::create(); - for (size_t i = 0; i < results.size(); ++i) - matches->get()->addItem(std::move(results[i])); + *matches = std::make_unique< + protocol::Array<v8_inspector::protocol::Debugger::API::SearchMatch>>( + std::move(results)); return Response::OK(); }
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc index 730c152f..0df9657 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -94,12 +94,12 @@ bool ParseQuad(std::unique_ptr<protocol::Array<double>> quad_array, FloatQuad* quad) { const size_t kCoordinatesInQuad = 8; - if (!quad_array || quad_array->length() != kCoordinatesInQuad) + if (!quad_array || quad_array->size() != kCoordinatesInQuad) return false; - quad->SetP1(FloatPoint(quad_array->get(0), quad_array->get(1))); - quad->SetP2(FloatPoint(quad_array->get(2), quad_array->get(3))); - quad->SetP3(FloatPoint(quad_array->get(4), quad_array->get(5))); - quad->SetP4(FloatPoint(quad_array->get(6), quad_array->get(7))); + quad->SetP1(FloatPoint((*quad_array)[0], (*quad_array)[1])); + quad->SetP2(FloatPoint((*quad_array)[2], (*quad_array)[3])); + quad->SetP3(FloatPoint((*quad_array)[4], (*quad_array)[5])); + quad->SetP4(FloatPoint((*quad_array)[6], (*quad_array)[7])); return true; }
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc index 01ada15..d6084eb 100644 --- a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
@@ -140,40 +140,39 @@ std::unique_ptr<protocol::Array<String>> GetEnabledWindowFeatures( const WebWindowFeatures& window_features) { - std::unique_ptr<protocol::Array<String>> feature_strings = - protocol::Array<String>::create(); + auto feature_strings = std::make_unique<protocol::Array<String>>(); if (window_features.x_set) { - feature_strings->addItem( + feature_strings->emplace_back( String::Format("left=%d", static_cast<int>(window_features.x))); } if (window_features.y_set) { - feature_strings->addItem( + feature_strings->emplace_back( String::Format("top=%d", static_cast<int>(window_features.y))); } if (window_features.width_set) { - feature_strings->addItem( + feature_strings->emplace_back( String::Format("width=%d", static_cast<int>(window_features.width))); } if (window_features.height_set) { - feature_strings->addItem( + feature_strings->emplace_back( String::Format("height=%d", static_cast<int>(window_features.height))); } if (window_features.menu_bar_visible) - feature_strings->addItem("menubar"); + feature_strings->emplace_back("menubar"); if (window_features.tool_bar_visible) - feature_strings->addItem("toolbar"); + feature_strings->emplace_back("toolbar"); if (window_features.status_bar_visible) - feature_strings->addItem("status"); + feature_strings->emplace_back("status"); if (window_features.scrollbars_visible) - feature_strings->addItem("scrollbars"); + feature_strings->emplace_back("scrollbars"); if (window_features.resizable) - feature_strings->addItem("resizable"); + feature_strings->emplace_back("resizable"); if (window_features.noopener) - feature_strings->addItem("noopener"); + feature_strings->emplace_back("noopener"); if (window_features.background) - feature_strings->addItem("background"); + feature_strings->emplace_back("background"); if (window_features.persistent) - feature_strings->addItem("persistent"); + feature_strings->emplace_back("persistent"); return feature_strings; } @@ -764,11 +763,10 @@ auto matches = v8_session_->searchInTextByLines( ToV8InspectorStringView(content), ToV8InspectorStringView(query), case_sensitive, is_regex); - auto results = protocol::Array< - v8_inspector::protocol::Debugger::API::SearchMatch>::create(); - for (size_t i = 0; i < matches.size(); ++i) - results->addItem(std::move(matches[i])); - callback->sendSuccess(std::move(results)); + callback->sendSuccess( + std::make_unique< + protocol::Array<v8_inspector::protocol::Debugger::API::SearchMatch>>( + std::move(matches))); } void InspectorPageAgent::searchInResource( @@ -1069,9 +1067,11 @@ auto* child_local_frame = DynamicTo<LocalFrame>(child); if (!child_local_frame) continue; - if (!children_array) - children_array = protocol::Array<protocol::Page::FrameTree>::create(); - children_array->addItem(BuildObjectForFrameTree(child_local_frame)); + if (!children_array) { + children_array = + std::make_unique<protocol::Array<protocol::Page::FrameTree>>(); + } + children_array->emplace_back(BuildObjectForFrameTree(child_local_frame)); } result->setChildFrames(std::move(children_array)); return result; @@ -1081,8 +1081,8 @@ InspectorPageAgent::BuildObjectForResourceTree(LocalFrame* frame) { std::unique_ptr<protocol::Page::Frame> frame_object = BuildObjectForFrame(frame); - std::unique_ptr<protocol::Array<protocol::Page::FrameResource>> subresources = - protocol::Array<protocol::Page::FrameResource>::create(); + auto subresources = + std::make_unique<protocol::Array<protocol::Page::FrameResource>>(); HeapVector<Member<Resource>> all_resources = CachedResourcesForFrame(frame, true); @@ -1101,7 +1101,7 @@ resource_object->setCanceled(true); else if (cached_resource->GetStatus() == ResourceStatus::kLoadError) resource_object->setFailed(true); - subresources->addItem(std::move(resource_object)); + subresources->emplace_back(std::move(resource_object)); } HeapVector<Member<Document>> all_imports = @@ -1113,7 +1113,7 @@ .setType(ResourceTypeJson(InspectorPageAgent::kDocumentResource)) .setMimeType(import->SuggestedMIMEType()) .build(); - subresources->addItem(std::move(resource_object)); + subresources->emplace_back(std::move(resource_object)); } std::unique_ptr<protocol::Page::FrameResourceTree> result = @@ -1129,10 +1129,11 @@ auto* child_local_frame = DynamicTo<LocalFrame>(child); if (!child_local_frame) continue; - if (!children_array) - children_array = - protocol::Array<protocol::Page::FrameResourceTree>::create(); - children_array->addItem(BuildObjectForResourceTree(child_local_frame)); + if (!children_array) { + children_array = std::make_unique< + protocol::Array<protocol::Page::FrameResourceTree>>(); + } + children_array->emplace_back(BuildObjectForResourceTree(child_local_frame)); } result->setChildFrames(std::move(children_array)); return result;
diff --git a/third_party/blink/renderer/core/inspector/inspector_performance_agent.cc b/third_party/blink/renderer/core/inspector/inspector_performance_agent.cc index 898e5c9..6f822fe 100644 --- a/third_party/blink/renderer/core/inspector/inspector_performance_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_performance_agent.cc
@@ -80,10 +80,10 @@ void AppendMetric(protocol::Array<protocol::Performance::Metric>* container, const String& name, double value) { - container->addItem(protocol::Performance::Metric::create() - .setName(name) - .setValue(value) - .build()); + container->emplace_back(protocol::Performance::Metric::create() + .setName(name) + .setValue(value) + .build()); } } // namespace @@ -126,12 +126,13 @@ std::unique_ptr<protocol::Array<protocol::Performance::Metric>>* out_result) { if (!enabled_.Get()) { - *out_result = protocol::Array<protocol::Performance::Metric>::create(); + *out_result = + std::make_unique<protocol::Array<protocol::Performance::Metric>>(); return Response::OK(); } - std::unique_ptr<protocol::Array<protocol::Performance::Metric>> result = - protocol::Array<protocol::Performance::Metric>::create(); + auto result = + std::make_unique<protocol::Array<protocol::Performance::Metric>>(); AppendMetric(result.get(), "Timestamp", CurrentTimeTicks().since_origin().InSecondsF());
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc index 22a51a8f..fd442fb 100644 --- a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc +++ b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
@@ -802,10 +802,10 @@ } std::unique_ptr<protocol::CSS::CSSStyle> InspectorStyle::StyleWithProperties() { - std::unique_ptr<Array<protocol::CSS::CSSProperty>> properties_object = - Array<protocol::CSS::CSSProperty>::create(); - std::unique_ptr<Array<protocol::CSS::ShorthandEntry>> shorthand_entries = - Array<protocol::CSS::ShorthandEntry>::create(); + auto properties_object = + std::make_unique<protocol::Array<protocol::CSS::CSSProperty>>(); + auto shorthand_entries = + std::make_unique<protocol::Array<protocol::CSS::ShorthandEntry>>(); HashSet<String> found_shorthands; Vector<CSSPropertySourceData> properties; @@ -855,11 +855,11 @@ .build(); if (!style_->getPropertyPriority(name).IsEmpty()) entry->setImportant(true); - shorthand_entries->addItem(std::move(entry)); + shorthand_entries->emplace_back(std::move(entry)); } } } - properties_object->addItem(std::move(property)); + properties_object->emplace_back(std::move(property)); } std::unique_ptr<protocol::CSS::CSSStyle> result = @@ -1382,8 +1382,7 @@ std::unique_ptr<protocol::Array<String>> InspectorStyleSheet::CollectClassNames() { HashSet<String> unique_names; - std::unique_ptr<protocol::Array<String>> result = - protocol::Array<String>::create(); + auto result = std::make_unique<protocol::Array<String>>(); for (wtf_size_t i = 0; i < parsed_flat_rules_.size(); ++i) { if (auto* style_rule = @@ -1391,7 +1390,7 @@ GetClassNamesFromRule(style_rule, unique_names); } for (const String& class_name : unique_names) - result->addItem(class_name); + result->emplace_back(class_name); return result; } @@ -1493,8 +1492,7 @@ InspectorStyleSheet::SelectorsFromSource(CSSRuleSourceData* source_data, const String& sheet_text) { ScriptRegexp comment("/\\*[^]*?\\*/", kTextCaseSensitive, kMultilineEnabled); - std::unique_ptr<protocol::Array<protocol::CSS::Value>> result = - protocol::Array<protocol::CSS::Value>::create(); + auto result = std::make_unique<protocol::Array<protocol::CSS::Value>>(); const Vector<SourceRange>& ranges = source_data->selector_ranges; for (wtf_size_t i = 0, size = ranges.size(); i < size; ++i) { const SourceRange& range = ranges.at(i); @@ -1512,7 +1510,7 @@ .setText(selector.StripWhiteSpace()) .build(); simple_selector->setRange(BuildSourceRangeObject(range)); - result->addItem(std::move(simple_selector)); + result->emplace_back(std::move(simple_selector)); } return result; } @@ -1529,13 +1527,14 @@ if (source_data) { selectors = SelectorsFromSource(source_data, text_); } else { - selectors = protocol::Array<protocol::CSS::Value>::create(); + selectors = std::make_unique<protocol::Array<protocol::CSS::Value>>(); const CSSSelectorList& selector_list = rule->GetStyleRule()->SelectorList(); for (const CSSSelector* selector = selector_list.First(); selector; - selector = CSSSelectorList::Next(*selector)) - selectors->addItem(protocol::CSS::Value::create() - .setText(selector->SelectorText()) - .build()); + selector = CSSSelectorList::Next(*selector)) { + selectors->emplace_back(protocol::CSS::Value::create() + .setText(selector->SelectorText()) + .build()); + } } return protocol::CSS::SelectorList::create() .setSelectors(std::move(selectors))
diff --git a/third_party/blink/renderer/core/layout/BUILD.gn b/third_party/blink/renderer/core/layout/BUILD.gn index 2252fa4..523cd42 100644 --- a/third_party/blink/renderer/core/layout/BUILD.gn +++ b/third_party/blink/renderer/core/layout/BUILD.gn
@@ -107,10 +107,6 @@ "hit_testing_transform_state.cc", "hit_testing_transform_state.h", "intrinsic_sizing_info.h", - "jank_region.cc", - "jank_region.h", - "jank_tracker.cc", - "jank_tracker.h", "layout_analyzer.cc", "layout_analyzer.h", "layout_block.cc", @@ -210,6 +206,10 @@ "layout_scrollbar_theme.h", "layout_search_field.cc", "layout_search_field.h", + "layout_shift_region.cc", + "layout_shift_region.h", + "layout_shift_tracker.cc", + "layout_shift_tracker.h", "layout_slider.cc", "layout_slider.h", "layout_slider_container.cc",
diff --git a/third_party/blink/renderer/core/layout/jank_region.cc b/third_party/blink/renderer/core/layout/layout_shift_region.cc similarity index 98% rename from third_party/blink/renderer/core/layout/jank_region.cc rename to third_party/blink/renderer/core/layout/layout_shift_region.cc index 2625c798..8eb2105 100644 --- a/third_party/blink/renderer/core/layout/jank_region.cc +++ b/third_party/blink/renderer/core/layout/layout_shift_region.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 "third_party/blink/renderer/core/layout/jank_region.h" +#include "third_party/blink/renderer/core/layout/layout_shift_region.h" namespace blink { @@ -302,7 +302,7 @@ } // namespace -uint64_t JankRegion::Area() const { +uint64_t LayoutShiftRegion::Area() const { if (rects_.IsEmpty()) return 0;
diff --git a/third_party/blink/renderer/core/layout/jank_region.h b/third_party/blink/renderer/core/layout/layout_shift_region.h similarity index 65% rename from third_party/blink/renderer/core/layout/jank_region.h rename to third_party/blink/renderer/core/layout/layout_shift_region.h index 3b948744..78a774bb 100644 --- a/third_party/blink/renderer/core/layout/jank_region.h +++ b/third_party/blink/renderer/core/layout/layout_shift_region.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 THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_JANK_REGION_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_JANK_REGION_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_SHIFT_REGION_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_SHIFT_REGION_H_ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/geometry/int_rect.h" @@ -12,13 +12,13 @@ namespace blink { -// Represents a per-frame jank region for JankTracker. Only used when the -// JankTrackingSweepLine feature is enabled. +// Represents a per-frame layout shift region for LayoutShiftTracker. Only used +// when the JankTrackingSweepLine feature is enabled. // // This class uses a sweep line algorithm to compute the area in O(n log n) time -// where n is the number of rects recorded by AddRect. For complex jank regions, -// this is more efficient than using blink::Region, which is worst-case O(n^2) -// from the repeated calls to Region::Unite. +// where n is the number of rects recorded by AddRect. For complex layout shift +// regions, this is more efficient than using blink::Region, which is worst-case +// O(n^2) from the repeated calls to Region::Unite. // // The high-level approach is described here: // http://jeffe.cs.illinois.edu/open/klee.html @@ -26,14 +26,14 @@ // The sweep line moves from left to right. (TODO: compare performance against a // top-to-bottom sweep.) // -// The sweep line's current intersection with the jank region ("active length") -// is tracked by a segment tree, similar to what is described at: +// The sweep line's current intersection with the layout shift region ("active +// length") is tracked by a segment tree, similar to what is described at: // https://en.wikipedia.org/wiki/Segment_tree // // There are some subtleties to the segment tree, which are described by the // comments in the implementation. -class CORE_EXPORT JankRegion { +class CORE_EXPORT LayoutShiftRegion { DISALLOW_NEW(); public: @@ -54,4 +54,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_JANK_REGION_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_SHIFT_REGION_H_
diff --git a/third_party/blink/renderer/core/layout/jank_region_test.cc b/third_party/blink/renderer/core/layout/layout_shift_region_test.cc similarity index 93% rename from third_party/blink/renderer/core/layout/jank_region_test.cc rename to third_party/blink/renderer/core/layout/layout_shift_region_test.cc index a688fec..fe1cf3b8 100644 --- a/third_party/blink/renderer/core/layout/jank_region_test.cc +++ b/third_party/blink/renderer/core/layout/layout_shift_region_test.cc
@@ -2,17 +2,17 @@ // 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/core/layout/jank_region.h" +#include "third_party/blink/renderer/core/layout/layout_shift_region.h" #include <gtest/gtest.h> #include "third_party/blink/renderer/platform/geometry/region.h" namespace blink { -class JankRegionTest : public testing::Test {}; +class LayoutShiftRegionTest : public testing::Test {}; -TEST_F(JankRegionTest, Basic) { - JankRegion region; +TEST_F(LayoutShiftRegionTest, Basic) { + LayoutShiftRegion region; EXPECT_EQ(0u, region.Area()); region.AddRect(IntRect(2, 1, 1, 3)); @@ -43,8 +43,8 @@ EXPECT_EQ(0u, region.Area()); } -TEST_F(JankRegionTest, LargeRandom) { - JankRegion region; +TEST_F(LayoutShiftRegionTest, LargeRandom) { + LayoutShiftRegion region; Region naive_region; static const int data[] = { 52613, 38528, 20785, 40550, 29734, 48229, 37113, 3520, 66776, 26746, @@ -107,8 +107,8 @@ // █ █ █ // ███████ // █ █ █ -TEST_F(JankRegionTest, Waffle) { - JankRegion region; +TEST_F(LayoutShiftRegionTest, Waffle) { + LayoutShiftRegion region; unsigned n = 250000; for (unsigned i = 2; i <= n; i += 2) { region.AddRect(IntRect(i, 1, 1, n + 1));
diff --git a/third_party/blink/renderer/core/layout/jank_tracker.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc similarity index 92% rename from third_party/blink/renderer/core/layout/jank_tracker.cc rename to third_party/blink/renderer/core/layout/layout_shift_tracker.cc index ce87508..95114d6 100644 --- a/third_party/blink/renderer/core/layout/jank_tracker.cc +++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.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 "third_party/blink/renderer/core/layout/jank_tracker.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "cc/layers/heads_up_display_layer.h" #include "cc/layers/picture_layer.h" @@ -92,7 +92,7 @@ value.EndArray(); } -static void RegionToTracedValue(const JankRegion& region, +static void RegionToTracedValue(const LayoutShiftRegion& region, double granularity_scale, TracedValue& value) { Region old_region; @@ -108,22 +108,23 @@ } #endif -JankTracker::JankTracker(LocalFrameView* frame_view) +LayoutShiftTracker::LayoutShiftTracker(LocalFrameView* frame_view) : frame_view_(frame_view), score_(0.0), score_with_move_distance_(0.0), weighted_score_(0.0), timer_(frame_view->GetFrame().GetTaskRunner(TaskType::kInternalDefault), this, - &JankTracker::TimerFired), + &LayoutShiftTracker::TimerFired), frame_max_distance_(0.0), overall_max_distance_(0.0), observed_input_or_scroll_(false) {} -void JankTracker::AccumulateJank(const LayoutObject& source, - const PropertyTreeState& property_tree_state, - FloatRect old_rect, - FloatRect new_rect) { +void LayoutShiftTracker::AccumulateJank( + const LayoutObject& source, + const PropertyTreeState& property_tree_state, + FloatRect old_rect, + FloatRect new_rect) { if (old_rect.IsEmpty() || new_rect.IsEmpty()) return; @@ -209,7 +210,7 @@ } } -void JankTracker::NotifyObjectPrePaint( +void LayoutShiftTracker::NotifyObjectPrePaint( const LayoutObject& object, const PropertyTreeState& property_tree_state, const IntRect& old_visual_rect, @@ -221,9 +222,10 @@ FloatRect(new_visual_rect)); } -void JankTracker::NotifyCompositedLayerMoved(const LayoutObject& layout_object, - FloatRect old_layer_rect, - FloatRect new_layer_rect) { +void LayoutShiftTracker::NotifyCompositedLayerMoved( + const LayoutObject& layout_object, + FloatRect old_layer_rect, + FloatRect new_layer_rect) { if (!IsActive()) return; @@ -235,7 +237,7 @@ old_layer_rect, new_layer_rect); } -double JankTracker::SubframeWeightingFactor() const { +double LayoutShiftTracker::SubframeWeightingFactor() const { LocalFrame& frame = frame_view_->GetFrame(); if (frame.IsMainFrame()) return 1; @@ -261,7 +263,7 @@ main_frame_size.Area(); } -void JankTracker::NotifyPrePaintFinished() { +void LayoutShiftTracker::NotifyPrePaintFinished() { if (!IsActive()) return; bool use_sweep_line = RuntimeEnabledFeatures::JankTrackingSweepLineEnabled(); @@ -354,7 +356,7 @@ frame_max_distance_ = 0.0; } -void JankTracker::NotifyInput(const WebInputEvent& event) { +void LayoutShiftTracker::NotifyInput(const WebInputEvent& event) { bool event_is_meaningful = event.GetType() == WebInputEvent::kMouseDown || event.GetType() == WebInputEvent::kKeyDown || @@ -374,7 +376,7 @@ timer_.StartOneShot(kTimerDelay, FROM_HERE); } -void JankTracker::NotifyScroll(ScrollType scroll_type) { +void LayoutShiftTracker::NotifyScroll(ScrollType scroll_type) { // Only include user-initiated scrolls. Ignore scrolls due to e.g. hash // fragment navigations. if (scroll_type != kUserScroll && scroll_type != kCompositorScroll) @@ -383,12 +385,12 @@ observed_input_or_scroll_ = true; } -void JankTracker::NotifyViewportSizeChanged() { +void LayoutShiftTracker::NotifyViewportSizeChanged() { // This cancels any previously scheduled task from the same timer. timer_.StartOneShot(kTimerDelay, FROM_HERE); } -bool JankTracker::IsActive() { +bool LayoutShiftTracker::IsActive() { // This eliminates noise from the private Page object created by // SVGImage::DataChanged. if (frame_view_->GetFrame().GetChromeClient().IsSVGImageChromeClient()) @@ -400,7 +402,7 @@ return true; } -std::unique_ptr<TracedValue> JankTracker::PerFrameTraceData( +std::unique_ptr<TracedValue> LayoutShiftTracker::PerFrameTraceData( double jank_fraction, double jank_fraction_with_move_distance, double granularity_scale) const { @@ -421,7 +423,7 @@ return value; } -std::vector<gfx::Rect> JankTracker::ConvertIntRectsToGfxRects( +std::vector<gfx::Rect> LayoutShiftTracker::ConvertIntRectsToGfxRects( const Vector<IntRect>& int_rects, double granularity_scale) { std::vector<gfx::Rect> rects; @@ -434,9 +436,9 @@ return rects; } -void JankTracker::SetLayoutShiftRects(const Vector<IntRect>& int_rects, - double granularity_scale, - bool using_sweep_line) { +void LayoutShiftTracker::SetLayoutShiftRects(const Vector<IntRect>& int_rects, + double granularity_scale, + bool using_sweep_line) { // Store the layout shift rects in the HUD layer. GraphicsLayer* root_graphics_layer = frame_view_->GetLayoutView()->Compositor()->RootGraphicsLayer();
diff --git a/third_party/blink/renderer/core/layout/jank_tracker.h b/third_party/blink/renderer/core/layout/layout_shift_tracker.h similarity index 81% rename from third_party/blink/renderer/core/layout/jank_tracker.h rename to third_party/blink/renderer/core/layout/layout_shift_tracker.h index 678f0a6..07349c3 100644 --- a/third_party/blink/renderer/core/layout/jank_tracker.h +++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.h
@@ -2,11 +2,11 @@ // 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_CORE_LAYOUT_JANK_TRACKER_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_JANK_TRACKER_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_SHIFT_TRACKER_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_SHIFT_TRACKER_H_ #include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/layout/jank_region.h" +#include "third_party/blink/renderer/core/layout/layout_shift_region.h" #include "third_party/blink/renderer/core/scroll/scroll_types.h" #include "third_party/blink/renderer/platform/geometry/region.h" #include "third_party/blink/renderer/platform/timer.h" @@ -21,14 +21,14 @@ class TracedValue; class WebInputEvent; -// Tracks "jank" from layout objects changing their visual location between -// animation frames. -class CORE_EXPORT JankTracker { - USING_FAST_MALLOC(JankTracker); +// Tracks "layout shifts" from layout objects changing their visual location +// between animation frames. See https://github.com/WICG/layout-instability. +class CORE_EXPORT LayoutShiftTracker { + USING_FAST_MALLOC(LayoutShiftTracker); public: - JankTracker(LocalFrameView*); - ~JankTracker() {} + LayoutShiftTracker(LocalFrameView*); + ~LayoutShiftTracker() {} void NotifyObjectPrePaint(const LayoutObject& object, const PropertyTreeState& property_tree_state, const IntRect& old_visual_rect, @@ -81,18 +81,18 @@ // The cumulative jank score for this LocalFrame, with each increase weighted // by the extent to which the LocalFrame visibly occupied the main frame at - // the time the jank occurred (e.g. x0.5 if the subframe occupied half of the - // main frame's reported size (see JankTracker::SubframeWeightingFactor). + // the time the jank occurred, e.g. x0.5 if the subframe occupied half of the + // main frame's reported size; see SubframeWeightingFactor(). double weighted_score_; // The per-animation-frame jank region. Region region_; // Experimental jank region implementation using sweep-line algorithm. - JankRegion region_experimental_; + LayoutShiftRegion region_experimental_; // Tracks the short period after an input event during which we ignore jank. - TaskRunnerTimer<JankTracker> timer_; + TaskRunnerTimer<LayoutShiftTracker> timer_; // The maximum distance any layout object has moved in the current animation // frame. @@ -108,4 +108,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_JANK_TRACKER_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_SHIFT_TRACKER_H_
diff --git a/third_party/blink/renderer/core/layout/jank_tracker_test.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc similarity index 81% rename from third_party/blink/renderer/core/layout/jank_tracker_test.cc rename to third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc index a43e243..7d2f781 100644 --- a/third_party/blink/renderer/core/layout/jank_tracker_test.cc +++ b/third_party/blink/renderer/core/layout/layout_shift_tracker_test.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 "third_party/blink/renderer/core/layout/jank_tracker.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/public/platform/web_mouse_event.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" @@ -14,17 +14,19 @@ namespace blink { -class JankTrackerTest : public RenderingTest { +class LayoutShiftTrackerTest : public RenderingTest { protected: void SetUp() override { RenderingTest::SetUp(); EnableCompositing(); } LocalFrameView& GetFrameView() { return *GetFrame().View(); } - JankTracker& GetJankTracker() { return GetFrameView().GetJankTracker(); } + LayoutShiftTracker& GetLayoutShiftTracker() { + return GetFrameView().GetLayoutShiftTracker(); + } void SimulateInput() { - GetJankTracker().NotifyInput(WebMouseEvent( + GetLayoutShiftTracker().NotifyInput(WebMouseEvent( WebInputEvent::kMouseDown, WebFloatPoint(), WebFloatPoint(), WebPointerProperties::Button::kLeft, 0, WebInputEvent::Modifiers::kLeftButtonDown, CurrentTimeTicks())); @@ -36,7 +38,7 @@ } }; -TEST_F(JankTrackerTest, SimpleBlockMovement) { +TEST_F(LayoutShiftTrackerTest, SimpleBlockMovement) { SetBodyInnerHTML(R"HTML( <style> #j { position: relative; width: 300px; height: 100px; } @@ -44,22 +46,22 @@ <div id='j'></div> )HTML"); - EXPECT_EQ(0.0, GetJankTracker().Score()); - EXPECT_EQ(0.0, GetJankTracker().OverallMaxDistance()); + EXPECT_EQ(0.0, GetLayoutShiftTracker().Score()); + EXPECT_EQ(0.0, GetLayoutShiftTracker().OverallMaxDistance()); GetDocument().getElementById("j")->setAttribute(html_names::kStyleAttr, AtomicString("top: 60px")); UpdateAllLifecyclePhases(); // 300 * (100 + 60) / (default viewport size 800 * 600) - EXPECT_FLOAT_EQ(0.1, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.1, GetLayoutShiftTracker().Score()); // ScoreWithMoveDistance should be scaled by the amount that the content moved // (60px) relative to the max viewport dimension (width=800px). EXPECT_FLOAT_EQ(0.1 * (60.0 / 800.0), - GetJankTracker().ScoreWithMoveDistance()); - EXPECT_FLOAT_EQ(60.0, GetJankTracker().OverallMaxDistance()); + GetLayoutShiftTracker().ScoreWithMoveDistance()); + EXPECT_FLOAT_EQ(60.0, GetLayoutShiftTracker().OverallMaxDistance()); } -TEST_F(JankTrackerTest, GranularitySnapping) { +TEST_F(LayoutShiftTrackerTest, GranularitySnapping) { if (RuntimeEnabledFeatures::JankTrackingSweepLineEnabled()) return; @@ -73,10 +75,10 @@ AtomicString("top: 58px")); UpdateAllLifecyclePhases(); // Rect locations and sizes should snap to multiples of 600 / 60 = 10. - EXPECT_FLOAT_EQ(0.1, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.1, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, Transform) { +TEST_F(LayoutShiftTrackerTest, Transform) { SetBodyInnerHTML(R"HTML( <style> body { margin: 0; } @@ -92,10 +94,10 @@ AtomicString("top: 60px")); UpdateAllLifecyclePhases(); // (600 - 300) * (140 - 40 + 60) / (default viewport size 800 * 600) - EXPECT_FLOAT_EQ(0.1, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.1, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, RtlDistance) { +TEST_F(LayoutShiftTrackerTest, RtlDistance) { SetBodyInnerHTML(R"HTML( <style> #j { position: relative; width: 100px; height: 100px; direction: rtl; } @@ -105,10 +107,10 @@ GetDocument().getElementById("j")->setAttribute( html_names::kStyleAttr, AtomicString("width: 70px; left: 10px")); UpdateAllLifecyclePhases(); - EXPECT_FLOAT_EQ(20.0, GetJankTracker().OverallMaxDistance()); + EXPECT_FLOAT_EQ(20.0, GetLayoutShiftTracker().OverallMaxDistance()); } -TEST_F(JankTrackerTest, SmallMovementIgnored) { +TEST_F(LayoutShiftTrackerTest, SmallMovementIgnored) { SetBodyInnerHTML(R"HTML( <style> #j { position: relative; width: 300px; height: 100px; } @@ -118,10 +120,10 @@ GetDocument().getElementById("j")->setAttribute(html_names::kStyleAttr, AtomicString("top: 2px")); UpdateAllLifecyclePhases(); - EXPECT_EQ(0.0, GetJankTracker().Score()); + EXPECT_EQ(0.0, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, SmallMovementIgnoredWithZoom) { +TEST_F(LayoutShiftTrackerTest, SmallMovementIgnoredWithZoom) { GetDocument().GetFrame()->SetPageZoomFactor(2); SetBodyInnerHTML(R"HTML( <style> @@ -132,10 +134,10 @@ GetDocument().getElementById("j")->setAttribute(html_names::kStyleAttr, AtomicString("top: 2px")); UpdateAllLifecyclePhases(); - EXPECT_EQ(0.0, GetJankTracker().Score()); + EXPECT_EQ(0.0, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, IgnoreAfterInput) { +TEST_F(LayoutShiftTrackerTest, IgnoreAfterInput) { SetBodyInnerHTML(R"HTML( <style> #j { position: relative; width: 300px; height: 100px; } @@ -146,11 +148,11 @@ AtomicString("top: 60px")); SimulateInput(); UpdateAllLifecyclePhases(); - EXPECT_EQ(0.0, GetJankTracker().Score()); - EXPECT_TRUE(GetJankTracker().ObservedInputOrScroll()); + EXPECT_EQ(0.0, GetLayoutShiftTracker().Score()); + EXPECT_TRUE(GetLayoutShiftTracker().ObservedInputOrScroll()); } -TEST_F(JankTrackerTest, CompositedElementMovement) { +TEST_F(LayoutShiftTrackerTest, CompositedElementMovement) { SetBodyInnerHTML(R"HTML( <style> #jank { @@ -182,10 +184,10 @@ // #jank is 400x200 after viewport intersection with correct application of // composited #container offset, and 100px lower after janking, so jank score // is (400 * 300) / (viewport size 800 * 600) - EXPECT_FLOAT_EQ(0.25, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.25, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, CompositedJankBeforeFirstPaint) { +TEST_F(LayoutShiftTrackerTest, CompositedJankBeforeFirstPaint) { // Tests that we don't crash if a new layer janks during a second compositing // update before prepaint sets up property tree state. See crbug.com/881735 // (which invokes UpdateLifecycleToCompositingCleanPlusScrolling through @@ -212,7 +214,7 @@ UpdateAllLifecyclePhases(); } -TEST_F(JankTrackerTest, IgnoreFixedAndSticky) { +TEST_F(LayoutShiftTrackerTest, IgnoreFixedAndSticky) { SetBodyInnerHTML(R"HTML( <style> body { height: 1000px; } @@ -240,10 +242,10 @@ GetDocument().scrollingElement()->setScrollTop(50); UpdateAllLifecyclePhases(); - EXPECT_FLOAT_EQ(0, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, IgnoreSVG) { +TEST_F(LayoutShiftTrackerTest, IgnoreSVG) { SetBodyInnerHTML(R"HTML( <svg> <circle cx="50" cy="50" r="40" @@ -253,10 +255,10 @@ GetDocument().QuerySelector("circle")->setAttribute(svg_names::kCxAttr, AtomicString("100")); UpdateAllLifecyclePhases(); - EXPECT_FLOAT_EQ(0, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, JankWhileScrolled) { +TEST_F(LayoutShiftTrackerTest, JankWhileScrolled) { SetBodyInnerHTML(R"HTML( <style> body { height: 1000px; margin: 0; } @@ -266,17 +268,17 @@ )HTML"); GetDocument().scrollingElement()->setScrollTop(100); - EXPECT_EQ(0.0, GetJankTracker().Score()); - EXPECT_EQ(0.0, GetJankTracker().OverallMaxDistance()); + EXPECT_EQ(0.0, GetLayoutShiftTracker().Score()); + EXPECT_EQ(0.0, GetLayoutShiftTracker().OverallMaxDistance()); GetDocument().getElementById("j")->setAttribute(html_names::kStyleAttr, AtomicString("top: 60px")); UpdateAllLifecyclePhases(); // 300 * (height 200 - scrollY 100 + movement 60) / (800 * 600 viewport) - EXPECT_FLOAT_EQ(0.1, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.1, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, FullyClippedVisualRect) { +TEST_F(LayoutShiftTrackerTest, FullyClippedVisualRect) { SetBodyInnerHTML(R"HTML( <style> body { margin: 0; } @@ -289,10 +291,10 @@ GetDocument().getElementById("j")->setAttribute(html_names::kStyleAttr, AtomicString("top: 200px")); UpdateAllLifecyclePhases(); - EXPECT_FLOAT_EQ(0.0, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.0, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, PartiallyClippedVisualRect) { +TEST_F(LayoutShiftTrackerTest, PartiallyClippedVisualRect) { SetBodyInnerHTML(R"HTML( <style> body { margin: 0; } @@ -306,10 +308,10 @@ AtomicString("top: 200px")); UpdateAllLifecyclePhases(); // (clipped width 150px) * (height 200 + movement 200) / (800 * 600 viewport) - EXPECT_FLOAT_EQ(0.125, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.125, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, MultiClipVisualRect) { +TEST_F(LayoutShiftTrackerTest, MultiClipVisualRect) { SetBodyInnerHTML(R"HTML( <style> body { margin: 0; } @@ -327,11 +329,11 @@ // clipped at 0px,150px height, so the additional 200px of vertical // move distance is not included in the score. // (clip width 200) * (clip height 150) / (800 * 600 viewport) - EXPECT_FLOAT_EQ(0.0625, GetJankTracker().Score()); - EXPECT_FLOAT_EQ(200.0, GetJankTracker().OverallMaxDistance()); + EXPECT_FLOAT_EQ(0.0625, GetLayoutShiftTracker().Score()); + EXPECT_FLOAT_EQ(200.0, GetLayoutShiftTracker().OverallMaxDistance()); } -TEST_F(JankTrackerTest, ShiftOutsideViewport) { +TEST_F(LayoutShiftTrackerTest, ShiftOutsideViewport) { SetBodyInnerHTML(R"HTML( <style> body { margin: 0; } @@ -345,10 +347,10 @@ UpdateAllLifecyclePhases(); // Since the element moves entirely outside of the viewport, it shouldn't // generate a score. - EXPECT_FLOAT_EQ(0.0, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.0, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, ShiftInToViewport) { +TEST_F(LayoutShiftTrackerTest, ShiftInToViewport) { SetBodyInnerHTML(R"HTML( <style> body { margin: 0; } @@ -363,10 +365,10 @@ // The element moves from outside the viewport to within the viewport, which // should generate jank. // (width 600) * (height 0 + move 200) / (800 * 600 viewport) - EXPECT_FLOAT_EQ(0.25, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.25, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, ClipWithoutPaintLayer) { +TEST_F(LayoutShiftTrackerTest, ClipWithoutPaintLayer) { SetBodyInnerHTML(R"HTML( <style> #scroller { overflow: scroll; width: 200px; height: 500px; } @@ -389,12 +391,12 @@ UpdateAllLifecyclePhases(); // Make sure no jank score is reported, since the element that moved is fully // clipped by the scroller. - EXPECT_FLOAT_EQ(0.0, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.0, GetLayoutShiftTracker().Score()); } -class JankTrackerSimTest : public SimTest {}; +class LayoutShiftTrackerSimTest : public SimTest {}; -TEST_F(JankTrackerSimTest, SubframeWeighting) { +TEST_F(LayoutShiftTrackerSimTest, SubframeWeighting) { WebView().MainFrameWidget()->Resize(WebSize(800, 600)); // TODO(crbug.com/943668): Test OOPIF path. @@ -430,9 +432,10 @@ test::RunPendingTasks(); // 300 * (100 + 60) / (default viewport size 800 * 600) - JankTracker& jank_tracker = child_frame.GetFrameView()->GetJankTracker(); - EXPECT_FLOAT_EQ(0.4, jank_tracker.Score()); - EXPECT_FLOAT_EQ(0.1, jank_tracker.WeightedScore()); + LayoutShiftTracker& layout_shift_tracker = + child_frame.GetFrameView()->GetLayoutShiftTracker(); + EXPECT_FLOAT_EQ(0.4, layout_shift_tracker.Score()); + EXPECT_FLOAT_EQ(0.1, layout_shift_tracker.WeightedScore()); // Move subframe halfway outside the viewport. GetDocument().getElementById("i")->setAttribute(html_names::kStyleAttr, @@ -443,11 +446,11 @@ Compositor().BeginFrame(); test::RunPendingTasks(); - EXPECT_FLOAT_EQ(0.8, jank_tracker.Score()); - EXPECT_FLOAT_EQ(0.15, jank_tracker.WeightedScore()); + EXPECT_FLOAT_EQ(0.8, layout_shift_tracker.Score()); + EXPECT_FLOAT_EQ(0.15, layout_shift_tracker.WeightedScore()); } -TEST_F(JankTrackerSimTest, ViewportSizeChange) { +TEST_F(LayoutShiftTrackerSimTest, ViewportSizeChange) { WebView().MainFrameWidget()->Resize(WebSize(800, 600)); SimRequest main_resource("https://example.com/", "text/html"); @@ -478,11 +481,12 @@ Compositor().BeginFrame(); test::RunPendingTasks(); - JankTracker& jank_tracker = MainFrame().GetFrameView()->GetJankTracker(); - EXPECT_FLOAT_EQ(0.0, jank_tracker.Score()); + LayoutShiftTracker& layout_shift_tracker = + MainFrame().GetFrameView()->GetLayoutShiftTracker(); + EXPECT_FLOAT_EQ(0.0, layout_shift_tracker.Score()); } -TEST_F(JankTrackerTest, StableCompositingChanges) { +TEST_F(LayoutShiftTrackerTest, StableCompositingChanges) { SetBodyInnerHTML(R"HTML( <style> body { margin: 0; } @@ -530,10 +534,10 @@ }; while (advance()) { } - EXPECT_FLOAT_EQ(0, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score()); } -TEST_F(JankTrackerTest, CompositedOverflowExpansion) { +TEST_F(LayoutShiftTrackerTest, CompositedOverflowExpansion) { SetBodyInnerHTML(R"HTML( <style> @@ -583,7 +587,7 @@ drop->setAttribute(html_names::kStyleAttr, AtomicString("display: none")); UpdateAllLifecyclePhases(); - EXPECT_FLOAT_EQ(0, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score()); Element* comp = GetDocument().getElementById("comp"); comp->setAttribute(html_names::kClassAttr, AtomicString("sh")); @@ -593,7 +597,7 @@ // old rect (240 * 120) / (800 * 600) = 0.06 // new rect, 50% clipped by viewport (240 * 60) / (800 * 600) = 0.03 // final score 0.06 + 0.03 = 0.09 - EXPECT_FLOAT_EQ(0.09, GetJankTracker().Score()); + EXPECT_FLOAT_EQ(0.09, GetLayoutShiftTracker().Score()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item_result.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item_result.h index 81c01d19..95ba2a6 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item_result.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item_result.h
@@ -32,6 +32,11 @@ DISALLOW_NEW(); public: + unsigned Length() const { + DCHECK_GT(end_offset, start_offset); + return end_offset - start_offset; + } + // The NGInlineItem and its index. const NGInlineItem* item; unsigned item_index;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc index 945c20b3..322c77e 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
@@ -1190,7 +1190,8 @@ is_after_break = true; } - void AddTabulationCharacters(const NGInlineItem& item) { + void AddTabulationCharacters(const NGInlineItem& item, unsigned length) { + DCHECK_GE(length, 1u); AddTextUntil(&item); DCHECK(item.Style()); const ComputedStyle& style = *item.Style(); @@ -1198,7 +1199,6 @@ const SimpleFontData* font_data = font.PrimaryFont(); const TabSize& tab_size = style.GetTabSize(); float advance = font.TabWidth(font_data, tab_size, position); - unsigned length = item.Length(); DCHECK_GE(length, 1u); if (length > 1u) advance += font.TabWidth(font_data, tab_size) * (length - 1); @@ -1241,7 +1241,7 @@ // their widths for the max size may be different from the widths for // the min size. Fall back to 2 pass for now. if (c == kTabulationCharacter) { - AddTabulationCharacters(item); + AddTabulationCharacters(item, result.Length()); continue; } }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc index 36c0e3d..a7bb0ee 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
@@ -521,6 +521,25 @@ EXPECT_EQ(160, sizes.max_size); } +TEST_F(NGInlineNodeTest, MinMaxSizeTabulationWithBreakWord) { + LoadAhem(); + SetupHtml("t", R"HTML( + <style> + #t { + font: 10px Ahem; + white-space: pre-wrap; + word-break: break-word; + } + </style> + <div id=t>		<span>X</span></div> + )HTML"); + + NGInlineNodeForTest node = CreateInlineNode(); + MinMaxSize sizes = ComputeMinMaxSize(node); + EXPECT_EQ(160, sizes.min_size); + EXPECT_EQ(170, sizes.max_size); +} + TEST_F(NGInlineNodeTest, AssociatedItemsWithControlItem) { SetBodyInnerHTML( "<pre id=t style='-webkit-rtl-ordering:visual'>ab\nde</pre>");
diff --git a/third_party/blink/renderer/core/layout/scrollbars_test.cc b/third_party/blink/renderer/core/layout/scrollbars_test.cc index 412d5c7..2fc54f3 100644 --- a/third_party/blink/renderer/core/layout/scrollbars_test.cc +++ b/third_party/blink/renderer/core/layout/scrollbars_test.cc
@@ -125,7 +125,7 @@ offset); } - Cursor::Type CursorType() { + ui::CursorType CursorType() { return GetDocument() .GetFrame() ->GetChromeClient() @@ -629,7 +629,7 @@ HandleMouseMoveEvent(195, 5); - EXPECT_EQ(Cursor::Type::kPointer, CursorType()); + EXPECT_EQ(ui::CursorType::kPointer, CursorType()); } // Ensure mouse cursor should be override when hovering over the custom @@ -681,7 +681,7 @@ HandleMouseMoveEvent(195, 5); - EXPECT_EQ(Cursor::Type::kMove, CursorType()); + EXPECT_EQ(ui::CursorType::kMove, CursorType()); } // Makes sure that mouse hover over an overlay scrollbar doesn't activate @@ -727,13 +727,13 @@ // Mouse over link. Mouse cursor should be hand. HandleMouseMoveEvent(a_tag->OffsetLeft(), a_tag->OffsetTop()); - EXPECT_EQ(Cursor::Type::kHand, CursorType()); + EXPECT_EQ(ui::CursorType::kHand, CursorType()); // Mouse over enabled overlay scrollbar. Mouse cursor should be pointer and no // active hover element. HandleMouseMoveEvent(18, a_tag->OffsetTop()); - EXPECT_EQ(Cursor::Type::kPointer, CursorType()); + EXPECT_EQ(ui::CursorType::kPointer, CursorType()); HandleMousePressEvent(18, a_tag->OffsetTop()); @@ -759,7 +759,7 @@ HandleMouseMoveEvent(18, a_tag->OffsetTop()); - EXPECT_EQ(Cursor::Type::kHand, CursorType()); + EXPECT_EQ(ui::CursorType::kHand, CursorType()); HandleMousePressEvent(18, a_tag->OffsetTop());
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource.cc b/third_party/blink/renderer/core/loader/resource/image_resource.cc index 85dd5d5..7fdb5d8d3 100644 --- a/third_party/blink/renderer/core/loader/resource/image_resource.cc +++ b/third_party/blink/renderer/core/loader/resource/image_resource.cc
@@ -64,14 +64,6 @@ // result from new data arriving for this image. constexpr auto kFlushDelay = TimeDelta::FromSeconds(1); -bool HasServerLoFiResponseHeaders(const ResourceResponse& response) { - return response.HttpHeaderField("chrome-proxy-content-transform") - .Contains("empty-image") || - // Check for the legacy Server Lo-Fi response headers, since it's - // possible that an old Lo-Fi image could be served from the cache. - response.HttpHeaderField("chrome-proxy").Contains("q=low"); -} - } // namespace class ImageResource::ImageResourceInfoImpl final @@ -510,44 +502,9 @@ placeholder_option_ = PlaceholderOption::kReloadPlaceholderOnDecodeError; } } - - if (HasServerLoFiResponseHeaders(GetResponse())) { - // Ensure that the PreviewsState bit for Server Lo-Fi is set iff Chrome - // received the appropriate Server Lo-Fi response headers for this image. - // - // Normally, the |kServerLoFiOn| bit should already be set if Server Lo-Fi - // response headers are coming back, but it's possible for legacy Lo-Fi - // images to be served from the cache even if Chrome isn't in Lo-Fi mode. - // This also serves as a nice last line of defence to ensure that Server - // Lo-Fi images can be reloaded to show the original even if e.g. a server - // bug causes Lo-Fi images to be sent when they aren't expected. - SetPreviewsState(GetResourceRequest().GetPreviewsState() | - WebURLRequest::kServerLoFiOn); - } else if (GetResourceRequest().GetPreviewsState() & - WebURLRequest::kServerLoFiOn) { - // If Chrome expects a Lo-Fi response, but the server decided to send the - // full image, then clear the Server Lo-Fi Previews state bit. - WebURLRequest::PreviewsState new_previews_state = - GetResourceRequest().GetPreviewsState(); - - new_previews_state &= ~WebURLRequest::kServerLoFiOn; - if (new_previews_state == WebURLRequest::kPreviewsUnspecified) - new_previews_state = WebURLRequest::kPreviewsOff; - - SetPreviewsState(new_previews_state); - } } bool ImageResource::ShouldShowPlaceholder() const { - if (RuntimeEnabledFeatures::ClientPlaceholdersForServerLoFiEnabled() && - (GetResourceRequest().GetPreviewsState() & - WebURLRequest::kServerLoFiOn)) { - // If the runtime feature is enabled, show Client Lo-Fi placeholder images - // in place of Server Lo-Fi responses. This is done so that all Lo-Fi images - // have a consistent appearance. - return true; - } - switch (placeholder_option_) { case PlaceholderOption::kShowAndReloadPlaceholderAlways: case PlaceholderOption::kShowAndDoNotReloadPlaceholder: @@ -595,17 +552,6 @@ if (policy == kReloadIfNeeded && !ShouldReloadBrokenPlaceholder()) return; - // If the image is loaded, then the |PreviewsState::kServerLoFiOn| bit should - // be set iff the image has Server Lo-Fi response headers. - DCHECK(!IsLoaded() || - HasServerLoFiResponseHeaders(GetResponse()) == - static_cast<bool>(GetResourceRequest().GetPreviewsState() & - WebURLRequest::kServerLoFiOn)); - - if (placeholder_option_ == PlaceholderOption::kDoNotReloadPlaceholder && - !(GetResourceRequest().GetPreviewsState() & WebURLRequest::kServerLoFiOn)) - return; - // Prevent clients and observers from being notified of completion while the // reload is being scheduled, so that e.g. canceling an existing load in // progress doesn't cause clients and observers to be notified of completion @@ -613,8 +559,7 @@ DCHECK(!is_scheduling_reload_); is_scheduling_reload_ = true; - if (GetResourceRequest().GetPreviewsState() & - (WebURLRequest::kClientLoFiOn | WebURLRequest::kServerLoFiOn)) { + if (GetResourceRequest().GetPreviewsState() & WebURLRequest::kClientLoFiOn) { SetCachePolicyBypassingCache(); }
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc index ae6b4ba..f8e0facb4 100644 --- a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc +++ b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
@@ -644,285 +644,7 @@ EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); } -class ImageResourceReloadTest - : public testing::TestWithParam<bool>, - private ScopedClientPlaceholdersForServerLoFiForTest { - public: - ImageResourceReloadTest() - : ScopedClientPlaceholdersForServerLoFiForTest(GetParam()) {} - ~ImageResourceReloadTest() override = default; - - bool IsClientPlaceholderForServerLoFiEnabled() const { return GetParam(); } - - void SetUp() override { - } -}; - -TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderAfterFinished) { - KURL test_url(kTestURL); - ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); - ImageResource* image_resource = ImageResource::CreateForTest(test_url); - image_resource->NotifyStartLoad(); - - auto observer = - std::make_unique<MockImageResourceObserver>(image_resource->GetContent()); - ResourceFetcher* fetcher = CreateFetcher(); - - // Send the image response. - ResourceResponse resource_response(NullURL()); - resource_response.SetMimeType("image/jpeg"); - resource_response.SetExpectedContentLength(sizeof(kJpegImage)); - resource_response.AddHttpHeaderField("chrome-proxy-content-transform", - "empty-image"); - - image_resource->ResponseReceived(resource_response); - image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), - sizeof(kJpegImage)); - image_resource->FinishForTest(); - EXPECT_FALSE(image_resource->ErrorOccurred()); - ASSERT_TRUE(image_resource->GetContent()->HasImage()); - EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); - EXPECT_EQ(2, observer->ImageChangedCount()); - EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); - // The observer should have been notified that the image load completed. - EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); - EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); - EXPECT_NE(IsClientPlaceholderForServerLoFiEnabled(), - image_resource->GetContent()->GetImage()->IsBitmapImage()); - EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), - image_resource->ShouldShowPlaceholder()); - EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); - EXPECT_EQ(kJpegImageHeight, - image_resource->GetContent()->GetImage()->height()); - - // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. - image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, - Resource::kReloadAlways); - - EXPECT_EQ(3, observer->ImageChangedCount()); - TestThatReloadIsStartedThenServeReload(test_url, image_resource, - image_resource->GetContent(), - observer.get(), false); -} - -TEST_P(ImageResourceReloadTest, - ReloadIfLoFiOrPlaceholderAfterFinishedWithOldHeaders) { - KURL test_url(kTestURL); - ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); - ImageResource* image_resource = ImageResource::CreateForTest(test_url); - image_resource->NotifyStartLoad(); - - auto observer = - std::make_unique<MockImageResourceObserver>(image_resource->GetContent()); - ResourceFetcher* fetcher = CreateFetcher(); - - // Send the image response. - ResourceResponse resource_response(NullURL()); - resource_response.SetMimeType("image/jpeg"); - resource_response.SetExpectedContentLength(sizeof(kJpegImage)); - resource_response.AddHttpHeaderField("chrome-proxy", "q=low"); - - image_resource->ResponseReceived(resource_response); - image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), - sizeof(kJpegImage)); - image_resource->FinishForTest(); - EXPECT_FALSE(image_resource->ErrorOccurred()); - ASSERT_TRUE(image_resource->GetContent()->HasImage()); - EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); - EXPECT_EQ(2, observer->ImageChangedCount()); - EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); - // The observer should have been notified that the image load completed. - EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); - EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); - EXPECT_NE(IsClientPlaceholderForServerLoFiEnabled(), - image_resource->GetContent()->GetImage()->IsBitmapImage()); - EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), - image_resource->ShouldShowPlaceholder()); - EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); - EXPECT_EQ(kJpegImageHeight, - image_resource->GetContent()->GetImage()->height()); - - // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. - image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, - Resource::kReloadAlways); - - EXPECT_EQ(3, observer->ImageChangedCount()); - TestThatReloadIsStartedThenServeReload(test_url, image_resource, - image_resource->GetContent(), - observer.get(), false); -} - -TEST_P(ImageResourceReloadTest, - ReloadIfLoFiOrPlaceholderAfterFinishedWithoutLoFiHeaders) { - KURL test_url(kTestURL); - ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); - ResourceRequest request(test_url); - request.SetPreviewsState(WebURLRequest::kServerLoFiOn); - ImageResource* image_resource = ImageResource::Create(request); - image_resource->NotifyStartLoad(); - - auto observer = - std::make_unique<MockImageResourceObserver>(image_resource->GetContent()); - ResourceFetcher* fetcher = CreateFetcher(); - - // Send the image response, without any LoFi image response headers. - ResourceResponse resource_response(NullURL()); - resource_response.SetMimeType("image/jpeg"); - resource_response.SetExpectedContentLength(sizeof(kJpegImage)); - image_resource->ResponseReceived(resource_response); - image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), - sizeof(kJpegImage)); - image_resource->FinishForTest(); - EXPECT_FALSE(image_resource->ErrorOccurred()); - ASSERT_TRUE(image_resource->GetContent()->HasImage()); - EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); - EXPECT_EQ(2, observer->ImageChangedCount()); - EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); - // The observer should have been notified that the image load completed. - EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); - EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); - EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); - EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); - EXPECT_EQ(kJpegImageHeight, - image_resource->GetContent()->GetImage()->height()); - - // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. - image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, - Resource::kReloadAlways); - - // The image should not have been reloaded, since it didn't have the LoFi - // image response headers. - EXPECT_EQ(2, observer->ImageChangedCount()); - EXPECT_TRUE(image_resource->IsLoaded()); -} - -TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { - ResourceFetcher* fetcher = CreateFetcher(); - - KURL test_url(kTestURL); - ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); - - ResourceRequest request = ResourceRequest(test_url); - request.SetPreviewsState(WebURLRequest::kServerLoFiOn); - FetchParameters fetch_params(request); - ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); - ImageResourceContent* content = image_resource->GetContent(); - - auto observer = std::make_unique<MockImageResourceObserver>(content); - - // Send the image response. - ResourceResponse resource_response(NullURL()); - resource_response.SetMimeType("image/jpeg"); - resource_response.SetExpectedContentLength(sizeof(kJpegImage)); - resource_response.AddHttpHeaderField("chrome-proxy-content-transform", - "empty-image"); - - image_resource->Loader()->DidReceiveResponse( - WrappedResourceResponse(resource_response)); - image_resource->Loader()->DidReceiveData( - reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); - image_resource->Loader()->DidFinishLoading( - TimeTicks(), sizeof(kJpegImage), sizeof(kJpegImage), sizeof(kJpegImage), - false, std::vector<network::cors::PreflightTimingInfo>()); - - EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); - EXPECT_EQ(image_resource, fetcher->CachedResource(test_url)); - - fetcher->ReloadLoFiImages(); - - EXPECT_EQ(3, observer->ImageChangedCount()); - - TestThatReloadIsStartedThenServeReload(test_url, image_resource, content, - observer.get(), false); - - GetMemoryCache()->Remove(image_resource); -} - -TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderBeforeResponse) { - KURL test_url(kTestURL); - ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); - - ResourceRequest request(test_url); - request.SetPreviewsState(WebURLRequest::kServerLoFiOn); - FetchParameters fetch_params(request); - ResourceFetcher* fetcher = CreateFetcher(); - - ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); - auto observer = - std::make_unique<MockImageResourceObserver>(image_resource->GetContent()); - - EXPECT_FALSE(image_resource->ErrorOccurred()); - EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), - image_resource->ShouldShowPlaceholder()); - - // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading. - image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, - Resource::kReloadAlways); - - EXPECT_EQ(1, observer->ImageChangedCount()); - EXPECT_EQ(0, observer->ImageWidthOnLastImageChanged()); - // The observer should not have been notified of completion yet, since the - // image is still loading. - EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); - - TestThatReloadIsStartedThenServeReload(test_url, image_resource, - image_resource->GetContent(), - observer.get(), false); -} - -TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderDuringResponse) { - KURL test_url(kTestURL); - ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); - - ResourceRequest request(test_url); - request.SetPreviewsState(WebURLRequest::kServerLoFiOn); - FetchParameters fetch_params(request); - ResourceFetcher* fetcher = CreateFetcher(); - - ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); - auto observer = - std::make_unique<MockImageResourceObserver>(image_resource->GetContent()); - - // Send the image response. - ResourceResponse resource_response(test_url); - resource_response.SetMimeType("image/jpeg"); - resource_response.SetExpectedContentLength(sizeof(kJpegImage)); - resource_response.AddHttpHeaderField("chrome-proxy-content-transform", - "empty-image"); - - image_resource->Loader()->DidReceiveResponse( - WrappedResourceResponse(resource_response)); - image_resource->Loader()->DidReceiveData( - reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); - - EXPECT_FALSE(image_resource->ErrorOccurred()); - ASSERT_TRUE(image_resource->GetContent()->HasImage()); - EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); - EXPECT_EQ(1, observer->ImageChangedCount()); - EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); - EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); - EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), - image_resource->ShouldShowPlaceholder()); - EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); - EXPECT_EQ(kJpegImageHeight, - image_resource->GetContent()->GetImage()->height()); - - // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading. - image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, - Resource::kReloadAlways); - - EXPECT_EQ(2, observer->ImageChangedCount()); - EXPECT_EQ(0, observer->ImageWidthOnLastImageChanged()); - // The observer should not have been notified of completion yet, since the - // image is still loading. - EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); - - TestThatReloadIsStartedThenServeReload(test_url, image_resource, - image_resource->GetContent(), - observer.get(), false); -} - -TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderForPlaceholder) { +TEST(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderForPlaceholder) { KURL test_url(kTestURL); ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); @@ -946,7 +668,7 @@ observer.get(), false); } -TEST_P(ImageResourceReloadTest, ReloadLoFiImagesWithDuplicateURLs) { +TEST(ImageResourceReloadTest, ReloadLoFiImagesWithDuplicateURLs) { KURL test_url(kTestURL); ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); ResourceFetcher* fetcher = CreateFetcher(); @@ -976,10 +698,6 @@ EXPECT_FALSE(full_image_resource->ShouldShowPlaceholder()); } -INSTANTIATE_TEST_SUITE_P(/* no prefix */, - ImageResourceReloadTest, - testing::Bool()); - TEST(ImageResourceTest, SVGImage) { KURL url("http://127.0.0.1:8000/foo"); ImageResource* image_resource = ImageResource::CreateForTest(url);
diff --git a/third_party/blink/renderer/core/page/page_widget_delegate.cc b/third_party/blink/renderer/core/page/page_widget_delegate.cc index 36315bc7..d0777576 100644 --- a/third_party/blink/renderer/core/page/page_widget_delegate.cc +++ b/third_party/blink/renderer/core/page/page_widget_delegate.cc
@@ -36,7 +36,7 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/input/event_handler.h" -#include "third_party/blink/renderer/core/layout/jank_tracker.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/page/autoscroll_controller.h" #include "third_party/blink/renderer/core/page/page.h" @@ -86,7 +86,7 @@ Document* document = root->GetDocument(); DCHECK(document); if (LocalFrameView* view = document->View()) - view->GetJankTracker().NotifyInput(event); + view->GetLayoutShiftTracker().NotifyInput(event); } if (event.GetModifiers() & WebInputEvent::kIsTouchAccessibility &&
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index d2baa952..3a68ccb6 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -45,12 +45,12 @@ #include "third_party/blink/renderer/core/html/media/html_video_element.h" #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/core/layout/geometry/transform_state.h" -#include "third_party/blink/renderer/core/layout/jank_tracker.h" #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/layout/layout_embedded_object.h" #include "third_party/blink/renderer/core/layout/layout_html_canvas.h" #include "third_party/blink/renderer/core/layout/layout_image.h" #include "third_party/blink/renderer/core/layout/layout_inline.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/renderer/core/layout/layout_video.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/loader/resource/image_resource_content.h" @@ -1326,7 +1326,7 @@ update_context.parent_object_offset_delta; if (!layout_object_delta.IsZero()) { LocalFrameView* frame_view = layout_object.View()->GetFrameView(); - frame_view->GetJankTracker().NotifyCompositedLayerMoved( + frame_view->GetLayoutShiftTracker().NotifyCompositedLayerMoved( layout_object, FloatRect(FloatPoint(), FloatSize(old_size - old_object_offset)), FloatRect(FloatPoint(layout_object_delta),
diff --git a/third_party/blink/renderer/core/paint/image_element_timing.cc b/third_party/blink/renderer/core/paint/image_element_timing.cc index 6494cfc..1d6942f 100644 --- a/third_party/blink/renderer/core/paint/image_element_timing.cc +++ b/third_party/blink/renderer/core/paint/image_element_timing.cc
@@ -22,8 +22,34 @@ namespace blink { -// TODO(npm): decide on a reasonable value for the threshold. -constexpr const float kImageTimingSizeThreshold = 0.15f; +namespace internal { + +// "CORE_EXPORT" is needed to make this function visible to tests. +bool CORE_EXPORT +IsExplicitlyRegisteredForTiming(const LayoutObject* layout_object) { + DCHECK(layout_object); + + const Node* node = layout_object->GetNode(); + if (!node) + return false; + + if (!node->IsElementNode()) + return false; + + const Element* element = ToElement(node); + if (!element) + return false; + + // If the element has no 'elementtiming' attribute or an empty value, do not + // generate timing entries for the element. See + // https://wicg.github.io/element-timing/#sec-modifications-DOM for report + // vs. ignore criteria. + const AtomicString& attr = + element->FastGetAttribute(html_names::kElementtimingAttr); + return !attr.IsEmpty(); +} + +} // namespace internal // The maximum amount of characters included in Element Timing for inline // images. @@ -59,6 +85,10 @@ const ImageResourceContent* cached_image, const PropertyTreeState& current_paint_chunk_properties) { DCHECK(layout_object); + + if (!internal::IsExplicitlyRegisteredForTiming(layout_object)) + return; + auto result = images_notified_.insert(layout_object); if (result.is_new_entry && cached_image) { NotifyImagePaintedInternal(layout_object->GetNode(), *layout_object, @@ -92,8 +122,6 @@ Element* element = ToElement(node); const AtomicString attr = element->FastGetAttribute(html_names::kElementtimingAttr); - if (!ShouldReportElement(frame, attr, intersection_rect)) - return; const AtomicString& id = element->GetIdAttribute(); @@ -149,10 +177,14 @@ const PropertyTreeState& current_paint_chunk_properties) { DCHECK(node); DCHECK(background_image); + const LayoutObject* layout_object = node->GetLayoutObject(); if (!layout_object) return; + if (!internal::IsExplicitlyRegisteredForTiming(layout_object)) + return; + const ImageResourceContent* cached_image = background_image->CachedImage(); if (!cached_image || !cached_image->IsLoaded()) return; @@ -182,21 +214,6 @@ return visual_rect.Rect(); } -bool ImageElementTiming::ShouldReportElement( - const LocalFrame* frame, - const AtomicString& element_timing, - const FloatRect& intersection_rect) const { - // Create an entry if 'elementtiming' is present or if the fraction of the - // viewport occupied by the image is above a certain size threshold. - return !element_timing.IsEmpty() || - intersection_rect.Size().Area() > frame->View() - ->LayoutViewport() - ->VisibleContentRect() - .Size() - .Area() * - kImageTimingSizeThreshold; -} - void ImageElementTiming::ReportImagePaintSwapTime(WebWidgetClient::SwapResult, base::TimeTicks timestamp) { WindowPerformance* performance =
diff --git a/third_party/blink/renderer/core/paint/image_element_timing.h b/third_party/blink/renderer/core/paint/image_element_timing.h index 2a9ce26b..33014d7 100644 --- a/third_party/blink/renderer/core/paint/image_element_timing.h +++ b/third_party/blink/renderer/core/paint/image_element_timing.h
@@ -5,6 +5,8 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_IMAGE_ELEMENT_TIMING_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_IMAGE_ELEMENT_TIMING_H_ +#include <utility> + #include "third_party/blink/public/web/web_widget_client.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/platform/supplementable.h" @@ -68,11 +70,6 @@ FloatRect ComputeIntersectionRect(const LocalFrame*, const LayoutObject&, const PropertyTreeState&); - // Checks if the element must be reported, given its elementtiming attribute - // and its intersection rect. - bool ShouldReportElement(const LocalFrame*, - const AtomicString& element_timing, - const FloatRect&) const; // Callback for the swap promise. Reports paint timestamps. void ReportImagePaintSwapTime(WebWidgetClient::SwapResult,
diff --git a/third_party/blink/renderer/core/paint/image_element_timing_test.cc b/third_party/blink/renderer/core/paint/image_element_timing_test.cc index 148f345..3cc3813 100644 --- a/third_party/blink/renderer/core/paint/image_element_timing_test.cc +++ b/third_party/blink/renderer/core/paint/image_element_timing_test.cc
@@ -14,6 +14,12 @@ namespace blink { +namespace internal { + +extern bool IsExplicitlyRegisteredForTiming(const LayoutObject* layout_object); + +} + class ImageElementTimingTest : public RenderingTest { protected: // Sets an image resource for the LayoutImage with the given |id| and return @@ -59,13 +65,63 @@ } }; +TEST_F(ImageElementTimingTest, TestIsExplicitlyRegisteredForTiming) { + EnableCompositing(); + GetDocument().SetBaseURLOverride(KURL("http://test.com")); + SetBodyInnerHTML(R"HTML( + <img id="missing-attribute" style='width: 100px; height: 100px;'/> + <img id="unset-attribute" elementtiming style='width: 100px; height: 100px;'/> + <img id="empty-attribute" elementtiming="" style='width: 100px; height: 100px;'/> + <img id="valid-attribute" elementtiming="valid-id" style='width: 100px; height: 100px;'/> + )HTML"); + + LayoutObject* without_attribute = + GetLayoutObjectByElementId("missing-attribute"); + bool actual = internal::IsExplicitlyRegisteredForTiming(without_attribute); + EXPECT_FALSE(actual) << "Nodes without an 'elementtiming' attribute should " + "not be explicitly registered."; + + LayoutObject* with_undefined_attribute = + GetLayoutObjectByElementId("unset-attribute"); + actual = internal::IsExplicitlyRegisteredForTiming(with_undefined_attribute); + EXPECT_FALSE(actual) << "Nodes with undefined 'elementtiming' attribute " + "should not be explicitly registered."; + + LayoutObject* with_empty_attribute = + GetLayoutObjectByElementId("empty-attribute"); + actual = internal::IsExplicitlyRegisteredForTiming(with_empty_attribute); + EXPECT_FALSE(actual) << "Nodes with an empty 'elementtiming' attribute " + "should not be explicitly registered."; + + LayoutObject* with_explicit_element_timing = + GetLayoutObjectByElementId("valid-attribute"); + actual = + internal::IsExplicitlyRegisteredForTiming(with_explicit_element_timing); + EXPECT_TRUE(actual) << "Nodes with a non-empty 'elementtiming' attribute " + "should be explicitly registered."; +} + +TEST_F(ImageElementTimingTest, IgnoresUnmarkedElement) { + // Tests that, if the 'elementtiming' attribute is missing, the element isn't + // considered by ImageElementTiming. + EnableCompositing(); + GetDocument().SetBaseURLOverride(KURL("http://test.com")); + SetBodyInnerHTML(R"HTML( + <img id="target" style='width: 100px; height: 100px;'/> + )HTML"); + LayoutImage* layout_image = SetImageResource("target", 5, 5); + ASSERT_TRUE(layout_image); + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(GetImagesNotified().Contains(layout_image)); +} + TEST_F(ImageElementTimingTest, ImageInsideSVG) { GetDocument().SetBaseURLOverride(KURL("http://test.com")); SetBodyInnerHTML(R"HTML( <svg mask="url(#mask)"> <mask id="mask"> <foreignObject width="100" height="100"> - <img id="target" style='width: 100px; height: 100px;'/> + <img elementtiming="image-inside-svg" id="target" style='width: 100px; height: 100px;'/> </foreignObject> </mask> <rect width="100" height="100" fill="green"/> @@ -84,7 +140,7 @@ EnableCompositing(); GetDocument().SetBaseURLOverride(KURL("http://test.com")); SetBodyInnerHTML(R"HTML( - <img id="target" style='width: 100px; height: 100px;'/> + <img elementtiming="will-be-removed" id="target" style='width: 100px; height: 100px;'/> )HTML"); LayoutImage* layout_image = SetImageResource("target", 5, 5); ASSERT_TRUE(layout_image); @@ -102,7 +158,7 @@ GetDocument().SetBaseURLOverride(KURL("http://test.com")); SetBodyInnerHTML(R"HTML( <svg> - <image id="target" style='width: 100px; height: 100px;'/> + <image elementtiming="svg-will-be-removed" id="target" style='width: 100px; height: 100px;'/> </svg> )HTML"); LayoutSVGImage* layout_image = SetSVGImageResource("target", 5, 5); @@ -125,7 +181,7 @@ background: url(data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==); } </style> - <div id="target">/div> + <div elementtiming="time-my-background-image" id="target">/div> )HTML"); LayoutObject* object = GetLayoutObjectByElementId("target"); ImageResourceContent* content =
diff --git a/third_party/blink/renderer/core/paint/paint_invalidator.cc b/third_party/blink/renderer/core/paint/paint_invalidator.cc index 00a11989..46bf7f6 100644 --- a/third_party/blink/renderer/core/paint/paint_invalidator.cc +++ b/third_party/blink/renderer/core/paint/paint_invalidator.cc
@@ -9,8 +9,8 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/settings.h" -#include "third_party/blink/renderer/core/layout/jank_tracker.h" #include "third_party/blink/renderer/core/layout/layout_block_flow.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/renderer/core/layout/layout_table.h" #include "third_party/blink/renderer/core/layout/layout_table_section.h" #include "third_party/blink/renderer/core/layout/layout_view.h" @@ -272,7 +272,7 @@ fragment_data.SetVisualRect(ComputeVisualRect(object, context)); - object.GetFrameView()->GetJankTracker().NotifyObjectPrePaint( + object.GetFrameView()->GetLayoutShiftTracker().NotifyObjectPrePaint( object, PropertyTreeState(*context.tree_builder_context_->current.transform, *context.tree_builder_context_->current.clip,
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index 3508bf48..a8ebeeb 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -2818,14 +2818,14 @@ if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { // The visual rects will be in a different coordinate space after losing // their compositing container. Clear them before prepaint to avoid - // spurious layout shift reports from JankTracker. + // spurious layout shift reports from LayoutShiftTracker. // If the PaintLayer were not being destroyed, this would happen during // the compositing update (PaintLayerCompositor::UpdateIfNeeded). - // TODO: JankTracker's reliance on having visual rects cleared before - // prepaint in the case of compositing changes is not ideal, and will not - // work with CompositeAfterPaint. Some transform tree changes may still - // produce incorrect behavior from JankTracker (see discussion on review - // thread of http://crrev.com/c/1636403). + // TODO: LayoutShiftTracker's reliance on having visual rects cleared + // before prepaint in the case of compositing changes is not ideal, and + // will not work with CompositeAfterPaint. Some transform tree changes may + // still produce incorrect behavior from LayoutShiftTracker (see + // discussion on review thread of http://crrev.com/c/1636403). if (Compositor()) { Compositor() ->ForceRecomputeVisualRectsIncludingNonCompositingDescendants(
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index 0fcfc3b..caccba0 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -12,9 +12,9 @@ #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/frame/visual_viewport.h" -#include "third_party/blink/renderer/core/layout/jank_tracker.h" #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/layout/layout_multi_column_spanner_placeholder.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" @@ -141,7 +141,7 @@ #endif } - frame_view.GetJankTracker().NotifyPrePaintFinished(); + frame_view.GetLayoutShiftTracker().NotifyPrePaintFinished(); context_storage_.pop_back(); }
diff --git a/third_party/blink/renderer/core/scroll/scrollable_area.cc b/third_party/blink/renderer/core/scroll/scrollable_area.cc index 1b806dc..c44e3e79 100644 --- a/third_party/blink/renderer/core/scroll/scrollable_area.cc +++ b/third_party/blink/renderer/core/scroll/scrollable_area.cc
@@ -40,8 +40,8 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/input/event_handler.h" -#include "third_party/blink/renderer/core/layout/jank_tracker.h" #include "third_party/blink/renderer/core/layout/layout_box.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/paint/paint_timing_detector.h" #include "third_party/blink/renderer/core/scroll/programmatic_scroll_animator.h" @@ -384,7 +384,8 @@ if (GetScrollOffset() != old_offset && GetLayoutBox() && GetLayoutBox()->GetFrameView()) { - GetLayoutBox()->GetFrameView()->GetJankTracker().NotifyScroll(scroll_type); + GetLayoutBox()->GetFrameView()->GetLayoutShiftTracker().NotifyScroll( + scroll_type); } GetScrollAnimator().SetCurrentOffset(offset);
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.h b/third_party/blink/renderer/core/svg/graphics/svg_image.h index bead97b..1b2232c 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image.h +++ b/third_party/blink/renderer/core/svg/graphics/svg_image.h
@@ -245,7 +245,7 @@ FRIEND_TEST_ALL_PREFIXES(ElementFragmentAnchorTest, SVGDocumentDoesntCreateFragment); FRIEND_TEST_ALL_PREFIXES(SVGImageTest, SupportsSubsequenceCaching); - FRIEND_TEST_ALL_PREFIXES(SVGImageTest, JankTrackerDisabled); + FRIEND_TEST_ALL_PREFIXES(SVGImageTest, LayoutShiftTrackerDisabled); FRIEND_TEST_ALL_PREFIXES(SVGImageTest, SetSizeOnVisualViewport); };
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc b/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc index f6adc8da..2f868074 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc
@@ -12,7 +12,7 @@ #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/html/html_image_element.h" -#include "third_party/blink/renderer/core/layout/jank_tracker.h" +#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/svg/graphics/svg_image_chrome_client.h" @@ -172,14 +172,14 @@ ToLayoutBoxModelObject(svg_root)->Layer()->SupportsSubsequenceCaching()); } -TEST_F(SVGImageTest, JankTrackerDisabled) { +TEST_F(SVGImageTest, LayoutShiftTrackerDisabled) { const bool kDontPause = false; Load("<svg xmlns='http://www.w3.org/2000/svg'></svg>", kDontPause); LocalFrame* local_frame = To<LocalFrame>(GetImage().GetPageForTesting()->MainFrame()); EXPECT_TRUE(local_frame->GetDocument()->IsSVGDocument()); - auto& jank_tracker = local_frame->View()->GetJankTracker(); - EXPECT_FALSE(jank_tracker.IsActive()); + auto& layout_shift_tracker = local_frame->View()->GetLayoutShiftTracker(); + EXPECT_FALSE(layout_shift_tracker.IsActive()); } TEST_F(SVGImageTest, SetSizeOnVisualViewport) {
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc index 841073f..d564613 100644 --- a/third_party/blink/renderer/core/testing/internals.cc +++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -2615,100 +2615,110 @@ return DOMRectList::Create(quads); } -static const char* CursorTypeToString(Cursor::Type cursor_type) { +static const char* CursorTypeToString(ui::CursorType cursor_type) { switch (cursor_type) { - case Cursor::kPointer: + case ui::CursorType::kPointer: return "Pointer"; - case Cursor::kCross: + case ui::CursorType::kCross: return "Cross"; - case Cursor::kHand: + case ui::CursorType::kHand: return "Hand"; - case Cursor::kIBeam: + case ui::CursorType::kIBeam: return "IBeam"; - case Cursor::kWait: + case ui::CursorType::kWait: return "Wait"; - case Cursor::kHelp: + case ui::CursorType::kHelp: return "Help"; - case Cursor::kEastResize: + case ui::CursorType::kEastResize: return "EastResize"; - case Cursor::kNorthResize: + case ui::CursorType::kNorthResize: return "NorthResize"; - case Cursor::kNorthEastResize: + case ui::CursorType::kNorthEastResize: return "NorthEastResize"; - case Cursor::kNorthWestResize: + case ui::CursorType::kNorthWestResize: return "NorthWestResize"; - case Cursor::kSouthResize: + case ui::CursorType::kSouthResize: return "SouthResize"; - case Cursor::kSouthEastResize: + case ui::CursorType::kSouthEastResize: return "SouthEastResize"; - case Cursor::kSouthWestResize: + case ui::CursorType::kSouthWestResize: return "SouthWestResize"; - case Cursor::kWestResize: + case ui::CursorType::kWestResize: return "WestResize"; - case Cursor::kNorthSouthResize: + case ui::CursorType::kNorthSouthResize: return "NorthSouthResize"; - case Cursor::kEastWestResize: + case ui::CursorType::kEastWestResize: return "EastWestResize"; - case Cursor::kNorthEastSouthWestResize: + case ui::CursorType::kNorthEastSouthWestResize: return "NorthEastSouthWestResize"; - case Cursor::kNorthWestSouthEastResize: + case ui::CursorType::kNorthWestSouthEastResize: return "NorthWestSouthEastResize"; - case Cursor::kColumnResize: + case ui::CursorType::kColumnResize: return "ColumnResize"; - case Cursor::kRowResize: + case ui::CursorType::kRowResize: return "RowResize"; - case Cursor::kMiddlePanning: + case ui::CursorType::kMiddlePanning: return "MiddlePanning"; - case Cursor::kMiddlePanningVertical: + case ui::CursorType::kMiddlePanningVertical: return "MiddlePanningVertical"; - case Cursor::kMiddlePanningHorizontal: + case ui::CursorType::kMiddlePanningHorizontal: return "MiddlePanningHorizontal"; - case Cursor::kEastPanning: + case ui::CursorType::kEastPanning: return "EastPanning"; - case Cursor::kNorthPanning: + case ui::CursorType::kNorthPanning: return "NorthPanning"; - case Cursor::kNorthEastPanning: + case ui::CursorType::kNorthEastPanning: return "NorthEastPanning"; - case Cursor::kNorthWestPanning: + case ui::CursorType::kNorthWestPanning: return "NorthWestPanning"; - case Cursor::kSouthPanning: + case ui::CursorType::kSouthPanning: return "SouthPanning"; - case Cursor::kSouthEastPanning: + case ui::CursorType::kSouthEastPanning: return "SouthEastPanning"; - case Cursor::kSouthWestPanning: + case ui::CursorType::kSouthWestPanning: return "SouthWestPanning"; - case Cursor::kWestPanning: + case ui::CursorType::kWestPanning: return "WestPanning"; - case Cursor::kMove: + case ui::CursorType::kMove: return "Move"; - case Cursor::kVerticalText: + case ui::CursorType::kVerticalText: return "VerticalText"; - case Cursor::kCell: + case ui::CursorType::kCell: return "Cell"; - case Cursor::kContextMenu: + case ui::CursorType::kContextMenu: return "ContextMenu"; - case Cursor::kAlias: + case ui::CursorType::kAlias: return "Alias"; - case Cursor::kProgress: + case ui::CursorType::kProgress: return "Progress"; - case Cursor::kNoDrop: + case ui::CursorType::kNoDrop: return "NoDrop"; - case Cursor::kCopy: + case ui::CursorType::kCopy: return "Copy"; - case Cursor::kNone: + case ui::CursorType::kNone: return "None"; - case Cursor::kNotAllowed: + case ui::CursorType::kNotAllowed: return "NotAllowed"; - case Cursor::kZoomIn: + case ui::CursorType::kZoomIn: return "ZoomIn"; - case Cursor::kZoomOut: + case ui::CursorType::kZoomOut: return "ZoomOut"; - case Cursor::kGrab: + case ui::CursorType::kGrab: return "Grab"; - case Cursor::kGrabbing: + case ui::CursorType::kGrabbing: return "Grabbing"; - case Cursor::kCustom: + case ui::CursorType::kCustom: return "Custom"; + case ui::CursorType::kNull: + return "Null"; + case ui::CursorType::kDndNone: + return "DragAndDropNone"; + case ui::CursorType::kDndMove: + return "DragAndDropMove"; + case ui::CursorType::kDndCopy: + return "DragAndDropCopy"; + case ui::CursorType::kDndLink: + return "DragAndDropLink"; } NOTREACHED();
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc index 46eac7b..260863e 100644 --- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc +++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -47,32 +47,32 @@ case ax::mojom::HasPopup::kFalse: break; case ax::mojom::HasPopup::kTrue: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::HasPopup, CreateValue("true", AXValueTypeEnum::Token))); break; case ax::mojom::HasPopup::kMenu: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::HasPopup, CreateValue("menu", AXValueTypeEnum::Token))); break; case ax::mojom::HasPopup::kListbox: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::HasPopup, CreateValue("listbox", AXValueTypeEnum::Token))); break; case ax::mojom::HasPopup::kTree: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::HasPopup, CreateValue("tree", AXValueTypeEnum::Token))); break; case ax::mojom::HasPopup::kGrid: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::HasPopup, CreateValue("grid", AXValueTypeEnum::Token))); break; case ax::mojom::HasPopup::kDialog: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::HasPopup, CreateValue("dialog", AXValueTypeEnum::Token))); break; @@ -84,20 +84,20 @@ if (!ax_object.LiveRegionRoot()) return; - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Live, CreateValue(ax_object.ContainerLiveRegionStatus(), AXValueTypeEnum::Token))); - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Atomic, CreateBooleanValue(ax_object.ContainerLiveRegionAtomic()))); - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Relevant, CreateValue(ax_object.ContainerLiveRegionRelevant(), AXValueTypeEnum::TokenList))); if (!ax_object.IsLiveRegionRoot()) { - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Root, CreateRelatedNodeListValue(*(ax_object.LiveRegionRoot())))); } @@ -106,14 +106,14 @@ void FillGlobalStates(AXObject& ax_object, protocol::Array<AXProperty>& properties) { if (ax_object.Restriction() == kRestrictionDisabled) { - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Disabled, CreateBooleanValue(true))); } if (const AXObject* hidden_root = ax_object.AriaHiddenRoot()) { - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Hidden, CreateBooleanValue(true))); - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::HiddenRoot, CreateRelatedNodeListValue(*hidden_root))); } @@ -125,42 +125,42 @@ case ax::mojom::InvalidState::kNone: break; case ax::mojom::InvalidState::kFalse: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Invalid, CreateValue("false", AXValueTypeEnum::Token))); break; case ax::mojom::InvalidState::kTrue: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Invalid, CreateValue("true", AXValueTypeEnum::Token))); break; default: // TODO(aboxhall): expose invalid: <nothing> and source: aria-invalid as // invalid value - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Invalid, CreateValue(ax_object.AriaInvalidValue(), AXValueTypeEnum::String))); break; } if (ax_object.CanSetFocusAttribute()) { - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Focusable, CreateBooleanValue(true, AXValueTypeEnum::BooleanOrUndefined))); } if (ax_object.IsFocused()) { - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Focused, CreateBooleanValue(true, AXValueTypeEnum::BooleanOrUndefined))); } if (ax_object.IsEditable()) { - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Editable, CreateValue(ax_object.IsRichlyEditable() ? "richtext" : "plaintext", AXValueTypeEnum::Token))); } if (ax_object.CanSetValueAttribute()) { - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Settable, CreateBooleanValue(true, AXValueTypeEnum::BooleanOrUndefined))); } @@ -214,7 +214,7 @@ ax::mojom::Role role = ax_object.RoleValue(); String autocomplete = ax_object.AriaAutoComplete(); if (!autocomplete.IsEmpty()) - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Autocomplete, CreateValue(autocomplete, AXValueTypeEnum::Token))); @@ -222,32 +222,33 @@ int heading_level = ax_object.HeadingLevel(); if (heading_level > 0) { - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Level, CreateValue(heading_level))); } int hierarchical_level = ax_object.HierarchicalLevel(); if (hierarchical_level > 0 || ax_object.HasAttribute(html_names::kAriaLevelAttr)) { - properties.addItem(CreateProperty(AXPropertyNameEnum::Level, - CreateValue(hierarchical_level))); + properties.emplace_back(CreateProperty(AXPropertyNameEnum::Level, + CreateValue(hierarchical_level))); } if (RoleAllowsMultiselectable(role)) { bool multiselectable = ax_object.IsMultiSelectable(); - properties.addItem(CreateProperty(AXPropertyNameEnum::Multiselectable, - CreateBooleanValue(multiselectable))); + properties.emplace_back( + CreateProperty(AXPropertyNameEnum::Multiselectable, + CreateBooleanValue(multiselectable))); } if (RoleAllowsOrientation(role)) { AccessibilityOrientation orientation = ax_object.Orientation(); switch (orientation) { case kAccessibilityOrientationVertical: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Orientation, CreateValue("vertical", AXValueTypeEnum::Token))); break; case kAccessibilityOrientationHorizontal: - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Orientation, CreateValue("horizontal", AXValueTypeEnum::Token))); break; @@ -257,19 +258,19 @@ } if (role == ax::mojom::Role::kTextField) { - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Multiline, CreateBooleanValue(ax_object.IsMultiline()))); } if (RoleAllowsReadonly(role)) { - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Readonly, CreateBooleanValue(ax_object.Restriction() == kRestrictionReadOnly))); } if (RoleAllowsRequired(role)) { - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Required, CreateBooleanValue(ax_object.IsRequired()))); } @@ -281,17 +282,17 @@ if (ax_object.IsRange()) { float min_value; if (ax_object.MinValueForRange(&min_value)) { - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Valuemin, CreateValue(min_value))); } float max_value; if (ax_object.MaxValueForRange(&max_value)) { - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Valuemax, CreateValue(max_value))); } - properties.addItem( + properties.emplace_back( CreateProperty(AXPropertyNameEnum::Valuetext, CreateValue(ax_object.ValueDescription()))); } @@ -318,7 +319,7 @@ auto* const checked_prop_name = role == ax::mojom::Role::kToggleButton ? AXPropertyNameEnum::Pressed : AXPropertyNameEnum::Checked; - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( checked_prop_name, CreateValue(checked_prop_val, AXValueTypeEnum::Tristate))); } @@ -328,12 +329,12 @@ case kExpandedUndefined: break; case kExpandedCollapsed: - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Expanded, CreateBooleanValue(false, AXValueTypeEnum::BooleanOrUndefined))); break; case kExpandedExpanded: - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Expanded, CreateBooleanValue(true, AXValueTypeEnum::BooleanOrUndefined))); break; @@ -344,20 +345,20 @@ case kSelectedStateUndefined: break; case kSelectedStateFalse: - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Selected, CreateBooleanValue(false, AXValueTypeEnum::BooleanOrUndefined))); break; case kSelectedStateTrue: - properties.addItem(CreateProperty( + properties.emplace_back(CreateProperty( AXPropertyNameEnum::Selected, CreateBooleanValue(true, AXValueTypeEnum::BooleanOrUndefined))); break; } if (RoleAllowsModal(role)) { - properties.addItem(CreateProperty(AXPropertyNameEnum::Modal, - CreateBooleanValue(ax_object.IsModal()))); + properties.emplace_back(CreateProperty( + AXPropertyNameEnum::Modal, CreateBooleanValue(ax_object.IsModal()))); } } @@ -397,7 +398,7 @@ void AddBoolAttribute(AXBoolAttribute attribute, bool value) override { switch (attribute) { case AXBoolAttribute::kAriaBusy: - properties_.addItem( + properties_.emplace_back( CreateProperty(AXPropertyNameEnum::Busy, CreateValue(value, AXValueTypeEnum::Boolean))); break; @@ -408,12 +409,12 @@ const String& value) override { switch (attribute) { case AXStringAttribute::kAriaKeyShortcuts: - properties_.addItem( + properties_.emplace_back( CreateProperty(AXPropertyNameEnum::Keyshortcuts, CreateValue(value, AXValueTypeEnum::String))); break; case AXStringAttribute::kAriaRoleDescription: - properties_.addItem( + properties_.emplace_back( CreateProperty(AXPropertyNameEnum::Roledescription, CreateValue(value, AXValueTypeEnum::String))); break; @@ -424,16 +425,18 @@ AXObject& object) override { switch (attribute) { case AXObjectAttribute::kAriaActiveDescendant: - properties_.addItem(CreateProperty(AXPropertyNameEnum::Activedescendant, - CreateRelatedNodeListValue(object))); + properties_.emplace_back( + CreateProperty(AXPropertyNameEnum::Activedescendant, + CreateRelatedNodeListValue(object))); break; case AXObjectAttribute::kAriaDetails: - properties_.addItem(CreateProperty(AXPropertyNameEnum::Details, - CreateRelatedNodeListValue(object))); + properties_.emplace_back(CreateProperty( + AXPropertyNameEnum::Details, CreateRelatedNodeListValue(object))); break; case AXObjectAttribute::kAriaErrorMessage: - properties_.addItem(CreateProperty(AXPropertyNameEnum::Errormessage, - CreateRelatedNodeListValue(object))); + properties_.emplace_back( + CreateProperty(AXPropertyNameEnum::Errormessage, + CreateRelatedNodeListValue(object))); break; } } @@ -443,12 +446,12 @@ HeapVector<Member<AXObject>>& objects) override { switch (attribute) { case AXObjectVectorAttribute::kAriaControls: - properties_.addItem( + properties_.emplace_back( CreateRelatedNodeListProperty(AXPropertyNameEnum::Controls, objects, kAriaControlsAttr, *ax_object_)); break; case AXObjectVectorAttribute::kAriaFlowTo: - properties_.addItem(CreateRelatedNodeListProperty( + properties_.emplace_back(CreateRelatedNodeListProperty( AXPropertyNameEnum::Flowto, objects, kAriaFlowtoAttr, *ax_object_)); break; } @@ -460,7 +463,7 @@ AXObject::AXObjectVector results; ax_object.AriaDescribedbyElements(results); if (!results.IsEmpty()) { - properties.addItem( + properties.emplace_back( CreateRelatedNodeListProperty(AXPropertyNameEnum::Describedby, results, kAriaDescribedbyAttr, ax_object)); } @@ -468,7 +471,7 @@ ax_object.AriaOwnsElements(results); if (!results.IsEmpty()) { - properties.addItem(CreateRelatedNodeListProperty( + properties.emplace_back(CreateRelatedNodeListProperty( AXPropertyNameEnum::Owns, results, kAriaOwnsAttr, ax_object)); } results.clear(); @@ -528,14 +531,14 @@ AXObjectCacheImpl& cache = ToAXObjectCacheImpl(ax_context.GetAXObjectCache()); AXObject* inspected_ax_object = cache.GetOrCreate(dom_node); - *nodes = protocol::Array<protocol::Accessibility::AXNode>::create(); + *nodes = std::make_unique<protocol::Array<protocol::Accessibility::AXNode>>(); if (!inspected_ax_object || inspected_ax_object->AccessibilityIsIgnored()) { - (*nodes)->addItem(BuildObjectForIgnoredNode(dom_node, inspected_ax_object, - fetch_relatives.fromMaybe(true), - *nodes, cache)); + (*nodes)->emplace_back(BuildObjectForIgnoredNode( + dom_node, inspected_ax_object, fetch_relatives.fromMaybe(true), *nodes, + cache)); return Response::OK(); } else { - (*nodes)->addItem( + (*nodes)->emplace_back( BuildProtocolAXObject(*inspected_ax_object, inspected_ax_object, fetch_relatives.fromMaybe(true), *nodes, cache)); } @@ -560,8 +563,8 @@ AXObjectCacheImpl& cache) const { AXObject* ancestor = &first_ancestor; while (ancestor) { - nodes->addItem(BuildProtocolAXObject(*ancestor, inspected_ax_object, true, - nodes, cache)); + nodes->emplace_back(BuildProtocolAXObject(*ancestor, inspected_ax_object, + true, nodes, cache)); ancestor = ancestor->ParentObjectUnignored(); } } @@ -595,7 +598,7 @@ PopulateDOMNodeAncestors(*dom_node, *(ignored_node_object.get()), nodes, cache); } - ignored_reasons.push_back(IgnoredReason(kAXNotRendered)); + ignored_reasons.emplace_back(IgnoredReason(kAXNotRendered)); } if (dom_node) { @@ -603,10 +606,10 @@ IdentifiersFactory::IntIdForNode(dom_node)); } - std::unique_ptr<protocol::Array<AXProperty>> ignored_reason_properties = - protocol::Array<AXProperty>::create(); + auto ignored_reason_properties = + std::make_unique<protocol::Array<AXProperty>>(); for (IgnoredReason& reason : ignored_reasons) - ignored_reason_properties->addItem(CreateProperty(reason)); + ignored_reason_properties->emplace_back(CreateProperty(reason)); ignored_node_object->setIgnoredReasons(std::move(ignored_reason_properties)); return ignored_node_object; @@ -641,11 +644,10 @@ // Populate parent and ancestors. std::unique_ptr<AXNode> parent_node_object = BuildProtocolAXObject(*parent_ax_object, nullptr, true, nodes, cache); - std::unique_ptr<protocol::Array<AXNodeId>> child_ids = - protocol::Array<AXNodeId>::create(); - child_ids->addItem(String::Number(kIDForInspectedNodeWithNoAXNode)); + auto child_ids = std::make_unique<protocol::Array<AXNodeId>>(); + child_ids->emplace_back(String::Number(kIDForInspectedNodeWithNoAXNode)); parent_node_object->setChildIds(std::move(child_ids)); - nodes->addItem(std::move(parent_node_object)); + nodes->emplace_back(std::move(parent_node_object)); AXObject* grandparent_ax_object = parent_ax_object->ParentObjectUnignored(); if (grandparent_ax_object) @@ -666,8 +668,7 @@ .build(); node_object->setRole(CreateRoleNameValue(role)); - std::unique_ptr<protocol::Array<AXProperty>> properties = - protocol::Array<AXProperty>::create(); + auto properties = std::make_unique<protocol::Array<AXProperty>>(); FillLiveRegionProperties(ax_object, *(properties.get())); FillGlobalStates(ax_object, *(properties.get())); FillWidgetProperties(ax_object, *(properties.get())); @@ -683,14 +684,14 @@ std::unique_ptr<AXValue> name = CreateValue(computed_name, AXValueTypeEnum::ComputedString); if (!name_sources.IsEmpty()) { - std::unique_ptr<protocol::Array<AXValueSource>> name_source_properties = - protocol::Array<AXValueSource>::create(); + auto name_source_properties = + std::make_unique<protocol::Array<AXValueSource>>(); for (NameSource& name_source : name_sources) { - name_source_properties->addItem(CreateValueSource(name_source)); + name_source_properties->emplace_back(CreateValueSource(name_source)); if (name_source.text.IsNull() || name_source.superseded) continue; if (!name_source.related_objects.IsEmpty()) { - properties->addItem(CreateRelatedNodeListProperty( + properties->emplace_back(CreateRelatedNodeListProperty( AXPropertyNameEnum::Labelledby, name_source.related_objects)); } } @@ -712,11 +713,11 @@ Document* document = inspected_frames_->Root()->GetDocument(); if (!document) return Response::Error("No document."); - *nodes = protocol::Array<protocol::Accessibility::AXNode>::create(); + *nodes = std::make_unique<protocol::Array<protocol::Accessibility::AXNode>>(); AXContext ax_context(*document); AXObjectCacheImpl& cache = ToAXObjectCacheImpl(ax_context.GetAXObjectCache()); Deque<AXID> ids; - ids.push_back(cache.Root()->AXObjectID()); + ids.emplace_back(cache.Root()->AXObjectID()); while (!ids.empty()) { AXID ax_id = ids.front(); ids.pop_front(); @@ -724,16 +725,15 @@ std::unique_ptr<AXNode> node = BuildProtocolAXObject(*ax_object, nullptr, false, *nodes, cache); - std::unique_ptr<protocol::Array<AXNodeId>> child_ids = - protocol::Array<AXNodeId>::create(); + auto child_ids = std::make_unique<protocol::Array<AXNodeId>>(); const AXObject::AXObjectVector& children = ax_object->Children(); for (unsigned i = 0; i < children.size(); i++) { AXObject& child_ax_object = *children[i].Get(); - child_ids->addItem(String::Number(child_ax_object.AXObjectID())); - ids.push_back(child_ax_object.AXObjectID()); + child_ids->emplace_back(String::Number(child_ax_object.AXObjectID())); + ids.emplace_back(child_ax_object.AXObjectID()); } node->setChildIds(std::move(child_ids)); - (*nodes)->addItem(std::move(node)); + (*nodes)->emplace_back(std::move(node)); } return Response::OK(); } @@ -789,8 +789,7 @@ parent_object = ax_object.ParentObjectUnignored(); } - std::unique_ptr<protocol::Array<AXNodeId>> child_ids = - protocol::Array<AXNodeId>::create(); + auto child_ids = std::make_unique<protocol::Array<AXNodeId>>(); if (!ax_object.AccessibilityIsIgnored()) AddChildren(ax_object, inspected_ax_object, child_ids, nodes, cache); @@ -806,14 +805,14 @@ AXObjectCacheImpl& cache) const { if (inspected_ax_object && inspected_ax_object->AccessibilityIsIgnored() && &ax_object == inspected_ax_object->ParentObjectUnignored()) { - child_ids->addItem(String::Number(inspected_ax_object->AXObjectID())); + child_ids->emplace_back(String::Number(inspected_ax_object->AXObjectID())); return; } const AXObject::AXObjectVector& children = ax_object.Children(); for (unsigned i = 0; i < children.size(); i++) { AXObject& child_ax_object = *children[i].Get(); - child_ids->addItem(String::Number(child_ax_object.AXObjectID())); + child_ids->emplace_back(String::Number(child_ax_object.AXObjectID())); if (&child_ax_object == inspected_ax_object) continue; if (&ax_object != inspected_ax_object) { @@ -828,7 +827,7 @@ // inspected node) to returned nodes. std::unique_ptr<AXNode> child_node = BuildProtocolAXObject( child_ax_object, inspected_ax_object, true, nodes, cache); - nodes->addItem(std::move(child_node)); + nodes->emplace_back(std::move(child_node)); } }
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_type_builder_helper.cc b/third_party/blink/renderer/modules/accessibility/inspector_type_builder_helper.cc index 8b01f01..6ffbb046 100644 --- a/third_party/blink/renderer/modules/accessibility/inspector_type_builder_helper.cc +++ b/third_party/blink/renderer/modules/accessibility/inspector_type_builder_helper.cc
@@ -124,9 +124,8 @@ std::unique_ptr<AXValue> CreateRelatedNodeListValue(const AXObject& ax_object, String* name, const String& value_type) { - std::unique_ptr<protocol::Array<AXRelatedNode>> related_nodes = - protocol::Array<AXRelatedNode>::create(); - related_nodes->addItem(RelatedNodeForAXObject(ax_object, name)); + auto related_nodes = std::make_unique<protocol::Array<AXRelatedNode>>(); + related_nodes->emplace_back(RelatedNodeForAXObject(ax_object, name)); return AXValue::create() .setType(value_type) .setRelatedNodes(std::move(related_nodes)) @@ -136,14 +135,14 @@ std::unique_ptr<AXValue> CreateRelatedNodeListValue( AXRelatedObjectVector& related_objects, const String& value_type) { - std::unique_ptr<protocol::Array<AXRelatedNode>> frontend_related_nodes = - protocol::Array<AXRelatedNode>::create(); + auto frontend_related_nodes = + std::make_unique<protocol::Array<AXRelatedNode>>(); for (unsigned i = 0; i < related_objects.size(); i++) { std::unique_ptr<AXRelatedNode> frontend_related_node = RelatedNodeForAXObject(*(related_objects[i]->object), &(related_objects[i]->text)); if (frontend_related_node) - frontend_related_nodes->addItem(std::move(frontend_related_node)); + frontend_related_nodes->emplace_back(std::move(frontend_related_node)); } return AXValue::create() .setType(value_type) @@ -154,13 +153,12 @@ std::unique_ptr<AXValue> CreateRelatedNodeListValue( AXObject::AXObjectVector& ax_objects, const String& value_type) { - std::unique_ptr<protocol::Array<AXRelatedNode>> related_nodes = - protocol::Array<AXRelatedNode>::create(); + auto related_nodes = std::make_unique<protocol::Array<AXRelatedNode>>(); for (unsigned i = 0; i < ax_objects.size(); i++) { std::unique_ptr<AXRelatedNode> related_node = RelatedNodeForAXObject(*(ax_objects[i].Get())); if (related_node) - related_nodes->addItem(std::move(related_node)); + related_nodes->emplace_back(std::move(related_node)); } return AXValue::create() .setType(value_type)
diff --git a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc index d540fd9..368bcdb 100644 --- a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc +++ b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
@@ -243,7 +243,7 @@ } wtf_size_t requestSize = requests.size(); if (!requestSize) { - callback_->sendSuccess(Array<DataEntry>::create(), 0); + callback_->sendSuccess(std::make_unique<Array<DataEntry>>(), 0); return; } @@ -318,7 +318,7 @@ responses_.EraseAt(params_.page_size, responses_.size() - params_.page_size); } - std::unique_ptr<Array<DataEntry>> array = Array<DataEntry>::create(); + auto array = std::make_unique<protocol::Array<DataEntry>>(); for (const auto& request_response : responses_) { std::unique_ptr<DataEntry> entry = DataEntry::create() @@ -334,7 +334,7 @@ .setResponseHeaders( SerializeHeaders(request_response.response_headers)) .build(); - array->addItem(std::move(entry)); + array->emplace_back(std::move(entry)); } callback_->sendSuccess(std::move(array), returned_entries_count); @@ -349,11 +349,11 @@ std::unique_ptr<Array<Header>> SerializeHeaders( const HTTPHeaderMap& headers) { - std::unique_ptr<Array<Header>> result = Array<Header>::create(); + auto result = std::make_unique<protocol::Array<Header>>(); for (HTTPHeaderMap::const_iterator it = headers.begin(), end = headers.end(); it != end; ++it) { - result->addItem( + result->emplace_back( Header::create().setName(it->key).setValue(it->value).build()); } return result; @@ -400,8 +400,7 @@ CacheStorageErrorString(result->get_status()).data()))); } else { if (result->get_keys().IsEmpty()) { - std::unique_ptr<Array<DataEntry>> array = - Array<DataEntry>::create(); + auto array = std::make_unique<protocol::Array<DataEntry>>(); self->callback_->sendSuccess(std::move(array), 0); return; } @@ -508,7 +507,7 @@ if (!sec_origin->IsPotentiallyTrustworthy()) { // Don't treat this as an error, just don't attempt to open and enumerate // the caches. - callback->sendSuccess(Array<ProtocolCache>::create()); + callback->sendSuccess(std::make_unique<protocol::Array<ProtocolCache>>()); return; } @@ -522,23 +521,23 @@ } cache_storage->Keys( - trace_id, WTF::Bind( - [](String security_origin, - std::unique_ptr<RequestCacheNamesCallback> callback, - const Vector<String>& caches) { - std::unique_ptr<Array<ProtocolCache>> array = - Array<ProtocolCache>::create(); - for (auto& cache : caches) { - array->addItem(ProtocolCache::create() - .setSecurityOrigin(security_origin) - .setCacheName(cache) - .setCacheId(BuildCacheId( - security_origin, cache)) - .build()); - } - callback->sendSuccess(std::move(array)); - }, - security_origin, std::move(callback))); + trace_id, + WTF::Bind( + [](String security_origin, + std::unique_ptr<RequestCacheNamesCallback> callback, + const Vector<String>& caches) { + auto array = std::make_unique<protocol::Array<ProtocolCache>>(); + for (auto& cache : caches) { + array->emplace_back( + ProtocolCache::create() + .setSecurityOrigin(security_origin) + .setCacheName(cache) + .setCacheId(BuildCacheId(security_origin, cache)) + .build()); + } + callback->sendSuccess(std::move(array)); + }, + security_origin, std::move(callback))); } void InspectorCacheStorageAgent::requestEntries( @@ -703,8 +702,8 @@ auto request = mojom::blink::FetchAPIRequest::New(); request->url = KURL(request_url); request->method = String("GET"); - for (size_t i = 0, len = request_headers->length(); i < len; ++i) { - auto* header = request_headers->get(i); + for (const std::unique_ptr<protocol::CacheStorage::Header>& header : + *request_headers) { request->headers.insert(header->getName(), header->getValue()); }
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc index 0bbfd6f4f..0ccc6e2 100644 --- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc +++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
@@ -133,10 +133,9 @@ } DOMStringList* database_names_list = request_result->DomStringList(); - std::unique_ptr<protocol::Array<String>> database_names = - protocol::Array<String>::create(); + auto database_names = std::make_unique<protocol::Array<String>>(); for (uint32_t i = 0; i < database_names_list->length(); ++i) - database_names->addItem(database_names_list->item(i)); + database_names->emplace_back(database_names_list->item(i)); request_callback_->sendSuccess(std::move(database_names)); } @@ -365,12 +364,9 @@ break; case mojom::IDBKeyPathType::Array: { key_path = KeyPath::create().setType(KeyPath::TypeEnum::Array).build(); - std::unique_ptr<protocol::Array<String>> array = - protocol::Array<String>::create(); - const Vector<String>& string_array = idb_key_path.Array(); - for (wtf_size_t i = 0; i < string_array.size(); ++i) - array->addItem(string_array[i]); - key_path->setArray(std::move(array)); + const Vector<String>& array = idb_key_path.Array(); + key_path->setArray(std::make_unique<protocol::Array<String>>( + array.begin(), array.end())); break; } default: @@ -393,17 +389,15 @@ void Execute(IDBDatabase* idb_database, ScriptState*) override { const IDBDatabaseMetadata database_metadata = idb_database->Metadata(); - std::unique_ptr<protocol::Array<protocol::IndexedDB::ObjectStore>> - object_stores = - protocol::Array<protocol::IndexedDB::ObjectStore>::create(); + auto object_stores = + std::make_unique<protocol::Array<protocol::IndexedDB::ObjectStore>>(); for (const auto& store_map_entry : database_metadata.object_stores) { const IDBObjectStoreMetadata& object_store_metadata = *store_map_entry.value; - std::unique_ptr<protocol::Array<protocol::IndexedDB::ObjectStoreIndex>> - indexes = - protocol::Array<protocol::IndexedDB::ObjectStoreIndex>::create(); + auto indexes = std::make_unique< + protocol::Array<protocol::IndexedDB::ObjectStoreIndex>>(); for (const auto& metadata_map_entry : object_store_metadata.indexes) { const IDBIndexMetadata& index_metadata = *metadata_map_entry.value; @@ -415,7 +409,7 @@ .setUnique(index_metadata.unique) .setMultiEntry(index_metadata.multi_entry) .build(); - indexes->addItem(std::move(object_store_index)); + indexes->emplace_back(std::move(object_store_index)); } std::unique_ptr<ObjectStore> object_store = @@ -425,7 +419,7 @@ .setAutoIncrement(object_store_metadata.auto_increment) .setIndexes(std::move(indexes)) .build(); - object_stores->addItem(std::move(object_store)); + object_stores->emplace_back(std::move(object_store)); } std::unique_ptr<DatabaseWithObjectStores> result = DatabaseWithObjectStores::create() @@ -475,8 +469,10 @@ } else if (type == array_type) { IDBKey::KeyArray key_array; auto* array = key->getArray(nullptr); - for (size_t i = 0; array && i < array->length(); ++i) - key_array.push_back(IdbKeyFromInspectorObject(array->get(i))); + if (array) { + for (const std::unique_ptr<protocol::IndexedDB::Key>& key : *array) + key_array.emplace_back(IdbKeyFromInspectorObject(key.get())); + } idb_key = IDBKey::CreateArray(std::move(key_array)); } else { return nullptr; @@ -532,7 +528,7 @@ request_callback_(std::move(request_callback)), skip_count_(skip_count), page_size_(page_size) { - result_ = Array<DataEntry>::create(); + result_ = std::make_unique<protocol::Array<DataEntry>>(); } ~OpenCursorCallback() override = default; @@ -567,7 +563,7 @@ return; } - if (result_->length() == page_size_) { + if (result_->size() == page_size_) { end(true); return; } @@ -602,7 +598,7 @@ context, idb_cursor->value(script_state_).V8Value(), object_group, true /* generatePreview */)) .build(); - result_->addItem(std::move(data_entry)); + result_->emplace_back(std::move(data_entry)); } void end(bool has_more) {
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni index 78b68ddb..1cb6b6d 100644 --- a/third_party/blink/renderer/modules/modules_idl_files.gni +++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -505,6 +505,7 @@ "xr/xr_layer.idl", "xr/xr_plane.idl", "xr/xr_plane_detection_state.idl", + "xr/xr_plane_set.idl", "xr/xr_pose.idl", "xr/xr_ray.idl", "xr/xr_reference_space.idl",
diff --git a/third_party/blink/renderer/modules/storage/inspector_dom_storage_agent.cc b/third_party/blink/renderer/modules/storage/inspector_dom_storage_agent.cc index 30a5150..abc2416 100644 --- a/third_party/blink/renderer/modules/storage/inspector_dom_storage_agent.cc +++ b/third_party/blink/renderer/modules/storage/inspector_dom_storage_agent.cc
@@ -126,8 +126,8 @@ if (!response.isSuccess()) return response; - std::unique_ptr<protocol::Array<protocol::Array<String>>> storage_items = - protocol::Array<protocol::Array<String>>::create(); + auto storage_items = + std::make_unique<protocol::Array<protocol::Array<String>>>(); DummyExceptionStateForTesting exception_state; for (unsigned i = 0; i < storage_area->length(exception_state); ++i) { @@ -139,11 +139,10 @@ response = ToResponse(exception_state); if (!response.isSuccess()) return response; - std::unique_ptr<protocol::Array<String>> entry = - protocol::Array<String>::create(); - entry->addItem(name); - entry->addItem(value); - storage_items->addItem(std::move(entry)); + auto entry = std::make_unique<protocol::Array<String>>(); + entry->emplace_back(name); + entry->emplace_back(value); + storage_items->emplace_back(std::move(entry)); } *items = std::move(storage_items); return Response::OK();
diff --git a/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc b/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc index 3dc7108..01d716f 100644 --- a/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc +++ b/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc
@@ -90,26 +90,25 @@ bool OnSuccess(SQLTransaction*, SQLResultSet* result_set) override { SQLResultSetRowList* row_list = result_set->rows(); - std::unique_ptr<protocol::Array<String>> column_names = - protocol::Array<String>::create(); const Vector<String>& columns = row_list->ColumnNames(); - for (wtf_size_t i = 0; i < columns.size(); ++i) - column_names->addItem(columns[i]); + auto column_names = std::make_unique<protocol::Array<String>>( + columns.begin(), columns.end()); - std::unique_ptr<protocol::Array<protocol::Value>> values = - protocol::Array<protocol::Value>::create(); + auto values = std::make_unique<protocol::Array<protocol::Value>>(); const Vector<SQLValue>& data = row_list->Values(); for (wtf_size_t i = 0; i < data.size(); ++i) { const SQLValue& value = row_list->Values()[i]; switch (value.GetType()) { case SQLValue::kStringValue: - values->addItem(protocol::StringValue::create(value.GetString())); + values->emplace_back( + protocol::StringValue::create(value.GetString())); break; case SQLValue::kNumberValue: - values->addItem(protocol::FundamentalValue::create(value.Number())); + values->emplace_back( + protocol::FundamentalValue::create(value.Number())); break; case SQLValue::kNullValue: - values->addItem(protocol::Value::null()); + values->emplace_back(protocol::Value::null()); break; } } @@ -263,14 +262,13 @@ if (!enabled_.Get()) return Response::Error("Database agent is not enabled"); - *names = protocol::Array<String>::create(); - blink::Database* database = DatabaseForId(database_id); if (database) { Vector<String> table_names = database->TableNames(); - unsigned length = table_names.size(); - for (unsigned i = 0; i < length; ++i) - (*names)->addItem(table_names[i]); + *names = std::make_unique<protocol::Array<String>>(table_names.begin(), + table_names.end()); + } else { + *names = std::make_unique<protocol::Array<String>>(); } return Response::OK(); }
diff --git a/third_party/blink/renderer/modules/xr/BUILD.gn b/third_party/blink/renderer/modules/xr/BUILD.gn index bc876154..c104733 100644 --- a/third_party/blink/renderer/modules/xr/BUILD.gn +++ b/third_party/blink/renderer/modules/xr/BUILD.gn
@@ -40,6 +40,8 @@ "xr_plane.h", "xr_plane_detection_state.cc", "xr_plane_detection_state.h", + "xr_plane_set.cc", + "xr_plane_set.h", "xr_pose.cc", "xr_pose.h", "xr_ray.cc",
diff --git a/third_party/blink/renderer/modules/xr/xr_plane_set.cc b/third_party/blink/renderer/modules/xr/xr_plane_set.cc new file mode 100644 index 0000000..dc136d3a --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane_set.cc
@@ -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. + +#include "third_party/blink/renderer/modules/xr/xr_plane_set.h" + +namespace blink { + +XRPlaneSet::XRPlaneSet(HeapHashSet<Member<XRPlane>> planes) : planes_(planes) {} + +unsigned XRPlaneSet::size() const { + return planes_.size(); +} + +bool XRPlaneSet::hasForBinding(ScriptState*, + XRPlane* plane, + ExceptionState&) const { + DCHECK(plane); + + return planes_.find(plane) != planes_.end(); +} + +XRPlaneSet::IterationSource* XRPlaneSet::StartIteration( + ScriptState* script_state, + ExceptionState& exception_state) { + return MakeGarbageCollected<XRPlaneSet::IterationSource>(planes_); +} + +void XRPlaneSet::Trace(blink::Visitor* visitor) { + visitor->Trace(planes_); + ScriptWrappable::Trace(visitor); +} + +XRPlaneSet::IterationSource::IterationSource( + const HeapHashSet<Member<XRPlane>>& planes) + : index_(0) { + for (auto plane : planes) { + planes_.push_back(plane); + } +} + +bool XRPlaneSet::IterationSource::Next(ScriptState* script_state, + Member<XRPlane>& key, + Member<XRPlane>& value, + ExceptionState& exception_state) { + if (index_ >= planes_.size()) { + return false; + } + + key = value = planes_[index_]; + ++index_; + + return true; +} + +void XRPlaneSet::IterationSource::Trace(blink::Visitor* visitor) { + visitor->Trace(planes_); + SetlikeIterable<Member<XRPlane>>::IterationSource::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/xr/xr_plane_set.h b/third_party/blink/renderer/modules/xr/xr_plane_set.h new file mode 100644 index 0000000..de8f68b --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane_set.h
@@ -0,0 +1,60 @@ +// 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_MODULES_XR_XR_PLANE_SET_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_PLANE_SET_H_ + +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" +#include "third_party/blink/renderer/modules/xr/xr_plane.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" + +namespace blink { + +class XRPlaneSet : public ScriptWrappable, + public SetlikeIterable<Member<XRPlane>> { + DEFINE_WRAPPERTYPEINFO(); + + public: + explicit XRPlaneSet(HeapHashSet<Member<XRPlane>> planes); + + unsigned size() const; + + // Returns true if passed in |plane| is a member of the XRPlaneSet. + bool hasForBinding(ScriptState* script_state, + XRPlane* plane, + ExceptionState& exception_state) const; + + void Trace(blink::Visitor* visitor) override; + + private: + class IterationSource final + : public SetlikeIterable<Member<XRPlane>>::IterationSource { + public: + explicit IterationSource(const HeapHashSet<Member<XRPlane>>& planes); + + bool Next(ScriptState* script_state, + Member<XRPlane>& key, + Member<XRPlane>& value, + ExceptionState& exception_state) override; + + void Trace(blink::Visitor* visitor) override; + + private: + HeapVector<Member<XRPlane>> planes_; + + unsigned index_; + }; + + // Starts iteration over XRPlaneSet. + // Needed for SetlikeIterable to work properly. + XRPlaneSet::IterationSource* StartIteration( + ScriptState* script_state, + ExceptionState& exception_state) override; + + HeapHashSet<Member<XRPlane>> planes_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_PLANE_SET_H_
diff --git a/third_party/blink/renderer/modules/xr/xr_plane_set.idl b/third_party/blink/renderer/modules/xr/xr_plane_set.idl new file mode 100644 index 0000000..8e04e6bd --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane_set.idl
@@ -0,0 +1,14 @@ +// 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. + +// More details about the plane detection API can be found here: +// https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md +[ + SecureContext, + Exposed=Window, + RuntimeEnabled=WebXRPlaneDetection +] +interface XRPlaneSet { + readonly setlike<XRPlane>; +};
diff --git a/third_party/blink/renderer/modules/xr/xr_reference_space.cc b/third_party/blink/renderer/modules/xr/xr_reference_space.cc index d4b9cc5..10fba2c 100644 --- a/third_party/blink/renderer/modules/xr/xr_reference_space.cc +++ b/third_party/blink/renderer/modules/xr/xr_reference_space.cc
@@ -137,16 +137,7 @@ std::unique_ptr<TransformationMatrix> XRReferenceSpace::TransformBaseInputPose( const TransformationMatrix& base_input_pose, const TransformationMatrix& base_pose) { - switch (type_) { - case Type::kTypeViewer: - case Type::kTypeLocal: - case Type::kTypeLocalFloor: - case Type::kTypeUnbounded: - return TransformBasePose(base_input_pose); - case Type::kTypeBoundedFloor: - break; - } - return nullptr; + return TransformBasePose(base_input_pose); } std::unique_ptr<TransformationMatrix>
diff --git a/third_party/blink/renderer/modules/xr/xr_world_information.cc b/third_party/blink/renderer/modules/xr/xr_world_information.cc index 36ae87fc..805e2659 100644 --- a/third_party/blink/renderer/modules/xr/xr_world_information.cc +++ b/third_party/blink/renderer/modules/xr/xr_world_information.cc
@@ -17,21 +17,19 @@ ScriptWrappable::Trace(visitor); } -HeapVector<Member<XRPlane>> XRWorldInformation::detectedPlanes( - bool& is_null) const { +XRPlaneSet* XRWorldInformation::detectedPlanes() const { DVLOG(3) << __func__; - HeapVector<Member<XRPlane>> result; + HeapHashSet<Member<XRPlane>> result; - is_null = is_detected_planes_null_; - if (is_null) - return result; + if (is_detected_planes_null_) + return nullptr; for (auto& plane_id_and_plane : plane_ids_to_planes_) { - result.push_back(plane_id_and_plane.value); + result.insert(plane_id_and_plane.value); } - return result; + return MakeGarbageCollected<XRPlaneSet>(result); } void XRWorldInformation::ProcessPlaneInformation(
diff --git a/third_party/blink/renderer/modules/xr/xr_world_information.h b/third_party/blink/renderer/modules/xr/xr_world_information.h index 8807472..6f6e816 100644 --- a/third_party/blink/renderer/modules/xr/xr_world_information.h +++ b/third_party/blink/renderer/modules/xr/xr_world_information.h
@@ -7,6 +7,7 @@ #include "device/vr/public/mojom/vr_service.mojom-blink.h" #include "third_party/blink/renderer/modules/xr/xr_plane.h" +#include "third_party/blink/renderer/modules/xr/xr_plane_set.h" namespace blink { @@ -18,9 +19,9 @@ public: XRWorldInformation(XRSession* session); - // Returns vector containing detected planes, |is_null| will be set to true - // if plane detection is not enabled. - HeapVector<Member<XRPlane>> detectedPlanes(bool& is_null) const; + // Returns set of detected planes. Returns null if plane detection is + // disabled. + XRPlaneSet* detectedPlanes() const; void Trace(blink::Visitor* visitor) override;
diff --git a/third_party/blink/renderer/modules/xr/xr_world_information.idl b/third_party/blink/renderer/modules/xr/xr_world_information.idl index fd3148d..7aa6950 100644 --- a/third_party/blink/renderer/modules/xr/xr_world_information.idl +++ b/third_party/blink/renderer/modules/xr/xr_world_information.idl
@@ -10,6 +10,6 @@ RuntimeEnabled=WebXRPlaneDetection ] interface XRWorldInformation { - readonly attribute FrozenArray<XRPlane>? detectedPlanes; + readonly attribute XRPlaneSet? detectedPlanes; };
diff --git a/third_party/blink/renderer/platform/cursor.cc b/third_party/blink/renderer/platform/cursor.cc index cec1f650..e8eb087 100644 --- a/third_party/blink/renderer/platform/cursor.cc +++ b/third_party/blink/renderer/platform/cursor.cc
@@ -23,7 +23,6 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "third_party/blink/public/platform/web_cursor_info.h" #include "third_party/blink/renderer/platform/cursor.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" @@ -61,7 +60,7 @@ } Cursor::Cursor(Image* image, bool hot_spot_specified, const IntPoint& hot_spot) - : type_(kCustom), + : type_(ui::CursorType::kCustom), image_(image), hot_spot_(DetermineHotSpot(image, hot_spot_specified, hot_spot)), image_scale_factor_(1) {} @@ -70,12 +69,12 @@ bool hot_spot_specified, const IntPoint& hot_spot, float scale) - : type_(kCustom), + : type_(ui::CursorType::kCustom), image_(image), hot_spot_(DetermineHotSpot(image, hot_spot_specified, hot_spot)), image_scale_factor_(scale) {} -Cursor::Cursor(Type type) : type_(type), image_scale_factor_(1) {} +Cursor::Cursor(ui::CursorType type) : type_(type), image_scale_factor_(1) {} Cursor::Cursor(const Cursor& other) = default; @@ -90,287 +89,228 @@ Cursor::~Cursor() = default; const Cursor& PointerCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kPointer)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kPointer)); return c; } const Cursor& CrossCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kCross)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kCross)); return c; } const Cursor& HandCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kHand)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kHand)); return c; } const Cursor& MoveCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kMove)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kMove)); return c; } const Cursor& VerticalTextCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kVerticalText)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kVerticalText)); return c; } const Cursor& CellCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kCell)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kCell)); return c; } const Cursor& ContextMenuCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kContextMenu)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kContextMenu)); return c; } const Cursor& AliasCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kAlias)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kAlias)); return c; } const Cursor& ZoomInCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kZoomIn)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kZoomIn)); return c; } const Cursor& ZoomOutCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kZoomOut)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kZoomOut)); return c; } const Cursor& CopyCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kCopy)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kCopy)); return c; } const Cursor& NoneCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNone)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNone)); return c; } const Cursor& ProgressCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kProgress)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kProgress)); return c; } const Cursor& NoDropCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNoDrop)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNoDrop)); return c; } const Cursor& NotAllowedCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNotAllowed)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNotAllowed)); return c; } const Cursor& IBeamCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kIBeam)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kIBeam)); return c; } const Cursor& WaitCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kWait)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kWait)); return c; } const Cursor& HelpCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kHelp)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kHelp)); return c; } const Cursor& EastResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kEastResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kEastResize)); return c; } const Cursor& NorthResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthResize)); return c; } const Cursor& NorthEastResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthEastResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthEastResize)); return c; } const Cursor& NorthWestResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthWestResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthWestResize)); return c; } const Cursor& SouthResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kSouthResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kSouthResize)); return c; } const Cursor& SouthEastResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kSouthEastResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kSouthEastResize)); return c; } const Cursor& SouthWestResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kSouthWestResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kSouthWestResize)); return c; } const Cursor& WestResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kWestResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kWestResize)); return c; } const Cursor& NorthSouthResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthSouthResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthSouthResize)); return c; } const Cursor& EastWestResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kEastWestResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kEastWestResize)); return c; } const Cursor& NorthEastSouthWestResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthEastSouthWestResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthEastSouthWestResize)); return c; } const Cursor& NorthWestSouthEastResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthWestSouthEastResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthWestSouthEastResize)); return c; } const Cursor& ColumnResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kColumnResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kColumnResize)); return c; } const Cursor& RowResizeCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kRowResize)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kRowResize)); return c; } const Cursor& MiddlePanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kMiddlePanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kMiddlePanning)); return c; } const Cursor& MiddlePanningVerticalCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kMiddlePanningVertical)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kMiddlePanningVertical)); return c; } const Cursor& MiddlePanningHorizontalCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kMiddlePanningHorizontal)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kMiddlePanningHorizontal)); return c; } const Cursor& EastPanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kEastPanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kEastPanning)); return c; } const Cursor& NorthPanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthPanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthPanning)); return c; } const Cursor& NorthEastPanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthEastPanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthEastPanning)); return c; } const Cursor& NorthWestPanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kNorthWestPanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kNorthWestPanning)); return c; } const Cursor& SouthPanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kSouthPanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kSouthPanning)); return c; } const Cursor& SouthEastPanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kSouthEastPanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kSouthEastPanning)); return c; } const Cursor& SouthWestPanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kSouthWestPanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kSouthWestPanning)); return c; } const Cursor& WestPanningCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kWestPanning)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kWestPanning)); return c; } const Cursor& GrabCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kGrab)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kGrab)); return c; } const Cursor& GrabbingCursor() { - DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::kGrabbing)); + DEFINE_STATIC_LOCAL(Cursor, c, (ui::CursorType::kGrabbing)); return c; } -STATIC_ASSERT_ENUM(WebCursorInfo::kTypePointer, Cursor::kPointer); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeCross, Cursor::kCross); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeHand, Cursor::kHand); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeIBeam, Cursor::kIBeam); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeWait, Cursor::kWait); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeHelp, Cursor::kHelp); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeEastResize, Cursor::kEastResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthResize, Cursor::kNorthResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthEastResize, - Cursor::kNorthEastResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthWestResize, - Cursor::kNorthWestResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeSouthResize, Cursor::kSouthResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeSouthEastResize, - Cursor::kSouthEastResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeSouthWestResize, - Cursor::kSouthWestResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeWestResize, Cursor::kWestResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthSouthResize, - Cursor::kNorthSouthResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeEastWestResize, Cursor::kEastWestResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthEastSouthWestResize, - Cursor::kNorthEastSouthWestResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthWestSouthEastResize, - Cursor::kNorthWestSouthEastResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeColumnResize, Cursor::kColumnResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeRowResize, Cursor::kRowResize); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeMiddlePanning, Cursor::kMiddlePanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeEastPanning, Cursor::kEastPanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthPanning, Cursor::kNorthPanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthEastPanning, - Cursor::kNorthEastPanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNorthWestPanning, - Cursor::kNorthWestPanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeSouthPanning, Cursor::kSouthPanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeSouthEastPanning, - Cursor::kSouthEastPanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeSouthWestPanning, - Cursor::kSouthWestPanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeWestPanning, Cursor::kWestPanning); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeMove, Cursor::kMove); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeVerticalText, Cursor::kVerticalText); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeCell, Cursor::kCell); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeContextMenu, Cursor::kContextMenu); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeAlias, Cursor::kAlias); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeProgress, Cursor::kProgress); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNoDrop, Cursor::kNoDrop); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeCopy, Cursor::kCopy); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNone, Cursor::kNone); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeNotAllowed, Cursor::kNotAllowed); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeZoomIn, Cursor::kZoomIn); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeZoomOut, Cursor::kZoomOut); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeGrab, Cursor::kGrab); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeGrabbing, Cursor::kGrabbing); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeMiddlePanningVertical, - Cursor::kMiddlePanningVertical); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeMiddlePanningHorizontal, - Cursor::kMiddlePanningHorizontal); -STATIC_ASSERT_ENUM(WebCursorInfo::kTypeCustom, Cursor::kCustom); } // namespace blink
diff --git a/third_party/blink/renderer/platform/cursor.h b/third_party/blink/renderer/platform/cursor.h index d3a56a02..2d2cf05 100644 --- a/third_party/blink/renderer/platform/cursor.h +++ b/third_party/blink/renderer/platform/cursor.h
@@ -27,6 +27,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_CURSOR_H_ #include "base/memory/scoped_refptr.h" +#include "third_party/blink/public/platform/web_cursor_info.h" #include "third_party/blink/renderer/platform/geometry/int_point.h" #include "third_party/blink/renderer/platform/graphics/image.h" #include "third_party/blink/renderer/platform/platform_export.h" @@ -41,58 +42,9 @@ USING_FAST_MALLOC(Cursor); public: - enum Type { - kPointer = 0, - kCross, - kHand, - kIBeam, - kWait, - kHelp, - kEastResize, - kNorthResize, - kNorthEastResize, - kNorthWestResize, - kSouthResize, - kSouthEastResize, - kSouthWestResize, - kWestResize, - kNorthSouthResize, - kEastWestResize, - kNorthEastSouthWestResize, - kNorthWestSouthEastResize, - kColumnResize, - kRowResize, - kMiddlePanning, - kEastPanning, - kNorthPanning, - kNorthEastPanning, - kNorthWestPanning, - kSouthPanning, - kSouthEastPanning, - kSouthWestPanning, - kWestPanning, - kMove, - kVerticalText, - kCell, - kContextMenu, - kAlias, - kProgress, - kNoDrop, - kCopy, - kNone, - kNotAllowed, - kZoomIn, - kZoomOut, - kGrab, - kGrabbing, - kMiddlePanningVertical, - kMiddlePanningHorizontal, - kCustom - }; - Cursor() // This is an invalid Cursor and should never actually get used. - : type_(static_cast<Type>(-1)) {} + : type_(static_cast<ui::CursorType>(-1)) {} Cursor(Image*, bool hot_spot_specified, const IntPoint& hot_spot); @@ -106,10 +58,10 @@ ~Cursor(); Cursor& operator=(const Cursor&); - explicit Cursor(Type); - Type GetType() const { - DCHECK_GE(type_, 0); - DCHECK_LE(type_, kCustom); + explicit Cursor(ui::CursorType); + ui::CursorType GetType() const { + DCHECK_GE(type_, static_cast<ui::CursorType>(0)); + DCHECK_LE(type_, ui::CursorType::kCustom); return type_; } Image* GetImage() const { return image_.get(); } @@ -118,7 +70,7 @@ float ImageScaleFactor() const { return image_scale_factor_; } private: - Type type_; + ui::CursorType type_; scoped_refptr<Image> image_; IntPoint hot_spot_; float image_scale_factor_;
diff --git a/third_party/blink/renderer/platform/exported/web_cursor_info.cc b/third_party/blink/renderer/platform/exported/web_cursor_info.cc index be87059..a29fcfa8 100644 --- a/third_party/blink/renderer/platform/exported/web_cursor_info.cc +++ b/third_party/blink/renderer/platform/exported/web_cursor_info.cc
@@ -42,7 +42,7 @@ } WebCursorInfo::WebCursorInfo(const Cursor& cursor) - : type(static_cast<Type>(cursor.GetType())), + : type(static_cast<ui::CursorType>(cursor.GetType())), hot_spot(cursor.HotSpot()), image_scale_factor(cursor.ImageScaleFactor()), custom_image(GetCursorBitmap(cursor))
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 05258d0f..290b259 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -773,8 +773,8 @@ name: "IsolatedWorldCSP" }, { - // Modifies JankTracker to use O(n log n) sweep line algorithm for - // computing the area of the jank region. + // Modifies LayoutShiftTracker to use O(n log n) sweep line algorithm for + // computing the area of the layout shift region. name: "JankTrackingSweepLine", status: "experimental", }, @@ -798,7 +798,7 @@ }, { // Modifies LayoutInstabilityAPI to include the maximum move distance in the - // jank fraction computation. + // layout shift score computation. name: "LayoutInstabilityMoveDistance", }, {
diff --git a/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc b/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc index c629b51..0409d533 100644 --- a/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc +++ b/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc
@@ -12,7 +12,6 @@ #include "base/files/memory_mapped_file.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" -#include "base/timer/elapsed_timer.h" #include "third_party/blink/public/mojom/hyphenation/hyphenation.mojom-blink.h" #include "third_party/blink/public/platform/interface_provider.h" #include "third_party/blink/public/platform/platform.h" @@ -66,10 +65,7 @@ bool HyphenationMinikin::OpenDictionary(const AtomicString& locale) { const mojom::blink::HyphenationPtr& service = GetService(); base::File file; - base::ElapsedTimer timer; service->OpenDictionary(locale, &file); - UMA_HISTOGRAM_TIMES("Hyphenation.Open", timer.Elapsed()); - return OpenDictionary(std::move(file)); }
diff --git a/third_party/blink/web_tests/LeakExpectations b/third_party/blink/web_tests/LeakExpectations index a6f3756..c1a04876 100644 --- a/third_party/blink/web_tests/LeakExpectations +++ b/third_party/blink/web_tests/LeakExpectations
@@ -38,6 +38,7 @@ crbug.com/835943 [ Linux ] http/tests/appcache/non-html.xhtml [ Leak Pass ] crbug.com/860117 [ Linux ] editing/pasteboard/drag-drop-iframe-refresh-crash.html [ Pass Leak ] +crbug.com/976438 [ Linux ] external/wpt/css/selectors/focus-visible-007.html [ Pass Leak ] # ----------------------------------------------------------------- # Not revert suspected CL as jam@ request, expected to be fixed soon.
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index f8f6127a..091f806 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -6242,3 +6242,6 @@ crbug.com/973769 [ Linux ] media/video-played-ranges-1.html [ Pass Failure ] crbug.com/973769 [ Linux ] media/video-played-reset.html [ Pass Failure ] crbug.com/973769 [ Linux ] media/W3C/audio/events/event_timeupdate_manual.html [ Pass Failure ] + +# Flaky on Linux +crbug.com/974660 [ Linux ] http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index c736a641..9a917be 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -193291,6 +193291,12 @@ {} ] ], + "content-security-policy/meta/sandbox-iframe.html": [ + [ + "content-security-policy/meta/sandbox-iframe.html", + {} + ] + ], "content-security-policy/navigate-to/anchor-navigation-always-allowed.html": [ [ "content-security-policy/navigate-to/anchor-navigation-always-allowed.html", @@ -195877,6 +195883,12 @@ {} ] ], + "css/CSS2/floats/list-item-taller-than-opportunity-001.html": [ + [ + "css/CSS2/floats/list-item-taller-than-opportunity-001.html", + {} + ] + ], "css/CSS2/floats/zero-space-between-floats-001.html": [ [ "css/CSS2/floats/zero-space-between-floats-001.html", @@ -261950,6 +261962,12 @@ {} ] ], + "quirks/table-replaced-descendant-percentage-height-crash.html": [ + [ + "quirks/table-replaced-descendant-percentage-height-crash.html", + {} + ] + ], "quirks/unitless-length/excluded-properties-001.html": [ [ "quirks/unitless-length/excluded-properties-001.html", @@ -272613,6 +272631,12 @@ } ] ], + "scroll-animations/scroll-animation.html": [ + [ + "scroll-animations/scroll-animation.html", + {} + ] + ], "secure-contexts/basic-dedicated-worker.html": [ [ "secure-contexts/basic-dedicated-worker.html", @@ -293621,6 +293645,19 @@ } ] ], + "websockets/remove-own-iframe-during-onerror.window.js": [ + [ + "websockets/remove-own-iframe-during-onerror.window.html", + { + "script_metadata": [ + [ + "script", + "websocket.sub.js" + ] + ] + } + ] + ], "websockets/security/001.html": [ [ "websockets/security/001.html", @@ -318189,6 +318226,10 @@ "8e90073147a233a74727a3ba03307c1564dc3224", "support" ], + "content-security-policy/meta/sandbox-iframe.html": [ + "d353cafae1618d63482bda072f4ca530efa54a0b", + "testharness" + ], "content-security-policy/meta/support/metaHelper.js": [ "9191a39c73bef941773ad5b8eb1553caa1528faf", "support" @@ -325545,6 +325586,10 @@ "060312454915307da67988ac52dc41e558479dd1", "reftest" ], + "css/CSS2/floats/list-item-taller-than-opportunity-001.html": [ + "ae8783ce31303024152d3dc91dde3058b3beef0c", + "testharness" + ], "css/CSS2/floats/new-fc-beside-adjoining-float-2.html": [ "2d27a28a0533eece2ec6b1ee933028da8fb99c4f", "reftest" @@ -403894,7 +403939,7 @@ "testharness" ], "custom-elements/attribute-changed-callback.html": [ - "5090bfbfbfecdfbfbfb7c52579824cd333c93cdc", + "db2a01196a722a01d2297986a52881561a230597", "testharness" ], "custom-elements/builtin-coverage.html": [ @@ -404054,7 +404099,7 @@ "testharness" ], "custom-elements/reaction-timing.html": [ - "9e5bafbedfec42d28eb94c95ed84396941bc61ac", + "454cc26c0f07572c8245a9bc9452cbf45b6ec897", "testharness" ], "custom-elements/reactions/Attr.html": [ @@ -404082,7 +404127,7 @@ "testharness" ], "custom-elements/reactions/Element.html": [ - "8370724061ad193e71574596efa68c916e55535c", + "e1576734d0cc169c0cc072c644a0e300017977da", "testharness" ], "custom-elements/reactions/ElementContentEditable.html": [ @@ -449853,6 +449898,10 @@ "eeb726627b78fdcbf81d3c29b9205f771bd0aca8", "testharness" ], + "quirks/table-replaced-descendant-percentage-height-crash.html": [ + "385d6caf200940ab874b0b20c33b593357c9f68e", + "testharness" + ], "quirks/text-decoration-doesnt-propagate-into-tables/quirks-ref.html": [ "a72475f40cec7a84702fdb03aad81198e0e7cdca", "support" @@ -459837,6 +459886,10 @@ "b0e5ead25c6ecd72bb0afcba572af46b819152aa", "support" ], + "scroll-animations/scroll-animation.html": [ + "0320210f8394c7439353a6e1efd0eba339b27e20", + "testharness" + ], "secure-contexts/META.yml": [ "e6537166280091c062a8894508f3f0ab9a33a8bf", "support" @@ -472810,7 +472863,7 @@ "testharness" ], "trusted-types/Element-setAttributeNS.tentative.html": [ - "80128cfbf0ebce7d878dd349fc8838b2a6469a16", + "374e6a9cfa3c36a21daf7d8dd6d8111981fe192b", "testharness" ], "trusted-types/GlobalEventHandlers-onclick.tentative.html": [ @@ -472946,7 +472999,7 @@ "testharness" ], "trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html": [ - "3ad27e219e998145610d79769a784034aef94aff", + "4bb9569816d03cc37e97db55ea2db6a2d30a15cd", "testharness" ], "trusted-types/block-string-assignment-to-HTMLElement-generic.tentative-expected.txt": [ @@ -479873,6 +479926,10 @@ "914af77e6780b68ffdad8ab357c76ab0e2a2f1c6", "testharness" ], + "websockets/remove-own-iframe-during-onerror.window.js": [ + "55fa686c6eaee496e418eafb5cabebf5f782bb71", + "testharness" + ], "websockets/security/001.html": [ "4cc24598bd31ea466b5f71979c61e6eb42e12b0d", "testharness" @@ -483494,7 +483551,7 @@ "support" ], "webxr/idlharness.https.window-expected.txt": [ - "105701ec9dcd7ece2589032ebdf08fc3eb658566", + "4bff46592bbe393232eda88c69f9fd4d1d4714cf", "support" ], "webxr/idlharness.https.window.js": [
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_2.html b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_2.html index ecfeaf66..4f29544 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_2.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_2.html
@@ -7,12 +7,19 @@ <script src='/resources/testharnessreport.js'></script> <script nonce='abc'> var t_spv = async_test("Should fire violation events for every failed violation"); - window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); - })); + window.addEventListener( + "securitypolicyviolation", t_spv.unreached_func("securitypolicyviolation should not be emitted")); + + window.addEventListener("load", function() { + t_spv.done(); + }); </script> <script src='positiveTest.js'></script> - <script nonce='abc'>t_spv.done();</script> + <script nonce='abc'> + test(function() { + assert_true(window.cspPositiveTest); + }, "Allows scripts from the same host."); + </script> </head> <body> <h1>'self' keyword positive test</h1>
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_8.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_8.sub.html index 79edff2..a9a76c8 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_8.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_8.sub.html
@@ -9,17 +9,16 @@ <script> var t = async_test("Test that script does not fire violation event"); window.addEventListener("securitypolicyviolation", t.unreached_func("Should not have fired a violation event")); - + window.addEventListener("load", t.step_func(function() { + assert_true(window.wildcardHostTestRan); + t.done(); + })); var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = "http://www." + location.hostname + ":" + location.port + "/content-security-policy/generic/wildcardHostTestSuceeds.js"; head.appendChild(script); </script> - - <script> - t.done(); - </script> </head> <body> <h1>test wildcard host name matching (asterisk as a subdomain of the current domain)</h1>
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_8_1.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_8_1.sub.html index e8ce2341..a0b74160 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_8_1.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_8_1.sub.html
@@ -8,8 +8,13 @@ <script src='wildcardHostTestFailure.js'></script> <script> var t_spv = async_test("Should fire violation events for every failed violation"); - window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src-elem"); + var spvEvent; + window.addEventListener("securitypolicyviolation", t_spv.step_func(function(e) { + spvEvent = e; + })); + addEventListener("load", t_spv.step_func_done(function() { + assert_true(!!spvEvent); + assert_equals(spvEvent.violatedDirective, "script-src-elem"); })); var head = document.getElementsByTagName('head')[0];
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_9.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_9.sub.html index 150876c..f7f7f0d 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_9.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/generic-0_9.sub.html
@@ -9,6 +9,9 @@ <script> var t = async_test("Test that script does not fire violation event"); window.addEventListener("securitypolicyviolation", t.unreached_func("Should not have fired a violation event")); + window.addEventListener("load", function() { + t.done(); + }); var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); @@ -16,10 +19,6 @@ script.src = "http://" + location.hostname + ":{{ports[http][1]}}/content-security-policy/generic/wildcardPortTestSuceeds.js"; head.appendChild(script); </script> - - <script> - t.done(); - </script> </head> <body> <h1>test wildcard port number matching</h1>
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/no-default-src.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/no-default-src.sub.html index 5f5c8cb..9a89ec0 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/no-default-src.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/no-default-src.sub.html
@@ -18,11 +18,24 @@ <br> <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAABACAIAAAABPqsMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QoMCC8h3if5rgAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAAGD0lEQVR42u2aa0yTVxiA39ILxa4KIkKrVCCIitzrqkAXQiXDSFjQHyZDBRRdtoDzgooao5uaoInID4hRJFC8RBOzxQuKigyYokuDSB0WlaJQlQrITRCwte1+nKVhpbT9aGUue59fb84573dO+uR7v/drS4OfAPkf4oQfAYpHUDyC4hEUj6B4BMUjKB5B8QiKR1A8guIRFI+geATFIygeQfEIikdQPEIVxmd1GsN+w9hBrV7bN9Kn7FHWqmqLHxY3vW2ycIWtS7Yeiz9G4h0VO47eO2rj1p4cz7WhayW+kuCZwdNdpjsznIe0Q53vO1X9qsbOxrr2uprWmrb+Nofn/lvQPqs/W5oVb0KBrCDrVpZGpzE7++iHR8Ezg0ms6FIsPL7Qho+Ali3O3h+zn81gW1n5M82BuVjqqZEpyjyVeMrs1CL+IqN1AAj0CBTNElm9YGFiYc7SHKvmHJ6Lpd7K/cF0YvK5/KV+S3eLd/tP9weAlNAUaYO0qrXKJGtd2DoS6A16J5oTGZG9llnYKDEgcUPEBhI/636WL8uvelHV1t82rB1mM9geHA8fV58QzxAhTxjjE+PAXCz15ku92cLIZXFr1tWEe4UDwLk/z635dc3oWWe6s3q72o3tBgD7qvYdiD0AAH0jfbxc3sjHkfF2LF9dvsx/GQDcbLmZdCHJwkrH5mKpp8CAZiC7IpvEUd5RJrMrFqwg1pU9ykO/H2rpbQEAV7brygUrLVxz8ezFJNh2cxtVc/bkonhq3Ht5jwReX3iNV+elDVIDGKQNUpNxs0x1nkoCZY+S6mHsyUXxE30oGP7R/3tP9Y7ziyNP91J5KQCUNpTqDXoAkPhKBNME412ne6ibBEEzg6iewZ5cFE8NY4XveN8xejw1LJV0cxXPK169ewUAL9+9vP38NgA40ZxSQ1OtlpDCxMI50+ZMrPxMIBfFU4DD5ByOO2zyoRPSwtJIUPyw2DhojNPC0mhg/jU67488AxgAQMgTNv/YfPXbq5miTNEskQvDxep57MnFrt56V890YvK4vFif2D1f7QlwDyCDcafjKl9UkjhmTkx1WjUA9Az38HP5H3Qfxvb5saWx1a3VZjfdsmRL7te5pGAY0Rl0ii7FnbY7l55cqnxRSZ4ajs1F8WbEW8bkXU6aJCXFvEBWsKl80+iVBcsLMr7MAIDT8tOpl8Yt+JGzIw9KDkp8JWYLg7JHmXUr68rTKw7PRfEUxJ98cHJz+Wbjbc1lcdXb1RwmBwCEhcJ6df3oxUKesO67OgAY0g55HfUa0AxYuLJgmmD53OVigTiCFxHgHkCn0UfP7rq960jtkU+Ri+LH/ZGmf6S/pbelVlVb0lDS2Nk4ejY9PL3omyIAkHfIw06EjU2Xfy8P8QwBgI1XNxbVF9l4EheGi5AvTJibkB6R7jHFAwAMYBAXi016C4fn4jPe1p807q6/G+0dbWMTHl0cTfVIbmy3suQy8jZxUXFx1cVVk5OLXb0lAtwDbLROXgWNvaHt9I70ZlzPILFYIJ60XBRvCcvfytm/ntDU9fc/AEjdnrTcTwrjv2udTqOnhKaQOOlC0uWnl8dbmTA3oSy5DABSQlP2/rZXZ9BR2mjejHkksNwbOjwX73jzxPvH87l8AOh433Gt+ZqFlTeUN9SDagDgc/nx/vGUdpnCnJIXn0fiB+0PJi0X73jrdfvso7Mf9R8trNQZdGfkZ3ZG7yRZ15uvG6dUW1W1qtp6db2iS9HW36YeUA9qBrV6LYfJ8XPzk/hKMkWZfm5+ZLHJS4E9udjVT7Crd3dxb89qZ9FZABB0POhx12PL6+fPmN+U0QQAGp2Gn8vvHu6m9JWR2bbcnlws9RNkdchqYl32WmbVOgA8efvk/qv7AMCis5KDkyntpdFpcu7mJP+SPIFz2pOLpd5SnS9pKLExpeRhSeTsSABYH74+X5ZPBgV5gijvqAheRKBHoI+rD4/L47K4TDpzWDv8ZvCNoktR3Vp9vvF8+0D72Avak4ulHsFSj6B4BMUjKB5B8QiKR1A8guIRFI+geATFo3gExSMoHkHxCIpHUDyC4hEUj6B45HPmL9so2ZKs94sNAAAAAElFTkSuQmCC'> <script> - var allowedScriptRan = true; + setup({ explicit_done: true }); + + test(function() { + assert_true(window.cspPositiveTest); + }, "Allows scripts from the same host."); </script> <div id='log'></div> - <script async defer src='../support/checkReport.sub.js?reportExists=false'></script> + <script> + var script = document.createElement('script'); + script.src = '../support/checkReport.sub.js?reportExists=false'; + script.async = true; + script.defer = true; + script.addEventListener('load', function() { + done(); + }); + document.body.appendChild(script); + </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/positiveTest.js b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/positiveTest.js index 63c9991..15053e0 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/positiveTest.js +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/positiveTest.js
@@ -1,6 +1 @@ -onload = function() { - test(function() { - assert_true(true, 'Script ran.')}, - "Allows scripts from the same host." - ); -} +window.cspPositiveTest = true;
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting/report-only-in-meta.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting/report-only-in-meta.sub.html index 04b9688..574c218 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting/report-only-in-meta.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting/report-only-in-meta.sub.html
@@ -34,6 +34,12 @@ script.defer = true; script.src = '../support/checkReport.sub.js?reportExists=false' document.body.appendChild(script); + + // Immediately declare a test so that the harness does not infer + // completion if the image loads before the script. + var checkReportTest = async_test("checkReport tests loaded"); + script.onload = checkReportTest.step_func_done(); + script.onerror = checkReportTest.unreached_func(); }); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting/report-uri-from-child-frame.html b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting/report-uri-from-child-frame.html index 92b1e1be..1be49619 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting/report-uri-from-child-frame.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting/report-uri-from-child-frame.html
@@ -8,8 +8,6 @@ </head> <body> <script nonce="abc"> - var t1 = async_test("Check that we received a message from the child frame"); - window.onmessage = function(e) { if (e.data == 'cookie set') { var s = document.createElement('script'); @@ -17,8 +15,6 @@ s.defer = true; s.src = '../support/checkReport.sub.js?reportField=violated-directive&reportValue=script-src%20%27self%27%20%27nonce-abc%27&reportCookieName=generate-csp-report'; document.body.appendChild(s); - - t1.done(); } } </script>
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/script-src/support/worker-importscripts.js b/third_party/blink/web_tests/external/wpt/content-security-policy/script-src/support/worker-importscripts.js index 0204de32..0ae53e78 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/script-src/support/worker-importscripts.js +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/script-src/support/worker-importscripts.js
@@ -1,6 +1,5 @@ try { importScripts("/content-security-policy/support/post-message.js"); - postMessage("importScripts allowed"); } catch (e) { postMessage("importScripts blocked"); }
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html index 7fdd5f6..7c95f47 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html
@@ -8,11 +8,21 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> + setup({ explicit_done: true }); + var t = async_test("Test that violation report event was fired"); window.addEventListener("securitypolicyviolation", t.step_func_done(function(e) { assert_equals(e.violatedDirective, "style-src"); })); window.onload = function() { + try { + runTests(); + } finally { + done(); + } + }; + + function runTests() { window.nodes = document.getElementById('nodes'); window.node1 = document.getElementById('node1'); window.node1.style.background = "yellow"; @@ -101,7 +111,7 @@ test(function() { assert_equals(ops.id, clonedOps.id) }); - }; + } </script> </head>
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-large-image.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-large-image.html deleted file mode 100644 index e907452..0000000 --- a/third_party/blink/web_tests/external/wpt/element-timing/observe-large-image.html +++ /dev/null
@@ -1,50 +0,0 @@ -<!DOCTYPE HTML> -<meta charset=utf-8> -<title>Element Timing: observe large elements</title> -<body> -<style> -body { - margin: 0; -} -</style> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="resources/element-timing-helpers.js"></script> -<script> - let beforeRender; - let img; - async_test(function (t) { - if (!window.PerformanceElementTiming) { - assert_unreached("PerformanceElementTiming is not implemented"); - } - const observer = new PerformanceObserver( - t.step_func_done(function(entryList) { - assert_equals(entryList.getEntries().length, 1); - const entry = entryList.getEntries()[0]; - const index = window.location.href.lastIndexOf('/'); - const pathname = window.location.href.substring(0, index) + - '/resources/square20.jpg'; - checkElement(entry, pathname, '', 'large_one', beforeRender, img); - // Assume viewport hasn't changed, so the element occupies all of it. - checkRect(entry, - [0, document.documentElement.clientWidth, 0, document.documentElement.clientHeight]); - checkNaturalSize(entry, 20, 20); - }) - ); - observer.observe({entryTypes: ['element']}); - // We add the image during onload to be sure that the observer is registered - // in time for it to observe the element timing. - window.onload = () => { - // Add an image setting width and height equal to viewport. - img = document.createElement('img'); - img.src = 'resources/square20.jpg'; - img.width = document.documentElement.clientWidth; - img.height = document.documentElement.clientHeight; - img.setAttribute('id', 'large_one'); - document.body.appendChild(img); - beforeRender = performance.now(); - }; - }, 'Large img element is observable.'); -</script> - -</body>
diff --git a/third_party/blink/web_tests/external/wpt/tools/serve/serve.py b/third_party/blink/web_tests/external/wpt/tools/serve/serve.py index 1fc61747..4563493 100644 --- a/third_party/blink/web_tests/external/wpt/tools/serve/serve.py +++ b/third_party/blink/web_tests/external/wpt/tools/serve/serve.py
@@ -8,6 +8,7 @@ import logging import os import platform +import signal import socket import sys import threading @@ -841,12 +842,18 @@ def run(**kwargs): + received_signal = threading.Event() + with build_config(os.path.join(repo_root, "config.json"), **kwargs) as config: global logger logger = config.logger set_logger(logger) + def handle_signal(signum, frame): + logger.debug("Received signal %s. Shutting down.", signum) + received_signal.set() + bind_address = config["bind_address"] if kwargs.get("alias_file"): @@ -868,20 +875,19 @@ with stash.StashServer(stash_address, authkey=str(uuid.uuid4())): servers = start(config, build_routes(config["aliases"]), **kwargs) + signal.signal(signal.SIGTERM, handle_signal) + signal.signal(signal.SIGINT, handle_signal) - try: - while all(item.is_alive() for item in iter_procs(servers)): - for item in iter_procs(servers): - item.join(1) - exited = [item for item in iter_procs(servers) if not item.is_alive()] - subject = "subprocess" if len(exited) == 1 else "subprocesses" - - logger.info("%s %s exited:" % (len(exited), subject)) - + while all(item.is_alive() for item in iter_procs(servers)) and not received_signal.is_set(): for item in iter_procs(servers): - logger.info("Status of %s:\t%s" % (item.name, "running" if item.is_alive() else "not running")) - except KeyboardInterrupt: - logger.info("Shutting down") + item.join(1) + exited = [item for item in iter_procs(servers) if not item.is_alive()] + subject = "subprocess" if len(exited) == 1 else "subprocesses" + + logger.info("%s %s exited:" % (len(exited), subject)) + + for item in iter_procs(servers): + logger.info("Status of %s:\t%s" % (item.name, "running" if item.is_alive() else "not running")) def main():
diff --git a/third_party/blink/web_tests/xr/resources/xr-test-utils.js b/third_party/blink/web_tests/xr/resources/xr-test-utils.js index d8a64a1..7b3edd39 100644 --- a/third_party/blink/web_tests/xr/resources/xr-test-utils.js +++ b/third_party/blink/web_tests/xr/resources/xr-test-utils.js
@@ -112,6 +112,30 @@ return out; } +function assert_points_approx_equal(actual, expected, epsilon = FLOAT_EPSILON, message = '') { + if (expected == null && actual == null) { + return; + } + + assert_not_equals(expected, null); + assert_not_equals(actual, null); + + let mismatched_component = null; + for (const v of ['x', 'y', 'z', 'w']) { + if (Math.abs(expected[v] - actual[v]) > epsilon) { + mismatched_component = v; + break; + } + } + + if (mismatched_component !== null) { + let error_message = message ? message + '\n' : 'Point comparison failed.\n'; + error_message += ` Expected: {x: ${expected.x}, y: ${expected.y}, z: ${expected.z}, w: ${expected.w}}\n`; + error_message += ` Actual: {x: ${actual.x}, y: ${actual.y}, z: ${actual.z}, w: ${actual.w}}\n`; + error_message += ` Difference in component ${mismatched_component} exceeded the given epsilon.\n`; + assert_approx_equals(actual[mismatched_component], expected[mismatched_component], epsilon, error_message); + } +} function assert_matrices_approx_equal( matA, matB, epsilon = FLOAT_EPSILON, message = '') {
diff --git a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html b/third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html new file mode 100644 index 0000000..fe5005d --- /dev/null +++ b/third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html
@@ -0,0 +1,243 @@ +<!DOCTYPE html> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> +<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> +<script src="../external/wpt/resources/chromium/webxr-test.js"></script> +<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> +<script src="../xr/resources/xr-internal-device-mocking.js"></script> +<script src="../xr/resources/xr-test-utils.js"></script> +<canvas id="webgl-canvas"></canvas> + +<script> + +// Can't go in external WPT tests because this test uses MockXRInputSource which +// is not available there. +const testName = "Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry."; +const fakeDeviceInitParams = { supportsImmersive: true }; +const requestSessionModes = ['immersive-vr']; + +function testFunction(session, t, fakeDeviceController) { + // Session must have a baseLayer or frame requests will be ignored. + session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); + + const INITIAL_VIEW_MATRIX = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 1, 2, 3, 1, + ]; + const INITIAL_GRIP_MATRIX = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 1, 2, 3, 1, + ]; + const LOCAL_POINTER_OFFSET = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0.01, 0.02, 0.03, 1, + ]; + + const STAGE_TRANSFORM = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0.1, 0.2, 0.3, 1, + ]; + + fakeDeviceController.setStageTransform(STAGE_TRANSFORM); + fakeDeviceController.setStageSize(2.0, 3.0); + fakeDeviceController.setXRPresentationFrameData(IDENTITY_MATRIX, [{ + eye:"left", + projectionMatrix: VALID_PROJECTION_MATRIX, + viewMatrix: INITIAL_VIEW_MATRIX, + }, { + eye:"right", + projectionMatrix: VALID_PROJECTION_MATRIX, + viewMatrix: INITIAL_VIEW_MATRIX, + }]); + + let input_source = new MockXRInputSource(); + input_source.targetRayMode = "tracked-pointer"; + input_source.handedness = "right"; + input_source.grip = INITIAL_GRIP_MATRIX; + input_source.pointerOffset = LOCAL_POINTER_OFFSET; + fakeDeviceController.addInputSource(input_source); + + return new Promise((resolve, reject) => { + session.requestAnimationFrame((time, frame) => { + let input_source = session.inputSources[0]; + + session.requestReferenceSpace('bounded-floor').then((referenceSpace) => { + + function CheckState( + reference_space, + expected_view_matrix, + expected_grip_matrix, + expected_ray_matrix, + expected_bounds_geometry + ) { + let pose = frame.getViewerPose(reference_space); + let grip_pose = frame.getPose(input_source.gripSpace, reference_space); + let input_pose = frame.getPose(input_source.targetRaySpace, reference_space); + + let view_matrix = pose.views[0].transform.inverse.matrix; + let grip_matrix = grip_pose.transform.matrix; + let ray_matrix = input_pose.transform.matrix; + + assert_matrices_approx_equal(expected_view_matrix, view_matrix); + assert_matrices_approx_equal(expected_grip_matrix, grip_matrix); + assert_matrices_approx_equal(expected_ray_matrix, ray_matrix); + + assert_equals(reference_space.boundsGeometry.length, expected_bounds_geometry.length); + for (var i = 0; i < reference_space.boundsGeometry.length; ++i) { + assert_points_approx_equal(reference_space.boundsGeometry[i], expected_bounds_geometry[i]); + } + } + + const EXPECTED_VIEW_MATRIX_1 = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + -0.1, -0.2, -0.3, 1, + ]; + const EXPECTED_GRIP_MATRIX_1 = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 1.1, 2.2, 3.3, 1, + ]; + const EXPECTED_RAY_MATRIX_1 = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 1.11, 2.22, 3.33, 1, + ]; + + const EXPECTED_BOUNDS_GEOMETRY_1 = [ + {x: 1, y: 0, z: -1.5, w: 1}, + {x: 1, y: 0, z: 1.5, w: 1}, + {x: -1, y: 0, z: 1.5, w: 1}, + {x: -1, y: 0, z: -1.5, w: 1}, + ]; + + // Check state after initialization + CheckState( + referenceSpace, + EXPECTED_VIEW_MATRIX_1, + EXPECTED_GRIP_MATRIX_1, + EXPECTED_RAY_MATRIX_1, + EXPECTED_BOUNDS_GEOMETRY_1 + ); + + const RADIANS_90D = Math.PI / 2; + + // Perform arbitrary transformation to reference space originOffset + const new_position1 = { + x: 10, // Translate 10 units along the x-axis + y: -3, // Translate -3 units along the y-axis + z: 5, // Translate 5 units along the z-axis + }; + const new_orientation1 = { + x: Math.sin(RADIANS_90D / 2), // Rotate 90 degrees around the x-axis + y: 0, + z: 0, + w: Math.cos(RADIANS_90D / 2), + }; + referenceSpace = referenceSpace.getOffsetReferenceSpace(new XRRigidTransform(new_position1, new_orientation1)); + + const EXPECTED_VIEW_MATRIX_2 = [ + 1, 0, 0, 0, + 0, 0, 1, 0, + 0, -1, 0, 0, + 9.9, -3.2, 4.7, 1, + ]; + const EXPECTED_GRIP_MATRIX_2 = [ + 1, 0, 0, 0, + 0, 0, -1, 0, + 0, 1, 0, 0, + -8.9, -1.7, -5.2, 1, + ]; + const EXPECTED_RAY_MATRIX_2 = [ + 1, 0, 0, 0, + 0, 0, -1, 0, + 0, 1, 0, 0, + -8.89, -1.67, -5.22, 1, + ]; + + const EXPECTED_BOUNDS_GEOMETRY_2 = [ + {x: -9, y: -6.5, z: -3, w: 1}, + {x: -9, y: -3.5, z: -3, w: 1}, + {x: -11, y: -3.5, z: -3, w: 1}, + {x: -11, y: -6.5, z: -3, w: 1}, + ]; + + // Check state after transformation + CheckState( + referenceSpace, + EXPECTED_VIEW_MATRIX_2, + EXPECTED_GRIP_MATRIX_2, + EXPECTED_RAY_MATRIX_2, + EXPECTED_BOUNDS_GEOMETRY_2 + ); + + // Perform arbitrary transformation to reference space originOffset + const new_position2 = { + x: 5, // Translate 5 units along the x-axis + y: 2, // Translate 2 units along the y-axis + z: 0, + }; + const new_orientation2 = { + x: 0, + y: Math.sin(RADIANS_90D / 2), // Rotate 90 degrees about the y-axis + z: 0, + w: Math.cos(RADIANS_90D / 2), + }; + referenceSpace = referenceSpace.getOffsetReferenceSpace(new XRRigidTransform(new_position2, new_orientation2)); + + const EXPECTED_VIEW_MATRIX_3 = [ + 0, 1, 0, 0, + 0, 0, 1, 0, + 1, 0, 0, 0, + 14.9, -3.2, 6.7, 1, + ]; + const EXPECTED_GRIP_MATRIX_3 = [ + 0, 0, 1, 0, + 1, 0, 0, 0, + 0, 1, 0, 0, + 5.2, -3.7, -13.9, 1, + ]; + const EXPECTED_RAY_MATRIX_3 = [ + 0, 0, 1, 0, + 1, 0, 0, 0, + 0, 1, 0, 0, + 5.22, -3.67, -13.89, 1, + ]; + + const EXPECTED_BOUNDS_GEOMETRY_3 = [ + {x: 3, y: -8.5, z: -14, w: 1}, + {x: 3, y: -5.5, z: -14, w: 1}, + {x: 3, y: -5.5, z: -16, w: 1}, + {x: 3, y: -8.5, z: -16, w: 1}, + ]; + + // Check state after transformation + CheckState( + referenceSpace, + EXPECTED_VIEW_MATRIX_3, + EXPECTED_GRIP_MATRIX_3, + EXPECTED_RAY_MATRIX_3, + EXPECTED_BOUNDS_GEOMETRY_3 + ); + + resolve(); + }); + }); + }); +}; + +xr_session_promise_test(testFunction, fakeDeviceInitParams, requestSessionModes, testName); + +</script>
diff --git a/third_party/closure_compiler/closure_args.gni b/third_party/closure_compiler/closure_args.gni index 79a3b37..eac6aa9 100644 --- a/third_party/closure_compiler/closure_args.gni +++ b/third_party/closure_compiler/closure_args.gni
@@ -24,6 +24,7 @@ "jscomp_error=externsValidation", "jscomp_error=globalThis", "jscomp_error=invalidCasts", + "jscomp_error=misplacedTypeAnnotation", "jscomp_error=missingProperties", "jscomp_error=missingReturn", "jscomp_error=nonStandardJsDocs",
diff --git a/third_party/grpc/BUILD.gn b/third_party/grpc/BUILD.gn index e8e92388..fd42aeb 100644 --- a/third_party/grpc/BUILD.gn +++ b/third_party/grpc/BUILD.gn
@@ -18,7 +18,6 @@ cflags = [ "-Wno-implicit-fallthrough", "-Wno-constant-conversion", - "-fno-sanitize=cfi-derived-cast,cfi-unrelated-cast", ] defines = [ "GRPC_ARES=0" ] }
diff --git a/third_party/inspector_protocol/README.chromium b/third_party/inspector_protocol/README.chromium index 386a859..f9f04e9d 100644 --- a/third_party/inspector_protocol/README.chromium +++ b/third_party/inspector_protocol/README.chromium
@@ -2,7 +2,7 @@ Short Name: inspector_protocol URL: https://chromium.googlesource.com/deps/inspector_protocol/ Version: 0 -Revision: 91eb1c8784ab3d88ca1e327ffa727d922dd2ce70 +Revision: 83b1154a9661d22bba9a368d368214cc20880419 License: BSD License File: LICENSE Security Critical: yes
diff --git a/third_party/inspector_protocol/code_generator.py b/third_party/inspector_protocol/code_generator.py index b6e447d..9382f01 100755 --- a/third_party/inspector_protocol/code_generator.py +++ b/third_party/inspector_protocol/code_generator.py
@@ -636,7 +636,6 @@ "Object_h.template", "ValueConversions_h.template", "Maybe_h.template", - "Array_h.template", "DispatcherBase_h.template", "Parser_h.template", "encoding_h.template",
diff --git a/third_party/inspector_protocol/inspector_protocol.gni b/third_party/inspector_protocol/inspector_protocol.gni index d612fb6a..3e93452 100644 --- a/third_party/inspector_protocol/inspector_protocol.gni +++ b/third_party/inspector_protocol/inspector_protocol.gni
@@ -36,7 +36,6 @@ "$inspector_protocol_dir/lib/encoding_h.template", "$inspector_protocol_dir/lib/encoding_cpp.template", "$inspector_protocol_dir/lib/Allocator_h.template", - "$inspector_protocol_dir/lib/Array_h.template", "$inspector_protocol_dir/lib/DispatcherBase_cpp.template", "$inspector_protocol_dir/lib/DispatcherBase_h.template", "$inspector_protocol_dir/lib/ErrorSupport_cpp.template",
diff --git a/third_party/inspector_protocol/inspector_protocol.gypi b/third_party/inspector_protocol/inspector_protocol.gypi index d614474..c11386d 100644 --- a/third_party/inspector_protocol/inspector_protocol.gypi +++ b/third_party/inspector_protocol/inspector_protocol.gypi
@@ -8,7 +8,6 @@ 'lib/encoding_h.template', 'lib/encoding_cpp.template', 'lib/Allocator_h.template', - 'lib/Array_h.template', 'lib/DispatcherBase_cpp.template', 'lib/DispatcherBase_h.template', 'lib/ErrorSupport_cpp.template',
diff --git a/third_party/inspector_protocol/lib/Array_h.template b/third_party/inspector_protocol/lib/Array_h.template deleted file mode 100644 index c420a0f..0000000 --- a/third_party/inspector_protocol/lib/Array_h.template +++ /dev/null
@@ -1,138 +0,0 @@ -// This file is generated by Array_h.template. - -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef {{"_".join(config.protocol.namespace)}}_Array_h -#define {{"_".join(config.protocol.namespace)}}_Array_h - -//#include "ErrorSupport.h" -//#include "Forward.h" -//#include "ValueConversions.h" -//#include "Values.h" - -{% for namespace in config.protocol.namespace %} -namespace {{namespace}} { -{% endfor %} - -template<typename T> -class Array { -public: - static std::unique_ptr<Array<T>> create() - { - return std::unique_ptr<Array<T>>(new Array<T>()); - } - - static std::unique_ptr<Array<T>> fromValue(protocol::Value* value, ErrorSupport* errors) - { - protocol::ListValue* array = ListValue::cast(value); - if (!array) { - errors->addError("array expected"); - return nullptr; - } - std::unique_ptr<Array<T>> result(new Array<T>()); - errors->push(); - for (size_t i = 0; i < array->size(); ++i) { - errors->setName(StringUtil::fromInteger(i)); - std::unique_ptr<T> item = ValueConversions<T>::fromValue(array->at(i), errors); - result->m_vector.push_back(std::move(item)); - } - errors->pop(); - if (errors->hasErrors()) - return nullptr; - return result; - } - - void addItem(std::unique_ptr<T> value) - { - m_vector.push_back(std::move(value)); - } - - size_t length() - { - return m_vector.size(); - } - - T* get(size_t index) - { - return m_vector[index].get(); - } - - std::unique_ptr<protocol::ListValue> toValue() - { - std::unique_ptr<protocol::ListValue> result = ListValue::create(); - for (auto& item : m_vector) - result->pushValue(ValueConversions<T>::toValue(item)); - return result; - } - -private: - std::vector<std::unique_ptr<T>> m_vector; -}; - -template<typename T> -class ArrayBase { -public: - static std::unique_ptr<Array<T>> create() - { - return std::unique_ptr<Array<T>>(new Array<T>()); - } - - static std::unique_ptr<Array<T>> fromValue(protocol::Value* value, ErrorSupport* errors) - { - protocol::ListValue* array = ListValue::cast(value); - if (!array) { - errors->addError("array expected"); - return nullptr; - } - errors->push(); - std::unique_ptr<Array<T>> result(new Array<T>()); - for (size_t i = 0; i < array->size(); ++i) { - errors->setName(StringUtil::fromInteger(i)); - T item = ValueConversions<T>::fromValue(array->at(i), errors); - result->m_vector.push_back(item); - } - errors->pop(); - if (errors->hasErrors()) - return nullptr; - return result; - } - - void addItem(const T& value) - { - m_vector.push_back(value); - } - - size_t length() - { - return m_vector.size(); - } - - T get(size_t index) - { - return m_vector[index]; - } - - std::unique_ptr<protocol::ListValue> toValue() - { - std::unique_ptr<protocol::ListValue> result = ListValue::create(); - for (auto& item : m_vector) - result->pushValue(ValueConversions<T>::toValue(item)); - return result; - } - -private: - std::vector<T> m_vector; -}; - -template<> class Array<String> : public ArrayBase<String> {}; -template<> class Array<int> : public ArrayBase<int> {}; -template<> class Array<double> : public ArrayBase<double> {}; -template<> class Array<bool> : public ArrayBase<bool> {}; - -{% for namespace in config.protocol.namespace %} -} // namespace {{namespace}} -{% endfor %} - -#endif // !defined({{"_".join(config.protocol.namespace)}}_Array_h)
diff --git a/third_party/inspector_protocol/lib/Forward_h.template b/third_party/inspector_protocol/lib/Forward_h.template index 746ba20b..a6c4b12f 100644 --- a/third_party/inspector_protocol/lib/Forward_h.template +++ b/third_party/inspector_protocol/lib/Forward_h.template
@@ -22,7 +22,6 @@ namespace {{namespace}} { {% endfor %} -template<typename T> class Array; class DictionaryValue; class DispatchResponse; class ErrorSupport; @@ -35,6 +34,26 @@ class UberDispatcher; class Value; +namespace detail { +template <typename T> +struct ArrayTypedef { typedef std::vector<std::unique_ptr<T>> type; }; + +template <> +struct ArrayTypedef<String> { typedef std::vector<String> type; }; + +template <> +struct ArrayTypedef<int> { typedef std::vector<int> type; }; + +template <> +struct ArrayTypedef<double> { typedef std::vector<double> type; }; + +template <> +struct ArrayTypedef<bool> { typedef std::vector<bool> type; }; +} // namespace detail + +template <typename T> +using Array = typename detail::ArrayTypedef<T>::type; + {% for namespace in config.protocol.namespace %} } // namespace {{namespace}} {% endfor %}
diff --git a/third_party/inspector_protocol/lib/ValueConversions_h.template b/third_party/inspector_protocol/lib/ValueConversions_h.template index 2ee5b72..63baf68 100644 --- a/third_party/inspector_protocol/lib/ValueConversions_h.template +++ b/third_party/inspector_protocol/lib/ValueConversions_h.template
@@ -128,6 +128,72 @@ } }; +template<typename T> +struct ValueConversions<std::vector<std::unique_ptr<T>>> { + static std::unique_ptr<std::vector<std::unique_ptr<T>>> fromValue(protocol::Value* value, ErrorSupport* errors) { + protocol::ListValue* array = ListValue::cast(value); + if (!array) { + errors->addError("array expected"); + return nullptr; + } + errors->push(); + std::unique_ptr<std::vector<std::unique_ptr<T>>> result( + new std::vector<std::unique_ptr<T>>()); + result->reserve(array->size()); + for (size_t i = 0; i < array->size(); ++i) { + errors->setName(StringUtil::fromInteger(i)); + auto item = ValueConversions<T>::fromValue(array->at(i), errors); + result->emplace_back(std::move(item)); + } + errors->pop(); + if (errors->hasErrors()) + return nullptr; + return result; + } + + static std::unique_ptr<protocol::ListValue> toValue(std::vector<std::unique_ptr<T>>* v) + { + std::unique_ptr<protocol::ListValue> result = ListValue::create(); + result->reserve(v->size()); + for (auto& item : *v) + result->pushValue(ValueConversions<T>::toValue(item.get())); + return result; + } + +}; + +template<typename T> +struct ValueConversions<std::vector<T>> { + static std::unique_ptr<std::vector<T>> fromValue(protocol::Value* value, ErrorSupport* errors) { + protocol::ListValue* array = ListValue::cast(value); + if (!array) { + errors->addError("array expected"); + return nullptr; + } + errors->push(); + std::unique_ptr<std::vector<T>> result(new std::vector<T>()); + result->reserve(array->size()); + for (size_t i = 0; i < array->size(); ++i) { + errors->setName(StringUtil::fromInteger(i)); + auto item = ValueConversions<T>::fromValue(array->at(i), errors); + result->emplace_back(std::move(item)); + } + errors->pop(); + if (errors->hasErrors()) + return nullptr; + return result; + } + + static std::unique_ptr<protocol::ListValue> toValue(std::vector<T>* v) + { + std::unique_ptr<protocol::ListValue> result = ListValue::create(); + result->reserve(v->size()); + for (auto& item : *v) + result->pushValue(ValueConversions<T>::toValue(item)); + return result; + } +}; + template<> struct ValueConversions<Value> { static std::unique_ptr<Value> fromValue(protocol::Value* value, ErrorSupport* errors)
diff --git a/third_party/inspector_protocol/lib/Values_h.template b/third_party/inspector_protocol/lib/Values_h.template index 4a2e58f4..4d6fde0 100644 --- a/third_party/inspector_protocol/lib/Values_h.template +++ b/third_party/inspector_protocol/lib/Values_h.template
@@ -271,6 +271,7 @@ Value* at(size_t index); size_t size() const { return m_data.size(); } + void reserve(size_t capacity) { m_data.reserve(capacity); } private: ListValue();
diff --git a/third_party/webxr_test_pages/webxr-samples/js/hit-test.js b/third_party/webxr_test_pages/webxr-samples/js/hit-test.js index e88a69d..8f6b954 100644 --- a/third_party/webxr_test_pages/webxr-samples/js/hit-test.js +++ b/third_party/webxr_test_pages/webxr-samples/js/hit-test.js
@@ -175,11 +175,18 @@ // multiple planes hit test export function hitTest(ray, planes, frameOfReference) { - const hit_test_results = planes.map(plane => hitTestPlane(ray, plane, frameOfReference)); + let hit_test_results = []; + planes.forEach(plane => { + let result = hitTestPlane(ray, plane, frameOfReference); + if(result) { + // throw away results with no intersection with plane + hit_test_results.push(result); + } + }); - // throw away all strange results (no intersection with plane, ray lies on plane) + // throw away all strange results (ray lies on plane) let hit_test_results_with_points = hit_test_results.filter( - maybe_plane => maybe_plane && typeof maybe_plane.point != "undefined"); + maybe_plane => typeof maybe_plane.point != "undefined"); // sort results by distance hit_test_results_with_points.sort((l, r) => l.distance - r.distance);
diff --git a/third_party/webxr_test_pages/webxr-samples/proposals/index.html b/third_party/webxr_test_pages/webxr-samples/proposals/index.html index d1df4fc..2f9d0af 100644 --- a/third_party/webxr_test_pages/webxr-samples/proposals/index.html +++ b/third_party/webxr_test_pages/webxr-samples/proposals/index.html
@@ -110,9 +110,9 @@ path: 'phone-ar-hit-test.html', description: 'Demonstrates using the Hit Test API to place virtual objects on real-world surfaces.' }, - { title: 'AR Plane Detection & Hit-Test', category: 'Phone AR', + { title: 'AR Plane Detection', category: 'Phone AR', path: 'phone-ar-plane-detection.html', - description: 'Demonstrates using the Plane Detection feature, including implementation of' + + description: 'Demonstrates using the Plane Detection feature, including implementation of ' + 'synchronous hit test in JavaScript leveraging obtained plane data.' }, ];
diff --git a/third_party/webxr_test_pages/webxr-samples/proposals/phone-ar-plane-detection.html b/third_party/webxr_test_pages/webxr-samples/proposals/phone-ar-plane-detection.html index 5fcbee3..073e3b2 100644 --- a/third_party/webxr_test_pages/webxr-samples/proposals/phone-ar-plane-detection.html +++ b/third_party/webxr_test_pages/webxr-samples/proposals/phone-ar-plane-detection.html
@@ -29,7 +29,7 @@ <!-- Origin Trial Token, feature = WebXR Device API, origin = https://immersive-web.github.io, expires = 2018-08-28 --> <meta http-equiv="origin-trial" data-feature="WebXR Device API" data-expires="2018-08-28" content="AnNpu7ceXvLew05ccD8Zr1OZsdZiB2hLQKK82kTTMDwF7oRKtP3QEJ4RzkeHrmB8Sq0vSV6ZNmszpBCZ0I8p9gAAAABceyJvcmlnaW4iOiJodHRwczovL2ltbWVyc2l2ZS13ZWIuZ2l0aHViLmlvOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZSIsImV4cGlyeSI6MTUzNTQxNDQwMH0="> - <title>AR Hit Test</title> + <title>AR Plane Detection</title> <link href='../css/common.css' rel='stylesheet'></link> @@ -44,7 +44,10 @@ <body> <header> <details open> - <summary>AR Synchronous Hit Test</summary> + <summary>AR Plane Detection</summary> + This sample demonstrates using the Plane Detection feature, + including implementation of synchronous hit test in JavaScript + leveraging obtained plane data. <p> <input id="useReticle" type="checkbox" checked> <label for="useReticle">Use reticle for placement</label><br/> @@ -409,7 +412,8 @@ } } - let all_planes = new Set(); + // Set with all planes detected in a previous frame. + let all_previous_planes = new Set(); // Called every time a XRSession requests that a new frame be drawn. async function onXRFrame(t, frame) { @@ -417,33 +421,38 @@ let session = frame.session; let pose = frame.getViewerPose(xrRefSpace); - let previous_planes = new Set(all_planes); let detected_planes = frame.worldInformation.detectedPlanes; + + // Check if any of the old planes is no longer present in detected planes set. + // If it's no longer present, it was removed - clean up after. + all_previous_planes.forEach(plane => { + if(!detected_planes.has(plane)) { + console.log("Removing plane, id:", plane.id); + + let index = all_plane_origins.findIndex( + element => element === plane.scene_node.origins); + if(index != -1){ + all_plane_origins.splice(index, 1); + } + + index = all_extended_planes.findIndex( + element => element === plane.extended_polygon_node); + if(index != -1){ + all_extended_planes.splice(index, 1); + } + + scene.removeNode(plane.scene_node); + } + }); + + // Store currently detected planes to check against them in subsequent frame. + all_previous_planes = detected_planes; + + // Process all currently detected planes. detected_planes.forEach(plane => { addPlaneToScene(plane, t); - if(previous_planes.has(plane)) { - previous_planes.delete(plane); - } }); - previous_planes.forEach(plane => { - console.log("Removing plane, id:", plane.id); - - let index = all_plane_origins.findIndex(element => element === plane.scene_node.origins); - if(index != -1){ - all_plane_origins.splice(index, 1); - } - - index = all_extended_planes.findIndex(element => element === plane.extended_polygon_node); - if(index != -1){ - all_extended_planes.splice(index, 1); - } - - scene.removeNode(plane.scene_node); - }); - - all_planes = new Set(detected_planes); - // If requested, use the pose to cast a reticle into the scene using a // continuous hit test. For the moment we're just using the flower // as the "reticle".
diff --git a/tools/cfi/blacklist.txt b/tools/cfi/blacklist.txt index 9cf2f22a..0adc976 100644 --- a/tools/cfi/blacklist.txt +++ b/tools/cfi/blacklist.txt
@@ -29,6 +29,9 @@ # CAtlArray<T> casts to uninitialized T*. src:*atlcoll.h +# https://github.com/grpc/grpc/issues/19375 +src:*third_party/grpc/src/src/core/lib/gprpp/inlined_vector.h + ############################################################################# # Base class's constructor accesses a derived class. @@ -49,7 +52,7 @@ fun:*DatabaseContext*contextDestroyed* # FIXME: Cannot handle template function LifecycleObserver<>::setContext, -# so exclude source file for now. +# so exclude source file for now. src:*lifecycle_observer.h* #############################################################################
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index ff4cbd1..8198823 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -474,7 +474,7 @@ 'WebKit Linux ASAN': 'asan_lsan_release_bot', 'WebKit Linux Leak': 'release_bot', 'WebKit Linux MSAN': 'msan_release_bot', - 'android-asan': 'android_clang_asan_debug_bot_arm64', + 'android-asan': 'android_clang_asan_debug_bot', 'win-asan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release', }, @@ -898,10 +898,6 @@ 'android', 'clang', 'asan', 'debug_bot', 'strip_debug_info', ], - 'android_clang_asan_debug_bot_arm64': [ - 'android', 'clang', 'asan', 'debug_bot', 'arm64', - ], - 'android_clang_asan_debug_trybot_compile_only': [ 'android', 'clang', 'asan', 'debug_trybot', 'compile_only', ],
diff --git a/tools/md_browser/md_browser.py b/tools/md_browser/md_browser.py index 358a1106..39fef4f 100755 --- a/tools/md_browser/md_browser.py +++ b/tools/md_browser/md_browser.py
@@ -107,7 +107,14 @@ # some library. For now we just make accented characters turn into # underscores, just like other non-ASCII characters. + def decode_escaped_chars(regex_match): + # Python-Markdown encodes escaped sequences (ex. "\_") as "\x02 (integer + # ascii code) \x03". We decode the integer ascii code to align with Gitiles + # behavior (ex. 95 -> '_'). + return chr(int(regex_match.group(1))) + value = value.encode('ascii', 'replace') # Non-ASCII turns into '?'. + value = re.sub(u'\x02(\\d+)\x03', decode_escaped_chars, value) value = re.sub(r'[^- a-zA-Z0-9]', '_', value) # Non-alphanumerics to '_'. value = value.replace(u' ', u'-') value = re.sub(r'([-_])[-_]+', r'\1', value) # Fold hyphens and underscores.
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 49c4ab32..38b0368 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -20015,11 +20015,14 @@ </action> <action name="StatusArea_Notifications_ClearAll"> + <obsolete> + Deprecated in favour of StatusArea_Notifications_StackingBarClearAll. + </obsolete> <owner>tetsui@chromium.org</owner> <description> User removed all notifications using the bottom Clear All button in the - system menu. Note that there are two clear all buttons, and this button is - located on the bottom of the notification list. + system menu. This button, which no longer exists, was located on the bottom + of the notification list. </description> </action> @@ -20027,8 +20030,7 @@ <owner>tengs@chromium.org</owner> <description> User removed all notifications using the top Clear All button in the system - menu. Note that there are two clear all buttons, and this one is located on - the top stacking bar of the notification list. + menu. </description> </action>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index f5783a1..e883d390 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -9678,7 +9678,7 @@ <enum name="ContextMenuSaveImage"> <summary>Context menu type related to the save image option.</summary> <int value="0" label="Loaded"/> - <int value="1" label="Image was fatched LoFi"/> + <int value="1" label="(DEPRECATED in M77) Image was fatched LoFi"/> <int value="2" label="Not downloadable scheme"/> <int value="3" label="No save image option and param is not image"/> <int value="4" label="No save image option and param is image"/> @@ -58495,6 +58495,9 @@ <int value="9" label="Saved pref present for different version and country code in seed is different"/> + <int value="10" + label="Saved pref present for variations overridden country is set. + Mainly used for testing / developer."/> </enum> <enum name="VariationsResourceRequestsAllowedState">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index a548266..fc495e3d 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -132,7 +132,7 @@ </histogram> <histogram name="Accessibility.CrosChromeVoxAfterSwitchAccess" - enum="BooleanEnabled" expires_after="M77"> + enum="BooleanEnabled" expires_after="M80"> <owner>anastasi@google.com</owner> <owner>dtseng@chromium.org</owner> <summary> @@ -168,7 +168,7 @@ </histogram> <histogram name="Accessibility.CrosDictation.ToggleDictationMethod" - enum="CrosDictationToggleDictationMethod" expires_after="M77"> + enum="CrosDictationToggleDictationMethod" expires_after="M82"> <owner>anastasi@google.com</owner> <owner>dtseng@chromium.org</owner> <summary>Records how users invoke Dictation.</summary> @@ -322,7 +322,7 @@ </histogram> <histogram name="Accessibility.CrosSwitchAccessAfterChromeVox" - enum="BooleanEnabled" expires_after="M78"> + enum="BooleanEnabled" expires_after="M80"> <owner>anastasi@google.com</owner> <owner>dtseng@chromium.org</owner> <summary> @@ -18458,7 +18458,7 @@ </histogram> <histogram name="Compositing.Browser.NumActiveLayers" units="layers" - expires_after="M77"> + expires_after="2021-06-01"> <owner>paint-dev@chromium.org</owner> <summary> The number of layers in the active tree for each compositor frame. This is @@ -18467,7 +18467,7 @@ </histogram> <histogram name="Compositing.Browser.NumActivePictureLayers" units="layers" - expires_after="M77"> + expires_after="2021-06-01"> <owner>paint-dev@chromium.org</owner> <summary> The number of PictureLayers in the active tree for each compositor frame. @@ -18477,7 +18477,7 @@ </histogram> <histogram name="Compositing.Browser.NumRenderSurfaces" units="surfaces" - expires_after="M77"> + expires_after="2021-06-01"> <owner>paint-dev@chromium.org</owner> <summary> The number of render surfaces in the render surface layer list. Recorded @@ -18987,7 +18987,8 @@ </summary> </histogram> -<histogram name="Compositing.Renderer.NumActiveLayers" units="layers"> +<histogram name="Compositing.Renderer.NumActiveLayers" units="layers" + expires_after="2021-06-01"> <owner>paint-dev@chromium.org</owner> <summary> The number of layers in the active tree for each compositor frame. This is @@ -18995,7 +18996,8 @@ </summary> </histogram> -<histogram name="Compositing.Renderer.NumActivePictureLayers" units="layers"> +<histogram name="Compositing.Renderer.NumActivePictureLayers" units="layers" + expires_after="2021-06-01"> <owner>paint-dev@chromium.org</owner> <summary> The number of PictureLayers in the active tree for each compositor frame. @@ -19004,7 +19006,8 @@ </summary> </histogram> -<histogram name="Compositing.Renderer.NumRenderSurfaces" units="surfaces"> +<histogram name="Compositing.Renderer.NumRenderSurfaces" units="surfaces" + expires_after="2021-06-01"> <owner>paint-dev@chromium.org</owner> <summary> The number of render surfaces in the render surface layer list. Recorded @@ -24193,6 +24196,9 @@ <histogram name="DataReductionProxy.LoFi.TransformationType" enum="DataReductionProxyLoFiTransformationType" expires_after="M77"> + <obsolete> + Functionality removed in M77. + </obsolete> <owner>bengr@chromium.org</owner> <owner>tbansal@chromium.org</owner> <summary> @@ -30082,6 +30088,15 @@ </summary> </histogram> +<histogram name="Download.QuarantineService.ConnectionError" + enum="BooleanConnectionError" expires_after="M80"> + <owner>alewoolf@microsoft.com</owner> + <owner>pmonette@chromium.org</owner> + <summary> + Whether a connection error has happened for the QuarantineService. + </summary> +</histogram> + <histogram name="Download.ResourceHandlerBlockedPercentage" units="%" expires_after="2018-08-14"> <obsolete> @@ -46904,7 +46919,7 @@ </histogram> <histogram name="History.InMemoryURLCacheSize" units="bytes" - expires_after="M77"> + expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary> Size of on-disk cache for in-memory url index. Recorded on profile open when @@ -46912,7 +46927,7 @@ </summary> </histogram> -<histogram name="History.InMemoryURLChars" expires_after="M77"> +<histogram name="History.InMemoryURLChars" expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary> Number of items in the in-memory url index char_word_map_. Recorded on @@ -46921,7 +46936,7 @@ </summary> </histogram> -<histogram name="History.InMemoryURLHistoryItems" expires_after="M77"> +<histogram name="History.InMemoryURLHistoryItems" expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary> Number of history items in the in-memory url index. Recorded on profile open @@ -46961,7 +46976,7 @@ </summary> </histogram> -<histogram name="History.InMemoryURLWords" expires_after="M77"> +<histogram name="History.InMemoryURLWords" expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary> Number of items in in-memory url index word_map_. Recorded on profile open @@ -47625,11 +47640,17 @@ </histogram> <histogram name="Hyphenation.Open" units="ms" expires_after="M77"> + <obsolete> + Deprecated as of 06/2019. + </obsolete> <owner>kojii@chromium.org</owner> <summary>The time it takes to open a hyphenation dictionary.</summary> </histogram> <histogram name="Hyphenation.Open.File" units="ms" expires_after="M77"> + <obsolete> + Deprecated as of 06/2019. + </obsolete> <owner>kojii@chromium.org</owner> <summary>The time it takes to open a hyphenation dictionary file.</summary> </histogram> @@ -51085,8 +51106,11 @@ </summary> </histogram> -<histogram name="Keyboard.ShortcutViewer.SearchUpdateTime" units="microseconds" - expires_after="M77"> +<histogram name="Keyboard.ShortcutViewer.SearchUpdateTime" units="microseconds"> + <obsolete> + Deprecated 2019-06. Shortcut viewer has been in production for many + milestones and its performance is adequate. + </obsolete> <owner>jamescook@chromium.org</owner> <owner>msw@chromium.org</owner> <owner>wutao@chromium.org</owner> @@ -51098,6 +51122,10 @@ </histogram> <histogram name="Keyboard.ShortcutViewer.SearchUpdateTimeVisual" units="ms"> + <obsolete> + Deprecated 2019-06. Shortcut viewer has been in production for many + milestones and its performance is adequate. + </obsolete> <owner>jamescook@chromium.org</owner> <owner>msw@chromium.org</owner> <owner>wutao@chromium.org</owner> @@ -58349,7 +58377,8 @@ </summary> </histogram> -<histogram base="true" name="MediaRouter.Cast.App.Availability" units="ms"> +<histogram base="true" name="MediaRouter.Cast.App.Availability" units="ms" + expires_after="M85"> <!-- Name completed by histogram_suffixes name="MediaRouterSuccess" --> <owner>takumif@chromium.org</owner> @@ -58361,7 +58390,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Cast.Channel.ConnectResult" enum="BooleanSuccess"> +<histogram name="MediaRouter.Cast.Channel.ConnectResult" enum="BooleanSuccess" + expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Whether opening Cast channel succeeds or not. Recorded when all opening @@ -58370,7 +58400,7 @@ </histogram> <histogram name="MediaRouter.Cast.Channel.Error" - enum="MediaRouterCastChannelError"> + enum="MediaRouterCastChannelError" expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Errors encountered on a Cast channel. Recorded when a Cast channel fails to @@ -58380,7 +58410,7 @@ </histogram> <histogram name="MediaRouter.Cast.Discovery.CachedSinksAvailableCount" - units="devices" expires_after="M77"> + units="devices" expires_after="M85"> <owner>btolsch@chromium.org</owner> <summary> The number of Cast devices available from the device cache at the time of a @@ -58389,7 +58419,7 @@ </histogram> <histogram name="MediaRouter.Cast.Discovery.ConnectedDevicesCount" - units="devices" expires_after="M77"> + units="devices" expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> The number of connected Cast devices. Recorded when browser finishes @@ -58397,7 +58427,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Cast.Discovery.KnownDevicesCount" units="devices"> +<histogram name="MediaRouter.Cast.Discovery.KnownDevicesCount" units="devices" + expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> The number of known Cast devices. Recorded when browser finishes discovering @@ -58406,12 +58437,13 @@ </histogram> <histogram name="MediaRouter.Cast.Discovery.SinkSource" - enum="MediaRouterCastSinkSource" expires_after="M77"> + enum="MediaRouterCastSinkSource" expires_after="M85"> <owner>btolsch@chromium.org</owner> <summary>The source of discovery for a newly-created Cast sink.</summary> </histogram> -<histogram name="MediaRouter.Cast.Mdns.Channel.Open_Failure" units="ms"> +<histogram name="MediaRouter.Cast.Mdns.Channel.Open_Failure" units="ms" + expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Duration in milliseconds taken to fail to open a cast channel. Recorded when @@ -58419,7 +58451,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Cast.Mdns.Channel.Open_Success" units="ms"> +<histogram name="MediaRouter.Cast.Mdns.Channel.Open_Success" units="ms" + expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Duration in milliseconds taken to successfully open a cast channel. Recorded @@ -58427,7 +58460,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Dial.AvailableDevicesCount" units="devices"> +<histogram name="MediaRouter.Dial.AvailableDevicesCount" units="devices" + expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> The number of available DIAL devices. Recorded when browser finishes @@ -58436,7 +58470,7 @@ </histogram> <histogram name="MediaRouter.Dial.CreateRoute" - enum="MediaRouterDialCreateRouteResult"> + enum="MediaRouterDialCreateRouteResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -58447,7 +58481,7 @@ </histogram> <histogram name="MediaRouter.Dial.FetchAppInfo" - enum="MediaRouterDialFetchAppInfoResult"> + enum="MediaRouterDialFetchAppInfoResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -58457,7 +58491,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Dial.KnownDevicesCount" units="devices"> +<histogram name="MediaRouter.Dial.KnownDevicesCount" units="devices" + expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> The number of known DIAL devices. Recorded when browser finishes discovering @@ -58466,7 +58501,7 @@ </histogram> <histogram name="MediaRouter.Dial.ParseMessage" - enum="MediaRouterDialParseMessageResult"> + enum="MediaRouterDialParseMessageResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -58478,7 +58513,7 @@ </histogram> <histogram name="MediaRouter.Dial.ParsingError" - enum="MediaRouterDialParsingError"> + enum="MediaRouterDialParsingError" expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Error encountered while parsing DIAL device description XML text. Recorded @@ -58488,7 +58523,7 @@ </histogram> <histogram name="MediaRouter.Dial.TerminateRoute" - enum="MediaRouterDialTerminateRouteResult"> + enum="MediaRouterDialTerminateRouteResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -58499,13 +58534,13 @@ </histogram> <histogram name="MediaRouter.Icon.Click.Location" - enum="MediaRouterDialogOpenOrigin"> + enum="MediaRouterDialogOpenOrigin" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary>Location the user clicked to open the Media Router dialog.</summary> </histogram> <histogram name="MediaRouter.NetworkMonitor.ConnectionType" - enum="DiscoveryNetworkMonitorConnectionType" expires_after="M77"> + enum="DiscoveryNetworkMonitorConnectionType" expires_after="M85"> <owner>btolsch@chromium.org</owner> <summary> Network connection type reported by DiscoveryNetworkMonitor whenever it @@ -58515,7 +58550,7 @@ </histogram> <histogram name="MediaRouter.NetworkMonitor.NetworkChangeEventDelta" units="ms" - expires_after="M77"> + expires_after="M85"> <owner>btolsch@chromium.org</owner> <summary> Time between network change events reported by DiscoveryNetworkMonitor. @@ -58523,7 +58558,7 @@ </histogram> <histogram name="MediaRouter.PresentationRequest.AvailabilityUrlType" - enum="PresentationUrlType" expires_after="M77"> + enum="PresentationUrlType" expires_after="M85"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -58533,7 +58568,7 @@ </histogram> <histogram name="MediaRouter.Provider.CreateRoute.Result" - enum="MediaRouteProviderResult"> + enum="MediaRouteProviderResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -58544,7 +58579,7 @@ </histogram> <histogram name="MediaRouter.Provider.CreateRoute.Result.WiredDisplay" - enum="MediaRouteProviderResult" expires_after="M78"> + enum="MediaRouteProviderResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Result of a request to the wired display MediaRouteProvider to create a @@ -58553,7 +58588,7 @@ </histogram> <histogram name="MediaRouter.Provider.JoinRoute.Result" - enum="MediaRouteProviderResult"> + enum="MediaRouteProviderResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -58564,7 +58599,7 @@ </histogram> <histogram name="MediaRouter.Provider.JoinRoute.Result.WiredDisplay" - enum="MediaRouteProviderResult"> + enum="MediaRouteProviderResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Result of a request to the wired display MediaRouteProvider to join a route. @@ -58573,6 +58608,10 @@ <histogram name="MediaRouter.Provider.RouteControllerCreationOutcome" enum="BooleanSuccess" expires_after="M77"> + <obsolete> + Deprecated in M77. Route controller is specific to the old WebUI Cast + dialog, and the new Views dialog does not have it. + </obsolete> <owner>takumif@chromium.org</owner> <summary> Records whether the Media Route Provider succeeded or failed to create a @@ -58581,7 +58620,7 @@ </histogram> <histogram name="MediaRouter.Provider.TerminateRoute.Result" - enum="MediaRouteProviderResult"> + enum="MediaRouteProviderResult" expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Result of a request to the extension (or an unknown) MediaRouteProvider to @@ -58590,7 +58629,7 @@ </histogram> <histogram name="MediaRouter.Provider.TerminateRoute.Result.WiredDisplay" - enum="MediaRouteProviderResult" expires_after="M78"> + enum="MediaRouteProviderResult" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Result of a request to the wired display MediaRouteProvider to terminate a @@ -58599,7 +58638,7 @@ </histogram> <histogram name="MediaRouter.Provider.Version" enum="MediaRouteProviderVersion" - expires_after="M77"> + expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Records how the major version of the Media Router component extension @@ -58608,7 +58647,7 @@ </histogram> <histogram name="MediaRouter.Provider.WakeReason" - enum="MediaRouteProviderWakeReason"> + enum="MediaRouteProviderWakeReason" expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Reason that the Media Router woke the Media Route Provider event page. @@ -58616,7 +58655,7 @@ </histogram> <histogram name="MediaRouter.Provider.Wakeup" enum="MediaRouteProviderWakeup" - expires_after="M77"> + expires_after="M85"> <owner>mfoltz@chromium.org</owner> <summary> Records the outcome of waking the Media Router component's event page. @@ -58624,7 +58663,7 @@ </histogram> <histogram name="MediaRouter.Route.CreationOutcome" - enum="MediaRouterCreateRouteOutcome"> + enum="MediaRouterCreateRouteOutcome" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The number of times a Media Router create route response succeeds or fails. @@ -58632,7 +58671,12 @@ </summary> </histogram> -<histogram name="MediaRouter.Sink.SearchOutcome" enum="BooleanSuccess"> +<histogram name="MediaRouter.Sink.SearchOutcome" enum="BooleanSuccess" + expires_after="M77"> + <obsolete> + Deprecated in M77. Sink search is specific to the old WebUI Cast dialog, and + the new Views dialog does not have it. + </obsolete> <owner>takumif@chromium.org</owner> <summary> The outcome of querying Media Route Providers for a sink by ID. @@ -58641,7 +58685,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Sink.SelectedType" enum="MediaSinkType"> +<histogram name="MediaRouter.Sink.SelectedType" enum="MediaSinkType" + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The type of the Media Sink that media is being Cast to. Recorded each time @@ -58650,7 +58695,7 @@ </histogram> <histogram name="MediaRouter.Source.CastingSource" - enum="MediaRouterSourceTypes"> + enum="MediaRouterSourceTypes" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The source of a Media Router session. This is recorded to keep track of what @@ -58658,7 +58703,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Source.LocalFileFormat" enum="MediaContainers"> +<histogram name="MediaRouter.Source.LocalFileFormat" enum="MediaContainers" + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The file format of a local media Media Router session. This is recorded when @@ -58668,7 +58714,7 @@ </histogram> <histogram name="MediaRouter.Source.LocalFileSize" units="MB" - expires_after="M77"> + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The file size of a local media Media Router session. This is recorded when a @@ -58678,7 +58724,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Ui.Action.CloseLatency" units="ms"> +<histogram name="MediaRouter.Ui.Action.CloseLatency" units="ms" + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds taken from the user opening the Media Router dialog @@ -58687,7 +58734,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Ui.Action.StartLocal.Latency" units="ms"> +<histogram name="MediaRouter.Ui.Action.StartLocal.Latency" units="ms" + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds taken from the Media Router dialog showing the sink @@ -58697,25 +58745,26 @@ </histogram> <histogram name="MediaRouter.Ui.Action.StartLocalPosition" - enum="MediaRouterSinkPositionLabel"> + enum="MediaRouterSinkPositionLabel" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary>The index of the sink that was selected in the sink list.</summary> </histogram> <histogram name="MediaRouter.Ui.Action.StartLocalSessionSuccessful" - enum="BooleanSuccess"> + enum="BooleanSuccess" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The number of times a session was successfully started versus failed. </summary> </histogram> -<histogram name="MediaRouter.Ui.Action.StopRoute" enum="MediaRouteType"> +<histogram name="MediaRouter.Ui.Action.StopRoute" enum="MediaRouteType" + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary>The number of times a user stops different types of routes.</summary> </histogram> -<histogram name="MediaRouter.Ui.Device.Count"> +<histogram name="MediaRouter.Ui.Device.Count" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Counts the number of devices known and populated to the Media Router dialog @@ -58723,7 +58772,12 @@ </summary> </histogram> -<histogram name="MediaRouter.Ui.Dialog.LoadedWebUiRouteController" units="ms"> +<histogram name="MediaRouter.Ui.Dialog.LoadedWebUiRouteController" units="ms" + expires_after="M77"> + <obsolete> + Deprecated in M77. Route controller is specific to the old WebUI Cast + dialog, and the new Views dialog does not have it. + </obsolete> <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds it takes the WebUI route controls in the route @@ -58731,7 +58785,8 @@ </summary> </histogram> -<histogram name="MediaRouter.Ui.Dialog.LoadedWithData" units="ms"> +<histogram name="MediaRouter.Ui.Dialog.LoadedWithData" units="ms" + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds taken from the user click to open the Media Router @@ -58739,7 +58794,7 @@ </summary> </histogram> -<histogram name="MediaRouter.Ui.Dialog.Paint" units="ms"> +<histogram name="MediaRouter.Ui.Dialog.Paint" units="ms" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds taken from a user click to open the Media Router @@ -58748,7 +58803,7 @@ </histogram> <histogram name="MediaRouter.Ui.FirstAction" enum="MediaRouterUserAction" - expires_after="M77"> + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The first action taken by the user after opening the Media Router dialog. @@ -58757,6 +58812,10 @@ <histogram name="MediaRouter.Ui.InitialState" enum="MediaRouterInitialViews" expires_after="M77"> + <obsolete> + Deprecated in M77. This histogram was for tracking whether the old WebUI + Cast dialog opened in sink list view or route details view. + </obsolete> <owner>takumif@chromium.org</owner> <summary> The view that was shown when the Media Router dialog is initially opened. @@ -58764,7 +58823,7 @@ </histogram> <histogram name="MediaRouter.Ui.Navigate.SourceSelection" - enum="MediaRouterSourceTypes"> + enum="MediaRouterSourceTypes" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The number of times the user selects a specific cast source type. @@ -58772,7 +58831,7 @@ </histogram> <histogram name="MediaRouter.WiredDisplay.AvailableDevicesCount" - expires_after="M77"> + expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> The number of Media Sinks available for Casting a Presentation API URL to @@ -63551,7 +63610,7 @@ </histogram> <histogram name="NaCl.HttpStatusCodeClass.Nexe.InstalledApp" - enum="NaClHttpStatusCodeClass" expires_after="M77"> + enum="NaClHttpStatusCodeClass" expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63573,7 +63632,7 @@ </histogram> <histogram name="NaCl.LoadStatus.Plugin" enum="NaClPluginErrorCode" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63581,7 +63640,7 @@ </histogram> <histogram name="NaCl.LoadStatus.Plugin.InstalledApp" - enum="NaClPluginErrorCode" expires_after="M77"> + enum="NaClPluginErrorCode" expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63592,7 +63651,7 @@ </histogram> <histogram name="NaCl.LoadStatus.Plugin.NotInstalledApp" - enum="NaClPluginErrorCode" expires_after="M77"> + enum="NaClPluginErrorCode" expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63603,7 +63662,7 @@ </histogram> <histogram name="NaCl.LoadStatus.SelLdr" enum="NaClSelLdrErrorCode" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63611,7 +63670,7 @@ </histogram> <histogram name="NaCl.LoadStatus.SelLdr.InstalledApp" - enum="NaClSelLdrErrorCode" expires_after="M77"> + enum="NaClSelLdrErrorCode" expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63712,7 +63771,7 @@ </histogram> <histogram name="NaCl.Options.PNaCl.OptLevel" enum="PNaClOptionsOptLevelEnum" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63741,7 +63800,7 @@ </histogram> <histogram name="NaCl.Perf.PNaClLoadTime.CompileKBPerSec" units="KB/s" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63752,7 +63811,7 @@ </histogram> <histogram name="NaCl.Perf.PNaClLoadTime.CompileTime" units="ms" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63774,7 +63833,7 @@ </histogram> <histogram name="NaCl.Perf.PNaClLoadTime.LoadCompiler" units="ms" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63794,7 +63853,7 @@ </histogram> <histogram name="NaCl.Perf.PNaClLoadTime.PctCompiledWhenFullyDownloaded" - units="%" expires_after="M77"> + units="%" expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63806,7 +63865,7 @@ </histogram> <histogram name="NaCl.Perf.PNaClLoadTime.TotalUncachedKBPerSec" units="KB/s" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63818,7 +63877,7 @@ </histogram> <histogram name="NaCl.Perf.PNaClLoadTime.TotalUncachedTime" units="ms" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63843,7 +63902,7 @@ <summary>The size of the manifest file.</summary> </histogram> -<histogram name="NaCl.Perf.Size.Nexe" units="KB" expires_after="M77"> +<histogram name="NaCl.Perf.Size.Nexe" units="KB" expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63862,7 +63921,8 @@ </summary> </histogram> -<histogram name="NaCl.Perf.Size.PexeNexeSizePct" units="%" expires_after="M77"> +<histogram name="NaCl.Perf.Size.PexeNexeSizePct" units="%" + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63873,7 +63933,7 @@ </histogram> <histogram name="NaCl.Perf.Size.PNaClTranslatedNexe" units="KB" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -63995,7 +64055,7 @@ </histogram> <histogram name="NaCl.ValidationCache.Query" enum="NaClValidationCacheEnum" - expires_after="M77"> + expires_after="2019-12-31"> <owner>dschuff@chromium.org</owner> <owner>adamk@chromium.org</owner> <owner>bbudge@chromium.org</owner> @@ -64015,7 +64075,7 @@ </histogram> <histogram name="NativeAppLauncher.InstallationDetected" - enum="BooleanInstalled" expires_after="M77"> + enum="BooleanInstalled" expires_after="2019-12-31"> <owner>jif@chromium.org</owner> <summary> The number of times that Chrome detected that a request to download and @@ -85075,7 +85135,7 @@ </summary> </histogram> -<histogram name="Omnibox.PasteAndGo" units="count" expires_after="2019-07-30"> +<histogram name="Omnibox.PasteAndGo" units="count" expires_after="2020-07-30"> <owner>mpearson@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> <summary> @@ -87911,6 +87971,9 @@ <histogram name="PageLoad.Clients.LoFi.Experimental.Bytes.Network.LoFi" units="KB" expires_after="M77"> + <obsolete> + Functionality removed in M77. + </obsolete> <owner>bengr@chromium.org</owner> <owner>ryansturm@chromium.org</owner> <summary> @@ -87923,6 +87986,9 @@ <histogram name="PageLoad.Clients.LoFi.Experimental.CompletedResources.Network.LoFi" units="KB" expires_after="M78"> + <obsolete> + Functionality removed in M77. + </obsolete> <owner>bengr@chromium.org</owner> <owner>ryansturm@chromium.org</owner> <summary> @@ -100770,6 +100836,9 @@ <histogram name="Previews.ContextMenuAction.LoFi" enum="PreviewsContextMenuActionLoFi"> + <obsolete> + Functionality removed in M77. + </obsolete> <owner>bengr@chromium.org</owner> <owner>tbansal@chromium.org</owner> <summary> @@ -116082,7 +116151,7 @@ </histogram> <histogram name="SendTabToSelf.AndroidShareSheet.ClickResult" - enum="SendTabToSelfNotification" expires_after="M78"> + enum="SendTabToSelfNotification" expires_after="M84"> <owner>tgupta@chromium.org</owner> <summary> The use of Android notification for SendTabToSelf. @@ -116095,7 +116164,7 @@ </histogram> <histogram base="true" name="SendTabToSelf.ClickResult" - enum="SendTabToSelfClickResult" expires_after="M78"> + enum="SendTabToSelfClickResult" expires_after="M84"> <owner>jeffreycohen@chromium.org</owner> <owner>sebsg@chromium.org</owner> <owner>tgupta@chromium.org</owner> @@ -116105,7 +116174,7 @@ </histogram> <histogram base="true" name="SendTabToSelf.DeviceCount" units="device_counts" - expires_after="M78"> + expires_after="M84"> <owner>jeffreycohen@chromium.org</owner> <owner>sebsg@chromium.org</owner> <owner>tgupta@chromium.org</owner> @@ -116116,7 +116185,7 @@ </histogram> <histogram name="SendTabToSelf.Notification" enum="SendTabToSelfNotification" - expires_after="M77"> + expires_after="M84"> <owner>sebsg@chromium.org</owner> <owner>jeffreycohen@chromium.org</owner> <owner>tgupta@chromium.org</owner> @@ -116130,7 +116199,7 @@ </histogram> <histogram name="SendTabToSelf.Sync.AddEntryStatus" - enum="SendTabToSelfAddEntryStatus" expires_after="M78"> + enum="SendTabToSelfAddEntryStatus" expires_after="M84"> <owner>jeffreycohen@chromium.org</owner> <owner>sebsg@chromium.org</owner> <summary> @@ -116139,7 +116208,7 @@ </histogram> <histogram name="SendTabToSelf.Sync.ModelLoadedInTime" enum="Boolean" - expires_after="M78"> + expires_after="M84"> <owner>tgupta@chromium.org</owner> <summary> Whether or not the SendTabToSelf model was loaded in time to perform the @@ -119144,7 +119213,7 @@ </summary> </histogram> -<histogram name="Settings.PinnedTabs" expires_after="M77"> +<histogram name="Settings.PinnedTabs" expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary>The number of pinned tabs opened when a profile is loaded.</summary> </histogram> @@ -120368,7 +120437,7 @@ </histogram> <histogram name="Signin.AccountReconcilorState.OnGaiaResponse" - enum="SigninAccountReconcilorState" expires_after="M77"> + enum="SigninAccountReconcilorState" expires_after="M87"> <owner>jlebel@chromium.org</owner> <summary> Records the state of the account reconcilor when GAIA returns a specific @@ -122757,7 +122826,7 @@ </histogram> <histogram name="SiteIsolation.XSD.Browser.Action" - enum="SiteIsolationResponseAction" expires_after="M77"> + enum="SiteIsolationResponseAction" expires_after="2020-06-01"> <owner>creis@chromium.org</owner> <summary> Various actions related to cross-site document blocking in the browser @@ -122808,7 +122877,12 @@ <histogram name="SiteIsolation.XSD.Browser.Blocked.ContentLength.ValueIfAvailable" - units="bytes"> + units="bytes" expires_after="M77"> + <obsolete> + Removed in June 2019 / M77. Some old data has been saved in a + Google-internal doc at + https://docs.google.com/document/d/1hgPpFD5GpxgWsTQvrA0eLunrG0mwb_uJgWWJmG_kVN4 + </obsolete> <owner>creis@chromium.org</owner> <summary> For each responses blocked by the cross-site document blocking logic in the @@ -122820,6 +122894,11 @@ <histogram name="SiteIsolation.XSD.Browser.Blocked.ContentLength.WasAvailable" enum="BooleanAvailable" expires_after="M77"> + <obsolete> + Removed in June 2019 / M77. Some old data has been saved in a + Google-internal doc at + https://docs.google.com/document/d/1hgPpFD5GpxgWsTQvrA0eLunrG0mwb_uJgWWJmG_kVN4 + </obsolete> <owner>creis@chromium.org</owner> <summary> For each responses blocked by the cross-site document blocking logic in the @@ -122844,6 +122923,11 @@ <histogram name="SiteIsolation.XSD.Browser.BytesReadForSniffing" units="bytes" expires_after="M77"> + <obsolete> + Removed in June 2019 / M77. Some old data has been saved in a + Google-internal doc at + https://docs.google.com/document/d/1hgPpFD5GpxgWsTQvrA0eLunrG0mwb_uJgWWJmG_kVN4 + </obsolete> <owner>creis@chromium.org</owner> <summary> The number of bytes of the network response buffered for sniffing purposes, @@ -143379,7 +143463,7 @@ </histogram> <histogram name="WebFont.DownloadTime.0.Under10KB" units="ms" - expires_after="M77"> + expires_after="M85"> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> <summary> @@ -143389,7 +143473,7 @@ </histogram> <histogram name="WebFont.DownloadTime.1.10KBTo50KB" units="ms" - expires_after="M77"> + expires_after="M85"> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> <summary> @@ -143399,7 +143483,7 @@ </histogram> <histogram name="WebFont.DownloadTime.2.50KBTo100KB" units="ms" - expires_after="M77"> + expires_after="M85"> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> <summary> @@ -143409,7 +143493,7 @@ </histogram> <histogram name="WebFont.DownloadTime.3.100KBTo1MB" units="ms" - expires_after="M77"> + expires_after="M85"> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> <summary> @@ -143418,7 +143502,7 @@ </summary> </histogram> -<histogram name="WebFont.DownloadTime.4.Over1MB" units="ms" expires_after="M77"> +<histogram name="WebFont.DownloadTime.4.Over1MB" units="ms" expires_after="M85"> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> <summary> @@ -143427,7 +143511,7 @@ </summary> </histogram> -<histogram name="WebFont.DownloadTime.LoadError" units="ms" expires_after="M77"> +<histogram name="WebFont.DownloadTime.LoadError" units="ms" expires_after="M85"> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> <summary> @@ -143498,9 +143582,8 @@ </histogram> <histogram name="WebFont.LoadLimitOnDiskCacheMiss" enum="WebFontLoadLimitState" - expires_after="M77"> + expires_after="M85"> <owner>ksakamoto@chromium.org</owner> - <owner>shaochuan@chromium.org</owner> <owner>toyoshim@chromium.org</owner> <summary> The load limit state when the first disk-cache-only request fails by cache @@ -143672,6 +143755,9 @@ </histogram> <histogram name="WebFont.WebFontsInPage" expires_after="M77"> + <obsolete> + Removed June 2019. + </obsolete> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> <summary> @@ -145296,7 +145382,9 @@ </histogram> <histogram name="WebRTC.PeerConnection.SrtcpUnprotectError" - enum="SrtpErrorCode" expires_after="M77"> + enum="SrtpErrorCode" expires_after="never"> +<!-- expires-never: Needed for long-term tracking of the ecosystem. --> + <owner>steveanton@chromium.org</owner> <summary> What error code is reported by libsrtp when failing to unprotect an incoming @@ -145314,7 +145402,10 @@ </summary> </histogram> -<histogram name="WebRTC.PeerConnection.SrtpUnprotectError" enum="SrtpErrorCode"> +<histogram name="WebRTC.PeerConnection.SrtpUnprotectError" enum="SrtpErrorCode" + expires_after="never"> +<!-- expires-never: Needed for long-term tracking of the ecosystem. --> + <owner>steveanton@chromium.org</owner> <summary> What error code is reported by libsrtp when failing to unprotect an incoming @@ -150616,6 +150707,9 @@ <histogram_suffixes name="DataReductionProxy.LoFi.Accuracy.DifferentRecordingIntervals" separator="."> + <obsolete> + Functionality removed in M77. + </obsolete> <suffix name="15" label="Recorded approximately 15 seconds after navigation start"/> <suffix name="30" @@ -150650,12 +150744,36 @@ <suffix name="None" label="With no detected network"/> <suffix name="Unknown" label="On Unknown network"/> <suffix name="WiFi" label="On WiFi network"/> - <affected-histogram name="DataReductionProxy.AutoLoFiAccuracy"/> - <affected-histogram name="DataReductionProxy.AutoLoFiRequestHeaderState"/> - <affected-histogram name="DataReductionProxy.LoFi.Accuracy.15"/> - <affected-histogram name="DataReductionProxy.LoFi.Accuracy.30"/> - <affected-histogram name="DataReductionProxy.LoFi.Accuracy.60"/> - <affected-histogram name="DataReductionProxy.LoFi.ImplicitOptOutAction"/> + <affected-histogram name="DataReductionProxy.AutoLoFiAccuracy"> + <obsolete> + Functionality removed in M77. + </obsolete> + </affected-histogram> + <affected-histogram name="DataReductionProxy.AutoLoFiRequestHeaderState"> + <obsolete> + Functionality removed in M77. + </obsolete> + </affected-histogram> + <affected-histogram name="DataReductionProxy.LoFi.Accuracy.15"> + <obsolete> + Functionality removed in M77. + </obsolete> + </affected-histogram> + <affected-histogram name="DataReductionProxy.LoFi.Accuracy.30"> + <obsolete> + Functionality removed in M77. + </obsolete> + </affected-histogram> + <affected-histogram name="DataReductionProxy.LoFi.Accuracy.60"> + <obsolete> + Functionality removed in M77. + </obsolete> + </affected-histogram> + <affected-histogram name="DataReductionProxy.LoFi.ImplicitOptOutAction"> + <obsolete> + Functionality removed in M77. + </obsolete> + </affected-histogram> </histogram_suffixes> <histogram_suffixes @@ -157464,6 +157582,9 @@ <histogram_suffixes name="PageLoadMetricsClientsLoFi" separator="." ordering="prefix"> + <obsolete> + Functionality removed in M77. + </obsolete> <suffix name="Clients.LoFi" label="PageLoadMetrics that are a result of a navigation that displayed a LoFi image."/> @@ -158927,7 +159048,11 @@ <suffix name="DeferAllScript" label="Defers execution of script"/> <suffix name="LitePage" label="Lite page previews"/> <suffix name="LitePageRedirect" label="Lite page redirection previews"/> - <suffix name="LoFi" label="LoFi previews"/> + <suffix name="LoFi" label="LoFi previews"> + <obsolete> + Functionality removed in M77. + </obsolete> + </suffix> <suffix name="None" label="No preview was served"/> <suffix name="NoScript" label="NoScript previews"/> <suffix name="Offline" label="Offline previews"/>
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index 413c495..9a95ec0 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -1064,8 +1064,9 @@ IFACEMETHODIMP AXPlatformNodeWin::get_accHelp(VARIANT var_id, BSTR* help) { WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_HELP); - COM_OBJECT_VALIDATE_1_ARG(help); - return S_FALSE; + AXPlatformNodeWin* target; + COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, help, target); + return target->GetHelpText(help); } IFACEMETHODIMP AXPlatformNodeWin::get_accValue(VARIANT var_id, BSTR* value) { @@ -3766,20 +3767,8 @@ break; case UIA_HelpTextPropertyId: - if (HasStringAttribute(ax::mojom::StringAttribute::kPlaceholder)) { - V_VT(result) = VT_BSTR; - GetStringAttributeAsBstr(ax::mojom::StringAttribute::kPlaceholder, - &V_BSTR(result)); - } else if (data.GetNameFrom() == ax::mojom::NameFrom::kPlaceholder || - data.GetNameFrom() == ax::mojom::NameFrom::kTitle) { - V_VT(result) = VT_BSTR; - GetStringAttributeAsBstr(ax::mojom::StringAttribute::kName, - &V_BSTR(result)); - } else if (HasStringAttribute(ax::mojom::StringAttribute::kTooltip)) { - V_VT(result) = VT_BSTR; - GetStringAttributeAsBstr(ax::mojom::StringAttribute::kTooltip, - &V_BSTR(result)); - } + V_VT(result) = VT_BSTR; + GetHelpText(&V_BSTR(result)); break; case UIA_IsContentElementPropertyId: @@ -6815,6 +6804,21 @@ return S_OK; } +HRESULT AXPlatformNodeWin::GetHelpText(BSTR* helpText) { + if (HasStringAttribute(ax::mojom::StringAttribute::kPlaceholder)) { + return GetStringAttributeAsBstr(ax::mojom::StringAttribute::kPlaceholder, + helpText); + } else if (GetData().GetNameFrom() == ax::mojom::NameFrom::kPlaceholder || + GetData().GetNameFrom() == ax::mojom::NameFrom::kTitle) { + return GetStringAttributeAsBstr(ax::mojom::StringAttribute::kName, + helpText); + } else if (HasStringAttribute(ax::mojom::StringAttribute::kTooltip)) { + return GetStringAttributeAsBstr(ax::mojom::StringAttribute::kTooltip, + helpText); + } + return S_FALSE; +} + // TODO(dmazzoni): Remove this function once combo box refactoring is // complete. bool AXPlatformNodeWin::IsAncestorComboBox() {
diff --git a/ui/accessibility/platform/ax_platform_node_win.h b/ui/accessibility/platform/ax_platform_node_win.h index 4c487ce..fddbb617 100644 --- a/ui/accessibility/platform/ax_platform_node_win.h +++ b/ui/accessibility/platform/ax_platform_node_win.h
@@ -1201,6 +1201,9 @@ // Helper method for mutating the ISelectionItemProvider selected state HRESULT ISelectionItemProviderSetSelected(bool selected); + // Helper method for getting the help text property. + HRESULT GetHelpText(BSTR* helpText); + // // Getters for UIA GetTextAttributeValue //
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc index cf83d12..779ba157 100644 --- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -523,6 +523,101 @@ root_obj->get_accKeyboardShortcut(bad_id, k2.Receive())); } +TEST_F(AXPlatformNodeWinTest, TestIAccessibleHelpText) { + AXNodeData root; + root.id = 0; + + // Test Placeholder StringAttribute is exposed. + AXNodeData node1; + node1.id = 1; + node1.SetName("name-from-title"); + node1.AddIntAttribute(ax::mojom::IntAttribute::kNameFrom, + static_cast<int>(ax::mojom::NameFrom::kTitle)); + node1.AddStringAttribute(ax::mojom::StringAttribute::kPlaceholder, + "placeholder"); + root.child_ids.push_back(node1.id); + + // Test NameFrom Title is exposed. + AXNodeData node2; + node2.id = 2; + node2.SetName("name-from-title"); + node2.AddIntAttribute(ax::mojom::IntAttribute::kNameFrom, + static_cast<int>(ax::mojom::NameFrom::kTitle)); + root.child_ids.push_back(node2.id); + + // Test NameFrom Placeholder is exposed. + AXNodeData node3; + node3.id = 3; + node3.SetName("name-from-placeholder"); + node3.AddIntAttribute(ax::mojom::IntAttribute::kNameFrom, + static_cast<int>(ax::mojom::NameFrom::kPlaceholder)); + root.child_ids.push_back(node3.id); + + // Test Tooltip StringAttribute is exposed. + AXNodeData node4; + node4.id = 4; + node4.SetName("name-from-attribute"); + node4.AddIntAttribute(ax::mojom::IntAttribute::kNameFrom, + static_cast<int>(ax::mojom::NameFrom::kAttribute)); + node4.AddStringAttribute(ax::mojom::StringAttribute::kTooltip, "tooltip"); + root.child_ids.push_back(node4.id); + + // Test StringAttribute is not exposed without explicit + // Placeholder / Title / Tooltip. + AXNodeData node5; + node5.id = 5; + node5.SetName("name-from-attribute"); + node5.AddIntAttribute(ax::mojom::IntAttribute::kNameFrom, + static_cast<int>(ax::mojom::NameFrom::kAttribute)); + root.child_ids.push_back(node5.id); + + Init(root, node1, node2, node3, node4, node5); + + auto* root_node = GetRootNode(); + + ScopedBstr helpText1; + ComPtr<IAccessible> child_node1( + IAccessibleFromNode(root_node->children()[0])); + EXPECT_EQ(S_OK, child_node1->get_accHelp(SELF, helpText1.Receive())); + EXPECT_STREQ(L"placeholder", helpText1); + + ScopedBstr helpText2; + ComPtr<IAccessible> child_node2( + IAccessibleFromNode(root_node->children()[1])); + EXPECT_EQ(S_OK, child_node2->get_accHelp(SELF, helpText2.Receive())); + EXPECT_STREQ(L"name-from-title", helpText2); + + ScopedBstr helpText3; + ComPtr<IAccessible> child_node3( + IAccessibleFromNode(root_node->children()[2])); + EXPECT_EQ(S_OK, child_node3->get_accHelp(SELF, helpText3.Receive())); + EXPECT_STREQ(L"name-from-placeholder", helpText3); + + ScopedBstr helpText4; + ComPtr<IAccessible> child_node4( + IAccessibleFromNode(root_node->children()[3])); + EXPECT_EQ(S_OK, child_node4->get_accHelp(SELF, helpText4.Receive())); + EXPECT_STREQ(L"tooltip", helpText4); + + ScopedBstr helpText5; + ComPtr<IAccessible> child_node5( + IAccessibleFromNode(root_node->children()[4])); + EXPECT_EQ(S_FALSE, child_node5->get_accHelp(SELF, helpText5.Receive())); + + ScopedBstr helpText6; + ScopedVariant root_id(0); + EXPECT_EQ(S_OK, child_node4->get_accHelp(root_id, helpText6.Receive())); + EXPECT_STREQ(L"tooltip", helpText6); + + EXPECT_EQ(E_INVALIDARG, child_node5->get_accHelp(SELF, nullptr)); + ScopedVariant var_id(5); + EXPECT_EQ(E_INVALIDARG, + child_node5->get_accHelp(var_id, helpText5.Receive())); + ScopedVariant bad_id(999); + EXPECT_EQ(E_INVALIDARG, + child_node5->get_accHelp(bad_id, helpText5.Receive())); +} + TEST_F(AXPlatformNodeWinTest, TestIAccessibleSelectionListBoxOptionNothingSelected) { AXNodeData list;
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn index 7bedfd47..ecc9d03 100644 --- a/ui/android/BUILD.gn +++ b/ui/android/BUILD.gn
@@ -341,7 +341,7 @@ ] srcjar_deps = [ ":java_enums_srcjar", - "//third_party/blink/public:blink_cursor_type_java_enums_srcjar", + "//ui/base:ui_base_cursor_type_java_enums_srcjar", ] }
diff --git a/ui/android/java/res/color/default_text_color_inverse_list.xml b/ui/android/java/res/color/default_text_color_inverse_list.xml new file mode 100644 index 0000000..4c1bc83 --- /dev/null +++ b/ui/android/java/res/color/default_text_color_inverse_list.xml
@@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:alpha="@dimen/default_disabled_alpha" + android:color="@color/default_text_color_inverse" android:state_enabled="false" /> + <item android:color="@color/default_text_color_inverse"/> +</selector> \ No newline at end of file
diff --git a/ui/android/java/res/values-v17/styles.xml b/ui/android/java/res/values-v17/styles.xml index aaf6cba1..fcfdd0b 100644 --- a/ui/android/java/res/values-v17/styles.xml +++ b/ui/android/java/res/values-v17/styles.xml
@@ -53,6 +53,9 @@ <item name="rippleColor">@color/text_button_ripple_color</item> <item name="buttonRaised">false</item> </style> + <style name="TextButton.Inverse" tools:ignore="UnusedResources"> + <item name="android:textAppearance">@style/TextAppearance.ButtonText.Inverse</item> + </style> <!-- Chips --> <style name="SuggestionChipThemeOverlay" tools:ignore="UnusedResources"> @@ -198,6 +201,10 @@ tools:ignore="UnusedResources"> <item name="android:textColor">@color/default_text_color_inverse</item> </style> + <style name="TextAppearance.ButtonText.Inverse" parent="TextAppearance.AccentMediumStyle"> + <item name="android:textColor">@color/default_text_color_inverse_list</item> + <item name="android:textSize">@dimen/text_size_medium</item> + </style> <!-- Blue Text Styles --> <style name="TextAppearance.BlueTitle2" parent="TextAppearance.RobotoMediumStyle" tools:ignore="UnusedResources">
diff --git a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java index d383c50..8f87683 100644 --- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java +++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -21,8 +21,8 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.compat.ApiHelperForN; -import org.chromium.blink_public.web.WebCursorInfoType; import org.chromium.ui.touchless.TouchlessEventHandler; +import org.chromium.ui_base.web.CursorType; /** * Class to acquire, position, and remove anchor views from the implementing View. @@ -197,122 +197,122 @@ int pointerIconType = PointerIcon.TYPE_ARROW; switch (cursorType) { - case WebCursorInfoType.NONE: + case CursorType.NONE: pointerIconType = PointerIcon.TYPE_NULL; break; - case WebCursorInfoType.POINTER: + case CursorType.POINTER: pointerIconType = PointerIcon.TYPE_ARROW; break; - case WebCursorInfoType.CONTEXT_MENU: + case CursorType.CONTEXT_MENU: pointerIconType = PointerIcon.TYPE_CONTEXT_MENU; break; - case WebCursorInfoType.HAND: + case CursorType.HAND: pointerIconType = PointerIcon.TYPE_HAND; break; - case WebCursorInfoType.HELP: + case CursorType.HELP: pointerIconType = PointerIcon.TYPE_HELP; break; - case WebCursorInfoType.WAIT: + case CursorType.WAIT: pointerIconType = PointerIcon.TYPE_WAIT; break; - case WebCursorInfoType.CELL: + case CursorType.CELL: pointerIconType = PointerIcon.TYPE_CELL; break; - case WebCursorInfoType.CROSS: + case CursorType.CROSS: pointerIconType = PointerIcon.TYPE_CROSSHAIR; break; - case WebCursorInfoType.I_BEAM: + case CursorType.I_BEAM: pointerIconType = PointerIcon.TYPE_TEXT; break; - case WebCursorInfoType.VERTICAL_TEXT: + case CursorType.VERTICAL_TEXT: pointerIconType = PointerIcon.TYPE_VERTICAL_TEXT; break; - case WebCursorInfoType.ALIAS: + case CursorType.ALIAS: pointerIconType = PointerIcon.TYPE_ALIAS; break; - case WebCursorInfoType.COPY: + case CursorType.COPY: pointerIconType = PointerIcon.TYPE_COPY; break; - case WebCursorInfoType.NO_DROP: + case CursorType.NO_DROP: pointerIconType = PointerIcon.TYPE_NO_DROP; break; - case WebCursorInfoType.COLUMN_RESIZE: + case CursorType.COLUMN_RESIZE: pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; break; - case WebCursorInfoType.ROW_RESIZE: + case CursorType.ROW_RESIZE: pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; break; - case WebCursorInfoType.NORTH_EAST_SOUTH_WEST_RESIZE: + case CursorType.NORTH_EAST_SOUTH_WEST_RESIZE: pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW; break; - case WebCursorInfoType.NORTH_WEST_SOUTH_EAST_RESIZE: + case CursorType.NORTH_WEST_SOUTH_EAST_RESIZE: pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW; break; - case WebCursorInfoType.ZOOM_IN: + case CursorType.ZOOM_IN: pointerIconType = PointerIcon.TYPE_ZOOM_IN; break; - case WebCursorInfoType.ZOOM_OUT: + case CursorType.ZOOM_OUT: pointerIconType = PointerIcon.TYPE_ZOOM_OUT; break; - case WebCursorInfoType.GRAB: + case CursorType.GRAB: pointerIconType = PointerIcon.TYPE_GRAB; break; - case WebCursorInfoType.GRABBING: + case CursorType.GRABBING: pointerIconType = PointerIcon.TYPE_GRABBING; break; // TODO(jaebaek): set types correctly // after fixing http://crbug.com/584424. - case WebCursorInfoType.EAST_WEST_RESIZE: + case CursorType.EAST_WEST_RESIZE: pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; break; - case WebCursorInfoType.NORTH_SOUTH_RESIZE: + case CursorType.NORTH_SOUTH_RESIZE: pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; break; - case WebCursorInfoType.EAST_RESIZE: + case CursorType.EAST_RESIZE: pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; break; - case WebCursorInfoType.NORTH_RESIZE: + case CursorType.NORTH_RESIZE: pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; break; - case WebCursorInfoType.NORTH_EAST_RESIZE: + case CursorType.NORTH_EAST_RESIZE: pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW; break; - case WebCursorInfoType.NORTH_WEST_RESIZE: + case CursorType.NORTH_WEST_RESIZE: pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW; break; - case WebCursorInfoType.SOUTH_RESIZE: + case CursorType.SOUTH_RESIZE: pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; break; - case WebCursorInfoType.SOUTH_EAST_RESIZE: + case CursorType.SOUTH_EAST_RESIZE: pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW; break; - case WebCursorInfoType.SOUTH_WEST_RESIZE: + case CursorType.SOUTH_WEST_RESIZE: pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW; break; - case WebCursorInfoType.WEST_RESIZE: + case CursorType.WEST_RESIZE: pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; break; - case WebCursorInfoType.PROGRESS: + case CursorType.PROGRESS: pointerIconType = PointerIcon.TYPE_WAIT; break; - case WebCursorInfoType.NOT_ALLOWED: + case CursorType.NOT_ALLOWED: pointerIconType = PointerIcon.TYPE_NO_DROP; break; - case WebCursorInfoType.MOVE: - case WebCursorInfoType.MIDDLE_PANNING: + case CursorType.MOVE: + case CursorType.MIDDLE_PANNING: pointerIconType = PointerIcon.TYPE_ALL_SCROLL; break; - case WebCursorInfoType.EAST_PANNING: - case WebCursorInfoType.NORTH_PANNING: - case WebCursorInfoType.NORTH_EAST_PANNING: - case WebCursorInfoType.NORTH_WEST_PANNING: - case WebCursorInfoType.SOUTH_PANNING: - case WebCursorInfoType.SOUTH_EAST_PANNING: - case WebCursorInfoType.SOUTH_WEST_PANNING: - case WebCursorInfoType.WEST_PANNING: + case CursorType.EAST_PANNING: + case CursorType.NORTH_PANNING: + case CursorType.NORTH_EAST_PANNING: + case CursorType.NORTH_WEST_PANNING: + case CursorType.SOUTH_PANNING: + case CursorType.SOUTH_EAST_PANNING: + case CursorType.SOUTH_WEST_PANNING: + case CursorType.WEST_PANNING: assert false : "These pointer icon types are not supported"; break; - case WebCursorInfoType.CUSTOM: + case CursorType.CUSTOM: assert false : "onCursorChangedToCustom must be called instead"; break; }
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc index b7fc229..559cce1 100644 --- a/ui/android/view_android.cc +++ b/ui/android/view_android.cc
@@ -32,7 +32,6 @@ using base::android::ConvertUTF8ToJavaString; using base::android::JavaRef; using base::android::ScopedJavaLocalRef; -using blink::WebCursorInfo; ViewAndroid::ScopedAnchorView::ScopedAnchorView( JNIEnv* env, @@ -395,10 +394,10 @@ if (delegate.is_null()) return; JNIEnv* env = base::android::AttachCurrentThread(); - if (type == WebCursorInfo::kTypeCustom) { + if (type == static_cast<int>(ui::CursorType::kCustom)) { if (custom_image.drawsNothing()) { - Java_ViewAndroidDelegate_onCursorChanged(env, delegate, - WebCursorInfo::kTypePointer); + Java_ViewAndroidDelegate_onCursorChanged( + env, delegate, static_cast<int>(ui::CursorType::kPointer)); return; } ScopedJavaLocalRef<jobject> java_bitmap =
diff --git a/ui/aura/client/aura_constants.cc b/ui/aura/client/aura_constants.cc index 5b86eeb..f2024e6 100644 --- a/ui/aura/client/aura_constants.cc +++ b/ui/aura/client/aura_constants.cc
@@ -76,7 +76,6 @@ kShowStateKey, ui::SHOW_STATE_DEFAULT) DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(base::string16, kTitleKey, nullptr) -DEFINE_UI_CLASS_PROPERTY_KEY(bool, kTitleShownKey, true) DEFINE_UI_CLASS_PROPERTY_KEY(int, kTopViewInset, 0) DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::ImageSkia, kWindowIconKey, nullptr) DEFINE_UI_CLASS_PROPERTY_KEY(int, kWindowCornerRadiusKey, -1)
diff --git a/ui/aura/client/aura_constants.h b/ui/aura/client/aura_constants.h index 499b1ff..f99e4f1 100644 --- a/ui/aura/client/aura_constants.h +++ b/ui/aura/client/aura_constants.h
@@ -155,10 +155,6 @@ // A property key to store the title of the window; sometimes shown to users. AURA_EXPORT extern const WindowProperty<base::string16*>* const kTitleKey; -// Indicates if the title of the window should be shown. This is only used for -// top-levels that show a title. Default is false. -AURA_EXPORT extern const WindowProperty<bool>* const kTitleShownKey; - // The inset of the topmost view in the client view from the top of the // non-client view. The topmost view depends on the window type. The topmost // view is the tab strip for tabbed browser windows, the toolbar for popups,
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index 3fad546..59beb86 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -139,8 +139,9 @@ "cursor/cursor.h", "cursor/cursor_android.cc", "cursor/cursor_loader.h", - "cursor/cursor_type.h", + "cursor/cursor_size.h", "cursor/cursor_win.cc", + "cursor/types/cursor_types.h", "default_style.h", "device_form_factor.h", "device_form_factor_android.cc", @@ -761,6 +762,12 @@ ] jni_package = "base" } + + java_cpp_enum("ui_base_cursor_type_java_enums_srcjar") { + sources = [ + "./cursor/types/cursor_types.h", + ] + } } bundle_data("ui_base_unittests_bundle_data") {
diff --git a/ui/base/accelerators/accelerator.cc b/ui/base/accelerators/accelerator.cc index dadc140..841a8cc 100644 --- a/ui/base/accelerators/accelerator.cc +++ b/ui/base/accelerators/accelerator.cc
@@ -145,9 +145,9 @@ base::string16 shortcut; #if defined(OS_MACOSX) - shortcut = KeyCodeToMacSymbol(key_code_); + shortcut = KeyCodeToMacSymbol(); #else - shortcut = KeyCodeToName(key_code_); + shortcut = KeyCodeToName(); #endif if (shortcut.empty()) { @@ -227,54 +227,9 @@ return shortcut; } -base::string16 Accelerator::ApplyLongFormModifiers( - base::string16 shortcut) const { - if (IsShiftDown()) - shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_SHIFT_KEY); - - // Note that we use 'else-if' in order to avoid using Ctrl+Alt as a shortcut. - // See http://blogs.msdn.com/oldnewthing/archive/2004/03/29/101121.aspx for - // more information. - if (IsCtrlDown()) - shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_CTRL_KEY); - else if (IsAltDown()) - shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_ALT_KEY); - - if (IsCmdDown()) { #if defined(OS_MACOSX) - shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_COMMAND_KEY); -#elif defined(OS_CHROMEOS) - shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_SEARCH_KEY); -#elif defined(OS_WIN) - shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_WINDOWS_KEY); -#else - NOTREACHED(); -#endif - } - - return shortcut; -} - -base::string16 Accelerator::ApplyShortFormModifiers( - base::string16 shortcut) const { - const base::char16 kCommandSymbol[] = {0x2318, 0}; - const base::char16 kCtrlSymbol[] = {0x2303, 0}; - const base::char16 kShiftSymbol[] = {0x21e7, 0}; - const base::char16 kOptionSymbol[] = {0x2325, 0}; - const base::char16 kNoSymbol[] = {0}; - - std::vector<base::string16> parts; - parts.push_back(base::string16(IsCtrlDown() ? kCtrlSymbol : kNoSymbol)); - parts.push_back(base::string16(IsAltDown() ? kOptionSymbol : kNoSymbol)); - parts.push_back(base::string16(IsShiftDown() ? kShiftSymbol : kNoSymbol)); - parts.push_back(base::string16(IsCmdDown() ? kCommandSymbol : kNoSymbol)); - parts.push_back(shortcut); - return base::StrCat(parts); -} - -#if defined(OS_MACOSX) -base::string16 Accelerator::KeyCodeToMacSymbol(KeyboardCode key_code) const { - switch (key_code) { +base::string16 Accelerator::KeyCodeToMacSymbol() const { + switch (key_code_) { case VKEY_CAPITAL: return base::string16({0x21ea, 0}); case VKEY_RETURN: @@ -305,12 +260,12 @@ // "Space" and some other keys are written out; fall back to KeyCodeToName() // for those (and any other unhandled keys). default: - return KeyCodeToName(key_code); + return KeyCodeToName(); } } #endif // OS_MACOSX -base::string16 Accelerator::KeyCodeToName(KeyboardCode key_code) const { +base::string16 Accelerator::KeyCodeToName() const { int string_id = 0; switch (key_code_) { case VKEY_TAB: @@ -391,4 +346,49 @@ return string_id ? l10n_util::GetStringUTF16(string_id) : base::string16(); } +base::string16 Accelerator::ApplyLongFormModifiers( + base::string16 shortcut) const { + if (IsShiftDown()) + shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_SHIFT_KEY); + + // Note that we use 'else-if' in order to avoid using Ctrl+Alt as a shortcut. + // See http://blogs.msdn.com/oldnewthing/archive/2004/03/29/101121.aspx for + // more information. + if (IsCtrlDown()) + shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_CTRL_KEY); + else if (IsAltDown()) + shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_ALT_KEY); + + if (IsCmdDown()) { +#if defined(OS_MACOSX) + shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_COMMAND_KEY); +#elif defined(OS_CHROMEOS) + shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_SEARCH_KEY); +#elif defined(OS_WIN) + shortcut = ApplyModifierToAcceleratorString(shortcut, IDS_APP_WINDOWS_KEY); +#else + NOTREACHED(); +#endif + } + + return shortcut; +} + +base::string16 Accelerator::ApplyShortFormModifiers( + base::string16 shortcut) const { + const base::char16 kCommandSymbol[] = {0x2318, 0}; + const base::char16 kCtrlSymbol[] = {0x2303, 0}; + const base::char16 kShiftSymbol[] = {0x21e7, 0}; + const base::char16 kOptionSymbol[] = {0x2325, 0}; + const base::char16 kNoSymbol[] = {0}; + + std::vector<base::string16> parts; + parts.push_back(base::string16(IsCtrlDown() ? kCtrlSymbol : kNoSymbol)); + parts.push_back(base::string16(IsAltDown() ? kOptionSymbol : kNoSymbol)); + parts.push_back(base::string16(IsShiftDown() ? kShiftSymbol : kNoSymbol)); + parts.push_back(base::string16(IsCmdDown() ? kCommandSymbol : kNoSymbol)); + parts.push_back(shortcut); + return base::StrCat(parts); +} + } // namespace ui
diff --git a/ui/base/accelerators/accelerator.h b/ui/base/accelerators/accelerator.h index 9bcf7de..7083dc1 100644 --- a/ui/base/accelerators/accelerator.h +++ b/ui/base/accelerators/accelerator.h
@@ -89,6 +89,11 @@ // Returns a string with the localized shortcut if any. base::string16 GetShortcutText() const; +#if defined(OS_MACOSX) + base::string16 KeyCodeToMacSymbol() const; +#endif + base::string16 KeyCodeToName() const; + void set_interrupted_by_mouse_event(bool interrupted_by_mouse_event) { interrupted_by_mouse_event_ = interrupted_by_mouse_event; } @@ -101,11 +106,6 @@ base::string16 ApplyLongFormModifiers(base::string16 shortcut) const; base::string16 ApplyShortFormModifiers(base::string16 shortcut) const; -#if defined(OS_MACOSX) - base::string16 KeyCodeToMacSymbol(KeyboardCode key_code) const; -#endif - base::string16 KeyCodeToName(KeyboardCode key_code) const; - // The keycode (VK_...). KeyboardCode key_code_;
diff --git a/ui/base/class_property.h b/ui/base/class_property.h index 40bcdeb..d937c57 100644 --- a/ui/base/class_property.h +++ b/ui/base/class_property.h
@@ -70,11 +70,26 @@ ~PropertyHandler(); // Sets the |value| of the given class |property|. Setting to the default - // value (e.g., NULL) removes the property. The caller is responsible for the - // lifetime of any object set as a property on the class. + // value (e.g., NULL) removes the property. The lifetime of objects set as + // values of unowned properties is managed by the caller (owned properties are + // freed when they are overwritten or cleared). template<typename T> void SetProperty(const ClassProperty<T>* property, T value); + // Sets the |value| of the given class |property|, which must be an owned + // property of pointer type. The property will be assigned a copy of |value|; + // if no property object exists one will be allocated. T must support copy + // construction and assignment. + template <typename T> + void SetProperty(const ClassProperty<T*>* property, const T& value); + + // Sets the |value| of the given class |property|, which must be an owned + // property and of pointer type. The property will be move-assigned or move- + // constructed from |value|; if no property object exists one will be + // allocated. T must support at least copy (and ideally move) semantics. + template <typename T> + void SetProperty(const ClassProperty<T*>* property, T&& value); + // Returns the value of the given class |property|. Returns the // property-specific default value if the property was not previously set. template<typename T> @@ -182,6 +197,40 @@ } // namespace subtle +// Template implementation is necessary in the .h file unless we want to break +// [DECLARE|DEFINE]_EXPORTED_UI_CLASS_PROPERTY_TYPE() below into different +// macros for owned and unowned properties; implementing them as pure templates +// makes them nearly impossible to implement or use incorrectly at the cost of a +// small amount of code duplication across libraries. + +template <typename T> +void PropertyHandler::SetProperty(const ClassProperty<T*>* property, + const T& value) { + // Prevent additional heap allocation if possible. + T* const old = GetProperty(property); + if (old) { + T temp(*old); + *old = value; + AfterPropertyChange(property, reinterpret_cast<int64_t>(&temp)); + } else { + SetProperty(property, new T(value)); + } +} + +template <typename T> +void PropertyHandler::SetProperty(const ClassProperty<T*>* property, + T&& value) { + // Prevent additional heap allocation if possible. + T* const old = GetProperty(property); + if (old) { + T temp(std::move(*old)); + *old = std::forward<T>(value); + AfterPropertyChange(property, reinterpret_cast<int64_t>(&temp)); + } else { + SetProperty(property, new T(std::forward<T>(value))); + } +} + } // namespace ui // Macros to declare the property getter/setter template functions.
diff --git a/ui/base/class_property_unittest.cc b/ui/base/class_property_unittest.cc index 870a40f..05c7137 100644 --- a/ui/base/class_property_unittest.cc +++ b/ui/base/class_property_unittest.cc
@@ -35,17 +35,61 @@ void* TestProperty::last_deleted_ = nullptr; -DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(TestProperty, kOwnedKey, NULL) +class AssignableTestProperty { + public: + AssignableTestProperty() {} + AssignableTestProperty(int value) : value_(value) {} + AssignableTestProperty(const AssignableTestProperty& other) + : value_(other.value_) {} + AssignableTestProperty(AssignableTestProperty&& other) + : value_(std::move(other.value_)), was_move_assigned_(true) {} + AssignableTestProperty& operator=(const AssignableTestProperty& other) { + value_ = other.value_; + was_move_assigned_ = false; + return *this; + } + AssignableTestProperty& operator=(AssignableTestProperty&& other) { + value_ = std::move(other.value_); + was_move_assigned_ = true; + return *this; + } + + int value() const { return value_; } + bool was_move_assigned() const { return was_move_assigned_; } + + private: + int value_ = 0; + bool was_move_assigned_ = false; +}; + +DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(TestProperty, kOwnedKey, nullptr) +DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(AssignableTestProperty, + kAssignableKey, + nullptr) } // namespace DEFINE_UI_CLASS_PROPERTY_TYPE(TestProperty*) +DEFINE_UI_CLASS_PROPERTY_TYPE(AssignableTestProperty*) namespace ui { namespace test { namespace { +class TestPropertyHandler : public PropertyHandler { + public: + int num_events() const { return num_events_; } + + protected: + void AfterPropertyChange(const void* key, int64_t old_value) override { + ++num_events_; + } + + private: + int num_events_ = 0; +}; + const int kDefaultIntValue = -2; const char* kDefaultStringValue = "squeamish"; const char* kTestStringValue = "ossifrage"; @@ -113,5 +157,110 @@ EXPECT_EQ(p3, TestProperty::last_deleted()); } +TEST(PropertyTest, AssignableProperty) { + PropertyHandler h; + + // Verify that assigning a property by value allocates a value. + EXPECT_EQ(nullptr, h.GetProperty(kAssignableKey)); + const AssignableTestProperty kTestProperty{1}; + h.SetProperty(kAssignableKey, kTestProperty); + AssignableTestProperty* p = h.GetProperty(kAssignableKey); + EXPECT_NE(nullptr, p); + EXPECT_EQ(1, p->value()); + + // Verify that assigning by value updates the existing value without + // additional allocation. + h.SetProperty(kAssignableKey, AssignableTestProperty{2}); + EXPECT_EQ(p, h.GetProperty(kAssignableKey)); + EXPECT_EQ(2, p->value()); + + // Same as the above case, but with a const reference instead of a move. + const AssignableTestProperty kTestProperty2{3}; + h.SetProperty(kAssignableKey, kTestProperty2); + EXPECT_EQ(p, h.GetProperty(kAssignableKey)); + EXPECT_EQ(3, p->value()); + + // Verify that clearing the property deallocates the value. + h.ClearProperty(kAssignableKey); + EXPECT_EQ(nullptr, h.GetProperty(kAssignableKey)); + + // Verify that setting by value after clearing allocates a new value. + h.SetProperty(kAssignableKey, AssignableTestProperty{4}); + EXPECT_EQ(4, h.GetProperty(kAssignableKey)->value()); +} + +TEST(PropertyTest, SetProperty_ForwardsParametersCorrectly) { + PropertyHandler h; + + // New property from a const ref. + const AssignableTestProperty kTestProperty{1}; + h.SetProperty(kAssignableKey, kTestProperty); + EXPECT_FALSE(h.GetProperty(kAssignableKey)->was_move_assigned()); + + // Set property from inline rvalue ref. + h.SetProperty(kAssignableKey, AssignableTestProperty{2}); + EXPECT_TRUE(h.GetProperty(kAssignableKey)->was_move_assigned()); + + // Set property from lvalue. + AssignableTestProperty test_property{3}; + h.SetProperty(kAssignableKey, test_property); + EXPECT_FALSE(h.GetProperty(kAssignableKey)->was_move_assigned()); + + // Set property from lvalue ref. + AssignableTestProperty& ref = test_property; + h.SetProperty(kAssignableKey, ref); + EXPECT_FALSE(h.GetProperty(kAssignableKey)->was_move_assigned()); + + // Set property from moved rvalue ref. + h.SetProperty(kAssignableKey, std::move(test_property)); + EXPECT_TRUE(h.GetProperty(kAssignableKey)->was_move_assigned()); + + // Set property from const ref. + const AssignableTestProperty& const_ref = kTestProperty; + h.SetProperty(kAssignableKey, const_ref); + EXPECT_FALSE(h.GetProperty(kAssignableKey)->was_move_assigned()); + + // New property from rvalue ref. + h.ClearProperty(kAssignableKey); + h.SetProperty(kAssignableKey, AssignableTestProperty{4}); + EXPECT_TRUE(h.GetProperty(kAssignableKey)->was_move_assigned()); + + // New property from lvalue. + h.ClearProperty(kAssignableKey); + test_property = AssignableTestProperty{5}; + h.SetProperty(kAssignableKey, test_property); + EXPECT_FALSE(h.GetProperty(kAssignableKey)->was_move_assigned()); +} + +TEST(PropertyTest, PropertyChangedEvent) { + TestPropertyHandler h; + + // Verify that initially setting the value creates an event. + const AssignableTestProperty kTestProperty{1}; + h.SetProperty(kAssignableKey, kTestProperty); + EXPECT_EQ(1, h.num_events()); + + // Verify that assigning by value sends an event. + h.SetProperty(kAssignableKey, AssignableTestProperty{2}); + EXPECT_EQ(2, h.num_events()); + + // Same as the above case, but with a const reference instead of a move. + const AssignableTestProperty kTestProperty2{3}; + h.SetProperty(kAssignableKey, kTestProperty2); + EXPECT_EQ(3, h.num_events()); + + // Verify that clearing the property creates an event. + h.ClearProperty(kAssignableKey); + EXPECT_EQ(4, h.num_events()); + + // Verify that setting a heap-allocated value also ticks the event counter. + h.SetProperty(kAssignableKey, new AssignableTestProperty{4}); + EXPECT_EQ(5, h.num_events()); + + // Verify that overwriting a heap-allocated value ticks the event counter. + h.SetProperty(kAssignableKey, new AssignableTestProperty{5}); + EXPECT_EQ(6, h.num_events()); +} + } // namespace test } // namespace ui
diff --git a/ui/base/cursor/cursor.h b/ui/base/cursor/cursor.h index d95ad138d..6ba95dc 100644 --- a/ui/base/cursor/cursor.h +++ b/ui/base/cursor/cursor.h
@@ -7,7 +7,8 @@ #include "build/build_config.h" #include "third_party/skia/include/core/SkBitmap.h" -#include "ui/base/cursor/cursor_type.h" +#include "ui/base/cursor/cursor_size.h" +#include "ui/base/cursor/types/cursor_types.h" #include "ui/base/ui_base_export.h" #include "ui/gfx/geometry/point.h"
diff --git a/ui/base/cursor/cursor_loader.h b/ui/base/cursor/cursor_loader.h index 527b1472..71e7e223 100644 --- a/ui/base/cursor/cursor_loader.h +++ b/ui/base/cursor/cursor_loader.h
@@ -8,7 +8,7 @@ #include "base/logging.h" #include "base/macros.h" #include "base/strings/string16.h" -#include "ui/base/cursor/cursor_type.h" +#include "ui/base/cursor/types/cursor_types.h" #include "ui/base/ui_base_export.h" #include "ui/display/display.h" #include "ui/gfx/geometry/point.h"
diff --git a/ui/base/cursor/cursor_size.h b/ui/base/cursor/cursor_size.h new file mode 100644 index 0000000..ef02489 --- /dev/null +++ b/ui/base/cursor/cursor_size.h
@@ -0,0 +1,14 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_BASE_CURSOR_CURSOR_SIZE_H_ +#define UI_BASE_CURSOR_CURSOR_SIZE_H_ + +namespace ui { + +enum class CursorSize { kNormal, kLarge }; + +} // namespace ui + +#endif // UI_BASE_CURSOR_CURSOR_SIZE_H_
diff --git a/ui/base/cursor/cursor_type.h b/ui/base/cursor/cursor_type.h deleted file mode 100644 index 74a34a53..0000000 --- a/ui/base/cursor/cursor_type.h +++ /dev/null
@@ -1,75 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_BASE_CURSOR_CURSOR_TYPE_H_ -#define UI_BASE_CURSOR_CURSOR_TYPE_H_ - -namespace ui { - -enum class CursorType { - // Equivalent to a NULL HCURSOR on Windows. - kNull = 0, - - // These cursors mirror WebKit cursors from WebCursorInfo, but are replicated - // here so we don't introduce a WebKit dependency. - // TODO(crbug.com/969904): Merge this with WebCursorInfo - kPointer = 1, - kCross = 2, - kHand = 3, - kIBeam = 4, - kWait = 5, - kHelp = 6, - kEastResize = 7, - kNorthResize = 8, - kNorthEastResize = 9, - kNorthWestResize = 10, - kSouthResize = 11, - kSouthEastResize = 12, - kSouthWestResize = 13, - kWestResize = 14, - kNorthSouthResize = 15, - kEastWestResize = 16, - kNorthEastSouthWestResize = 17, - kNorthWestSouthEastResize = 18, - kColumnResize = 19, - kRowResize = 20, - kMiddlePanning = 21, - kEastPanning = 22, - kNorthPanning = 23, - kNorthEastPanning = 24, - kNorthWestPanning = 25, - kSouthPanning = 26, - kSouthEastPanning = 27, - kSouthWestPanning = 28, - kWestPanning = 29, - kMove = 30, - kVerticalText = 31, - kCell = 32, - kContextMenu = 33, - kAlias = 34, - kProgress = 35, - kNoDrop = 36, - kCopy = 37, - kNone = 38, - kNotAllowed = 39, - kZoomIn = 40, - kZoomOut = 41, - kGrab = 42, - kGrabbing = 43, - kMiddlePanningVertical = 44, - kMiddlePanningHorizontal = 45, - kCustom = 46, - - // These additional drag and drop cursors are not listed in WebCursorInfo. - kDndNone = 47, - kDndMove = 48, - kDndCopy = 49, - kDndLink = 50, -}; - -enum class CursorSize { kNormal, kLarge }; - -} // namespace ui - -#endif // UI_BASE_CURSOR_CURSOR_TYPE_H_
diff --git a/ui/base/cursor/types/README.md b/ui/base/cursor/types/README.md new file mode 100644 index 0000000..0546f97 --- /dev/null +++ b/ui/base/cursor/types/README.md
@@ -0,0 +1,6 @@ +This directory contains a set of basic types related to cursors that can +be used across the input pipeline, from the UI layer down to consumers such as +Blink. Despite these types being in the ```ui``` namespace for simplicity, in +general, the ```ui``` namespace is not able to be included from all those +components. +Please do not add code/types that should not be reachable from Blink. \ No newline at end of file
diff --git a/ui/base/cursor/types/cursor_types.h b/ui/base/cursor/types/cursor_types.h new file mode 100644 index 0000000..81e704e --- /dev/null +++ b/ui/base/cursor/types/cursor_types.h
@@ -0,0 +1,70 @@ +// 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 UI_BASE_CURSOR_TYPES_CURSOR_TYPES_H_ +#define UI_BASE_CURSOR_TYPES_CURSOR_TYPES_H_ + +namespace ui { + +// A Java counterpart will be generated for this enum. +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui_base.web +// GENERATED_JAVA_CLASS_NAME_OVERRIDE: CursorType +enum class CursorType { + kNull = -1, // Set to -1 to maintain back-compat with PP API defines. + kPointer, + kCross, + kHand, + kIBeam, + kWait, + kHelp, + kEastResize, + kNorthResize, + kNorthEastResize, + kNorthWestResize, + kSouthResize, + kSouthEastResize, + kSouthWestResize, + kWestResize, + kNorthSouthResize, + kEastWestResize, + kNorthEastSouthWestResize, + kNorthWestSouthEastResize, + kColumnResize, + kRowResize, + kMiddlePanning, + kEastPanning, + kNorthPanning, + kNorthEastPanning, + kNorthWestPanning, + kSouthPanning, + kSouthEastPanning, + kSouthWestPanning, + kWestPanning, + kMove, + kVerticalText, + kCell, + kContextMenu, + kAlias, + kProgress, + kNoDrop, + kCopy, + kNone, + kNotAllowed, + kZoomIn, + kZoomOut, + kGrab, + kGrabbing, + kMiddlePanningVertical, + kMiddlePanningHorizontal, + kCustom, + kDndNone, + kDndMove, + kDndCopy, + kDndLink, + kMaxValue = kDndLink +}; + +} // namespace ui + +#endif // UI_BASE_CURSOR_TYPES_CURSOR_TYPES_H_
diff --git a/ui/base/ime/win/input_method_win_base.cc b/ui/base/ime/win/input_method_win_base.cc index 2627f1e..3b7a46b8 100644 --- a/ui/base/ime/win/input_method_win_base.cc +++ b/ui/base/ime/win/input_method_win_base.cc
@@ -26,7 +26,6 @@ #include "ui/events/event_constants.h" #include "ui/events/event_utils.h" #include "ui/events/keycodes/keyboard_codes.h" -#include "ui/gfx/win/hwnd_util.h" namespace ui { namespace { @@ -297,12 +296,6 @@ } } - // Explicitly show the system menu at a good location on [Alt]+[Space]. - // Note: Setting |handled| to FALSE for DefWindowProc triggering of the system - // menu causes undesirable titlebar artifacts in the classic theme. - if (message == WM_SYSCHAR && wparam == VK_SPACE) - gfx::ShowSystemMenu(window_handle); - return 0; }
diff --git a/ui/base/mojo/cursor.typemap b/ui/base/mojo/cursor.typemap index 481b16c..6b9f3ed9 100644 --- a/ui/base/mojo/cursor.typemap +++ b/ui/base/mojo/cursor.typemap
@@ -4,8 +4,9 @@ mojom = "//ui/base/mojo/cursor.mojom" public_headers = [ - "//ui/base/cursor/cursor_type.h", + "//ui/base/cursor/cursor_size.h", "//ui/base/cursor/cursor.h", + "//ui/base/cursor/types/cursor_types.h", ] traits_headers = [ "//ui/base/mojo/cursor_struct_traits.h" ] sources = [
diff --git a/ui/base/mojo/cursor_struct_traits.h b/ui/base/mojo/cursor_struct_traits.h index a828166..5568fdf 100644 --- a/ui/base/mojo/cursor_struct_traits.h +++ b/ui/base/mojo/cursor_struct_traits.h
@@ -6,7 +6,6 @@ #define UI_BASE_MOJO_CURSOR_STRUCT_TRAITS_H_ #include "ui/base/cursor/cursor.h" -#include "ui/base/cursor/cursor_type.h" #include "ui/base/mojo/cursor.mojom-shared.h" namespace mojo {
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb index 4b039d4..a7125d4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -286,6 +286,7 @@ <translation id="4568854179928172494">የተሻሻለበት ጊዜ</translation> <translation id="4572815280350369984"><ph name="FILE_TYPE" /> ፋይል</translation> <translation id="457386861538956877">ተጨማሪ...</translation> +<translation id="4579744207439506346"><ph name="ENTRY_NAME" /> ወደ ምርጫ ታክለዋል።</translation> <translation id="4582497162516204941">ከLinux (ቅድመ ይሁንታ ሙከራ) ጋር ጫን</translation> <translation id="4594543368593301662">ለ <ph name="SEARCH_TERM" /> ውጤቶችን በማሳየት ላይ።</translation> <translation id="4631887759990505102">አርቲስት</translation> @@ -419,6 +420,7 @@ <translation id="5819442873484330149">ሃንጉል 3 ስብስብ (የመጨረሻ)</translation> <translation id="5833610766403489739">ይህ ፋይል ወደሆነ ቦታ ሄዷል። እባክዎ የውርድ አካባቢዎን ያረጋግጡና እንደገና ይሞክሩ።</translation> <translation id="5838051104334203064">የ Play መደብር መተግበሪያዎች ይህን መሣሪያ ሊደርሱበት አይችሉም</translation> +<translation id="5838451609423551646">ሁሉም ግቤቶች ከምርጫ ተወግደዋል።</translation> <translation id="5838825566232597749">አሜሪካ ዎርክማን አለምአቀፍ</translation> <translation id="5850516540536751549">ይህ የፋይል ዓይነት አይደገፍም። እባክዎ የዚህ አይነት ፋይል መክፈት የሚችል መተግበሪያ ለማግኘት <ph name="BEGIN_LINK" />Chrome የድር መደብር<ph name="END_LINK" />ን ይጎብኙ። <ph name="BEGIN_LINK_HELP" />ተጨማሪ ለመረዳት<ph name="END_LINK_HELP" /></translation> <translation id="5851063901794976166">እዚህ ላይ ምንም የሚታይ ነገር የለም...</translation> @@ -491,6 +493,7 @@ <translation id="6820687829547641339">Gzip የታመቀ የtar ማህደር</translation> <translation id="6825883775269213504">ራሽኛ</translation> <translation id="6827236167376090743">ላሞቹ ቤት እስኪገቡ ድረስ ይህ ቪዲዮ መጫወቱን ይቀጥላል።</translation> +<translation id="6847101934483209767"><ph name="ENTRY_NAME" /> ከምርጫ ተወግዷል።</translation> <translation id="6862635236584086457">በዚህ አቃፊ ውስጥ የተቀመጡ ፋይሎች ሁሉ በራስ-ሰር መስመር ላይ መጠባበቂያ ይቀመጥላቸዋል</translation> <translation id="6870130893560916279">የዩክሬይንኛ ቁልፍ ሰሌዳ</translation> <translation id="6876155724392614295">ቢስክሌት</translation> @@ -618,6 +621,7 @@ <translation id="8148264977957212129">የፒንዪን ግቤት ስልት</translation> <translation id="8151638057146502721">አዋቅር</translation> <translation id="8153607920959057464">ይህ ፋይል ሊታይ አልቻለም።</translation> +<translation id="8154842056504218462">ሁሉም ግቤቶች ተመርጠዋል።</translation> <translation id="8157684860301034423">የመተግበሪያ መረጃን ሰርስሮ ማውጣት አልተሳካም።</translation> <translation id="8157939133946352716">7x5</translation> <translation id="8160015581537295331">የስፓኒሽ ቁልፍ ሰሌዳ</translation> @@ -660,6 +664,7 @@ <translation id="8686213429977032554">ይህ የDrive ፋይል ገና አልተጋራም</translation> <translation id="8698464937041809063">Google ስዕል</translation> <translation id="8714406895390098252">ቢስክሌት</translation> +<translation id="8719721339511222681"><ph name="ENTRY_NAME" /> ተመርጧል።</translation> <translation id="8722421161699219904">የአሜሪካ አለምአቀፍ ቁልፍ ሰሌዳ</translation> <translation id="872537912056138402">ክሮሽያንኛ</translation> <translation id="874420130893181774">ተለምዷዊ የፒንዪን ግቤት ስልት</translation> @@ -700,6 +705,7 @@ <translation id="942954117721265519">በዚህ አቃፊ ውስጥ ምንም ምስሎች የሉም።</translation> <translation id="943972244133411984">የተቀየረው በ</translation> <translation id="945522503751344254">ግብረ መልስ ላክ</translation> +<translation id="947144732524271678">ከ<ph name="FROM_ENTRY_NAME" /> እስከ <ph name="TO_ENTRY_NAME" /> ያሉ የ<ph name="ENTRY_COUNT" /> ግቤቶች ክልል ተመርጧል።</translation> <translation id="981121421437150478">ከመስመር ውጪ</translation> <translation id="988685240266037636">«<ph name="FILE_NAME" />» ፋይል አስቀድሞ አለ። ሊተኩት ይፈልጋሉ?</translation> <translation id="996903396648773764"><ph name="NUMBER_OF_MB" /> ሜባ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb index 2c4123a1..26b30c1b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -286,6 +286,7 @@ <translation id="4568854179928172494">Oras ng pagbago</translation> <translation id="4572815280350369984"><ph name="FILE_TYPE" /> na file</translation> <translation id="457386861538956877">Higit pa...</translation> +<translation id="4579744207439506346">Idinagdag ang <ph name="ENTRY_NAME" /> sa pagpipilian.</translation> <translation id="4582497162516204941">I-install gamit ang Linux (Beta)</translation> <translation id="4594543368593301662">Ipinapakita ang mga resulta para sa <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Artist</translation> @@ -419,6 +420,7 @@ <translation id="5819442873484330149">Hangul 3 Set (Panghuli)</translation> <translation id="5833610766403489739">Nawala ang file na ito. Pakitingnan ang iyong setting ng lokasyon ng pag-download at subukan ulit.</translation> <translation id="5838051104334203064">Hindi ma-access ng mga application sa Play Store ang device na ito</translation> +<translation id="5838451609423551646">Inalis ang lahat ng entry sa pagpipilian.</translation> <translation id="5838825566232597749">US Workman international</translation> <translation id="5850516540536751549">Hindi sinusuportahan ang uri ng file na ito. Pakibisita ang <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> upang maghanap ng app na makakapagbukas sa ganitong uri ng file. <ph name="BEGIN_LINK_HELP" />Matuto Pa<ph name="END_LINK_HELP" /></translation> @@ -492,6 +494,7 @@ <translation id="6820687829547641339">Archive na tar na Gzip compressed</translation> <translation id="6825883775269213504">Russian</translation> <translation id="6827236167376090743">Magpe-play ang video na ito nang paulit-ulit sa napakahabang panahon.</translation> +<translation id="6847101934483209767">Inalis ang <ph name="ENTRY_NAME" /> sa pagpipilian.</translation> <translation id="6862635236584086457">Lahat ng file na na-save sa folder na ito ay awtomatikong na-back up online</translation> <translation id="6870130893560916279">Ukrainian na keyboard</translation> <translation id="6876155724392614295">Bisikleta</translation> @@ -619,6 +622,7 @@ <translation id="8148264977957212129">Paraan ng pag-input na Pinyin</translation> <translation id="8151638057146502721">I-configure</translation> <translation id="8153607920959057464">Hindi maipakita ang file na ito.</translation> +<translation id="8154842056504218462">Pinili ang lahat ng entry.</translation> <translation id="8157684860301034423">Hindi na-retrieve ang impormasyon ng app.</translation> <translation id="8157939133946352716">7x5</translation> <translation id="8160015581537295331">Spanish na keyboard</translation> @@ -661,6 +665,7 @@ <translation id="8686213429977032554">Hindi pa ibinabahagi ang file sa Drive na ito</translation> <translation id="8698464937041809063">Drawing ng Google</translation> <translation id="8714406895390098252">Bisikleta</translation> +<translation id="8719721339511222681">Pinili ang <ph name="ENTRY_NAME" />.</translation> <translation id="8722421161699219904">US International keyboard</translation> <translation id="872537912056138402">Croatian</translation> <translation id="874420130893181774">Tradisyonal na Pinyin na paraan ng pag-input</translation> @@ -701,6 +706,7 @@ <translation id="942954117721265519">Walang mga larawan sa direktoryong ito.</translation> <translation id="943972244133411984">Binago ni</translation> <translation id="945522503751344254">Magpadala ng feedback...</translation> +<translation id="947144732524271678">Pumili ng hanay ng <ph name="ENTRY_COUNT" /> (na) entry mula sa <ph name="FROM_ENTRY_NAME" /> hanggang <ph name="TO_ENTRY_NAME" />.</translation> <translation id="981121421437150478">Offline</translation> <translation id="988685240266037636">Mayroon nang file na may pangalang "<ph name="FILE_NAME" />." Gusto mo ba itong palitan?</translation> <translation id="996903396648773764"><ph name="NUMBER_OF_MB" /> MB</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index b7a0e59..cbb2ecb 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -287,6 +287,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> கோப்பு</translation> <translation id="457386861538956877">மேலும்...</translation> <translation id="4582497162516204941">Linux (பீட்டா) மூலம் நிறுவு</translation> +<translation id="4594543368593301662"><ph name="SEARCH_TERM" /> என்பதற்கான தேடல் முடிவுகளைக் காட்டுகிறது.</translation> <translation id="4631887759990505102">கலைஞர்</translation> <translation id="4656293982926141856">இந்தக் கம்ப்யூட்டர்</translation> <translation id="4669606053856530811">இந்தக் கோப்புகளை '<ph name="SOURCE_NAME" />' இன் உறுப்பினர்களுடன் பகிரவில்லை எனில், அவர்கள் அவற்றுக்கான அணுகலை இழப்பார்கள்.</translation> @@ -384,12 +385,14 @@ <translation id="5412637665001827670">பல்கேரியன் விசைப்பலகை</translation> <translation id="5418923334382419584">மியான்மர் விசைப்பலகை</translation> <translation id="5428105026674456456">ஸ்பானிஷ்</translation> +<translation id="5438282218546237410"><ph name="SEARCH_TERM" /> என்பதற்கான தேடல் முடிவுகள் எதுவும் கிடைக்கவில்லை.</translation> <translation id="5464696796438641524">போலிஷ் விசைப்பலகை</translation> <translation id="5465122519792752163">நேபாள விசைப்பலகை (இன்ஸ்கிரிப்ட்)</translation> <translation id="5469868506864199649">இத்தாலியன்</translation> <translation id="5494920125229734069">எல்லாவற்றையும் தேர்ந்தெடு</translation> <translation id="5500122897333236901">ஐஸ்லாண்டிக்</translation> <translation id="5508696409934741614">புள்ளிகள்</translation> +<translation id="5522908512596376669">கோப்புப் பட்டியல் 'பட்டியல் காட்சிக்கு' மாறியுள்ளது.</translation> <translation id="5524517123096967210">கோப்பை படிக்க முடியவில்லை.</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" /> படம்</translation> <translation id="5533555070048896610">ஒலிபெயர்ப்பு (namaste → नमस्ते)</translation> @@ -436,6 +439,7 @@ <translation id="6040143037577758943">மூடு</translation> <translation id="6054173164583630569">ஃபிரெஞ்ச் விசைப்பலகை</translation> <translation id="6074825444536523002">Google படிவம்</translation> +<translation id="6096979789310008754">தேடல் உரை அழிக்கப்பட்டது, அனைத்துக் கோப்புகளையும் கோப்புறைகளையும் காட்டுகிறது.</translation> <translation id="6111770213269631447">ஒலிபெயர்ப்பு (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">இடைவெளி</translation> <translation id="6133173853026656527"><ph name="FILE_NAME" /> ஐ நகர்த்துகிறது...</translation> @@ -651,6 +655,7 @@ <translation id="8561206103590473338">யானை</translation> <translation id="8569764466147087991">திறப்பதற்கு ஒரு கோப்பைத் தேர்ந்தெடுக்கவும்</translation> <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> உருப்படிகளை ஒத்திசைக்கிறது...</translation> +<translation id="8600173386174225982">கோப்புப் பட்டியல் சிறுபடக் காட்சிக்கு மாறியுள்ளது.</translation> <translation id="8669949407341943408">நகர்கிறது...</translation> <translation id="8671210955687109937">கருத்துத் தெரிவிக்கலாம்</translation> <translation id="8686213429977032554">இந்த இயக்ககக் கோப்பு இன்னும் பகிரப்படவில்லை</translation>
diff --git a/ui/gfx/native_widget_types.h b/ui/gfx/native_widget_types.h index 121562a..2fa243c 100644 --- a/ui/gfx/native_widget_types.h +++ b/ui/gfx/native_widget_types.h
@@ -48,7 +48,8 @@ class Cursor; enum class CursorType; class Event; -} +} // namespace ui + #endif // defined(USE_AURA) #if defined(OS_WIN) @@ -215,7 +216,7 @@ // A constant value to indicate that gfx::NativeCursor refers to no cursor. #if defined(USE_AURA) -const ui::CursorType kNullCursor = static_cast<ui::CursorType>(0); +const ui::CursorType kNullCursor = static_cast<ui::CursorType>(-1); #else const gfx::NativeCursor kNullCursor = static_cast<gfx::NativeCursor>(NULL); #endif
diff --git a/ui/gfx/win/hwnd_util.cc b/ui/gfx/win/hwnd_util.cc index 1b42ccb..2851da7 100644 --- a/ui/gfx/win/hwnd_util.cc +++ b/ui/gfx/win/hwnd_util.cc
@@ -4,10 +4,8 @@ #include "ui/gfx/win/hwnd_util.h" -#include "base/i18n/rtl.h" #include "base/strings/string_util.h" #include "base/win/win_util.h" -#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -200,29 +198,6 @@ } } -void ShowSystemMenu(HWND window) { - RECT rect; - GetWindowRect(window, &rect); - Point point = Point(base::i18n::IsRTL() ? rect.right : rect.left, rect.top); - static const int kSystemMenuOffset = 10; - point.Offset(base::i18n::IsRTL() ? -kSystemMenuOffset : kSystemMenuOffset, - kSystemMenuOffset); - ShowSystemMenuAtPoint(window, point); -} - -void ShowSystemMenuAtPoint(HWND window, const Point& point) { - UINT flags = TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD; - if (base::i18n::IsRTL()) - flags |= TPM_RIGHTALIGN; - HMENU menu = GetSystemMenu(window, FALSE); - - const int command = - TrackPopupMenu(menu, flags, point.x(), point.y(), 0, window, NULL); - - if (command) - SendMessage(window, WM_SYSCOMMAND, command, 0); -} - extern "C" { typedef HWND (*RootWindow)(); }
diff --git a/ui/gfx/win/hwnd_util.h b/ui/gfx/win/hwnd_util.h index 2afd660..5351d94 100644 --- a/ui/gfx/win/hwnd_util.h +++ b/ui/gfx/win/hwnd_util.h
@@ -11,7 +11,6 @@ #include "ui/gfx/gfx_export.h" namespace gfx { -class Point; class Size; // A version of the GetClassNameW API that returns the class name in an @@ -40,10 +39,6 @@ // CreateWindow. GFX_EXPORT void CheckWindowCreated(HWND hwnd); -// Shows |window|'s system menu (at a specified |point| in screen coordinates). -GFX_EXPORT void ShowSystemMenu(HWND window); -GFX_EXPORT void ShowSystemMenuAtPoint(HWND window, const gfx::Point& point); - // Returns the window you can use to parent a top level window. // Note that in some cases we create child windows not parented to its final // container so in those cases you should pass true in |get_real_hwnd|.
diff --git a/ui/gl/child_window_win.cc b/ui/gl/child_window_win.cc index 9ae650f1..ab93f7fc 100644 --- a/ui/gl/child_window_win.cc +++ b/ui/gl/child_window_win.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/compiler_specific.h" +#include "base/debug/alias.h" #include "base/memory/weak_ptr.h" #include "base/win/wrapped_window_proc.h" #include "ui/gfx/win/hwnd_util.h" @@ -96,7 +97,11 @@ reinterpret_cast<wchar_t*>(g_window_class), L"", WS_CHILDWINDOW | WS_DISABLED | WS_VISIBLE, 0, 0, size.width(), size.height(), *parent_window, nullptr, nullptr, nullptr); - CHECK(window); + if (!window) { + logging::SystemErrorCode error = logging::GetLastSystemErrorCode(); + base::debug::Alias(&error); + CHECK(false); + } *child_window = window; event->Signal(); }
diff --git a/ui/strings/translations/ui_strings_am.xtb b/ui/strings/translations/ui_strings_am.xtb index c231f50..26d0d7f 100644 --- a/ui/strings/translations/ui_strings_am.xtb +++ b/ui/strings/translations/ui_strings_am.xtb
@@ -16,6 +16,7 @@ <translation id="1383876407941801731">ፍለጋ </translation> <translation id="1398853756734560583">አስፋ</translation> <translation id="1409544243779336081">የመተግበሪያ ምክር</translation> +<translation id="1498028757988366001">እርስዎ ይህን ከዚህ በፊት ፍለጋ አድርገውለታል። «<ph name="QUERY" />»ን ከታሪክዎ መሰረዝ በሁሉም መሣሪያዎችዎ ላይ እስከመጨረሻው ከመለያዎ ያስወግደዋል።</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 ደቂቃ እና }one{# ደቂቃዎች እና }other{# ደቂቃዎች እና }}</translation> <translation id="1643823602425662293">ማሳወቂያ</translation> <translation id="169515659049020177">Shift</translation> @@ -169,6 +170,7 @@ <translation id="7365057348334984696">{MINUTES,plural, =1{1 ደቂቃ በፊት}one{# ደቂቃዎች በፊት}other{# ደቂቃዎች በፊት}}</translation> <translation id="7389409599945284130">- <ph name="MESSAGE" /></translation> <translation id="7410957453383678442">{MINUTES,plural, =1{1 ደቂቃ ቀርቷል}one{# ደቂቃዎች ቀርቷል}other{# ደቂቃዎች ቀርተዋል}}</translation> +<translation id="7430878839542012341">ይሄ ፍለጋ ከታሪክዎ ይሰረዝ?</translation> <translation id="7460907917090416791"><ph name="QUANTITY" /> ቴባ</translation> <translation id="7507604095951736240">ስሜት ገላጭ ምስል</translation> <translation id="7658239707568436148">ይቅር</translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb index 2d825624..bf0bb21 100644 --- a/ui/strings/translations/ui_strings_fil.xtb +++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -16,6 +16,7 @@ <translation id="1383876407941801731">Hanapin</translation> <translation id="1398853756734560583">Maximize</translation> <translation id="1409544243779336081">Rekomendasyon sa app</translation> +<translation id="1498028757988366001">Hinanap mo ito dati. Kapag na-delete ang "<ph name="QUERY" />" sa iyong history, permanente itong aalisin sa account mo sa lahat ng iyong device.</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto at }one{# minuto at }other{# na minuto at }}</translation> <translation id="1643823602425662293">Notification</translation> <translation id="169515659049020177">Shift</translation> @@ -169,6 +170,7 @@ <translation id="7365057348334984696">{MINUTES,plural, =1{1 minuto ang nakalipas}one{# minuto ang nakalipas}other{# na minuto ang nakalipas}}</translation> <translation id="7389409599945284130">- <ph name="MESSAGE" /></translation> <translation id="7410957453383678442">{MINUTES,plural, =1{1 minuto na lang ang natitira}one{# minuto na lang ang natitira}other{# na minuto na lang ang natitira}}</translation> +<translation id="7430878839542012341">I-delete ang paghahanap na ito mula sa iyong history?</translation> <translation id="7460907917090416791"><ph name="QUANTITY" /> (na) TB</translation> <translation id="7507604095951736240">Emoji</translation> <translation id="7658239707568436148">Kanselahin</translation>
diff --git a/ui/strings/translations/ui_strings_pt-PT.xtb b/ui/strings/translations/ui_strings_pt-PT.xtb index 92d2282..313a214 100644 --- a/ui/strings/translations/ui_strings_pt-PT.xtb +++ b/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -16,7 +16,7 @@ <translation id="1383876407941801731">Pesquisar</translation> <translation id="1398853756734560583">Maximizar</translation> <translation id="1409544243779336081">Recomendação de aplicações</translation> -<translation id="1498028757988366001">Já efetuou esta pesquisa anteriormente. A eliminação de "<ph name="QUERY" />" remove permanentemente esta consulta da sua conta em todos os dispositivos.</translation> +<translation id="1498028757988366001">Já efetuou esta pesquisa anteriormente. A eliminação de "<ph name="QUERY" />" do histórico remove permanentemente esta consulta da sua conta em todos os dispositivos.</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto e }other{# minutos e }}</translation> <translation id="1643823602425662293">Notificação</translation> <translation id="169515659049020177">Shift</translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb index a531306..ec8778e 100644 --- a/ui/strings/translations/ui_strings_ta.xtb +++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ta"> +<translation id="1028699632127661925"><ph name="DEVICE_NAME" /> சாதனத்திற்கு அனுப்புகிறது...</translation> <translation id="111910763555783249">அறிவிப்பு அமைப்புகள்</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 நாள் முன்பு}other{# நாட்கள் உள்ளன}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 நிமிடத்திற்கு முன்பு}other{# நிமிடங்களுக்கு முன்பு}}</translation>
diff --git a/ui/views/linux_ui/status_icon_linux.h b/ui/views/linux_ui/status_icon_linux.h index a9c65be1..652e436f 100644 --- a/ui/views/linux_ui/status_icon_linux.h +++ b/ui/views/linux_ui/status_icon_linux.h
@@ -31,7 +31,7 @@ virtual const gfx::ImageSkia& GetImage() const = 0; virtual const base::string16& GetToolTip() const = 0; - virtual const ui::MenuModel* GetMenuModel() const = 0; + virtual ui::MenuModel* GetMenuModel() const = 0; // This should be called at most once by the implementation. virtual void OnImplInitialized(bool success) = 0;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc index c18d5fb..d423f5f 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -900,6 +900,16 @@ } void DesktopWindowTreeHostWin::HandleKeyEvent(ui::KeyEvent* event) { + // Bypass normal handling of alt-space, which would otherwise consume the + // corresponding WM_SYSCHAR. This allows HandleIMEMessage() to show the + // system menu in this case. If we instead showed the system menu here, the + // WM_SYSCHAR would trigger a beep when processed by the native event handler. + if ((event->type() == ui::ET_KEY_PRESSED) && + (event->key_code() == ui::VKEY_SPACE) && + (event->flags() & ui::EF_ALT_DOWN) && GetWidget()->non_client_view()) { + return; + } + SendEventToSink(event); } @@ -935,6 +945,15 @@ WPARAM w_param, LPARAM l_param, LRESULT* result) { + // Show the system menu at an appropriate location on alt-space. + if ((message == WM_SYSCHAR) && (w_param == VK_SPACE) && + GetWidget()->non_client_view()) { + const auto* frame = GetWidget()->non_client_view()->frame_view(); + ShowSystemMenuAtScreenPixelLocation( + GetHWND(), frame->GetSystemMenuScreenPixelLocation()); + return true; + } + MSG msg = {}; msg.hwnd = GetHWND(); msg.message = message;
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index 609f523..3541c2d 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -1637,8 +1637,8 @@ } void Widget::UpdatePaintAsActiveState(bool paint_as_active) { - if (non_client_view()) - non_client_view()->frame_view()->PaintAsActiveChanged(paint_as_active); + if (non_client_view_) + non_client_view_->frame_view()->PaintAsActiveChanged(paint_as_active); if (widget_delegate()) widget_delegate()->OnPaintAsActiveChanged(paint_as_active); }
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index de88c76..4f7b6667 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -61,6 +61,7 @@ #include "ui/views/widget/widget_hwnd_utils.h" #include "ui/views/win/fullscreen_handler.h" #include "ui/views/win/hwnd_message_handler_delegate.h" +#include "ui/views/win/hwnd_util.h" #include "ui/views/win/scoped_fullscreen_visibility.h" namespace views { @@ -2837,6 +2838,8 @@ } if (message == WM_RBUTTONUP && is_right_mouse_pressed_on_caption_) { + // TODO(pkasting): Maybe handle this in DesktopWindowTreeHostWin, where we + // handle alt-space, or in the frame itself. is_right_mouse_pressed_on_caption_ = false; ReleaseCapture(); // |point| is in window coordinates, but WM_NCHITTEST and TrackPopupMenu() @@ -2846,7 +2849,7 @@ w_param = SendMessage(hwnd(), WM_NCHITTEST, 0, MAKELPARAM(screen_point.x, screen_point.y)); if (w_param == HTCAPTION || w_param == HTSYSMENU) { - gfx::ShowSystemMenuAtPoint(hwnd(), gfx::Point(screen_point)); + ShowSystemMenuAtScreenPixelLocation(hwnd(), gfx::Point(screen_point)); return 0; } } else if (message == WM_NCLBUTTONDOWN &&
diff --git a/ui/views/win/hwnd_util.h b/ui/views/win/hwnd_util.h index 6e3e2f0..1aaacb9 100644 --- a/ui/views/win/hwnd_util.h +++ b/ui/views/win/hwnd_util.h
@@ -5,6 +5,7 @@ #ifndef UI_VIEWS_WIN_HWND_UTIL_H_ #define UI_VIEWS_WIN_HWND_UTIL_H_ +#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/native_widget_types.h" #include "ui/views/views_export.h" @@ -28,6 +29,12 @@ VIEWS_EXPORT gfx::Rect GetWindowBoundsForClientBounds( View* view, const gfx::Rect& client_bounds); + +// Shows |window|'s system menu (at a specified |point| in screen physical +// coordinates). +VIEWS_EXPORT void ShowSystemMenuAtScreenPixelLocation(HWND window, + const gfx::Point& point); + } // namespace views #endif // UI_VIEWS_WIN_HWND_UTIL_H_
diff --git a/ui/views/win/hwnd_util_aurawin.cc b/ui/views/win/hwnd_util_aurawin.cc index cbd06d0..f404e7e2 100644 --- a/ui/views/win/hwnd_util_aurawin.cc +++ b/ui/views/win/hwnd_util_aurawin.cc
@@ -4,6 +4,7 @@ #include "ui/views/win/hwnd_util.h" +#include "base/i18n/rtl.h" #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" #include "ui/views/widget/widget.h" @@ -44,4 +45,17 @@ return client_bounds; } +void ShowSystemMenuAtScreenPixelLocation(HWND window, const gfx::Point& point) { + UINT flags = TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD; + if (base::i18n::IsRTL()) + flags |= TPM_RIGHTALIGN; + HMENU menu = GetSystemMenu(window, FALSE); + + const int command = + TrackPopupMenu(menu, flags, point.x(), point.y(), 0, window, nullptr); + + if (command) + SendMessage(window, WM_SYSCOMMAND, command, 0); +} + } // namespace views
diff --git a/ui/views/window/non_client_view.cc b/ui/views/window/non_client_view.cc index 656a6998..167888d4 100644 --- a/ui/views/window/non_client_view.cc +++ b/ui/views/window/non_client_view.cc
@@ -15,6 +15,10 @@ #include "ui/views/widget/widget.h" #include "ui/views/window/client_view.h" +#if defined(OS_WIN) +#include "ui/display/win/screen_win.h" +#endif + namespace views { // The frame view and the client view are always at these specific indices, @@ -33,6 +37,17 @@ return false; } +#if defined(OS_WIN) +gfx::Point NonClientFrameView::GetSystemMenuScreenPixelLocation() const { + gfx::Point point(GetMirroredXInView(GetBoundsForClientView().x()), + GetSystemMenuY()); + View::ConvertPointToScreen(this, &point); + point = display::win::ScreenWin::DIPToScreenPoint(point); + // The native system menu seems to overlap the titlebar by 1 px. Match that. + return point - gfx::Vector2d(0, 1); +} +#endif + //////////////////////////////////////////////////////////////////////////////// // NonClientView, public: @@ -322,6 +337,15 @@ return !GetWidget()->client_view()->bounds().Intersects(rect); } +//////////////////////////////////////////////////////////////////////////////// +// NonClientFrameView, private: + +#if defined(OS_WIN) +int NonClientFrameView::GetSystemMenuY() const { + return GetBoundsForClientView().y(); +} +#endif + BEGIN_METADATA(NonClientFrameView) METADATA_PARENT_CLASS(View) END_METADATA()
diff --git a/ui/views/window/non_client_view.h b/ui/views/window/non_client_view.h index 222ca7c..a37c98cc 100644 --- a/ui/views/window/non_client_view.h +++ b/ui/views/window/non_client_view.h
@@ -6,6 +6,7 @@ #define UI_VIEWS_WINDOW_NON_CLIENT_VIEW_H_ #include "base/macros.h" +#include "build/build_config.h" #include "ui/views/view.h" #include "ui/views/view_targeter_delegate.h" @@ -65,6 +66,12 @@ // used. virtual bool GetClientMask(const gfx::Size& size, SkPath* mask) const; +#if defined(OS_WIN) + // Returns the point in screen physical coordinates at which the system menu + // should be opened. + virtual gfx::Point GetSystemMenuScreenPixelLocation() const; +#endif + // This function must ask the ClientView to do a hittest. We don't do this in // the parent NonClientView because that makes it more difficult to calculate // hittests for regions that are partially obscured by the ClientView, e.g. @@ -98,6 +105,13 @@ const gfx::Rect& rect) const override; private: +#if defined(OS_WIN) + // Returns the y coordinate, in local coordinates, at which the system menu + // should be opened. Since this is in DIP, it does not include the 1 px + // offset into the caption area; the caller will take care of this. + virtual int GetSystemMenuY() const; +#endif + DISALLOW_COPY_AND_ASSIGN(NonClientFrameView); };
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 0ef9510f..bdbc9af 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
@@ -18,8 +18,6 @@ min-width: 128px; outline: none; padding: 0; - - @apply --cr-action-menu-dialog; } :host dialog::backdrop {
diff --git a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html index 2b9d430..3c100c0 100644 --- a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html +++ b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
@@ -47,7 +47,6 @@ flex-direction: column; max-height: 100vh; overflow: auto; - @apply --cr-dialog-wrapper; } /* When needing to flex, force .body-container alone to shrink. */ @@ -196,7 +195,7 @@ on-cancel="onNativeDialogCancel_" part="dialog"> <!-- This wrapper is necessary, such that the "pulse" animation is not erroneously played when the user clicks on the outer-most scrollbar. --> - <div id="content-wrapper"> + <div id="content-wrapper" part="wrapper"> <div class="top-container"> <div class="title-container" tabindex="-1"> <slot name="title"></slot>
diff --git a/ui/webui/resources/js/cr/ui/focus_outline_manager.js b/ui/webui/resources/js/cr/ui/focus_outline_manager.js index 3432f1e6..ecf45c5 100644 --- a/ui/webui/resources/js/cr/ui/focus_outline_manager.js +++ b/ui/webui/resources/js/cr/ui/focus_outline_manager.js
@@ -9,6 +9,9 @@ */ const CLASS_NAME = 'focus-outline-visible'; + /** @type {!Map<!Document, !cr.ui.FocusOutlineManager>} */ + const docsToManager = new Map(); + /** * This class sets a CSS class name on the HTML element of |doc| when the user * presses the tab key. It removes the class name when the user clicks @@ -23,46 +26,47 @@ * And the outline will only be shown if the user uses the keyboard to get to * it. * - * @param {Document} doc The document to attach the focus outline manager to. - * @constructor */ - function FocusOutlineManager(doc) { - this.classList_ = doc.documentElement.classList; - - const onEvent = function(focusByKeyboard, e) { - if (this.focusByKeyboard_ === focusByKeyboard) { - return; - } - this.focusByKeyboard_ = focusByKeyboard; - this.updateVisibility(); - }; - - doc.addEventListener('keydown', onEvent.bind(this, true), true); - doc.addEventListener('mousedown', onEvent.bind(this, false), true); - - doc.addEventListener('focusout', function(event) { - window.setTimeout(function() { - if (!doc.hasFocus()) { - this.focusByKeyboard_ = true; - this.updateVisibility(); - } - }.bind(this), 0); - }.bind(this)); - - this.updateVisibility(); - } - - FocusOutlineManager.prototype = { + class FocusOutlineManager { /** - * Whether focus change is triggered by TAB key. - * @type {boolean} - * @private + * @param {!Document} doc The document to attach the focus outline manager + * to. */ - focusByKeyboard_: true, + constructor(doc) { + /** + * Whether focus change is triggered by TAB key. + * @private {boolean} + */ + this.focusByKeyboard_ = true; - updateVisibility: function() { + this.classList_ = doc.documentElement.classList; + + const onEvent = function(focusByKeyboard, e) { + if (this.focusByKeyboard_ === focusByKeyboard) { + return; + } + this.focusByKeyboard_ = focusByKeyboard; + this.updateVisibility(); + }; + + doc.addEventListener('keydown', onEvent.bind(this, true), true); + doc.addEventListener('mousedown', onEvent.bind(this, false), true); + + doc.addEventListener('focusout', event => { + window.setTimeout(() => { + if (!doc.hasFocus()) { + this.focusByKeyboard_ = true; + this.updateVisibility(); + } + }, 0); + }); + + this.updateVisibility(); + } + + updateVisibility() { this.visible = this.focusByKeyboard_; - }, + } /** * Whether the focus outline should be visible. @@ -70,29 +74,27 @@ */ set visible(visible) { this.classList_.toggle(CLASS_NAME, visible); - }, + } + get visible() { return this.classList_.contains(CLASS_NAME); } - }; - /** @type {!Map<!Document, !cr.ui.FocusOutlineManager>} */ - const docsToManager = new Map(); - - /** - * Gets a per document singleton focus outline manager. - * @param {!Document} doc The document to get the |FocusOutlineManager| for. - * @return {!cr.ui.FocusOutlineManager} The per document singleton focus - * outline manager. - */ - FocusOutlineManager.forDocument = function(doc) { - let manager = docsToManager.get(doc); - if (!manager) { - manager = new FocusOutlineManager(doc); - docsToManager.set(doc, manager); + /** + * Gets a per document singleton focus outline manager. + * @param {!Document} doc The document to get the |FocusOutlineManager| for. + * @return {!cr.ui.FocusOutlineManager} The per document singleton focus + * outline manager. + */ + static forDocument(doc) { + let manager = docsToManager.get(doc); + if (!manager) { + manager = new FocusOutlineManager(doc); + docsToManager.set(doc, manager); + } + return manager; } - return manager; - }; + } return {FocusOutlineManager: FocusOutlineManager}; });
diff --git a/ui/webui/resources/js/promise_resolver.js b/ui/webui/resources/js/promise_resolver.js index d19f7f73..2f5603cbe 100644 --- a/ui/webui/resources/js/promise_resolver.js +++ b/ui/webui/resources/js/promise_resolver.js
@@ -16,63 +16,65 @@ * resolver.resolve({hello: 'world'}); */ -/** - * @constructor @struct - * @template T - */ -function PromiseResolver() { - /** @private {function(T=): void} */ - this.resolve_; +/** @template T */ +// eslint-disable-next-line no-var +var PromiseResolver = class { + constructor() { + /** @private {function(T=): void} */ + this.resolve_; - /** @private {function(*=): void} */ - this.reject_; + /** @private {function(*=): void} */ + this.reject_; - /** @private {boolean} */ - this.isFulfilled_ = false; + /** @private {boolean} */ + this.isFulfilled_ = false; - /** @private {!Promise<T>} */ - this.promise_ = new Promise(function(resolve, reject) { - this.resolve_ = /** @param {T=} resolution */ function(resolution) { - resolve(resolution); - this.isFulfilled_ = true; - }; - this.reject_ = /** @param {*=} reason */ function(reason) { - reject(reason); - this.isFulfilled_ = true; - }; - }.bind(this)); -} + /** @private {!Promise<T>} */ + this.promise_ = new Promise((resolve, reject) => { + this.resolve_ = /** @param {T=} resolution */ (resolution) => { + resolve(resolution); + this.isFulfilled_ = true; + }; + this.reject_ = /** @param {*=} reason */ (reason) => { + reject(reason); + this.isFulfilled_ = true; + }; + }); + } -PromiseResolver.prototype = { /** @return {boolean} Whether this resolver has been resolved or rejected. */ get isFulfilled() { return this.isFulfilled_; - }, + } + set isFulfilled(i) { assertNotReached(); - }, + } /** @return {!Promise<T>} */ get promise() { return this.promise_; - }, + } + set promise(p) { assertNotReached(); - }, + } /** @return {function(T=): void} */ get resolve() { return this.resolve_; - }, + } + set resolve(r) { assertNotReached(); - }, + } /** @return {function(*=): void} */ get reject() { return this.reject_; - }, + } + set reject(s) { assertNotReached(); - }, + } };