diff --git a/DEPS b/DEPS index ca91a592..0e290f2 100644 --- a/DEPS +++ b/DEPS
@@ -121,7 +121,7 @@ # 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': '428ec1e55c051f5aa1e1b758cb458f88b78f8ecf', + 'skia_revision': '30cf62bf481a067f61502123f2f5dfd2ea39ab15', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -133,7 +133,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': '96c11cc7949025b21283483eab0c1e2cc1e73e50', + 'angle_revision': 'bcb7890895d27c3d479aa45432f4b9c27dd119d4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. @@ -181,7 +181,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': '7d95d86a652fb83e619f1861708d19f938bf32de', + 'catapult_revision': '3a190c23ddf1f45cdfa478864bc7078a3c6b2238', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -368,7 +368,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'a11af9d5db2a54be82e97e23515eb2b55d2bf92b', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'be6819217716fba3e1cbc60b62f62acf9d552a94', 'condition': 'checkout_ios', }, @@ -679,7 +679,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'a73e5af7bb15f669651fee13e4a4d27b46efb574', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '68aea51103a9cb4e036a6bb574d28e02f3a4acad', 'condition': 'checkout_linux', }, @@ -1199,7 +1199,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'a2b35635aaef3e9301d69f77f9a0a3fd99291b08', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '9a4f38ec5c4aa23d24dceb7161c41eb379198f89', + Var('webrtc_git') + '/src.git' + '@' + '3793bb447ae5d502bd4f763d688c65eb47c05ede', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1230,7 +1230,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fd3d56928fcabcbd7745cbc168f3f2b493ed50d4', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@345719ad76875e9033baf6a384126a356d1833e9', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/aw_autofill_client.cc b/android_webview/browser/aw_autofill_client.cc index 8d8a9543..35941e4 100644 --- a/android_webview/browser/aw_autofill_client.cc +++ b/android_webview/browser/aw_autofill_client.cc
@@ -238,8 +238,6 @@ const base::string16& autofilled_value, const base::string16& profile_full_name) {} -void AwAutofillClient::DidInteractWithNonsecureCreditCardInput() {} - bool AwAutofillClient::IsContextSecure() { content::SSLStatus ssl_status; content::NavigationEntry* navigation_entry =
diff --git a/android_webview/browser/aw_autofill_client.h b/android_webview/browser/aw_autofill_client.h index bcc8842f..18f2783 100644 --- a/android_webview/browser/aw_autofill_client.h +++ b/android_webview/browser/aw_autofill_client.h
@@ -129,7 +129,6 @@ const std::vector<autofill::FormStructure*>& forms) override; void DidFillOrPreviewField(const base::string16& autofilled_value, const base::string16& profile_full_name) override; - void DidInteractWithNonsecureCreditCardInput() override; bool IsContextSecure() override; bool ShouldShowSigninPromo() override; bool AreServerCardsSupported() override;
diff --git a/ash/components/strings/ash_components_strings_bn.xtb b/ash/components/strings/ash_components_strings_bn.xtb index 53c49c88..1bfb54c6 100644 --- a/ash/components/strings/ash_components_strings_bn.xtb +++ b/ash/components/strings/ash_components_strings_bn.xtb
@@ -145,7 +145,7 @@ <translation id="671928215901716392">স্ক্রিন লক করুন</translation> <translation id="6727005317916125192">পূর্ববর্তী ফলক</translation> <translation id="6740781404993465795">পরের শব্দ অথবা অক্ষরটি বেছে নিন</translation> -<translation id="6755851152783057058">শেষ ব্যবহৃত ইনপুট পদ্ধতিতে পরিবর্তন করুন</translation> +<translation id="6755851152783057058">শেষ ব্যবহৃত ইনপুট পদ্ধতিতে পাল্টান</translation> <translation id="6760706756348334449">ভলিউম কমান</translation> <translation id="6941333068993625698">মতামত জমা দিন</translation> <translation id="6981982820502123353">অ্যাক্সেযোগ্যতা</translation> @@ -156,7 +156,7 @@ <translation id="7237562915163138771">অ্যাড্রেস বারে ওয়েব অ্যাড্রেস টাইপ করুন, তারপর <ph name="ALT" /><ph name="SEPARATOR" /><ph name="ENTER" /> টিপুন</translation> <translation id="7254764037241667478">ডিভাইসটি স্লিপ মোডে রাখুন (সাসপেন্ড)</translation> <translation id="7379254767514753910"><ph name="ALT" /> অথবা <ph name="SEARCH" /><ph name="SEPARATOR" /><ph name="UP" /></translation> -<translation id="7422707470576323858">পরবর্তী উপলভ্য ইনপুট পদ্ধতিতে পরিবর্তন করুন</translation> +<translation id="7422707470576323858">পরবর্তী উপলভ্য ইনপুট পদ্ধতিতে পাল্টান</translation> <translation id="743754632698445141">অ্যাপটি আনপিন করুন</translation> <translation id="7439718573248533901">পরের অক্ষরটি মুছুন (সামনের দিকে মুছুন)</translation> <translation id="7611271430932669992">পপআপ এবং ডায়ালগগুলিতে ফোকাস সরান</translation>
diff --git a/ash/components/strings/ash_components_strings_iw.xtb b/ash/components/strings/ash_components_strings_iw.xtb index f042716..7a85ed4 100644 --- a/ash/components/strings/ash_components_strings_iw.xtb +++ b/ash/components/strings/ash_components_strings_iw.xtb
@@ -3,7 +3,7 @@ <translationbundle lang="iw"> <translation id="104962181688258143">פתיחת האפליקציה 'קבצים'</translation> <translation id="1122869341872663659">מוצגות <ph name="N" /> תוצאות חיפוש לגבי <ph name="QUERY" /></translation> -<translation id="1195667586424773550">גרירת הקישור אל סרגל הכתובות של הכרטיסייה</translation> +<translation id="1195667586424773550">גרירת הקישור אל שורת כתובת האתר של הכרטיסייה</translation> <translation id="1204450209689312104">פתיחת חלון חדש במצב גלישה בסתר</translation> <translation id="1251638888133819822">הפעלה או השבתה של הזכוכית המגדלת במסך מלא</translation> <translation id="1290373024480130896"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="MODIFIER3" /><ph name="SEPARATOR3" /><ph name="KEY" /></translation> @@ -58,7 +58,7 @@ <translation id="309173601632226815">הדגשת הלחצן של מרכז האפליקציות במדף</translation> <translation id="3105917916468784889">ביצוע של צילום מסך</translation> <translation id="3126026824346185272">Ctrl</translation> -<translation id="3140353188828248647">התמקד בסרגל הכתובות</translation> +<translation id="3140353188828248647">התמקדות בשורת כתובת האתר</translation> <translation id="3256109297135787951">הסרת הסימון מפריט במדף</translation> <translation id="3288816184963444640">סגירת החלון הנוכחי</translation> <translation id="3407560819924487926">פתיחת מנהל המשימות</translation> @@ -185,7 +185,7 @@ <translation id="8855885154700222542">מקש מסך מלא</translation> <translation id="88986195241502842">Page down</translation> <translation id="8924883688469390268">מעבר למשתמש הקודם</translation> -<translation id="8977648847395357314">בחירת התוכן בסרגל הכתובות</translation> +<translation id="8977648847395357314">בחירת התוכן בשורת כתובת האתר</translation> <translation id="8982190978301344584">הצגת התפריט של רשימת עורכי IME הזמינים</translation> <translation id="8990356943438003669"><ph name="ALT" /><ph name="SEPARATOR" /> 1 עד 8</translation> <translation id="9005984960510803406">פתיחת חלון Crosh</translation>
diff --git a/ash/keyboard/ash_keyboard_controller.cc b/ash/keyboard/ash_keyboard_controller.cc index c412d4c..8dbb4ca0 100644 --- a/ash/keyboard/ash_keyboard_controller.cc +++ b/ash/keyboard/ash_keyboard_controller.cc
@@ -14,7 +14,7 @@ #include "ui/base/ui_base_features.h" #include "ui/gfx/geometry/rect.h" #include "ui/keyboard/keyboard_controller.h" -#include "ui/keyboard/keyboard_ui.h" +#include "ui/keyboard/keyboard_ui_factory.h" #include "ui/wm/core/coordinate_conversion.h" using keyboard::mojom::KeyboardConfig; @@ -52,21 +52,10 @@ // reloading the keyboard. DeactivateKeyboard(); - std::unique_ptr<keyboard::KeyboardUI> keyboard_ui; - if (::features::IsUsingWindowService()) { - // TODO(stevenjb): The AshKeyboardController/KeyboardController/KeyboardUI - // relationship is awkward. KeyboardController should maybe use a delegate - // instead. For now, keep a pointer to AshKeyboardUI which is owned by - // |keyboard_controller_| which is owned by this. - auto ash_keyboard_ui = std::make_unique<AshKeyboardUI>(this); - ash_keyboard_ui_ = ash_keyboard_ui.get(); - keyboard_ui = std::move(ash_keyboard_ui); - } else { - keyboard_ui = Shell::Get()->shell_delegate()->CreateKeyboardUI(); - } - DCHECK(keyboard_ui); - keyboard_controller_->EnableKeyboard(std::move(keyboard_ui), - virtual_keyboard_controller_.get()); + keyboard_controller_->EnableKeyboard( + keyboard_ui_factory_ ? keyboard_ui_factory_->CreateKeyboardUI() + : std::make_unique<AshKeyboardUI>(this), + virtual_keyboard_controller_.get()); ActivateKeyboard(); } @@ -75,7 +64,11 @@ keyboard_controller_->DisableKeyboard(); } -void AshKeyboardController::CreateVirtualKeyboard() { +void AshKeyboardController::CreateVirtualKeyboard( + std::unique_ptr<keyboard::KeyboardUIFactory> keyboard_ui_factory) { + DCHECK(keyboard_ui_factory || features::IsUsingWindowService()) + << "keyboard_ui_factory can be null only when window service is used."; + keyboard_ui_factory_ = std::move(keyboard_ui_factory); virtual_keyboard_controller_ = std::make_unique<VirtualKeyboardController>(); } @@ -111,10 +104,7 @@ void AshKeyboardController::KeyboardContentsLoaded( const base::UnguessableToken& token, const gfx::Size& size) { - // Make sure KeyboardController hasn't destroyed the keyboard UI. - if (!keyboard_controller()->IsEnabled()) - return; - ash_keyboard_ui_->KeyboardContentsLoaded(token, size); + keyboard_controller()->KeyboardContentsLoaded(token, size); } void AshKeyboardController::GetKeyboardConfig(
diff --git a/ash/keyboard/ash_keyboard_controller.h b/ash/keyboard/ash_keyboard_controller.h index 8bf19db..3336ef0b 100644 --- a/ash/keyboard/ash_keyboard_controller.h +++ b/ash/keyboard/ash_keyboard_controller.h
@@ -21,11 +21,11 @@ namespace keyboard { class KeyboardController; +class KeyboardUIFactory; } namespace ash { -class AshKeyboardUI; class RootWindowController; class SessionController; class VirtualKeyboardController; @@ -56,7 +56,8 @@ // Create or destroy the virtual keyboard. Called from Shell. TODO(stevenjb): // Fix dependencies so that the virtual keyboard can be created with the // keyboard controller. - void CreateVirtualKeyboard(); + void CreateVirtualKeyboard( + std::unique_ptr<keyboard::KeyboardUIFactory> keyboard_ui_factory); void DestroyVirtualKeyboard(); // Forwards events to mojo observers. @@ -128,8 +129,8 @@ gfx::Rect BoundsToScreen(const gfx::Rect& bounds); SessionController* session_controller_; // unowned + std::unique_ptr<keyboard::KeyboardUIFactory> keyboard_ui_factory_; std::unique_ptr<keyboard::KeyboardController> keyboard_controller_; - AshKeyboardUI* ash_keyboard_ui_ = nullptr; // Owned by keyboard_controller_. std::unique_ptr<VirtualKeyboardController> virtual_keyboard_controller_; mojo::BindingSet<mojom::KeyboardController> bindings_; mojo::AssociatedInterfacePtrSet<mojom::KeyboardControllerObserver> observers_;
diff --git a/ash/keyboard/ash_keyboard_ui.cc b/ash/keyboard/ash_keyboard_ui.cc index d07177b..8b323d5 100644 --- a/ash/keyboard/ash_keyboard_ui.cc +++ b/ash/keyboard/ash_keyboard_ui.cc
@@ -116,18 +116,6 @@ } } -void AshKeyboardUI::KeyboardContentsLoaded(const base::UnguessableToken& token, - const gfx::Size& size) { - DVLOG(1) << "KeyboardContentsLoaded. Token: " << token - << " Size: " << size.ToString(); - if (token == contents_window_token_ && size == contents_window_size_) - return; - contents_window_token_ = token; - contents_window_size_ = size; - if (ash_keyboard_view_) - EmbedContents(); -} - // keyboard::KeyboardUI: aura::Window* AshKeyboardUI::LoadKeyboardWindow(LoadCallback callback) { @@ -169,6 +157,18 @@ ash_keyboard_controller_->SendOnLoadKeyboardContentsRequested(); } +void AshKeyboardUI::KeyboardContentsLoaded(const base::UnguessableToken& token, + const gfx::Size& size) { + DVLOG(1) << "KeyboardContentsLoaded. Token: " << token + << " Size: " << size.ToString(); + if (token == contents_window_token_ && size == contents_window_size_) + return; + contents_window_token_ = token; + contents_window_size_ = size; + if (ash_keyboard_view_) + EmbedContents(); +} + // aura::WindowObserver: void AshKeyboardUI::OnWindowBoundsChanged(aura::Window* window,
diff --git a/ash/keyboard/ash_keyboard_ui.h b/ash/keyboard/ash_keyboard_ui.h index c59e0b9..80cf0b5b 100644 --- a/ash/keyboard/ash_keyboard_ui.h +++ b/ash/keyboard/ash_keyboard_ui.h
@@ -37,16 +37,13 @@ explicit AshKeyboardUI(AshKeyboardController* ash_keyboard_controller); ~AshKeyboardUI() override; - // Called from AshKeyboardController once the client (chrome) calls - // ash.mojom.KeyboardContentsLoaded with the client window token. - void KeyboardContentsLoaded(const base::UnguessableToken& token, - const gfx::Size& size); - // keyboard::KeyboardUI: aura::Window* LoadKeyboardWindow(LoadCallback callback) override; aura::Window* GetKeyboardWindow() const override; ui::InputMethod* GetInputMethod() override; void ReloadKeyboardIfNeeded() override; + void KeyboardContentsLoaded(const base::UnguessableToken& token, + const gfx::Size& size) override; // aura::WindowObserver: void OnWindowBoundsChanged(aura::Window* window,
diff --git a/ash/keyboard/test_keyboard_ui.cc b/ash/keyboard/test_keyboard_ui.cc index b052ab21..c88e6c3 100644 --- a/ash/keyboard/test_keyboard_ui.cc +++ b/ash/keyboard/test_keyboard_ui.cc
@@ -49,4 +49,12 @@ void TestKeyboardUI::ReloadKeyboardIfNeeded() {} +TestKeyboardUIFactory::TestKeyboardUIFactory() = default; +TestKeyboardUIFactory::~TestKeyboardUIFactory() = default; + +std::unique_ptr<keyboard::KeyboardUI> +TestKeyboardUIFactory::CreateKeyboardUI() { + return std::make_unique<TestKeyboardUI>(); +} + } // namespace ash
diff --git a/ash/keyboard/test_keyboard_ui.h b/ash/keyboard/test_keyboard_ui.h index a2ea0d5..b37e1a9 100644 --- a/ash/keyboard/test_keyboard_ui.h +++ b/ash/keyboard/test_keyboard_ui.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/keyboard/keyboard_ui.h" +#include "ui/keyboard/keyboard_ui_factory.h" namespace aura { class Window; @@ -37,6 +38,18 @@ DISALLOW_COPY_AND_ASSIGN(TestKeyboardUI); }; +class TestKeyboardUIFactory : public keyboard::KeyboardUIFactory { + public: + TestKeyboardUIFactory(); + ~TestKeyboardUIFactory() override; + + private: + // keyboard::KeyboardUIFactory: + std::unique_ptr<keyboard::KeyboardUI> CreateKeyboardUI() override; + + DISALLOW_COPY_AND_ASSIGN(TestKeyboardUIFactory); +}; + } // namespace ash #endif // ASH_KEYBOARD_TEST_KEYBOARD_UI_H_
diff --git a/ash/public/cpp/shelf_types.h b/ash/public/cpp/shelf_types.h index c0f5bcd..1142c2f3 100644 --- a/ash/public/cpp/shelf_types.h +++ b/ash/public/cpp/shelf_types.h
@@ -53,9 +53,6 @@ // The default transparent background. SHELF_BACKGROUND_DEFAULT, - // The background when a window is overlapping. - SHELF_BACKGROUND_OVERLAP, - // The background when a window is maximized. SHELF_BACKGROUND_MAXIMIZED,
diff --git a/ash/public/interfaces/shelf_test_api.mojom b/ash/public/interfaces/shelf_test_api.mojom index 57040fce..2e8f4a9 100644 --- a/ash/public/interfaces/shelf_test_api.mojom +++ b/ash/public/interfaces/shelf_test_api.mojom
@@ -12,10 +12,6 @@ // Forces a visibility update and then runs the callback. UpdateVisibility() => (); - // Returns true if a window is overlapping the shelf, which changes its - // appearance slightly. - HasOverlappingWindow() => (bool overlap); - // Returns true if the shelf alignment is BOTTOM_LOCKED, which is not exposed // via prefs. IsAlignmentBottomLocked() => (bool locked);
diff --git a/ash/shelf/overflow_bubble_view.cc b/ash/shelf/overflow_bubble_view.cc index 6bab6362..b079e80 100644 --- a/ash/shelf/overflow_bubble_view.cc +++ b/ash/shelf/overflow_bubble_view.cc
@@ -38,7 +38,7 @@ OverflowBubbleView::OverflowBubbleView(Shelf* shelf) : shelf_(shelf), shelf_view_(nullptr), - background_animator_(SHELF_BACKGROUND_OVERLAP, + background_animator_(SHELF_BACKGROUND_DEFAULT, // Don't pass the Shelf so the translucent color is // always used. nullptr,
diff --git a/ash/shelf/shelf_background_animator.cc b/ash/shelf/shelf_background_animator.cc index f404add..20167973 100644 --- a/ash/shelf/shelf_background_animator.cc +++ b/ash/shelf/shelf_background_animator.cc
@@ -66,10 +66,6 @@ target_shelf_color_alpha = kShelfTranslucentAlpha; target_item_color_alpha = SK_AlphaTRANSPARENT; break; - case SHELF_BACKGROUND_OVERLAP: - target_shelf_color_alpha = kShelfTranslucentAlpha; - target_item_color_alpha = SK_AlphaTRANSPARENT; - break; case SHELF_BACKGROUND_MAXIMIZED: target_shelf_color_alpha = kShelfTranslucentMaximizedWindow; target_item_color_alpha = SK_AlphaTRANSPARENT; @@ -254,7 +250,6 @@ switch (background_type) { case SHELF_BACKGROUND_DEFAULT: - case SHELF_BACKGROUND_OVERLAP: case SHELF_BACKGROUND_APP_LIST: duration_ms = 500; break; @@ -302,7 +297,6 @@ SkColor item_target_color = kShelfDefaultBaseColor; switch (background_type) { case SHELF_BACKGROUND_DEFAULT: - case SHELF_BACKGROUND_OVERLAP: case SHELF_BACKGROUND_APP_LIST: shelf_target_color = darken_wallpaper(kShelfTranslucentColorDarkenAlpha); item_target_color = shelf_target_color;
diff --git a/ash/shelf/shelf_background_animator.h b/ash/shelf/shelf_background_animator.h index 276bc2c..478be51 100644 --- a/ash/shelf/shelf_background_animator.h +++ b/ash/shelf/shelf_background_animator.h
@@ -38,8 +38,7 @@ // // Material Design: // 1. Shelf button backgrounds -// 2. Overlay for the SHELF_BACKGROUND_OVERLAP and SHELF_BACKGROUND_MAXIMIZED -// states. +// 2. Overlay for the SHELF_BACKGROUND_MAXIMIZED state. class ASH_EXPORT ShelfBackgroundAnimator : public ShelfObserver, public gfx::AnimationDelegate, public WallpaperControllerObserver {
diff --git a/ash/shelf/shelf_background_animator_unittest.cc b/ash/shelf/shelf_background_animator_unittest.cc index 8ac23c83..f09cb37 100644 --- a/ash/shelf/shelf_background_animator_unittest.cc +++ b/ash/shelf/shelf_background_animator_unittest.cc
@@ -232,15 +232,6 @@ EXPECT_EQ(0, observer_.GetItemBackgroundAlpha()); } -// Verify the alpha values for the SHELF_BACKGROUND_OVERLAP state. -TEST_F(ShelfBackgroundAnimatorTest, OverlapBackground) { - PaintBackground(SHELF_BACKGROUND_OVERLAP); - - EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, animator_->target_background_type()); - EXPECT_EQ(kShelfTranslucentAlpha, observer_.GetBackgroundAlpha()); - EXPECT_EQ(0, observer_.GetItemBackgroundAlpha()); -} - // Verify the alpha values for the SHELF_BACKGROUND_MAXIMIZED state. TEST_F(ShelfBackgroundAnimatorTest, MaximizedBackground) { PaintBackground(SHELF_BACKGROUND_MAXIMIZED); @@ -277,7 +268,7 @@ TEST_F(ShelfBackgroundAnimatorTest, AnimatorIsDetroyedWhenCompletingSuccessfully) { - PaintBackground(SHELF_BACKGROUND_OVERLAP, AnimationChangeType::ANIMATE); + PaintBackground(SHELF_BACKGROUND_MAXIMIZED, AnimationChangeType::ANIMATE); EXPECT_TRUE(test_api_->animator()); CompleteAnimations(); EXPECT_FALSE(test_api_->animator()); @@ -285,10 +276,10 @@ TEST_F(ShelfBackgroundAnimatorTest, AnimatorDestroyedWhenChangingBackgroundImmediately) { - PaintBackground(SHELF_BACKGROUND_OVERLAP, AnimationChangeType::ANIMATE); + PaintBackground(SHELF_BACKGROUND_MAXIMIZED, AnimationChangeType::ANIMATE); EXPECT_TRUE(test_api_->animator()); - PaintBackground(SHELF_BACKGROUND_OVERLAP, AnimationChangeType::IMMEDIATE); + PaintBackground(SHELF_BACKGROUND_DEFAULT, AnimationChangeType::IMMEDIATE); EXPECT_FALSE(test_api_->animator()); } @@ -310,14 +301,13 @@ // the same as the previous background. TEST_F(ShelfBackgroundAnimatorTest, ExistingAnimatorNotReusedWhenTargetBackgroundNotPreviousBackground) { - PaintBackground(SHELF_BACKGROUND_DEFAULT, AnimationChangeType::ANIMATE); - PaintBackground(SHELF_BACKGROUND_MAXIMIZED, AnimationChangeType::ANIMATE); + PaintBackground(SHELF_BACKGROUND_APP_LIST, AnimationChangeType::ANIMATE); const gfx::SlideAnimation* animator = test_api_->animator(); EXPECT_TRUE(animator); - EXPECT_NE(SHELF_BACKGROUND_OVERLAP, test_api_->previous_background_type()); - PaintBackground(SHELF_BACKGROUND_OVERLAP, AnimationChangeType::ANIMATE); + EXPECT_NE(SHELF_BACKGROUND_MAXIMIZED, test_api_->previous_background_type()); + PaintBackground(SHELF_BACKGROUND_MAXIMIZED, AnimationChangeType::ANIMATE); EXPECT_NE(animator, test_api_->animator()); }
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc index ea01d30..e6032dd3 100644 --- a/ash/shelf/shelf_layout_manager.cc +++ b/ash/shelf/shelf_layout_manager.cc
@@ -299,8 +299,6 @@ case wm::WORKSPACE_WINDOW_STATE_WINDOW_OVERLAPS_SHELF: case wm::WORKSPACE_WINDOW_STATE_DEFAULT: SetState(CalculateShelfVisibility()); - SetWindowOverlapsShelf( - window_state == wm::WORKSPACE_WINDOW_STATE_WINDOW_OVERLAPS_SHELF); break; } } @@ -379,11 +377,6 @@ } } -void ShelfLayoutManager::SetWindowOverlapsShelf(bool value) { - window_overlaps_shelf_ = value; - MaybeUpdateShelfBackground(AnimationChangeType::ANIMATE); -} - void ShelfLayoutManager::AddObserver(ShelfLayoutManagerObserver* observer) { observers_.AddObserver(observer); } @@ -475,20 +468,10 @@ return SHELF_BACKGROUND_MAXIMIZED; } - if (gesture_drag_status_ == GESTURE_DRAG_IN_PROGRESS || - window_overlaps_shelf_ || state_.visibility_state == SHELF_AUTO_HIDE) { - return SHELF_BACKGROUND_OVERLAP; - } - // If split view mode is active, make the shelf fully opapue. if (Shell::Get()->IsSplitViewModeActive()) return SHELF_BACKGROUND_SPLIT_VIEW; - if (Shell::Get()->window_selector_controller() && - Shell::Get()->window_selector_controller()->IsSelecting()) { - return SHELF_BACKGROUND_OVERLAP; - } - return SHELF_BACKGROUND_DEFAULT; } @@ -515,8 +498,7 @@ bool ShelfLayoutManager::ShouldBlurShelfBackground() { return IsBackgroundBlurEnabled() && - (shelf_background_type_ == SHELF_BACKGROUND_DEFAULT || - shelf_background_type_ == SHELF_BACKGROUND_OVERLAP) && + shelf_background_type_ == SHELF_BACKGROUND_DEFAULT && state_.session_state == session_manager::SessionState::ACTIVE; }
diff --git a/ash/shelf/shelf_layout_manager.h b/ash/shelf/shelf_layout_manager.h index 6771403..93fdcca 100644 --- a/ash/shelf/shelf_layout_manager.h +++ b/ash/shelf/shelf_layout_manager.h
@@ -112,10 +112,6 @@ void ProcessGestureEventOfAutoHideShelf(ui::GestureEvent* event, aura::Window* target); - // Sets whether any windows overlap the shelf. If a window overlaps the shelf - // the shelf renders slightly differently. - void SetWindowOverlapsShelf(bool value); - void AddObserver(ShelfLayoutManagerObserver* observer); void RemoveObserver(ShelfLayoutManagerObserver* observer); @@ -206,7 +202,6 @@ int accessibility_panel_height() const { return accessibility_panel_height_; } int docked_magnifier_height() const { return docked_magnifier_height_; } ShelfWidget* shelf_widget() { return shelf_widget_; } - bool window_overlaps_shelf() const { return window_overlaps_shelf_; } // Returns whether background blur is enabled. bool IsBackgroundBlurEnabled() { return is_background_blur_enabled_; } @@ -387,9 +382,6 @@ ShelfWidget* shelf_widget_; Shelf* shelf_; - // Do any windows overlap the shelf? This is maintained by WorkspaceManager. - bool window_overlaps_shelf_ = false; - // Whether the app list is visible. This is maintained by // OnAppListVisibilityChanged. bool is_app_list_visible_ = false; @@ -459,13 +451,13 @@ // The current shelf background. Should not be assigned to directly, use // MaybeUpdateShelfBackground() instead. - ShelfBackgroundType shelf_background_type_ = SHELF_BACKGROUND_OVERLAP; + ShelfBackgroundType shelf_background_type_ = SHELF_BACKGROUND_DEFAULT; // Shelf will become transparent if launcher is opened. Stores the shelf // background type before open the launcher when start to drag the launcher // from shelf. ShelfBackgroundType shelf_background_type_before_drag_ = - SHELF_BACKGROUND_OVERLAP; + SHELF_BACKGROUND_DEFAULT; ScopedSessionObserver scoped_session_observer_{this}; ScopedObserver<WallpaperController, ShelfLayoutManager>
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc index 01098cf..35698b6 100644 --- a/ash/shelf/shelf_layout_manager_unittest.cc +++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -1240,7 +1240,7 @@ UnlockScreen(); EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState()); - EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, GetShelfWidget()->GetBackgroundType()); + EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType()); } // Tests that the shelf should be visible when in overview mode. @@ -1261,12 +1261,11 @@ WindowSelectorController* window_selector_controller = Shell::Get()->window_selector_controller(); - // Tests that the shelf is visible when in overview mode and its color is - // overlap. + // Tests that the shelf is visible when in overview mode window_selector_controller->ToggleOverview(); EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState()); EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState()); - EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, GetShelfWidget()->GetBackgroundType()); + EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType()); // Test that on exiting overview mode, the shelf returns to auto hide state. window_selector_controller->ToggleOverview(); @@ -2300,7 +2299,7 @@ EXPECT_EQ(SHELF_BACKGROUND_MAXIMIZED, GetShelfWidget()->GetBackgroundType()); w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); - EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, GetShelfWidget()->GetBackgroundType()); + EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType()); w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType()); @@ -2395,9 +2394,9 @@ std::unique_ptr<aura::Window> w1(CreateTestWindow()); w1->Show(); wm::ActivateWindow(w1.get()); - EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, GetShelfWidget()->GetBackgroundType()); + EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType()); w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); - EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, GetShelfWidget()->GetBackgroundType()); + EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType()); } // Verify the hit bounds of the status area extend to the edge of the shelf.
diff --git a/ash/shelf/shelf_test_api.cc b/ash/shelf/shelf_test_api.cc index 2c86d2f..35a575ed 100644 --- a/ash/shelf/shelf_test_api.cc +++ b/ash/shelf/shelf_test_api.cc
@@ -32,10 +32,6 @@ std::move(cb).Run(); } -void ShelfTestApi::HasOverlappingWindow(HasOverlappingWindowCallback cb) { - std::move(cb).Run(shelf_->shelf_layout_manager()->window_overlaps_shelf()); -} - void ShelfTestApi::IsAlignmentBottomLocked(IsAlignmentBottomLockedCallback cb) { std::move(cb).Run(shelf_->alignment() == SHELF_ALIGNMENT_BOTTOM_LOCKED); }
diff --git a/ash/shelf/shelf_test_api.h b/ash/shelf/shelf_test_api.h index 2a1b537d..6f01ef4 100644 --- a/ash/shelf/shelf_test_api.h +++ b/ash/shelf/shelf_test_api.h
@@ -24,7 +24,6 @@ // mojom::ShelfTestApi: void IsVisible(IsVisibleCallback cb) override; void UpdateVisibility(UpdateVisibilityCallback cb) override; - void HasOverlappingWindow(HasOverlappingWindowCallback cb) override; void IsAlignmentBottomLocked(IsAlignmentBottomLockedCallback cb) override; private:
diff --git a/ash/shell.cc b/ash/shell.cc index da78562..81f97594 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -198,6 +198,7 @@ #include "ui/events/event_target_iterator.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/image/image_skia.h" +#include "ui/keyboard/keyboard_ui_factory.h" #include "ui/ozone/public/ozone_platform.h" #include "ui/views/corewm/tooltip_aura.h" #include "ui/views/corewm/tooltip_controller.h" @@ -270,7 +271,8 @@ instance_->Init(init_params.context_factory, init_params.context_factory_private, std::move(init_params.initial_display_prefs), - std::move(init_params.gpu_interface_provider)); + std::move(init_params.gpu_interface_provider), + std::move(init_params.keyboard_ui_factory)); return instance_; } @@ -960,7 +962,8 @@ ui::ContextFactory* context_factory, ui::ContextFactoryPrivate* context_factory_private, std::unique_ptr<base::Value> initial_display_prefs, - std::unique_ptr<ws::GpuInterfaceProvider> gpu_interface_provider) { + std::unique_ptr<ws::GpuInterfaceProvider> gpu_interface_provider, + std::unique_ptr<keyboard::KeyboardUIFactory> keyboard_ui_factory) { if (::features::IsSingleProcessMash()) { // In SingleProcessMash mode ScreenMus is not created, which means Ash needs // to set the WindowManagerFrameValues. @@ -1218,6 +1221,9 @@ system_notification_controller_ = std::make_unique<SystemNotificationController>(); + ash_keyboard_controller_->CreateVirtualKeyboard( + std::move(keyboard_ui_factory)); + window_tree_host_manager_->InitHosts(); // |assistant_controller_| needs to be created after InitHosts() since its @@ -1226,8 +1232,6 @@ ? std::make_unique<AssistantController>() : nullptr; - ash_keyboard_controller_->CreateVirtualKeyboard(); - cursor_manager_->HideCursor(); // Hide the mouse cursor on startup. cursor_manager_->SetCursor(ui::CursorType::kPointer);
diff --git a/ash/shell.h b/ash/shell.h index e02811f..0f2dde2 100644 --- a/ash/shell.h +++ b/ash/shell.h
@@ -51,6 +51,10 @@ class Point; } +namespace keyboard { +class KeyboardUIFactory; +} + namespace service_manager { class Connector; } @@ -661,7 +665,8 @@ void Init(ui::ContextFactory* context_factory, ui::ContextFactoryPrivate* context_factory_private, std::unique_ptr<base::Value> initial_display_prefs, - std::unique_ptr<ws::GpuInterfaceProvider> gpu_interface_provider); + std::unique_ptr<ws::GpuInterfaceProvider> gpu_interface_provider, + std::unique_ptr<keyboard::KeyboardUIFactory> keyboard_ui_factory); // Initializes the display manager and related components. void InitializeDisplayManager();
diff --git a/ash/shell/content/client/shell_browser_main_parts.cc b/ash/shell/content/client/shell_browser_main_parts.cc index 192a89ff..246ac97b 100644 --- a/ash/shell/content/client/shell_browser_main_parts.cc +++ b/ash/shell/content/client/shell_browser_main_parts.cc
@@ -10,6 +10,7 @@ #include "ash/components/quick_launch/public/mojom/constants.mojom.h" #include "ash/components/shortcut_viewer/public/mojom/shortcut_viewer.mojom.h" #include "ash/components/tap_visualizer/public/mojom/constants.mojom.h" +#include "ash/keyboard/test_keyboard_ui.h" #include "ash/login_status.h" #include "ash/shell.h" #include "ash/shell/example_session_controller_client.h" @@ -95,6 +96,7 @@ init_params.context_factory_private = content::GetContextFactoryPrivate(); init_params.gpu_interface_provider = content::CreateGpuInterfaceProvider(); init_params.connector = connector; + init_params.keyboard_ui_factory = std::make_unique<TestKeyboardUIFactory>(); ash::Shell::CreateInstance(std::move(init_params)); // Initialize session controller client and create fake user sessions. The
diff --git a/ash/shell/shell_delegate_impl.cc b/ash/shell/shell_delegate_impl.cc index b0166b0..f43552a 100644 --- a/ash/shell/shell_delegate_impl.cc +++ b/ash/shell/shell_delegate_impl.cc
@@ -7,7 +7,6 @@ #include <memory> #include "ash/accessibility/default_accessibility_delegate.h" -#include "ash/keyboard/test_keyboard_ui.h" #include "ash/test_screenshot_delegate.h" namespace ash { @@ -21,10 +20,6 @@ return true; } -std::unique_ptr<keyboard::KeyboardUI> ShellDelegateImpl::CreateKeyboardUI() { - return std::make_unique<TestKeyboardUI>(); -} - std::unique_ptr<ash::ScreenshotDelegate> ShellDelegateImpl::CreateScreenshotDelegate() { return std::make_unique<TestScreenshotDelegate>();
diff --git a/ash/shell/shell_delegate_impl.h b/ash/shell/shell_delegate_impl.h index a85fdddb..105c7c0 100644 --- a/ash/shell/shell_delegate_impl.h +++ b/ash/shell/shell_delegate_impl.h
@@ -11,10 +11,6 @@ #include "ash/shell_delegate.h" #include "base/macros.h" -namespace keyboard { -class KeyboardUI; -} - namespace ash { namespace shell { @@ -25,7 +21,6 @@ // ShellDelegate: bool CanShowWindowForUser(aura::Window* window) const override; - std::unique_ptr<keyboard::KeyboardUI> CreateKeyboardUI() override; std::unique_ptr<ScreenshotDelegate> CreateScreenshotDelegate() override; AccessibilityDelegate* CreateAccessibilityDelegate() override; ws::InputDeviceControllerClient* GetInputDeviceControllerClient() override;
diff --git a/ash/shell_delegate.h b/ash/shell_delegate.h index 30e470d5..2ad1230 100644 --- a/ash/shell_delegate.h +++ b/ash/shell_delegate.h
@@ -16,10 +16,6 @@ class Window; } -namespace keyboard { -class KeyboardUI; -} - namespace ws { class InputDeviceControllerClient; } @@ -39,9 +35,6 @@ // user. virtual bool CanShowWindowForUser(aura::Window* window) const = 0; - // Create a shell-specific keyboard::KeyboardUI. - virtual std::unique_ptr<keyboard::KeyboardUI> CreateKeyboardUI() = 0; - // TODO(jamescook): Replace with a mojo-compatible interface. virtual std::unique_ptr<ScreenshotDelegate> CreateScreenshotDelegate() = 0;
diff --git a/ash/shell_delegate_mash.cc b/ash/shell_delegate_mash.cc index dccb8b6..3d51a39 100644 --- a/ash/shell_delegate_mash.cc +++ b/ash/shell_delegate_mash.cc
@@ -52,11 +52,6 @@ return true; } -std::unique_ptr<keyboard::KeyboardUI> ShellDelegateMash::CreateKeyboardUI() { - NOTIMPLEMENTED_LOG_ONCE(); - return nullptr; -} - std::unique_ptr<ScreenshotDelegate> ShellDelegateMash::CreateScreenshotDelegate() { return std::make_unique<ScreenshotDelegateMash>();
diff --git a/ash/shell_delegate_mash.h b/ash/shell_delegate_mash.h index 6783fc76..5dbc6df 100644 --- a/ash/shell_delegate_mash.h +++ b/ash/shell_delegate_mash.h
@@ -19,7 +19,6 @@ // ShellDelegate: bool CanShowWindowForUser(aura::Window* window) const override; - std::unique_ptr<keyboard::KeyboardUI> CreateKeyboardUI() override; std::unique_ptr<ScreenshotDelegate> CreateScreenshotDelegate() override; AccessibilityDelegate* CreateAccessibilityDelegate() override; ws::InputDeviceControllerClient* GetInputDeviceControllerClient() override;
diff --git a/ash/shell_init_params.cc b/ash/shell_init_params.cc index 7edb3750..12d462ff 100644 --- a/ash/shell_init_params.cc +++ b/ash/shell_init_params.cc
@@ -7,6 +7,7 @@ #include "ash/shell_delegate.h" #include "base/values.h" #include "services/ws/public/cpp/host/gpu_interface_provider.h" +#include "ui/keyboard/keyboard_ui_factory.h" namespace ash {
diff --git a/ash/shell_init_params.h b/ash/shell_init_params.h index f1d93e62..34552e0 100644 --- a/ash/shell_init_params.h +++ b/ash/shell_init_params.h
@@ -13,6 +13,10 @@ class Value; } +namespace keyboard { +class KeyboardUIFactory; +} + namespace service_manager { class Connector; } @@ -48,6 +52,10 @@ // Connector used by Shell to establish connections. service_manager::Connector* connector = nullptr; + + // Factory for creating the virtual keyboard UI. When the window service is + // used, this will be null and an AshKeyboardUI instance will be created. + std::unique_ptr<keyboard::KeyboardUIFactory> keyboard_ui_factory; }; } // namespace ash
diff --git a/ash/system/tray/tray_popup_utils.cc b/ash/system/tray/tray_popup_utils.cc index 018820f2..382c6f8 100644 --- a/ash/system/tray/tray_popup_utils.cc +++ b/ash/system/tray/tray_popup_utils.cc
@@ -210,6 +210,7 @@ button->set_has_ink_drop_action_on_click(true); button->set_ink_drop_base_color(kTrayPopupInkDropBaseColor); button->set_ink_drop_visible_opacity(kTrayPopupInkDropRippleOpacity); + button->set_ink_drop_highlight_opacity(kTrayPopupInkDropHighlightOpacity); } void TrayPopupUtils::ConfigureAsStickyHeader(views::View* view) {
diff --git a/ash/system/unified/top_shortcut_button.cc b/ash/system/unified/top_shortcut_button.cc index eaf5e41c..1635f26 100644 --- a/ash/system/unified/top_shortcut_button.cc +++ b/ash/system/unified/top_shortcut_button.cc
@@ -13,6 +13,7 @@ #include "ui/views/animation/ink_drop_highlight.h" #include "ui/views/animation/ink_drop_impl.h" #include "ui/views/animation/ink_drop_mask.h" +#include "ui/views/view_properties.h" namespace ash { @@ -31,23 +32,27 @@ TopShortcutButton::TopShortcutButton(views::ButtonListener* listener, int accessible_name_id) : views::ImageButton(listener) { - SetPreferredSize(gfx::Size(kTrayItemSize, kTrayItemSize)); - + const gfx::Size size(kTrayItemSize, kTrayItemSize); + SetPreferredSize(size); SetImageAlignment(ALIGN_CENTER, ALIGN_MIDDLE); SetTooltipText(l10n_util::GetStringUTF16(accessible_name_id)); TrayPopupUtils::ConfigureTrayPopupButton(this); + set_ink_drop_base_color(kUnifiedMenuIconColor); + + auto path = std::make_unique<SkPath>(); + path->addOval(gfx::RectToSkRect(gfx::Rect(size))); + SetProperty(views::kHighlightPathKey, path.release()); } TopShortcutButton::~TopShortcutButton() = default; void TopShortcutButton::PaintButtonContents(gfx::Canvas* canvas) { - gfx::Rect rect(GetContentsBounds()); cc::PaintFlags flags; flags.setAntiAlias(true); flags.setColor(kUnifiedMenuButtonColor); flags.setStyle(cc::PaintFlags::kFill_Style); - canvas->DrawCircle(gfx::PointF(rect.CenterPoint()), kTrayItemSize / 2, flags); + canvas->DrawPath(*GetProperty(views::kHighlightPathKey), flags); views::ImageButton::PaintButtonContents(canvas); } @@ -56,23 +61,4 @@ return TrayPopupUtils::CreateInkDrop(this); } -std::unique_ptr<views::InkDropRipple> TopShortcutButton::CreateInkDropRipple() - const { - return TrayPopupUtils::CreateInkDropRipple( - TrayPopupInkDropStyle::FILL_BOUNDS, this, - GetInkDropCenterBasedOnLastEvent(), kUnifiedMenuIconColor); -} - -std::unique_ptr<views::InkDropHighlight> -TopShortcutButton::CreateInkDropHighlight() const { - return TrayPopupUtils::CreateInkDropHighlight( - TrayPopupInkDropStyle::FILL_BOUNDS, this, kUnifiedMenuIconColor); -} - -std::unique_ptr<views::InkDropMask> TopShortcutButton::CreateInkDropMask() - const { - return std::make_unique<views::CircleInkDropMask>( - size(), GetContentsBounds().CenterPoint(), kTrayItemSize / 2); -} - } // namespace ash
diff --git a/ash/system/unified/top_shortcut_button.h b/ash/system/unified/top_shortcut_button.h index b0fce14..fc3fa22 100644 --- a/ash/system/unified/top_shortcut_button.h +++ b/ash/system/unified/top_shortcut_button.h
@@ -24,10 +24,6 @@ // views::ImageButton: void PaintButtonContents(gfx::Canvas* canvas) override; std::unique_ptr<views::InkDrop> CreateInkDrop() override; - std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override; - std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight() - const override; - std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override; private: DISALLOW_COPY_AND_ASSIGN(TopShortcutButton);
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc index 991caf7..a0c6c43 100644 --- a/ash/test/ash_test_helper.cc +++ b/ash/test/ash_test_helper.cc
@@ -13,6 +13,7 @@ #include "ash/display/display_configuration_controller_test_api.h" #include "ash/display/screen_ash.h" #include "ash/keyboard/ash_keyboard_controller.h" +#include "ash/keyboard/test_keyboard_ui.h" #include "ash/mojo_test_interface_factory.h" #include "ash/public/cpp/ash_switches.h" #include "ash/public/cpp/test/test_keyboard_controller_observer.h" @@ -376,6 +377,7 @@ init_params.context_factory_private = context_factory_private; init_params.gpu_interface_provider = std::make_unique<TestGpuInterfaceProvider>(); + init_params.keyboard_ui_factory = std::make_unique<TestKeyboardUIFactory>(); Shell::CreateInstance(std::move(init_params)); }
diff --git a/ash/test_shell_delegate.cc b/ash/test_shell_delegate.cc index 31f5c38..bab83489 100644 --- a/ash/test_shell_delegate.cc +++ b/ash/test_shell_delegate.cc
@@ -5,7 +5,6 @@ #include "ash/test_shell_delegate.h" #include "ash/accessibility/default_accessibility_delegate.h" -#include "ash/keyboard/test_keyboard_ui.h" #include "ash/system/tray/system_tray_notifier.h" #include "ash/test_screenshot_delegate.h" #include "base/logging.h" @@ -21,10 +20,6 @@ return true; } -std::unique_ptr<keyboard::KeyboardUI> TestShellDelegate::CreateKeyboardUI() { - return std::make_unique<TestKeyboardUI>(); -} - std::unique_ptr<ScreenshotDelegate> TestShellDelegate::CreateScreenshotDelegate() { return std::make_unique<TestScreenshotDelegate>();
diff --git a/ash/test_shell_delegate.h b/ash/test_shell_delegate.h index e3bd31c..932e5bc4 100644 --- a/ash/test_shell_delegate.h +++ b/ash/test_shell_delegate.h
@@ -19,7 +19,6 @@ // Overridden from ShellDelegate: bool CanShowWindowForUser(aura::Window* window) const override; - std::unique_ptr<keyboard::KeyboardUI> CreateKeyboardUI() override; std::unique_ptr<ScreenshotDelegate> CreateScreenshotDelegate() override; AccessibilityDelegate* CreateAccessibilityDelegate() override; ws::InputDeviceControllerClient* GetInputDeviceControllerClient() override;
diff --git a/ash/wm/overview/window_grid.cc b/ash/wm/overview/window_grid.cc index 0eca980..abdf7fb 100644 --- a/ash/wm/overview/window_grid.cc +++ b/ash/wm/overview/window_grid.cc
@@ -772,9 +772,16 @@ AddDraggedWindowIntoOverviewOnDragEnd(dragged_window); } - window_selector_->RemoveWindowSelectorItem( - GetWindowSelectorItemContaining(drop_target_widget_->GetNativeWindow()), - /*reposition=*/false); + WindowSelectorItem* drop_target_item = + GetWindowSelectorItemContaining(drop_target_widget_->GetNativeWindow()); + // TODO(http://crbug.com/916856): Disable tab and app dragging that doesn't + // happen in the primary display. + // The |drop_target_widget_| may not in the same display as + // |dragged_window|, which will cause |drop_target_item| to be null. + if (drop_target_item) { + window_selector_->RemoveWindowSelectorItem(drop_target_item, + /*reposition=*/false); + } drop_target_widget_.reset(); // Called to reset caption and title visibility after dragging.
diff --git a/ash/wm/window_util.cc b/ash/wm/window_util.cc index 8233a9c..09c798b 100644 --- a/ash/wm/window_util.cc +++ b/ash/wm/window_util.cc
@@ -96,12 +96,6 @@ } bool ShouldUseExtendedBounds(const aura::Window* target) const override { - // Fullscreen/maximized windows can't be drag-resized. - if (GetWindowState(window())->IsMaximizedOrFullscreenOrPinned() || - !wm::GetWindowState(target)->CanResize()) { - return false; - } - // The shrunken hit region only applies to children of |window()|. return target->parent() == window(); }
diff --git a/ash/wm/workspace_controller_unittest.cc b/ash/wm/workspace_controller_unittest.cc index f0a1952..8b0aae6 100644 --- a/ash/wm/workspace_controller_unittest.cc +++ b/ash/wm/workspace_controller_unittest.cc
@@ -129,10 +129,6 @@ return GetPrimaryShelf()->shelf_layout_manager(); } - bool GetWindowOverlapsShelf() { - return shelf_layout_manager()->window_overlaps_shelf(); - } - private: DISALLOW_COPY_AND_ASSIGN(WorkspaceControllerTest); }; @@ -357,18 +353,15 @@ 0, shelf_layout_manager()->GetIdealBounds().y() - 10, 101, 102); // Move |w1| to overlap the shelf. w1->SetBounds(touches_shelf_bounds); - EXPECT_FALSE(GetWindowOverlapsShelf()); - // A visible ignored window should not trigger the overlap. + // Add a visible ignored window std::unique_ptr<Window> w_ignored(CreateTestWindow()); w_ignored->SetBounds(touches_shelf_bounds); wm::GetWindowState(&(*w_ignored))->set_ignored_by_shelf(true); w_ignored->Show(); - EXPECT_FALSE(GetWindowOverlapsShelf()); - // Make it visible, since visible shelf overlaps should be true. + // Then make it visible w1->Show(); - EXPECT_TRUE(GetWindowOverlapsShelf()); wm::ActivateWindow(w1.get()); w1->SetBounds(w1_bounds); @@ -395,15 +388,7 @@ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState()); EXPECT_EQ("0,1 101x102", w1->bounds().ToString()); - EXPECT_FALSE(GetWindowOverlapsShelf()); - - // Move window so it obscures shelf. - w1->SetBounds(touches_shelf_bounds); - EXPECT_TRUE(GetWindowOverlapsShelf()); - - // Move it back. w1->SetBounds(w1_bounds); - EXPECT_FALSE(GetWindowOverlapsShelf()); // Maximize again. w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); @@ -458,25 +443,6 @@ EXPECT_EQ("0,1 101x102", w1->bounds().ToString()); EXPECT_EQ(screen_util::GetMaximizedWindowBoundsInParent(w2.get()).ToString(), w2->bounds().ToString()); - - // Turn off auto-hide, switch back to w2 (maximized) and verify overlap. - shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER); - wm::ActivateWindow(w2.get()); - EXPECT_FALSE(GetWindowOverlapsShelf()); - - // Move w1 to overlap shelf, it shouldn't change window overlaps shelf since - // the window isn't in the visible workspace. - w1->SetBounds(touches_shelf_bounds); - EXPECT_FALSE(GetWindowOverlapsShelf()); - - // Activate w1. Although w1 is visible, the overlap state is still false since - // w2 is maximized. - wm::ActivateWindow(w1.get()); - EXPECT_FALSE(GetWindowOverlapsShelf()); - - // Restore w2. - w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); - EXPECT_TRUE(GetWindowOverlapsShelf()); } // Verifies going from maximized to minimized sets the right state for painting @@ -1343,36 +1309,6 @@ EXPECT_TRUE(maximized_window->IsVisible()); } -// Verifies that when dragging a window over the shelf overlap is detected -// during and after the drag. -TEST_F(WorkspaceControllerTest, DragWindowOverlapShelf) { - aura::test::TestWindowDelegate delegate; - delegate.set_window_component(HTCAPTION); - std::unique_ptr<Window> w1(aura::test::CreateTestWindowWithDelegate( - &delegate, aura::client::WINDOW_TYPE_NORMAL, gfx::Rect(5, 5, 100, 50), - NULL)); - ParentWindowInPrimaryRootWindow(w1.get()); - - GetPrimaryShelf()->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER); - - // Drag near the shelf. - ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), - gfx::Point()); - generator.MoveMouseTo(10, 10); - generator.PressLeftButton(); - generator.MoveMouseTo(100, shelf_layout_manager()->GetIdealBounds().y() - 70); - - // Shelf should not be in overlapped state. - EXPECT_FALSE(GetWindowOverlapsShelf()); - - generator.MoveMouseTo(100, shelf_layout_manager()->GetIdealBounds().y() - 20); - - // Shelf should detect overlap. Overlap state stays after mouse is released. - EXPECT_TRUE(GetWindowOverlapsShelf()); - generator.ReleaseLeftButton(); - EXPECT_TRUE(GetWindowOverlapsShelf()); -} - // Verifies that when dragging a window autohidden shelf stays hidden during // and after the drag. TEST_F(WorkspaceControllerTest, DragWindowKeepsShelfAutohidden) {
diff --git a/base/BUILD.gn b/base/BUILD.gn index 0273b50b..8a2239f 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -3110,6 +3110,7 @@ "test/android/javatests/src/org/chromium/base/test/SetUpStatement.java", "test/android/javatests/src/org/chromium/base/test/TestListInstrumentationRunListener.java", "test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java", + "test/android/javatests/src/org/chromium/base/test/CommitSharedPreferencesTestRule.java", "test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunner.java", "test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java", "test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java",
diff --git a/base/message_loop/message_pump_mac.h b/base/message_loop/message_pump_mac.h index 227ac163..0efe409 100644 --- a/base/message_loop/message_pump_mac.h +++ b/base/message_loop/message_pump_mac.h
@@ -368,12 +368,18 @@ private: friend class ScopedPumpMessagesInPrivateModes; + void EnterExitRunLoop(CFRunLoopActivity activity) override; + // True if DoRun is managing its own run loop as opposed to letting // -[NSApplication run] handle it. The outermost run loop in the application // is managed by -[NSApplication run], inner run loops are handled by a loop // in DoRun. bool running_own_loop_; + // True if Quit() was called while a modal window was shown and needed to be + // deferred. + bool quit_pending_; + DISALLOW_COPY_AND_ASSIGN(MessagePumpNSApplication); };
diff --git a/base/message_loop/message_pump_mac.mm b/base/message_loop/message_pump_mac.mm index a3ffbcf..384533dd 100644 --- a/base/message_loop/message_pump_mac.mm +++ b/base/message_loop/message_pump_mac.mm
@@ -821,7 +821,8 @@ MessagePumpNSApplication::MessagePumpNSApplication() : MessagePumpCFRunLoopBase(kNSApplicationModalSafeModeMask), - running_own_loop_(false) { + running_own_loop_(false), + quit_pending_(false) { DCHECK_EQ(nullptr, g_app_pump); g_app_pump = this; } @@ -864,6 +865,17 @@ } bool MessagePumpNSApplication::DoQuit() { + // If the app is displaying a modal window in a native run loop, we can only + // quit our run loop after the window is closed. Otherwise the [NSApplication + // stop] below will apply to the modal window run loop instead. To work around + // this, the quit is applied when we re-enter our own run loop after the + // window is gone (see MessagePumpNSApplication::EnterExitRunLoop). + if (nesting_level() > run_nesting_level() && + [[NSApplication sharedApplication] modalWindow] != nil) { + quit_pending_ = true; + return false; + } + if (!running_own_loop_) { [[NSApplication sharedApplication] stop:nil]; } @@ -882,6 +894,18 @@ return true; } +void MessagePumpNSApplication::EnterExitRunLoop(CFRunLoopActivity activity) { + // If we previously tried quitting while a modal window was active, check if + // the window is gone now and we're no longer nested in a system run loop. + if (activity == kCFRunLoopEntry && quit_pending_ && + nesting_level() <= run_nesting_level() && + [[NSApplication sharedApplication] modalWindow] == nil) { + quit_pending_ = false; + if (DoQuit()) + OnDidQuit(); + } +} + MessagePumpCrApplication::MessagePumpCrApplication() { }
diff --git a/base/message_loop/message_pump_mac_unittest.mm b/base/message_loop/message_pump_mac_unittest.mm index ed350bb9..9063048 100644 --- a/base/message_loop/message_pump_mac_unittest.mm +++ b/base/message_loop/message_pump_mac_unittest.mm
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop_current.h" +#include "base/test/bind_test_util.h" #include "base/threading/thread_task_runner_handle.h" #include "testing/gtest/include/gtest/gtest.h" @@ -284,6 +285,32 @@ EXPECT_NO_FATAL_FAILURE(run_loop.Run()); } +TEST(MessagePumpMacTest, QuitWithModalWindow) { + MessageLoopForUI message_loop; + NSWindow* window = + [[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100) + styleMask:NSBorderlessWindowMask + backing:NSBackingStoreBuffered + defer:NO] autorelease]; + + // Check that quitting the run loop while a modal window is shown applies to + // |run_loop| rather than the internal NSApplication modal run loop. + RunLoop run_loop; + ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindLambdaForTesting([&] { + MessageLoopCurrent::ScopedNestableTaskAllower allow; + ScopedPumpMessagesInPrivateModes pump_private; + [NSApp runModalForWindow:window]; + })); + ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, + base::BindLambdaForTesting([&] { + [NSApp stopModal]; + run_loop.Quit(); + })); + + EXPECT_NO_FATAL_FAILURE(run_loop.Run()); +} + } // namespace base @implementation TestModalAlertCloser
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java index 49f27b50..2b818be 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java +++ b/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java
@@ -274,4 +274,13 @@ protected Statement withAfters(FrameworkMethod method, Object test, Statement base) { return super.withAfters(method, test, new ScreenshotOnFailureStatement(base)); } + + @Override + protected List<TestRule> classRules() { + List<TestRule> result = super.classRules(); + // Class rules are the outermost TestRules, so CommitSharedPreferencesTestRule will commit + // SharedPreferences after all other rules have finished writing them. + result.add(new CommitSharedPreferencesTestRule()); + return result; + } }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/CommitSharedPreferencesTestRule.java b/base/test/android/javatests/src/org/chromium/base/test/CommitSharedPreferencesTestRule.java new file mode 100644 index 0000000..190c28a --- /dev/null +++ b/base/test/android/javatests/src/org/chromium/base/test/CommitSharedPreferencesTestRule.java
@@ -0,0 +1,30 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base.test; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import org.chromium.base.ContextUtils; + +class CommitSharedPreferencesTestRule implements TestRule { + @Override + public Statement apply(Statement statement, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + try { + statement.evaluate(); + } finally { + // Some disk writes to update SharedPreferences may still be in progress if + // apply() was used after editing. Commit these changes to SharedPreferences + // before reporting the test as finished. See https://crbug.com/916717. + ContextUtils.getAppSharedPreferences().edit().commit(); + } + } + }; + } +}
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index f0e59dd..a9821a0 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -b60658d124143c596deb72b12f57cd9416ac6f42 \ No newline at end of file +c01556993ddfe1d08bd187dd889859e81d37b35b \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 78d25fd..c2f4454 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -e76e2612e0a32bbd00fc38cd7d3d0de71cab08c1 \ No newline at end of file +d2095fd309051d1e8df0534f4466956e3106ba77 \ No newline at end of file
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index 36e966e..ae61bbb 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -405,7 +405,7 @@ result->SetBoolean("HitTestableWithoutDrawsContent", hit_testable_without_draws_content_); result->SetBoolean("Is3dSorted", Is3dSorted()); - result->SetDouble("OPACITY", Opacity()); + result->SetDouble("Opacity", Opacity()); result->SetBoolean("ContentsOpaque", contents_opaque_); if (scrollable())
diff --git a/cc/test/layer_tree_json_parser_unittest.cc b/cc/test/layer_tree_json_parser_unittest.cc index 58559908..22a64d1 100644 --- a/cc/test/layer_tree_json_parser_unittest.cc +++ b/cc/test/layer_tree_json_parser_unittest.cc
@@ -86,7 +86,7 @@ tree->SetRootLayerForTesting(std::move(root_impl)); tree->BuildPropertyTreesForTesting(); - std::string json = host_impl.LayerTreeAsJson(); + std::string json = tree->LayerTreeAsJson(); scoped_refptr<Layer> root = ParseTreeFromJson(json, nullptr); ASSERT_TRUE(root.get()); EXPECT_TRUE(LayerTreesMatch(host_impl.active_tree()->root_layer_for_testing(), @@ -114,7 +114,7 @@ tree->SetRootLayerForTesting(std::move(root_impl)); tree->BuildPropertyTreesForTesting(); - std::string json = host_impl.LayerTreeAsJson(); + std::string json = tree->LayerTreeAsJson(); scoped_refptr<Layer> root = ParseTreeFromJson(json, nullptr); ASSERT_TRUE(root.get()); EXPECT_TRUE(LayerTreesMatch(host_impl.active_tree()->root_layer_for_testing(),
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index accc22e..bb1004b 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -380,11 +380,13 @@ std::string property_trees; base::JSONWriter::WriteWithOptions( *sync_tree->property_trees()->AsTracedValue()->ToBaseValue(), - base::JSONWriter::OPTIONS_PRETTY_PRINT, &property_trees); + base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION | + base::JSONWriter::OPTIONS_PRETTY_PRINT, + &property_trees); VLOG(3) << "After finishing commit on impl, the sync tree:" << "\nproperty_trees:\n" - << property_trees << "\nlayers:\n" - << host_impl->LayerListAsJson(); + << property_trees << "\ncc::LayerImpls:\n" + << sync_tree->LayerListAsJson(); } } @@ -809,7 +811,9 @@ std::string property_trees; base::JSONWriter::WriteWithOptions( *property_trees_.AsTracedValue()->ToBaseValue(), - base::JSONWriter::OPTIONS_PRETTY_PRINT, &property_trees); + base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION | + base::JSONWriter::OPTIONS_PRETTY_PRINT, + &property_trees); std::ostringstream layers; for (auto* layer : *this) { layers << "\n layer id " << layer->id(); @@ -820,13 +824,14 @@ layers << "\n draws_content: " << layer->DrawsContent(); layers << "\n scrollable: " << layer->scrollable(); layers << "\n contents_opaque: " << layer->contents_opaque(); - layers << "\n transform_tree_index: " << layer->transform_tree_index(); - layers << "\n clip_tree_index: " << layer->clip_tree_index(); - layers << "\n effect_tree_index: " << layer->effect_tree_index(); - layers << "\n scroll_tree_index: " << layer->scroll_tree_index(); + layers << "\n property tree indices: "; + layers << "transform(" << layer->transform_tree_index() << "), "; + layers << "clip(" << layer->clip_tree_index() << "), "; + layers << "effect(" << layer->effect_tree_index() << "), "; + layers << "scroll(" << layer->scroll_tree_index() << ")"; } VLOG(3) << "After updating layers on the main thread:\nproperty trees:\n" - << property_trees << "\nlayers:" << layers.str(); + << property_trees << "\ncc:Layers:" << layers.str(); } bool painted_content_has_slow_paths = false;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index a8f3b7f..4211eedc 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -2947,11 +2947,13 @@ std::string property_trees; base::JSONWriter::WriteWithOptions( *active_tree_->property_trees()->AsTracedValue()->ToBaseValue(), - base::JSONWriter::OPTIONS_PRETTY_PRINT, &property_trees); + base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION | + base::JSONWriter::OPTIONS_PRETTY_PRINT, + &property_trees); VLOG(3) << "After activating sync tree, the active tree:" << "\nproperty_trees:\n" - << property_trees << "\nlayers:\n" - << LayerListAsJson(); + << property_trees << "\ncc::LayerImpls:\n" + << active_tree_->LayerListAsJson(); } } @@ -4940,28 +4942,6 @@ } } -std::string LayerTreeHostImpl::LayerListAsJson() const { - auto list = std::make_unique<base::ListValue>(); - for (auto* layer : *active_tree_) { - list->Append(layer->LayerAsJson()); - } - std::string str; - base::JSONWriter::WriteWithOptions( - *list, base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); - return str; -} - -std::string LayerTreeHostImpl::LayerTreeAsJson() const { - std::string str; - if (active_tree_->root_layer_for_testing()) { - std::unique_ptr<base::Value> json( - active_tree_->root_layer_for_testing()->LayerTreeAsJson()); - base::JSONWriter::WriteWithOptions( - *json, base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); - } - return str; -} - void LayerTreeHostImpl::RegisterScrollbarAnimationController( ElementId scroll_element_id, float scrollbar_opacity) {
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index ca84520..29b402b 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h
@@ -464,11 +464,6 @@ int max_texture_size() const { return max_texture_size_; } void ReleaseLayerTreeFrameSink(); - std::string LayerListAsJson() const; - // TODO(pdr): This should be removed because there is no longer a tree - // of layers, only a list. - std::string LayerTreeAsJson() const; - int RequestedMSAASampleCount() const; virtual bool InitializeFrameSink(LayerTreeFrameSink* layer_tree_frame_sink);
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 9a69462..e969dfa 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -15,6 +15,7 @@ #include "base/containers/adapters.h" #include "base/debug/crash_logging.h" #include "base/debug/dump_without_crashing.h" +#include "base/json/json_writer.h" #include "base/metrics/histogram_macros.h" #include "base/stl_util.h" #include "base/strings/stringprintf.h" @@ -2332,4 +2333,31 @@ property_trees_.ResetAllChangeTracking(); } +std::string LayerTreeImpl::LayerListAsJson() const { + auto list = std::make_unique<base::ListValue>(); + for (auto* layer : *this) + list->Append(layer->LayerAsJson()); + std::string str; + base::JSONWriter::WriteWithOptions( + *list, + base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION | + base::JSONWriter::OPTIONS_PRETTY_PRINT, + &str); + return str; +} + +std::string LayerTreeImpl::LayerTreeAsJson() const { + std::string str; + if (root_layer_for_testing_) { + std::unique_ptr<base::Value> json( + root_layer_for_testing_->LayerTreeAsJson()); + base::JSONWriter::WriteWithOptions( + *json, + base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION | + base::JSONWriter::OPTIONS_PRETTY_PRINT, + &str); + } + return str; +} + } // namespace cc
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index bc7fb44..5893c43 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h
@@ -618,6 +618,11 @@ return elements_in_property_trees_; } + std::string LayerListAsJson() const; + // TODO(pdr): This should be removed because there is no longer a tree + // of layers, only a list. + std::string LayerTreeAsJson() const; + protected: float ClampPageScaleFactorToLimits(float page_scale_factor) const; void PushPageScaleFactorAndLimits(const float* page_scale_factor,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index 871e087..7cbf70e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -225,6 +225,7 @@ private TabModelSelector mTabModelSelector; private TabModelSelectorTabObserver mTabModelSelectorTabObserver; + private ActivityTabProvider.ActivityTabTabObserver mStatusBarColorTabObserver; private TabCreatorManager.TabCreator mRegularTabCreator; private TabCreatorManager.TabCreator mIncognitoTabCreator; private TabContentManager mTabContentManager; @@ -692,11 +693,6 @@ } @Override - public void onShown(Tab tab, @TabSelectionType int type) { - setStatusBarColor(tab, TabThemeColorHelper.getColor(tab)); - } - - @Override public void onLoadStopped(Tab tab, boolean toDifferentDocument) { postDeferredStartupIfNeeded(); } @@ -711,19 +707,33 @@ public void onCrash(Tab tab) { postDeferredStartupIfNeeded(); } + }; + + mStatusBarColorTabObserver = + new ActivityTabProvider.ActivityTabTabObserver(getActivityTabProvider()) { + @Override + public void onShown(Tab tab, @TabSelectionType int type) { + setStatusBarColor(tab, TabThemeColorHelper.getColor(tab)); + } @Override public void onDidChangeThemeColor(Tab tab, int color) { - if (getActivityTab() != tab) return; setStatusBarColor(tab, color); if (getToolbarManager() == null) return; getToolbarManager().updatePrimaryColor(color, true); - ControlContainer controlContainer = - (ControlContainer) findViewById(R.id.control_container); + ControlContainer controlContainer = findViewById(R.id.control_container); controlContainer.getToolbarResourceAdapter().invalidate(null); } + + @Override + protected void onObservingDifferentTab(Tab tab) { + // |tab == null| means we're switching tabs - by the tab switcher or by swiping + // on the omnibox. These cases are dealt with differently, elsewhere. + if (tab == null) return; + setStatusBarColor(tab, TabThemeColorHelper.getColor(tab)); + } }; if (mAssistStatusHandler != null) { @@ -1290,6 +1300,11 @@ mTabModelSelectorTabObserver = null; } + if (mStatusBarColorTabObserver != null) { + mStatusBarColorTabObserver.destroy(); + mStatusBarColorTabObserver = null; + } + if (mCompositorViewHolder != null) { if (mCompositorViewHolder.getLayoutManager() != null) { mCompositorViewHolder.getLayoutManager().removeSceneChangeObserver(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java index 7c6e36b..73bf7de 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
@@ -52,7 +52,7 @@ } private void updateDefaultColor() { - calculateDefaultColor(); + mDefaultColor = calculateDefaultColor(); updateIfNeeded(false); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java index 29ffc277..68abaf4b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
@@ -114,7 +114,6 @@ Tab tab; if (asyncParams != null && asyncParams.getTabToReparent() != null) { type = TabLaunchType.FROM_REPARENTING; - openInForeground = true; TabReparentingParams params = (TabReparentingParams) asyncParams; tab = params.getTabToReparent();
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 2da1535..dfbd99a 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -3930,7 +3930,7 @@ Assistant Triggered Checkout </message> <message name="IDS_AUTOFILL_ASSISTANT_GOOGLE_TERMS_DESCRIPTION" desc="Message linking to the Google terms and conditions for Fast Checkout."> - By continuing, you agree that Chrome will send data from Chrome Autofill, the site’s URL and its content to Google to provide this service.\n\nVisit Chrome settings to turn off Google Assistant in Chrome and Chrome Autofill. <ph name="BEGIN_LINK"><link></ph>Read more<ph name="END_LINK"></link></ph> + By continuing, you agree that Chrome will send data from Chrome Autofill, the site’s URL and its content to Google to provide this service.\n\nVisit Chrome settings to turn off Google Assistant in Chrome and Chrome Autofill. <ph name="BEGIN_LINK"><link></ph>Learn more<ph name="END_LINK"></link></ph> </message> <message name="IDS_AUTOFILL_ASSISTANT_GOOGLE_TERMS_URL" desc="URL for Google Autofill Assistant Terms of Service" translateable="false"> http://support.google.com/assistant?p=fast_checkout
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 7f454f68..34743bb 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292"><ph name="FILE_NAME" />ን እንደገና ማውረድ መጀመር ይፈልጋሉ?</translation> <translation id="2476578072172137802">የጣቢያ ቅንብሮች</translation> <translation id="2482878487686419369">ማስታወቂያዎች</translation> +<translation id="2494974097748878569">በChrome ውስጥ Google ረዳት</translation> <translation id="2496180316473517155">ታሪክ አሰሳ</translation> <translation id="2498359688066513246">እገዛ እና ግብረመልስ</translation> <translation id="2501278716633472235">ወደ ኋላ ተመለስ</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">የአጠቃቀም ስታቲክሶችን እና የብልሽት ሪፖርቶችን ወደ Google በመላክ Chromeን የተሻለ ለማድረግ እገዛ ያድርጉ።</translation> <translation id="410351446219883937">ራስ-አጫውት</translation> <translation id="4113030288477039509">በእርስዎ አስተዳዳሪ የሚቀናበር</translation> -<translation id="411332046216682877">ፍለጋ ለመጀመር እዚህ መታ ያድርጉ</translation> <translation id="4116038641877404294">ገጾችን ከመስመር ውጭ ለመጠቀም ያውርዷቸው</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d ዕልባት}one{%1$d ዕልባቶች}other{%1$d ዕልባቶች}}</translation> <translation id="4149994727733219643">ለድረ-ገጾች የተቃለለ እይታ</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">ለመሰብሰብ መታ ያድርጉ</translation> <translation id="5990142338020175451">እንደ የተሻሉ የገጽ ጥቆማዎች ያሉ ይበልጥ የግል Google አገልግሎቶች</translation> <translation id="6000066717592683814">Googleን አቆየው</translation> -<translation id="6001839398155993679">እንሂድ</translation> <translation id="6005538289190791541">የተጠቆመ የይለፍ ቃል</translation> <translation id="6039379616847168523">ወደ ቀጣዩ ትር ዝለል</translation> <translation id="6040143037577758943">ዝጋ</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">ገጹን ማተም ላይ ችግር ነበር። እባክዎ እንደገና ይሞክሩ።</translation> <translation id="6295158916970320988">ሁሉም ጣቢያዎች</translation> <translation id="629730747756840877">መለያ</translation> +<translation id="6302269476990306341">በChrome ውስጥ Google ረዳት እያቆመ ነው</translation> <translation id="6303969859164067831">ዘግተው ይውጡ እና ስምረትን ያጥፉ</translation> <translation id="6316139424528454185">የAndroid ስሪቱ አይደገፍም</translation> <translation id="6320088164292336938">ንዘር</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ተመርጠዋል</translation> <translation id="7253272406652746122">በመሣሪያዎ ቅንብሮች መተግበሪያ ውስጥ ካለው የመለያዎች ገጽ ሆነው የGoogle መለያ ያክሉ።</translation> <translation id="7274013316676448362">የታገደ ጣቢያ</translation> +<translation id="7291387454912369099">በረዳት የተቀሰቀሰ ተመዝግቦ መውጫ</translation> <translation id="729975465115245577">የእርስዎ መሣሪያ የይለፍ ቃላት ፋይሉን የሚያከማችበት መተግበሪያ የለውም።</translation> <translation id="7302081693174882195">ዝርዝሮች፦ በተቀመጠው የውሂብ መጠን ተደርድረዋል</translation> <translation id="7333031090786104871">አሁንም ቀዳሚ ጣቢያን በማከል ላይ</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">የድምጽ ፍለጋን ጀምር</translation> <translation id="9071742570345586758">የምናባዊ እውነታ ይዘትን ለመመልከት የGoogle ቪአር አገልግሎቶችን ይጫኑ</translation> <translation id="9074336505530349563">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን በመለያ መግባት እና ስምረትን ማብራት ለማግኘት</translation> -<translation id="9079796397681444569">በማያ ገጽዎ ግርጌ ላይ ያሉትን አዝራሮች በመጠቀም በቀላሉ በChrome ውስጥ ወደ ማንኛውም ቦታ ያስሱ</translation> <translation id="9080642952018487277">ወደ የግል ሁነታ ግባ</translation> <translation id="9086455579313502267">አውታረ መረቡን መድረስ አልተቻለም።</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> ኪባ ወርዷል</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb index 95a73e1..a3a72fe8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">هل ترغب في بدء تنزيل <ph name="FILE_NAME" /> مرة أخرى؟</translation> <translation id="2476578072172137802">إعدادات الموقع</translation> <translation id="2482878487686419369">الاشعارات</translation> +<translation id="2494974097748878569">"مساعد Google" على Chrome</translation> <translation id="2496180316473517155">سجل التصفح</translation> <translation id="2498359688066513246">المساعدة والتعليقات</translation> <translation id="2501278716633472235">الرجوع للخلف</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">ساعد في تحسين Chrome عن طريق إرسال إحصاءات الاستخدام وتقارير الأعطال إلى Google.</translation> <translation id="410351446219883937">تشغيل تلقائي</translation> <translation id="4113030288477039509">يديره المسؤول</translation> -<translation id="411332046216682877">يمكنك النقر هنا لبدء البحث بسرعة</translation> <translation id="4116038641877404294">تنزيل الصفحات لاستخدامها بلا اتصال بالإنترنت</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{إشارة مرجعية (%1$d)}zero{%1$d إشارة مرجعية}two{إشارتان مرجعيتان (%1$d)}few{%1$d إشارات مرجعية}many{%1$d إشارةً مرجعيةً}other{%1$d إشارة مرجعية}}</translation> <translation id="4149994727733219643">عرض مبسَّط لصفحات الويب</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">النقر للتصغير</translation> <translation id="5990142338020175451">مزيد من خدمات Google الشخصية، مثل أفضل اقتراحات الصفحة</translation> <translation id="6000066717592683814">الاستمرار في استخدام محرك Google</translation> -<translation id="6001839398155993679">البدء</translation> <translation id="6005538289190791541">كلمة المرور المُقترحَة</translation> <translation id="6039379616847168523">الانتقال السريع إلى علامة التبويب التالية</translation> <translation id="6040143037577758943">إغلاق</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">حدثت مشكلة أثناء طباعة الصفحة. يُرجى إعادة المحاولة.</translation> <translation id="6295158916970320988">جميع المواقع</translation> <translation id="629730747756840877">الحساب</translation> +<translation id="6302269476990306341">جارٍ إيقاف "مساعد Google" على Chrome</translation> <translation id="6303969859164067831">تسجيل الخروج وإيقاف المزامنة</translation> <translation id="6316139424528454185">إصدار Android غير متوافق</translation> <translation id="6320088164292336938">اهتزاز</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378">تم اختيار <ph name="ITEM_COUNT" /> عنصراً</translation> <translation id="7253272406652746122">أضف حساب Google من صفحة "الحسابات" في تطبيق إعدادات جهازك.</translation> <translation id="7274013316676448362">الموقع المحظور</translation> +<translation id="7291387454912369099">تفعيل الدفع عن طريق "مساعد Google"</translation> <translation id="729975465115245577">لا يتضمن جهازك تطبيقًا لتخزين ملف كلمات المرور.</translation> <translation id="7302081693174882195">التفاصيل: تم الترتيب بحسب مقدار البيانات المحفوظة</translation> <translation id="7333031090786104871">لا تزال عملية إضافة موقع الويب السابق جارية</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">بدء البحث الصوتي</translation> <translation id="9071742570345586758">لعرض محتوى الواقع الافتراضي، يلزمك تثبيت خدمات Google VR</translation> <translation id="9074336505530349563">للحصول على محتوى مُخصَّص اقترحته Google، يُرجى تسجيل الدخول وتفعيل المزامنة.</translation> -<translation id="9079796397681444569">يمكنك التنقل بسهولة في أي مكان في Chrome باستخدام الأزرار الموجودة أسفل الشاشة</translation> <translation id="9080642952018487277">الدخول إلى الوضع الخاص</translation> <translation id="9086455579313502267">تعذر الدخول إلى الشبكة</translation> <translation id="9099018167121903954">تم تنزيل <ph name="KILOBYTES" /> كيلوبايت</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb index 22ecbc3..981bf3cd 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Помогнете за подобряването на Chrome, като изпращате до Google статистически данни за употребата и сигнали за сривове.</translation> <translation id="410351446219883937">Автоматично възпроизвеждане</translation> <translation id="4113030288477039509">Управлява се от администратора ви</translation> -<translation id="411332046216682877">Докоснете тук за бързо започване на търсене</translation> <translation id="4116038641877404294">Изтеглете страниците, за да ги използвате офлайн</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d отметка}other{%1$d отметки}}</translation> <translation id="4149994727733219643">Опростен изглед на уеб страниците</translation> @@ -647,7 +646,6 @@ <translation id="5962718611393537961">Докоснете за свиване</translation> <translation id="5990142338020175451">По-персонализирани услуги на Google, като например по-добри предложения за страници</translation> <translation id="6000066717592683814">Запазване на Google</translation> -<translation id="6001839398155993679">Начало</translation> <translation id="6005538289190791541">Предложена парола</translation> <translation id="6039379616847168523">Преминаване към следващия раздел</translation> <translation id="6040143037577758943">Затваряне</translation> @@ -1049,7 +1047,6 @@ <translation id="9070377983101773829">Стартиране на гласово търсене</translation> <translation id="9071742570345586758">За да гледате съдържанието за виртуална реалност, инсталирайте съответните услуги на Google</translation> <translation id="9074336505530349563">Влезте в профила си и включете синхронизирането, за да получавате персонализирано съдържание, предлагано от Google</translation> -<translation id="9079796397681444569">Бутоните в долната част на екрана осигуряват лесен достъп до функциите на Chrome</translation> <translation id="9080642952018487277">Преминаване в режим на частно сърфиране</translation> <translation id="9086455579313502267">Няма достъп до мрежата</translation> <translation id="9099018167121903954">Изтеглени файлове: <ph name="KILOBYTES" /> КБ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb index 1f9d1cb..3fa9e3f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">আপনি কি আবার <ph name="FILE_NAME" /> ডাউনলোড করা শুরু করতে চান?</translation> <translation id="2476578072172137802">সাইটের সেটিংস</translation> <translation id="2482878487686419369">বিজ্ঞপ্তিগুলি</translation> +<translation id="2494974097748878569">Chrome-এ Google অ্যাসিস্ট্যান্ট</translation> <translation id="2496180316473517155">ব্রাউজিং ইতিহাস</translation> <translation id="2498359688066513246">সহায়তা ও প্রতিক্রিয়া</translation> <translation id="2501278716633472235">ফিরে যান</translation> @@ -394,7 +395,6 @@ <translation id="4099578267706723511">Google-এ ব্যবহারের পরিসংখ্যান এবং ক্র্যাশ প্রতিবেদনগুলি পাঠিয়ে Chrome কে আরও ভাল করে তুলতে সহায়তা করুন৷</translation> <translation id="410351446219883937">স্বতঃচালানো</translation> <translation id="4113030288477039509">আপনার প্রশাসকের দ্বারা পরিচালিত</translation> -<translation id="411332046216682877">এখানে ট্যাপ করে দ্রুত সার্চ করা শুরু করুন</translation> <translation id="4116038641877404294">পৃষ্ঠাগুলি অফলাইনে ব্যবহার করতে সেগুলি ডাউনলোড করুন</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$dটি বুকমার্ক}one{%1$dটি বুকমার্ক}other{%1$dটি বুকমার্ক}}</translation> <translation id="4149994727733219643">ওয়েব পৃষ্ঠার জন্য সরলীকৃত ভিউ</translation> @@ -648,7 +648,6 @@ <translation id="5962718611393537961">সঙ্কুচিত করতে আলতো চাপুন</translation> <translation id="5990142338020175451">ভাল পৃষ্ঠার সাজেশনের মতো আরও ব্যক্তিগত Google পরিষেবা</translation> <translation id="6000066717592683814">Google কে রাখুন</translation> -<translation id="6001839398155993679">শুরু করা যাক</translation> <translation id="6005538289190791541">প্রস্তাবিত পাসওয়ার্ড</translation> <translation id="6039379616847168523">পরবর্তী ট্যাবে চলে যান</translation> <translation id="6040143037577758943">বন্ধ</translation> @@ -685,6 +684,7 @@ <translation id="6277522088822131679">পৃষ্ঠাটি প্রিন্ট করার সময় একটি সমস্যা হয়েছিল৷ দয়া করে আবার চেষ্টা করুন৷</translation> <translation id="6295158916970320988">সমস্ত সাইট</translation> <translation id="629730747756840877">অ্যাকাউন্ট</translation> +<translation id="6302269476990306341">Chrome-এ Google অ্যাসিস্ট্যান্ট এতক্ষণ পরে বন্ধ হয়ে যাবে:</translation> <translation id="6303969859164067831">সাইন-আউট করুন এবং সিঙ্ক করা বন্ধ করুন</translation> <translation id="6316139424528454185">এই Android ভার্সন সমর্থিত নয়</translation> <translation id="6320088164292336938">কম্পন</translation> @@ -818,6 +818,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" />টি বেছে নেওয়া হয়েছে</translation> <translation id="7253272406652746122">আপনার ডিভাইসের সেটিংস অ্যাপ্লিকেশানের অ্যাকাউন্টস পৃষ্ঠা থেকে একটি Google অ্যাকাউন্ট যোগ করুন।</translation> <translation id="7274013316676448362">অবরুদ্ধ সাইট</translation> +<translation id="7291387454912369099">অ্যাসিস্ট্যান্টের মাধ্যমে "Checkout"</translation> <translation id="729975465115245577">পাসওয়ার্ড ফাইল সেভ করার জন্য আপনার ডিভাইসে কোনও অ্যাপ নেই।</translation> <translation id="7302081693174882195">বিবরণ: সেভ করা ডেটার পরিমাণ অনুযায়ী সাজানো হয়েছে</translation> <translation id="7333031090786104871">এখনও পূর্বের সাইট যোগ করছে</translation> @@ -1050,7 +1051,6 @@ <translation id="9070377983101773829">ভয়েস সার্চ শুরু করুন</translation> <translation id="9071742570345586758">ভার্চুয়াল বাস্তবতার কন্টেন্ট দেখতে Google VR পরিষেবাগুলি ইনস্টল করুন</translation> <translation id="9074336505530349563">Google-এর প্রস্তাবিত ব্যক্তিগতকৃত কন্টেন্ট পাওয়ার জন্য সাইন-ইন করে সিঙ্ক বিকল্প চালু করুন</translation> -<translation id="9079796397681444569">আপনার স্ক্রিনের নিচে দেওয়া বোতামগুলি ব্যবহার করে যেকোনও জায়গা থেকে সহজেই Chrome-এ নেভিগেট করুন</translation> <translation id="9080642952018487277">ব্যক্তিগত মোডে যান</translation> <translation id="9086455579313502267">নেটওয়ার্কটি অ্যাক্সেস করতে অক্ষম</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB ডাউনলোড করা হয়েছে</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb index be8dca1..cfd9f29 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Ajuda a millorar Chrome enviant estadístiques d'ús i d'informes d'error a Google.</translation> <translation id="410351446219883937">Reproducció automàtica</translation> <translation id="4113030288477039509">Gestionat per l'administrador</translation> -<translation id="411332046216682877">Toca aquí per iniciar una cerca ràpidament</translation> <translation id="4116038641877404294">Baixa pàgines per utilitzar-les sense connexió</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d adreça d'interès}other{%1$d adreces d'interès}}</translation> <translation id="4149994727733219643">Visualització simplificada de pàgines web</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Toca per replegar</translation> <translation id="5990142338020175451">Serveis de Google més personals, com ara millors suggeriments de pàgines</translation> <translation id="6000066717592683814">Continua amb Google</translation> -<translation id="6001839398155993679">Som-hi</translation> <translation id="6005538289190791541">Contrasenya suggerida</translation> <translation id="6039379616847168523">Ves a la pestanya següent</translation> <translation id="6040143037577758943">Tanca</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Inicia la cerca per veu</translation> <translation id="9071742570345586758">Per veure contingut en realitat virtual, instal·la els Serveis RV de Google</translation> <translation id="9074336505530349563">Perquè Google et suggereixi contingut personalitzat, inicia la sessió i activa la sincronització</translation> -<translation id="9079796397681444569">Navega fàcilment a qualsevol lloc de Chrome amb els botons de la part inferior de la pantalla</translation> <translation id="9080642952018487277">Activa el mode privat</translation> <translation id="9086455579313502267">No es pot accedir a la xarxa</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB en baixades</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb index 6799773..ddeb00a4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Pomozte Chrome zlepšovat – posílejte Googlu statistiky využití a zprávy o selhání.</translation> <translation id="410351446219883937">Automatické přehrávání</translation> <translation id="4113030288477039509">Spravováno vaším administrátorem</translation> -<translation id="411332046216682877">Klepnutím sem rychle spustíte vyhledávání</translation> <translation id="4116038641877404294">Stáhněte si stránky k použití offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d záložka}few{%1$d záložky}many{%1$d záložky}other{%1$d záložek}}</translation> <translation id="4149994727733219643">Zjednodušené zobrazení webových stránek</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Klepnutím sbalíte</translation> <translation id="5990142338020175451">Více osobních služeb Google, např. lepší návrhy stránek</translation> <translation id="6000066717592683814">Ponechat Google</translation> -<translation id="6001839398155993679">Jdeme na to</translation> <translation id="6005538289190791541">Navrhované heslo</translation> <translation id="6039379616847168523">Přejít na další kartu</translation> <translation id="6040143037577758943">Zavřít</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Spustit hlasové vyhledávání</translation> <translation id="9071742570345586758">Chcete-li zobrazit obsah pro virtuální realitu, nainstalujte si Služby VR Google</translation> <translation id="9074336505530349563">Chcete-li od Googlu získat personalizované návrhy obsahu, zapněte synchronizaci</translation> -<translation id="9079796397681444569">Pomocí tlačítek v dolní části obrazovky v Chromu snadno přejdete kamkoliv</translation> <translation id="9080642952018487277">Přejít do soukromého režimu</translation> <translation id="9086455579313502267">Nelze získat přístup k síti.</translation> <translation id="9099018167121903954">Staženo: <ph name="KILOBYTES" /> kB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb index 8aeb36d..4dd7ebb 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Hjælp med at gøre Chrome bedre ved at sende brugsstatistik og nedbrudsrapporter til Google.</translation> <translation id="410351446219883937">Autoplay</translation> <translation id="4113030288477039509">Administreres af din administrator</translation> -<translation id="411332046216682877">Tryk her for at foretage en hurtig søgning</translation> <translation id="4116038641877404294">Download sider for at bruge dem, mens du er offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bogmærke}one{%1$d bogmærke}other{%1$d bogmærker}}</translation> <translation id="4149994727733219643">Enkel visning af websider</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Tryk for at skjule</translation> <translation id="5990142338020175451">Mere personlige Google-tjenester, f.eks. bedre sideforslag</translation> <translation id="6000066717592683814">Behold Google</translation> -<translation id="6001839398155993679">Lad os komme i gang</translation> <translation id="6005538289190791541">Foreslået adgangskode</translation> <translation id="6039379616847168523">Gå til den næste fane</translation> <translation id="6040143037577758943">Luk</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Start talesøgning</translation> <translation id="9071742570345586758">Installer Google VR-tjenester for at se virtual reality-indhold</translation> <translation id="9074336505530349563">Log ind, og aktivér synkronisering for at hente brugertilpasset indhold, som er foreslået af Google</translation> -<translation id="9079796397681444569">Find nemt rundt i Chrome via knapperne nederst på skærmen</translation> <translation id="9080642952018487277">Aktivér privat tilstand</translation> <translation id="9086455579313502267">Der kunne ikke opnås adgang til netværket</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB er downloadet</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb index c0b54b8b..bd2f622c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Nutzungsstatistiken und Absturzberichte zur Verbesserung von Chrome an Google senden</translation> <translation id="410351446219883937">Autoplay</translation> <translation id="4113030288477039509">Von Ihrem Administrator verwaltet</translation> -<translation id="411332046216682877">Tippen Sie hier, um schnell mit einer Suche zu beginnen</translation> <translation id="4116038641877404294">Seiten zur Offline-Ansicht herunterladen</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d Lesezeichen}other{%1$d Lesezeichen}}</translation> <translation id="4149994727733219643">Vereinfachte Ansicht für Webseiten</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Zum Minimieren tippen</translation> <translation id="5990142338020175451">Personalisierte Google-Dienste, z. B. bessere Seitenvorschläge</translation> <translation id="6000066717592683814">Google beibehalten</translation> -<translation id="6001839398155993679">Los gehts</translation> <translation id="6005538289190791541">Vorgeschlagenes Passwort</translation> <translation id="6039379616847168523">Zum nächsten Tab wechseln</translation> <translation id="6040143037577758943">Schließen</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Sprachsuche starten</translation> <translation id="9071742570345586758">Google VR Services installieren, um Virtual-Reality-Inhalte zu sehen</translation> <translation id="9074336505530349563">Melden Sie sich und aktivieren Sie die Synchronisierung, um personalisierte, von Google vorgeschlagene Inhalte zu erhalten</translation> -<translation id="9079796397681444569">Über die Schaltflächen am unteren Bildschirmrand können Sie einfach andere Bereiche in Chrome aufrufen</translation> <translation id="9080642952018487277">Privaten Modus aktivieren</translation> <translation id="9086455579313502267">Kein Zugriff auf das Netzwerk</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB heruntergeladen</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb index e2ac2a6..f70f317 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Θέλετε να ξεκινήσετε ξανά τη λήψη του αρχείου <ph name="FILE_NAME" />;</translation> <translation id="2476578072172137802">Ρυθμίσεις ιστότοπου</translation> <translation id="2482878487686419369">Ειδοποιήσεις</translation> +<translation id="2494974097748878569">Βοηθός Google στο Chrome</translation> <translation id="2496180316473517155">Ιστορικό περιήγησης</translation> <translation id="2498359688066513246">Βοήθεια και σχόλια</translation> <translation id="2501278716633472235">Επιστροφή</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Συμβάλετε στη βελτίωση του Chrome, στέλνοντας στην Google στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων.</translation> <translation id="410351446219883937">Αυτόματη αναπαραγωγή</translation> <translation id="4113030288477039509">Διαχειρίζεται από το διαχειριστή σας</translation> -<translation id="411332046216682877">Πατήστε εδώ για να ξεκινήσετε γρήγορα μια αναζήτηση</translation> <translation id="4116038641877404294">Κατεβάστε σελίδες για να τις χρησιμοποιήσετε εκτός σύνδεσης</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d σελιδοδείκτης}other{%1$d σελιδοδείκτες}}</translation> <translation id="4149994727733219643">Απλοποιημένη προβολή για ιστοσελίδες</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Πατήστε για σύμπτυξη</translation> <translation id="5990142338020175451">Περισσότερες εξατομικευμένες υπηρεσίες Google, όπως καλύτερες προτάσεις σελίδας</translation> <translation id="6000066717592683814">Διατήρηση του Google</translation> -<translation id="6001839398155993679">Ας ξεκινήσουμε</translation> <translation id="6005538289190791541">Προτεινόμενος κωδικός πρόσβασης</translation> <translation id="6039379616847168523">Μετάβαση στην επόμενη καρτέλα</translation> <translation id="6040143037577758943">Κλείσιμο</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Παρουσιάστηκε ένα πρόβλημα κατά την εκτύπωση της σελίδας. Δοκιμάστε ξανά.</translation> <translation id="6295158916970320988">Όλοι οι ιστότοποι</translation> <translation id="629730747756840877">Λογαριασμός</translation> +<translation id="6302269476990306341">Διακοπή Βοηθού Google στο Chrome</translation> <translation id="6303969859164067831">Αποσύνδεση και απενεργοποίηση συγχρονισμού</translation> <translation id="6316139424528454185">Μη υποστηρ. έκδοση Android</translation> <translation id="6320088164292336938">Δόνηση</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378">Επιλέχθηκαν <ph name="ITEM_COUNT" /></translation> <translation id="7253272406652746122">Προσθέστε έναν Λογαριασμό Google από τη σελίδα "Λογαριασμοί" της εφαρμογής Ρυθμίσεις της συσκευής σας.</translation> <translation id="7274013316676448362">Αποκλεισμένος ιστότοπος</translation> +<translation id="7291387454912369099">Ολοκλήρωση αγοράς από τον Βοηθό</translation> <translation id="729975465115245577">Η συσκευή σας δεν διαθέτει κάποια εφαρμογή για την αποθήκευση του αρχείου κωδικών πρόσβασης.</translation> <translation id="7302081693174882195">Λεπτομέρειες: Ταξινομήθηκαν βάσει του όγκου των δεδομένων που αποθηκεύτηκαν</translation> <translation id="7333031090786104871">Η προσθήκη του προηγούμενου ιστοτόπου δεν έχει ολοκληρωθεί</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Έναρξη φωνητικής αναζήτησης</translation> <translation id="9071742570345586758">Για να προβάλλετε περιεχόμενο εικονικής πραγματικότητας, εγκαταστήστε την εφαρμογή Google VR Services</translation> <translation id="9074336505530349563">Για λήψη εξατομικευμένου περιεχομένου που προτείνεται από την Google, συνδεθείτε και ενεργοποιήστε τον συγχρονισμό</translation> -<translation id="9079796397681444569">Πλοηγηθείτε εύκολα οπουδήποτε στο Chrome χρησιμοποιώντας τα κουμπιά στο κάτω μέρος της οθόνης</translation> <translation id="9080642952018487277">Είσοδος σε ιδιωτική λειτουργία</translation> <translation id="9086455579313502267">Δεν είναι δυνατή η πρόσβαση στο δίκτυο</translation> <translation id="9099018167121903954">Έγινε λήψη <ph name="KILOBYTES" /> KB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb index c3093cf..d26de913b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Do you want to start downloading <ph name="FILE_NAME" /> again?</translation> <translation id="2476578072172137802">Site Settings</translation> <translation id="2482878487686419369">Notifications</translation> +<translation id="2494974097748878569">Google Assistant in Chrome</translation> <translation id="2496180316473517155">Browsing history</translation> <translation id="2498359688066513246">Help & feedback</translation> <translation id="2501278716633472235">Go back</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Help make Chrome better by sending usage statistics and crash reports to Google.</translation> <translation id="410351446219883937">Autoplay</translation> <translation id="4113030288477039509">Managed by your administrator</translation> -<translation id="411332046216682877">Tap here to quickly begin a search</translation> <translation id="4116038641877404294">Download pages to use them offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bookmark}other{%1$d bookmarks}}</translation> <translation id="4149994727733219643">Simplified view for web pages</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Tap to collapse</translation> <translation id="5990142338020175451">More personal Google services, such as better page suggestions</translation> <translation id="6000066717592683814">Keep Google</translation> -<translation id="6001839398155993679">Let's go</translation> <translation id="6005538289190791541">Suggested password</translation> <translation id="6039379616847168523">Jump to the next tab</translation> <translation id="6040143037577758943">Close</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">There was a problem printing the page. Please try again.</translation> <translation id="6295158916970320988">All sites</translation> <translation id="629730747756840877">Account</translation> +<translation id="6302269476990306341">Google Assistant in Chrome stopping</translation> <translation id="6303969859164067831">Sign out and turn off sync</translation> <translation id="6316139424528454185">Android version is unsupported</translation> <translation id="6320088164292336938">Vibrate</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selected</translation> <translation id="7253272406652746122">Add a Google account from the Accounts page in your device’s Settings app.</translation> <translation id="7274013316676448362">Blocked site</translation> +<translation id="7291387454912369099">Assistant Triggered Checkout</translation> <translation id="729975465115245577">Your device doesn’t have an app to store the passwords file.</translation> <translation id="7302081693174882195">Details: Sorted by amount of data saved</translation> <translation id="7333031090786104871">Still adding previous site</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Start voice search</translation> <translation id="9071742570345586758">To view virtual reality content, install Google VR Services</translation> <translation id="9074336505530349563">To get personalised content suggested by Google, sign in and turn on sync</translation> -<translation id="9079796397681444569">Easily navigate anywhere in Chrome using the buttons at the bottom of your screen</translation> <translation id="9080642952018487277">Enter private mode</translation> <translation id="9086455579313502267">Unable to access the network</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB downloaded</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb index 0a77a59..7656ad0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Envía las estadísticas de uso y los informes de fallos a Google para ayudarnos a mejorar Chrome.</translation> <translation id="410351446219883937">Reproducción automática</translation> <translation id="4113030288477039509">Administrado por tu administrador</translation> -<translation id="411332046216682877">Presiona aquí para iniciar una búsqueda rápidamente</translation> <translation id="4116038641877404294">Descarga las páginas para usarlas sin conexión</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d favorito}other{%1$d favoritos}}</translation> <translation id="4149994727733219643">Vista simplificada para páginas web</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Presiona para contraer</translation> <translation id="5990142338020175451">Servicios de Google más personalizados, como mejores sugerencias de páginas</translation> <translation id="6000066717592683814">Seguir usando Google</translation> -<translation id="6001839398155993679">Comenzar</translation> <translation id="6005538289190791541">Contraseña sugerida</translation> <translation id="6039379616847168523">Ir a la pestaña siguiente</translation> <translation id="6040143037577758943">Cerrar</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Iniciar búsqueda por voz</translation> <translation id="9071742570345586758">Para ver contenido de realidad virtual, instala los servicios de RV de Google</translation> <translation id="9074336505530349563">Para obtener contenido personalizado y sugerido por Google, accede a tu cuenta y activa la sincronización</translation> -<translation id="9079796397681444569">Navega fácilmente en cualquier lugar con Chrome mediante los botones en la parte inferior de la pantalla</translation> <translation id="9080642952018487277">Acceder al modo privado</translation> <translation id="9086455579313502267">No se puede acceder a la red</translation> <translation id="9099018167121903954">Contenido descargado: <ph name="KILOBYTES" /> kilobytes</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb index cb312f2..0543f057 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Ayudar a mejorar Chrome enviando estadísticas de uso e informes sobre fallos.</translation> <translation id="410351446219883937">Reproducción automática</translation> <translation id="4113030288477039509">Administrado por tu administrador</translation> -<translation id="411332046216682877">Toca aquí para iniciar rápidamente una búsqueda</translation> <translation id="4116038641877404294">Descarga páginas para usarlas sin conexión</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d marcador}other{%1$d marcadores}}</translation> <translation id="4149994727733219643">Vista simplificada de páginas web</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Toca para ocultar</translation> <translation id="5990142338020175451">Servicios de Google más personalizados, como mejores sugerencias de páginas</translation> <translation id="6000066717592683814">Mantener Google como motor de búsqueda predeterminado</translation> -<translation id="6001839398155993679">Empezar</translation> <translation id="6005538289190791541">Contraseña sugerida</translation> <translation id="6039379616847168523">Te dirige a la siguiente pestaña</translation> <translation id="6040143037577758943">Cerrar</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Iniciar búsqueda por voz</translation> <translation id="9071742570345586758">Para ver contenido de realidad virtual, instala Servicios RV de Google</translation> <translation id="9074336505530349563">Inicia sesión y activa la sincronización para obtener contenido personalizado sugerido por Google</translation> -<translation id="9079796397681444569">Navega fácilmente en Chrome usando los botones de la parte inferior de la pantalla</translation> <translation id="9080642952018487277">Activa el modo privado</translation> <translation id="9086455579313502267">No ha sido posible acceder a la red</translation> <translation id="9099018167121903954">kB descargados: <ph name="KILOBYTES" /></translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb index ddbe3815..1524c886 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Aidake muuta Chrome'i paremaks, saates Google'ile kasutusstatistikat ja krahhiaruandeid.</translation> <translation id="410351446219883937">Automaatesitus</translation> <translation id="4113030288477039509">Seda haldab teie administraator</translation> -<translation id="411332046216682877">Puudutage siin otsingu kiireks alustamiseks</translation> <translation id="4116038641877404294">Laadige lehed alla, et neid võrguühenduseta kasutada</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d järjehoidja}other{%1$d järjehoidjat}}</translation> <translation id="4149994727733219643">Veebilehtede lihtsustatud vaade</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Ahendamiseks puudutage</translation> <translation id="5990142338020175451">Isiklikumad Google'i teenused, nt paremad lehesoovitused</translation> <translation id="6000066717592683814">Säilita Google</translation> -<translation id="6001839398155993679">Alustagem</translation> <translation id="6005538289190791541">Soovitatud parool</translation> <translation id="6039379616847168523">Järgmisele vahelehele liikumine</translation> <translation id="6040143037577758943">Sulge</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Häälotsingu alustamine</translation> <translation id="9071742570345586758">Virtuaalse reaalsuse sisu vaatamiseks installige Google VR-i teenused</translation> <translation id="9074336505530349563">Google'i soovitatud isikupärastatud sisu hankimiseks logige sisse ja lülitage sünkroonimine sisse</translation> -<translation id="9079796397681444569">Navigeerige Chrome'is hõlpsalt kõikjal, kasutades ekraanikuva allosas olevaid nuppe</translation> <translation id="9080642952018487277">Privaatse režiimi aktiveerimine</translation> <translation id="9086455579313502267">Ei saa võrgule juurdepääsu</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB on alla laaditud</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb index ce4d291..4acc842 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">با ارسال آمار کاربرد و گزارشهای خرابی به Google، به بهتر شدن Chrome کمک کنید.</translation> <translation id="410351446219883937">پخش خودکار</translation> <translation id="4113030288477039509">مدیریت شده توسط سرپرستتان</translation> -<translation id="411332046216682877">برای شروع جستجوی سریع، اینجا ضربه بزنید</translation> <translation id="4116038641877404294">برای استفاده از صفحهها در حالت آفلاین، آنها را بارگیری کنید</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d نشانک}one{%1$d نشانک}other{%1$d نشانک}}</translation> <translation id="4149994727733219643">نمای سادهشده برای صفحههای وب</translation> @@ -645,7 +644,6 @@ <translation id="5962718611393537961">برای کوچک کردن ضربه بزنید</translation> <translation id="5990142338020175451">سرویسهای Google شخصیشده بیشتر، مثل پیشنهادهای بهتر برای صفحه</translation> <translation id="6000066717592683814">حفظ Google</translation> -<translation id="6001839398155993679">بیایید شروع کنیم</translation> <translation id="6005538289190791541">گذرواژه پیشنهادی</translation> <translation id="6039379616847168523">رفتن به برگه بعدی</translation> <translation id="6040143037577758943">بستن</translation> @@ -1047,7 +1045,6 @@ <translation id="9070377983101773829">شروع جستجوی گفتاری</translation> <translation id="9071742570345586758">برای مشاهده محتوای واقعیت مجازی، «سرویسهای Google VR» را نصب کنید</translation> <translation id="9074336505530349563">برای اینکه Google محتوای شخصیشده به شما پیشنهاد دهد، به سیستم وارده شوید و همگامسازی را روشن کنید</translation> -<translation id="9079796397681444569">با استفاده از دکمههای پایین صفحهنمایشتان، در Chrome بهآسانی به هرجایی بروید</translation> <translation id="9080642952018487277">وارد شدن به حالت خصوصی</translation> <translation id="9086455579313502267">دسترسی به شبکه امکانپذیر نیست</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> کیلوبایت بارگیری شد</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb index 6f0606f..e1309b5 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Auta parantamaan Chromea lähettämällä käyttötilastoja ja virheraportteja Googlelle.</translation> <translation id="410351446219883937">Automaattinen toisto</translation> <translation id="4113030288477039509">Järjestelmänvalvojasi hallinnoima</translation> -<translation id="411332046216682877">Käynnistä haku nopeasti napauttamalla tästä</translation> <translation id="4116038641877404294">Lataa sivuja offline-käyttöä varten.</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d kirjanmerkki}other{%1$d kirjanmerkkiä}}</translation> <translation id="4149994727733219643">Yksinkertaisempi sivunäkymä</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Tiivistä napauttamalla.</translation> <translation id="5990142338020175451">Personoidumpia Google-palveluja, kuten parempia sivuehdotuksia</translation> <translation id="6000066717592683814">Käytä Googlea</translation> -<translation id="6001839398155993679">Aloita</translation> <translation id="6005538289190791541">Salasanaehdotus</translation> <translation id="6039379616847168523">Siirry seuraavalle välilehdelle</translation> <translation id="6040143037577758943">Sulje</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Aloita puhehaku</translation> <translation id="9071742570345586758">Jos haluat tarkastella virtuaalitodellisuussisältöä, asenna Googlen VR-palvelut.</translation> <translation id="9074336505530349563">Kirjaudu sisään ja ota synkronointi käyttöön, niin näet Googlen suosittelemaa yksilöllistä sisältöä</translation> -<translation id="9079796397681444569">Liiku helposti Chromessa näytön alareunan painikkeilla</translation> <translation id="9080642952018487277">Siirry yksityiseen tilaan</translation> <translation id="9086455579313502267">Ei yhteyttä verkkoon.</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> Kt ladattu</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 98b7493..2ea8333 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Tulungang mapahusay ang Chrome sa pamamagitan ng pagpapadala sa Google ng mga istatistika ng paggamit at ulat ng pag-crash.</translation> <translation id="410351446219883937">I-autoplay</translation> <translation id="4113030288477039509">Pinamamahalaan ng iyong administrator</translation> -<translation id="411332046216682877">Mag-tap dito para mabilis na magsimula ng paghahanap</translation> <translation id="4116038641877404294">I-download ang mga page upang magamit ang mga ito offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bookmark}one{%1$d bookmark}other{%1$d na bookmark}}</translation> <translation id="4149994727733219643">Pinasimpleng view para sa mga web page</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">I-tap upang i-collapse</translation> <translation id="5990142338020175451">Higit pang personal na serbisyo ng Google, tulad ng mas mahuhusay na suhestyon sa page</translation> <translation id="6000066717592683814">Panatilihin ang Google</translation> -<translation id="6001839398155993679">Tara na</translation> <translation id="6005538289190791541">Iminumungkahing password</translation> <translation id="6039379616847168523">Pumunta sa susunod na tab</translation> <translation id="6040143037577758943">Isara</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Simulan ang paghahanap gamit ang boses</translation> <translation id="9071742570345586758">Upang tingnan ang virtual reality na content, i-install ang Mga Serbisyo ng Google VR</translation> <translation id="9074336505530349563">Para makakuha ng naka-personalize na content na iminumungkahi ng Google, mag-sign in at i-on ang pag-sync</translation> -<translation id="9079796397681444569">Mag-navigate nang walang kahirap-hirap saanman sa Chrome gamit ang mga button sa ibaba ng iyong screen</translation> <translation id="9080642952018487277">Pumasok sa private mode</translation> <translation id="9086455579313502267">Hindi magawang ma-access ang network</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB na mga na-download</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb index 411510a..5d18636 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Envoyez des statistiques d'utilisation et des rapports d'erreur pour améliorer Chrome.</translation> <translation id="410351446219883937">Lecture automatique</translation> <translation id="4113030288477039509">Géré par votre administrateur</translation> -<translation id="411332046216682877">Appuyez ici pour lancer une recherche rapidement</translation> <translation id="4116038641877404294">Téléchargez des pages pour y accéder hors connexion</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d favori}one{%1$d favori}other{%1$d favoris}}</translation> <translation id="4149994727733219643">Vue simplifiée pour les pages Web</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Appuyer pour réduire</translation> <translation id="5990142338020175451">Des services Google plus personnalisés, comme des suggestions de pages plus pertinentes</translation> <translation id="6000066717592683814">Conserver Google</translation> -<translation id="6001839398155993679">OK</translation> <translation id="6005538289190791541">Mot de passe suggéré</translation> <translation id="6039379616847168523">Accéder à l'onglet suivant</translation> <translation id="6040143037577758943">Fermer</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Démarrer la recherche vocale</translation> <translation id="9071742570345586758">Pour afficher des contenus de réalité virtuelle, installez les services Google VR</translation> <translation id="9074336505530349563">Connectez-vous et activez la synchronisation pour obtenir des suggestions de contenu personnalisées de la part de Google</translation> -<translation id="9079796397681444569">Naviguez facilement dans Chrome à l'aide des boutons situés en bas de l'écran</translation> <translation id="9080642952018487277">Activer le mode privé</translation> <translation id="9086455579313502267">Impossible d'accéder au réseau.</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> Ko téléchargé(s)</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb index 9c6affe..f019c57 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">ઉપયોગનાં આંકડા અને ક્રૅશ રિપોર્ટ Googleને મોકલીને Chromeને વધુ સારું બનાવવામાં મદદ કરો.</translation> <translation id="410351446219883937">ઑટોપ્લે</translation> <translation id="4113030288477039509">તમારા વ્યવસ્થાપક દ્વારા સંચાલિત</translation> -<translation id="411332046216682877">કોઈ શોધને ઝડપથી શરૂ કરવા માટે અહીં ટૅપ કરો</translation> <translation id="4116038641877404294">ઇન્ટરનેટ ન હોય ત્યારે પણ ઉપયોગમાં લેવા માટે પેજ ડાઉનલોડ કરો</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d બુકમાર્ક}one{%1$d બુકમાર્ક}other{%1$d બુકમાર્ક}}</translation> <translation id="4149994727733219643">વેબપેજ માટે સરળ દૃશ્ય</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">સંકુચિત કરવા માટે ટૅપ કરો</translation> <translation id="5990142338020175451">Googleની વધુ વ્યક્તિગત સેવાઓ, જેમ કે પેજના વધુ સારા સૂચનો</translation> <translation id="6000066717592683814">Google રાખો</translation> -<translation id="6001839398155993679">ચાલો જઈએ</translation> <translation id="6005538289190791541">સૂચવેલ પાસવર્ડ</translation> <translation id="6039379616847168523">આગલા ટૅબ પર જાઓ</translation> <translation id="6040143037577758943">બંધ કરો</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">વૉઇસ શોધ પ્રારંભ કરો</translation> <translation id="9071742570345586758">વર્ચ્યુઅલ રિયાલિટી કન્ટેન્ટ જોવા માટે, Google VR સેવાઓ ઇન્સ્ટૉલ કરો</translation> <translation id="9074336505530349563">Google દ્વારા સૂચવેલ વ્યક્તિગત કરેલ કન્ટેન્ટ મેળવવા માટે, સાઇન ઇન કરો અને સિંક કરવાનું ચાલુ કરો</translation> -<translation id="9079796397681444569">તમારી સ્ક્રીનમાં નીચે આવેલા બટનનો ઉપયોગ કરીને Chromeમાં ગમે ત્યાં સહેલાઈથી નૅવિગેટ કરો</translation> <translation id="9080642952018487277">ખાનગી મોડમાં પ્રવેશ કરો</translation> <translation id="9086455579313502267">નેટવર્ક ઍક્સેસ કરવામાં અક્ષમ છે</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB ડાઉનલોડ કરેલ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb index 56f7d94e..13060406 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">'इस्तेमाल के आंकड़े' और 'खराबी रिपोर्ट' Google को भेजकर Chrome को बेहतर बनाने में सहायता करें.</translation> <translation id="410351446219883937">स्वतः चलाएं</translation> <translation id="4113030288477039509">आपके व्यवस्थापक द्वारा प्रबंधित</translation> -<translation id="411332046216682877">तेज़ी से खोजना शुरू करने के लिए यहां टैप करें</translation> <translation id="4116038641877404294">पेज का ऑफ़लाइन उपयोग करने के लिए उन्हें डाउनलोड करें</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d बुकमार्क}one{%1$d बुकमार्क}other{%1$d बुकमार्क}}</translation> <translation id="4149994727733219643">वेब पेजों के लिए सरल बनाया गया व्यू</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">संक्षिप्त करने के लिए टैप करें</translation> <translation id="5990142338020175451">ज़्यादा निजी Google सेवाएं, जैसे कि बेहतर पेज सुझाव</translation> <translation id="6000066717592683814">Google को डिफ़ॉल्ट बनाए रखें</translation> -<translation id="6001839398155993679">आइए, शुरू करें</translation> <translation id="6005538289190791541">सुझाया गया पासवर्ड</translation> <translation id="6039379616847168523">सीधे अगले टैब पर जाएं</translation> <translation id="6040143037577758943">बंद करें</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">बोलकर खोजें चालू करें</translation> <translation id="9071742570345586758">आभासी वास्तविकता वाली सामग्री देखने के लिए, Google VR सेवाएं इंस्टॉल करें</translation> <translation id="9074336505530349563">Google की ओर से सुझाई गई मनमुताबिक सामग्री पाने के लिए, साइन इन करें और 'सिंक करें' को चालू करें</translation> -<translation id="9079796397681444569">अपनी स्क्रीन के सबसे नीचे दिए गए बटनों का इस्तेमाल करके Chrome में कहीं भी आसानी से जाएं</translation> <translation id="9080642952018487277">निजी मोड में जाएं</translation> <translation id="9086455579313502267">नेटवर्क तक पहुंचने में असमर्थ</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> केबी डाउलनोड किया गया</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb index f43c70f..9a9eea7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Poboljšajte Chrome šaljući Googleu statistike upotrebe i izvješća o rušenju.</translation> <translation id="410351446219883937">Automatska reprodukcija</translation> <translation id="4113030288477039509">Upravlja vaš administrator</translation> -<translation id="411332046216682877">Dodirnite ovdje da biste brzo pokrenuli pretraživanje</translation> <translation id="4116038641877404294">Preuzmite stranice za izvanmrežnu upotrebu</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d oznaka}one{%1$d oznaka}few{%1$d oznake}other{%1$d oznaka}}</translation> <translation id="4149994727733219643">Pojednostavljeni prikaz za web-stranice</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Dodirnite da biste saželi</translation> <translation id="5990142338020175451">Više prilagođenih Googleovih usluga, na primjer bolji prijedlozi stranica</translation> <translation id="6000066717592683814">Zadrži Google</translation> -<translation id="6001839398155993679">Započnimo</translation> <translation id="6005538289190791541">Predložena zaporka</translation> <translation id="6039379616847168523">Preskakanje na sljedeću karticu</translation> <translation id="6040143037577758943">Zatvori</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Pokretanje glasovnog pretraživanja</translation> <translation id="9071742570345586758">Da biste gledali sadržaj virtualne stvarnosti, instalirajte Googleove VR usluge</translation> <translation id="9074336505530349563">Prijavite se i uključite sinkronizaciju ako želite da vam Google predlaže prilagođene sadržaje</translation> -<translation id="9079796397681444569">Gumbi pri dnu zaslona olakšavaju vam kretanje u Chromeu</translation> <translation id="9080642952018487277">Ulaz u privatni način</translation> <translation id="9086455579313502267">Nije moguće pristupiti mreži</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB preuzimanja</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb index 8cf5f61..ff5651c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Használati statisztikák és hibajelentések küldésével segíthet a Google-nak a Chrome fejlesztésében.</translation> <translation id="410351446219883937">Automatikus lejátszás</translation> <translation id="4113030288477039509">A rendszergazdája kezeli</translation> -<translation id="411332046216682877">Koppintson ide a gyors kereséshez</translation> <translation id="4116038641877404294">Töltse le az oldalakat, hogy offline is használhassa őket</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d könyvjelző}other{%1$d könyvjelző}}</translation> <translation id="4149994727733219643">Weboldalak egyszerűsített nézete</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Koppintson az összecsukáshoz</translation> <translation id="5990142338020175451">Személyre szabottabb Google-szolgáltatások, például jobb oldaljavaslatok</translation> <translation id="6000066717592683814">A Google megtartása</translation> -<translation id="6001839398155993679">Kezdjük</translation> <translation id="6005538289190791541">Javasolt jelszó</translation> <translation id="6039379616847168523">Ugrás a következő lapra</translation> <translation id="6040143037577758943">Bezárás</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Hangalapú keresés indítása</translation> <translation id="9071742570345586758">A virtuális valósággal kapcsolatos tartalmak megtekintéséhez telepítse a Google VR-szolgáltatásait</translation> <translation id="9074336505530349563">A Google által javasolt, személyre szabott tartalmak fogadásához jelentkezzen be, és kapcsolja be a szinkronizálást</translation> -<translation id="9079796397681444569">A képernyő alján lévő gombok használatával a Chrome-ban bárhol könnyedén navigálhat</translation> <translation id="9080642952018487277">Belépés privát módba</translation> <translation id="9086455579313502267">Nem sikerült elérni a hálózatot</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB letöltve</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index f13d3f6..c34d7e2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Ingin mulai mendownload <ph name="FILE_NAME" /> lagi?</translation> <translation id="2476578072172137802">Setelan Situs</translation> <translation id="2482878487686419369">Notifikasi</translation> +<translation id="2494974097748878569">Asisten Google di Chrome</translation> <translation id="2496180316473517155">Histori jelajah</translation> <translation id="2498359688066513246">Bantuan & masukan</translation> <translation id="2501278716633472235">Kembali</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Bantu penyempurnaan Chrome dengan mengirimkan statistik penggunaan dan laporan kerusakan ke Google.</translation> <translation id="410351446219883937">Putar otomatis</translation> <translation id="4113030288477039509">Dikelola oleh administrator</translation> -<translation id="411332046216682877">Tap di sini untuk memulai penelusuran dengan cepat</translation> <translation id="4116038641877404294">Download halaman untuk melihat secara offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bookmark}other{%1$d bookmark}}</translation> <translation id="4149994727733219643">Tampilan sederhana untuk halaman web</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Tap untuk menciutkan</translation> <translation id="5990142338020175451">Layanan Google yang lebih personal, seperti saran halaman yang lebih baik</translation> <translation id="6000066717592683814">Tetap menggunakan Google</translation> -<translation id="6001839398155993679">Ayo</translation> <translation id="6005538289190791541">Sandi yang disarankan</translation> <translation id="6039379616847168523">Beralih ke tab berikutnya</translation> <translation id="6040143037577758943">Tutup</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Terjadi masalah saat mencetak halaman. Coba lagi.</translation> <translation id="6295158916970320988">Semua situs</translation> <translation id="629730747756840877">Akun</translation> +<translation id="6302269476990306341">Asisten Google di Chrome berhenti</translation> <translation id="6303969859164067831">Logout dan nonaktifkan sinkronisasi</translation> <translation id="6316139424528454185">Versi Android tidak didukung</translation> <translation id="6320088164292336938">Getar</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> dipilih</translation> <translation id="7253272406652746122">Tambahkan Akun Google dari halaman Akun di aplikasi Setelan pada perangkat.</translation> <translation id="7274013316676448362">Situs yang diblokir</translation> +<translation id="7291387454912369099">Pembayaran yang Dipicu Asisten</translation> <translation id="729975465115245577">Perangkat Anda tidak memiliki aplikasi untuk menyimpan file sandi.</translation> <translation id="7302081693174882195">Detail: Diurutkan menurut jumlah kuota yang dihemat</translation> <translation id="7333031090786104871">Masih menambahkan situs sebelumnya</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Mulai penelusuran suara</translation> <translation id="9071742570345586758">Untuk melihat konten realitas maya, instal Layanan Google VR</translation> <translation id="9074336505530349563">Untuk mendapatkan konten hasil personalisasi yang disarankan oleh Google, login dan aktifkan sinkronisasi</translation> -<translation id="9079796397681444569">Buka bagian apa pun di Chrome dengan mudah menggunakan tombol di bawah layar</translation> <translation id="9080642952018487277">Masuk mode rahasia</translation> <translation id="9086455579313502267">Tidak dapat mengakses jaringan</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB didownload</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb index af0dd7a..a8d4f229 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Vuoi avviare di nuovo il download di <ph name="FILE_NAME" />?</translation> <translation id="2476578072172137802">Impostazioni sito</translation> <translation id="2482878487686419369">Notifiche</translation> +<translation id="2494974097748878569">Assistente Google in Chrome</translation> <translation id="2496180316473517155">Cronologia di navigazione</translation> <translation id="2498359688066513246">Guida e feedback</translation> <translation id="2501278716633472235">Indietro</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Aiutaci a migliorare Chrome inviando a Google statistiche sull'utilizzo e rapporti sugli arresti anomali.</translation> <translation id="410351446219883937">Riproduzione automatica</translation> <translation id="4113030288477039509">Gestito dall'amministratore</translation> -<translation id="411332046216682877">Tocca qui per avviare rapidamente una ricerca</translation> <translation id="4116038641877404294">Scarica le pagine per usarle offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d segnalibro}other{%1$d segnalibri}}</translation> <translation id="4149994727733219643">Visualizzazione semplificata delle pagine web</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Tocca per comprimere</translation> <translation id="5990142338020175451">Servizi Google più personalizzati, ad esempio suggerimenti di pagine più pertinenti</translation> <translation id="6000066717592683814">Mantieni Google</translation> -<translation id="6001839398155993679">Inizia</translation> <translation id="6005538289190791541">Password consigliata</translation> <translation id="6039379616847168523">Vai alla scheda successiva</translation> <translation id="6040143037577758943">Chiudi</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Si è verificato un problema durante la stampa della pagina. Riprova.</translation> <translation id="6295158916970320988">Tutti i siti</translation> <translation id="629730747756840877">Account</translation> +<translation id="6302269476990306341">Interruzione dell'Assistente Google in Chrome</translation> <translation id="6303969859164067831">Esci e disattiva la sincronizzazione</translation> <translation id="6316139424528454185">Vers. Android non supportata</translation> <translation id="6320088164292336938">Vibrazione</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> elementi selezionati</translation> <translation id="7253272406652746122">Aggiungi un account Google dalla pagina Account nell'app Impostazioni del dispositivo.</translation> <translation id="7274013316676448362">Sito bloccato</translation> +<translation id="7291387454912369099">Pagam. attivato con assistente</translation> <translation id="729975465115245577">Il tuo dispositivo non ha un'app per archiviare il file di password.</translation> <translation id="7302081693174882195">Dettagli: ordinati per quantità di dati salvati</translation> <translation id="7333031090786104871">Aggiunta del sito precedente ancora in corso</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Avvia la ricerca vocale</translation> <translation id="9071742570345586758">Per vedere contenuti di realtà virtuale, installa Servizi Google VR</translation> <translation id="9074336505530349563">Per ricevere contenuti suggeriti appositamente per te da Google, accedi e attiva la sincronizzazione</translation> -<translation id="9079796397681444569">Naviga facilmente in Chrome grazie ai pulsanti in fondo allo schermo</translation> <translation id="9080642952018487277">Accedi alla modalità privata</translation> <translation id="9086455579313502267">Impossibile accedere alla rete</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB per i download</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 ba229c2..545e81e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -140,7 +140,7 @@ <translation id="2000419248597011803">שליחה של חלק מקובצי ה-Cookie והחיפושים מסרגל הכתובות ומתיבת החיפוש אל מנוע החיפוש שהוגדר כברירת מחדל</translation> <translation id="2002537628803770967">כרטיסי אשראי וכתובות דרך Google Pay</translation> <translation id="200815880754187296"><ph name="KILOBYTES" /> KB ליישומים אחרים</translation> -<translation id="2017836877785168846">מנקה את ההיסטוריה וההשלמות האוטומטיות בסרגל הכתובות</translation> +<translation id="2017836877785168846">ניקוי של ההיסטוריה וההשלמות האוטומטיות בשורת כתובת האתר</translation> <translation id="2021896219286479412">פקדי אתר במסך מלא</translation> <translation id="2038563949887743358">הפעל את 'בקש אתר עבור מחשב שולחני'</translation> <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB ליישומים אחרים</translation> @@ -392,7 +392,6 @@ <translation id="4099578267706723511">עזור לשפר את Chrome על ידי שליחה של סטטיסטיקת שימוש ודוחות קריסה אל Google.</translation> <translation id="410351446219883937">הפעלה אוטומטית</translation> <translation id="4113030288477039509">מנוהל על ידי מנהל המערכת שלך</translation> -<translation id="411332046216682877">אפשר להקיש כאן כדי להתחיל לחפש במהירות</translation> <translation id="4116038641877404294">הורד דפים כדי להשתמש בהם במצב לא מקוון</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{סימניה %1$d}two{%1$d סימניות}many{%1$d סימניות}other{%1$d סימניות}}</translation> <translation id="4149994727733219643">תצוגה פשוטה של דפי אינטרנט</translation> @@ -561,7 +560,7 @@ <translation id="5424588387303617268"><ph name="GIGABYTES" /> GB זמינים</translation> <translation id="5433691172869980887">שם המשתמש הועתק</translation> <translation id="543509235395288790">מתבצעת הורדה של <ph name="COUNT" /> קבצים (<ph name="MEGABYTES" />).</translation> -<translation id="5441522332038954058">עבור לסרגל הכתובות</translation> +<translation id="5441522332038954058">מעבר לשורת כתובת האתר</translation> <translation id="5447201525962359567">כל נתוני האתר המאוחסנים, כולל קובצי Cookie ונתונים אחרים המאוחסנים באופן מקומי</translation> <translation id="5447765697759493033">האתר הזה לא יתורגם</translation> <translation id="545042621069398927">הדפדפן מאיץ את ההורדה.</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">הקש כדי לכווץ</translation> <translation id="5990142338020175451">התאמה אישית יותר של שירותי Google - למשל, הצעות לדפים מתאימים יותר</translation> <translation id="6000066717592683814">המשך להשתמש ב-Google</translation> -<translation id="6001839398155993679">קדימה!</translation> <translation id="6005538289190791541">הצעה לסיסמה</translation> <translation id="6039379616847168523">עבור לכרטיסייה הבאה</translation> <translation id="6040143037577758943">סגור</translation> @@ -735,7 +733,7 @@ <translation id="6656545060687952787">כדי לבצע סריקה לאיתור מכשירים ב-Chrome, יש צורך בגישה לנתוני מיקום. <ph name="BEGIN_LINK" />עדכן הרשאות<ph name="END_LINK" /></translation> <translation id="6657585470893396449">סיסמה</translation> <translation id="6659594942844771486">Tab</translation> -<translation id="666268767214822976">השתמש בשירות חיזוי כדי להציג שאילתות קשורות ואתרים פופולריים תוך כדי ההקלדה בסרגל הכתובות</translation> +<translation id="666268767214822976">שימוש בשירות חיזוי כדי להציג שאילתות קשורות ואתרים פופולריים תוך כדי ההקלדה בשורת כתובת האתר</translation> <translation id="666731172850799929">פתח ב-<ph name="APP_NAME" /></translation> <translation id="666981079809192359">הודעת הפרטיות של Chrome</translation> <translation id="6697492270171225480">הצגת הצעות לדפים דומים אם דף מסוים לא נמצא</translation> @@ -797,7 +795,7 @@ <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{נבחר אחד}two{נבחרו #}many{נבחרו #}other{נבחרו #}}</translation> <translation id="7077143737582773186">כרטיס SD</translation> <translation id="7087918508125750058">נבחרו <ph name="ITEM_COUNT" />. האפשרויות מוצגות בחלק העליון של המסך</translation> -<translation id="7121362699166175603">ניקוי ההיסטוריה וההשלמות האוטומטיות בסרגל הכתובות. ייתכן שלחשבון Google שלך יהיו צורות אחרות של היסטוריית גלישה בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> +<translation id="7121362699166175603">ניקוי ההיסטוריה וההשלמות האוטומטיות בשורת כתובת האתר. ייתכן שלחשבון Google שלך יהיו צורות אחרות של היסטוריית גלישה בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="7128222689758636196">התר למנוע החיפוש הנוכחי</translation> <translation id="7138678301420049075">אחר</translation> <translation id="7139148793369023665">'עוד דברים כאלה' נסגר</translation> @@ -1036,7 +1034,7 @@ <translation id="8979405271719829084">אפשר להוריד סרטונים ולצפות בהם מאוחר יותר</translation> <translation id="8981454092730389528">בחירת הפעילויות ב-Google</translation> <translation id="8983677657449185470">עזרה בשיפור של גלישה בטוחה</translation> -<translation id="8986494364107987395">שלח ל-Google דוחות קריסה וסטטיסטיקת שימוש באופן אוטומטי</translation> +<translation id="8986494364107987395">שליחה אוטומטית של דוחות קריסה וסטטיסטיקות שימוש ל-Google</translation> <translation id="8993760627012879038">פתח חלון חדש במצב גלישה בסתר</translation> <translation id="8998729206196772491">אתה נכנס עם חשבון המנוהל על-ידי <ph name="MANAGED_DOMAIN" /> ומעניק למנהל שלו שליטה על הנתונים שלך ב-Chrome. הנתונים שלך ישויכו לצמיתות אל החשבון הזה. יציאה מ-Chrome תמחק את הנתונים שלך מהמכשיר הזה, אבל הם יישארו בחשבון Google.</translation> <translation id="9019902583201351841">מנוהל על-ידי ההורים שלך</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">התחל חיפוש קולי</translation> <translation id="9071742570345586758">עליך להתקין את Google VR Services כדי שתוכל להציג תוכן של מציאות מדומה</translation> <translation id="9074336505530349563">כדי לקבל מ-Google הצעות לתוכן מותאם אישית, יש להיכנס ולהפעיל את הסנכרון</translation> -<translation id="9079796397681444569">מנווטים בקלות לכל מקום באמצעות הלחצנים של Chrome בתחתית המסך</translation> <translation id="9080642952018487277">מעבר למצב פרטי</translation> <translation id="9086455579313502267">אין אפשרות לגשת לרשת</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB להורדות</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb index 836f43c..bd9d06fe 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">使用統計情報と障害レポートを Google に送信して、Chrome の品質向上にご協力ください。</translation> <translation id="410351446219883937">自動再生</translation> <translation id="4113030288477039509">管理者により管理されています</translation> -<translation id="411332046216682877">ここをタップすると、すばやく検索できます</translation> <translation id="4116038641877404294">ページをダウンロードするとオフラインで使用できるようになります</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d 個のブックマーク}other{%1$d 個のブックマーク}}</translation> <translation id="4149994727733219643">ウェブページの簡易表示</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">タップして折りたたむ</translation> <translation id="5990142338020175451">おすすめのページなど、カスタマイズされた Google サービスを利用できます</translation> <translation id="6000066717592683814">Google のままにする</translation> -<translation id="6001839398155993679">開始する</translation> <translation id="6005538289190791541">推奨パスワード</translation> <translation id="6039379616847168523">次のタブに移動する</translation> <translation id="6040143037577758943">閉じる</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">音声検索を開始</translation> <translation id="9071742570345586758">バーチャル リアリティ コンテンツを表示するには、Google VR サービスをインストールしてください</translation> <translation id="9074336505530349563">ユーザーに合わせた Google からのおすすめコンテンツを表示するには、ログインして同期を有効にします</translation> -<translation id="9079796397681444569">画面下部にあるボタンを使って Chrome を自由かつ手軽に操作できます</translation> <translation id="9080642952018487277">プライベート モードを開始</translation> <translation id="9086455579313502267">ネットワークにアクセスできません</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB をダウンロードで使用中</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb index 8735fe3..0bcf45f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
@@ -393,7 +393,6 @@ <translation id="4099578267706723511">Google ಗೆ ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳು ಮತ್ತು ಕ್ರ್ಯಾಶ್ ವರದಿಗಳನ್ನು ಕಳುಹಿಸುವ ಮೂಲಕ Chrome ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ.</translation> <translation id="410351446219883937">ಆಟೋಪ್ಲೇ</translation> <translation id="4113030288477039509">ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ನಿರ್ವಹಿಸಲಾಗಿದೆ</translation> -<translation id="411332046216682877">ತ್ವರಿತವಾಗಿ ಹುಡುಕಾಟವನ್ನು ಪ್ರಾರಂಭಿಸಲು ಇಲ್ಲಿ ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="4116038641877404294">ಪುಟಗಳನ್ನು ಆಫ್ಲೈನ್ನಲ್ಲಿ ಬಳಸಲು ಅವುಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d ಬುಕ್ಮಾರ್ಕ್}one{%1$d ಬುಕ್ಮಾರ್ಕ್ಗಳು}other{%1$d ಬುಕ್ಮಾರ್ಕ್ಗಳು}}</translation> <translation id="4149994727733219643">ವೆಬ್ ಪುಟಗಳಿಗಾಗಿ ಸರಳೀಕೃತ ವೀಕ್ಷಣೆ</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">ಕುಗ್ಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="5990142338020175451">ಉತ್ತಮ ಪುಟ ಸಲಹೆಗಳಂತಹ ಇನ್ನಷ್ಟು ವೈಯಕ್ತಿಕ Google ಸೇವೆಗಳು</translation> <translation id="6000066717592683814">Google ಇರಿಸಿಕೊಳ್ಳಿ</translation> -<translation id="6001839398155993679">ಪ್ರಾರಂಭಿಸೋಣ</translation> <translation id="6005538289190791541">ಸೂಚಿಸಿದ ಪಾಸ್ವರ್ಡ್</translation> <translation id="6039379616847168523">ಮುಂದಿನ ಟ್ಯಾಬ್ಗೆ ಹೋಗಿ</translation> <translation id="6040143037577758943">ಮುಚ್ಚಿರಿ</translation> @@ -1049,7 +1047,6 @@ <translation id="9070377983101773829">ಧ್ವನಿ ಹುಡುಕಾಟವನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation> <translation id="9071742570345586758">ವರ್ಚ್ಯುಯಲ್ ವಾಸ್ತವತೆ ವಿಷಯವನ್ನು ವೀಕ್ಷಿಸಲು, Google VR ಸೇವೆಗಳನ್ನು ಸ್ಥಾಪಿಸಿ</translation> <translation id="9074336505530349563">Google ಸಲಹೆ ನೀಡಿದ ವೈಯಕ್ತೀಕರಿಸಲಾದ ವಿಷಯವನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, ಸೈನ್ ಇನ್ ಮಾಡಿ ಮತ್ತು ಸಿಂಕ್ ಆನ್ ಮಾಡಿ</translation> -<translation id="9079796397681444569">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನ ಕೆಳಭಾಗದಲ್ಲಿರುವ ಬಟನ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು Chrome ನಲ್ಲಿ ಎಲ್ಲಿಯಾದರೂ ಸುಲಭವಾಗಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ</translation> <translation id="9080642952018487277">ಖಾಸಗಿ ಮೋಡ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ</translation> <translation id="9086455579313502267">ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb index 5573914..735288d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">사용 통계와 비정상 종료 보고서를 Google로 전송하면 Chrome 개선에 도움이 됩니다.</translation> <translation id="410351446219883937">자동재생</translation> <translation id="4113030288477039509">관리자가 관리합니다.</translation> -<translation id="411332046216682877">여기를 탭하여 빠르게 검색을 시작하세요.</translation> <translation id="4116038641877404294">페이지를 다운로드하여 오프라인에서 사용하세요.</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{북마크 %1$d개}other{북마크 %1$d개}}</translation> <translation id="4149994727733219643">웹페이지 간단히 보기</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">탭하여 접기</translation> <translation id="5990142338020175451">향상된 페이지 추천과 같이 더욱 맞춤설정된 Google 서비스</translation> <translation id="6000066717592683814">계속 Google 사용</translation> -<translation id="6001839398155993679">시작</translation> <translation id="6005538289190791541">추천 비밀번호</translation> <translation id="6039379616847168523">다음 탭으로 이동</translation> <translation id="6040143037577758943">닫기</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">음성 검색 시작</translation> <translation id="9071742570345586758">가상 현실 콘텐츠를 보려면 Google VR 서비스를 설치하세요.</translation> <translation id="9074336505530349563">Google에서 추천하는 맞춤 콘텐츠를 보려면 로그인하고 동기화를 사용 설정하세요.</translation> -<translation id="9079796397681444569">화면 하단의 버튼을 사용하여 Chrome에서 어디로든 간편하게 이동하세요.</translation> <translation id="9080642952018487277">비공개 모드로 들어가기</translation> <translation id="9086455579313502267">네트워크에 액세스할 수 없습니다.</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" />KB가 다운로드됨</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb index c5c76c70..7fa23ba1 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Ar norite vėl pradėti <ph name="FILE_NAME" /> atsisiuntimą?</translation> <translation id="2476578072172137802">Svetainės nustatymai</translation> <translation id="2482878487686419369">Pranešimai</translation> +<translation id="2494974097748878569">„Google“ padėjėjas sistemoje „Chrome“</translation> <translation id="2496180316473517155">Naršymo istorija</translation> <translation id="2498359688066513246">Pagalba ir atsiliepimai</translation> <translation id="2501278716633472235">Grįžti</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Padėkite tobulinti „Chrome“ siųsdami „Google“ naudojimo statistiką ir strigčių ataskaitas.</translation> <translation id="410351446219883937">Automatinis paleidimas</translation> <translation id="4113030288477039509">Tvarko jūsų administratorius</translation> -<translation id="411332046216682877">Palieskite čia, kad greitai pradėtumėte paiešką.</translation> <translation id="4116038641877404294">Atsisiųskite puslapius, kad galėtumėte naudoti juos neprisijungę</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d žymė}one{%1$d žymė}few{%1$d žymės}many{%1$d žymės}other{%1$d žymių}}</translation> <translation id="4149994727733219643">Supaprastinta tinklalapių peržiūra</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Palieskite ir sutraukite</translation> <translation id="5990142338020175451">Daugiau suasmenintų „Google“ paslaugų, pvz., geresni puslapių pasiūlymai</translation> <translation id="6000066717592683814">Palikti „Google“</translation> -<translation id="6001839398155993679">Pradėkime</translation> <translation id="6005538289190791541">Siūlomas slaptažodis</translation> <translation id="6039379616847168523">Pereiti prie kito skirtuko</translation> <translation id="6040143037577758943">Uždaryti</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Spausdinant puslapį kilo problema. Bandykite dar kartą.</translation> <translation id="6295158916970320988">Visos svetainės</translation> <translation id="629730747756840877">Paskyra</translation> +<translation id="6302269476990306341">„Google“ padėjėjas sistemoje „Chrome“ sustabdomas</translation> <translation id="6303969859164067831">Atsijungti ir išjungti sinchronizavimą</translation> <translation id="6316139424528454185">„Android“ versija nepalaikoma</translation> <translation id="6320088164292336938">Vibruoti</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378">Pasirinkta: <ph name="ITEM_COUNT" /></translation> <translation id="7253272406652746122">Pridėkite „Google“ paskyrą iš įrenginio Nustatymų programos puslapio „Paskyros“.</translation> <translation id="7274013316676448362">Užblokuota svetainė</translation> +<translation id="7291387454912369099">Padėjėjo suaktyvinamas mokėjimas</translation> <translation id="729975465115245577">Įrenginyje nėra slaptažodžių failo saugojimo programos.</translation> <translation id="7302081693174882195">Išsami informacija: surūšiuota pagal išsaugotų duomenų kiekį</translation> <translation id="7333031090786104871">Vis dar pridedama ankstesnė svetainė</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Pradėti paiešką balsu</translation> <translation id="9071742570345586758">Kad galėtumėte peržiūrėti virtualiosios realybės turinį, įdiekite „Google“ VR paslaugas</translation> <translation id="9074336505530349563">Jei norite gauti „Google“ siūlomo suasmeninto turinio, prisijunkite ir įjunkite sinchronizavimą</translation> -<translation id="9079796397681444569">Naudodami ekrano apačioje esančius mygtukus lengvai naršykite visoje sistemoje „Chrome“.</translation> <translation id="9080642952018487277">Įjungti privatų režimą</translation> <translation id="9086455579313502267">Nepavyko pasiekti tinklo</translation> <translation id="9099018167121903954">Atsisiųsta <ph name="KILOBYTES" /> KB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb index 0d2a44d..b25620c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Uzlabojiet pārlūku Chrome, uzņēmumam Google sūtot lietojuma statistiku un avāriju pārskatus.</translation> <translation id="410351446219883937">Automātiskā atskaņošana</translation> <translation id="4113030288477039509">Pārvalda jūsu administrators</translation> -<translation id="411332046216682877">Pieskarieties šeit, lai ātri sāktu meklēšanu</translation> <translation id="4116038641877404294">Lejupielādējiet lapas, lai izmantotu tās bezsaistē</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d grāmatzīme}zero{%1$d grāmatzīmes}one{%1$d grāmatzīme}other{%1$d grāmatzīmes}}</translation> <translation id="4149994727733219643">Vienkāršots tīmekļa lapu skatījums</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Pieskarties, lai sakļautu</translation> <translation id="5990142338020175451">Personalizētāki Google pakalpojumi, piemēram, precīzāki lapu ieteikumi</translation> <translation id="6000066717592683814">Arī turpmāk izmantot Google</translation> -<translation id="6001839398155993679">Aiziet!</translation> <translation id="6005538289190791541">Ieteiktā parole</translation> <translation id="6039379616847168523">Pāriet uz nākamo cilni</translation> <translation id="6040143037577758943">Aizvērt</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Sākt meklēšanu ar balsi</translation> <translation id="9071742570345586758">Lai skatītu virtuālās realitātes saturu, instalējiet Google VR pakalpojumus.</translation> <translation id="9074336505530349563">Lai saņemtu Google ieteikto personalizēto saturu, pierakstieties un ieslēdziet sinhronizāciju.</translation> -<translation id="9079796397681444569">Pārvietojieties pārlūkā Chrome, izmantojot pogas ekrāna apakšējā daļā</translation> <translation id="9080642952018487277">Atvērt privāto režīmu</translation> <translation id="9086455579313502267">Nevar piekļūt tīklam</translation> <translation id="9099018167121903954">Lejupielādes: <ph name="KILOBYTES" /> KB.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb index 13a5f39..5681910 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292"><ph name="FILE_NAME" /> വീണ്ടും ഡൗൺലോഡുചെയ്യാൻ തുടങ്ങണോ?</translation> <translation id="2476578072172137802">സൈറ്റ് ക്രമീകരണങ്ങൾ</translation> <translation id="2482878487686419369">വിജ്ഞാപനങ്ങള്</translation> +<translation id="2494974097748878569">Chrome സ്വമേധയാ പൂരിപ്പിക്കലിലെ Google അസിസ്റ്റന്റ് സാന്നിധ്യം</translation> <translation id="2496180316473517155">ബ്രൌസിംഗ് ചരിത്രം</translation> <translation id="2498359688066513246">സഹായവും ഫീഡ്ബാക്കും</translation> <translation id="2501278716633472235">പിന്നോട്ട് പോകുക</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Google-ലേക്ക് ഉപയോഗസ്ഥിതിവിവരക്കണക്കുകളും ക്രാഷ് റിപ്പോർട്ടുകളും അയയ്ക്കുന്നതിലൂടെ Chrome-നെ മികച്ചതാക്കാൻ സഹായിക്കുക.</translation> <translation id="410351446219883937">സ്വയം പ്ലേചെയ്യൽ</translation> <translation id="4113030288477039509">നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ നിയന്ത്രിക്കുന്നത്</translation> -<translation id="411332046216682877">വേഗത്തിൽ തിരയാൻ ഇവിടെ ടാപ്പ് ചെയ്യുക</translation> <translation id="4116038641877404294">ഓഫ്ലൈനായി ഉപയോഗിക്കാൻ പേജുകൾ ഡൗൺലോഡുചെയ്യുക</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d ബുക്ക്മാർക്ക്}other{%1$d ബുക്ക്മാർക്കുകൾ}}</translation> <translation id="4149994727733219643">വെബ് പേജുകൾക്കായി ലളിതവൽക്കരിച്ച കാഴ്ച</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">ചുരുക്കാൻ ടാപ്പ് ചെയ്യുക</translation> <translation id="5990142338020175451">കൂടുതൽ നല്ല പേജ് നിർദ്ദേശങ്ങൾ പോലുള്ള, കൂടുതൽ വ്യക്തിപരമായ Google സേവനങ്ങൾ</translation> <translation id="6000066717592683814">Google ഉപയോഗിക്കുക</translation> -<translation id="6001839398155993679">തുടങ്ങാം</translation> <translation id="6005538289190791541">നിർദ്ദേശിച്ച പാസ്വേഡ്</translation> <translation id="6039379616847168523">അടുത്ത ടാബിലേക്ക് പോകുക</translation> <translation id="6040143037577758943">അടയ്ക്കുക</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">പേജ് പ്രിന്റുചെയ്യുന്നതിൽ ഒരു പ്രശ്നമുണ്ടായി. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="6295158916970320988">എല്ലാ സൈറ്റുകളും</translation> <translation id="629730747756840877">അക്കൗണ്ട്</translation> +<translation id="6302269476990306341">Chrome സ്വമേധയാ പൂരിപ്പിക്കൽ നിർത്തുന്നതിലെ Google അസിസ്റ്റന്റ് സാന്നിധ്യം</translation> <translation id="6303969859164067831">സൈൻ ഔട്ട് ചെയ്ത് സമന്വയം ഓഫാക്കുക</translation> <translation id="6316139424528454185">Android പതിപ്പ് പിന്തുണയ്ക്കുന്നതല്ല</translation> <translation id="6320088164292336938">വൈബ്രേറ്റുചെയ്യുക</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> എണ്ണം തിരഞ്ഞെടുത്തു</translation> <translation id="7253272406652746122">നിങ്ങളുടെ ഉപകരണത്തിലെ ക്രമീകരണം ആപ്പിലെ, 'അക്കൗണ്ടുകൾ' പേജിൽ നിന്ന് ഒരു Google അക്കൗണ്ട് ചേർക്കുക.</translation> <translation id="7274013316676448362">സൈറ്റ് ബ്ലോക്കുചെയ്തു</translation> +<translation id="7291387454912369099">അസിസ്റ്റന്റ് ചെക്ക് ഔട്ട് ചെയ്യാൻ പ്രേരിപ്പിച്ചു</translation> <translation id="729975465115245577">നിങ്ങളുടെ ഉപകരണത്തിൽ പാസ്വേഡ് ഫയൽ സംഭരിക്കാനുള്ള ആപ്പ് ഇല്ല.</translation> <translation id="7302081693174882195">വിശദാംശങ്ങൾ: സംരക്ഷിച്ച ഡാറ്റയുടെ അളവനുസരിച്ച് അടുക്കിയത്</translation> <translation id="7333031090786104871">ഇപ്പോഴും മുമ്പത്തെ സൈറ്റ് ചേർത്തുകൊണ്ടിരിക്കുകയാണ്</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">ശബ്ദ തിരയൽ ആരംഭിക്കുക</translation> <translation id="9071742570345586758">വെർച്വൽ റിയാലിറ്റി ഉള്ളടക്കം കാണാൻ, Google VR സേവനങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യുക</translation> <translation id="9074336505530349563">Google നിർദേശിക്കുന്ന വ്യക്തിപരമാക്കിയ ഉള്ളടക്കം ലഭിക്കാൻ, സൈൻ ഇൻ ചെയ്ത് സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation> -<translation id="9079796397681444569">സ്ക്രീനിന് ചുവടെയുള്ള ബട്ടണുകൾ ഉപയോഗിച്ച് Chrome-ൽ എവിടേയ്ക്കും എളുപ്പത്തിൽ നാവിഗേറ്റ് ചെയ്യുക</translation> <translation id="9080642952018487277">സ്വകാര്യ മോഡിലേക്ക് കടക്കുക</translation> <translation id="9086455579313502267">നെറ്റ്വര്ക്ക് ആക്സസ്സ് ചെയ്യാനാകുന്നില്ല</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB ഡൗൺലോഡുചെയ്തു</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb index b9b74e2..d37ea2c0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">वापर आकडेवारी आणि क्रॅश अहवाल Google कडे पाठवून Chrome अधिक चांगले करण्यास मदत करा.</translation> <translation id="410351446219883937">ऑटोप्ले</translation> <translation id="4113030288477039509">आपल्या प्रशासकाद्वारे व्यवस्थापित</translation> -<translation id="411332046216682877">शोध झटपट सुरू करण्यासाठी येथे टॅप करा</translation> <translation id="4116038641877404294">पेज ऑफलाइन वापरण्यासाठी ती डाउनलोड करा</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d बुकमार्क}one{%1$d बुकमार्क}other{%1$d बुकमार्क}}</translation> <translation id="4149994727733219643">वेब पेजसाठी सोपा केलेला व्ह्यू</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">संकुचित करण्यासाठी टॅप करा</translation> <translation id="5990142338020175451">आणखी चांगल्या पेज सूचना, यासारख्या अधिक वैयक्तिक Google सेवा</translation> <translation id="6000066717592683814">Google ठेवा</translation> -<translation id="6001839398155993679">चला करू या</translation> <translation id="6005538289190791541">सुचवलेला पासवर्ड</translation> <translation id="6039379616847168523">पुढील टॅबवर जा</translation> <translation id="6040143037577758943">बंद करा</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">व्हॉइस शोध प्रारंभ करा</translation> <translation id="9071742570345586758">व्हर्च्युअल वास्तविकता सामग्री पाहण्यासाठी, Google VR सेवा इंस्टॉल करा</translation> <translation id="9074336505530349563">Google ने सुचवलेला पर्सनलाइझ केलेला आशय मिळवण्यासाठी, साइन इन करा आणि सिंक सुरू करा</translation> -<translation id="9079796397681444569">तुमच्या स्क्रीनच्या तळाशी असलेली बटणे वापरून Chrome मध्ये कुठेही सहजपणे नेव्हिगेट करा</translation> <translation id="9080642952018487277">खाजगी मोडमध्ये एंटर करा</translation> <translation id="9086455579313502267">नेटवर्कमध्ये प्रवेश करण्यात अक्षम</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB डाउनलोड केले</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb index fe1e4b6..afee336 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Bantu jadikan Chrome lebih baik dengan menghantar laporan perangkaan penggunaan dan ranap sistem kepada Google.</translation> <translation id="410351446219883937">Automain</translation> <translation id="4113030288477039509">Diurus oleh pentadbir anda</translation> -<translation id="411332046216682877">Ketik di sini untuk memulakan carian dengan pantas</translation> <translation id="4116038641877404294">Muat turun halaman untuk digunakan di luar talian</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d penanda halaman}other{%1$d penanda halaman}}</translation> <translation id="4149994727733219643">Paparan ringkas bagi halaman web</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Ketik untuk runtuhkan</translation> <translation id="5990142338020175451">Perkhidmatan Google yang lebih peribadi, seperti cadangan halaman yang lebih baik</translation> <translation id="6000066717592683814">Kekalkan Google</translation> -<translation id="6001839398155993679">Jom</translation> <translation id="6005538289190791541">Kata laluan yang disyorkan</translation> <translation id="6039379616847168523">Lompat ke tab seterusnya</translation> <translation id="6040143037577758943">Tutup</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Mulakan carian suara</translation> <translation id="9071742570345586758">Untuk melihat kandungan realiti maya, pasang Perkhidmatan Google VR</translation> <translation id="9074336505530349563">Log masuk dan hidupkan penyegerakan untuk mendapatkan kandungan diperibadikan yang dicadangkan oleh Google</translation> -<translation id="9079796397681444569">Navigasi dengan mudah di mana-mana sahaja dalam Chrome menggunakan butang di bahagian bawah skrin anda</translation> <translation id="9080642952018487277">Masuk ke mod peribadi</translation> <translation id="9086455579313502267">Tidak dapat mengakses rangkaian</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB dimuat turun</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index f477b23..901e20e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Verzend automatisch gebruiksstatistieken en crashmeldingen naar Google.</translation> <translation id="410351446219883937">Automatisch afspelen</translation> <translation id="4113030288477039509">Beheerd door je beheerder</translation> -<translation id="411332046216682877">Tik hier om snel een zoekopdracht te starten</translation> <translation id="4116038641877404294">Download pagina's om ze offline te gebruiken</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bladwijzer}other{%1$d bladwijzers}}</translation> <translation id="4149994727733219643">Vereenvoudigde weergave voor webpagina's</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Tik om samen te vouwen</translation> <translation id="5990142338020175451">Meer persoonlijke Google-services, zoals betere paginasuggesties</translation> <translation id="6000066717592683814">Google blijven gebruiken</translation> -<translation id="6001839398155993679">Aan de slag</translation> <translation id="6005538289190791541">Voorgesteld wachtwoord</translation> <translation id="6039379616847168523">Naar het volgende tabblad gaan</translation> <translation id="6040143037577758943">Sluiten</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Gesproken zoekopdracht starten</translation> <translation id="9071742570345586758">Installeer VR-services van Google om virtual reality-content te bekijken</translation> <translation id="9074336505530349563">Log in en schakel synchronisatie in om suggesties voor gepersonaliseerde content van Google te ontvangen</translation> -<translation id="9079796397681444569">Navigeer gemakkelijk overal in Chrome met de knoppen onderaan het scherm</translation> <translation id="9080642952018487277">Privémodus starten</translation> <translation id="9086455579313502267">Geen toegang tot het netwerk</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB gedownload</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 91f01775..65dc7d4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Gjør Chrome bedre ved å sende bruksstatistikk og programstopprapporter til Google.</translation> <translation id="410351446219883937">Autoavspilling</translation> <translation id="4113030288477039509">Styres av administratoren din</translation> -<translation id="411332046216682877">Trykk her for å starte et søk raskt</translation> <translation id="4116038641877404294">Last ned sidene for å bruke dem uten nett</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bokmerke}other{%1$d bokmerker}}</translation> <translation id="4149994727733219643">Forenklet visning av nettsider</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Trykk for å skjule</translation> <translation id="5990142338020175451">Google-tjenester med et mer personlig preg, som for eksempel bedre sideforslag</translation> <translation id="6000066717592683814">Behold Google</translation> -<translation id="6001839398155993679">Sett i gang</translation> <translation id="6005538289190791541">Foreslått passord</translation> <translation id="6039379616847168523">Gå til den neste fanen</translation> <translation id="6040143037577758943">Lukk</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Start talesøk</translation> <translation id="9071742570345586758">Du må installere Google VR Services for å kunne se innhold for virtuell virkelighet.</translation> <translation id="9074336505530349563">For å få forslag om personlig tilpasset innhold fra Google, slå på synkronisering</translation> -<translation id="9079796397681444569">Naviger enkelt hvor som helst i Chrome ved å bruke knappene nederst på skjermen</translation> <translation id="9080642952018487277">Start privatmodus</translation> <translation id="9086455579313502267">Fikk ikke tilgang til nettverket</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB er lastet ned</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb index 881bba6..a00e0af 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Czy chcesz jeszcze raz rozpocząć pobieranie pliku <ph name="FILE_NAME" />?</translation> <translation id="2476578072172137802">Ustawienia witryn</translation> <translation id="2482878487686419369">Powiadomienia</translation> +<translation id="2494974097748878569">Asystent Google w Chrome</translation> <translation id="2496180316473517155">Historia przeglądania</translation> <translation id="2498359688066513246">Pomoc i opinie</translation> <translation id="2501278716633472235">Wróć</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Pomóż ulepszyć Chrome, wysyłając do Google statystyki użytkowania i raporty o awariach.</translation> <translation id="410351446219883937">Autoodtwarzanie</translation> <translation id="4113030288477039509">Zarządzany przez administratora</translation> -<translation id="411332046216682877">Kliknij tutaj, by szybko rozpocząć wyszukiwanie</translation> <translation id="4116038641877404294">Pobierz strony, by przeglądać je w trybie offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d zakładka}few{%1$d zakładki}many{%1$d zakładek}other{%1$d zakładki}}</translation> <translation id="4149994727733219643">Uproszczony widok stron internetowych</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Kliknij, by zwinąć</translation> <translation id="5990142338020175451">Bardziej spersonalizowane usługi Google, na przykład lepsze podpowiedzi stron</translation> <translation id="6000066717592683814">Zachowaj Google</translation> -<translation id="6001839398155993679">Do dzieła</translation> <translation id="6005538289190791541">Proponowane hasło</translation> <translation id="6039379616847168523">Przejdź do następnej karty</translation> <translation id="6040143037577758943">Zamknij</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Podczas drukowania strony wystąpił problem. Spróbuj ponownie.</translation> <translation id="6295158916970320988">Wszystkie witryny</translation> <translation id="629730747756840877">Konto</translation> +<translation id="6302269476990306341">Wyłączam Asystenta Google w Chrome</translation> <translation id="6303969859164067831">Wyloguj się i wyłącz synchronizację</translation> <translation id="6316139424528454185">Ta wersja Androida jest nieobsługiwana</translation> <translation id="6320088164292336938">Wibracje</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378">Wybrano <ph name="ITEM_COUNT" /></translation> <translation id="7253272406652746122">Otwórz aplikację Ustawienia na urządzeniu, przejdź na stronę Konta i dodaj konto Google.</translation> <translation id="7274013316676448362">Zablokowana witryna</translation> +<translation id="7291387454912369099">Płatność przez Asystenta</translation> <translation id="729975465115245577">Na urządzeniu nie ma aplikacji umożliwiającej zapisanie pliku z hasłami.</translation> <translation id="7302081693174882195">Szczegóły: posortowane według zaoszczędzonych danych</translation> <translation id="7333031090786104871">Nadal dodaję poprzednią stronę</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Rozpocznij wyszukiwanie głosowe</translation> <translation id="9071742570345586758">Aby oglądać treści rzeczywistości wirtualnej, zainstaluj Usługi Google VR</translation> <translation id="9074336505530349563">Aby uzyskać dostęp do spersonalizowanej treści proponowanej przez Google, zaloguj się i włącz synchronizację</translation> -<translation id="9079796397681444569">Możesz łatwo przechodzić w dowolne miejsce interfejsu Chrome, używając przycisków u dołu ekranu</translation> <translation id="9080642952018487277">Włącz tryb prywatny</translation> <translation id="9086455579313502267">Nie można uzyskać dostępu do sieci</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB pobranych plików</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb index 0ee5c14..a6a8bed 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Quer recomeçar o download de <ph name="FILE_NAME" />?</translation> <translation id="2476578072172137802">Configurações do site</translation> <translation id="2482878487686419369">Notificações</translation> +<translation id="2494974097748878569">Google Assistente no Chrome</translation> <translation id="2496180316473517155">Histórico de navegação</translation> <translation id="2498359688066513246">Ajuda e feedback</translation> <translation id="2501278716633472235">Voltar</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Ajude a melhorar o Chrome. Envie estatísticas de uso e relatório de falha ao Google.</translation> <translation id="410351446219883937">Reprodução automática</translation> <translation id="4113030288477039509">Gerenciado pelo seu administrador</translation> -<translation id="411332046216682877">Toque aqui para iniciar rapidamente uma pesquisa</translation> <translation id="4116038641877404294">Faça o download de páginas para usá-las off-line</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d favorito}one{%1$d favorito}other{%1$d favoritos}}</translation> <translation id="4149994727733219643">Visualização simplificada para páginas da Web</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Toque para recolher</translation> <translation id="5990142338020175451">Serviços do Google mais personalizados, como melhores sugestões de páginas</translation> <translation id="6000066717592683814">Continuar usando o Google</translation> -<translation id="6001839398155993679">Vamos lá</translation> <translation id="6005538289190791541">Senha sugerida</translation> <translation id="6039379616847168523">Ir para a próxima guia</translation> <translation id="6040143037577758943">Fechar</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Ocorreu um problema ao imprimir a página. Tente novamente.</translation> <translation id="6295158916970320988">Todos os sites</translation> <translation id="629730747756840877">Conta</translation> +<translation id="6302269476990306341">Parando o Google Assistente no Chrome</translation> <translation id="6303969859164067831">Sair e desativar a sincronização</translation> <translation id="6316139424528454185">Versão Android não compatível</translation> <translation id="6320088164292336938">Vibrar</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> itens selecionados</translation> <translation id="7253272406652746122">Adicione uma Conta do Google na página de "Contas" do app "Config." do seu dispositivo.</translation> <translation id="7274013316676448362">Site bloqueado</translation> +<translation id="7291387454912369099">Caixa acionado pelo Assistente</translation> <translation id="729975465115245577">Seu dispositivo não tem um app para armazenar o arquivo de senhas.</translation> <translation id="7302081693174882195">Detalhes: classificados pela quantidade de dados economizados</translation> <translation id="7333031090786104871">Ainda adicionando o site anterior</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Iniciar pesquisa por voz</translation> <translation id="9071742570345586758">Para ver conteúdo de realidade virtual, instale os Serviços de RV do Google</translation> <translation id="9074336505530349563">Para receber conteúdo personalizado sugerido pelo Google, ative a sincronização</translation> -<translation id="9079796397681444569">Navegue no Chrome com facilidade usando os botões na parte inferior da tela</translation> <translation id="9080642952018487277">Entrar no modo privado</translation> <translation id="9086455579313502267">Não foi possível acessar a rede</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB transferido(s) por download</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb index e7eba6d..e6782cf8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Pretende começar a transferir <ph name="FILE_NAME" /> novamente?</translation> <translation id="2476578072172137802">Definições de sites</translation> <translation id="2482878487686419369">Notificações</translation> +<translation id="2494974097748878569">Assistente Google no Chrome</translation> <translation id="2496180316473517155">Histórico de navegação</translation> <translation id="2498359688066513246">Ajuda e comentários</translation> <translation id="2501278716633472235">Voltar</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Ajude a melhorar o Chrome ao enviar estatísticas de utilização e relatórios de falhas para a Google.</translation> <translation id="410351446219883937">Reprodução automática</translation> <translation id="4113030288477039509">Gerido pelo gestor</translation> -<translation id="411332046216682877">Toque aqui para começar rapidamente uma pesquisa.</translation> <translation id="4116038641877404294">Transfira páginas para as utilizar offline.</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d marcador}other{%1$d marcadores}}</translation> <translation id="4149994727733219643">Vista simplificada de páginas Web</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Toque para reduzir</translation> <translation id="5990142338020175451">Serviços Google mais pessoais, como melhores sugestões de páginas</translation> <translation id="6000066717592683814">Manter o Google</translation> -<translation id="6001839398155993679">Vamos lá</translation> <translation id="6005538289190791541">Palavra-passe sugerida</translation> <translation id="6039379616847168523">Ir para o próximo separador</translation> <translation id="6040143037577758943">Fechar</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Ocorreu um problema ao imprimir a página. Tente novamente.</translation> <translation id="6295158916970320988">Todos os sites</translation> <translation id="629730747756840877">Conta</translation> +<translation id="6302269476990306341">Paragem do Assistente Google no Chrome</translation> <translation id="6303969859164067831">Terminar sessão e desativar a sincronização</translation> <translation id="6316139424528454185">Versão Android não suportada.</translation> <translation id="6320088164292336938">Vibrar</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selecionado(s).</translation> <translation id="7253272406652746122">Adicione uma Conta Google na página Contas na aplicação Definições do dispositivo.</translation> <translation id="7274013316676448362">Site bloqueado</translation> +<translation id="7291387454912369099">O Assistente acionou o pagamento</translation> <translation id="729975465115245577">O dispositivo não tem uma aplicação para armazenar o ficheiro de palavras-passe.</translation> <translation id="7302081693174882195">Detalhes: ordenado por quantidade de dados guardados</translation> <translation id="7333031090786104871">Ainda a adicionar o site anterior…</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Iniciar pesquisa por voz</translation> <translation id="9071742570345586758">Para ver conteúdo de realidade virtual, instale os Serviços de RV da Google</translation> <translation id="9074336505530349563">Para obter conteúdo personalizado sugerido pelo Google, inicie sessão e ative a sincronização.</translation> -<translation id="9079796397681444569">Navegue facilmente para qualquer local no Chrome através dos botões na parte inferior do ecrã.</translation> <translation id="9080642952018487277">Entrar no modo privado</translation> <translation id="9086455579313502267">Não é possível aceder à rede</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB transferido(s)</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb index f634c45..7307380 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Dorești să se înceapă din nou descărcarea pentru <ph name="FILE_NAME" />?</translation> <translation id="2476578072172137802">Setări site</translation> <translation id="2482878487686419369">Notificări</translation> +<translation id="2494974097748878569">Asistentul Google în Chrome</translation> <translation id="2496180316473517155">Istoricul de navigare</translation> <translation id="2498359688066513246">Ajutor și feedback</translation> <translation id="2501278716633472235">Înapoi</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Contribuie la îmbunătățirea Chrome trimițând statistici de utilizare și rapoarte de blocare la Google.</translation> <translation id="410351446219883937">Redare automată</translation> <translation id="4113030288477039509">Gestionat de administratorul tău</translation> -<translation id="411332046216682877">Atinge aici pentru a începe rapid o căutare</translation> <translation id="4116038641877404294">Descarcă paginile pentru a le folosi offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d marcaj}few{%1$d marcaje}other{%1$d de marcaje}}</translation> <translation id="4149994727733219643">Afișare simplificată pentru paginile web</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Atinge pentru a restrânge</translation> <translation id="5990142338020175451">Servicii Google personalizate, cum ar fi sugestiile îmbunătățite privind paginile</translation> <translation id="6000066717592683814">Păstrează Google</translation> -<translation id="6001839398155993679">Să începem</translation> <translation id="6005538289190791541">Parola sugerată</translation> <translation id="6039379616847168523">Accesează fila următoare</translation> <translation id="6040143037577758943">Închide</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">A apărut o problemă la printarea paginii. Încercați din nou.</translation> <translation id="6295158916970320988">Toate site-urile</translation> <translation id="629730747756840877">Cont</translation> +<translation id="6302269476990306341">Asistentul Google în Chrome se oprește</translation> <translation id="6303969859164067831">Deconectează-te și dezactivează sincronizarea</translation> <translation id="6316139424528454185">Versiunea Android nu este acceptată</translation> <translation id="6320088164292336938">Vibrații</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selectate</translation> <translation id="7253272406652746122">Adaugă un Cont Google din pagina Conturi din aplicația Setări a dispozitivului.</translation> <translation id="7274013316676448362">Site blocat</translation> +<translation id="7291387454912369099">Finalizarea achiziției declanșată de Asistent</translation> <translation id="729975465115245577">Dispozitivul nu are o aplicație pentru stocarea fișierului parolelor.</translation> <translation id="7302081693174882195">Detalii: sortate după volumul de date salvate</translation> <translation id="7333031090786104871">Încă se adaugă site-ul anterior</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Începe căutarea vocală</translation> <translation id="9071742570345586758">Pentru a vedea conținut de realitate virtuală, instalează serviciile Google VR</translation> <translation id="9074336505530349563">Pentru a obține sugestii de conținut personalizat de la Google, conectează-te și activează sincronizarea</translation> -<translation id="9079796397681444569">Navighează mai ușor oriunde în Chrome cu ajutorul butoanelor din partea de jos a ecranului</translation> <translation id="9080642952018487277">Intră în modul privat</translation> <translation id="9086455579313502267">Nu se poate accesa rețeaua</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB pentru descărcări</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb index 3ba50c3c..b116f84d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Отправлять в Google статистику использования и отчеты о сбоях</translation> <translation id="410351446219883937">Автовоспроизведение</translation> <translation id="4113030288477039509">Управляется администратором</translation> -<translation id="411332046216682877">Нажмите здесь, чтобы начать поиск</translation> <translation id="4116038641877404294">Скачивайте страницы и открывайте их без подключения к Интернету</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d закладка}one{%1$d закладка}few{%1$d закладки}many{%1$d закладок}other{%1$d закладки}}</translation> <translation id="4149994727733219643">Упрощенный просмотр веб-страниц</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Нажмите, чтобы свернуть</translation> <translation id="5990142338020175451">Расширенная персонализация сервисов Google, например более актуальные подсказки на странице быстрого доступа.</translation> <translation id="6000066717592683814">Использовать Google</translation> -<translation id="6001839398155993679">Начать</translation> <translation id="6005538289190791541">Предложенный пароль</translation> <translation id="6039379616847168523">Перейти к следующей вкладке</translation> <translation id="6040143037577758943">Закрыть</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Голосовой поиск</translation> <translation id="9071742570345586758">Чтобы просматривать контент в режиме виртуальной реальности, установите Google VR-сервисы</translation> <translation id="9074336505530349563">Чтобы мы могли рекомендовать вам интересный контент, войдите в аккаунт и включите синхронизацию.</translation> -<translation id="9079796397681444569">Чтобы упростить навигацию в Chrome, мы перенесли кнопки в нижнюю часть экрана</translation> <translation id="9080642952018487277">Войти в режим инкогнито</translation> <translation id="9086455579313502267">Нет доступа к сети</translation> <translation id="9099018167121903954">Скачанные файлы: <ph name="KILOBYTES" /> КБ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb index 737cedc0..9ea9e35f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Chcete znovu spustiť sťahovanie súboru <ph name="FILE_NAME" />?</translation> <translation id="2476578072172137802">Nastavenia webu</translation> <translation id="2482878487686419369">Upozornenia</translation> +<translation id="2494974097748878569">Asistent Google v Chrome</translation> <translation id="2496180316473517155">História prehliadania</translation> <translation id="2498359688066513246">Pomocník a spätná väzba</translation> <translation id="2501278716633472235">Prejsť späť</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Odosielanie štatistík používania a prehľadu chýb pomôže Googlu zlepšiť Chrome.</translation> <translation id="410351446219883937">Automatické prehrávanie</translation> <translation id="4113030288477039509">Spravované vaším správcom</translation> -<translation id="411332046216682877">Klepnite tu a rýchlo začnite vyhľadávanie</translation> <translation id="4116038641877404294">Stiahnite si stránky na použitie offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d záložka}few{%1$d záložky}many{%1$d záložky}other{%1$d záložiek}}</translation> <translation id="4149994727733219643">Jednoduché zobrazenie webových stránok</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Klepnutím zbaliť</translation> <translation id="5990142338020175451">Viac osobných služieb Googlu, napríklad lepšie návrhy stránok</translation> <translation id="6000066717592683814">Ponechať Google</translation> -<translation id="6001839398155993679">Poďme na to</translation> <translation id="6005538289190791541">Navrhované heslo</translation> <translation id="6039379616847168523">Prechod na ďalšiu kartu</translation> <translation id="6040143037577758943">Zavrieť</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Pri tlačení stránky sa vyskytol problém. Skúste to znova.</translation> <translation id="6295158916970320988">Všetky stránky</translation> <translation id="629730747756840877">Účet</translation> +<translation id="6302269476990306341">Zastavuje sa Asistent Google v Chrome</translation> <translation id="6303969859164067831">Odhlásiť sa a vypnúť synchronizáciu</translation> <translation id="6316139424528454185">Verzia Androidu nie je podporovaná</translation> <translation id="6320088164292336938">Vibrovanie</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378">Vybrané: <ph name="ITEM_COUNT" /></translation> <translation id="7253272406652746122">Pridajte účet Google zo stránky Účty v aplikácii Nastavenia na vašom zariadení.</translation> <translation id="7274013316676448362">Blokovaný web</translation> +<translation id="7291387454912369099">Aktivácia Asistenta</translation> <translation id="729975465115245577">Vaše zariadenie nemá aplikáciu na uloženie súboru s heslami.</translation> <translation id="7302081693174882195">Podrobnosti: zoradené podľa množstva ušetrených dát</translation> <translation id="7333031090786104871">Pridávanie predchádzajúceho webu stále prebieha</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Spustiť hlasové vyhľadávanie</translation> <translation id="9071742570345586758">Na zobrazenie obsahu virtuálnej reality je potrebné nainštalovať služby Google VR</translation> <translation id="9074336505530349563">Ak chcete získavať prispôsobený obsah navrhnutý Googlom, prihláste sa a zapnite synchronizáciu</translation> -<translation id="9079796397681444569">Ľahko prejdite kamkoľvek v Chrome pomocou tlačidiel v dolnej časti obrazovky</translation> <translation id="9080642952018487277">Spustiť súkromný režim</translation> <translation id="9086455579313502267">Nepodarilo sa pristúpiť k sieti</translation> <translation id="9099018167121903954">Stiahnuté: <ph name="KILOBYTES" /> KB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb index 820cfa77..d6e7384 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Pomagajte izboljšati Chrome s pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah Googlu.</translation> <translation id="410351446219883937">Samodejno predvajanje</translation> <translation id="4113030288477039509">Upravlja skrbnik</translation> -<translation id="411332046216682877">Dotaknite se tukaj, če želite hitro začeti iskanje</translation> <translation id="4116038641877404294">Prenesite strani, če jih želite uporabljati brez povezave</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d zaznamek}one{%1$d zaznamek}two{%1$d zaznamka}few{%1$d zaznamki}other{%1$d zaznamkov}}</translation> <translation id="4149994727733219643">Poenostavljen pogled za spletne strani</translation> @@ -645,7 +644,6 @@ <translation id="5962718611393537961">Dotik za strnitev</translation> <translation id="5990142338020175451">Bolj osebne Googlove storitve, kot so boljši predlogi strani</translation> <translation id="6000066717592683814">Ohrani Google</translation> -<translation id="6001839398155993679">Pa začnimo</translation> <translation id="6005538289190791541">Predlagano geslo</translation> <translation id="6039379616847168523">Premik na naslednji zavihek</translation> <translation id="6040143037577758943">Zapri</translation> @@ -1047,7 +1045,6 @@ <translation id="9070377983101773829">Začni glasovno iskanje</translation> <translation id="9071742570345586758">Če si želite ogledati vsebino v navidezni resničnosti, namestite Googlove storitve za navidezno resničnost</translation> <translation id="9074336505530349563">Če želite prejemati prilagojeno vsebino, ki jo predlaga Google, se prijavite in vklopite sinhronizacijo</translation> -<translation id="9079796397681444569">Gumbi na dnu zaslona omogočajo preprosto pomikanje po Chromu</translation> <translation id="9080642952018487277">Vklop zasebnega načina</translation> <translation id="9086455579313502267">Dostop do omrežja ni mogoč</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB prenesenih datotek</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb index d8d5b0b..60c6071 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Побољшајте Chrome слањем статистике коришћења и извештаја о отказивању Google-у.</translation> <translation id="410351446219883937">Аутоплеј</translation> <translation id="4113030288477039509">Овим управља администратор</translation> -<translation id="411332046216682877">Додирните овде да бисте брзо започели претрагу</translation> <translation id="4116038641877404294">Преузмите странице да бисте их користили офлајн</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d обележивач}one{%1$d обележивач}few{%1$d обележивача}other{%1$d обележивача}}</translation> <translation id="4149994727733219643">Поједностављен приказ веб-страница</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Додирните да бисте скупили</translation> <translation id="5990142338020175451">Персонализованије Google услуге, попут бољих предлога страница</translation> <translation id="6000066717592683814">Задржи Google</translation> -<translation id="6001839398155993679">Идемо</translation> <translation id="6005538289190791541">Предложена лозинка</translation> <translation id="6039379616847168523">Прелазак на следећу картицу</translation> <translation id="6040143037577758943">Затвори</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Започни гласовну претрагу</translation> <translation id="9071742570345586758">Да бисте прегледали садржај виртуелне реалности, инсталирајте Google услуге виртуелне реалности</translation> <translation id="9074336505530349563">Да бисте добијали персонализовани садржај који предлаже Google, пријавите се и укључите синхронизацију</translation> -<translation id="9079796397681444569">Лако се крећите било где у Chrome-у помоћу дугмади у дну екрана</translation> <translation id="9080642952018487277">Уђи у приватни режим</translation> <translation id="9086455579313502267">Не можемо да приступимо мрежи</translation> <translation id="9099018167121903954">Преузели сте <ph name="KILOBYTES" /> kB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb index 146e49a..e65ad5c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Hjälp till att förbättra Chrome genom att skicka användningsstatistik och felrapporter till Google.</translation> <translation id="410351446219883937">Automatisk uppspelning</translation> <translation id="4113030288477039509">Hanteras av administratören</translation> -<translation id="411332046216682877">Börja söka snabbt genom att trycka här</translation> <translation id="4116038641877404294">Ladda ned sidor så att du kan använda dem offline</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bokmärke}other{%1$d bokmärken}}</translation> <translation id="4149994727733219643">Förenklad vy för webbsidor</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Tryck här om du vill komprimera</translation> <translation id="5990142338020175451">Personligare tjänster från Google, till exempel förbättrade förslag på sidor</translation> <translation id="6000066717592683814">Behåll Google</translation> -<translation id="6001839398155993679">Då kör vi</translation> <translation id="6005538289190791541">Föreslaget lösenord</translation> <translation id="6039379616847168523">Hoppa till nästa flik</translation> <translation id="6040143037577758943">Stäng</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Starta röstsökning</translation> <translation id="9071742570345586758">Installera Googles VR-tjänster om du vill visa innehåll med virtuell verklighet</translation> <translation id="9074336505530349563">Logga in och aktivera synkronisering om du vill få förslag på anpassat innehåll från Google</translation> -<translation id="9079796397681444569">Navigera enkelt vart som helst i Chrome med knapparna längst ned på skärmen</translation> <translation id="9080642952018487277">Aktivera privat läge</translation> <translation id="9086455579313502267">Det går inte att ansluta till nätverket</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB används av nedladdningar</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb index 2894b12..1140d51 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Je, unataka kuanza kupakua <ph name="FILE_NAME" /> tena?</translation> <translation id="2476578072172137802">Mipangilio ya Tovuti</translation> <translation id="2482878487686419369">Arifa</translation> +<translation id="2494974097748878569">Mratibu wa Google katika Chrome</translation> <translation id="2496180316473517155">Historia ya kuvinjari</translation> <translation id="2498359688066513246">Usaidizi na maoni</translation> <translation id="2501278716633472235">Rudi nyuma</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Saidia kuboresha Chrome kwa kutumia Google takwimu za matumizi na ripoti wakati wowote kivinjari hiki kinapoacha kufanya kazi.</translation> <translation id="410351446219883937">Kucheza kiotomatiki</translation> <translation id="4113030288477039509">Inadhibitiwa na msimamizi wako</translation> -<translation id="411332046216682877">Gusa hapa ili uanze kutafuta haraka</translation> <translation id="4116038641877404294">Pakua kurasa uzitumie nje ya mtandao</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{Alamisho %1$d}other{Alamisho %1$d}}</translation> <translation id="4149994727733219643">Mwonekano uliorahisishwa kwa ajili ya kurasa za wavuti</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Gusa ili ukunje</translation> <translation id="5990142338020175451">Huduma zaidi za Google zinazokufaa, kama vile mapendekezo bora zaidi ya ukurasa</translation> <translation id="6000066717592683814">Endelea Kutumia Google</translation> -<translation id="6001839398155993679">Twende kazi</translation> <translation id="6005538289190791541">Nenosiri linalopendekezwa</translation> <translation id="6039379616847168523">Nenda kwenye kichupo kinachofuata</translation> <translation id="6040143037577758943">Funga</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Kulikuwa na tatizo katika kuchapisha ukurasa. Tafadhali jaribu tena.</translation> <translation id="6295158916970320988">Tovuti zote</translation> <translation id="629730747756840877">Akaunti</translation> +<translation id="6302269476990306341">Programu ya Mratibu wa Google katika Chrome inaacha kufanya kazi</translation> <translation id="6303969859164067831">Ondoka kwenye akaunti na uzime usawazishaji</translation> <translation id="6316139424528454185">Haiwezi kutumia toleo la Android</translation> <translation id="6320088164292336938">Tetema</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378">Imechagua <ph name="ITEM_COUNT" /></translation> <translation id="7253272406652746122">Ongeza Akaunti ya Google kutoka kwenye ukurasa wa Akaunti katika programu ya Mipangilio ya kifaa chako.</translation> <translation id="7274013316676448362">Tovuti imezuiwa</translation> +<translation id="7291387454912369099">Ulipaji Unaoanzishwa na Mratibu</translation> <translation id="729975465115245577">Kifaa chako hakina programu ya kuhifadhi faili ya manenosiri.</translation> <translation id="7302081693174882195">Maelezo: Imepangwa kulingana na kiasi cha data kilichookolewa</translation> <translation id="7333031090786104871">Bado inaongeza tovuti ya awali</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Anza kutafuta kwa kutamka</translation> <translation id="9071742570345586758">Sakinisha Huduma za Google VR ili uangalie maudhui ya uhalisi pepe</translation> <translation id="9074336505530349563">Ingia katika akaunti na uwashe kipengee cha usawazishaji ili upate maudhui yanayokufaa unayopendekezewa na Google</translation> -<translation id="9079796397681444569">Sogeza popote kwenye Chrome kwa urahisi ukitumia vitufe vilivyo sehemu ya chini ya skrini yako</translation> <translation id="9080642952018487277">Fungua hali ya faragha</translation> <translation id="9086455579313502267">Haiwezi kufikia mtandao</translation> <translation id="9099018167121903954">Imepakua KB <ph name="KILOBYTES" /></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 793b4cc0..65e65c8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">பயன்பாட்டுப் புள்ளிவிவரங்களையும், சிதைவு அறிக்கைகளையும் Googleக்கு அனுப்புவதன் மூலம் Chromeஐ மேலும் சிறப்பானதாக்க உதவவும்.</translation> <translation id="410351446219883937">தானியங்கி</translation> <translation id="4113030288477039509">உங்கள் நிர்வாகியால் நிர்வகிக்கப்படுகிறது</translation> -<translation id="411332046216682877">உடனடியாகத் தேடலைத் தொடங்க, இங்கு தட்டவும்</translation> <translation id="4116038641877404294">ஆஃப்லைனில் பார்க்க, பக்கங்களைப் பதிவிறக்கவும்</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d புத்தகக்குறி}other{%1$d புத்தகக்குறிகள்}}</translation> <translation id="4149994727733219643">இணையப் பக்கங்களுக்கான எளிதாக்கப்பட்ட காட்சி</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">சுருக்க, தட்டவும்</translation> <translation id="5990142338020175451">சிறந்த பக்கப் பரிந்துரைகள் போன்ற மேலும் தனிப்பட்ட Google சேவைகள்</translation> <translation id="6000066717592683814">Googleஐ இயல்பு இன்ஜினாக வைத்திரு</translation> -<translation id="6001839398155993679">தொடங்குக</translation> <translation id="6005538289190791541">பரிந்துரைக்கப்படும் கடவுச்சொல்</translation> <translation id="6039379616847168523">அடுத்த தாவலுக்குச் செல்லும்</translation> <translation id="6040143037577758943">மூடு</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">குரல் தேடலைத் தொடங்கு</translation> <translation id="9071742570345586758">விர்ச்சுவல் ரியாலிட்டி உள்ளடக்கத்தைப் பார்க்க, Google VR சேவைகளை நிறுவவும்</translation> <translation id="9074336505530349563">Google பரிந்துரைக்கும் பிரத்யேக உள்ளடக்கத்தைப் பெற, உள்நுழைந்து, ஒத்திசைவை இயக்கவும்</translation> -<translation id="9079796397681444569">உங்கள் திரையின் கீழே உள்ள பட்டன்களைப் பயன்படுத்தி, Chromeமில் விரும்பிய இடத்திற்கு எளிதாக வழிசெலுத்தலாம்.</translation> <translation id="9080642952018487277">மறைநிலைக்குச் செல்லும்</translation> <translation id="9086455579313502267">நெட்வொர்க்கை அணுக முடியவில்லை</translation> <translation id="9099018167121903954">பதிவிறக்கங்கள் அளவு: <ph name="KILOBYTES" /> கி.பை.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb index 4d048b2..2defe1d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Googleకి వినియోగ గణాంకాలు, క్రాష్ నివేదికలను పంపడం ద్వారా Chromeను మెరుగుపరచడంలో సహాయపడండి.</translation> <translation id="410351446219883937">స్వీయ ప్లే</translation> <translation id="4113030288477039509">మీ నిర్వాహకుడు ద్వారా నిర్వహించబడుతోంది</translation> -<translation id="411332046216682877">శోధనను త్వరగా ప్రారంభించడం కోసం ఇక్కడ నొక్కండి</translation> <translation id="4116038641877404294">పేజీలను ఆఫ్లైన్లో ఉపయోగించడం కోసం వాటిని డౌన్లోడ్ చేసుకోండి</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d బుక్మార్క్}other{%1$d బుక్మార్క్లు}}</translation> <translation id="4149994727733219643">వెబ్ పేజీల కోసం సరళమైన వీక్షణ</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">కుదించడానికి నొక్కండి</translation> <translation id="5990142338020175451">మెరుగైన పేజీ సూచనల వంటి, మరిన్ని వ్యక్తిగత Google సేవలు</translation> <translation id="6000066717592683814">Googleని ఉంచు</translation> -<translation id="6001839398155993679">ప్రారంభిద్దాం</translation> <translation id="6005538289190791541">సూచించబడిన పాస్వర్డ్</translation> <translation id="6039379616847168523">తదుపరి ట్యాబ్కు వెళ్లండి</translation> <translation id="6040143037577758943">మూసివేయి</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">వాయిస్ శోధనను ప్రారంభించండి</translation> <translation id="9071742570345586758">వర్చువల్ రియాలిటీ కంటెంట్ను వీక్షించడానికి, Google VR సేవలను ఇన్స్టాల్ చేయండి</translation> <translation id="9074336505530349563">Google ద్వారా మీ అభిరుచికి తగిన కంటెంట్ను సిఫార్సుల రూపంలో పొందాలనుకుంటే, సైన్ ఇన్ చేసి సమకాలీకరణ ఎంపికను ఆన్ చేయాలి</translation> -<translation id="9079796397681444569">మీ స్క్రీన్ దిగువన ఉన్న బటన్లని ఉపయోగించి Chromeలో ఎక్కడికైనా సులభంగా నావిగేట్ చేయండి</translation> <translation id="9080642952018487277">ప్రైవేట్ మోడ్లోకి వెళ్లండి</translation> <translation id="9086455579313502267">నెట్వర్క్ని ప్రాప్యత చెయ్యడం సాధ్యం కాలేదు</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB డౌన్లోడ్ అయింది</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb index 2898c9b7..0897b54 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">ช่วยให้ Chrome ทำงานได้ดีขึ้นโดยส่งสถิติการใช้งานและรายงานข้อขัดข้องให้กับ Google</translation> <translation id="410351446219883937">เล่นอัตโนมัติ</translation> <translation id="4113030288477039509">มีการจัดการโดยผู้ดูแลระบบ</translation> -<translation id="411332046216682877">แตะที่นี่เพื่อเริ่มการค้นหาอย่างรวดเร็ว</translation> <translation id="4116038641877404294">ดาวน์โหลดหน้าเพื่อใช้งานแบบออฟไลน์</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d บุ๊กมาร์ก}other{%1$d บุ๊กมาร์ก}}</translation> <translation id="4149994727733219643">มุมมองอย่างง่ายสำหรับหน้าเว็บ</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">แตะเพื่อยุบ</translation> <translation id="5990142338020175451">บริการของ Google ที่ตรงกับตัวคุณมากขึ้น เช่น คำแนะนำหน้าเว็บที่ดียิ่งขึ้น</translation> <translation id="6000066717592683814">ใช้ Google ต่อ</translation> -<translation id="6001839398155993679">เริ่มเลย</translation> <translation id="6005538289190791541">รหัสผ่านที่แนะนำ</translation> <translation id="6039379616847168523">ข้ามไปยังแท็บถัดไป</translation> <translation id="6040143037577758943">ปิด</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">เริ่มค้นหาด้วยเสียง</translation> <translation id="9071742570345586758">หากต้องการดูเนื้อหา Virtual Reality โปรดติดตั้งบริการ VR ของ Google</translation> <translation id="9074336505530349563">ลงชื่อเข้าใช้และเปิดการซิงค์เพื่อรับคำแนะนำเนื้อหาที่ปรับเปลี่ยนในแบบของคุณจาก Google</translation> -<translation id="9079796397681444569">ไปยังส่วนต่างๆ ใน Chrome ได้ง่ายๆ โดยใช้ปุ่มที่ด้านล่างของหน้าจอ</translation> <translation id="9080642952018487277">เข้าสู่โหมดส่วนตัว</translation> <translation id="9086455579313502267">ไม่สามารถเข้าถึงเครือข่าย</translation> <translation id="9099018167121903954">พื้นที่ที่ใช้ไปสำหรับการดาวน์โหลด <ph name="KILOBYTES" /> KB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb index 986249d..927e0a6 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Google'a kullanım istatistikleri ve kilitlenme raporları göndererek Chrome'u iyileştirmeye yardımcı olun.</translation> <translation id="410351446219883937">Otomatik oynatma</translation> <translation id="4113030288477039509">Yöneticiniz tarafından yönetiliyor</translation> -<translation id="411332046216682877">Hızlı bir arama işlemi başlatmak için buraya dokunun</translation> <translation id="4116038641877404294">Sayfaları çevrimdışı olarak kullanmak için indirin</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d yer işareti}other{%1$d yer işareti}}</translation> <translation id="4149994727733219643">Web sayfalarının basitleştirilmiş görünümü</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Daraltmak için dokunun</translation> <translation id="5990142338020175451">Daha iyi sayfa önerileri gibi daha kişisel Google hizmetleri</translation> <translation id="6000066717592683814">Google kalsın</translation> -<translation id="6001839398155993679">Başlayalım</translation> <translation id="6005538289190791541">Önerilen şifre</translation> <translation id="6039379616847168523">Sonraki sekmeye gider</translation> <translation id="6040143037577758943">Kapat</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Sesli arama başlat</translation> <translation id="9071742570345586758">Sanal gerçeklik içeriğini görüntülemek için Google VR Hizmetleri'ni yükleyin</translation> <translation id="9074336505530349563">Google tarafından önerilen kişiselleştirilmiş içeriği almak için oturum açın ve senkronizasyonu etkinleştirin</translation> -<translation id="9079796397681444569">Ekranınızın alt kısmındaki düğmeleri kullanarak Chrome'da istediğiniz yere kolayca gidin</translation> <translation id="9080642952018487277">Gizli moda geçer</translation> <translation id="9086455579313502267">Ağa erişilemiyor</translation> <translation id="9099018167121903954">İndirilenler <ph name="KILOBYTES" /> KB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb index 1b99291..9f6265c7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">Завантажити файл <ph name="FILE_NAME" /> ще раз?</translation> <translation id="2476578072172137802">Налаштування сайту</translation> <translation id="2482878487686419369">Сповіщення</translation> +<translation id="2494974097748878569">Google Асистент у Chrome</translation> <translation id="2496180316473517155">Історія переглядів</translation> <translation id="2498359688066513246">Довідка й відгуки</translation> <translation id="2501278716633472235">Назад</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">Допоможіть покращити Chrome, надсилаючи статистику та звіти про збої в Google.</translation> <translation id="410351446219883937">Автовідтворення</translation> <translation id="4113030288477039509">Керується адміністратором</translation> -<translation id="411332046216682877">Торкніться тут, щоб швидко почати пошук</translation> <translation id="4116038641877404294">Завантажуйте сторінки, щоб переглядати їх офлайн</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d закладка}one{%1$d закладка}few{%1$d закладки}many{%1$d закладок}other{%1$d закладки}}</translation> <translation id="4149994727733219643">Спрощений перегляд веб-сторінок</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">Торкніться, щоб згорнути</translation> <translation id="5990142338020175451">Більш персоналізовані сервіси Google, як-от кращі пропозиції сторінок</translation> <translation id="6000066717592683814">Залишити Google</translation> -<translation id="6001839398155993679">Почати</translation> <translation id="6005538289190791541">Запропонований пароль</translation> <translation id="6039379616847168523">Перейти до наступної вкладки</translation> <translation id="6040143037577758943">Закрити</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">Виникла проблема з друком цієї сторінки. Повторіть спробу.</translation> <translation id="6295158916970320988">Усі сайти</translation> <translation id="629730747756840877">Обліковий запис</translation> +<translation id="6302269476990306341">Припинення роботи Google Асистента в Chrome</translation> <translation id="6303969859164067831">Вийти й вимкнути синхронізацію</translation> <translation id="6316139424528454185">Версія Android несумісна</translation> <translation id="6320088164292336938">Вібросигнал</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378">Вибрано <ph name="ITEM_COUNT" /></translation> <translation id="7253272406652746122">Додайте обліковий запис Google зі сторінки "Облікові записи" в додатку Налаштування на пристрої.</translation> <translation id="7274013316676448362">Заблокований сайт</translation> +<translation id="7291387454912369099">Оплата за допомогою Асистента</translation> <translation id="729975465115245577">На пристрої немає додатка для зберігання файлу з паролями.</translation> <translation id="7302081693174882195">Деталі: відсортовано за кількістю заощадженого трафіку</translation> <translation id="7333031090786104871">Попередній сайт ще додається</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">Почати голосовий пошук</translation> <translation id="9071742570345586758">Щоб переглядати вміст віртуальної реальності, установіть Google VR-сервіси</translation> <translation id="9074336505530349563">Щоб отримувати персоналізовані пропозиції від Google, увійдіть в обліковий запис і ввімкніть синхронізацію</translation> -<translation id="9079796397681444569">Легко переходьте будь-куди в Chrome за допомогою кнопок унизу екрана</translation> <translation id="9080642952018487277">Перейти в приватний режим</translation> <translation id="9086455579313502267">Неможливо отримати доступ до мережі</translation> <translation id="9099018167121903954">Завантажено <ph name="KILOBYTES" /> КБ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb index 7585e0a5..d24ec510 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">Giúp cải thiện Chrome bằng cách gửi số liệu thống kê sử dụng và báo cáo sự cố cho Google.</translation> <translation id="410351446219883937">Tự động phát</translation> <translation id="4113030288477039509">Do quản trị viên của bạn quản lý</translation> -<translation id="411332046216682877">Nhấn vào đây để nhanh chóng bắt đầu tìm kiếm</translation> <translation id="4116038641877404294">Tải trang xuống để sử dụng ngoại tuyến</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d dấu trang}other{%1$d dấu trang}}</translation> <translation id="4149994727733219643">Chế độ xem đơn giản cho trang web</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">Nhấn để thu gọn</translation> <translation id="5990142338020175451">Tận hưởng nhiều dịch vụ cá nhân hóa khác của Google, như trang đề xuất có liên quan hơn</translation> <translation id="6000066717592683814">Giữ Google làm công cụ tìm kiếm mặc định</translation> -<translation id="6001839398155993679">Bắt đầu</translation> <translation id="6005538289190791541">Mật khẩu đề xuất</translation> <translation id="6039379616847168523">Chuyển sang tab tiếp theo</translation> <translation id="6040143037577758943">Đóng</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">Bắt đầu tìm kiếm bằng giọng nói</translation> <translation id="9071742570345586758">Để xem nội dung thực tế ảo, hãy cài đặt Dịch vụ VR của Google</translation> <translation id="9074336505530349563">Để nhận nội dung do Google đề xuất riêng cho bạn, hãy đăng nhập và bật tính năng đồng bộ hóa</translation> -<translation id="9079796397681444569">Dễ dàng di chuyển đến mọi nơi trong Chrome bằng các nút ở cuối màn hình</translation> <translation id="9080642952018487277">Vào chế độ riêng tư</translation> <translation id="9086455579313502267">Không thể truy cập mạng</translation> <translation id="9099018167121903954">Đã tải xuống <ph name="KILOBYTES" /> KB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb index 27ee512..e2f2b53 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -200,6 +200,7 @@ <translation id="2450083983707403292">要重新开始下载 <ph name="FILE_NAME" /> 吗?</translation> <translation id="2476578072172137802">网站设置</translation> <translation id="2482878487686419369">通知</translation> +<translation id="2494974097748878569">Chrome 中的 Google 助理</translation> <translation id="2496180316473517155">浏览记录</translation> <translation id="2498359688066513246">帮助和反馈</translation> <translation id="2501278716633472235">返回</translation> @@ -392,7 +393,6 @@ <translation id="4099578267706723511">将使用情况统计信息和崩溃报告发送给 Google,帮助我们完善 Chrome。</translation> <translation id="410351446219883937">自动播放</translation> <translation id="4113030288477039509">由您的管理员管理</translation> -<translation id="411332046216682877">点按此处即可快速开始搜索</translation> <translation id="4116038641877404294">下载网页以便离线查看</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d 个书签}other{%1$d 个书签}}</translation> <translation id="4149994727733219643">使用简化版视图查看网页</translation> @@ -646,7 +646,6 @@ <translation id="5962718611393537961">点按即可收起</translation> <translation id="5990142338020175451">畅享更加个性化的 Google 服务,例如更贴合个人需求的网页建议</translation> <translation id="6000066717592683814">继续使用 Google</translation> -<translation id="6001839398155993679">开始</translation> <translation id="6005538289190791541">建议的密码</translation> <translation id="6039379616847168523">跳转到下一个标签页</translation> <translation id="6040143037577758943">关闭</translation> @@ -683,6 +682,7 @@ <translation id="6277522088822131679">打印该页面时出现问题,请重试。</translation> <translation id="6295158916970320988">所有网站</translation> <translation id="629730747756840877">帐号</translation> +<translation id="6302269476990306341">Chrome 中的 Google 助理即将停止工作</translation> <translation id="6303969859164067831">退出帐号并关闭同步功能</translation> <translation id="6316139424528454185">Android 版本不受支持</translation> <translation id="6320088164292336938">振动</translation> @@ -816,6 +816,7 @@ <translation id="7250468141469952378">已选择 <ph name="ITEM_COUNT" /> 项</translation> <translation id="7253272406652746122">请在设备的“设置”应用中,通过“帐号”页面添加 Google 帐号。</translation> <translation id="7274013316676448362">禁止访问的网站</translation> +<translation id="7291387454912369099">使用 Chrome 中的 Google 助理结帐</translation> <translation id="729975465115245577">您的设备上没有可以存储密码文件的应用。</translation> <translation id="7302081693174882195">详细信息:按已节省的数据流量排序</translation> <translation id="7333031090786104871">仍在添加先前的网站</translation> @@ -1048,7 +1049,6 @@ <translation id="9070377983101773829">开始语音搜索</translation> <translation id="9071742570345586758">要查看虚拟实境内容,请安装 Google VR 服务</translation> <translation id="9074336505530349563">要获取 Google 推荐的个性化内容,请登录您的帐号并开启同步功能</translation> -<translation id="9079796397681444569">您可以使用屏幕底部的按钮在 Chrome 中轻松导航至任何位置</translation> <translation id="9080642952018487277">进入私密模式</translation> <translation id="9086455579313502267">无法访问网络</translation> <translation id="9099018167121903954">下载内容已占用的空间:<ph name="KILOBYTES" /> KB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb index 5d3fa94..3747e65 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -392,7 +392,6 @@ <translation id="4099578267706723511">將使用統計資料及當機報告傳送給 Google,助我們一臂之力,讓 Chrome 更臻完美。</translation> <translation id="410351446219883937">自動播放</translation> <translation id="4113030288477039509">您的管理員已停用這項功能</translation> -<translation id="411332046216682877">輕觸這裡即可快速啟動搜尋</translation> <translation id="4116038641877404294">下載網頁以便離線存取</translation> <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d 個書籤}other{%1$d 個書籤}}</translation> <translation id="4149994727733219643">使用簡易檢視模式查看網頁</translation> @@ -646,7 +645,6 @@ <translation id="5962718611393537961">輕觸即可收合</translation> <translation id="5990142338020175451">體驗更加個人化的 Google 服務 (例如更適切的網頁建議)</translation> <translation id="6000066717592683814">繼續使用 Google</translation> -<translation id="6001839398155993679">立即開始</translation> <translation id="6005538289190791541">建議的密碼</translation> <translation id="6039379616847168523">跳至下一個分頁</translation> <translation id="6040143037577758943">關閉</translation> @@ -1048,7 +1046,6 @@ <translation id="9070377983101773829">開始語音搜尋</translation> <translation id="9071742570345586758">如要查看虛擬實境內容,請安裝 Google VR 服務</translation> <translation id="9074336505530349563">如要取得個人化的 Google 推薦內容,請登入並開啟同步處理功能</translation> -<translation id="9079796397681444569">只要按下畫面底部的各個按鈕,就可以輕鬆瀏覽 Chrome 的各項功能</translation> <translation id="9080642952018487277">進入私密模式</translation> <translation id="9086455579313502267">無法存取網路</translation> <translation id="9099018167121903954">下載內容佔 <ph name="KILOBYTES" /> KB</translation>
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 4c1e6b3..a203bae 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -5956,32 +5956,6 @@ <message name="IDS_TOOLBAR_INFORM_SET_HOME_PAGE" desc="The confirmation message when dropping a link on the Home toolbar button"> Your home page has been set. </message> - <!-- TODO(718146) Move autofill strings to autofill_strings.grd --> - <message name="IDS_AUTOFILL_POPUP_ACCESSIBLE_NODE_DATA" desc="The accessibility text to speak when we display an autofill popup."> - Autofill - </message> - - <message name="IDS_AUTOFILL_FIELD_LABEL_PHONE" desc="The label of the Phone entry."> - Phone - </message> - <message name="IDS_AUTOFILL_FIELD_LABEL_NAME_ON_CARD" desc="The label of the Name on card entry."> - Name on card - </message> - <message name="IDS_AUTOFILL_FIELD_LABEL_CREDIT_CARD_NUMBER" desc="The label of the card number entry. This can be either credit, debit, or prepaid card."> - Card number - </message> - <message name="IDS_AUTOFILL_FIELD_LABEL_EXPIRATION_DATE" desc="The label of the Expiration date entry."> - Expiration date - </message> - <message name="IDS_AUTOFILL_FIELD_LABEL_EXPIRATION_MONTH" desc="The label of the Expiration date entry."> - Expiration month - </message> - <message name="IDS_AUTOFILL_FIELD_LABEL_EXPIRATION_YEAR" desc="The label of the Expiration date entry."> - Expiration year - </message> - <message name="IDS_AUTOFILL_FIELD_LABEL_BILLING_ADDRESS" desc="The label of the Billing Address chooser."> - Billing address - </message> <!-- Extension settings --> <message name="IDS_MANAGE_EXTENSIONS_SETTING_WINDOWS_TITLE" desc="Title that appears in the dialogue title bar for manage extensions settings">
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index 6c5942ad..dac6b343 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -5,7 +5,7 @@ <translation id="1104942323762546749">Chromium רוצה לייצא את הסיסמאות שלך. יש להקליד את הסיסמה שלך ל-Windows כדי לאפשר זאת.</translation> <translation id="1115445892567829615">Chromium לא הצליח לסנכרן את הנתונים שלך. עדכן את משפט הסיסמה לסנכרון.</translation> <translation id="113122355610423240">Chromium מוגדר כדפדפן ברירת המחדל</translation> -<translation id="1170115874949214249">התקן את Chromium בטלפון שלך, ונשלח הודעת SMS למספר שמוגדר לשחזור החשבון.</translation> +<translation id="1170115874949214249">יש להתקין את Chromium בטלפון שלך, ולאחר מכן נשלח הודעת SMS למספר שמוגדר לשחזור החשבון.</translation> <translation id="1174473354587728743">משתף את המחשב? עכשיו תוכל להגדיר את Chromium בדיוק כמו שאתה אוהב.</translation> <translation id="1185134272377778587">על Chromium</translation> <translation id="1209657686917656928">{0,plural, =0{Chromium יופעל מחדש עכשיו}=1{Chromium יופעל מחדש בעוד שנייה אחת}two{Chromium יופעל מחדש בעוד שתי שניות}many{Chromium יופעל מחדש בעוד # שניות}other{Chromium יופעל מחדש בעוד # שניות}}</translation> @@ -52,7 +52,7 @@ <translation id="2799223571221894425">הפעל מחדש</translation> <translation id="2847479871509788944">הסר מ-Chromium...</translation> <translation id="2886012850691518054">אופציונלי: עזור לנו לשפר את Chromium באמצעות שליחת נתוני שימוש ודוחות קריסה אל Google באופן אוטומטי.</translation> -<translation id="2898082584336937987">התקן את Chromium בטלפון שלך, ונשלח הודעת SMS למספר: <ph name="PHONE_NUMBER" /></translation> +<translation id="2898082584336937987">יש להתקין את Chromium בטלפון שלך, ולאחר מכן נשלח הודעת SMS למספר: <ph name="PHONE_NUMBER" /></translation> <translation id="2910007522516064972">מידע על &Chromium</translation> <translation id="2977470724722393594">Chromium מעודכן</translation> <translation id="3032787606318309379">הוספה ל-Chromium</translation> @@ -193,7 +193,7 @@ <translation id="7318036098707714271">קובץ ההעדפות שלך פגום או לא חוקי. Chromium לא יכול לשחזר את ההגדרות שלך.</translation> -<translation id="7331920710658926971">התקן את Chromium בטלפון שלך, ונשלח אליו הודעת SMS.</translation> +<translation id="7331920710658926971">יש להתקין את Chromium בטלפון שלך, ולאחר מכן נשלח אליו הודעת SMS.</translation> <translation id="7337881442233988129">Chromium</translation> <translation id="7339898014177206373">חלון חדש</translation> <translation id="734373864078049451">היסטוריית האתרים, הסימניות ונתונים נוספים מ-Chromium נמצאים כאן.</translation> @@ -228,7 +228,7 @@ <translation id="8030318113982266900">מעדכן את המכשיר שלך לערוץ <ph name="CHANNEL_NAME" />...</translation> <translation id="8157153840442649507">Chromium מוצג בשפה זו</translation> <translation id="81770708095080097">Chromium חסם את הקובץ הזה כי הוא מסוכן.</translation> -<translation id="8222496066431494154">התקן את Chromium בטלפון שלך, ונשלח הודעת SMS למספר שמוגדר לשחזור החשבון: <ph name="PHONE_NUMBER" /></translation> +<translation id="8222496066431494154">יש להתקין את Chromium בטלפון שלך, ולאחר מכן נשלח הודעת SMS למספר שמוגדר לשחזור החשבון: <ph name="PHONE_NUMBER" /></translation> <translation id="8269379391216269538">עזור לנו לשפר את Chromium</translation> <translation id="8290862415967981663">Chromium חסם את הקובץ הזה כי הוא עלול להיות מסוכן.</translation> <translation id="8330519371938183845">כניסה לחשבון תסנכרן ותתאים אישית את Chromium בכל המכשירים שברשותך</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 50b8eb7..533ee769 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">የቀኝ ህዳግ</translation> <translation id="2282146716419988068">የጂፒዩ ሂደት</translation> <translation id="2282155092769082568">የራስ-ውቅር ዩአርኤል፦</translation> -<translation id="2286841657746966508">የመላኪያ አድራሻ</translation> <translation id="2288181517385084064">ወደ ቪዲዮ መቅረጫ ቀይር</translation> <translation id="2288735659267887385">የተደራሽነት ቅንብሮች</translation> <translation id="2292848386125228270"><ph name="PRODUCT_NAME" /> እባክዎ እንደ መደበኛ ተጠቃሚ ያስጀምሩት። እንደ ለግንባታ ስርወ ሆኖ ማሄድ ካስፈለግዎት፣ ከ--no-sandbox ጠቁም ጋር እንደገና ያሂዱት።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index e728ceb..d8bac3f 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">الهامش الأيمن</translation> <translation id="2282146716419988068">معالجة وحدة معالجة الرسومات (GPU)</translation> <translation id="2282155092769082568">عنوان URL للتهيئة التلقائية:</translation> -<translation id="2286841657746966508">عنوان الفاتورة</translation> <translation id="2288181517385084064">التبديل إلى مسجل الفيديو</translation> <translation id="2288735659267887385">إعدادات إمكانية الوصول</translation> <translation id="2292848386125228270">يُرجى بدء تشغيل <ph name="PRODUCT_NAME" /> كمستخدم عادي. إذا كنت بحاجة إلى إجراء تشغيل كجذر لأغراض متعلقة بالتطوير، يمكنك إعادة التشغيل باستخدام العلامة التي لا تتضمن وضع الحماية.</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 683979c9f..b984ee4 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -761,6 +761,7 @@ <translation id="215753907730220065">Изход от цял екран</translation> <translation id="2157875535253991059">Тази страница сега е на цял екран.</translation> <translation id="216169395504480358">Добавяне на Wi-Fi...</translation> +<translation id="2162155940152307086">Синхронизирането ще започне, след като излезете от страницата с настройките му</translation> <translation id="2163470535490402084">Моля, свържете се с интернет, за да влезте в устройството си <ph name="DEVICE_TYPE" />.</translation> <translation id="2166369534954157698">Ах, чудна българска земьо, полюшвай цъфтящи жита!</translation> <translation id="2169062631698640254">Влизане въпреки това</translation> @@ -771,6 +772,7 @@ <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_NAME" /> от <ph name="PEPPER_PLUGIN_DOMAIN" /> иска да осъществи достъп до компютъра ви</translation> <translation id="2178614541317717477">Компрометиране на сертифициращия орган</translation> <translation id="218070003709087997">Използвайте число, за да укажете колко копия да се отпечатат (от 1 до 999).</translation> +<translation id="2182253583899676504">Текстът, който въвеждате в текстовите полета, ще се изпраща до Google.</translation> <translation id="2184515124301515068">Нека Chrome избира кога сайтовете да могат да възпроизвеждат звук (препоръчително)</translation> <translation id="2187895286714876935">Грешка при импортирането на сертификат на сървър</translation> <translation id="2187906491731510095">Разширенията бяха актуализирани</translation> @@ -782,7 +784,9 @@ <translation id="2192505247865591433">От:</translation> <translation id="2193365732679659387">Настройки за доверие</translation> <translation id="2195729137168608510">Защита за имейли</translation> +<translation id="2198757192731523470">Възможно е да използваме историята ви, за да персонализираме търсенето, рекламите и други услуги на Google.</translation> <translation id="2199298570273670671">Грешка</translation> +<translation id="2199719347983604670">Данни от синхронизирането в Chrome</translation> <translation id="2200094388063410062">Имейл</translation> <translation id="2200356397587687044">Chrome се нуждае от разрешение, за да продължи</translation> <translation id="2200603218210188859">Предпочитания за USB устройства</translation> @@ -847,7 +851,6 @@ <translation id="2280486287150724112">Дясно поле</translation> <translation id="2282146716419988068">Процес на графичния процесор</translation> <translation id="2282155092769082568">URL адрес за автоматично конфигуриране:</translation> -<translation id="2286841657746966508">Адрес за фактуриране</translation> <translation id="2288181517385084064">Превключване към видеорекордер</translation> <translation id="2288735659267887385">Настройки за достъпност</translation> <translation id="2292848386125228270">Моля, стартирайте <ph name="PRODUCT_NAME" /> като обикновен потребител. Ако имате нужда от права на потребител root, за да преминете в режим за програмиране, стартирайте отново браузъра с флага --no-sandbox.</translation> @@ -1240,6 +1243,7 @@ <translation id="2889064240420137087">Отваряне на връзката със...</translation> <translation id="2889925978073739256">Блокирането на приставки извън тестова среда да продължи</translation> <translation id="2893168226686371498">Браузър по подразбиране</translation> +<translation id="2895734772884435517">Можете да персонализирате тези настройки по всяко време.</translation> <translation id="289644616180464099">SIM картата е заключена</translation> <translation id="289695669188700754">Идентификатор (ИД) на ключ: <ph name="KEY_ID" /></translation> <translation id="2897878306272793870">Наистина ли искате да отворите <ph name="TAB_COUNT" /> раздела?</translation> @@ -1709,6 +1713,7 @@ <translation id="3636766455281737684"><ph name="PERCENTAGE" />% – остава/т <ph name="TIME" /></translation> <translation id="3637682276779847508">SIM картата ви ще бъде деактивирана за постоянно, ако не успеете да въведете правилния PUK код</translation> +<translation id="363863692969456324">Поправка на правописните грешки посредством подобрената функция за проверка на правописа</translation> <translation id="3640214691812501263">Да се добави ли <ph name="EXTENSION_NAME" /> за <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Ширина</translation> <translation id="3645372836428131288">Преместете малко пръста си, за да бъде заснета друга част от отпечатъка.</translation> @@ -2142,6 +2147,7 @@ <translation id="4310139701823742692">Файловият формат е неправилен. Проверете PPD файла и опитайте отново.</translation> <translation id="431076611119798497">&Подробности</translation> <translation id="4312866146174492540">Блокиране (по подразбиране)</translation> +<translation id="4314815835985389558">Управление на синхронизирането</translation> <translation id="4316850752623536204">Уебсайт на програмиста</translation> <translation id="4320177379694898372">Няма връзка с интернет</translation> <translation id="4320948194796820126">Добавете отметка към електронната си поща</translation> @@ -2221,6 +2227,7 @@ <translation id="4450974146388585462">Диагностициране</translation> <translation id="4451757071857432900">Блокиране за сайтовете, на които се показват натрапчиви или подвеждащи реклами (препоръчително)</translation> <translation id="4453946976636652378">Търсете с(ъс) <ph name="SEARCH_ENGINE_NAME" /> или въведете URL адрес</translation> +<translation id="4461835665417498653">Изпраща анонимно до Google системна информация и част от съдържанието на страниците.</translation> <translation id="4462159676511157176">Специално зададени сървъри за имена</translation> <translation id="4467101674048705704">Разгъване на „<ph name="FOLDER_NAME" />“</translation> <translation id="4469477701382819144">Блокиране за сайтовете, на които се показват натрапчиви или подвеждащи реклами</translation> @@ -2385,6 +2392,7 @@ <translation id="4735265153267957659">Въведете паролата си, за да активирате Smart Lock. Следващия път телефонът ви ще отключи вашия <ph name="DEVICE_TYPE" />. Можете да изключите Smart Lock от настройките.</translation> <translation id="473546211690256853">Този профил се управлява от <ph name="DOMAIN" /></translation> <translation id="4735803855089279419">Системата не успя да определи идентификаторите за това устройство.</translation> +<translation id="4736292055110123391">Синхронизиране на вашите отметки, пароли, история и др. на всичките ви устройства</translation> <translation id="4737715515457435632">Моля, установете връзка с мрежа</translation> <translation id="473775607612524610">Актуализиране</translation> <translation id="4742746985488890273">Фиксиране в лавицата</translation> @@ -2723,6 +2731,7 @@ <translation id="5266113311903163739">Грешка при импортирането на сертифициращ орган</translation> <translation id="5269977353971873915">Отпечатването не бе успешно</translation> <translation id="5270167208902136840">Показване на още <ph name="NUMBER_OF_MORE_APPS" /> приложения</translation> +<translation id="5272654297705279635">Персонализирани настройки</translation> <translation id="5275352920323889391">Куче</translation> <translation id="5275973617553375938">Възстановени от Google Диск файлове</translation> <translation id="527605982717517565">Да се разреши на <ph name="HOST" /> винаги да изпълнява JavaScript</translation> @@ -4895,6 +4904,7 @@ <translation id="8598453409908276158">Приставката извън тестовата среда е блокирана</translation> <translation id="8601206103050338563">Удостоверяване на TLS WWW клиент</translation> <translation id="8602851771975208551">Друга програма на компютъра ви добави приложение, което може да промени начина на работа на Chrome.</translation> +<translation id="8604763363205185560">Помогнете за подобряването на Chrome и сигурността му</translation> <translation id="8605428685123651449">Памет за SQLite</translation> <translation id="8606726445206553943">Да използва MIDI устройствата ви.</translation> <translation id="8609465669617005112">Придвижване нагоре</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 3c6d603..da47698 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -853,7 +853,6 @@ <translation id="2280486287150724112">ডান মার্জিন</translation> <translation id="2282146716419988068">GPU প্রক্রিয়া</translation> <translation id="2282155092769082568">স্বতঃকনফিগারেশান URL:</translation> -<translation id="2286841657746966508">বিলিং ঠিকানা</translation> <translation id="2288181517385084064">এর বদলে ভিডিও রেকর্ড করুন</translation> <translation id="2288735659267887385">অ্যাক্সেসযোগ্যতার সেটিংস</translation> <translation id="2292848386125228270">অনুগ্রহ করে একজন সাধারন ব্যবহারকারী হিসেবে <ph name="PRODUCT_NAME" /> আরম্ভ করুন। আপনার যদি বিকাশ করার জন্য রুট হিসাবে চালানোর প্রয়োজন হয়, তাহলে --নো-স্যান্ডবক্স ফ্ল্যাগটি আবার চালান।</translation> @@ -1957,7 +1956,7 @@ <translation id="3979748722126423326"><ph name="NETWORKDEVICE" /> সক্ষম করুন</translation> <translation id="3981760180856053153">অবৈধ সংরক্ষণ প্রকার প্রবেশ করা হয়েছে৷</translation> <translation id="3982375475032951137">কয়েকটি সহজ ধাপে আপনার ব্রাউজার সেট-আপ করুন</translation> -<translation id="3983400541576569538">কিছু অ্যাপের ডেটার মুছে যেতে পারে</translation> +<translation id="3983400541576569538">কিছু অ্যাপের ডেটা মুছে যেতে পারে</translation> <translation id="3983586614702900908">একটি অজানা বিক্রেতা থেকে ডিভাইসগুলি</translation> <translation id="3984159763196946143">ডেমো মোড শুরু করা যায়নি</translation> <translation id="3987348946546879621">ডেটা বাঁচানো হয়েছে</translation> @@ -2673,7 +2672,7 @@ <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />"-এর নতুনতম সংস্করনটি অক্ষম হয়েছে কারণ এটির আরও বেশি অনুমতির প্রয়োজন৷</translation> <translation id="5187295959347858724">আপনি এখন <ph name="SHORT_PRODUCT_NAME" />এ প্রবেশ করেছেন৷ আপনার বুকমার্ক, ইতিহাস এবং অন্য সেটিংস আপনার Google অ্যাকাউন্টে সমন্বিত করা হচ্ছে৷</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> -<translation id="5187892128515678283">টগল চালু করার মাধ্যমে Linux এর মাধ্যমে একটি ইউএসবি ডিভাইস শেয়ার করুন। শুধুমাত্র ডিভাইসটি বিচ্ছিন্ন না হওয়া পর্যন্ত শেয়ারিং বজায় থাকবে।</translation> +<translation id="5187892128515678283">টগল চালু করার মাধ্যমে Linux-এর মাধ্যমে একটি ইউএসবি ডিভাইস শেয়ার করুন। ডিভাইসটি খুলে না নেওয়া পর্যন্ত শেয়ারিং বজায় থাকবে।</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> একাধিক ফাইল ডাউনলোড করতে চায়</translation> <translation id="5204673965307125349">ডিভাইস পাওয়ারওয়াশ করে আবার চেষ্টা করুন।</translation> <translation id="5204967432542742771">পাসওয়ার্ড প্রবেশ করান</translation> @@ -2727,7 +2726,7 @@ <translation id="5265797726250773323">ইনস্টল করার সময় সমস্যা</translation> <translation id="5266113311903163739">শংসাকরণ কর্তৃপক্ষ আমদানি ত্রুটি</translation> <translation id="5269977353971873915">প্রিন্ট ব্যর্থ হয়েছে</translation> -<translation id="5270167208902136840">আরও <ph name="NUMBER_OF_MORE_APPS" /> অ্যাপ দেখুন</translation> +<translation id="5270167208902136840">আরও <ph name="NUMBER_OF_MORE_APPS" />টি অ্যাপ দেখুন</translation> <translation id="5272654297705279635">কাস্টম সেটিংস</translation> <translation id="5275352920323889391">কুকুর</translation> <translation id="5275973617553375938">Google ড্রাইভ থেকে উদ্ধার করা ফাইলগুলি</translation> @@ -4610,7 +4609,7 @@ <translation id="8116972784401310538">&বুকমার্ক পরিচালক</translation> <translation id="8117620576188476503">স্টেটাস ট্রে থেকে সংযোগ, আপডেট এবং সেটিংস পরিচালনা করুন। কীবোর্ডের সাহায্যে এখানে পেতে Alt + Shift + S বোতামটি টিপুন।</translation> <translation id="8118362518458010043">Chrome এটি বন্ধ করেছে। এই এক্সটেনশনটি নিরাপদ নাও হতে পারে।</translation> -<translation id="8118488170956489476">আপনার সংগঠনের মাধ্যমে <ph name="BEGIN_LINK" />ব্রাউজার ম্যানেজ করা হয়<ph name="END_LINK" /></translation> +<translation id="8118488170956489476">আপনার সংগঠন <ph name="BEGIN_LINK" />ব্রাউজার ম্যানেজ করছে<ph name="END_LINK" /></translation> <translation id="8118860139461251237">আপনার ডাউনলোডগুলি পরিচালনা করুন</translation> <translation id="8123590694679414600">আপনার সিঙ্ক পাসফ্রেজ দিয়ে <ph name="TIME" />-এ ডেটা এনক্রিপ্ট করা হয়েছিল। এতে Google Pay-এর পেমেন্ট পদ্ধতি ও ঠিকানা অন্তর্ভুক্ত থাকে না।</translation> <translation id="81238879832906896">হলুদ এবং সাদা ফুল</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 1679c0d..64259d3 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Marge dret</translation> <translation id="2282146716419988068">Procés de GPU</translation> <translation id="2282155092769082568">URL de configuració automàtica:</translation> -<translation id="2286841657746966508">Adreça de facturació</translation> <translation id="2288181517385084064">Canvia a la gravadora de vídeo</translation> <translation id="2288735659267887385">Configuració d'accessibilitat</translation> <translation id="2292848386125228270">Inicia <ph name="PRODUCT_NAME" /> com un usuari normal. Si l'has d'executar com a arrel per fer-ne desenvolupament, torna a executar-lo amb la marca que indica que no és zona de proves.</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 7e4c9ff2..cc3e99a 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -764,6 +764,7 @@ <translation id="215753907730220065">Ukončit režim celé obrazovky</translation> <translation id="2157875535253991059">Tato stránka se teď zobrazuje na celou obrazovku</translation> <translation id="216169395504480358">Přidat Wi-Fi...</translation> +<translation id="2162155940152307086">Synchronizace bude zahájena, až opustíte nastavení</translation> <translation id="2163470535490402084">Chcete-li se přihlásit do zařízení <ph name="DEVICE_TYPE" />, připojte se k internetu.</translation> <translation id="2166369534954157698">Příliš žluťoučký kůň úpěl ďábelské ódy</translation> <translation id="2169062631698640254">Přesto se přihlásit</translation> @@ -774,6 +775,7 @@ <translation id="2178098616815594724">Plugin <ph name="PEPPER_PLUGIN_NAME" /> v doméně <ph name="PEPPER_PLUGIN_DOMAIN" /> chce získat přístup k vašemu počítači</translation> <translation id="2178614541317717477">Ohrožení bezpečnosti certifikační autority</translation> <translation id="218070003709087997">Počet kopií, které chcete vytisknout, je třeba zadat jako číslo (od 1 do 999).</translation> +<translation id="2182253583899676504">Text zadaný do textových polí bude odeslán do Googlu.</translation> <translation id="2184515124301515068">Nechat Chrome zvolit, kdy weby mohou přehrávat zvuk (doporučeno)</translation> <translation id="2187895286714876935">Chyba při importu certifikátu serveru</translation> <translation id="2187906491731510095">Rozšíření byla aktualizována</translation> @@ -785,7 +787,9 @@ <translation id="2192505247865591433">Zdroj:</translation> <translation id="2193365732679659387">Nastavení důvěryhodnosti</translation> <translation id="2195729137168608510">Ochrana e-mailu</translation> +<translation id="2198757192731523470">Google vaši historii může používat k personalizaci Vyhledávání, reklam a dalších služeb Google.</translation> <translation id="2199298570273670671">Chyba</translation> +<translation id="2199719347983604670">Data ze synchronizace Chromu</translation> <translation id="2200094388063410062">E-mail</translation> <translation id="2200356397587687044">Chrome k pokračování potřebuje oprávnění</translation> <translation id="2200603218210188859">Předvolby zařízení USB</translation> @@ -850,7 +854,6 @@ <translation id="2280486287150724112">Pravý okraj</translation> <translation id="2282146716419988068">Proces GPU</translation> <translation id="2282155092769082568">Adresa URL automatické konfigurace:</translation> -<translation id="2286841657746966508">Fakturační adresa</translation> <translation id="2288181517385084064">Přepnout na videokameru</translation> <translation id="2288735659267887385">Nastavení přístupnosti</translation> <translation id="2292848386125228270">Spusťte prosím aplikaci <ph name="PRODUCT_NAME" /> jako běžný uživatel. Pokud ji pro účely vývoje potřebujete spustit jako uživatel root, spusťte ji znovu s příznakem --no-sandbox.</translation> @@ -1242,6 +1245,7 @@ <translation id="2889064240420137087">Otevřít odkaz pomocí...</translation> <translation id="2889925978073739256">Pokračovat v blokování pluginů mimo izolovaný prostor</translation> <translation id="2893168226686371498">Výchozí prohlížeč</translation> +<translation id="2895734772884435517">Tato nastavení si můžete kdykoli přizpůsobit.</translation> <translation id="289644616180464099">SIM karta je uzamčena</translation> <translation id="289695669188700754">ID klíče: <ph name="KEY_ID" /></translation> <translation id="2897878306272793870">Určitě chcete otevřít <ph name="TAB_COUNT" /> karty (karet)?</translation> @@ -1708,6 +1712,7 @@ <translation id="3636096452488277381">Ahoj uživateli <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" /> %, zbývá <ph name="TIME" /></translation> <translation id="3637682276779847508">Pokud správně nezadáte klíč k odemknutí kódu PIN, bude SIM karta natrvalo deaktivována</translation> +<translation id="363863692969456324">Odstraňte překlepy pomocí vylepšené kontroly pravopisu</translation> <translation id="3640214691812501263">Přidat aplikaci <ph name="EXTENSION_NAME" /> pro uživatele <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Šířka</translation> <translation id="3645372836428131288">Lehce prst natočte, aby se zaznamenala jiná část otisku.</translation> @@ -2139,6 +2144,7 @@ <translation id="4310139701823742692">Soubor má nesprávný formát. Zkontrolujte soubor PPD a zkuste to znovu.</translation> <translation id="431076611119798497">&Podrobnosti</translation> <translation id="4312866146174492540">Blokovat (výchozí)</translation> +<translation id="4314815835985389558">Správa synchronizace</translation> <translation id="4316850752623536204">Webové stránky vývojáře</translation> <translation id="4320177379694898372">Žádné připojení k internetu</translation> <translation id="4320948194796820126">Přidejte si záložku pro e-mail</translation> @@ -2218,6 +2224,7 @@ <translation id="4450974146388585462">Diagnostikovat</translation> <translation id="4451757071857432900">Blokováno na webech, které zobrazují rušivé nebo zavádějící reklamy (doporučeno)</translation> <translation id="4453946976636652378">Zadejte dotaz pro vyhledávač <ph name="SEARCH_ENGINE_NAME" /> nebo adresu URL</translation> +<translation id="4461835665417498653">Odesílá část informací o systému a obsahu stránek do Googlu.</translation> <translation id="4462159676511157176">Vlastní názvové servery</translation> <translation id="4467101674048705704">Rozbalit složku <ph name="FOLDER_NAME" /></translation> <translation id="4469477701382819144">Blokováno na webech, které zobrazují rušivé nebo zavádějící reklamy</translation> @@ -2382,6 +2389,7 @@ <translation id="4735265153267957659">Chcete-li zapnout funkci Smart Lock, zadejte heslo. Příště váš telefon zařízení <ph name="DEVICE_TYPE" /> odemkne. Funkci Smart Lock můžete vypnout v Nastavení.</translation> <translation id="473546211690256853">Tento účet spravuje <ph name="DOMAIN" />.</translation> <translation id="4735803855089279419">Systému se nepodařilo zjistit identifikátory tohoto zařízení.</translation> +<translation id="4736292055110123391">Synchronizujte záložky, hesla, historii a další údaje do všech svých zařízení</translation> <translation id="4737715515457435632">Připojte se prosím k síti</translation> <translation id="473775607612524610">Aktualizovat</translation> <translation id="4742746985488890273">Připnout k poličce</translation> @@ -2719,6 +2727,7 @@ <translation id="5266113311903163739">Chyba při importu certifikační autority</translation> <translation id="5269977353971873915">Tisk se nezdařil</translation> <translation id="5270167208902136840">Zobrazit další aplikace (<ph name="NUMBER_OF_MORE_APPS" />)</translation> +<translation id="5272654297705279635">Vlastní nastavení</translation> <translation id="5275352920323889391">Pes</translation> <translation id="5275973617553375938">Obnovené soubory z Disku Google</translation> <translation id="527605982717517565">Vždy povolovat JavaScript z webu <ph name="HOST" /></translation> @@ -4887,6 +4896,7 @@ <translation id="8598453409908276158">Pluginu byl zablokován přístup mimo izolovaný prostor</translation> <translation id="8601206103050338563">Ověření TLS webového klienta</translation> <translation id="8602851771975208551">Jiný program ve vašem počítači nainstaloval aplikaci, která může měnit funkce Chromu.</translation> +<translation id="8604763363205185560">Pomozte s vylepšováním Chromu a jeho zabezpečení</translation> <translation id="8605428685123651449">Paměť SQLite</translation> <translation id="8606726445206553943">Používat vaše zařízení MIDI</translation> <translation id="8609465669617005112">Posunout nahoru</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 331c783..0ce2d7f 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -847,7 +847,6 @@ <translation id="2280486287150724112">Højremargen</translation> <translation id="2282146716419988068">GPU-proces</translation> <translation id="2282155092769082568">Webadresse til automatisk konfiguration:</translation> -<translation id="2286841657746966508">Faktureringsadresse</translation> <translation id="2288181517385084064">Skift til videooptagelse</translation> <translation id="2288735659267887385">Indstillinger for hjælpefunktioner</translation> <translation id="2292848386125228270">Start <ph name="PRODUCT_NAME" /> som en normal bruger. Hvis du har brug for at køre med et rodcertifikat til udvikling, skal du køre med markeringen --ikke sandbox igen.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 84474d5..1f47ff1 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -847,7 +847,6 @@ <translation id="2280486287150724112">Rechter Rand</translation> <translation id="2282146716419988068">GPU-Verarbeitung</translation> <translation id="2282155092769082568">URL für Autokonfiguration:</translation> -<translation id="2286841657746966508">Rechnungsadresse</translation> <translation id="2288181517385084064">Zum Videorekorder wechseln</translation> <translation id="2288735659267887385">Einstellungen für Bedienungshilfen</translation> <translation id="2292848386125228270">Starten Sie <ph name="PRODUCT_NAME" /> als normaler Nutzer. Um Chrome für Entwicklungszwecke als Root auszuführen, müssen Sie den Browser noch einmal mit dem Kennzeichen "--no-sandbox" ausführen.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 774c4c4..29b66204 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -764,6 +764,7 @@ <translation id="215753907730220065">Έξοδος από πλήρη οθόνη</translation> <translation id="2157875535253991059">Αυτή η σελίδα εμφανίζεται σε πλήρη οθόνη</translation> <translation id="216169395504480358">Προσθήκη Wi-Fi…</translation> +<translation id="2162155940152307086">Ο συγχρονισμός θα ξεκινήσει μόλις αποχωρήσετε από τις ρυθμίσεις συγχρονισμού</translation> <translation id="2163470535490402084">Συνδεθείτε στο διαδίκτυο για να συνδεθείτε στη συσκευή σας <ph name="DEVICE_TYPE" />.</translation> <translation id="2166369534954157698">Η γρήγορη καφέ αλεπού πηδάει πάνω από το τεμπέλικο σκυλί</translation> <translation id="2169062631698640254">Σύνδεση</translation> @@ -774,6 +775,7 @@ <translation id="2178098616815594724">Η προσθήκη <ph name="PEPPER_PLUGIN_NAME" /> στον τομέα <ph name="PEPPER_PLUGIN_DOMAIN" /> επιθυμεί να αποκτήσει πρόσβαση στον υπολογιστή σας</translation> <translation id="2178614541317717477">Παραβίαση αρχής έκδοσης πιστοποιητικών</translation> <translation id="218070003709087997">Χρησιμοποιήστε έναν αριθμό για να υποδείξετε πόσα αντίγραφα θα εκτυπωθούν (1 ή 999).</translation> +<translation id="2182253583899676504">Το κείμενο που πληκτρολογείτε σε πεδία κειμένου θα αποσταλεί στην Google.</translation> <translation id="2184515124301515068">Επιτρέψτε στο Chrome να επιλέξει πότε οι ιστότοποι μπορούν να αναπαράγουν ήχο (συνιστάται)</translation> <translation id="2187895286714876935">Σφάλμα εισαγωγής του πιστοποιητικού διακομιστή </translation> <translation id="2187906491731510095">Οι επεκτάσεις ενημερώθηκαν</translation> @@ -785,7 +787,9 @@ <translation id="2192505247865591433">Από:</translation> <translation id="2193365732679659387">Ρυθμίσεις αξιοπιστίας</translation> <translation id="2195729137168608510">Προστασία ηλεκτρονικού ταχυδρομείου</translation> +<translation id="2198757192731523470">Η Google μπορεί να χρησιμοποιεί το ιστορικό σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google.</translation> <translation id="2199298570273670671">Σφάλμα</translation> +<translation id="2199719347983604670">Δεδομένα από τον συγχρονισμό Chrome</translation> <translation id="2200094388063410062">Ηλεκτρονικό ταχυδρομείο</translation> <translation id="2200356397587687044">Το Chrome χρειάζεται άδεια για να συνεχίσει</translation> <translation id="2200603218210188859">Προτιμήσεις συσκευής USB</translation> @@ -850,7 +854,6 @@ <translation id="2280486287150724112">Δεξιό περιθώριο</translation> <translation id="2282146716419988068">Διαδικασία GPU</translation> <translation id="2282155092769082568">Αυτόματη διαμόρφωση URL</translation> -<translation id="2286841657746966508">Διεύθυνση τιμολόγησης</translation> <translation id="2288181517385084064">Εναλλαγή σε πρόγραμμα εγγραφής βίντεο</translation> <translation id="2288735659267887385">Ρυθμίσεις προσβασιμότητας</translation> <translation id="2292848386125228270">Εκκινήστε το <ph name="PRODUCT_NAME" /> ως απλός χρήστης. Εάν απαιτείται εκτέλεση ως ρίζας για ανάπτυξη, εκτελέστε το ξανά με την ετικέτα --no-sandbox.</translation> @@ -1243,6 +1246,7 @@ <translation id="2889064240420137087">Άνοιγμα συνδέσμου με...</translation> <translation id="2889925978073739256">Συνέχιση αποκλεισμού προσθηκών εκτός περιβάλλοντος δοκιμών</translation> <translation id="2893168226686371498">Προεπιλεγμένο πρόγραμμα περιήγησης</translation> +<translation id="2895734772884435517">Μπορείτε να προσαρμόσετε αυτές τις ρυθμίσεις ανά πάσα στιγμή.</translation> <translation id="289644616180464099">Η κάρτα SIM είναι κλειδωμένη</translation> <translation id="289695669188700754">Αναγνωριστικό κλειδιού: <ph name="KEY_ID" /></translation> <translation id="2897878306272793870">Είστε βέβαιοι ότι θέλετε να ανοίξετε <ph name="TAB_COUNT" /> καρτέλες;</translation> @@ -1711,6 +1715,7 @@ <translation id="3636096452488277381">Γεια σας, <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" />% - Απομένει <ph name="TIME" /></translation> <translation id="3637682276779847508">Η κάρτα SIM θα απενεργοποιηθεί οριστικά αν δεν καταφέρετε να πληκτρολογήσετε το σωστό κλειδί ξεκλειδώματος PIN.</translation> +<translation id="363863692969456324">Διορθώστε τα ορθογραφικά λάθη με τον βελτιωμένο ορθογραφικό έλεγχο</translation> <translation id="3640214691812501263">Προσθήκη "<ph name="EXTENSION_NAME" />" για <ph name="USER_NAME" />;</translation> <translation id="3644896802912593514">Πλάτος</translation> <translation id="3645372836428131288">Μετακινήστε ελαφρώς για να αποτυπώσετε ένα διαφορετικό τμήμα του δακτυλικού αποτυπώματος.</translation> @@ -2143,6 +2148,7 @@ <translation id="4310139701823742692">Λανθασμένη μορφή αρχείου. Ελέγξτε το αρχείο PPD και δοκιμάστε ξανά.</translation> <translation id="431076611119798497">&Λεπτομέρειες</translation> <translation id="4312866146174492540">Αποκλεισμός (προεπιλογή)</translation> +<translation id="4314815835985389558">Διαχείριση συγχρονισμού</translation> <translation id="4316850752623536204">Ιστότοπος προγραμματιστή</translation> <translation id="4320177379694898372">Χωρίς σύνδεση στο διαδίκτυο</translation> <translation id="4320948194796820126">Προσθήκη σελιδοδείκτη στο ηλεκτρονικό ταχυδρομείο σας</translation> @@ -2222,6 +2228,7 @@ <translation id="4450974146388585462">Διάγνωση</translation> <translation id="4451757071857432900">Αποκλεισμένες σε ιστότοπους που εμφανίζουν παρεμβατικές ή παραπλανητικές διαφημίσεις (συνιστάται)</translation> <translation id="4453946976636652378">Αναζητήστε στο <ph name="SEARCH_ENGINE_NAME" /> ή πληκτρολογήστε κάποιο URL</translation> +<translation id="4461835665417498653">Αποστέλλει ανώνυμα ορισμένες πληροφορίες συστήματος και περιεχόμενο σελίδων στην Google.</translation> <translation id="4462159676511157176">Προσαρμοσμένοι διακομιστές ονομάτων</translation> <translation id="4467101674048705704">Ανάπτυξη <ph name="FOLDER_NAME" /></translation> <translation id="4469477701382819144">Αποκλεισμένες σε ιστότοπους που εμφανίζουν παρεμβατικές ή παραπλανητικές διαφημίσεις</translation> @@ -2386,6 +2393,7 @@ <translation id="4735265153267957659">Εισαγάγετε τον κωδικό πρόσβασής σας για την ενεργοποίηση του Smart Lock. Την επόμενη φορά, το τηλέφωνό σας θα ξεκλειδώσει τη συσκευή <ph name="DEVICE_TYPE" />. Απενεργοποιήστε το Smart Lock στις Ρυθμίσεις.</translation> <translation id="473546211690256853">Η διαχείριση αυτού του λογαριασμού γίνεται από τον τομέα <ph name="DOMAIN" />.</translation> <translation id="4735803855089279419">Το σύστημα δεν κατάφερε να προσδιορίσει αναγνωριστικά συσκευής για αυτήν τη συσκευή.</translation> +<translation id="4736292055110123391">Συγχρονίστε τους σελιδοδείκτες, τους κωδικούς πρόσβασης, το ιστορικό σας και άλλο περιεχόμενο σε όλες τις συσκευές σας</translation> <translation id="4737715515457435632">Συνδεθείτε σε ένα δίκτυο</translation> <translation id="473775607612524610">Ενημέρωση</translation> <translation id="4742746985488890273">Καρφίτσωμα στο ράφι</translation> @@ -2724,6 +2732,7 @@ <translation id="5266113311903163739">Σφάλμα εισαγωγής της Αρχής Πιστοποίησης</translation> <translation id="5269977353971873915">Η εκτύπωση απέτυχε</translation> <translation id="5270167208902136840">Εμφάνιση <ph name="NUMBER_OF_MORE_APPS" /> επιπλέον εφαρμογών</translation> +<translation id="5272654297705279635">Προσαρμοσμένες ρυθμίσεις</translation> <translation id="5275352920323889391">Σκύλος</translation> <translation id="5275973617553375938">Ανακτημένα αρχεία από το Google Drive</translation> <translation id="527605982717517565">Να επιτρέπεται πάντα το JavaScript στο <ph name="HOST" /></translation> @@ -4896,6 +4905,7 @@ <translation id="8598453409908276158">Η προσθήκη εκτός περιβάλλοντος δοκιμών αποκλείστηκε</translation> <translation id="8601206103050338563">Έλεγχος ταυτότητας πελάτη TLS WWW</translation> <translation id="8602851771975208551">Κάποιο άλλο πρόγραμμα στον υπολογιστή σας πρόσθεσε μια εφαρμογή, η οποία ενδέχεται να αλλάξει τον τρόπο λειτουργίας του Chrome.</translation> +<translation id="8604763363205185560">Συμβάλλετε στη βελτίωση του Chrome και της ασφάλειάς του</translation> <translation id="8605428685123651449">Μνήμη SQLite</translation> <translation id="8606726445206553943">Χρήση των συσκευών σας MIDI</translation> <translation id="8609465669617005112">Μετακίνηση προς τα επάνω</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 02dbe4e..474cc07 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Right margin</translation> <translation id="2282146716419988068">GPU Process</translation> <translation id="2282155092769082568">Auto-configuration URL:</translation> -<translation id="2286841657746966508">Billing address</translation> <translation id="2288181517385084064">Switch to video recorder</translation> <translation id="2288735659267887385">Accessibility settings</translation> <translation id="2292848386125228270">Please start <ph name="PRODUCT_NAME" /> as a normal user. If you need to run as root for development, re-run with the – no-sandbox flag.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 9c862ef7..04145af6 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -847,7 +847,6 @@ <translation id="2280486287150724112">Margen derecho</translation> <translation id="2282146716419988068">Proceso de GPU</translation> <translation id="2282155092769082568">URL de autoconfiguración:</translation> -<translation id="2286841657746966508">Dirección de facturación</translation> <translation id="2288181517385084064">Cambiar a la grabadora de video</translation> <translation id="2288735659267887385">Configuración de accesibilidad</translation> <translation id="2292848386125228270">Inicia <ph name="PRODUCT_NAME" /> como usuario normal. Si necesitas ejecutarlo como administrador para su desarrollo, vuelve a ejecutarlo con la marca --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index c066a8d..aad4343 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Margen derecho</translation> <translation id="2282146716419988068">Proceso de GPU</translation> <translation id="2282155092769082568">URL de configuración automática:</translation> -<translation id="2286841657746966508">Dirección de facturación</translation> <translation id="2288181517385084064">Cambiar al modo de cámara de vídeo</translation> <translation id="2288735659267887385">Configuración de accesibilidad</translation> <translation id="2292848386125228270">Inicia <ph name="PRODUCT_NAME" /> como un usuario normal. Si debes ejecutarlo como root para el desarrollo, vuelve a iniciarlo con el indicador "--no-sandbox".</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 1401b66..b595870 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Parem veeris</translation> <translation id="2282146716419988068">GPU-protsess</translation> <translation id="2282155092769082568">Automaatse konfigureerimise URL:</translation> -<translation id="2286841657746966508">Arveldusaadress</translation> <translation id="2288181517385084064">Lülitu videosalvestile</translation> <translation id="2288735659267887385">Juurdepääsetavuse seaded</translation> <translation id="2292848386125228270">Käivitage teenus <ph name="PRODUCT_NAME" /> tavakasutajana. Kui soovite arendamiseks käivitada juurversiooni, käivitage uuesti märgistusega --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index f70f6810..6e99f71 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -851,7 +851,6 @@ <translation id="2280486287150724112">حاشیه راست</translation> <translation id="2282146716419988068">پردازش GPU</translation> <translation id="2282155092769082568">نشانی وب پیکربندی خودکار</translation> -<translation id="2286841657746966508">آدرس ارسال صورتحساب</translation> <translation id="2288181517385084064">رفتن به ضبطکننده ویدیو</translation> <translation id="2288735659267887385">تنظیمات دسترسپذیری</translation> <translation id="2292848386125228270">لطفاً <ph name="PRODUCT_NAME" /> را بهعنوان یک کاربر معمولی راهاندازی کنید. اگر میخواهید آن را بهعنوان ریشه برای طراحی اجرا کنید، با پرچم no-sandbox آن را دوباره اجرا کنید.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index ddae1188..fb18e93b 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Oikea reuna</translation> <translation id="2282146716419988068">GPU-prosessi</translation> <translation id="2282155092769082568">Automaattisen määrityksen URL-osoite:</translation> -<translation id="2286841657746966508">Laskutusosoite</translation> <translation id="2288181517385084064">Vaihda videokameraan</translation> <translation id="2288735659267887385">Esteettömyysasetukset</translation> <translation id="2292848386125228270">Käynnistä <ph name="PRODUCT_NAME" /> tavallisena käyttäjänä. Jos sinun on käytettävä sitä pääkäyttäjänä, käynnistä se uudelleen --no-sandbox-merkinnän kanssa.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 6d8d456..3a174dfa 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -764,6 +764,7 @@ <translation id="215753907730220065">Umalis sa Full Screen</translation> <translation id="2157875535253991059">Full screen na ngayon ang pahinang ito.</translation> <translation id="216169395504480358">Magdagdag ng Wi-Fi...</translation> +<translation id="2162155940152307086">Magsisimula ang pag-sync sa sandaling umalis ka sa mga setting ng pag-sync</translation> <translation id="2163470535490402084">Mangyaring kumonekta sa Internet upang mag-sign in sa iyong <ph name="DEVICE_TYPE" />.</translation> <translation id="2166369534954157698">The quick brown fox jumps over the lazy dog</translation> <translation id="2169062631698640254">Mag-sign in pa rin</translation> @@ -774,6 +775,7 @@ <translation id="2178098616815594724">Gustong i-access ng <ph name="PEPPER_PLUGIN_NAME" /> sa <ph name="PEPPER_PLUGIN_DOMAIN" /> ang iyong computer</translation> <translation id="2178614541317717477">CA Compromise</translation> <translation id="218070003709087997">Gumamit ng numero upang maisaad kung gaano karaming kopya ang ipi-print (1 hanggang 999).</translation> +<translation id="2182253583899676504">Ipapadala sa Google ang text na ita-type mo.</translation> <translation id="2184515124301515068">Hayaan ang Chrome na pumili kung kailan makakapag-play ng tunog ang mga site (inirerekomenda)</translation> <translation id="2187895286714876935">Error sa Pag-import ng Certificate ng Server</translation> <translation id="2187906491731510095">Na-update ang mga extension</translation> @@ -785,7 +787,9 @@ <translation id="2192505247865591433">Mula:</translation> <translation id="2193365732679659387">Mga setting ng pagtitiwala</translation> <translation id="2195729137168608510">Proteksyon sa Email</translation> +<translation id="2198757192731523470">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search, mga ad at iba pang serbisyo ng Google.</translation> <translation id="2199298570273670671">Nagka-error</translation> +<translation id="2199719347983604670">Data mula sa Chrome sync</translation> <translation id="2200094388063410062">I-email</translation> <translation id="2200356397587687044">Kailangan ng Chrome ng pahintulot upang magpatuloy</translation> <translation id="2200603218210188859">Mga kagustuhan sa USB Device</translation> @@ -850,7 +854,6 @@ <translation id="2280486287150724112">Kanang margin</translation> <translation id="2282146716419988068">Proseso ng GPU</translation> <translation id="2282155092769082568">Autoconfiguration URL:</translation> -<translation id="2286841657746966508">Billing address</translation> <translation id="2288181517385084064">Lumipat sa video recorder</translation> <translation id="2288735659267887385">Mga setting ng pagiging naa-access</translation> <translation id="2292848386125228270">Pakisimulan ang <ph name="PRODUCT_NAME" /> bilang isang normal na user. Kung kailangan mong patakbuhin bilang isang root para sa pag-develop, muling patakbuhin gamit ang flag na --no-sandbox.</translation> @@ -1243,6 +1246,7 @@ <translation id="2889064240420137087">Buksan ang link gamit ang...</translation> <translation id="2889925978073739256">Patuloy na i-block ang mga hindi naka-sandbox na plugin</translation> <translation id="2893168226686371498">Default na browser</translation> +<translation id="2895734772884435517">Maaari mong i-customize ang mga setting na ito anumang oras.</translation> <translation id="289644616180464099">Naka-lock ang SIM Card</translation> <translation id="289695669188700754">Key ID: <ph name="KEY_ID" /></translation> <translation id="2897878306272793870">Sigurado ka bang gusto mong buksan ang <ph name="TAB_COUNT" /> tab?</translation> @@ -1711,6 +1715,7 @@ <translation id="3636096452488277381">Kamusta, <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" />% - <ph name="TIME" /> na lang ang natitira</translation> <translation id="3637682276779847508">Permanenteng madi-disable ang iyong SIM card kung hindi mo mailalagay ang tamang PIN Unlock Key.</translation> +<translation id="363863692969456324">Mag-ayos ng mga error sa spelling sa pamamagitan ng pinahusay na pang-check ng pagbabaybay</translation> <translation id="3640214691812501263">Idagdag ang "<ph name="EXTENSION_NAME" />" para sa <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Lapad</translation> <translation id="3645372836428131288">Gumalaw nang bahagya para mag-capture ng ibang bahagi ng fingerprint.</translation> @@ -2143,6 +2148,7 @@ <translation id="4310139701823742692">Nasa maling format ang file. Tingnan ang PPD file at subukang muli.</translation> <translation id="431076611119798497">&Mga Detalye</translation> <translation id="4312866146174492540">I-block (default)</translation> +<translation id="4314815835985389558">Pamahalaan ang pag-sync</translation> <translation id="4316850752623536204">Website ng Developer</translation> <translation id="4320177379694898372">Walang koneksyon sa internet</translation> <translation id="4320948194796820126">Magdagdag ng bookmark sa email mo</translation> @@ -2222,6 +2228,7 @@ <translation id="4450974146388585462">I-diagnose</translation> <translation id="4451757071857432900">Naka-block sa mga site na nagpapakita ng mga nakakasagabal o nakakapanlinlang na ad (inirerekomenda)</translation> <translation id="4453946976636652378">Maghanap sa <ph name="SEARCH_ENGINE_NAME" /> o mag-type ng URL</translation> +<translation id="4461835665417498653">Anonymous na nagpapadala ng ilang impormasyon ng system at content ng page sa Google.</translation> <translation id="4462159676511157176">Custom na mga server ng pangalan</translation> <translation id="4467101674048705704">I-expand ang <ph name="FOLDER_NAME" /></translation> <translation id="4469477701382819144">Naka-block sa mga site na nagpapakita ng mga nakakasagabal at nakakapanlinlang na ad</translation> @@ -2386,6 +2393,7 @@ <translation id="4735265153267957659">Ilagay ang iyong password para i-enable ang Smart Lock. Sa susunod, ia-unlock ng iyong telepono ang <ph name="DEVICE_TYPE" /> mo. I-off ang Smart Lock sa Mga Setting.</translation> <translation id="473546211690256853">Pinamamahalaan ang account na ito ng <ph name="DOMAIN" /></translation> <translation id="4735803855089279419">Hindi natukoy ng system ang mga pagkakakilanlan ng device para sa device na ito.</translation> +<translation id="4736292055110123391">I-sync ang iyong mga bookmark, password, history, at higit pa sa lahat ng device mo</translation> <translation id="4737715515457435632">Mangyaring kumonekta sa isang network.</translation> <translation id="473775607612524610">I-update</translation> <translation id="4742746985488890273">I-pin sa Shelf</translation> @@ -2724,6 +2732,7 @@ <translation id="5266113311903163739">Error sa Pag-import ng Certification Authority</translation> <translation id="5269977353971873915">Nabigo ang Pag-print</translation> <translation id="5270167208902136840">Magpakita ng <ph name="NUMBER_OF_MORE_APPS" /> pang app</translation> +<translation id="5272654297705279635">Mga custom na setting</translation> <translation id="5275352920323889391">Aso</translation> <translation id="5275973617553375938">Mga nabawing file mula sa Google Drive</translation> <translation id="527605982717517565">Palaging hayaan ang JavaScript sa <ph name="HOST" /></translation> @@ -4896,6 +4905,7 @@ <translation id="8598453409908276158">Na-block ang hindi naka-sandbox na plugin</translation> <translation id="8601206103050338563">Pagpapatotoo ng Client sa TLS WWW</translation> <translation id="8602851771975208551">Ang isa pang program sa iyong computer ay nagdagdag ng app na maaaring magpabago sa paraan ng paggana ng Chrome.</translation> +<translation id="8604763363205185560">Tumulong na pahusayin ang Chrome at ang seguridad nito</translation> <translation id="8605428685123651449">Memory ng SQLite</translation> <translation id="8606726445206553943">Gamitin ang iyong mga MIDI device</translation> <translation id="8609465669617005112">Lumipat</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 5ac5683..6495811c 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Marge droite</translation> <translation id="2282146716419988068">GPU</translation> <translation id="2282155092769082568">URL de configuration automatique :</translation> -<translation id="2286841657746966508">Adresse de facturation</translation> <translation id="2288181517385084064">Passer en mode enregistreur vidéo</translation> <translation id="2288735659267887385">Paramètres d'accessibilité</translation> <translation id="2292848386125228270">Veuillez démarrer <ph name="PRODUCT_NAME" /> en mode utilisateur standard. Si vous devez l'exécuter à la racine dans le cadre du développement, relancez-le avec l'indicateur --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 37e2d4b7..7259194 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">જમણો હાસિયો</translation> <translation id="2282146716419988068">GPU પ્રક્રિયા</translation> <translation id="2282155092769082568">સ્વતઃગોઠવણી URL:</translation> -<translation id="2286841657746966508">બિલિંગ સરનામું</translation> <translation id="2288181517385084064">વીડિયો રેકોર્ડર પર સ્વિચ કરો</translation> <translation id="2288735659267887385">ઍક્સેસિબિલિટી સેટિંગ્સ</translation> <translation id="2292848386125228270">કૃપા કરીને એક સામાન્ય વપરાશકર્તા તરીકે <ph name="PRODUCT_NAME" /> શરૂ કરો. જો તમને ડેવલપમેન્ટ માટે રૂટ તરીકે ચલાવવાની જરૂર હોય, તો --no-sandbox ચિહ્ન સાથે ફરીથી ચલાવો.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 8cbb303..0ce5f2e 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">दायां हाशिया</translation> <translation id="2282146716419988068">GPU प्रक्रिया</translation> <translation id="2282155092769082568">URL का अपने आप कॉन्फ़िगरेशन:</translation> -<translation id="2286841657746966508">बिलिंग पता</translation> <translation id="2288181517385084064">वीडियो रिकॉर्डर पर स्विच करें</translation> <translation id="2288735659267887385">एक्सेस-योग्यता सेटिंग</translation> <translation id="2292848386125228270">कृपया <ph name="PRODUCT_NAME" /> को सामान्य उपयोगकर्ता की तरह शुरू करें. अगर आपको डेवलपमेंट के लिए रूट के रूप में चलाना है तो, --no-sandbox फ़्लैग के साथ फिर से चलाएं.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 20eb5b3..9aa4dfd 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Desna margina</translation> <translation id="2282146716419988068">GPU proces</translation> <translation id="2282155092769082568">URL za automatsku konfiguraciju:</translation> -<translation id="2286841657746966508">Adresa za naplatu</translation> <translation id="2288181517385084064">Prijeđi na videorekorder</translation> <translation id="2288735659267887385">Postavke pristupačnosti</translation> <translation id="2292848386125228270">Pokrenite <ph name="PRODUCT_NAME" /> kao običan korisnik. Ako ga trebate pokrenuti kao korijenski direktorij radi razvoja, pokrenite ga ponovo s oznakom --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index d2374ab..9e16996 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Jobb margó</translation> <translation id="2282146716419988068">GPU-folyamat</translation> <translation id="2282155092769082568">URL automatikus konfigurációja:</translation> -<translation id="2286841657746966508">Számlázási cím</translation> <translation id="2288181517385084064">Váltás videófelvevőre</translation> <translation id="2288735659267887385">Kisegítő beállítások</translation> <translation id="2292848386125228270">Indítsa el a <ph name="PRODUCT_NAME" /> alkalmazást normál felhasználóként. Ha a fejlesztéshez rootként kell futtatnia, futtassa a --no-sandbox jelző használatával.</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index f1ea019c..1cfc12c 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Batas kanan</translation> <translation id="2282146716419988068">Proses GPU</translation> <translation id="2282155092769082568">URL konfigurasi otomatis:</translation> -<translation id="2286841657746966508">Alamat penagihan</translation> <translation id="2288181517385084064">Beralih ke perekam video</translation> <translation id="2288735659267887385">Setelan aksesibilitas</translation> <translation id="2292848386125228270">Mulai <ph name="PRODUCT_NAME" /> sebagai pengguna normal. Jika perlu menjalankan sebagai root untuk pengembangan, jalankan ulang dengan tanda tanpa sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 04d8d2f..460d8941 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -764,6 +764,7 @@ <translation id="215753907730220065">Esci da schermo intero</translation> <translation id="2157875535253991059">Questa pagina ora è a schermo intero.</translation> <translation id="216169395504480358">Aggiungi Wi-Fi...</translation> +<translation id="2162155940152307086">La sincronizzazione inizierà quando esci dalle impostazioni di sincronizzazione</translation> <translation id="2163470535490402084">Connettiti a Internet per accedere al tuo <ph name="DEVICE_TYPE" />.</translation> <translation id="2166369534954157698">Pranzo d'acqua fa volti sghembi</translation> <translation id="2169062631698640254">Accedi comunque</translation> @@ -774,6 +775,7 @@ <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_NAME" /> su <ph name="PEPPER_PLUGIN_DOMAIN" /> vuole accedere al computer</translation> <translation id="2178614541317717477">Compromesso CA</translation> <translation id="218070003709087997">Specifica un numero per indicare la quantità di copie da stampare (da 1 a 999).</translation> +<translation id="2182253583899676504">Il testo che digiti nei campi di testo viene inviato a Google.</translation> <translation id="2184515124301515068">Consenti a Chrome di scegliere quando i siti possono riprodurre audio (opzione consigliata)</translation> <translation id="2187895286714876935">Errore di importazione del certificato del server</translation> <translation id="2187906491731510095">Estensioni aggiornate</translation> @@ -785,7 +787,9 @@ <translation id="2192505247865591433">Da:</translation> <translation id="2193365732679659387">Impostazioni di attendibilità</translation> <translation id="2195729137168608510">Protezione email</translation> +<translation id="2198757192731523470">Google può utilizzare la tua cronologia per personalizzare la Ricerca, gli annunci e altri servizi Google.</translation> <translation id="2199298570273670671">Errore</translation> +<translation id="2199719347983604670">Dati dalla Sincronizzazione Chrome</translation> <translation id="2200094388063410062">Email</translation> <translation id="2200356397587687044">Chrome ha bisogno dell'autorizzazione per continuare</translation> <translation id="2200603218210188859">Preferenze per il dispositivo USB</translation> @@ -850,7 +854,6 @@ <translation id="2280486287150724112">Margine destro</translation> <translation id="2282146716419988068">Processo GPU</translation> <translation id="2282155092769082568">URL di configurazione automatica:</translation> -<translation id="2286841657746966508">Indirizzo di fatturazione</translation> <translation id="2288181517385084064">Passa al videoregistratore</translation> <translation id="2288735659267887385">Impostazioni di accessibilità</translation> <translation id="2292848386125228270">Avvia <ph name="PRODUCT_NAME" /> come utente normale. Per eseguirlo come root a fini di sviluppo, esegui di nuovo il flag --no-sandbox.</translation> @@ -1241,6 +1244,7 @@ <translation id="2889064240420137087">Apri link con...</translation> <translation id="2889925978073739256">Continua a bloccare i plug-in senza sandbox</translation> <translation id="2893168226686371498">Browser predefinito</translation> +<translation id="2895734772884435517">Puoi personalizzare queste impostazioni in qualsiasi momento.</translation> <translation id="289644616180464099">La scheda SIM è bloccata</translation> <translation id="289695669188700754">ID chiave: <ph name="KEY_ID" /></translation> <translation id="2897878306272793870">Aprire <ph name="TAB_COUNT" /> schede?</translation> @@ -1707,6 +1711,7 @@ <translation id="3636096452488277381">Salve <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" />% - <ph name="TIME" /> rimanenti</translation> <translation id="3637682276779847508">La scheda SIM verrà definitivamente disabilitata se non sei in grado di inserire il codice di sblocco PIN corretto.</translation> +<translation id="363863692969456324">Correggi gli errori ortografici con il controllo ortografico avanzato</translation> <translation id="3640214691812501263">Aggiungere "<ph name="EXTENSION_NAME" />" per <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Larghezza</translation> <translation id="3645372836428131288">Muovi leggermente il dito per acquisire una parte diversa dell'impronta digitale.</translation> @@ -2139,6 +2144,7 @@ <translation id="4310139701823742692">Il formato del file è sbagliato. Controlla il file PPD e riprova.</translation> <translation id="431076611119798497">&Dettagli</translation> <translation id="4312866146174492540">Blocca (predefinita)</translation> +<translation id="4314815835985389558">Gestisci sincronizzazione</translation> <translation id="4316850752623536204">Sito web dello sviluppatore</translation> <translation id="4320177379694898372">Nessuna connessione Internet</translation> <translation id="4320948194796820126">Aggiungi il servizio email ai preferiti</translation> @@ -2218,6 +2224,7 @@ <translation id="4450974146388585462">Diagnostica</translation> <translation id="4451757071857432900">Bloccati sui siti che mostrano annunci invasivi o fuorvianti (consigliato)</translation> <translation id="4453946976636652378">Cerca su <ph name="SEARCH_ENGINE_NAME" /> o digita un URL</translation> +<translation id="4461835665417498653">Invia in forma anonima a Google alcune informazioni sul sistema e alcuni contenuti delle pagine</translation> <translation id="4462159676511157176">Assegna nomi personalizzati a server</translation> <translation id="4467101674048705704">Espandi <ph name="FOLDER_NAME" /></translation> <translation id="4469477701382819144">Bloccati sui siti che mostrano annunci invasivi o fuorvianti</translation> @@ -2382,6 +2389,7 @@ <translation id="4735265153267957659">Inserisci la password per attivare Smart Lock. La prossima volta potrai sbloccare il tuo dispositivo <ph name="DEVICE_TYPE" /> con il telefono. Disattiva Smart Lock nelle Impostazioni.</translation> <translation id="473546211690256853">Questo account è gestito da <ph name="DOMAIN" /></translation> <translation id="4735803855089279419">Il sistema non è riuscito a stabilire gli identificatori di questo dispositivo.</translation> +<translation id="4736292055110123391">Sincronizza i preferiti, le password, la cronologia e non solo su tutti i tuoi dispositivi</translation> <translation id="4737715515457435632">Collegati a una rete</translation> <translation id="473775607612524610">Aggiorna</translation> <translation id="4742746985488890273">Fissa sullo shelf</translation> @@ -2719,6 +2727,7 @@ <translation id="5266113311903163739">Errore di importazione dell'autorità di certificazione</translation> <translation id="5269977353971873915">Stampa non riuscita</translation> <translation id="5270167208902136840">Mostra altre <ph name="NUMBER_OF_MORE_APPS" /> app</translation> +<translation id="5272654297705279635">Impostazioni personalizzate</translation> <translation id="5275352920323889391">Cane</translation> <translation id="5275973617553375938">File recuperati da Google Drive</translation> <translation id="527605982717517565">Consenti sempre JavaScript su <ph name="HOST" /></translation> @@ -4887,6 +4896,7 @@ <translation id="8598453409908276158">Plug-in senza sandbox bloccato</translation> <translation id="8601206103050338563">Autenticazione TLS client WWW</translation> <translation id="8602851771975208551">Un altro programma sul computer ha aggiunto un'applicazione che potrebbe modificare il funzionamento di Chrome.</translation> +<translation id="8604763363205185560">Contribuisci a migliorare Chrome e la sua sicurezza</translation> <translation id="8605428685123651449">Memoria SQLite</translation> <translation id="8606726445206553943">Utilizzare i tuoi dispositivi MIDI</translation> <translation id="8609465669617005112">Sposta su</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 02cb9f7..520873f 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -159,7 +159,7 @@ <ph name="BR" /> עליך להגדיר את הפרופיל פעם נוספת.<ph name="BR" /> <ph name="BR" /> - במסך הבא, שלח אלינו משוב כדי לעזור לנו לתקן את הבעיה.</translation> + במסך הבא ניתן לשלוח אלינו משוב כדי לעזור לנו לתקן את הבעיה.</translation> <translation id="1217668622537098248">חזרה ללחיצה שמאלית אחרי פעולה</translation> <translation id="121783623783282548">הסיסמאות אינן תואמות.</translation> <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />שירות המיקום של Google נעזר במקורות כגון Wi‑Fi, רשתות סלולריות וחיישנים כדי להעריך את מיקום המכשיר הזה.<ph name="END_PARAGRAPH1" /> @@ -307,7 +307,7 @@ <translation id="1444628761356461360">ההגדרה הזו מנוהלת על ידי בעל המכשיר, <ph name="OWNER_EMAIL" />.</translation> <translation id="144518587530125858">לא ניתן להעלות את '<ph name="IMAGE_PATH" />' עבור עיצוב.</translation> <translation id="1451375123200651445">דף אינטרנט, קובץ אחד</translation> -<translation id="1451917004835509682">הוסף משתמש בפיקוח</translation> +<translation id="1451917004835509682">הוספת משתמש בפיקוח</translation> <translation id="1454223536435069390">צלם מסך</translation> <translation id="1459967076783105826">התוספים הוסיפו מנועי חיפוש</translation> <translation id="146000042969587795">מסגרת זו נחסמה משום שהיא מכילה תוכן לא בטוח.</translation> @@ -472,7 +472,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1698122934742150150">הפעלה נוכחית בלבד במצב גלישה בסתר</translation> <translation id="1698650002254827833">אי אפשר לטעון את רשימת האפליקציות. צריך לנסות שוב.</translation> -<translation id="1701062906490865540">הסר משתמש זה</translation> +<translation id="1701062906490865540">הסרת משתמש זה</translation> <translation id="1706586824377653884">נוסף על ידי מנהל המערכת שלך</translation> <translation id="1706625117072057435">רמות מרחק מתצוגה</translation> <translation id="1708338024780164500">(לא פעיל)</translation> @@ -672,7 +672,7 @@ <translation id="2007404777272201486">דיווח על בעיה...</translation> <translation id="2016430552235416146">מסורתית</translation> <translation id="2017334798163366053">השבת איסוף של נתוני ביצועים</translation> -<translation id="2017836877785168846">מנקה את ההיסטוריה וההשלמות האוטומטיות בסרגל הכתובות</translation> +<translation id="2017836877785168846">ניקוי של ההיסטוריה וההשלמות האוטומטיות בשורת כתובת האתר</translation> <translation id="2018352199541442911">מצטערים, מכשיר האחסון החיצוני שלך אינו נתמך בשלב זה.</translation> <translation id="2019718679933488176">&פתח שמע בכרטיסייה חדשה</translation> <translation id="2020183425253392403">הצג את ההגדרות של כתובת הרשת</translation> @@ -727,7 +727,7 @@ <translation id="2113921862428609753">גישה לפרטי רשות</translation> <translation id="2114326799768592691">טען מחדש את ה&מסגרת</translation> <translation id="2114896190328250491">צילום מאת <ph name="NAME" /></translation> -<translation id="2115103655317273167">שלח לטלפון</translation> +<translation id="2115103655317273167">שליחה לטלפון</translation> <translation id="2119349053129246860">פתיחה באמצעות <ph name="APP" /></translation> <translation id="2120297377148151361">פעילות ואינטראקציות</translation> <translation id="2121825465123208577">שנה גודל</translation> @@ -792,7 +792,7 @@ <translation id="2200603218210188859">העדפות התקני USB</translation> <translation id="220138918934036434">לחצן הסתר</translation> <translation id="2202898655984161076">היתה בעיה ברישום מדפסות. ייתכן שחלק מהמדפסות שלך לא נרשמו בהצלחה ב-<ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="2203682048752833055">מנוע החיפוש שבאמצעותו מבוצע חיפוש מ<ph name="BEGIN_LINK" />סרגל הכתובות<ph name="END_LINK" /></translation> +<translation id="2203682048752833055">מנוע החיפוש שבאמצעותו מבוצע חיפוש מ<ph name="BEGIN_LINK" />שורת כתובת האתר<ph name="END_LINK" /></translation> <translation id="2204034823255629767">לקרוא ולשנות את כל מה שאתה מקליד</translation> <translation id="2208158072373999562">ארכיון Zip</translation> <translation id="220858061631308971">הזן את קוד PIN זה ב-"<ph name="DEVICE_NAME" />":</translation> @@ -820,7 +820,7 @@ <translation id="2233502537820838181">&מידע נוסף</translation> <translation id="2234876718134438132">סנכרון ושירותי Google</translation> <translation id="2238379619048995541">נתוני מצב תדירות</translation> -<translation id="2239921694246509981">הוסף משתמש בפיקוח</translation> +<translation id="2239921694246509981">הוספת משתמש בפיקוח</translation> <translation id="2241053333139545397">לקרוא ולשנות את הנתונים שלך במספר אתרים</translation> <translation id="2242687258748107519">פרטי קובץ</translation> <translation id="224940702122312781">הדף הזה יצרוך הרבה נתונים.</translation> @@ -851,7 +851,6 @@ <translation id="2280486287150724112">שוליים ימניים</translation> <translation id="2282146716419988068">תהליך GPU</translation> <translation id="2282155092769082568">כתובת אתר של תצורה אוטומטית:</translation> -<translation id="2286841657746966508">כתובת לחיוב</translation> <translation id="2288181517385084064">מעבר למקליט וידאו</translation> <translation id="2288735659267887385">הגדרות של נגישות</translation> <translation id="2292848386125228270">הפעל את <ph name="PRODUCT_NAME" /> כמשתמש רגיל. אם תצטרך להפעיל כבסיס לצורך פיתוח, הפעל מחדש עם הסימון --no-sandbox.</translation> @@ -919,7 +918,7 @@ <translation id="2391762656119864333">בטל</translation> <translation id="2392369802118427583">הפעל</translation> <translation id="2394566832561516196">ההגדרות יימחקו בפעם הבאה שתבוצה טעינה מחדש.</translation> -<translation id="2395616325548404795">רישום המכשיר שלך <ph name="DEVICE_TYPE" /> לניהול ארגוני הסתיים בהצלחה, אך השליחה של פרטי הנכס והמיקום שלו נכשלה. הזן את המידע הזה ידנית במסוף הניהול של המכשיר.</translation> +<translation id="2395616325548404795">רישום המכשיר שלך <ph name="DEVICE_TYPE" /> לניהול ארגוני הסתיים בהצלחה, אך השליחה של פרטי הנכס והמיקום שלו נכשלה. יש להזין את המידע הזה ידנית במסוף הניהול של המכשיר.</translation> <translation id="240770291734945588"><ph name="SPACE_AVAILABLE" /> זמין</translation> <translation id="2408955596600435184">הזן את מספר ה-PIN</translation> <translation id="241082044617551207">פלאגין לא ידוע</translation> @@ -1321,7 +1320,7 @@ <translation id="3011488081941333749">קובצי Cookie מ-<ph name="DOMAIN" /> יימחקו בעת היציאה</translation> <translation id="3012631534724231212">(iframe)</translation> <translation id="3012804260437125868">חיבורים מאובטחים מאותו אתר בלבד</translation> -<translation id="3012917896646559015">צור קשר עם יצרן החומרה באופן מיידי כדי לשלוח את המחשב לתיקון.</translation> +<translation id="3012917896646559015">יש ליצור קשר עם יצרן החומרה באופן מיידי כדי לשלוח את המחשב לתיקון.</translation> <translation id="3013291976881901233">התקני MIDI</translation> <translation id="3015639418649705390">הפעלה מחדש עכשיו</translation> <translation id="3016641847947582299">הרכיב עודכן</translation> @@ -1543,7 +1542,7 @@ <translation id="3399432415385675819">הודעות יושבתו</translation> <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation> <translation id="3404065873681873169">לא נשמרו סיסמאות לאתר הזה</translation> -<translation id="340485819826776184">השתמש בשירות השלמות כדי לעזור בהשלמת חיפושים וכתובות אתר שמוקלדים בסרגל הכתובת</translation> +<translation id="340485819826776184">שימוש בשירות השלמות כדי לעזור בהשלמת חיפושים וכתובות URL שמוקלדים בשורת כתובת האתר</translation> <translation id="3405664148539009465">התאם אישית גופנים</translation> <translation id="3405763860805964263">...</translation> <translation id="3406605057700382950">&הצג את סרגל הסימניות</translation> @@ -1578,7 +1577,7 @@ <translation id="3441653493275994384">מסך</translation> <translation id="3445925074670675829">מכשיר עם יציאת USB-C</translation> <translation id="344630545793878684">קריאת הנתונים שלך במספר אתרים</translation> -<translation id="3449839693241009168">לחץ על <ph name="SEARCH_KEY" /> כדי לשלוח פקודות אל <ph name="EXTENSION_NAME" /></translation> +<translation id="3449839693241009168">יש ללחוץ על <ph name="SEARCH_KEY" /> כדי לשלוח פקודות אל <ph name="EXTENSION_NAME" /></translation> <translation id="3450157232394774192">אחוז תפוסה במצב לא פעיל</translation> <translation id="3453612417627951340">יש צורך באישור</translation> <translation id="3454157711543303649">ההפעלה הושלמה</translation> @@ -1604,7 +1603,7 @@ <translation id="3475843873335999118">המערכת עדיין לא מזהה את טביעת האצבע. הזן את הסיסמה שלך.</translation> <translation id="347670947055184738">אופס! המערכת לא הצליחה לשלוף מדיניות למכשיר שלך.</translation> <translation id="347785443197175480">המשך לאפשר ל-<ph name="HOST" /> לגשת למצלמה ולמיקרופון</translation> -<translation id="3478685642445675458">בטל את נעילת הפרופיל שלך לפני הסרה של אדם מסוים.</translation> +<translation id="3478685642445675458">יש לבטל את נעילת הפרופיל שלך לפני הסרה של משתמש מסוים.</translation> <translation id="3479552764303398839">לא עכשיו</translation> <translation id="3484273680291419129">מסיר תוכנה מזיקה...</translation> <translation id="3484869148456018791">קבל אישור חדש</translation> @@ -1914,7 +1913,7 @@ <translation id="392089482157167418">הפעל את ChromeVox (משוב קולי)</translation> <translation id="3924145049010392604">Meta</translation> <translation id="3925573269917483990">מצלמה:</translation> -<translation id="3925842537050977900">בטל את ההצמדה למדף</translation> +<translation id="3925842537050977900">ביטול הצמדה למדף</translation> <translation id="3926002189479431949">הטלפון המשמש ל-Smart Lock הוחלף</translation> <translation id="3927932062596804919">דחה</translation> <translation id="3930521966936686665">הפעל באמצעות</translation> @@ -1989,7 +1988,7 @@ <translation id="4035758313003622889">&מנהל המשימות</translation> <translation id="4036778507053569103">המדיניות שהורדה מהשרת אינה חוקית.</translation> <translation id="4037084878352560732">סוס</translation> -<translation id="4037889604535939429">עריכת פרטי אדם</translation> +<translation id="4037889604535939429">עריכת פרטי משתמש</translation> <translation id="4042264909745389898">תנאים של Google Chrome OS</translation> <translation id="4042863763121826131">{NUM_PAGES,plural, =1{יציאה מהדף}two{יציאה מהדפים}many{יציאה מהדפים}other{יציאה מהדפים}}</translation> <translation id="4044612648082411741">הזן את סיסמת האישור</translation> @@ -2076,7 +2075,7 @@ <translation id="4181841719683918333">שפות</translation> <translation id="4184885522552335684">גרור כדי להזיז צג</translation> <translation id="4193154014135846272">מסמך Google</translation> -<translation id="4194570336751258953">הפעל אפשרות של 'הקש ללחיצה'</translation> +<translation id="4194570336751258953">הפעלת האפשרות 'נגיעה קלה'</translation> <translation id="4195249722193633765">התקנת אפליקציה באמצעות Linux (בטא)</translation> <translation id="4195643157523330669">פתח בכרטיסייה חדשה</translation> <translation id="4195814663415092787">המשך מהמקום שבו הפסקת</translation> @@ -2130,7 +2129,7 @@ <translation id="4281844954008187215">תנאי שירות</translation> <translation id="4282196459431406533">Smart Lock מופעל</translation> <translation id="4285418559658561636">עדכון סיסמה</translation> -<translation id="4285498937028063278">בטל הצמדה</translation> +<translation id="4285498937028063278">ביטול הצמדה</translation> <translation id="428565720843367874">תוכנת האנטי-וירוס נכשלה באופן בלתי צפוי בעת סריקת קובץ זה.</translation> <translation id="4287502004382794929">אין ברשותך מספיק רשיונות תוכנה כדי לרשום מכשיר זה. פנה למחלקת המכירות כדי לרכוש עוד רשיונות. אם אתה סבור שהודעה זו מופיעה בטעות, צור קשר עם מחלקת התמיכה.</translation> <translation id="4289540628985791613">סקירה כללית</translation> @@ -2339,7 +2338,7 @@ <translation id="4647090755847581616">&סגור כרטיסייה</translation> <translation id="4647697156028544508">הזן PIN עבור "<ph name="DEVICE_NAME" />":</translation> <translation id="4648491805942548247">הרשאות לא מספיקות</translation> -<translation id="4648499713050786492">בטל את נעילת הפרופיל שלך לפני הוספה של אדם מסוים.</translation> +<translation id="4648499713050786492">יש לבטל את נעילת הפרופיל שלך לפני הוספה של משתמש מסוים.</translation> <translation id="4651484272688821107">לא ניתן לטעון רכיב מקוון עם משאבי מצב ההדגמה.</translation> <translation id="4656293982926141856">במחשב הזה</translation> <translation id="4660476621274971848">הגירסה הצפויה היא "<ph name="EXPECTED_VERSION" />", אבל הגירסה הייתה "<ph name="NEW_ID" />"</translation> @@ -3062,7 +3061,7 @@ <translation id="5750324801516359607">רחוק</translation> <translation id="5752453871435543420">גיבוי בענן של מערכת ההפעלה של Chrome</translation> <translation id="5756163054456765343">מרכז עזרה</translation> -<translation id="5759728514498647443">תוכל להשתמש ב-<ph name="APP_NAME" /> כדי לקרוא מסמכים שתשלח להדפסה באמצעות <ph name="APP_NAME" />.</translation> +<translation id="5759728514498647443">ניתן להשתמש ב-<ph name="APP_NAME" /> כדי לקרוא מסמכים ששולחים להדפסה באמצעות <ph name="APP_NAME" />.</translation> <translation id="5763315388120433852">הגדרה או ניהול של התקני רשת לשיתוף קבצים.</translation> <translation id="5763751966069581670">לא נמצאו התקני USB</translation> <translation id="5764483294734785780">ש&מור שמע כ...</translation> @@ -3081,7 +3080,7 @@ <translation id="5778747455497889540">סיסמת המודול המאובטח שנוצרה באופן אקראי והוקצתה למחשב שלך:</translation> <translation id="5780973441651030252">עדיפות תהליך</translation> <translation id="5781092003150880845">סינכרון בשם <ph name="ACCOUNT_FULL_NAME" /></translation> -<translation id="5781865261247219930">שלח תגובות אל <ph name="EXTENSION_NAME" /></translation> +<translation id="5781865261247219930">שליחת תגובות אל <ph name="EXTENSION_NAME" /></translation> <translation id="5782227691023083829">מתרגם...</translation> <translation id="5783221160790377646">עקב שגיאה, לא נוצר משתמש בפיקוח. נסה שוב מאוחר יותר.</translation> <translation id="5783602409389152506">בזמן חיפוש התקנים...</translation> @@ -3111,7 +3110,7 @@ <translation id="5829401023154985950">ניהול...</translation> <translation id="5830410401012830739">נהל הגדרות מיקום...</translation> <translation id="5830720307094128296">שמור דף &כ...</translation> -<translation id="5832805196449965646">הוסף משתמש</translation> +<translation id="5832805196449965646">הוספת משתמש</translation> <translation id="583281660410589416">לא ידוע</translation> <translation id="5832976493438355584">נעול</translation> <translation id="5833397272224757657">התוכן מאתרים שנכנסת אליהם, פעילות הדפדפן והאינטראקציות שלך ישמשו לצורך התאמה אישית</translation> @@ -3193,7 +3192,7 @@ <translation id="5938002010494270685">יש שדרוג אבטחה זמין</translation> <translation id="5939518447894949180">אפס</translation> <translation id="5939847200023027600">שירות מחבר של מסמכי PDF</translation> -<translation id="5941153596444580863">הוסף משתמש...</translation> +<translation id="5941153596444580863">הוספת משתמש...</translation> <translation id="5941343993301164315">היכנס ל-<ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">מזער</translation> <translation id="5946591249682680882">מזהה דיווח <ph name="WEBRTC_LOG_REPORT_ID" /></translation> @@ -3217,7 +3216,7 @@ <translation id="5975792506968920132">אחוז טעינת הסוללה</translation> <translation id="5976160379964388480">אחרים</translation> <translation id="5979421442488174909">&תרגם ל-<ph name="LANGUAGE" /></translation> -<translation id="5979469435153841984">כדי להוסיף דפים לסימניות, לחץ על הכוכב בסרגל הכתובות</translation> +<translation id="5979469435153841984">כדי להוסיף דפים לסימניות, אפשר ללחוץ על הכוכב בשורת כתובת האתר</translation> <translation id="5982621672636444458">אפשרויות מיון</translation> <translation id="5984222099446776634">ביקרת לאחרונה</translation> <translation id="5985458664595100876">פורמט כתובת האתר לא חוקי. הפורמטים הנתמכים הם \\server\share ו-smb://server/share.</translation> @@ -3311,7 +3310,7 @@ <translation id="6107012941649240045">מונפק ל</translation> <translation id="6112294629795967147">שינוי גודל באמצעות נגיעה</translation> <translation id="6112931163620622315">בדיקת הטלפון</translation> -<translation id="6112952769866305444">ערוך את המשתמש, <ph name="PROFILE_NAME" />, <ph name="USERNAME" /></translation> +<translation id="6112952769866305444">עריכת המשתמש, <ph name="PROFILE_NAME" />, <ph name="USERNAME" /></translation> <translation id="6116338172782435947">גישה אל טקסט ותמונות שהועתקו ללוח</translation> <translation id="6116921718742659598">שנה את הגדרות הקלט והשפה</translation> <translation id="6120205520491252677">הצמד דף זה למסך הפתיחה...</translation> @@ -3511,7 +3510,7 @@ <translation id="6419288379019356534">המכשיר הזה מנוהל על-ידי <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />. <ph name="LINE_BREAK" /> לחץ על 'הבא' כדי להמשיך בכניסה אל חשבון <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> שלך.</translation> -<translation id="6419546358665792306">טען פריט לא ארוז</translation> +<translation id="6419546358665792306">טעינת פריט Unpacked</translation> <translation id="642282551015776456">ייתכן שלא ניתן להשתמש בשם זה כשם קובץ או תיקייה</translation> <translation id="642469772702851743">מכשיר זה (מספר סידורי: <ph name="SERIAL_NUMBER" />) ננעל על-ידי הבעלים.</translation> <translation id="6426200009596957090">פתח את הגדרות ChromeVox</translation> @@ -3586,7 +3585,7 @@ <translation id="654233263479157500">השתמש בשירות אינטרנט כדי לפתור שגיאות ניווט</translation> <translation id="6544215763872433504">דפדפן האינטרנט של Google, במיוחד בשבילך</translation> <translation id="6545665334409411530">שיעור חזרה</translation> -<translation id="6545834809683560467">השתמש בשירות חיזויים כדי להשלים חיפושים וכתובות אתרים שאתה מזין בסרגל הכתובות או בתיבת החיפוש של מפעיל היישומים</translation> +<translation id="6545834809683560467">שימוש בשירות חיזויים כדי להשלים חיפושים וכתובות URL שמזינים בשורת כתובת האתר או בתיבת החיפוש של מרכז האפליקציות</translation> <translation id="6547316139431024316">אל תציג שוב אזהרה עבור התוסף הזה</translation> <translation id="6547354035488017500">עליך לפנות 512 MB לפחות משטח האחסון במכשיר, אחרת הוא יפסיק להגיב. כדי לפנות שטח אחסון, מחק קבצים מאחסון המכשיר.</translation> <translation id="6549689063733911810">מהזמן האחרון</translation> @@ -3730,10 +3729,10 @@ <translation id="6782111308708962316">מנע מאתרים של צד שלישי לשמור ולקרוא נתונים של קובצי cookie</translation> <translation id="6786747875388722282">תוספים</translation> <translation id="6787839852456839824">מקשי קיצור</translation> -<translation id="6788210894632713004">תוסף שאינו ארוז</translation> +<translation id="6788210894632713004">תוסף Unpacked</translation> <translation id="6790428901817661496">הפעל</translation> <translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> נוסף מרחוק</translation> -<translation id="6790820461102226165">הוסף משתמש...</translation> +<translation id="6790820461102226165">הוספת משתמש...</translation> <translation id="6792072150955115067">מהאפליקציה <ph name="APP_NAME" /> נשלחה בקשה לשתף את תוכן המסך עם <ph name="TARGET_NAME" />. בחר את התוכן שברצונך לשתף.</translation> <translation id="6793604637258913070">הדגש את סמן הטקסט כשהוא מופיע או זז</translation> <translation id="6797493596609571643">אופס. משהו השתבש.</translation> @@ -3947,7 +3946,7 @@ <translation id="711840821796638741">הצג סימניות מנוהלות</translation> <translation id="711902386174337313">קריאה של רשימת ההתקנים המחוברים שלך</translation> <translation id="7120865473764644444">לא ניתן היה להתחבר אל שרת הסנכרון. מנסה שוב...</translation> -<translation id="7121362699166175603">ניקוי ההיסטוריה וההשלמות האוטומטיות בסרגל הכתובות. ייתכן שלחשבון Google שלך יהיו צורות אחרות של היסטוריית גלישה בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> +<translation id="7121362699166175603">ניקוי ההיסטוריה וההשלמות האוטומטיות בשורת כתובת האתר. ייתכן שלחשבון Google שלך יהיו צורות אחרות של היסטוריית גלישה בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="7123360114020465152">התמיכה הופסקה</translation> <translation id="7124929488592184705">שגיאה במהלך ההדפסה של <ph name="DOCUMENT_NAME" /></translation> <translation id="7126604456862387217">'<b><ph name="SEARCH_STRING" /></b>' - <em>חפש בכונן</em></translation> @@ -4154,7 +4153,7 @@ <translation id="7456142309650173560">מפתח</translation> <translation id="7456847797759667638">פתח מיקום...</translation> <translation id="7461924472993315131">הצמד</translation> -<translation id="7463006580194749499">הוסף משתמש</translation> +<translation id="7463006580194749499">הוספת משתמש</translation> <translation id="7465778193084373987">כתובת אתר לביטול אישור של Netscape</translation> <translation id="7469894403370665791">התחבר אוטומטית לרשת זו.</translation> <translation id="747114903913869239">שגיאה: לא ניתן לפענח תוסף</translation> @@ -4174,7 +4173,7 @@ הקבצים מוכנים לגיבוי ב-<ph name="BEGIN_LINK" />Google Drive<ph name="END_LINK" /></translation> <translation id="7489355918927585587">{COUNT,plural, =0{&פתח הכל}=1{&פתח סימניה}two{&פתח הכל (2)}many{&פתח הכל (#)}other{&פתח הכל (#)}}</translation> <translation id="7489605380874780575">בדוק כשירות</translation> -<translation id="749028671485790643">אדם <ph name="VALUE" /></translation> +<translation id="749028671485790643">משתמש <ph name="VALUE" /></translation> <translation id="7490813197707563893">כתובת MAC</translation> <translation id="7493386493263658176">תוספי <ph name="EXTENSION_NAME" /> עשויים לתעד את כל הטקסט שאתה מקליד, כולל נתונים אישיים, כמו סיסמאות ומספרי כרטיס אשראי. האם ברצונך להשתמש בתוסף הזה?</translation> <translation id="7494065396242762445">פתח את הגדרות Windows</translation> @@ -4267,7 +4266,7 @@ <translation id="7648992873808071793">לאחסן קבצים במכשיר הזה</translation> <translation id="7649070708921625228">עזרה</translation> <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" רוצה להסיר את "<ph name="EXTENSION_NAME" />".</translation> -<translation id="7652808307838961528">ערוך את המשתמש, <ph name="PROFILE_NAME" /></translation> +<translation id="7652808307838961528">עריכת המשתמש, <ph name="PROFILE_NAME" /></translation> <translation id="765293928828334535">לא ניתן להוסיף אפליקציות, תוספים וסקריפטים של משתמש מהאתר הזה</translation> <translation id="7654941827281939388">חשבון זה כבר נמצא בשימוש במחשב זה.</translation> <translation id="7658239707568436148">ביטול</translation> @@ -4352,9 +4351,9 @@ <translation id="7786207843293321886">צא מהפעלת אורח</translation> <translation id="7786889348652477777">&טען אפליקציה מחדש</translation> <translation id="7787308148023287649">הצג במסך אחר</translation> -<translation id="7788080748068240085">כדי לשמור את "<ph name="FILE_NAME" />" באופן לא מקוון, עליך לפנות נפח נוסף של <ph name="TOTAL_FILE_SIZE" /> :<ph name="MARKUP_1" /> - <ph name="MARKUP_2" />בטל הצמדה של קבצים שאינך צריך לגשת אליהם יותר במצב לא מקוון<ph name="MARKUP_3" /> - <ph name="MARKUP_4" />מחק קבצים מהתיקיה 'הורדות'<ph name="MARKUP_5" /></translation> +<translation id="7788080748068240085">כדי לשמור את "<ph name="FILE_NAME" />" באופן לא מקוון, יש לפנות נפח נוסף של <ph name="TOTAL_FILE_SIZE" /> :<ph name="MARKUP_1" /> + <ph name="MARKUP_2" />ניתן לבטל הצמדה של קבצים שאינך צריך לגשת אליהם יותר במצב לא מקוון<ph name="MARKUP_3" /> + <ph name="MARKUP_4" />ניתן למחוק קבצים מהתיקייה 'הורדות'<ph name="MARKUP_5" /></translation> <translation id="7788298548579301890">תוכנית אחרת במחשב הוסיפה יישום שעשוי לשנות את אופן הפעולה של Chrome. <ph name="EXTENSION_NAME" /></translation> @@ -4675,7 +4674,7 @@ <translation id="8213449224684199188">עברת למצב תמונות</translation> <translation id="8213577208796878755">מכשיר זמין נוסף אחד.</translation> <translation id="8214489666383623925">פתח קובץ...</translation> -<translation id="8214962590150211830">הסר משתמש זה</translation> +<translation id="8214962590150211830">הסרת משתמש זה</translation> <translation id="8217399928341212914">המשך לחסום הורדות אוטומטיות של קבצים מרובים</translation> <translation id="8223479393428528563">כדי לשמור קבצים אלה לשימוש לא מקוון, חזור למצב מקוון, לחץ לחיצה ימנית על הקבצים ובחר את האפשרות <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> <translation id="8225753906568652947">מימוש המבצעים שלך</translation> @@ -4746,7 +4745,7 @@ <translation id="8326478304147373412">PKCS #7, שרשרת אישורים</translation> <translation id="8327039559959785305">קרתה שגיאה בטעינת קובצי ה-Linux. יש לנסות שוב.</translation> <translation id="8329978297633540474">טקסט רגיל</translation> -<translation id="8335587457941836791">הסר את ההצמדה למדף</translation> +<translation id="8335587457941836791">ביטול הצמדה למדף</translation> <translation id="8336153091935557858">אתמול <ph name="YESTERDAY_DAYTIME" /></translation> <translation id="8338952601723052325">אתר האינטרנט של המפתח</translation> <translation id="8339059274628563283">נתונים המאוחסנים באופן מקומי עבור <ph name="SITE" /></translation> @@ -5151,7 +5150,7 @@ <translation id="8983677657449185470">עזרה בשיפור של גלישה בטוחה</translation> <translation id="8984179138335769204">פתיחה מהירה</translation> <translation id="8986362086234534611">שכח</translation> -<translation id="8986494364107987395">שלח ל-Google דוחות קריסה וסטטיסטיקת שימוש באופן אוטומטי</translation> +<translation id="8986494364107987395">שליחה אוטומטית של דוחות קריסה וסטטיסטיקות שימוש ל-Google</translation> <translation id="8987927404178983737">חודש</translation> <translation id="8991520179165052608">האתר רשאי להשתמש במיקרופון</translation> <translation id="899403249577094719">כתובת אתר בסיסית של אישור Netscape</translation> @@ -5246,7 +5245,7 @@ <translation id="9129010913019873477"><ph name="PERCENTAGE" /> (ברירת מחדל)</translation> <translation id="9130015405878219958">הוזן מצב לא חוקי.</translation> <translation id="9130775360844693113">חברים באחסון השיתופי '<ph name="DESTINATION_NAME" />' יקבלו גישה לפריטים האלה.</translation> -<translation id="9131487537093447019">שלח הודעות למכשירי Bluetooth וקבל מהם הודעות.</translation> +<translation id="9131487537093447019">שליחת הודעות למכשירי Bluetooth וקבלת הודעות מהם.</translation> <translation id="9131598836763251128">בחר קובץ אחד או יותר</translation> <translation id="9133055936679483811">הכיווץ נכשל. <ph name="ERROR_MESSAGE" /></translation> <translation id="9134304429738380103">כן, אני מסכים/ה.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index a3370f6..6c1eed1b 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">右余白</translation> <translation id="2282146716419988068">GPU プロセス</translation> <translation id="2282155092769082568">自動設定 URL:</translation> -<translation id="2286841657746966508">請求先住所</translation> <translation id="2288181517385084064">動画レコーダーに切り替え</translation> <translation id="2288735659267887385">ユーザー補助機能の設定</translation> <translation id="2292848386125228270">通常のユーザーとして <ph name="PRODUCT_NAME" /> を起動してください。開発の目的でルートとして実行する必要がある場合は、--no-sandbox フラグを指定して再実行してください。</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 0699138..5c2d58f 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -847,7 +847,6 @@ <translation id="2280486287150724112">ಬಲ ಅಂಚು</translation> <translation id="2282146716419988068">GPU ಪ್ರಕ್ರಿಯೆ</translation> <translation id="2282155092769082568">ಸ್ವಯಂ ಕಾನ್ಫಿಗರೇಶನ್ URL:</translation> -<translation id="2286841657746966508">ಬಿಲ್ಲಿಂಗ್ ವಿಳಾಸ</translation> <translation id="2288181517385084064">ವೀಡಿಯೊ ರೆಕಾರ್ಡರ್ಗೆ ಬದಲಿಸಿ</translation> <translation id="2288735659267887385">ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="2292848386125228270">ದಯವಿಟ್ಟು <ph name="PRODUCT_NAME" /> ಅನ್ನು ಸಾಮಾನ್ಯ ಬಳಕೆದಾರನಂತೆ ಪ್ರಾರಂಭಿಸಿ. ನಿಮಗೆ ಅಭಿವೃದ್ಧಿಗೆ ಮೂಲದಂತೆ ಚಾಲನೆಯ ಅಗತ್ಯವಿದ್ದರೆ, --no- ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್ ಫ್ಲ್ಯಾಗ್ ಜೊತೆಗೆ ಮರುಚಾಲನೆ ಮಾಡಿ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index d6f1c39b..224b48b 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">오른쪽 여백</translation> <translation id="2282146716419988068">GPU 프로세스</translation> <translation id="2282155092769082568">자동설정 URL:</translation> -<translation id="2286841657746966508">결제주소</translation> <translation id="2288181517385084064">동영상 녹화로 전환</translation> <translation id="2288735659267887385">접근성 설정</translation> <translation id="2292848386125228270">일반 사용자로 <ph name="PRODUCT_NAME" />을(를) 시작하세요. 개발용 루트로 실행해야 하는 경우 --no-sandbox 플래그를 사용하여 다시 실행하세요.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index e06ac56..2d73a49 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Dešinioji paraštė</translation> <translation id="2282146716419988068">GPU procesas</translation> <translation id="2282155092769082568">Automatinės konfigūracijos URL:</translation> -<translation id="2286841657746966508">Atsiskaitymo adresas</translation> <translation id="2288181517385084064">Perjungti į vaizdo įrašymo priemonę</translation> <translation id="2288735659267887385">Pasiekiamumo nustatymai</translation> <translation id="2292848386125228270">Paleiskite „<ph name="PRODUCT_NAME" />“ kaip įprastas naudotojas. Jei norite paleisti kaip pagrindinis naudotojas, kad galėtumėte kurti, iš naujo paleiskite naudodami žymą „--no-sandbox“.</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 0a0886ba..e9fcf25 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Labā piemale</translation> <translation id="2282146716419988068">GPU process</translation> <translation id="2282155092769082568">Automātiskās konfigurācijas vietrādis URL</translation> -<translation id="2286841657746966508">Norēķinu adrese</translation> <translation id="2288181517385084064">Pārslēgt uz video ierakstītāju</translation> <translation id="2288735659267887385">Pieejamības iestatījumi</translation> <translation id="2292848386125228270">Startējiet pārlūku <ph name="PRODUCT_NAME" /> kā parasts lietotājs. Ja vēlaties to palaist izstrādei kā sakni, veiciet atkārtotu palaišanu, izmantojot atzīmi --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 8bc9f19..36f1cf8 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -761,6 +761,7 @@ <translation id="215753907730220065">പൂര്ണ്ണ സ്ക്രീനില് നിന്ന് പുറത്തുകടക്കുക</translation> <translation id="2157875535253991059">ഈ പേജ് ഇപ്പോൾ പൂർണ്ണമായ സ്ക്രീനിലാണ്.</translation> <translation id="216169395504480358">Wi-Fi ചേർക്കുക...</translation> +<translation id="2162155940152307086">നിങ്ങൾ സമന്വയിപ്പിക്കൽ ക്രമീകരണം വിടുമ്പോൾ, സമന്വയിപ്പിക്കൽ ആരംഭിക്കും</translation> <translation id="2163470535490402084"><ph name="DEVICE_TYPE" /> ഉപകരണത്തിൽ സൈൻ ഇൻ ചെയ്യാൻ ഇന്റർനെറ്റിലേക്ക് കണക്റ്റുചെയ്യുക.</translation> <translation id="2166369534954157698">അജവും ആനയും ഐരാവതവും ഗരുഡനും കഠോര സ്വരം പൊഴിക്കെ ഹാരവും ഒഢ്യാണവും ഫാലത്തിൽ മഞ്ഞളും ഈറൻ കേശത്തിൽ ഔഷധ എണ്ണയുമായി ഋതുമതിയും അനഘയും ഭൂനാഥയുമായ ഉമ ദു:ഖഛവിയോടെ ഇടതു പാദം ഏന്തി നിർഝരിയിലെ ചിറ്റലകളെ ഓമനിക്കുമ്പോൾ ബാലയുടെ കൺകളിൽ നീർ ഊർന്നു വിങ്ങി.</translation> <translation id="2169062631698640254">ഏതുവിധേനയും സൈൻ ഇൻ ചെയ്യുക</translation> @@ -771,6 +772,7 @@ <translation id="2178098616815594724">നിങ്ങളുടെ കമ്പ്യൂട്ടർ ആക്സസ് ചെയ്യാൻ <ph name="PEPPER_PLUGIN_DOMAIN" /> എന്നതിലെ <ph name="PEPPER_PLUGIN_NAME" /> ആഗ്രഹിക്കുന്നു</translation> <translation id="2178614541317717477">CA കോംപ്രമൈസ്</translation> <translation id="218070003709087997">എത്ര പകർപ്പുകൾ പ്രിന്റുചെയ്യണമെന്ന് സൂചിപ്പിക്കാൻ ഒരു നമ്പര് ഉപയോഗിക്കുക (1 മുതൽ 999 വരെ).</translation> +<translation id="2182253583899676504">ടെക്സ്റ്റ് ഫീൽഡുകളിൽ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന ടെക്സ്റ്റ് Google-ന് അയയ്ക്കപ്പെടും.</translation> <translation id="2184515124301515068">സൈറ്റുകൾക്ക് എപ്പോൾ ശബ്ദം പ്ലേ ചെയ്യാനാവും എന്നത് (ശുപാർശ ചെയ്തത്) തിരഞ്ഞെടുക്കാൻ Chrome-നെ അനുവദിക്കുക</translation> <translation id="2187895286714876935">സെര്വര് സാക്ഷ്യപത്ര ഇറക്കുമതി പിശക്</translation> <translation id="2187906491731510095">വിപുലീകരണങ്ങൾ അപ്ഡേറ്റ് ചെയ്തു</translation> @@ -782,7 +784,9 @@ <translation id="2192505247865591433">പ്രേഷിതാവ്:</translation> <translation id="2193365732679659387">വിശ്വസ്ഥത ക്രമീകരണം</translation> <translation id="2195729137168608510">ഇമെയില് പരിരക്ഷണം</translation> +<translation id="2198757192731523470">തിരയലും പരസ്യങ്ങളും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ, Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം.</translation> <translation id="2199298570273670671">പിശക്</translation> +<translation id="2199719347983604670">Chrome സമന്വയത്തിൽ നിന്നുള്ള ഡാറ്റ</translation> <translation id="2200094388063410062">ഇമെയില്</translation> <translation id="2200356397587687044">Chrome-ന് തുടരാൻ അനുമതി ആവശ്യമാണ്</translation> <translation id="2200603218210188859">USB ഉപകരണ മുൻഗണനകൾ</translation> @@ -847,7 +851,6 @@ <translation id="2280486287150724112">വലത് മാര്ജിന്</translation> <translation id="2282146716419988068">GPU പ്രോസസ്സ്</translation> <translation id="2282155092769082568">സ്വയമേവ കോൺഫിഗറേഷൻ URL:</translation> -<translation id="2286841657746966508">ബില്ലിംഗ് വിലാസം</translation> <translation id="2288181517385084064">വീഡിയോ റെക്കോർഡറിലേക്ക് മാറുക</translation> <translation id="2288735659267887385">ഉപയോഗസഹായി ക്രമീകരണങ്ങൾ</translation> <translation id="2292848386125228270"><ph name="PRODUCT_NAME" /> ഉപകരണത്തെ സാധാരണ ഉപയോക്താവിനെ പോലെ ഉപയോഗിച്ചുതുടങ്ങൂ. കൂടുതൽ വിപുലമാക്കാൻ ഒരു റൂട്ടായി റൺ ചെയ്യണമെങ്കിൽ, --no-sandbox ഫ്ലാഗ് ഉപയോഗിച്ച് വീണ്ടും റൺ ചെയ്യുക.</translation> @@ -1240,6 +1243,7 @@ <translation id="2889064240420137087">ഇതുമായി ലിങ്ക് തുറക്കുക...</translation> <translation id="2889925978073739256">അൺസാൻഡ്ബോക്സ് ചെയ്ത പ്ലഗിന്നുകൾ തടയുന്നത് തുടരുക</translation> <translation id="2893168226686371498">ഡിഫോൾട്ട് ബ്രൗസര്</translation> +<translation id="2895734772884435517">ഈ ക്രമീകരണം ഏതുസമയത്തും നിങ്ങൾക്ക് ഇഷ്ടാനുസൃതമാക്കാനാവും.</translation> <translation id="289644616180464099">സിം കാർഡ് ലോക്കുചെയ്തു</translation> <translation id="289695669188700754">കീ ഐഡി: <ph name="KEY_ID" /></translation> <translation id="2897878306272793870">നിങ്ങള് <ph name="TAB_COUNT" /> ടാബുകള് തുറക്കാന് പോവുകയാണെന്ന് ഉറപ്പുണ്ടോ?</translation> @@ -1708,6 +1712,7 @@ <translation id="3636096452488277381">ഹലോ, <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" />% - <ph name="TIME" /> ശേഷിക്കുന്നു</translation> <translation id="3637682276779847508">ശരിയായ പിൻ അണ്ലോക്ക് കീ നല്കാന് നിങ്ങള്ക്ക് കഴിഞ്ഞില്ലെങ്കിൽ സിം കാര്ഡ് ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കും.</translation> +<translation id="363863692969456324">മെച്ചപ്പെടുത്തിയ അക്ഷരത്തെറ്റ് പരിശോധന ഉപയോഗിച്ച്, അക്ഷരപ്പിശകുകൾ പരിഹരിക്കുക</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> എന്നയാൾക്കായി "<ph name="EXTENSION_NAME" />" ചേർക്കണോ?</translation> <translation id="3644896802912593514">വീതി</translation> <translation id="3645372836428131288">ഫിംഗർപ്രിന്റിന്റെ മറ്റൊരു ഭാഗം പകർത്താൻ ചെറുതായി നീക്കുക.</translation> @@ -2139,6 +2144,7 @@ <translation id="4310139701823742692">ഫയൽ, തെറ്റായ ഫോർമാറ്റിലാണ്. PPD ഫയൽ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="431076611119798497">&വിശദാംശങ്ങള്</translation> <translation id="4312866146174492540">ബ്ലോക്കുചെയ്യുക (ഡിഫോൾട്ട്)</translation> +<translation id="4314815835985389558">സമന്വയിപ്പിക്കൽ മാനേജ് ചെയ്യുക</translation> <translation id="4316850752623536204">ഡെവലപ്പർ വെബ്സൈറ്റ്</translation> <translation id="4320177379694898372">ഇന്റർനെറ്റ് കണക്ഷനൊന്നുമില്ല</translation> <translation id="4320948194796820126">നിങ്ങളുടെ ഇമെയിലിലേക്ക് ഒരു ബുക്ക്മാർക്ക് ചേർക്കുക</translation> @@ -2218,6 +2224,7 @@ <translation id="4450974146388585462">പ്രശ്നം നിർണ്ണയിക്കുക</translation> <translation id="4451757071857432900">അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങൾ കാണിക്കുന്ന സൈറ്റുകളിൽ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു (ശുപാർശ ചെയ്യുന്നു)</translation> <translation id="4453946976636652378"><ph name="SEARCH_ENGINE_NAME" /> തിരയുക അല്ലെങ്കിൽ ഒരു URL ടൈപ്പ് ചെയ്യുക</translation> +<translation id="4461835665417498653">ചില സിസ്റ്റം വിവരങ്ങളും പേജ് ഉള്ളടക്കവും Google-ന് പേരില്ലാതെ അയയ്ക്കുന്നു.</translation> <translation id="4462159676511157176">ഇഷ്ടാനുസൃത നാമ സെർവറുകൾ</translation> <translation id="4467101674048705704"><ph name="FOLDER_NAME" /> വികസിപ്പിക്കുക</translation> <translation id="4469477701382819144">അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങൾ കാണിക്കുന്ന സൈറ്റുകളിൽ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു</translation> @@ -2382,6 +2389,7 @@ <translation id="4735265153267957659">Smart Lock പ്രവർത്തനക്ഷമമാക്കാൻ നിങ്ങളുടെ പാസ്വേഡ് നൽകുക. അടുത്ത തവണ, നിങ്ങളുടെ ഫോൺ <ph name="DEVICE_TYPE" /> അൺലോക്ക് ചെയ്യും. ക്രമീകരണത്തിൽ Smart Lock ഓഫാക്കുക.</translation> <translation id="473546211690256853"><ph name="DOMAIN" />, ഈ അക്കൗണ്ട് നിയന്ത്രിക്കുന്നു</translation> <translation id="4735803855089279419">ഈ ഉപകരണത്തിനായി ഉപകരണ ഐഡന്റിഫയറുകൾ നിർണ്ണയിക്കാൻ സിസ്റ്റത്തിനായില്ല.</translation> +<translation id="4736292055110123391">ബുക്ക്മാർക്കുകൾ, പാസ്വേഡുകൾ, ചരിത്രം എന്നിവയും മറ്റും നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും സമന്വയിപ്പിക്കുക</translation> <translation id="4737715515457435632">ഒരു നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക</translation> <translation id="473775607612524610">അപ്ഡേറ്റുചെയ്യുക</translation> <translation id="4742746985488890273">ഷെൽഫിൽ പിൻ ചെയ്യുക</translation> @@ -2720,6 +2728,7 @@ <translation id="5266113311903163739">സര്ട്ടിഫിക്കേഷന് അതോറിറ്റി ഇറക്കുമതി പിശക്</translation> <translation id="5269977353971873915">പ്രിന്റുചെയ്യൽ പരാജയപ്പെട്ടു</translation> <translation id="5270167208902136840"><ph name="NUMBER_OF_MORE_APPS" /> ആപ്പുകൾ കൂടി കാണിക്കുക</translation> +<translation id="5272654297705279635">ഇഷ്ടാനുസൃത ക്രമീകരണം</translation> <translation id="5275352920323889391">നായ</translation> <translation id="5275973617553375938">Google ഡ്രൈവിൽ നിന്നും ഫയലുകൾ വീണ്ടെടുത്തു</translation> <translation id="527605982717517565"><ph name="HOST" /> ല് എല്ലായ്പ്പോഴുംJavaScript അനുവദിക്കുക </translation> @@ -4894,6 +4903,7 @@ <translation id="8598453409908276158">അൺസാൻഡ്ബോക്സ് ചെയ്ത പ്ലഗിൻ ബ്ലോക്ക് ചെയ്തു</translation> <translation id="8601206103050338563">TLS WWW ക്ലയന്റ് പ്രാമാണീകരണം</translation> <translation id="8602851771975208551">നിങ്ങളുടെ കമ്പ്യൂട്ടറിലെ മറ്റൊരു പ്രോഗ്രാം Chrome പ്രവർത്തിക്കുന്ന രീതി മാറ്റിയേക്കാവുന്ന ഒരു അപ്ലിക്കേഷൻ ചേർത്തു.</translation> +<translation id="8604763363205185560">Chrome, അതിന്റെ സുരക്ഷ എന്നിവ മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation> <translation id="8605428685123651449">SQLite മെമ്മറി</translation> <translation id="8606726445206553943">നിങ്ങളുടെ MIDI ഉപകരണങ്ങൾ ഉപയോഗിക്കുക</translation> <translation id="8609465669617005112">മുകളിലേക്ക് നീക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 4d10ac6..0c20f85 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -849,7 +849,6 @@ <translation id="2280486287150724112">उजवा समास</translation> <translation id="2282146716419988068">GPU प्रक्रिया</translation> <translation id="2282155092769082568">स्वयंकॉन्फिगरेशन URL:</translation> -<translation id="2286841657746966508">बिलिंग पत्ता</translation> <translation id="2288181517385084064">व्हिडिओ रेकॉर्डरवर स्विच करा</translation> <translation id="2288735659267887385">प्रवेशयोग्यता सेटिंग्ज</translation> <translation id="2292848386125228270">कृपया <ph name="PRODUCT_NAME" /> चा सामान्य वापरकर्ता म्हणून सुरू करा. तुम्हाला विकासासाठी मूळ म्हणून चालवणे आवश्यक असल्यास, सॅंडबॉक्स फ्लॅग नाही -- सह पुन्हा रन करा.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index ba01dff..ae407b9 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Jidar kanan</translation> <translation id="2282146716419988068">Proses GPU</translation> <translation id="2282155092769082568">URL autokonfigurasi:</translation> -<translation id="2286841657746966508">Alamat pengebilan</translation> <translation id="2288181517385084064">Beralih kepada perakam video</translation> <translation id="2288735659267887385">Tetapan kebolehaksesan</translation> <translation id="2292848386125228270">Sila mulakan <ph name="PRODUCT_NAME" /> sebagai pengguna biasa. Jika anda perlu menjalankan apl sebagai akar untuk pembangunan, jalankan semula dengan --bendera tanpa kotak pasir.</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 75908ecc..6805bb9 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Marge rechts</translation> <translation id="2282146716419988068">GPU-proces</translation> <translation id="2282155092769082568">URL voor autoconfiguratie</translation> -<translation id="2286841657746966508">Factuuradres</translation> <translation id="2288181517385084064">Overschakelen naar videorecorder</translation> <translation id="2288735659267887385">Toegankelijkheidsinstellingen</translation> <translation id="2292848386125228270">Start <ph name="PRODUCT_NAME" /> als een normale gebruiker. Als je voor ontwikkelingsdoeleinden moet uitvoeren als root, voer je opnieuw uit met de markering '--no-sandbox'.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index b428c7c..e08bb5c 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -847,7 +847,6 @@ <translation id="2280486287150724112">Høyremarg</translation> <translation id="2282146716419988068">GPU-prosess</translation> <translation id="2282155092769082568">Nettadresse for automatisk konfigurering:</translation> -<translation id="2286841657746966508">Faktureringsadresse</translation> <translation id="2288181517385084064">Bytt til videoopptaker</translation> <translation id="2288735659267887385">Innstillinger for tilgjengelighet</translation> <translation id="2292848386125228270">Start <ph name="PRODUCT_NAME" /> som en vanlig bruker. Hvis du har behov for å kjøre som rot i forbindelse med utvikling, må du kjøre appen på nytt med flagget --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 7176baed..80fd1d4e 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Prawy margines</translation> <translation id="2282146716419988068">Proces GPU</translation> <translation id="2282155092769082568">URL automatycznej konfiguracji:</translation> -<translation id="2286841657746966508">Adres rozliczeniowy</translation> <translation id="2288181517385084064">Przełącz na rejestrator wideo</translation> <translation id="2288735659267887385">Ustawienia ułatwień dostępu</translation> <translation id="2292848386125228270">Uruchom <ph name="PRODUCT_NAME" /> jako normalny użytkownik. Jeśli jesteś programistą i chcesz skorzystać z konta roota, uruchom program jeszcze raz z flagą --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 8df753ef..bea2270 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Margem direta</translation> <translation id="2282146716419988068">Processo de GPU</translation> <translation id="2282155092769082568">URL de configuração automática</translation> -<translation id="2286841657746966508">Endereço de faturamento</translation> <translation id="2288181517385084064">Alternar para gravador de vídeo</translation> <translation id="2288735659267887385">Configurações de acessibilidade</translation> <translation id="2292848386125228270">Inicie o <ph name="PRODUCT_NAME" /> como um usuário normal. Se precisar executar como raiz para desenvolvimento, execute novamente com a sinalização --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index f9239c0..7409478d9 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Margem direita</translation> <translation id="2282146716419988068">Processo GPU</translation> <translation id="2282155092769082568">URL de configuração automática:</translation> -<translation id="2286841657746966508">Endereço de facturação</translation> <translation id="2288181517385084064">Mudar para gravador de vídeo</translation> <translation id="2288735659267887385">Definições de acessibilidade</translation> <translation id="2292848386125228270">Inicie o <ph name="PRODUCT_NAME" /> como um utilizador normal. Se precisar de executar com acesso máximo para programação, volte a executar com a sinalização --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index fd734c6..07624ac 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Margine la dreapta</translation> <translation id="2282146716419988068">Proces GPU</translation> <translation id="2282155092769082568">Adresa URL de autoconfigurare:</translation> -<translation id="2286841657746966508">Adresa de facturare</translation> <translation id="2288181517385084064">Comută la înregistrarea video</translation> <translation id="2288735659267887385">Setări de accesibilitate</translation> <translation id="2292848386125228270">Pornește <ph name="PRODUCT_NAME" /> ca utilizator normal. Pentru a rula cu privilegii de utilizator root pentru dezvoltare, rulează-l din nou cu marcajul --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 8b74676d..bae8e6e 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -853,7 +853,6 @@ <translation id="2280486287150724112">Правое поле</translation> <translation id="2282146716419988068">Процесс GPU</translation> <translation id="2282155092769082568">URL автоматической настройки:</translation> -<translation id="2286841657746966508">Платежный адрес</translation> <translation id="2288181517385084064">Перейти в режим видео</translation> <translation id="2288735659267887385">Специальные возможности</translation> <translation id="2292848386125228270">Запустите <ph name="PRODUCT_NAME" /> от имени обычного пользователя. Если вам нужно выполнить запуск от имени суперпользователя, перезапустите браузер, установив параметр "--no-sandbox".</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 9b861ed6..fa9f4c6 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Pravý okraj</translation> <translation id="2282146716419988068">Proces GPU</translation> <translation id="2282155092769082568">Webová adresa automatickej konfigurácie</translation> -<translation id="2286841657746966508">Fakturačná adresa</translation> <translation id="2288181517385084064">Prepnúť na videorekordér</translation> <translation id="2288735659267887385">Nastavenia dostupnosti</translation> <translation id="2292848386125228270">Spustite <ph name="PRODUCT_NAME" /> ako normálny používateľ. Ak to potrebujete urobiť ako používateľ root na účely vývoja, spustite ho znova pomocou príznaku --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 4a52345..3eacf2c6 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Desni rob</translation> <translation id="2282146716419988068">Proces GPU</translation> <translation id="2282155092769082568">Spletni naslov samodejne konfiguracije:</translation> -<translation id="2286841657746966508">Naslov za obračun storitev</translation> <translation id="2288181517385084064">Preklopi na snemalnik videoposnetkov</translation> <translation id="2288735659267887385">Nastavitve funkcij za ljudi s posebnimi potrebami</translation> <translation id="2292848386125228270">Zaženite <ph name="PRODUCT_NAME" /> kot običajni uporabnik. Če ga morate zaradi razvoja izvajati kot korenski uporabnik, ga znova zaženite z zastavico »--no-sandbox«.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 82724d6a..18e9259a 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -847,7 +847,6 @@ <translation id="2280486287150724112">Десна маргина</translation> <translation id="2282146716419988068">GPU процес</translation> <translation id="2282155092769082568">URL за аутоматску конфигурацију:</translation> -<translation id="2286841657746966508">Адреса за наплату</translation> <translation id="2288181517385084064">Пребаци на видео-рикордер</translation> <translation id="2288735659267887385">Подешавања приступачности</translation> <translation id="2292848386125228270">Покрените <ph name="PRODUCT_NAME" /> као обичан корисник. Ако треба да га покренете као основни производ ради програмирања, покрените га поново помоћу ознаке --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 09599293..65badfc 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -763,6 +763,7 @@ <translation id="215753907730220065">Avsluta helskärmsläge</translation> <translation id="2157875535253991059">Denna sida visas nu i helskärm.</translation> <translation id="216169395504480358">Lägg till Wi-Fi ...</translation> +<translation id="2162155940152307086">Synkroniseringen startar när du lämnar synkroniseringsinställningarna</translation> <translation id="2163470535490402084">Anslut till internet om du vill logga in på din <ph name="DEVICE_TYPE" />.</translation> <translation id="2166369534954157698">Den snabba röda räven hoppar över den lata hunden</translation> <translation id="2169062631698640254">Logga in ändå</translation> @@ -773,6 +774,7 @@ <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_NAME" /> på <ph name="PEPPER_PLUGIN_DOMAIN" /> vill ha åtkomst till datorn</translation> <translation id="2178614541317717477">CA-kompromiss</translation> <translation id="218070003709087997">Använd ett nummer som anger hur många kopior som ska skrivas ut (1 till 999).</translation> +<translation id="2182253583899676504">Det du skriver i textfält skickas till Google.</translation> <translation id="2184515124301515068">Låt Chrome välja när webbplatser kan spela upp ljud (rekommenderas)</translation> <translation id="2187895286714876935">Fel vid import av servercertifikat</translation> <translation id="2187906491731510095">Tillägg har uppdaterats</translation> @@ -784,7 +786,9 @@ <translation id="2192505247865591433">Från:</translation> <translation id="2193365732679659387">Inställningar för tillförlitlighet</translation> <translation id="2195729137168608510">E-postskydd</translation> +<translation id="2198757192731523470">Google kan anpassa Sök, annonser och andra Google-tjänster utifrån historiken.</translation> <translation id="2199298570273670671">Fel</translation> +<translation id="2199719347983604670">Data från Chrome sync</translation> <translation id="2200094388063410062">E-post</translation> <translation id="2200356397587687044">Du måste ge Chrome behörighet att fortsätta</translation> <translation id="2200603218210188859">Inställningar för USB-enheter</translation> @@ -849,7 +853,6 @@ <translation id="2280486287150724112">Högermarginal</translation> <translation id="2282146716419988068">GPU-bearbetning</translation> <translation id="2282155092769082568">Webbadress för automatisk konfiguration:</translation> -<translation id="2286841657746966508">Faktureringsadress</translation> <translation id="2288181517385084064">Byt till videoinspelaren</translation> <translation id="2288735659267887385">Inställningar för tillgänglighet</translation> <translation id="2292848386125228270">Starta <ph name="PRODUCT_NAME" /> som vanlig användare. Om du behöver köra som systemadministratör startar du om med flaggan --no-sandbox.</translation> @@ -1242,6 +1245,7 @@ <translation id="2889064240420137087">Öppna länk med ...</translation> <translation id="2889925978073739256">Fortsätt att blockera pluginprogram utanför sandlåda</translation> <translation id="2893168226686371498">Standardwebbläsare</translation> +<translation id="2895734772884435517">Du kan när som helst anpassa inställningarna.</translation> <translation id="289644616180464099">SIM-kortet är låst</translation> <translation id="289695669188700754">Nyckel-ID: <ph name="KEY_ID" /></translation> <translation id="2897878306272793870">Vill du verkligen öppna <ph name="TAB_COUNT" /> flikar?</translation> @@ -1710,6 +1714,7 @@ <translation id="3636096452488277381">Hejsan <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" /> % – <ph name="TIME" /> kvar</translation> <translation id="3637682276779847508">SIM-kortet inaktiveras permanent om du inte anger korrekt upplåsningskod för pinkoden.</translation> +<translation id="363863692969456324">Åtgärda stavfel med den förbättrade stavningskontrollen</translation> <translation id="3640214691812501263">Vill du lägga till <ph name="EXTENSION_NAME" /> för <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Bredd</translation> <translation id="3645372836428131288">Flytta fingret något så att en annan del av fingeravtrycket registreras.</translation> @@ -2142,6 +2147,7 @@ <translation id="4310139701823742692">Filen har fel format. Kontrollera PPD-filen och försök igen.</translation> <translation id="431076611119798497">&Info</translation> <translation id="4312866146174492540">Blockera (standard)</translation> +<translation id="4314815835985389558">Hantera synkronisering</translation> <translation id="4316850752623536204">Webbplats för utvecklare</translation> <translation id="4320177379694898372">Ingen internetanslutning</translation> <translation id="4320948194796820126">Lägg till ett bokmärke för din e-post</translation> @@ -2221,6 +2227,7 @@ <translation id="4450974146388585462">Diagnostisera</translation> <translation id="4451757071857432900">Blockeras på webbplatser där påträngande eller vilseledande annonser visas (rekommenderas)</translation> <translation id="4453946976636652378">Sök på <ph name="SEARCH_ENGINE_NAME" /> eller skriv en webbadress</translation> +<translation id="4461835665417498653">Viss systeminformation och visst sidinnehåll skickas anonymt till Google.</translation> <translation id="4462159676511157176">Anpassade namnservrar</translation> <translation id="4467101674048705704">Utöka <ph name="FOLDER_NAME" /></translation> <translation id="4469477701382819144">Blockeras på webbplatser där påträngande eller vilseledande annonser visas</translation> @@ -2385,6 +2392,7 @@ <translation id="4735265153267957659">Aktivera Smart Lock genom att ange lösenordet. Nästa gång låser din mobil upp denna <ph name="DEVICE_TYPE" />. Du kan inaktivera Smart Lock i inställningarna.</translation> <translation id="473546211690256853">Detta konto hanteras av <ph name="DOMAIN" /></translation> <translation id="4735803855089279419">Det gick inte att fastställa enhets-id för den här enheten.</translation> +<translation id="4736292055110123391">Synkronisera bokmärken, lösenord, historik med mera på alla dina enheter</translation> <translation id="4737715515457435632">Anslut till ett nätverk</translation> <translation id="473775607612524610">Uppdatera</translation> <translation id="4742746985488890273">Fäst på hyllan</translation> @@ -2723,6 +2731,7 @@ <translation id="5266113311903163739">Fel vid import av certifikatutfärdare</translation> <translation id="5269977353971873915">Det gick inte att skriva ut dokumentet</translation> <translation id="5270167208902136840">Visa <ph name="NUMBER_OF_MORE_APPS" /> fler appar</translation> +<translation id="5272654297705279635">Anpassade inställningar</translation> <translation id="5275352920323889391">Hund</translation> <translation id="5275973617553375938">Återställda filer från Google Drive</translation> <translation id="527605982717517565">Tillåt alltid JavaScript på <ph name="HOST" /></translation> @@ -4894,6 +4903,7 @@ <translation id="8598453409908276158">Plugin utanför sandlåda har blockerats</translation> <translation id="8601206103050338563">TLS WWW-klientautentisering</translation> <translation id="8602851771975208551">Ett annat program i datorn har lagt till en app som kan ändra hur Chrome fungerar.</translation> +<translation id="8604763363205185560">Hjälp till att göra Chrome bättre och säkrare</translation> <translation id="8605428685123651449">SQLite-minne</translation> <translation id="8606726445206553943">Använda MIDI-enheter</translation> <translation id="8609465669617005112">Flytta upp</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 61663b54..b8e0d015 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -851,7 +851,6 @@ <translation id="2280486287150724112">Pambizo la kulia</translation> <translation id="2282146716419988068">Mchakato wa GPU</translation> <translation id="2282155092769082568">URL ya kuweka mipangilio kiotomatiki:</translation> -<translation id="2286841657746966508">Anwani ya kutoza</translation> <translation id="2288181517385084064">Tumia rekoda ya video</translation> <translation id="2288735659267887385">Mipangilio ya zana za walio na matatizo ya kuona au kusikia</translation> <translation id="2292848386125228270">Tafadhali anzisha <ph name="PRODUCT_NAME" /> ukiwa mtumiaji wa kawaida. Ikiwa unahitaji kutumia kama chanzo cha uimarishaji, tumia tena kwa alama ya --no-sandbox.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 37aa57d..485e4ac675 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -764,6 +764,7 @@ <translation id="215753907730220065">முழுத்திரையிலிருந்து வெளியேறு</translation> <translation id="2157875535253991059">இந்தப் பக்கம் இப்போது முழுத் திரையில்.</translation> <translation id="216169395504480358">வைஃபை ஐச் சேர்...</translation> +<translation id="2162155940152307086">நீங்கள் ஒத்திசைவு அமைப்புகளை விட்டு வெளியேறியவுடன் ஒத்திசைவு தொடங்கும்</translation> <translation id="2163470535490402084">உங்கள் <ph name="DEVICE_TYPE" /> இல் உள்நுழைய இணையத்துடன் இணைக்கவும்.</translation> <translation id="2166369534954157698">அகர முதல எழுத்தெல்லாம் ஆதிபகவன் முதற்றே உலகு</translation> <translation id="2169062631698640254">எப்படியேனும் உள்நுழை</translation> @@ -774,6 +775,7 @@ <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_DOMAIN" /> இல் உள்ள <ph name="PEPPER_PLUGIN_NAME" /> உங்கள் கணினியை அணுக விரும்புகிறது</translation> <translation id="2178614541317717477">CA இணக்கம்</translation> <translation id="218070003709087997">எத்தனை நகல்கள் அச்சிடப்பட வேண்டும் என்பதைக் குறிக்க, எண்ணைப் (1 - 999) பயன்படுத்தவும்.</translation> +<translation id="2182253583899676504">உரைப் புலங்களில் நீங்கள் உள்ளிடும் உரைகள் Googleளுக்கு அனுப்பப்படும்.</translation> <translation id="2184515124301515068">தளங்கள் எப்போது ஒலியை இயக்கலாம் என்பதை Chrome தேர்வு செய்ய அனுமதிக்கவும் (பரிந்துரைக்கப்படுவது)</translation> <translation id="2187895286714876935">சேவையக சான்றிதழ் இறக்குமதி பிழை</translation> <translation id="2187906491731510095">நீட்டிப்புகள் புதுப்பிக்கப்பட்டன</translation> @@ -785,7 +787,9 @@ <translation id="2192505247865591433">அனுப்புநர்:</translation> <translation id="2193365732679659387">நம்பிக்கை தொடர்பான அமைப்புகள்</translation> <translation id="2195729137168608510">மின்னஞ்சல் பாதுகாப்பு</translation> +<translation id="2198757192731523470">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்.</translation> <translation id="2199298570273670671">பிழை</translation> +<translation id="2199719347983604670">Chrome ஒத்திசைவுத் தரவு</translation> <translation id="2200094388063410062">மின்னஞ்சல்</translation> <translation id="2200356397587687044">தொடர, Chromeக்கு அனுமதி தேவை</translation> <translation id="2200603218210188859">USB சாதன விருப்பத்தேர்வுகள்</translation> @@ -850,7 +854,6 @@ <translation id="2280486287150724112">வலது ஓரஇடம்</translation> <translation id="2282146716419988068">GPU செயல்முறை</translation> <translation id="2282155092769082568">தானியங்கு உள்ளமைவு URL:</translation> -<translation id="2286841657746966508">பில்லிங் முகவரி</translation> <translation id="2288181517385084064">வீடியோ ரெக்கார்டருக்கு மாறு</translation> <translation id="2288735659267887385">அணுகல்தன்மை அமைப்புகள்</translation> <translation id="2292848386125228270"><ph name="PRODUCT_NAME" />ஐ வழக்கமான பயனராகத் தொடங்குங்கள். டெவெலப்மென்ட்டுக்காக அதை ரூட் பயனராக இயக்க வேண்டும் எனில், --no-sandbox விருப்பத்தைப் பயன்படுத்தி மீண்டும் இயக்கவும்.</translation> @@ -1244,6 +1247,7 @@ <translation id="2889064240420137087">இதைக் கொண்டு இணைப்பைத் திற...</translation> <translation id="2889925978073739256">சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல்களைத் தொடர்ந்து தடு</translation> <translation id="2893168226686371498">இயல்புநிலை உலாவி</translation> +<translation id="2895734772884435517">இந்த அமைப்புகளை எந்த நேரத்திலும் மாற்றியமைக்கலாம்.</translation> <translation id="289644616180464099">சிம் கார்டு பூட்டப்பட்டுள்ளது</translation> <translation id="289695669188700754">விசை ID: <ph name="KEY_ID" /></translation> <translation id="2897878306272793870">நிச்சயமாக <ph name="TAB_COUNT" /> தாவல்களைத் திறக்க விரும்புகிறீர்களா?</translation> @@ -1711,6 +1715,7 @@ <translation id="3636096452488277381">நலமா <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" />% - <ph name="TIME" /> மீதமுள்ளது</translation> <translation id="3637682276779847508">பின்னின் தடையை நீக்குவதற்கான சரியான குறியீட்டை உள்ளிடவில்லை எனில், சிம் கார்டு நிரந்தரமாக முடக்கப்படும்.</translation> +<translation id="363863692969456324">மேம்படுத்தப்பட்ட எழுத்துப் பிழை சரிபார்ப்பான் அம்சம் மூலம் எழுத்துப் பிழைகளைச் சரிசெய்யலாம்</translation> <translation id="3640214691812501263"><ph name="USER_NAME" />க்கு "<ph name="EXTENSION_NAME" />"ஐச் சேர்க்கவா?</translation> <translation id="3644896802912593514">அகலம்</translation> <translation id="3645372836428131288">கைரேகையின் வேறொரு பகுதியைப் பதிவுசெய்ய, விரலைக் கொஞ்சம் நகர்த்தவும்.</translation> @@ -2143,6 +2148,7 @@ <translation id="4310139701823742692">கோப்பு தவறான வடிவமைப்பில் உள்ளது. PPD கோப்பைச் சரிபார்த்து, மீண்டும் முயலவும்.</translation> <translation id="431076611119798497">&விவரங்கள்</translation> <translation id="4312866146174492540">தடு (இயல்பு)</translation> +<translation id="4314815835985389558">ஒத்திசைவை நிர்வகிக்கும் பக்கம்</translation> <translation id="4316850752623536204">டெவலப்பர் இணையதளம்</translation> <translation id="4320177379694898372">இணைய இணைப்பு இல்லை</translation> <translation id="4320948194796820126">புக்மார்க்கில் சேர்க்க மின்னஞ்சல் சேவையைத் தேர்ந்தெடுக்கவும்</translation> @@ -2222,6 +2228,7 @@ <translation id="4450974146388585462">கண்டறி</translation> <translation id="4451757071857432900">குறுக்கிடும் அல்லது தவறாக வழிநடத்தும் விளம்பரங்களைக் காட்டும் தளங்களில் தடுக்கப்படும் (பரிந்துரைக்கப்படுவது)</translation> <translation id="4453946976636652378"><ph name="SEARCH_ENGINE_NAME" />ஐத் தேடுக அல்லது URLஐ உள்ளிடுக</translation> +<translation id="4461835665417498653">சில சாதனத் தகவலையும் பக்க உள்ளடக்கத்தையும் அடையாளம் நீக்கி Googleளுக்கு அனுப்பும்.</translation> <translation id="4462159676511157176">தனிப்பயன் பெயர் சேவையகங்கள்</translation> <translation id="4467101674048705704"><ph name="FOLDER_NAME" />ஐ விரிக்கும் பொத்தான்</translation> <translation id="4469477701382819144">குறுக்கிடும் அல்லது தவறாக வழிநடத்தும் விளம்பரங்களைக் காட்டும் தளங்களில் தடுக்கப்படும்</translation> @@ -2386,6 +2393,7 @@ <translation id="4735265153267957659">Smart Lockகை இயக்க, கடவுச்சொல்லை உள்ளிடவும். அடுத்த முறை <ph name="DEVICE_TYPE" />ஐ உங்கள் மொபைல் திறக்கும். அமைப்புகளில் Smart Lockகை முடக்கலாம்.</translation> <translation id="473546211690256853">இந்தக் கணக்கு <ph name="DOMAIN" /> ஆல் நிர்வகிக்கப்படுகிறது</translation> <translation id="4735803855089279419">இந்தச் சாதனத்திற்கான சாதன அடையாளங்காட்டிகளை சிஸ்டத்தால் தீர்மானிக்க முடியவில்லை.</translation> +<translation id="4736292055110123391">உங்கள் எல்லாச் சாதனங்களிலும் உங்கள் புக்மார்க்குகள், கடவுச்சொற்கள், வரலாறு, மேலும் பலவற்றை ஒத்திசைக்கலாம்</translation> <translation id="4737715515457435632">நெட்வொர்க்குடன் இணைக்கவும்</translation> <translation id="473775607612524610">புதுப்பி</translation> <translation id="4742746985488890273">அடுக்கில் பொருத்து</translation> @@ -2724,6 +2732,7 @@ <translation id="5266113311903163739">சான்றளிக்கும் மைய இறக்குமதி பிழை</translation> <translation id="5269977353971873915">அச்சிடுதல் தோல்வி</translation> <translation id="5270167208902136840">மேலும் <ph name="NUMBER_OF_MORE_APPS" /> ஆப்ஸைக் காட்டு</translation> +<translation id="5272654297705279635">தனிப்பயன் அமைப்புகள்</translation> <translation id="5275352920323889391">நாய்</translation> <translation id="5275973617553375938">Google இயக்கத்திலிருந்து மீட்கப்பட்ட கோப்புகள்</translation> <translation id="527605982717517565"><ph name="HOST" /> இல் JavaScript ஐ எப்போதும் அனுமதி</translation> @@ -4898,6 +4907,7 @@ <translation id="8598453409908276158">சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல் தடுக்கப்பட்டது</translation> <translation id="8601206103050338563">TLS WWW கிளையன்ட அங்கீகரிப்பு</translation> <translation id="8602851771975208551">உங்கள் கணினியில் உள்ள மற்றொரு நிரலானது, Chrome வேலைசெய்யும் வழியை மாற்றும் பயன்பாட்டைச் சேர்த்துள்ளது.</translation> +<translation id="8604763363205185560">Chromeமின் அம்சங்களையும் பாதுகாப்பையும் மேம்படுத்த உதவுக</translation> <translation id="8605428685123651449">SQLite நினைவகம்</translation> <translation id="8606726445206553943">MIDI சாதனங்களைப் பயன்படுத்தவும்</translation> <translation id="8609465669617005112">மேலே நகர்த்து</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index dab0fad..36df189 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -851,7 +851,6 @@ <translation id="2280486287150724112">కుడి అంచు</translation> <translation id="2282146716419988068">GPU ప్రాసెస్</translation> <translation id="2282155092769082568">ఆటోకాన్ఫిగరేషన్ URL:</translation> -<translation id="2286841657746966508">బిల్లింగ్ చిరునామా</translation> <translation id="2288181517385084064">వీడియో రికార్డర్కి మార్చు</translation> <translation id="2288735659267887385">ప్రాప్యత సెట్టింగ్లు</translation> <translation id="2292848386125228270">దయచేసి సాధారణ వినియోగదారుగా <ph name="PRODUCT_NAME" />ని ప్రారంభించండి. మీరు అభివృద్ధికి మూలమైన దాని వలె అమలు చేయాలనుకుంటే, --no-sandbox ఫ్లాగ్తో మళ్లీ అమలు చేయండి.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index f30dbb0..b7c3d31 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">ขอบขวา</translation> <translation id="2282146716419988068">การประมวลผลของ GPU</translation> <translation id="2282155092769082568">URL การกำหนดค่าอัตโนมัติ:</translation> -<translation id="2286841657746966508">ที่อยู่สำหรับเรียกเก็บเงิน</translation> <translation id="2288181517385084064">สลับไปเป็นโปรแกรมบันทึกวิดีโอ</translation> <translation id="2288735659267887385">การตั้งค่าการเข้าถึง</translation> <translation id="2292848386125228270">โปรดเริ่มต้น <ph name="PRODUCT_NAME" /> ในฐานะผู้ใช้ทั่วไป หากต้องการเรียกใช้ในฐานะผู้ใช้ระดับรากเพื่อการพัฒนา ให้เรียกใช้อีกครั้งโดยตั้งค่าสถานะเป็น no-sandbox</translation> @@ -2677,7 +2676,7 @@ <translation id="5185386675596372454">รุ่นใหม่ล่าสุดของ "<ph name="EXTENSION_NAME" />" ถูกปิดใช้งาน เนื่องจากต้องได้รับการอนุญาตมากกว่านี้</translation> <translation id="5187295959347858724">คุณได้ลงชื่อเข้าใช้ <ph name="SHORT_PRODUCT_NAME" /> แล้วในตอนนี้ บุ๊กมาร์ก ประวัติการเข้าชม และการตั้งค่าอื่นๆ ของคุณจะได้รับการซิงค์กับบัญชี Google</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> -<translation id="5187892128515678283">แชร์อุปกรณ์ USB กับ Linux โดยการเปิดสวิตช์ การแชร์จะทำได้จนกว่าจะถอดอุปกรณ์ออก</translation> +<translation id="5187892128515678283">แชร์อุปกรณ์ USB กับ Linux โดยการเปิดสวิตช์ การแชร์จะยังคงอยู่จนกระทั่งถอดอุปกรณ์ออก</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> ต้องการดาวน์โหลดหลายไฟล์</translation> <translation id="5204673965307125349">โปรดทำ Powerwash อุปกรณ์และลองอีกครั้ง</translation> <translation id="5204967432542742771">ป้อนรหัสผ่าน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 3e028aa..4f4d4bc 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Sağ kenar boşluğu</translation> <translation id="2282146716419988068">GPU İşlemi</translation> <translation id="2282155092769082568">Otomatik yapılandırma URL'si:</translation> -<translation id="2286841657746966508">Fatura adresi</translation> <translation id="2288181517385084064">Video kaydediciye geç</translation> <translation id="2288735659267887385">Erişilebilirlik ayarları</translation> <translation id="2292848386125228270">Lütfen <ph name="PRODUCT_NAME" /> uygulamasını normal bir kullanıcı olarak başlatın. Geliştirme amacıyla uygulamayı root kullanıcı olarak çalıştırmanız gerekiyorsa korumasız alan seçeneğini işaretleyerek yeniden çalıştırın.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 0dfb6bf..9f3078c 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -854,7 +854,6 @@ <translation id="2280486287150724112">Праве поле</translation> <translation id="2282146716419988068">Процес GPU</translation> <translation id="2282155092769082568">URL-адреса автоконфігурації:</translation> -<translation id="2286841657746966508">Розрахункова адреса</translation> <translation id="2288181517385084064">Перейти до запису відео</translation> <translation id="2288735659267887385">Налаштування спеціальних можливостей</translation> <translation id="2292848386125228270">Почніть роботу з <ph name="PRODUCT_NAME" /> як звичайний користувач. Щоб запустити програму для розробки з кореневого каталогу, перезапустіть її, поставивши прапорець біля опції "--не в ізольованому програмному середовищі".</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 1efadd68..998ceaa 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -850,7 +850,6 @@ <translation id="2280486287150724112">Lề phải</translation> <translation id="2282146716419988068">Quá trình GPU</translation> <translation id="2282155092769082568">URL tự động định cấu hình:</translation> -<translation id="2286841657746966508">Địa chỉ thanh toán</translation> <translation id="2288181517385084064">Chuyển sang chế độ quay video</translation> <translation id="2288735659267887385">Cài đặt trợ năng</translation> <translation id="2292848386125228270">Vui lòng khởi động <ph name="PRODUCT_NAME" /> với tư cách người dùng bình thường. Nếu bạn cần chạy dưới dạng chương trình gốc để phát triển, hãy chạy lại bằng cờ --không có-hộp cát.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 305af599..24009b97 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -851,7 +851,6 @@ <translation id="2280486287150724112">右侧页边距</translation> <translation id="2282146716419988068">GPU 进程</translation> <translation id="2282155092769082568">自动配置网址:</translation> -<translation id="2286841657746966508">帐单邮寄地址</translation> <translation id="2288181517385084064">切换到录像机</translation> <translation id="2288735659267887385">无障碍设置</translation> <translation id="2292848386125228270">请以普通用户的身份启动 <ph name="PRODUCT_NAME" />。如果您出于开发目的,需要以根用户的身份运行 Chrome,请使用 --no-sandbox 标记重新运行 Chrome。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index c6fcf45..4c652349 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -847,7 +847,6 @@ <translation id="2280486287150724112">右邊界</translation> <translation id="2282146716419988068">GPU 處理程序</translation> <translation id="2282155092769082568">自動設定網址:</translation> -<translation id="2286841657746966508">帳單地址</translation> <translation id="2288181517385084064">切換至攝影機</translation> <translation id="2288735659267887385">協助工具設定</translation> <translation id="2292848386125228270">請以一般使用者身分啟用 <ph name="PRODUCT_NAME" />。開發時,如要以 root 身分執行,請使用 --no-sandbox 標記重新執行。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index e0251e92..efbad2d 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -35,7 +35,7 @@ <translation id="174539241580958092">Google Chrome לא הצליח לסנכרן את הנתונים שלך בשל שגיאת כניסה.</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1773601347087397504">עזרה לשימוש ב-Chrome OS</translation> -<translation id="1795405610103747296">התקן את Chrome בטלפון שלך, ונשלח הודעת SMS למספר: <ph name="PHONE_NUMBER" /></translation> +<translation id="1795405610103747296">יש להתקין את Chrome בטלפון שלך, ולאחר מכן נשלח הודעת SMS למספר: <ph name="PHONE_NUMBER" /></translation> <translation id="1812689907177901597">כיבוי הגדרה זו יאפשר לך להיכנס לאתרי Google, כמו Gmail, בלי להיכנס אל Chrome</translation> <translation id="1860536484129686729">Chrome זקוק להרשאת גישה למצלמה בשביל האתר הזה</translation> <translation id="1873233029667955273">Google Chrome אינו דפדפן ברירת המחדל שלך</translation> @@ -47,7 +47,7 @@ <translation id="2094919256425865063">לסגור את Chrome בכל זאת?</translation> <translation id="2120620239521071941">פעולה זו תמחק <ph name="ITEMS_COUNT" /> פריטים מהמכשיר. כדי לשחזר את הנתונים מאוחר יותר, היכנס אל Chrome עם <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">דיווח על <ph name="BEGIN_LINK" />ההגדרות הנוכחיות<ph name="END_LINK" /> יעזור לשפר את Chrome</translation> -<translation id="216054706567564023">התקן את Chrome בטלפון שלך, ונשלח הודעת SMS למספר שמוגדר לשחזור החשבון.</translation> +<translation id="216054706567564023">יש להתקין את Chrome בטלפון שלך, ולאחר מכן נשלח הודעת SMS למספר שמוגדר לשחזור החשבון.</translation> <translation id="2246246234298806438">Google Chrome אינו יכול להצג תצוגה מקדימה של ההדפסה כאשר מציג ה-PDF המובנה חסר.</translation> <translation id="2252923619938421629">עזור לשפר את Google Chrome על ידי דיווח על ההגדרות הנוכחיות</translation> <translation id="225363235161345695">{0,plural, =1{Chrome יופעל מחדש בעוד שעה}two{Chrome יופעל מחדש בעוד שעתיים}many{Chrome יופעל מחדש בעוד # שעות}other{Chrome יופעל מחדש בעוד # שעות}}</translation> @@ -244,7 +244,7 @@ <translation id="8032142183999901390">לאחר הסרת החשבון שלך מ-Chrome, ייתכן שתידרש לטעון מחדש את הכרטיסיות הפתוחות שלך כדי שההסרה תיושם בפועל.</translation> <translation id="8077352834923175128">לפי הבקשה של מנהל המערכת, צריך להפעיל מחדש את Chrome OS כדי להחיל את העדכון הזה</translation> <translation id="8129812357326543296">מידע על Google Chrome&</translation> -<translation id="8179874765710681175">התקן את Chrome בטלפון שלך, ונשלח אליו הודעת SMS.</translation> +<translation id="8179874765710681175">יש להתקין את Chrome בטלפון שלך, לאחר מכן אליו הודעת SMS.</translation> <translation id="8183957050892517584">Chrome יאחסן את הפרטים האישיים שלך באופן מאובטח כדי שלא תידרש להקליד אותם שוב.</translation> <translation id="8226081633851087288">{0,plural, =0{Chrome OS תופעל מחדש עכשיו}=1{Chrome OS תופעל מחדש בעוד שנייה אחת}two{Chrome OS תופעל מחדש בעוד שתי שניות}many{Chrome OS תופעל מחדש בעוד # שניות}other{Chrome OS תופעל מחדש בעוד # שניות}}</translation> <translation id="825412236959742607">הדף הזה משתמש בנפח זיכרון גדול מידי, לכן מערכת Chrome הסירה חלק מהתוכן.</translation> @@ -257,7 +257,7 @@ <translation id="8406086379114794905">עזור לשפר את Chrome</translation> <translation id="8432724323949790809">עליך להפעיל מחדש את Google Chrome עכשיו</translation> <translation id="8455999171311319804">אופציונלי: שלח אל Google נתוני אבחון ושימוש באופן אוטומטי ועזור לשפר את מערכת ההפעלה של Chrome.</translation> -<translation id="8478823064122749032">התקן את Chrome בטלפון שלך, ונשלח הודעת SMS למספר שמוגדר לשחזור החשבון: <ph name="PHONE_NUMBER" /></translation> +<translation id="8478823064122749032">יש להתקין את Chrome בטלפון שלך, ולאחר מכן נשלח הודעת SMS למספר שמוגדר לשחזור החשבון: <ph name="PHONE_NUMBER" /></translation> <translation id="8498858610309223613">בוצע עדכון אבטחה מיוחד של Google Chrome. עכשיו עליך להפעיל מחדש את Chrome ואנחנו נשחזר את הכרטיסיות.</translation> <translation id="8521348052903287641">כלל נכנס לגרסת הפיתוח של Google Chrome כדי לאפשר תנועת mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 68080b47..05e1eb06 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -57,6 +57,7 @@ #include "components/download/public/common/download_features.h" #include "components/error_page/common/error_page_switches.h" #include "components/favicon/core/features.h" +#include "components/feature_engagement/buildflags.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/public/feature_list.h" #include "components/feed/feed_feature_list.h" @@ -1001,32 +1002,17 @@ const FeatureEntry::FeatureParam kMarkHttpAsDangerous[] = { {security_state::features::kMarkHttpAsFeatureParameterName, security_state::features::kMarkHttpAsParameterDangerous}}; -const FeatureEntry::FeatureParam kMarkHttpAsWarning[] = { - {security_state::features::kMarkHttpAsFeatureParameterName, - security_state::features::kMarkHttpAsParameterWarning}}; const FeatureEntry::FeatureParam kMarkHttpAsWarningAndDangerousOnFormEdits[] = { {security_state::features::kMarkHttpAsFeatureParameterName, security_state::features:: kMarkHttpAsParameterWarningAndDangerousOnFormEdits}}; -const FeatureEntry::FeatureParam - kMarkHttpAsWarningAndDangerousOnPasswordsAndCreditCards[] = { - {security_state::features::kMarkHttpAsFeatureParameterName, - security_state::features:: - kMarkHttpAsParameterWarningAndDangerousOnPasswordsAndCreditCards}}; const FeatureEntry::FeatureVariation kMarkHttpAsFeatureVariations[] = { {"(mark as actively dangerous)", kMarkHttpAsDangerous, - arraysize(kMarkHttpAsDangerous), nullptr}, - {"(mark with a Not Secure warning)", kMarkHttpAsWarning, - arraysize(kMarkHttpAsWarning), nullptr}, + base::size(kMarkHttpAsDangerous), nullptr}, {"(mark with a Not Secure warning and dangerous on form edits)", kMarkHttpAsWarningAndDangerousOnFormEdits, - arraysize(kMarkHttpAsWarningAndDangerousOnFormEdits), nullptr}, - {"(mark with a Not Secure warning and dangerous on passwords and credit " - "card fields)", - kMarkHttpAsWarningAndDangerousOnPasswordsAndCreditCards, - arraysize(kMarkHttpAsWarningAndDangerousOnPasswordsAndCreditCards), - nullptr}}; + base::size(kMarkHttpAsWarningAndDangerousOnFormEdits), nullptr}}; #if defined(OS_ANDROID) && BUILDFLAG(ENABLE_VR) const FeatureEntry::FeatureParam kWebXrRenderPathChoiceClientWait[] = { @@ -2905,14 +2891,6 @@ kOsAll, FEATURE_VALUE_TYPE( autofill::features::kAutofillUpstreamEditableExpirationDate)}, - {"enable-autofill-credit-card-upload-google-pay-on-android-branding", - flag_descriptions:: - kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingName, - flag_descriptions:: - kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingDescription, - kOsAndroid, - FEATURE_VALUE_TYPE( - autofill::features::kAutofillUpstreamUseGooglePayBrandingOnMobile)}, {"enable-autofill-local-card-migration-show-feedback", flag_descriptions::kEnableAutofillLocalCardMigrationShowFeedbackName, flag_descriptions:: @@ -3677,14 +3655,6 @@ flag_descriptions::kAutofillPrefilledFieldsDescription, kOsAll, FEATURE_VALUE_TYPE(autofill::features::kAutofillPrefilledFields)}, - {"autofill-rationalize-repeated-server-predictions", - flag_descriptions::kAutofillRationalizeRepeatedServerPredictionsName, - flag_descriptions:: - kAutofillRationalizeRepeatedServerPredictionsDescription, - kOsAll, - FEATURE_VALUE_TYPE( - autofill::features::kAutofillRationalizeRepeatedServerPredictions)}, - {"autofill-restrict-formless-form-extraction", flag_descriptions::kAutofillRestrictUnownedFieldsToFormlessCheckoutName, flag_descriptions:: @@ -4361,6 +4331,13 @@ flag_descriptions::kEnableCustomMacPaperSizesDescription, kOsMac, FEATURE_VALUE_TYPE(printing::features::kEnableCustomMacPaperSizes)}, #endif + +#if BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) + {"enable-reopen-tab-in-product-help", + flag_descriptions::kReopenTabInProductHelpName, + flag_descriptions::kReopenTabInProductHelpDescription, kOsDesktop, + FEATURE_VALUE_TYPE(feature_engagement::kIPHReopenTabFeature)}, +#endif // BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) }; class FlagsStateSingleton {
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc index bf790a4..e24bf52b 100644 --- a/chrome/browser/android/bookmarks/bookmark_bridge.cc +++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -458,7 +458,11 @@ nodes.pop(); for (int i = 0; i < node->child_count(); ++i) { + // Empty title means deleted partner bookmarks or folders. See + // PartnerBookmarksShim::RemoveBookmark(). const BookmarkNode* child = node->GetChild(i); + if (GetTitle(child).empty()) + continue; if (child->is_folder()) { nodes.push(child); } else {
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index ab9515d..adaec4f 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -264,16 +264,16 @@ <include name="IDR_MD_BOOKMARKS_IMAGES_FOLDER_SVG" file="resources\md_bookmarks\images\folder.svg" type="BINDATA" /> <if expr="optimize_webui"> <then> - <include name="IDR_MD_BOOKMARKS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_MD_BOOKMARKS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_MD_BOOKMARKS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" /> + <include name="IDR_MD_BOOKMARKS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\vulcanized.html" use_base_dir="false" preprocess="true" type="BINDATA" compress="gzip" /> + <include name="IDR_MD_BOOKMARKS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\vulcanized.p2.html" use_base_dir="false" preprocess="true" type="BINDATA" compress="gzip" /> + <include name="IDR_MD_BOOKMARKS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\crisper.js" use_base_dir="false" preprocess="true" type="BINDATA" compress="gzip" /> </then> <else> <include name="IDR_MD_BOOKMARKS_ACTIONS_HTML" file="resources\md_bookmarks\actions.html" type="BINDATA" /> <include name="IDR_MD_BOOKMARKS_ACTIONS_JS" file="resources\md_bookmarks\actions.js" type="BINDATA" /> <include name="IDR_MD_BOOKMARKS_API_LISTENER_HTML" file="resources\md_bookmarks\api_listener.html" type="BINDATA" /> <include name="IDR_MD_BOOKMARKS_API_LISTENER_JS" file="resources\md_bookmarks\api_listener.js" type="BINDATA" /> - <include name="IDR_MD_BOOKMARKS_APP_HTML" file="resources\md_bookmarks\app.html" type="BINDATA" flattenhtml="true" /> + <include name="IDR_MD_BOOKMARKS_APP_HTML" file="resources\md_bookmarks\app.html" type="BINDATA" preprocess="true" /> <include name="IDR_MD_BOOKMARKS_APP_JS" file="resources\md_bookmarks\app.js" type="BINDATA" /> <include name="IDR_MD_BOOKMARKS_BOOKMARKS_HTML" file="resources\md_bookmarks\bookmarks.html" type="BINDATA" /> <include name="IDR_MD_BOOKMARKS_COMMAND_MANAGER_HTML" file="resources\md_bookmarks\command_manager.html" type="BINDATA" />
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc index 4a9458e..a389530 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
@@ -35,6 +35,7 @@ #include "chrome/browser/supervised_user/supervised_user_constants.h" #include "chrome/browser/ui/app_list/arc/arc_data_removal_dialog.h" #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" +#include "chrome/common/chrome_switches.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/account_manager/account_manager.h" @@ -59,6 +60,7 @@ #include "components/signin/core/browser/account_tracker_service.h" #include "components/user_manager/scoped_user_manager.h" #include "components/user_manager/user_manager.h" +#include "components/user_manager/user_names.h" #include "content/public/browser/browser_task_traits.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" @@ -263,9 +265,6 @@ identity_test_environment_adaptor_->identity_test_env(); identity_test_env->SetAutomaticIssueOfAccessTokens(true); identity_test_env->MakePrimaryAccountAvailable(kFakeUserName); - identity_test_env->identity_manager() - ->GetAccountsMutator() - ->LoadAccountsFromDisk(kFakeUserName); profile()->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true); profile()->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, true); @@ -469,6 +468,19 @@ ArcAuthServiceTest::SetUp(); } + void SetUpCommandLine(base::CommandLine* command_line) override { + // Configure primary profile to be a guest profile, because the + // AccountManager can't deal with regular profiles in tests. + // https://crbug.com/915628 + command_line->AppendSwitch(chromeos::switches::kGuestSession); + command_line->AppendSwitch(switches::kIncognito); + command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, "hash"); + command_line->AppendSwitchASCII( + chromeos::switches::kLoginUser, + user_manager::GuestAccountId().GetUserEmail()); + ArcAuthServiceTest::SetUpCommandLine(command_line); + } + AccountInfo SetupGaiaAccount(const std::string& email, const std::string& token) { SetAccountAndProfile(user_manager::USER_TYPE_REGULAR);
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc index 97fa01c..9b7be3f 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -34,7 +34,6 @@ #include "ui/base/ime/ime_bridge.h" #include "ui/base/ime/mock_ime_input_context_handler.h" #include "ui/base/ime/mock_input_method.h" -#include "ui/base/ui_base_features.h" namespace arc { namespace { @@ -714,10 +713,6 @@ } TEST_F(ArcInputMethodManagerServiceTest, DisableFallbackVirtualKeyboard) { - // TODO(crbug.com/910240): fix for mash. - if (features::IsSingleProcessMash()) - return; - namespace ceiu = chromeos::extension_ime_util; using crx_file::id_util::GenerateId;
diff --git a/chrome/browser/chromeos/arc/print/arc_print_service.cc b/chrome/browser/chromeos/arc/print/arc_print_service.cc index 328fd9e..5dee7008 100644 --- a/chrome/browser/chromeos/arc/print/arc_print_service.cc +++ b/chrome/browser/chromeos/arc/print/arc_print_service.cc
@@ -12,6 +12,7 @@ #include "base/bind_helpers.h" #include "base/memory/singleton.h" +#include "base/metrics/histogram_macros.h" #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "chrome/browser/chrome_notification_types.h" @@ -473,6 +474,8 @@ document->SetDocument(std::move(metafile_) /* metafile */, gfx::Size() /* paper_size */, gfx::Rect() /* page_rect */); + UMA_HISTOGRAM_COUNTS_1000("Arc.CupsPrinting.PageCount", + document->page_count()); job_->StartPrinting(); }
diff --git a/chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.cc b/chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.cc index 1201097..ff36e20 100644 --- a/chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.cc +++ b/chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.cc
@@ -23,7 +23,6 @@ #include "chrome/browser/notifications/notification_display_service.h" #include "chrome/browser/notifications/notification_display_service_factory.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" #include "chrome/common/pref_names.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" @@ -37,7 +36,6 @@ #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "components/signin/core/browser/profile_oauth2_token_service.h" #include "dbus/message.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -93,7 +91,7 @@ return adjusted_config; } -// Sets up Chrome OS Account Manager and starts |ProfileOAuth2TokenService|. +// Sets up Chrome OS Account Manager. // |profile| is a non-owning pointer to |Profile|. // |object_guid| is the Active Directory Object GUID for the Device Account. void SetupAccountManager(Profile* profile, const std::string& object_guid) { @@ -113,11 +111,6 @@ object_guid, account_manager::AccountType::ACCOUNT_TYPE_ACTIVE_DIRECTORY}, AccountManager::kActiveDirectoryDummyToken); - - // Needed to work with Secondary Accounts in Chrome OS Account Manager. The - // value of |primary_account_id| doesn't matter. - ProfileOAuth2TokenServiceFactory::GetForProfile(profile)->LoadCredentials( - std::string() /* primary_account_id */); } } // namespace @@ -413,7 +406,6 @@ : BrowserContextKeyedServiceFactory( "AuthPolicyCredentialsManager", BrowserContextDependencyManager::GetInstance()) { - DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance()); } AuthPolicyCredentialsManagerFactory::~AuthPolicyCredentialsManagerFactory() {}
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index 400fba6..bb32618 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -16,6 +16,7 @@ #include "components/session_manager/core/session_manager.h" #include "components/user_manager/user_manager.h" #include "services/identity/public/cpp/identity_manager.h" +#include "services/identity/public/cpp/identity_test_utils.h" #include "ui/keyboard/public/keyboard_switches.h" namespace file_manager { @@ -978,14 +979,10 @@ account_id, base::UTF8ToUTF16(info.display_name)); Profile* profile = chromeos::ProfileHelper::GetProfileByUserIdHashForTest(info.hash); - // TODO(https://crbug.com/814307): We can't use - // identity::MakePrimaryAccountAvailable from identity_test_utils.h here - // because that DCHECKs that the SigninManager isn't authenticated yet. - // Here, it *can* be already authenticated if a PRE_ test previously set up - // the user. - IdentityManagerFactory::GetForProfile(profile) - ->SetPrimaryAccountSynchronouslyForTests(info.gaia_id, info.email, - "refresh_token"); + identity::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile); + if (!identity_manager->HasPrimaryAccount()) + identity::MakePrimaryAccountAvailable(identity_manager, info.email); } GuestMode GetGuestMode() const override { return NOT_IN_GUEST_MODE; }
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc index da0a4a9..d2dc1cb 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.cc +++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -2040,8 +2040,11 @@ } void UserSessionManager::StartAccountManagerMigration(Profile* profile) { - chromeos::AccountManagerMigratorFactory::GetForBrowserContext(profile) - ->Start(); + // |migrator| is nullptr for incognito profiles. + auto* migrator = + chromeos::AccountManagerMigratorFactory::GetForBrowserContext(profile); + if (migrator) + migrator->Start(); } EasyUnlockKeyManager* UserSessionManager::GetEasyUnlockKeyManager() {
diff --git a/chrome/browser/chromeos/login/signin/oauth2_login_manager.cc b/chrome/browser/chromeos/login/signin/oauth2_login_manager.cc index e8f4e539..8cf91a0d 100644 --- a/chrome/browser/chromeos/login/signin/oauth2_login_manager.cc +++ b/chrome/browser/chromeos/login/signin/oauth2_login_manager.cc
@@ -80,12 +80,6 @@ } void OAuth2LoginManager::RestoreSessionFromSavedTokens() { - // Just return if there is a pending TokenService::LoadCredentials call. - // Session restore continues in OnRefreshTokenAvailable when the call - // finishes. - if (pending_token_service_load_) - return; - ProfileOAuth2TokenService* token_service = GetTokenService(); const std::string primary_account_id = GetPrimaryAccountId(); if (token_service->RefreshTokenIsAvailable(primary_account_id)) { @@ -93,7 +87,7 @@ FireRefreshTokensLoaded(); VerifySessionCookies(); } else { - VLOG(1) << "Loading OAuth2 refresh token from database."; + VLOG(1) << "Waiting for OAuth2 refresh token being loaded from database."; // Flag user with unknown token status in case there are no saved tokens // and OnRefreshTokenAvailable is not called. Flagging it here would @@ -102,9 +96,6 @@ user_manager::UserManager::Get()->SaveUserOAuthStatus( AccountId::FromUserEmail(primary_account_id), user_manager::User::OAUTH_TOKEN_STATUS_UNKNOWN); - - pending_token_service_load_ = true; - token_service->LoadCredentials(primary_account_id); } } @@ -148,7 +139,6 @@ AccountId::FromUserEmail(user_email), user_manager::User::OAUTH2_TOKEN_STATUS_VALID); - pending_token_service_load_ = false; VerifySessionCookies(); } }
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc index 8eb63b1..010df65 100644 --- a/chrome/browser/chromeos/policy/device_status_collector.cc +++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -1021,9 +1021,7 @@ } void DeviceStatusCollector::CheckIdleState() { - CalculateIdleState(kIdleStateThresholdSeconds, - base::Bind(&DeviceStatusCollector::IdleStateCallback, - base::Unretained(this))); + ProcessIdleState(ui::CalculateIdleState(kIdleStateThresholdSeconds)); } void DeviceStatusCollector::UpdateReportingSettings() { @@ -1103,7 +1101,7 @@ last_cpu_idle_ = 0; } -void DeviceStatusCollector::IdleStateCallback(ui::IdleState state) { +void DeviceStatusCollector::ProcessIdleState(ui::IdleState state) { // Do nothing if device activity reporting is disabled or if it's a child // account. Usage time for child accounts are calculated differently. if (!report_activity_times_ || !is_enterprise_reporting_ ||
diff --git a/chrome/browser/chromeos/policy/device_status_collector.h b/chrome/browser/chromeos/policy/device_status_collector.h index 48b8ec0..a6a9c0d 100644 --- a/chrome/browser/chromeos/policy/device_status_collector.h +++ b/chrome/browser/chromeos/policy/device_status_collector.h
@@ -188,8 +188,8 @@ // Used instead of base::Time::Now(), to make testing possible. virtual base::Time GetCurrentTime(); - // Callback which receives the results of the idle state check. - void IdleStateCallback(ui::IdleState state); + // Handles the results of the idle state check. + void ProcessIdleState(ui::IdleState state); // Gets the version of the passed app. Virtual to allow mocking. virtual std::string GetAppVersion(const std::string& app_id);
diff --git a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc index 2b65c4c..26105e9c 100644 --- a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
@@ -154,7 +154,7 @@ void Simulate(ui::IdleState* states, int len) { for (int i = 0; i < len; i++) - IdleStateCallback(states[i]); + ProcessIdleState(states[i]); } void set_max_stored_past_activity_interval(TimeDelta value) {
diff --git a/chrome/browser/content_settings/content_settings_origin_identifier_value_map_unittest.cc b/chrome/browser/content_settings/content_settings_origin_identifier_value_map_unittest.cc index b295a1e..e1e4781 100644 --- a/chrome/browser/content_settings/content_settings_origin_identifier_value_map_unittest.cc +++ b/chrome/browser/content_settings/content_settings_origin_identifier_value_map_unittest.cc
@@ -24,7 +24,7 @@ map.SetValue(ContentSettingsPattern::FromString("[*.]google.com"), ContentSettingsPattern::FromString("[*.]google.com"), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), base::Time(), - new base::Value(1)); + base::Value(1)); std::unique_ptr<base::Value> expected_value(new base::Value(1)); EXPECT_TRUE(expected_value->Equals(map.GetValue(GURL("http://www.google.com"), @@ -68,7 +68,7 @@ map.SetValue(ContentSettingsPattern::FromString("[*.]google.com"), ContentSettingsPattern::FromString("[*.]google.com"), CONTENT_SETTINGS_TYPE_PLUGINS, "java-plugin", base::Time(), - new base::Value(1)); + base::Value(1)); int actual_value; EXPECT_TRUE(map.GetValue(GURL("http://www.google.com"), @@ -117,11 +117,11 @@ map.SetValue(ContentSettingsPattern::FromString("[*.]google.com"), ContentSettingsPattern::FromString("[*.]google.com"), CONTENT_SETTINGS_TYPE_PLUGINS, "java-plugin", base::Time(), - new base::Value(1)); + base::Value(1)); map.SetValue(ContentSettingsPattern::FromString("[*.]google.com"), ContentSettingsPattern::FromString("[*.]google.com"), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), base::Time(), - new base::Value(1)); + base::Value(1)); EXPECT_FALSE(map.empty()); int actual_value; EXPECT_TRUE(map.GetValue(GURL("http://www.google.com"), @@ -145,12 +145,12 @@ map.SetValue(ContentSettingsPattern::FromString("[*.]google.com"), ContentSettingsPattern::FromString("[*.]google.com"), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), base::Time(), - new base::Value(1)); + base::Value(1)); map.SetValue(ContentSettingsPattern::FromString("www.google.com"), ContentSettingsPattern::FromString("[*.]google.com"), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), base::Time(), - new base::Value(2)); + base::Value(2)); int actual_value; EXPECT_TRUE(map.GetValue(GURL("http://mail.google.com"), @@ -185,17 +185,17 @@ base::Time t2 = t1 + base::TimeDelta::FromSeconds(1); map.SetValue(pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), t1, - new base::Value(1)); + base::Value(1)); map.SetValue(sub_pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), t2, - new base::Value(2)); + base::Value(2)); std::unique_ptr<content_settings::RuleIterator> rule_iterator( map.GetRuleIterator(CONTENT_SETTINGS_TYPE_COOKIES, std::string(), NULL)); ASSERT_TRUE(rule_iterator->HasNext()); content_settings::Rule rule = rule_iterator->Next(); EXPECT_EQ(sub_pattern, rule.primary_pattern); - EXPECT_EQ(2, content_settings::ValueToContentSetting(rule.value.get())); + EXPECT_EQ(2, content_settings::ValueToContentSetting(&rule.value)); EXPECT_EQ(t2, map.GetLastModified(rule.primary_pattern, rule.secondary_pattern, CONTENT_SETTINGS_TYPE_COOKIES, std::string())); @@ -203,7 +203,7 @@ ASSERT_TRUE(rule_iterator->HasNext()); rule = rule_iterator->Next(); EXPECT_EQ(pattern, rule.primary_pattern); - EXPECT_EQ(1, content_settings::ValueToContentSetting(rule.value.get())); + EXPECT_EQ(1, content_settings::ValueToContentSetting(&rule.value)); EXPECT_EQ(t1, map.GetLastModified(rule.primary_pattern, rule.secondary_pattern, CONTENT_SETTINGS_TYPE_COOKIES, std::string())); @@ -220,10 +220,10 @@ base::Time t1 = base::Time::Now(); map.SetValue(pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), t1, - new base::Value(1)); + base::Value(1)); map.SetValue(sub_pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), t1, - new base::Value(2)); + base::Value(2)); { std::unique_ptr<content_settings::RuleIterator> rule_iterator( @@ -232,13 +232,13 @@ ASSERT_TRUE(rule_iterator->HasNext()); content_settings::Rule rule = rule_iterator->Next(); EXPECT_EQ(sub_pattern, rule.primary_pattern); - EXPECT_EQ(2, content_settings::ValueToContentSetting(rule.value.get())); + EXPECT_EQ(2, content_settings::ValueToContentSetting(&rule.value)); EXPECT_EQ( t1, map.GetLastModified(rule.primary_pattern, rule.secondary_pattern, CONTENT_SETTINGS_TYPE_COOKIES, std::string())); rule = rule_iterator->Next(); EXPECT_EQ(pattern, rule.primary_pattern); - EXPECT_EQ(1, content_settings::ValueToContentSetting(rule.value.get())); + EXPECT_EQ(1, content_settings::ValueToContentSetting(&rule.value)); EXPECT_EQ( t1, map.GetLastModified(rule.primary_pattern, rule.secondary_pattern, CONTENT_SETTINGS_TYPE_COOKIES, std::string())); @@ -247,7 +247,7 @@ base::Time t2 = t1 + base::TimeDelta::FromSeconds(1); map.SetValue(pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), t2, - new base::Value(3)); + base::Value(3)); { std::unique_ptr<content_settings::RuleIterator> rule_iterator = @@ -255,13 +255,13 @@ ASSERT_TRUE(rule_iterator->HasNext()); content_settings::Rule rule = rule_iterator->Next(); EXPECT_EQ(sub_pattern, rule.primary_pattern); - EXPECT_EQ(2, content_settings::ValueToContentSetting(rule.value.get())); + EXPECT_EQ(2, content_settings::ValueToContentSetting(&rule.value)); EXPECT_EQ( t1, map.GetLastModified(rule.primary_pattern, rule.secondary_pattern, CONTENT_SETTINGS_TYPE_COOKIES, std::string())); rule = rule_iterator->Next(); EXPECT_EQ(pattern, rule.primary_pattern); - EXPECT_EQ(3, content_settings::ValueToContentSetting(rule.value.get())); + EXPECT_EQ(3, content_settings::ValueToContentSetting(&rule.value)); EXPECT_EQ( t2, map.GetLastModified(rule.primary_pattern, rule.secondary_pattern, CONTENT_SETTINGS_TYPE_COOKIES, std::string()));
diff --git a/chrome/browser/content_settings/content_settings_policy_provider_unittest.cc b/chrome/browser/content_settings/content_settings_policy_provider_unittest.cc index 35c33e2e..276f59e 100644 --- a/chrome/browser/content_settings/content_settings_policy_provider_unittest.cc +++ b/chrome/browser/content_settings/content_settings_policy_provider_unittest.cc
@@ -59,7 +59,7 @@ EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.primary_pattern); EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.secondary_pattern); - EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(rule.value.get())); + EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(&rule.value)); provider.ShutdownOnUIThread(); } @@ -81,7 +81,7 @@ EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.primary_pattern); EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.secondary_pattern); - EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(rule.value.get())); + EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(&rule.value)); provider.ShutdownOnUIThread(); } @@ -116,7 +116,7 @@ EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.primary_pattern); EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.secondary_pattern); - EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(rule.value.get())); + EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(&rule.value)); provider.ShutdownOnUIThread(); }
diff --git a/chrome/browser/content_settings/content_settings_supervised_provider_unittest.cc b/chrome/browser/content_settings/content_settings_supervised_provider_unittest.cc index e5d38f1a..e7c04f0a 100644 --- a/chrome/browser/content_settings/content_settings_supervised_provider_unittest.cc +++ b/chrome/browser/content_settings/content_settings_supervised_provider_unittest.cc
@@ -69,7 +69,7 @@ EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.primary_pattern); EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.secondary_pattern); - EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(rule.value.get())); + EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(&rule.value)); // Re-enable the default geolocation setting. EXPECT_CALL(mock_observer_, @@ -103,7 +103,7 @@ EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.primary_pattern); EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.secondary_pattern); - EXPECT_EQ(CONTENT_SETTING_ALLOW, ValueToContentSetting(rule.value.get())); + EXPECT_EQ(CONTENT_SETTING_ALLOW, ValueToContentSetting(&rule.value)); // Re-enable the default cookie setting. EXPECT_CALL(mock_observer_, @@ -144,7 +144,7 @@ EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.primary_pattern); EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.secondary_pattern); - EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(rule.value.get())); + EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(&rule.value)); rule_iterator = provider_->GetRuleIterator( CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, std::string(), false); @@ -154,7 +154,7 @@ EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.primary_pattern); EXPECT_EQ(ContentSettingsPattern::Wildcard(), rule.secondary_pattern); - EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(rule.value.get())); + EXPECT_EQ(CONTENT_SETTING_BLOCK, ValueToContentSetting(&rule.value)); // Re-enable the default camera and microphone setting. EXPECT_CALL(
diff --git a/chrome/browser/download/notification/download_notification_interactive_uitest.cc b/chrome/browser/download/notification/download_notification_interactive_uitest.cc index c959179..bdaa5510 100644 --- a/chrome/browser/download/notification/download_notification_interactive_uitest.cc +++ b/chrome/browser/download/notification/download_notification_interactive_uitest.cc
@@ -40,6 +40,7 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/url_request/url_request_slow_download_job.h" #include "services/identity/public/cpp/identity_manager.h" +#include "services/identity/public/cpp/identity_test_utils.h" #include "ui/base/l10n/l10n_util.h" #include "url/gurl.h" @@ -877,14 +878,11 @@ base::UTF8ToUTF16(info.display_name)); Profile* profile = chromeos::ProfileHelper::GetProfileByUserIdHashForTest(info.hash); - // TODO(https://crbug.com/814307): We can't use - // identity::MakePrimaryAccountAvailable from identity_test_utils.h here - // because that DCHECKs that the SigninManager isn't authenticated yet. - // Here, it *can* be already authenticated if a PRE_ test previously set up - // the user. - IdentityManagerFactory::GetForProfile(profile) - ->SetPrimaryAccountSynchronouslyForTests(info.gaia_id, info.email, - "refresh_token"); + + identity::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile); + if (!identity_manager->HasPrimaryAccount()) + identity::MakePrimaryAccountAvailable(identity_manager, info.email); } std::unique_ptr<NotificationDisplayServiceTester> display_service1_;
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_store.cc b/chrome/browser/extensions/api/content_settings/content_settings_store.cc index 902dcd3..ebd3615 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_store.cc +++ b/chrome/browser/extensions/api/content_settings/content_settings_store.cc
@@ -113,7 +113,7 @@ } else { // Do not set a timestamp for extension settings. map->SetValue(primary_pattern, secondary_pattern, type, identifier, - base::Time(), new base::Value(setting)); + base::Time(), base::Value(setting)); } } @@ -306,7 +306,7 @@ content_settings_api_constants::kResourceIdentifierKey, key.resource_identifier); ContentSetting content_setting = - content_settings::ValueToContentSetting(rule.value.get()); + content_settings::ValueToContentSetting(&rule.value); DCHECK_NE(CONTENT_SETTING_DEFAULT, content_setting); std::string setting_string =
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc b/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc index 439eb61..f5ec828 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc +++ b/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc
@@ -35,7 +35,7 @@ ContentSetting setting) { EXPECT_EQ(primary_pattern.ToString(), rule.primary_pattern.ToString()); EXPECT_EQ(secondary_pattern.ToString(), rule.secondary_pattern.ToString()); - EXPECT_EQ(setting, content_settings::ValueToContentSetting(rule.value.get())); + EXPECT_EQ(setting, content_settings::ValueToContentSetting(&rule.value)); } // Helper class which returns monotonically-increasing base::Time objects.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 004ab06c..ef59a79 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -1689,6 +1689,11 @@ "expiry_milestone": 76 }, { + "name": "enable-reopen-tab-in-product-help", + "owners": [ "collinbaker" ], + "expiry_milestone": 76 + }, + { "name": "enable-request-tablet-site", // "owners": [ "your-team" ], "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index bf9e615..3cdde527 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -123,11 +123,6 @@ const char kAutofillPreviewStyleExperimentDescription[] = "Allows experimentation with the Autofill field preview's style."; -const char kAutofillRationalizeRepeatedServerPredictionsName[] = - "Autofill Rationalization of Repeated Server Field Type Predictions"; -const char kAutofillRationalizeRepeatedServerPredictionsDescription[] = - "Allows autofill to rationalize repeated server field type predictions."; - const char kAutofillEnforceMinRequiredFieldsForHeuristicsName[] = "Autofill Enforce Min Required Fields For Heuristics"; const char kAutofillEnforceMinRequiredFieldsForHeuristicsDescription[] = @@ -388,13 +383,6 @@ "offering card upload to Google Payments, the offer-to-save dialog " "displays an expiration date selector."; -const char kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingName[] = - "Enable Google Pay branding when offering credit card upload on Android"; -const char - kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingDescription[] = - "If enabled, shows the Google Pay logo and a shorter header message " - "when credit card upload to Google Payments is offered on Android."; - const char kEnableAutofillLocalCardMigrationShowFeedbackName[] = "Show the upload results dialog after local card migration"; const char kEnableAutofillLocalCardMigrationShowFeedbackDescription[] = @@ -3752,6 +3740,15 @@ #endif // #if defined(WEBRTC_USE_PIPEWIRE) +#if BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) + +const char kReopenTabInProductHelpName[] = "Reopen tab in-product help"; +const char kReopenTabInProductHelpDescription[] = + "Enable in-product help that guides a user to reopen a tab if it looks " + "like they accidentally closed it."; + +#endif // BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) + // ============================================================================ // Don't just add flags to the end, put them in the right section in // alphabetical order just like the header file.
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index e80d1fa..11d67fa 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -10,6 +10,7 @@ #include "build/build_config.h" #include "build/buildflag.h" #include "chrome/common/buildflags.h" +#include "components/feature_engagement/buildflags.h" #include "components/nacl/common/buildflags.h" #include "device/vr/buildflags/buildflags.h" #include "media/media_buildflags.h" @@ -109,9 +110,6 @@ extern const char kAutofillPreviewStyleExperimentName[]; extern const char kAutofillPreviewStyleExperimentDescription[]; -extern const char kAutofillRationalizeRepeatedServerPredictionsName[]; -extern const char kAutofillRationalizeRepeatedServerPredictionsDescription[]; - extern const char kAutofillRestrictUnownedFieldsToFormlessCheckoutName[]; extern const char kAutofillRestrictUnownedFieldsToFormlessCheckoutDescription[]; @@ -262,11 +260,6 @@ extern const char kEnableAutofillCreditCardUploadEditableExpirationDateDescription[]; -extern const char - kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingName[]; -extern const char - kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingDescription[]; - extern const char kEnableAutofillLocalCardMigrationShowFeedbackName[]; extern const char kEnableAutofillLocalCardMigrationShowFeedbackDescription[]; @@ -2272,6 +2265,13 @@ #endif // #if defined(WEBRTC_USE_PIPEWIRE) +#if BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) + +extern const char kReopenTabInProductHelpName[]; +extern const char kReopenTabInProductHelpDescription[]; + +#endif // BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) + // ============================================================================ // Don't just add flags to the end, put them in the right section in // alphabetical order. See top instructions for more.
diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_log_uploader.cc index b0ab4876..eeb8134 100644 --- a/chrome/browser/media/webrtc/webrtc_log_uploader.cc +++ b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
@@ -18,6 +18,7 @@ #include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/media/webrtc/webrtc_logging_handler_host.h" #include "chrome/browser/net/system_network_context_manager.h" #include "components/version_info/version_info.h" #include "components/webrtc_logging/browser/log_cleanup.h" @@ -197,6 +198,9 @@ DPLOG(WARNING) << "Could not read WebRTC log file."; base::UmaHistogramSparse("WebRtcTextLogging.UploadFailed", upload_data.web_app_id); + base::UmaHistogramSparse( + "WebRtcTextLogging.UploadFailureReason", + WebRtcLoggingHandlerHost::UploadFailureReason::kStoredLogNotFound); base::PostTaskWithTraits( FROM_HERE, {BrowserThread::UI}, base::BindOnce(upload_data.callback, false, "", "Log doesn't exist.")); @@ -648,6 +652,8 @@ } else { base::UmaHistogramSparse("WebRtcTextLogging.UploadFailed", upload_done_data.web_app_id); + base::UmaHistogramSparse("WebRtcTextLogging.UploadFailureReason", + response_code); error_message = "Uploading failed, response code: " + base::IntToString(response_code); }
diff --git a/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc b/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc index 0404c2a..35872e0 100644 --- a/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc +++ b/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc
@@ -530,8 +530,11 @@ // If the channel is closing we don't log failure to UMA for consistency, // since there are other cases during shutdown were we don't get a chance // to log. - if (!channel_is_closing) + if (!channel_is_closing) { base::UmaHistogramSparse("WebRtcTextLogging.UploadFailed", web_app_id_); + base::UmaHistogramSparse("WebRtcTextLogging.UploadFailureReason", + UploadFailureReason::kInvalidState); + } base::PostTaskWithTraits( FROM_HERE, {content::BrowserThread::UI}, base::BindOnce(callback, false, "",
diff --git a/chrome/browser/media/webrtc/webrtc_logging_handler_host.h b/chrome/browser/media/webrtc/webrtc_logging_handler_host.h index 235fb09..34404c8 100644 --- a/chrome/browser/media/webrtc/webrtc_logging_handler_host.h +++ b/chrome/browser/media/webrtc/webrtc_logging_handler_host.h
@@ -65,6 +65,14 @@ // Key used to attach the handler to the RenderProcessHost. static const char kWebRtcLoggingHandlerHostKey[]; + // Upload failure reasons used for UMA stats. A failure reason can be one of + // those listed here or a response code for the upload HTTP request. The + // values in this list must be less than 100 and cannot be changed. + enum UploadFailureReason { + kInvalidState = 0, + kStoredLogNotFound = 1, + }; + WebRtcLoggingHandlerHost(int render_process_id, content::BrowserContext* browser_context, WebRtcLogUploader* log_uploader);
diff --git a/chrome/browser/notifications/notification_channels_provider_android.cc b/chrome/browser/notifications/notification_channels_provider_android.cc index 56710d2e..7fe5af4 100644 --- a/chrome/browser/notifications/notification_channels_provider_android.cc +++ b/chrome/browser/notifications/notification_channels_provider_android.cc
@@ -136,8 +136,7 @@ ContentSettingsPattern::FromURLNoWildcard( GURL(channels_[index_].origin)), ContentSettingsPattern::Wildcard(), - new base::Value( - ChannelStatusToContentSetting(channels_[index_].status))); + base::Value(ChannelStatusToContentSetting(channels_[index_].status))); index_++; return rule; } @@ -224,7 +223,7 @@ while (it && it->HasNext()) { content_settings::Rule rule = it->Next(); - rules.push_back(rule); + rules.push_back(std::move(rule)); CreateChannelForRule(rule); } @@ -428,7 +427,7 @@ DCHECK(!origin.opaque()); const std::string origin_string = origin.Serialize(); ContentSetting content_setting = - content_settings::ValueToContentSetting(rule.value.get()); + content_settings::ValueToContentSetting(&rule.value); switch (content_setting) { case CONTENT_SETTING_ALLOW: CreateChannelIfRequired(origin_string,
diff --git a/chrome/browser/notifications/notification_channels_provider_android_unittest.cc b/chrome/browser/notifications/notification_channels_provider_android_unittest.cc index 000787d..ddb5f10 100644 --- a/chrome/browser/notifications/notification_channels_provider_android_unittest.cc +++ b/chrome/browser/notifications/notification_channels_provider_android_unittest.cc
@@ -187,7 +187,7 @@ content_settings::Rule rule = rule_iterator->Next(); EXPECT_EQ(GetTestPattern(), rule.primary_pattern); EXPECT_EQ(CONTENT_SETTING_ALLOW, - content_settings::ValueToContentSetting(rule.value.get())); + content_settings::ValueToContentSetting(&rule.value)); EXPECT_FALSE(rule_iterator->HasNext()); } @@ -208,7 +208,7 @@ content_settings::Rule rule = rule_iterator->Next(); EXPECT_EQ(GetTestPattern(), rule.primary_pattern); EXPECT_EQ(CONTENT_SETTING_BLOCK, - content_settings::ValueToContentSetting(rule.value.get())); + content_settings::ValueToContentSetting(&rule.value)); EXPECT_FALSE(rule_iterator->HasNext()); } @@ -233,7 +233,7 @@ content_settings::Rule rule = rule_iterator->Next(); EXPECT_EQ(GetTestPattern(), rule.primary_pattern); EXPECT_EQ(CONTENT_SETTING_ALLOW, - content_settings::ValueToContentSetting(rule.value.get())); + content_settings::ValueToContentSetting(&rule.value)); EXPECT_FALSE(rule_iterator->HasNext()); } @@ -258,7 +258,7 @@ content_settings::Rule rule = rule_iterator->Next(); EXPECT_EQ(GetTestPattern(), rule.primary_pattern); EXPECT_EQ(CONTENT_SETTING_BLOCK, - content_settings::ValueToContentSetting(rule.value.get())); + content_settings::ValueToContentSetting(&rule.value)); EXPECT_FALSE(rule_iterator->HasNext()); } @@ -331,12 +331,12 @@ content_settings::Rule first_rule = rule_iterator->Next(); EXPECT_EQ(abc_pattern, first_rule.primary_pattern); EXPECT_EQ(CONTENT_SETTING_ALLOW, - content_settings::ValueToContentSetting(first_rule.value.get())); + content_settings::ValueToContentSetting(&first_rule.value)); EXPECT_TRUE(rule_iterator->HasNext()); content_settings::Rule second_rule = rule_iterator->Next(); EXPECT_EQ(xyz_pattern, second_rule.primary_pattern); EXPECT_EQ(CONTENT_SETTING_BLOCK, - content_settings::ValueToContentSetting(second_rule.value.get())); + content_settings::ValueToContentSetting(&second_rule.value)); EXPECT_FALSE(rule_iterator->HasNext()); }
diff --git a/chrome/browser/page_load_metrics/observers/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ads_page_load_metrics_observer_browsertest.cc index 8ba99bd..9faf3a95 100644 --- a/chrome/browser/page_load_metrics/observers/ads_page_load_metrics_observer_browsertest.cc +++ b/chrome/browser/page_load_metrics/observers/ads_page_load_metrics_observer_browsertest.cc
@@ -24,7 +24,7 @@ #include "components/subresource_filter/core/common/activation_scope.h" #include "components/subresource_filter/core/common/common_features.h" #include "components/subresource_filter/core/common/test_ruleset_utils.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "components/ukm/test_ukm_recorder.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h"
diff --git a/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc b/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc index ac33825..79e3712 100644 --- a/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc +++ b/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc
@@ -96,6 +96,7 @@ WebFeature::kDownloadInAdFrameWithUserGesture, WebFeature::kDownloadInAdFrameWithoutUserGesture, WebFeature::kOpenWebDatabase, + WebFeature::kV8MediaCapabilities_DecodingInfo_Method, })); return *opt_in_features; }
diff --git a/chrome/browser/resources/chromeos/switch_access/BUILD.gn b/chrome/browser/resources/chromeos/switch_access/BUILD.gn index c57d2dd..bc97d95 100644 --- a/chrome/browser/resources/chromeos/switch_access/BUILD.gn +++ b/chrome/browser/resources/chromeos/switch_access/BUILD.gn
@@ -47,6 +47,7 @@ "prefs.js", "switch_access.js", "switch_access_predicate.js", + "text_input_manager.js", ] rewrite_rules = [ rebase_path(".", root_build_dir) + ":", @@ -151,6 +152,7 @@ ":options", ":prefs", ":switch_access_predicate", + ":text_input_manager", "../chromevox:constants", "../chromevox:tree_walker", "../select_to_speak:closure_shim", @@ -168,7 +170,9 @@ js_library("navigation_manager") { deps = [ + ":context_menu_manager", ":switch_access_predicate", + ":text_input_manager", "../chromevox:constants", "../chromevox:tree_walker", ] @@ -243,3 +247,7 @@ js_library("switch_access_predicate") { externs_list = [ "$externs_path/automation.js" ] } + +js_library("text_input_manager") { + externs_list = [ "$externs_path/accessibility_private.js" ] +}
diff --git a/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2 b/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2 index d2b8de3c..31ccccd 100644 --- a/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2 +++ b/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2
@@ -22,6 +22,7 @@ "navigation_manager.js", "prefs.js", "switch_access.js", + "text_input_manager.js", "tree_walker.js", "background.js" ]
diff --git a/chrome/browser/resources/chromeos/switch_access/navigation_manager.js b/chrome/browser/resources/chromeos/switch_access/navigation_manager.js index ebed65c..a13ba09d 100644 --- a/chrome/browser/resources/chromeos/switch_access/navigation_manager.js +++ b/chrome/browser/resources/chromeos/switch_access/navigation_manager.js
@@ -180,6 +180,10 @@ if (!this.node_.role) return; + if (TextInputManager.pressKey(this.node_)) { + return; + } + if (this.node_ === this.scope_) { // If we're visiting the scope as actionable, perform the default action. if (this.visitingScopeAsActionable_) {
diff --git a/chrome/browser/resources/chromeos/switch_access/text_input_manager.js b/chrome/browser/resources/chromeos/switch_access/text_input_manager.js new file mode 100644 index 0000000..ca3e4f3 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/text_input_manager.js
@@ -0,0 +1,57 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Class to handle text input for improved accuracy and efficiency. + */ + +const TextInputManager = { + /** @type {number} */ + KEY_PRESS_DURATION: 100, + + /** + * Sends a keyEvent to click the center of the provided node. + * @param {!chrome.automation.AutomationNode} node + * @return {boolean} Whether a key was pressed. + */ + pressKey: (node) => { + if (node.role !== chrome.automation.RoleType.BUTTON) + return false; + if (!TextInputManager.inVirtualKeyboard_(node)) + return false; + + const x = node.location.left + Math.round(node.location.width / 2); + const y = node.location.top + Math.round(node.location.height / 2); + + chrome.accessibilityPrivate.sendSyntheticMouseEvent({ + type: chrome.accessibilityPrivate.SyntheticMouseEventType.PRESS, + x: x, + y: y + }); + + setTimeout( + () => chrome.accessibilityPrivate.sendSyntheticMouseEvent({ + type: chrome.accessibilityPrivate.SyntheticMouseEventType.RELEASE, + x: x, + y: y + }), + TextInputManager.KEY_PRESS_DURATION); + + return true; + }, + + /** + * Checks if |node| is in the virtual keyboard. + * @private + * @param {!chrome.automation.AutomationNode} node + * @return {boolean} + */ + inVirtualKeyboard_: (node) => { + if (node.role === chrome.automation.RoleType.KEYBOARD) + return true; + if (node.parent) + return TextInputManager.inVirtualKeyboard_(node.parent); + return false; + }, +};
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.css b/chrome/browser/resources/local_ntp/custom_links_edit.css index 4f06694..cb87556 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.css +++ b/chrome/browser/resources/local_ntp/custom_links_edit.css
@@ -99,10 +99,6 @@ width: 100%; } -#url-field { - direction: ltr; -} - .field-title.focused { color: rgb(26, 115, 232); }
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.html b/chrome/browser/resources/local_ntp/custom_links_edit.html index 8cb69cf..e2b6a3ac 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.html +++ b/chrome/browser/resources/local_ntp/custom_links_edit.html
@@ -28,7 +28,7 @@ <label id="url-field-name" class="field-title"></label> <div class="input-container"> <input id="url-field" class="field-input" type="text" autocomplete="off" - spellcheck="false" tabindex="0" required></input> + spellcheck="false" dir="ltr" tabindex="0" required></input> <div class="underline"></div> </div> <div id="invalid-url" class="error-msg"></div>
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.js b/chrome/browser/resources/local_ntp/custom_links_edit.js index 992be50..f0b10f2 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.js +++ b/chrome/browser/resources/local_ntp/custom_links_edit.js
@@ -100,7 +100,7 @@ return; prepopulatedLink.rid = rid; $(IDS.TITLE_FIELD).value = prepopulatedLink.title = data.title; - $(IDS.TITLE_FIELD).style.direction = data.direction || 'ltr'; + $(IDS.TITLE_FIELD).dir = data.direction || 'ltr'; $(IDS.URL_FIELD).value = prepopulatedLink.url = data.url; // Set accessibility names. @@ -176,7 +176,7 @@ // Small delay to allow the dialog to close before cleaning up. window.setTimeout(() => { $(IDS.FORM).reset(); - $(IDS.TITLE_FIELD).style.direction = null; + $(IDS.TITLE_FIELD).dir = null; $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid'); $(IDS.DELETE).disabled = false; $(IDS.DONE).disabled = false;
diff --git a/chrome/browser/resources/md_bookmarks/actions.html b/chrome/browser/resources/md_bookmarks/actions.html index 0af2983..ad1570c 100644 --- a/chrome/browser/resources/md_bookmarks/actions.html +++ b/chrome/browser/resources/md_bookmarks/actions.html
@@ -1,2 +1,2 @@ <link rel="import" href="chrome://resources/html/cr.html"> -<script src="chrome://bookmarks/actions.js"></script> +<script src="actions.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/api_listener.html b/chrome/browser/resources/md_bookmarks/api_listener.html index 0ee48ff..8e6f5ee 100644 --- a/chrome/browser/resources/md_bookmarks/api_listener.html +++ b/chrome/browser/resources/md_bookmarks/api_listener.html
@@ -1,6 +1,6 @@ <link rel="import" href="chrome://resources/html/cr.html"> -<link rel="import" href="chrome://bookmarks/actions.html"> -<link rel="import" href="chrome://bookmarks/debouncer.html"> -<link rel="import" href="chrome://bookmarks/store.html"> -<link rel="import" href="chrome://bookmarks/util.html"> -<script src="chrome://bookmarks/api_listener.js"></script> +<link rel="import" href="actions.html"> +<link rel="import" href="debouncer.html"> +<link rel="import" href="store.html"> +<link rel="import" href="util.html"> +<script src="api_listener.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/app.html b/chrome/browser/resources/md_bookmarks/app.html index 14d0ae99..6108b8c 100644 --- a/chrome/browser/resources/md_bookmarks/app.html +++ b/chrome/browser/resources/md_bookmarks/app.html
@@ -2,19 +2,19 @@ <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/cr/ui/splitter.html"> -<link rel="import" href="chrome://bookmarks/api_listener.html"> -<link rel="import" href="chrome://bookmarks/command_manager.html"> -<link rel="import" href="chrome://bookmarks/constants.html"> -<link rel="import" href="chrome://bookmarks/dnd_manager.html"> -<link rel="import" href="chrome://bookmarks/folder_node.html"> -<link rel="import" href="chrome://bookmarks/list.html"> -<link rel="import" href="chrome://bookmarks/mouse_focus_behavior.html"> -<link rel="import" href="chrome://bookmarks/router.html"> -<link rel="import" href="chrome://bookmarks/shared_vars.html"> -<link rel="import" href="chrome://bookmarks/store.html"> -<link rel="import" href="chrome://bookmarks/toast_manager.html"> -<link rel="import" href="chrome://bookmarks/toolbar.html"> -<link rel="import" href="chrome://bookmarks/util.html"> +<link rel="import" href="api_listener.html"> +<link rel="import" href="command_manager.html"> +<link rel="import" href="constants.html"> +<link rel="import" href="dnd_manager.html"> +<link rel="import" href="folder_node.html"> +<link rel="import" href="list.html"> +<link rel="import" href="mouse_focus_behavior.html"> +<link rel="import" href="router.html"> +<link rel="import" href="shared_vars.html"> +<link rel="import" href="store.html"> +<link rel="import" href="toast_manager.html"> +<link rel="import" href="toolbar.html"> +<link rel="import" href="util.html"> <dom-module id="bookmarks-app"> <template> @@ -80,5 +80,5 @@ <bookmarks-command-manager></bookmarks-command-manager> <bookmarks-toast-manager duration="10000"></bookmarks-toast-manager> </template> - <script src="chrome://bookmarks/app.js"></script> + <script src="app.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/bookmarks.html b/chrome/browser/resources/md_bookmarks/bookmarks.html index b6e08ba..c4991ad 100644 --- a/chrome/browser/resources/md_bookmarks/bookmarks.html +++ b/chrome/browser/resources/md_bookmarks/bookmarks.html
@@ -24,8 +24,8 @@ <bookmarks-app></bookmarks-app> <script src="chrome://resources/js/load_time_data.js"></script> - <script src="chrome://bookmarks/strings.js"></script> - <link rel="import" href="chrome://bookmarks/app.html"> + <script src="strings.js"></script> + <link rel="import" href="app.html"> <link rel="import" href="chrome://resources/html/dark_mode.html"> </body> </html>
diff --git a/chrome/browser/resources/md_bookmarks/command_manager.html b/chrome/browser/resources/md_bookmarks/command_manager.html index deae218..c083325 100644 --- a/chrome/browser/resources/md_bookmarks/command_manager.html +++ b/chrome/browser/resources/md_bookmarks/command_manager.html
@@ -6,10 +6,10 @@ <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/cr/ui/command.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html"> -<link rel="import" href="chrome://bookmarks/dialog_focus_manager.html"> -<link rel="import" href="chrome://bookmarks/edit_dialog.html"> -<link rel="import" href="chrome://bookmarks/shared_style.html"> -<link rel="import" href="chrome://bookmarks/store_client.html"> +<link rel="import" href="dialog_focus_manager.html"> +<link rel="import" href="edit_dialog.html"> +<link rel="import" href="shared_style.html"> +<link rel="import" href="store_client.html"> <dom-module id="bookmarks-command-manager"> <template> @@ -73,5 +73,5 @@ </template> </cr-lazy-render> </template> - <script src="chrome://bookmarks/command_manager.js"></script> + <script src="command_manager.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/constants.html b/chrome/browser/resources/md_bookmarks/constants.html index 45f3cb5..2b6bc6b 100644 --- a/chrome/browser/resources/md_bookmarks/constants.html +++ b/chrome/browser/resources/md_bookmarks/constants.html
@@ -1 +1 @@ -<script src="chrome://bookmarks/constants.js"></script> +<script src="constants.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/debouncer.html b/chrome/browser/resources/md_bookmarks/debouncer.html index 567579df..f78f17d 100644 --- a/chrome/browser/resources/md_bookmarks/debouncer.html +++ b/chrome/browser/resources/md_bookmarks/debouncer.html
@@ -1,2 +1,2 @@ <link rel="import" href="chrome://resources/html/cr.html"> -<script src="chrome://bookmarks/debouncer.js"></script> +<script src="debouncer.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/dialog_focus_manager.html b/chrome/browser/resources/md_bookmarks/dialog_focus_manager.html index 2476ff0c..a24ff07 100644 --- a/chrome/browser/resources/md_bookmarks/dialog_focus_manager.html +++ b/chrome/browser/resources/md_bookmarks/dialog_focus_manager.html
@@ -1,2 +1,2 @@ <link rel="import" href="chrome://resources/html/cr.html"> -<script src="chrome://bookmarks/dialog_focus_manager.js"></script> +<script src="dialog_focus_manager.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/dnd_manager.html b/chrome/browser/resources/md_bookmarks/dnd_manager.html index 8469e5b..d9c13e6 100644 --- a/chrome/browser/resources/md_bookmarks/dnd_manager.html +++ b/chrome/browser/resources/md_bookmarks/dnd_manager.html
@@ -1,3 +1,3 @@ -<link rel="import" href="chrome://bookmarks/constants.html"> -<link rel="import" href="chrome://bookmarks/debouncer.html"> -<script src="chrome://bookmarks/dnd_manager.js"></script> +<link rel="import" href="constants.html"> +<link rel="import" href="debouncer.html"> +<script src="dnd_manager.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/edit_dialog.html b/chrome/browser/resources/md_bookmarks/edit_dialog.html index 2d3486a..82064c23 100644 --- a/chrome/browser/resources/md_bookmarks/edit_dialog.html +++ b/chrome/browser/resources/md_bookmarks/edit_dialog.html
@@ -6,7 +6,7 @@ <link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> -<link rel="import" href="chrome://bookmarks/dialog_focus_manager.html"> +<link rel="import" href="dialog_focus_manager.html"> <dom-module id="bookmarks-edit-dialog"> <template> @@ -36,5 +36,5 @@ </div> </cr-dialog> </template> - <script src="chrome://bookmarks/edit_dialog.js"></script> + <script src="edit_dialog.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/folder_node.html b/chrome/browser/resources/md_bookmarks/folder_node.html index 536e318..80b5045 100644 --- a/chrome/browser/resources/md_bookmarks/folder_node.html +++ b/chrome/browser/resources/md_bookmarks/folder_node.html
@@ -4,10 +4,10 @@ <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button-light.html"> -<link rel="import" href="chrome://bookmarks/actions.html"> -<link rel="import" href="chrome://bookmarks/command_manager.html"> -<link rel="import" href="chrome://bookmarks/shared_style.html"> -<link rel="import" href="chrome://bookmarks/store_client.html"> +<link rel="import" href="actions.html"> +<link rel="import" href="command_manager.html"> +<link rel="import" href="shared_style.html"> +<link rel="import" href="store_client.html"> <dom-module id="bookmarks-folder-node"> <template> @@ -119,5 +119,5 @@ </template> </div> </template> - <script src="chrome://bookmarks/folder_node.js"></script> + <script src="folder_node.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/item.html b/chrome/browser/resources/md_bookmarks/item.html index ad066d6..db4781f 100644 --- a/chrome/browser/resources/md_bookmarks/item.html +++ b/chrome/browser/resources/md_bookmarks/item.html
@@ -3,9 +3,9 @@ <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button-light.html"> -<link rel="import" href="chrome://bookmarks/actions.html"> -<link rel="import" href="chrome://bookmarks/shared_style.html"> -<link rel="import" href="chrome://bookmarks/store_client.html"> +<link rel="import" href="actions.html"> +<link rel="import" href="shared_style.html"> +<link rel="import" href="store_client.html"> <dom-module id="bookmarks-item"> <template> @@ -83,5 +83,5 @@ </button> </paper-icon-button-light> </template> - <script src="chrome://bookmarks/item.js"></script> + <script src="item.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/list.html b/chrome/browser/resources/md_bookmarks/list.html index 6001cfae..15a02236 100644 --- a/chrome/browser/resources/md_bookmarks/list.html +++ b/chrome/browser/resources/md_bookmarks/list.html
@@ -3,11 +3,11 @@ <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html"> -<link rel="import" href="chrome://bookmarks/command_manager.html"> -<link rel="import" href="chrome://bookmarks/item.html"> -<link rel="import" href="chrome://bookmarks/shared_style.html"> -<link rel="import" href="chrome://bookmarks/store_client.html"> -<link rel="import" href="chrome://bookmarks/util.html"> +<link rel="import" href="command_manager.html"> +<link rel="import" href="item.html"> +<link rel="import" href="shared_style.html"> +<link rel="import" href="store_client.html"> +<link rel="import" href="util.html"> <link rel="import" href="chrome://resources/html/list_property_update_behavior.html"> <dom-module id="bookmarks-list"> @@ -61,5 +61,5 @@ [[emptyListMessage_(searchTerm_)]] </div> </template> - <script src="chrome://bookmarks/list.js"></script> + <script src="list.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/mouse_focus_behavior.html b/chrome/browser/resources/md_bookmarks/mouse_focus_behavior.html index b9c6e27d..260135d 100644 --- a/chrome/browser/resources/md_bookmarks/mouse_focus_behavior.html +++ b/chrome/browser/resources/md_bookmarks/mouse_focus_behavior.html
@@ -1 +1 @@ -<script src="chrome://bookmarks/mouse_focus_behavior.js"></script> +<script src="mouse_focus_behavior.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/reducers.html b/chrome/browser/resources/md_bookmarks/reducers.html index ac8b856..4dc8dc03 100644 --- a/chrome/browser/resources/md_bookmarks/reducers.html +++ b/chrome/browser/resources/md_bookmarks/reducers.html
@@ -1,3 +1,3 @@ <link rel="import" href="chrome://resources/html/cr.html"> -<link rel="import" href="chrome://bookmarks/constants.html"> -<script src="chrome://bookmarks/reducers.js"></script> +<link rel="import" href="constants.html"> +<script src="reducers.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/router.html b/chrome/browser/resources/md_bookmarks/router.html index d3ccc8a..7aac8db 100644 --- a/chrome/browser/resources/md_bookmarks/router.html +++ b/chrome/browser/resources/md_bookmarks/router.html
@@ -2,8 +2,8 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-location/iron-location.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-location/iron-query-params.html"> -<link rel="import" href="chrome://bookmarks/actions.html"> -<link rel="import" href="chrome://bookmarks/store_client.html"> +<link rel="import" href="actions.html"> +<link rel="import" href="store_client.html"> <dom-module id="bookmarks-router"> <template> @@ -11,5 +11,5 @@ <iron-query-params params-string="{{query_}}" params-object="{{queryParams_}}"></iron-query-params> </template> - <script src="chrome://bookmarks/router.js"></script> + <script src="router.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/shared_style.html b/chrome/browser/resources/md_bookmarks/shared_style.html index 353cd3e..b885fa7 100644 --- a/chrome/browser/resources/md_bookmarks/shared_style.html +++ b/chrome/browser/resources/md_bookmarks/shared_style.html
@@ -1,4 +1,4 @@ -<link rel="import" href="chrome://bookmarks/shared_vars.html"> +<link rel="import" href="shared_vars.html"> <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> @@ -61,7 +61,7 @@ } .folder-icon { - background-image: url(chrome://bookmarks/images/folder.svg); + background-image: url(images/folder.svg); background-size: contain; height: 20px; min-width: 20px; @@ -69,7 +69,7 @@ } .folder-icon[open] { - background-image: url(chrome://bookmarks/images/folder_open.svg); + background-image: url(images/folder_open.svg); } .website-icon {
diff --git a/chrome/browser/resources/md_bookmarks/store.html b/chrome/browser/resources/md_bookmarks/store.html index a8e41290..8e4684c 100644 --- a/chrome/browser/resources/md_bookmarks/store.html +++ b/chrome/browser/resources/md_bookmarks/store.html
@@ -1,5 +1,5 @@ <link rel="import" href="chrome://resources/html/cr.html"> <link rel="import" href="chrome://resources/html/cr/ui/store.html"> -<link rel="import" href="chrome://bookmarks/reducers.html"> -<link rel="import" href="chrome://bookmarks/util.html"> -<script src="chrome://bookmarks/store.js"></script> +<link rel="import" href="reducers.html"> +<link rel="import" href="util.html"> +<script src="store.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/store_client.html b/chrome/browser/resources/md_bookmarks/store_client.html index e22f9d0..e7d72cc 100644 --- a/chrome/browser/resources/md_bookmarks/store_client.html +++ b/chrome/browser/resources/md_bookmarks/store_client.html
@@ -1,5 +1,5 @@ <link rel="import" href="chrome://resources/html/cr.html"> <link rel="import" href="chrome://resources/html/cr/ui/store_client.html"> -<link rel="import" href="chrome://bookmarks/store.html"> +<link rel="import" href="store.html"> -<script src="chrome://bookmarks/store_client.js"></script> +<script src="store_client.js"></script>
diff --git a/chrome/browser/resources/md_bookmarks/toast_manager.html b/chrome/browser/resources/md_bookmarks/toast_manager.html index 235917c..359d5d2 100644 --- a/chrome/browser/resources/md_bookmarks/toast_manager.html +++ b/chrome/browser/resources/md_bookmarks/toast_manager.html
@@ -3,7 +3,7 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_toast/cr_toast.html"> <link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> -<link rel="import" href="chrome://bookmarks/shared_style.html"> +<link rel="import" href="shared_style.html"> <dom-module id="bookmarks-toast-manager"> <template> @@ -33,5 +33,5 @@ </paper-button> </cr-toast> </template> - <script src="chrome://bookmarks/toast_manager.js"></script> + <script src="toast_manager.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/toolbar.html b/chrome/browser/resources/md_bookmarks/toolbar.html index c09c8cd..fefc6ea 100644 --- a/chrome/browser/resources/md_bookmarks/toolbar.html +++ b/chrome/browser/resources/md_bookmarks/toolbar.html
@@ -3,7 +3,7 @@ <link rel="import" href="chrome://resources/cr_elements/cr_toolbar/cr_toolbar.html"> <link rel="import" href="chrome://resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button-light.html"> -<link rel="import" href="chrome://bookmarks/shared_style.html"> +<link rel="import" href="shared_style.html"> <dom-module id="bookmarks-toolbar"> <template> @@ -60,5 +60,5 @@ on-clear-selected-items="onClearSelectionTap_"> </cr-toolbar-selection-overlay> </template> - <script src="chrome://bookmarks/toolbar.js"></script> + <script src="toolbar.js"></script> </dom-module>
diff --git a/chrome/browser/resources/md_bookmarks/util.html b/chrome/browser/resources/md_bookmarks/util.html index cd1984240..d521fc5b 100644 --- a/chrome/browser/resources/md_bookmarks/util.html +++ b/chrome/browser/resources/md_bookmarks/util.html
@@ -1,2 +1,2 @@ <link rel="import" href="chrome://resources/html/cr.html"> -<script src="chrome://bookmarks/util.js"></script> +<script src="util.js"></script>
diff --git a/chrome/browser/signin/fake_signin_manager_builder.cc b/chrome/browser/signin/fake_signin_manager_builder.cc index 8fedf7e..1f7ab7f 100644 --- a/chrome/browser/signin/fake_signin_manager_builder.cc +++ b/chrome/browser/signin/fake_signin_manager_builder.cc
@@ -30,6 +30,7 @@ FakeSigninManagerForTesting::FakeSigninManagerForTesting(Profile* profile) : FakeSigninManagerBase( ChromeSigninClientFactory::GetForProfile(profile), + ProfileOAuth2TokenServiceFactory::GetForProfile(profile), AccountTrackerServiceFactory::GetForProfile(profile), SigninErrorControllerFactory::GetForProfile(profile)) {} #else
diff --git a/chrome/browser/signin/signin_manager_factory.cc b/chrome/browser/signin/signin_manager_factory.cc index 710183b..7e9ba743 100644 --- a/chrome/browser/signin/signin_manager_factory.cc +++ b/chrome/browser/signin/signin_manager_factory.cc
@@ -115,7 +115,8 @@ ChromeSigninClientFactory::GetInstance()->GetForProfile(profile); #if defined(OS_CHROMEOS) service = new SigninManagerBase( - client, AccountTrackerServiceFactory::GetForProfile(profile), + client, ProfileOAuth2TokenServiceFactory::GetForProfile(profile), + AccountTrackerServiceFactory::GetForProfile(profile), SigninErrorControllerFactory::GetForProfile(profile)); #else service = new SigninManager(
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver.cc b/chrome/browser/ssl/insecure_sensitive_input_driver.cc index a7a1233..f87b4bc9 100644 --- a/chrome/browser/ssl/insecure_sensitive_input_driver.cc +++ b/chrome/browser/ssl/insecure_sensitive_input_driver.cc
@@ -21,21 +21,6 @@ insecure_input_bindings_.AddBinding(this, std::move(request)); } -void InsecureSensitiveInputDriver::PasswordFieldVisibleInInsecureContext() { - InsecureSensitiveInputDriverFactory* parent = - InsecureSensitiveInputDriverFactory::GetOrCreateForWebContents( - content::WebContents::FromRenderFrameHost(render_frame_host_)); - parent->RenderFrameHasVisiblePasswordField(render_frame_host_); -} - -void InsecureSensitiveInputDriver:: - AllPasswordFieldsInInsecureContextInvisible() { - InsecureSensitiveInputDriverFactory* parent = - InsecureSensitiveInputDriverFactory::GetOrCreateForWebContents( - content::WebContents::FromRenderFrameHost(render_frame_host_)); - parent->RenderFrameHasNoVisiblePasswordFields(render_frame_host_); -} - void InsecureSensitiveInputDriver::DidEditFieldInInsecureContext() { InsecureSensitiveInputDriverFactory* parent = InsecureSensitiveInputDriverFactory::GetOrCreateForWebContents(
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver.h b/chrome/browser/ssl/insecure_sensitive_input_driver.h index 132dc19..646f8e5 100644 --- a/chrome/browser/ssl/insecure_sensitive_input_driver.h +++ b/chrome/browser/ssl/insecure_sensitive_input_driver.h
@@ -28,8 +28,6 @@ blink::mojom::InsecureInputServiceRequest request); // blink::mojom::InsecureInputService: - void PasswordFieldVisibleInInsecureContext() override; - void AllPasswordFieldsInInsecureContextInvisible() override; void DidEditFieldInInsecureContext() override; private:
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver_factory.cc b/chrome/browser/ssl/insecure_sensitive_input_driver_factory.cc index 5a81beec..d601a02 100644 --- a/chrome/browser/ssl/insecure_sensitive_input_driver_factory.cc +++ b/chrome/browser/ssl/insecure_sensitive_input_driver_factory.cc
@@ -85,59 +85,6 @@ return insertion_result.first->second.get(); } -void InsecureSensitiveInputDriverFactory:: - DidInteractWithNonsecureCreditCardInput() { - security_state::SSLStatusInputEventData* input_events = - GetOrCreateSSLStatusInputEventData(web_contents()); - if (!input_events) - return; - - // If the first credit card field edit for the web contents was just - // performed, update the SSLStatusInputEventData. - if (!input_events->input_events()->credit_card_field_edited) { - input_events->input_events()->credit_card_field_edited = true; - web_contents()->DidChangeVisibleSecurityState(); - } -} - -void InsecureSensitiveInputDriverFactory::RenderFrameHasVisiblePasswordField( - content::RenderFrameHost* render_frame_host) { - frames_with_visible_password_fields_.insert(render_frame_host); - - security_state::SSLStatusInputEventData* input_events = - GetOrCreateSSLStatusInputEventData(web_contents()); - if (!input_events) - return; - - // If the first password field was just added to the web contents, - // update the SSLStatusInputEventData. - if (!input_events->input_events()->password_field_shown) { - input_events->input_events()->password_field_shown = true; - web_contents()->DidChangeVisibleSecurityState(); - } -} - -void InsecureSensitiveInputDriverFactory::RenderFrameHasNoVisiblePasswordFields( - content::RenderFrameHost* render_frame_host) { - // If the frame was not recorded as having a password field, there's no - // need to do any further work. - if (!frames_with_visible_password_fields_.erase(render_frame_host)) - return; - - security_state::SSLStatusInputEventData* input_events = - GetOrCreateSSLStatusInputEventData(web_contents()); - if (!input_events) - return; - - // If the last password field was just removed from the web contents, - // update the SSLStatusInputEventData. - if (input_events->input_events()->password_field_shown && - frames_with_visible_password_fields_.empty()) { - input_events->input_events()->password_field_shown = false; - web_contents()->DidChangeVisibleSecurityState(); - } -} - void InsecureSensitiveInputDriverFactory::DidEditFieldInInsecureContext() { security_state::SSLStatusInputEventData* input_events = GetOrCreateSSLStatusInputEventData(web_contents()); @@ -154,8 +101,6 @@ void InsecureSensitiveInputDriverFactory::RenderFrameDeleted( content::RenderFrameHost* render_frame_host) { - // Password fields are deleted when their containing frame is deleted. - RenderFrameHasNoVisiblePasswordFields(render_frame_host); frame_driver_map_.erase(render_frame_host); }
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver_factory.h b/chrome/browser/ssl/insecure_sensitive_input_driver_factory.h index 11b4b10..4521f7e 100644 --- a/chrome/browser/ssl/insecure_sensitive_input_driver_factory.h +++ b/chrome/browser/ssl/insecure_sensitive_input_driver_factory.h
@@ -45,20 +45,6 @@ InsecureSensitiveInputDriver* GetOrCreateDriverForFrame( content::RenderFrameHost* render_frame_host); - // This method is called when the autofill component detects a credit - // card field was interacted with in a non-secure context. - void DidInteractWithNonsecureCreditCardInput(); - - // This method is called when there is a message notifying - // the browser process that the renderer has a visible password field. - void RenderFrameHasVisiblePasswordField( - content::RenderFrameHost* render_frame_host); - - // This method is called when there is a message notifying the browser - // process that the renderer has no visible password fields anymore. - void RenderFrameHasNoVisiblePasswordFields( - content::RenderFrameHost* render_frame_host); - // This method is called when there is a message notifying the browser // process that the user edited a field in a non-secure context. void DidEditFieldInInsecureContext();
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver_unittest.cc b/chrome/browser/ssl/insecure_sensitive_input_driver_unittest.cc index 8335064..64d5cce 100644 --- a/chrome/browser/ssl/insecure_sensitive_input_driver_unittest.cc +++ b/chrome/browser/ssl/insecure_sensitive_input_driver_unittest.cc
@@ -39,176 +39,6 @@ DISALLOW_COPY_AND_ASSIGN(InsecureSensitiveInputDriverTest); }; -// Tests that password visibility notifications are forwarded. -TEST_F(InsecureSensitiveInputDriverTest, PasswordVisibility) { - std::unique_ptr<InsecureSensitiveInputDriver> driver( - new InsecureSensitiveInputDriver(main_rfh())); - - // Do a mock navigation so that there is a navigation entry on which - // password visibility gets recorded. - GURL url("http://example.test"); - NavigateAndCommit(url); - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - EXPECT_FALSE(GetInputEvents(entry).password_field_shown); - - driver->PasswordFieldVisibleInInsecureContext(); - - // Check that the password visibility notification was passed on. - entry = web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); - - // If the password field becomes hidden, then the flag should be unset - // on the SSLStatus. - driver->AllPasswordFieldsInInsecureContextInvisible(); - EXPECT_FALSE(GetInputEvents(entry).password_field_shown); -} - -// Tests that password visibility notifications from subframes are -// recorded correctly. -TEST_F(InsecureSensitiveInputDriverTest, PasswordVisibilityWithSubframe) { - // Do a mock navigation so that there is a navigation entry on which - // password visibility gets recorded. - GURL url("http://example.test"); - NavigateAndCommit(url); - - // Create a subframe with a password field and check that - // notifications for it are handled properly. - content::RenderFrameHost* subframe = - content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"); - subframe = content::NavigationSimulator::NavigateAndCommitFromDocument( - GURL("http://example2.test"), subframe); - auto subframe_driver = - std::make_unique<InsecureSensitiveInputDriver>(subframe); - subframe_driver->PasswordFieldVisibleInInsecureContext(); - - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); - - subframe_driver->AllPasswordFieldsInInsecureContextInvisible(); - EXPECT_FALSE(GetInputEvents(entry).password_field_shown); -} - -// Tests that password visibility notifications are recorded correctly -// when there is a password field in both the main frame and a subframe. -TEST_F(InsecureSensitiveInputDriverTest, - PasswordVisibilityWithMainFrameAndSubframe) { - std::unique_ptr<InsecureSensitiveInputDriver> driver( - new InsecureSensitiveInputDriver(main_rfh())); - // Do a mock navigation so that there is a navigation entry on which - // password visibility gets recorded. - GURL url("http://example.test"); - NavigateAndCommit(url); - - driver->PasswordFieldVisibleInInsecureContext(); - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); - - // Create a subframe with a password field and check that - // notifications for it are handled properly. - content::RenderFrameHost* subframe = - content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"); - subframe = content::NavigationSimulator::NavigateAndCommitFromDocument( - GURL("http://example2.test"), subframe); - auto subframe_driver = - std::make_unique<InsecureSensitiveInputDriver>(subframe); - subframe_driver->PasswordFieldVisibleInInsecureContext(); - - entry = web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); - - subframe_driver->AllPasswordFieldsInInsecureContextInvisible(); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); - - driver->AllPasswordFieldsInInsecureContextInvisible(); - EXPECT_FALSE(GetInputEvents(entry).password_field_shown); -} - -// Tests that when a frame is deleted, its password visibility flag gets -// unset. -TEST_F(InsecureSensitiveInputDriverTest, - PasswordVisibilityWithSubframeDeleted) { - // Do a mock navigation so that there is a navigation entry on which - // password visibility gets recorded. - GURL url("http://example.test"); - NavigateAndCommit(url); - - // Create a subframe with a password field. - content::RenderFrameHost* subframe = - content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"); - subframe = content::NavigationSimulator::NavigateAndCommitFromDocument( - GURL("http://example2.test"), subframe); - auto subframe_driver = - std::make_unique<InsecureSensitiveInputDriver>(subframe); - content::RenderFrameHostTester* subframe_tester = - content::RenderFrameHostTester::For(subframe); - subframe_driver->PasswordFieldVisibleInInsecureContext(); - - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); - - subframe_tester->Detach(); - EXPECT_FALSE(GetInputEvents(entry).password_field_shown); - - // Check that the subframe's flag isn't hanging around preventing the - // warning from being removed. - std::unique_ptr<InsecureSensitiveInputDriver> driver( - new InsecureSensitiveInputDriver(main_rfh())); - driver->PasswordFieldVisibleInInsecureContext(); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); - driver->AllPasswordFieldsInInsecureContextInvisible(); - EXPECT_FALSE(GetInputEvents(entry).password_field_shown); -} - -// Tests that a cross-process navigation does not remove the password -// field flag when the RenderFrameHost for the original process goes -// away. Regression test for https://crbug.com/664674 -TEST_F(InsecureSensitiveInputDriverTest, - RenderFrameHostDeletionOnCrossProcessNavigation) { - NavigateAndCommit(GURL("http://example.test")); - - content::RenderFrameHostTester* old_rfh_tester = - content::RenderFrameHostTester::For(web_contents()->GetMainFrame()); - content::WebContentsTester* tester = - content::WebContentsTester::For(web_contents()); - - controller().LoadURL(GURL("http://example2.test"), content::Referrer(), - ui::PAGE_TRANSITION_TYPED, std::string()); - content::RenderFrameHost* pending_rfh = pending_main_rfh(); - ASSERT_TRUE(pending_rfh); - int entry_id = controller().GetPendingEntry()->GetUniqueID(); - tester->TestDidNavigate(pending_rfh, entry_id, true, - GURL("http://example2.test"), - ui::PAGE_TRANSITION_TYPED); - - auto driver = std::make_unique<InsecureSensitiveInputDriver>(main_rfh()); - driver->PasswordFieldVisibleInInsecureContext(); - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); - - // After the old RenderFrameHost is deleted, the password flag should still be - // set. - old_rfh_tester->SimulateSwapOutACK(); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); -} - // Tests that field edit notifications are forwarded. TEST_F(InsecureSensitiveInputDriverTest, FieldEdit) { std::unique_ptr<InsecureSensitiveInputDriver> driver( @@ -236,7 +66,7 @@ // recorded correctly. TEST_F(InsecureSensitiveInputDriverTest, FieldEditWithSubframe) { // Do a mock navigation so that there is a navigation entry on which - // password visibility gets recorded. + // field edit modifications get recorded. GURL url("http://example.test"); NavigateAndCommit(url); content::NavigationEntry* entry =
diff --git a/chrome/browser/ssl/security_state_tab_helper.cc b/chrome/browser/ssl/security_state_tab_helper.cc index 376102c..9a59c907 100644 --- a/chrome/browser/ssl/security_state_tab_helper.cc +++ b/chrome/browser/ssl/security_state_tab_helper.cc
@@ -11,7 +11,6 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/pattern.h" #include "base/strings/string_util.h" -#include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" @@ -83,15 +82,7 @@ SecurityStateTabHelper::SecurityStateTabHelper( content::WebContents* web_contents) - : content::WebContentsObserver(web_contents), - logged_http_warning_on_current_navigation_(false), - is_incognito_(false) { - content::BrowserContext* context = web_contents->GetBrowserContext(); - if (context->IsOffTheRecord() && - !Profile::FromBrowserContext(context)->IsGuestSession()) { - is_incognito_ = true; - } -} + : content::WebContentsObserver(web_contents) {} SecurityStateTabHelper::~SecurityStateTabHelper() {} @@ -113,23 +104,6 @@ info.security_level, security_state::SECURITY_LEVEL_COUNT); } - if (time_of_http_warning_on_current_navigation_.is_null() || - !navigation_handle->IsInMainFrame() || - navigation_handle->IsSameDocument()) { - return; - } - // Record how quickly a user leaves a site after encountering an - // HTTP-bad warning. A navigation here only counts if it is a - // main-frame, not-same-page navigation, since it aims to measure how - // quickly a user leaves a site after seeing the HTTP warning. - UMA_HISTOGRAM_LONG_TIMES( - "Security.HTTPBad.NavigationStartedAfterUserWarnedAboutSensitiveInput", - base::Time::Now() - time_of_http_warning_on_current_navigation_); - // After recording the histogram, clear the time of the warning. A - // timing histogram will not be recorded again on this page, because - // the time is only set the first time the HTTP-bad warning is shown - // per page. - time_of_http_warning_on_current_navigation_ = base::Time(); } void SecurityStateTabHelper::DidFinishNavigation( @@ -151,17 +125,8 @@ net::ct::CTPolicyCompliance::CT_POLICY_COUNT); } - logged_http_warning_on_current_navigation_ = false; - security_state::SecurityInfo security_info; GetSecurityInfo(&security_info); - if (security_info.incognito_downgraded_security_level) { - web_contents()->GetMainFrame()->AddMessageToConsole( - content::CONSOLE_MESSAGE_LEVEL_WARNING, - "This page was loaded non-securely in an incognito mode browser. A " - "warning has been added to the URL bar. For more information, see " - "https://goo.gl/y8SRRv."); - } if (net::IsCertStatusError(security_info.cert_status) && !net::IsCertStatusMinorError(security_info.cert_status) && !navigation_handle->IsErrorPage()) { @@ -206,54 +171,6 @@ security_state::SecurityInfo security_info; GetSecurityInfo(&security_info); RecordSecurityLevel(security_info); - - if (logged_http_warning_on_current_navigation_) - return; - - if (!security_info.insecure_input_events.password_field_shown && - !security_info.insecure_input_events.credit_card_field_edited) { - return; - } - - DCHECK(time_of_http_warning_on_current_navigation_.is_null()); - time_of_http_warning_on_current_navigation_ = base::Time::Now(); - - logged_http_warning_on_current_navigation_ = true; - web_contents()->GetMainFrame()->AddMessageToConsole( - content::CONSOLE_MESSAGE_LEVEL_WARNING, - "This page includes a password or credit card input in a non-secure " - "context. A warning has been added to the URL bar. For more " - "information, see https://goo.gl/zmWq3m."); - - // |warning_is_user_visible| will only be false if the user has set the flag - // for marking HTTP pages as Dangerous. In that case, the page will be - // flagged as Dangerous, but it isn't distinguished from other HTTP pages, - // which is why this code records it as not-user-visible. - bool warning_is_user_visible = - (security_info.security_level == security_state::HTTP_SHOW_WARNING); - - if (security_info.insecure_input_events.credit_card_field_edited) { - UMA_HISTOGRAM_BOOLEAN( - "Security.HTTPBad.UserWarnedAboutSensitiveInput.CreditCard", - warning_is_user_visible); - } - if (security_info.insecure_input_events.password_field_shown) { - UMA_HISTOGRAM_BOOLEAN( - "Security.HTTPBad.UserWarnedAboutSensitiveInput.Password", - warning_is_user_visible); - } -} - -void SecurityStateTabHelper::WebContentsDestroyed() { - if (time_of_http_warning_on_current_navigation_.is_null()) { - return; - } - // Record how quickly the tab is closed after a user encounters an - // HTTP-bad warning. This histogram will only be recorded if the - // WebContents is destroyed before another navigation begins. - UMA_HISTOGRAM_LONG_TIMES( - "Security.HTTPBad.WebContentsDestroyedAfterUserWarnedAboutSensitiveInput", - base::Time::Now() - time_of_http_warning_on_current_navigation_); } bool SecurityStateTabHelper::UsedPolicyInstalledCertificate() const { @@ -352,8 +269,6 @@ // information is still being initialized, thus no need to check for that. state->malicious_content_status = GetMaliciousContentStatus(); - state->is_incognito = is_incognito_; - return state; }
diff --git a/chrome/browser/ssl/security_state_tab_helper.h b/chrome/browser/ssl/security_state_tab_helper.h index 17ad6fc..1b2938c 100644 --- a/chrome/browser/ssl/security_state_tab_helper.h +++ b/chrome/browser/ssl/security_state_tab_helper.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/macros.h" #include "components/security_state/core/security_state.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" @@ -36,7 +35,6 @@ void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; void DidChangeVisibleSecurityState() override; - void WebContentsDestroyed() override; private: explicit SecurityStateTabHelper(content::WebContents* web_contents); @@ -48,21 +46,6 @@ GetVisibleSecurityState() const; std::vector<std::string> GetSecureOriginsAndPatterns() const; - // True if a console message has been logged about an omnibox warning shown - // when sensitive input fields are shown on insecure HTTP pages. This message - // should only be logged once per main-frame navigation. - bool logged_http_warning_on_current_navigation_; - - // The time that a console or omnibox warning was shown for insecure - // HTTP pages that contain password or credit card fields. This is set - // at most once per main-frame navigation (the first time that an HTTP - // warning triggers on that navigation) and is used for UMA - // histogramming. - base::Time time_of_http_warning_on_current_navigation_; - - // True if this browser tab is in non-guest Incognito mode. - bool is_incognito_; - WEB_CONTENTS_USER_DATA_KEY_DECL(); DISALLOW_COPY_AND_ASSIGN(SecurityStateTabHelper);
diff --git a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc index e837907a..b13d4f9 100644 --- a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc +++ b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
@@ -176,37 +176,6 @@ return security_state::InsecureInputEventData(); } -// Stores the Insecure Input Events to the entry's SSLStatus user data. -void SetInputEvents(content::NavigationEntry* entry, - security_state::InsecureInputEventData events) { - security_state::SSLStatus& ssl = entry->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl.user_data.get()); - if (!input_events) { - ssl.user_data = - std::make_unique<security_state::SSLStatusInputEventData>(events); - } else { - *input_events->input_events() = events; - } -} - -void SimulateCreditCardFieldEdit(content::WebContents* contents) { - content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); - security_state::InsecureInputEventData input_events = GetInputEvents(entry); - input_events.credit_card_field_edited = true; - SetInputEvents(entry, input_events); - contents->DidChangeVisibleSecurityState(); -} - -void SimulatePasswordFieldShown(content::WebContents* contents) { - content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); - security_state::InsecureInputEventData input_events = GetInputEvents(entry); - input_events.password_field_shown = true; - SetInputEvents(entry, input_events); - contents->DidChangeVisibleSecurityState(); -} - // A delegate class that allows emulating selection of a file for an // INPUT TYPE=FILE form field. class FileChooserDelegate : public content::WebContentsDelegate { @@ -1393,39 +1362,6 @@ browser()->tab_strip_model()->GetActiveWebContents()); } -// Tests that when a visible password field is detected on an HTTP page -// load, the security level is downgraded to HTTP_SHOW_WARNING. -// -// Disabled on Mac bots. See crbug.com/812960. -#if defined(OS_MACOSX) -#define MAYBE_PasswordSecurityLevelDowngraded \ - DISABLED_PasswordSecurityLevelDowngraded -#else -#define MAYBE_PasswordSecurityLevelDowngraded PasswordSecurityLevelDowngraded -#endif -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - MAYBE_PasswordSecurityLevelDowngraded) { - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - ASSERT_TRUE(contents); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(contents); - ASSERT_TRUE(helper); - - ui_test_utils::NavigateToURL( - browser(), GetURLWithNonLocalHostname(embedded_test_server(), - "/password/simple_password.html")); - InjectScript(contents); - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); -} - // Tests the default security level on blob URLs. IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, DefaultSecurityLevelOnBlobUrl) { @@ -1458,125 +1394,6 @@ true /* use_secure_inner_origin */); } -// Tests that when an invisible password field is present on an HTTP page load, -// the security level is *not* downgraded to HTTP_SHOW_WARNING. -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - PasswordSecurityLevelNotDowngradedForInvisibleInput) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); - - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - ASSERT_TRUE(contents); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(contents); - ASSERT_TRUE(helper); - - ui_test_utils::NavigateToURL( - browser(), - GetURLWithNonLocalHostname(embedded_test_server(), - "/password/invisible_password.html")); - InjectScript(contents); - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::NONE, security_info.security_level); - - content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_FALSE(GetInputEvents(entry).password_field_shown); -} - -// Tests that when a visible password field is detected inside an iframe on an -// HTTP page load, the security level is downgraded to HTTP_SHOW_WARNING. -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - PasswordSecurityLevelDowngradedFromIframe) { - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - ASSERT_TRUE(contents); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(contents); - ASSERT_TRUE(helper); - - ui_test_utils::NavigateToURL( - browser(), - GetURLWithNonLocalHostname(embedded_test_server(), - "/password/simple_password_in_iframe.html")); - InjectScript(contents); - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); -} - -// Tests that when a visible password field is detected inside an iframe on an -// HTTP page load, the security level is downgraded to HTTP_SHOW_WARNING, even -// if the iframe itself was loaded over HTTPS. -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - PasswordSecurityLevelDowngradedFromHttpsIframe) { - SetUpMockCertVerifierForHttpsServer(0, net::OK); - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - ASSERT_TRUE(contents); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(contents); - ASSERT_TRUE(helper); - - // Navigate to an HTTP URL, which loads an iframe using the host and port of - // |https_server_|. - std::string replacement_path; - GetFilePathWithHostAndPortReplacement( - "/password/simple_password_in_https_iframe.html", - https_server_.host_port_pair(), &replacement_path); - ui_test_utils::NavigateToURL( - browser(), - GetURLWithNonLocalHostname(embedded_test_server(), replacement_path)); - InjectScript(contents); - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_TRUE(GetInputEvents(entry).password_field_shown); -} - -// Tests that when a visible password field is detected on an HTTPS page load, -// the security level is *not* downgraded to HTTP_SHOW_WARNING. -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - PasswordSecurityLevelNotDowngradedOnHttps) { - SetUpMockCertVerifierForHttpsServer(0, net::OK); - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - ASSERT_TRUE(contents); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(contents); - ASSERT_TRUE(helper); - - GURL url = GetURLWithNonLocalHostname(&https_server_, - "/password/simple_password.html"); - ui_test_utils::NavigateToURL(browser(), url); - InjectScript(contents); - // The security level should not be HTTP_SHOW_WARNING, because the page was - // HTTPS instead of HTTP. - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::SECURE, security_info.security_level); - - // The SSLStatus flags should only be set if the top-level page load was HTTP, - // which it was not in this case. - content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_FALSE(GetInputEvents(entry).password_field_shown); -} - // Tests that the security level of a HTTP page is not downgraded when a form // field is modified by JavaScript. IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, @@ -1612,7 +1429,6 @@ base::RunLoop().RunUntilIdle(); helper->GetSecurityInfo(&security_info); ASSERT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - ASSERT_FALSE(security_info.field_edit_downgraded_security_level); // Verify an InsertText operation isn't treated as user-input. EXPECT_TRUE(content::ExecuteScript( @@ -1621,11 +1437,11 @@ base::RunLoop().RunUntilIdle(); helper->GetSecurityInfo(&security_info); ASSERT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - ASSERT_FALSE(security_info.field_edit_downgraded_security_level); } -// Tests that the security level of a HTTP page is downgraded to -// HTTP_SHOW_WARNING after editing a form field in the relevant configurations. +// Tests that the security level of a HTTP page is downgraded from +// HTTP_SHOW_WARNING to DANGEROUS after editing a form field in the relevant +// configurations. IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, SecurityLevelDowngradedAfterFileSelection) { base::test::ScopedFeatureList scoped_feature_list; @@ -1646,7 +1462,7 @@ GetURLWithNonLocalHostname(embedded_test_server(), "/file_input.html")); security_state::SecurityInfo security_info; helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::NONE, security_info.security_level); + EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); // Prepare a file for the upload form. base::FilePath file_path; @@ -1666,19 +1482,17 @@ // Verify that the security state degrades as expected. helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - EXPECT_TRUE(security_info.field_edit_downgraded_security_level); + EXPECT_EQ(security_state::DANGEROUS, security_info.security_level); content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); ASSERT_TRUE(entry); EXPECT_TRUE(GetInputEvents(entry).insecure_field_edited); - // Verify that after a refresh, the HTTP_SHOW_WARNING state is cleared. + // Verify that after a refresh, the DANGEROUS state is cleared. contents->GetController().Reload(content::ReloadType::NORMAL, false); content::WaitForLoadStop(contents); helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::NONE, security_info.security_level); - EXPECT_FALSE(security_info.field_edit_downgraded_security_level); + EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); } // A Browser subclass that keeps track of messages that have been @@ -1723,275 +1537,6 @@ DISALLOW_COPY_AND_ASSIGN(ConsoleWebContentsDelegate); }; -// Checks that |delegate| has observed exactly one console message for -// HTTP_SHOW_WARNING. To avoid brittleness, this just looks for keywords -// in the string rather than the exact text. -void CheckForOneHttpWarningConsoleMessage( - ConsoleWebContentsDelegate* delegate) { - const std::vector<base::string16>& messages = delegate->console_messages(); - ASSERT_EQ(1u, messages.size()); - EXPECT_NE(base::string16::npos, - messages[0].find(base::ASCIIToUTF16("warning has been added"))); -} - -// Tests that console messages are printed upon a call to -// GetSecurityInfo() on an HTTP_SHOW_WARNING page, exactly once per -// main-frame navigation. - -// TODO(estark): add console messages for the |kMarkHttpAsParameterWarning| -// configuration of |kMarkHttpAsFeature| and update this test accordingly. -// https://crbug.com/802921 -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, ConsoleMessage) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); - ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( - Browser::CreateParams(browser()->profile(), true)); - content::WebContents* original_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - std::unique_ptr<content::WebContents> contents = - content::WebContents::Create(content::WebContents::CreateParams( - original_contents->GetBrowserContext())); - content::WebContents* raw_contents = contents.get(); - ASSERT_TRUE(raw_contents); - raw_contents->SetDelegate(delegate); - delegate->tab_strip_model()->AppendWebContents(std::move(contents), true); - int index = delegate->tab_strip_model()->GetIndexOfWebContents(raw_contents); - delegate->tab_strip_model()->ActivateTabAt(index, true); - ASSERT_EQ(raw_contents, delegate->tab_strip_model()->GetActiveWebContents()); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - GURL http_url = - GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html"); - ui_test_utils::NavigateToURL(delegate, http_url); - content::NavigationEntry* entry = - raw_contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(http_url, entry->GetURL()); - EXPECT_TRUE(delegate->console_messages().empty()); - - // Trigger the HTTP_SHOW_WARNING state. - base::RunLoop first_message; - delegate->set_console_message_callback(first_message.QuitClosure()); - SimulatePasswordFieldShown(raw_contents); - first_message.Run(); - - // Check that the HTTP_SHOW_WARNING state was actually triggered. - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(raw_contents); - ASSERT_TRUE(helper); - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - // Check that the expected console message is present. - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); - delegate->ClearConsoleMessages(); - - // Two subsequent triggers of VisibleSecurityStateChanged -- one on the - // same navigation and one on another navigation -- should only result - // in one additional console message. - SimulateCreditCardFieldEdit(raw_contents); - GURL second_http_url = - GetURLWithNonLocalHostname(embedded_test_server(), "/title2.html"); - ui_test_utils::NavigateToURL(delegate, second_http_url); - entry = raw_contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(second_http_url, entry->GetURL()); - - base::RunLoop second_message; - delegate->set_console_message_callback(second_message.QuitClosure()); - SimulatePasswordFieldShown(raw_contents); - second_message.Run(); - - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); -} - -// Tests that additional HTTP_SHOW_WARNING console messages are not -// printed after subframe navigations. -// -// TODO(estark): add console messages for the |kMarkHttpAsParameterWarning| -// configuration of |kMarkHttpAsFeature| and update this test accordingly. -// https://crbug.com/802921 -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - ConsoleMessageNotPrintedForFrameNavigation) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); - - ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( - Browser::CreateParams(browser()->profile(), true)); - content::WebContents* original_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - std::unique_ptr<content::WebContents> contents = - content::WebContents::Create(content::WebContents::CreateParams( - original_contents->GetBrowserContext())); - content::WebContents* raw_contents = contents.get(); - ASSERT_TRUE(raw_contents); - raw_contents->SetDelegate(delegate); - delegate->tab_strip_model()->AppendWebContents(std::move(contents), true); - int index = delegate->tab_strip_model()->GetIndexOfWebContents(raw_contents); - delegate->tab_strip_model()->ActivateTabAt(index, true); - ASSERT_EQ(raw_contents, delegate->tab_strip_model()->GetActiveWebContents()); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - GURL http_url = GetURLWithNonLocalHostname(embedded_test_server(), - "/ssl/page_with_frame.html"); - ui_test_utils::NavigateToURL(delegate, http_url); - content::NavigationEntry* entry = - raw_contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(http_url, entry->GetURL()); - EXPECT_TRUE(delegate->console_messages().empty()); - - // Trigger the HTTP_SHOW_WARNING state. - base::RunLoop first_message; - delegate->set_console_message_callback(first_message.QuitClosure()); - SimulatePasswordFieldShown(raw_contents); - first_message.Run(); - - // Check that the HTTP_SHOW_WARNING state was actually triggered. - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(raw_contents); - ASSERT_TRUE(helper); - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - // Check that the expected console message is present. - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); - delegate->ClearConsoleMessages(); - - // Navigate the subframe and trigger VisibleSecurityStateChanged - // again. While the security level is still HTTP_SHOW_WARNING, an - // additional console message should not be logged because there was - // already a console message logged for the current main-frame - // navigation. - content::WindowedNotificationObserver subframe_observer( - content::NOTIFICATION_LOAD_STOP, - content::Source<content::NavigationController>( - &raw_contents->GetController())); - EXPECT_TRUE(content::ExecuteScript( - raw_contents, - "document.getElementById('navFrame').src = '/title2.html';")); - subframe_observer.Wait(); - - SimulateCreditCardFieldEdit(raw_contents); - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - // Do a main frame navigation and then trigger HTTP_SHOW_WARNING - // again. From the above subframe navigation and this main-frame - // navigation, exactly one console message is expected. - GURL second_http_url = - GetURLWithNonLocalHostname(embedded_test_server(), "/title2.html"); - ui_test_utils::NavigateToURL(delegate, second_http_url); - entry = raw_contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(second_http_url, entry->GetURL()); - - base::RunLoop second_message; - delegate->set_console_message_callback(second_message.QuitClosure()); - SimulatePasswordFieldShown(raw_contents); - second_message.Run(); - - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); -} - -// Tests that additional HTTP_SHOW_WARNING console messages are not -// printed after pushState navigations. -// -// TODO(estark): add console messages for the |kMarkHttpAsParameterWarning| -// configuration of |kMarkHttpAsFeature| and update this test accordingly. -// https://crbug.com/802921 -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - ConsoleMessageNotPrintedForPushStateNavigation) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); - - ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( - Browser::CreateParams(browser()->profile(), true)); - content::WebContents* original_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - std::unique_ptr<content::WebContents> contents = - content::WebContents::Create(content::WebContents::CreateParams( - original_contents->GetBrowserContext())); - content::WebContents* raw_contents = contents.get(); - ASSERT_TRUE(raw_contents); - raw_contents->SetDelegate(delegate); - delegate->tab_strip_model()->AppendWebContents(std::move(contents), true); - int index = delegate->tab_strip_model()->GetIndexOfWebContents(raw_contents); - delegate->tab_strip_model()->ActivateTabAt(index, true); - ASSERT_EQ(raw_contents, delegate->tab_strip_model()->GetActiveWebContents()); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - GURL http_url = - GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html"); - ui_test_utils::NavigateToURL(delegate, http_url); - content::NavigationEntry* entry = - raw_contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(http_url, entry->GetURL()); - EXPECT_TRUE(delegate->console_messages().empty()); - - // Trigger the HTTP_SHOW_WARNING state. - base::RunLoop first_message; - delegate->set_console_message_callback(first_message.QuitClosure()); - SimulatePasswordFieldShown(raw_contents); - first_message.Run(); - - // Check that the HTTP_SHOW_WARNING state was actually triggered. - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(raw_contents); - ASSERT_TRUE(helper); - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - // Check that the expected console message is present. - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); - delegate->ClearConsoleMessages(); - - // Navigate with pushState and trigger VisibleSecurityStateChanged - // again. While the security level is still HTTP_SHOW_WARNING, an - // additional console message should not be logged because there was - // already a console message logged for the current main-frame - // navigation. - EXPECT_TRUE(content::ExecuteScript( - raw_contents, "history.pushState({ foo: 'bar' }, 'foo', 'bar');")); - SimulateCreditCardFieldEdit(raw_contents); - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - // Do a main frame navigation and then trigger HTTP_SHOW_WARNING - // again. From the above pushState navigation and this main-frame - // navigation, exactly one console message is expected. - GURL second_http_url = - GetURLWithNonLocalHostname(embedded_test_server(), "/title2.html"); - ui_test_utils::NavigateToURL(delegate, second_http_url); - entry = raw_contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(second_http_url, entry->GetURL()); - - base::RunLoop second_message; - delegate->set_console_message_callback(second_message.QuitClosure()); - SimulatePasswordFieldShown(raw_contents); - second_message.Run(); - - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); -} - // Tests that the security state for a WebContents is up to date when the // WebContents is inserted into a Browser's TabStripModel. IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, AddedTab) { @@ -2170,210 +1715,9 @@ EXPECT_TRUE(observer.latest_explanations().summary.empty()); } -// Tests that the security level of a HTTP page in Incognito mode is downgraded -// to HTTP_SHOW_WARNING. -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperIncognitoTest, - SecurityLevelDowngradedForHTTPInIncognito) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); - - ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( - Browser::CreateParams(browser()->profile(), true)); - content::WebContents* original_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - std::unique_ptr<content::WebContents> contents = - content::WebContents::Create(content::WebContents::CreateParams( - original_contents->GetBrowserContext())); - content::WebContents* raw_contents = contents.get(); - ASSERT_TRUE(raw_contents); - ASSERT_TRUE(raw_contents->GetBrowserContext()->IsOffTheRecord()); - raw_contents->SetDelegate(delegate); - delegate->tab_strip_model()->AppendWebContents(std::move(contents), true); - int index = delegate->tab_strip_model()->GetIndexOfWebContents(raw_contents); - delegate->tab_strip_model()->ActivateTabAt(index, true); - ASSERT_EQ(raw_contents, delegate->tab_strip_model()->GetActiveWebContents()); - - SecurityStyleTestObserver observer(raw_contents); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(raw_contents); - ASSERT_TRUE(helper); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - GURL http_url = - GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html"); - ui_test_utils::NavigateToURL(delegate, http_url); - content::NavigationEntry* entry = - raw_contents->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(http_url, entry->GetURL()); - - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_TRUE(security_info.incognito_downgraded_security_level); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - EXPECT_EQ(1u, observer.latest_explanations().neutral_explanations.size()); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, observer.latest_security_style()); - - // Check that the expected console message is present. - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); - - // Ensure that same-page pushstate does not add another notice. - EXPECT_TRUE(content::ExecuteScript( - raw_contents, "history.pushState({ foo: 'bar' }, 'foo', 'bar');")); - EXPECT_EQ(1u, observer.latest_explanations().neutral_explanations.size()); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, observer.latest_security_style()); - // Check that no additional console message is present. - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); -} - -// Tests that additional HTTP_SHOW_WARNING console messages are not -// printed after aborted navigations. -// -// TODO(estark): add console messages for the |kMarkHttpAsParameterWarning| -// configuration of |kMarkHttpAsFeature| and update this test accordingly. -// https://crbug.com/802921 -#if defined(OS_WIN) -#define MAYBE_ConsoleMessageNotPrintedForAbortedNavigation \ - DISABLED_ConsoleMessageNotPrintedForAbortedNavigation -#else -#define MAYBE_ConsoleMessageNotPrintedForAbortedNavigation \ - ConsoleMessageNotPrintedForAbortedNavigation -#endif -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperIncognitoTest, - ConsoleMessageNotPrintedForAbortedNavigation) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); - - ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( - Browser::CreateParams(browser()->profile(), true)); - content::WebContents* original_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - std::unique_ptr<content::WebContents> contents = - content::WebContents::Create(content::WebContents::CreateParams( - original_contents->GetBrowserContext())); - content::WebContents* raw_contents = contents.get(); - ASSERT_TRUE(raw_contents); - ASSERT_TRUE(raw_contents->GetBrowserContext()->IsOffTheRecord()); - raw_contents->SetDelegate(delegate); - delegate->tab_strip_model()->AppendWebContents(std::move(contents), true); - int index = delegate->tab_strip_model()->GetIndexOfWebContents(raw_contents); - delegate->tab_strip_model()->ActivateTabAt(index, true); - ASSERT_EQ(raw_contents, delegate->tab_strip_model()->GetActiveWebContents()); - - SecurityStyleTestObserver observer(raw_contents); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(raw_contents); - ASSERT_TRUE(helper); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - GURL http_url = - GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html"); - ui_test_utils::NavigateToURL(delegate, http_url); - - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_TRUE(security_info.incognito_downgraded_security_level); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, observer.latest_security_style()); - EXPECT_EQ(1u, observer.latest_explanations().neutral_explanations.size()); - - // Check that the expected console message is present. - ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); - delegate->ClearConsoleMessages(); - - // Perform a navigation that does not commit. - // The embedded test server returns a HTTP/204 only for local URLs, so - // we cannot use GetURLWithNonLocalHostname() here. - GURL http204_url = embedded_test_server()->GetURL("/nocontent"); - ui_test_utils::NavigateToURL(delegate, http204_url); - - // No change is expected in the security state. - EXPECT_TRUE(security_info.incognito_downgraded_security_level); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, observer.latest_security_style()); - EXPECT_EQ(1u, observer.latest_explanations().neutral_explanations.size()); - - // No additional console logging should occur. - EXPECT_TRUE(delegate->console_messages().empty()); -} - -// Tests that the security level of a HTTP page in Guest mode is not downgraded -// to HTTP_SHOW_WARNING. -#if defined(OS_CHROMEOS) -// Guest mode cannot be readily browser-tested on ChromeOS. -#define MAYBE_SecurityLevelNotDowngradedForHTTPInGuestMode \ - DISABLED_SecurityLevelNotDowngradedForHTTPInGuestMode -#else -#define MAYBE_SecurityLevelNotDowngradedForHTTPInGuestMode \ - SecurityLevelNotDowngradedForHTTPInGuestMode -#endif -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - MAYBE_SecurityLevelNotDowngradedForHTTPInGuestMode) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); - - // Create a new browser in Guest Mode. - EXPECT_EQ(1U, BrowserList::GetInstance()->size()); - content::WindowedNotificationObserver browser_creation_observer( - chrome::NOTIFICATION_BROWSER_OPENED, - content::NotificationService::AllSources()); - profiles::SwitchToGuestProfile(ProfileManager::CreateCallback()); - browser_creation_observer.Wait(); - EXPECT_EQ(2U, BrowserList::GetInstance()->size()); - Profile* guest = g_browser_process->profile_manager()->GetProfileByPath( - ProfileManager::GetGuestProfilePath()); - Browser* guest_browser = chrome::FindAnyBrowser(guest, true); - ASSERT_TRUE(guest_browser); - - ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( - Browser::CreateParams(guest_browser->profile(), true)); - content::WebContents* original_contents = - guest_browser->tab_strip_model()->GetActiveWebContents(); - std::unique_ptr<content::WebContents> contents = - content::WebContents::Create(content::WebContents::CreateParams( - original_contents->GetBrowserContext())); - content::WebContents* raw_contents = contents.get(); - ASSERT_TRUE(raw_contents); - ASSERT_TRUE(raw_contents->GetBrowserContext()->IsOffTheRecord()); - raw_contents->SetDelegate(delegate); - delegate->tab_strip_model()->AppendWebContents(std::move(contents), true); - int index = delegate->tab_strip_model()->GetIndexOfWebContents(raw_contents); - delegate->tab_strip_model()->ActivateTabAt(index, true); - ASSERT_EQ(raw_contents, delegate->tab_strip_model()->GetActiveWebContents()); - - SecurityStyleTestObserver observer(raw_contents); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(raw_contents); - ASSERT_TRUE(helper); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - GURL http_url = - GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html"); - ui_test_utils::NavigateToURL(delegate, http_url); - - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.incognito_downgraded_security_level); - EXPECT_EQ(security_state::NONE, security_info.security_level); - EXPECT_EQ(0u, observer.latest_explanations().neutral_explanations.size()); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, observer.latest_security_style()); - - // No console notification should occur. - EXPECT_TRUE(delegate->console_messages().empty()); -} - // Tests that the security level of a HTTP page is downgraded to DANGEROUS when // MarkHttpAsDangerous is enabled. -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperIncognitoTest, +IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, SecurityLevelDangerousWhenMarkHttpAsDangerous) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( @@ -2384,7 +1728,6 @@ content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(contents); - ASSERT_TRUE(contents->GetBrowserContext()->IsOffTheRecord()); SecurityStyleTestObserver observer(contents); @@ -2400,7 +1743,6 @@ security_state::SecurityInfo security_info; helper->GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.incognito_downgraded_security_level); EXPECT_EQ(security_state::DANGEROUS, security_info.security_level); EXPECT_EQ(blink::kWebSecurityStyleInsecure, observer.latest_security_style()); } @@ -2628,30 +1970,6 @@ EXPECT_EQ(security_state::NONE, security_info.security_level); } -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, MarkHttpAsWarning) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( - security_state::features::kMarkHttpAsFeature, - {{security_state::features::kMarkHttpAsFeatureParameterName, - security_state::features::kMarkHttpAsParameterWarning}}); - - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(contents); - ASSERT_TRUE(helper); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - ui_test_utils::NavigateToURL( - browser(), - GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html")); - - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); -} - IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, MarkHttpAsWarningAndDangerousOnFormEdits) { base::test::ScopedFeatureList scoped_feature_list; @@ -2689,7 +2007,6 @@ helper->GetSecurityInfo(&security_info); EXPECT_EQ(security_state::DANGEROUS, security_info.security_level); - EXPECT_FALSE(security_info.field_edit_downgraded_security_level); } // Type one character into the focused input control and wait for a security @@ -2766,97 +2083,24 @@ EXPECT_EQ(security_state::DANGEROUS, security_info.security_level); } -IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, - MarkHttpAsWarningAndDangerousOnPasswordsAndCreditCards) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( - security_state::features::kMarkHttpAsFeature, - {{security_state::features::kMarkHttpAsFeatureParameterName, - security_state::features:: - kMarkHttpAsParameterWarningAndDangerousOnPasswordsAndCreditCards}}); - - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(contents); - ASSERT_TRUE(helper); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - ui_test_utils::NavigateToURL( - browser(), - GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html")); - - security_state::SecurityInfo security_info; - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - - // Insert a password field into the page and wait for a security state change. - { - SecurityStyleTestObserver observer(contents); - EXPECT_TRUE( - content::ExecuteScript(contents, - "var i = document.createElement('input');" - "i.type = 'password';" - "i.id = 'password-field';" - "document.body.appendChild(i);")); - observer.WaitForDidChangeVisibleSecurityState(); - - // Verify that the security state degrades as expected. - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::DANGEROUS, security_info.security_level); - } - - // Remove the password field and verify that the security level returns to - // HTTP_SHOW_WARNING. - { - SecurityStyleTestObserver observer(contents); - EXPECT_TRUE(content::ExecuteScript(contents, - "document.body.removeChild(document." - "getElementById('password-field'));")); - observer.WaitForDidChangeVisibleSecurityState(); - helper->GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - } -} - // Tests that the histogram for security level is recorded correctly for HTTP // pages. IN_PROC_BROWSER_TEST_P(SecurityStateTabHelperTest, HTTPSecurityLevelHistogram) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( - security_state::features::kMarkHttpAsFeature, - {{security_state::features::kMarkHttpAsFeatureParameterName, - security_state::features:: - kMarkHttpAsParameterWarningAndDangerousOnPasswordsAndCreditCards}}); + scoped_feature_list.InitAndDisableFeature( + security_state::features::kMarkHttpAsFeature); const char kHistogramName[] = "Security.SecurityLevel.NoncryptographicScheme"; - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); { base::HistogramTester histograms; - // Use a non-local hostname so that password fields (added below) downgrade - // the security level. + // Use a non-local hostname so that the page is treated as Not Secure. ui_test_utils::NavigateToURL( browser(), GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html")); histograms.ExpectUniqueSample(kHistogramName, security_state::HTTP_SHOW_WARNING, 1); } - - // Add a password field and check that the histogram is recorded correctly. - { - base::HistogramTester histograms; - SecurityStyleTestObserver observer(contents); - EXPECT_TRUE( - content::ExecuteScript(contents, - "var i = document.createElement('input');" - "i.type = 'password';" - "document.body.appendChild(i);")); - observer.WaitForDidChangeVisibleSecurityState(); - histograms.ExpectUniqueSample(kHistogramName, security_state::DANGEROUS, 1); - } } // Tests that the histogram for security level is recorded correctly for HTTPS
diff --git a/chrome/browser/ssl/security_state_tab_helper_unittest.cc b/chrome/browser/ssl/security_state_tab_helper_unittest.cc index 839e759..0bc60e3d 100644 --- a/chrome/browser/ssl/security_state_tab_helper_unittest.cc +++ b/chrome/browser/ssl/security_state_tab_helper_unittest.cc
@@ -16,25 +16,9 @@ namespace { -const char kHTTPBadNavigationHistogram[] = - "Security.HTTPBad.NavigationStartedAfterUserWarnedAboutSensitiveInput"; -const char kHTTPBadWebContentsDestroyedHistogram[] = - "Security.HTTPBad.WebContentsDestroyedAfterUserWarnedAboutSensitiveInput"; const char kFormSubmissionSecurityLevelHistogram[] = "Security.SecurityLevel.FormSubmission"; -// Gets the Insecure Input Events from the entry's SSLStatus user data. -security_state::InsecureInputEventData GetInputEvents( - content::NavigationEntry* entry) { - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - entry->GetSSL().user_data.get()); - if (input_events) - return *input_events->input_events(); - - return security_state::InsecureInputEventData(); -} - // Stores the Insecure Input Events to the entry's SSLStatus user data. void SetInputEvents(content::NavigationEntry* entry, security_state::InsecureInputEventData events) { @@ -51,8 +35,7 @@ } class SecurityStateTabHelperHistogramTest - : public ChromeRenderViewHostTestHarness, - public testing::WithParamInterface<bool> { + : public ChromeRenderViewHostTestHarness { public: SecurityStateTabHelperHistogramTest() : helper_(nullptr) {} ~SecurityStateTabHelperHistogramTest() override {} @@ -66,18 +49,6 @@ } protected: - void SignalSensitiveInput() { - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - security_state::InsecureInputEventData input_events = GetInputEvents(entry); - if (GetParam()) - input_events.password_field_shown = true; - else - input_events.credit_card_field_edited = true; - SetInputEvents(entry, input_events); - helper_->DidChangeVisibleSecurityState(); - } - void ClearInputEvents() { content::NavigationEntry* entry = web_contents()->GetController().GetVisibleEntry(); @@ -85,13 +56,6 @@ helper_->DidChangeVisibleSecurityState(); } - const std::string HistogramName() { - if (GetParam()) - return "Security.HTTPBad.UserWarnedAboutSensitiveInput.Password"; - else - return "Security.HTTPBad.UserWarnedAboutSensitiveInput.CreditCard"; - } - void StartFormSubmissionNavigation() { std::unique_ptr<content::NavigationHandle> handle = content::NavigationHandle::CreateNavigationHandleForTesting( @@ -101,75 +65,16 @@ void NavigateToHTTP() { NavigateAndCommit(GURL("http://example.test")); } - void NavigateToDifferentHTTPPage() { - NavigateAndCommit(GURL("http://example2.test")); - } - private: SecurityStateTabHelper* helper_; DISALLOW_COPY_AND_ASSIGN(SecurityStateTabHelperHistogramTest); }; -// Tests that an UMA histogram is recorded after setting the security -// level to HTTP_SHOW_WARNING and navigating away. -TEST_P(SecurityStateTabHelperHistogramTest, - HTTPOmniboxWarningNavigationHistogram) { - base::HistogramTester histograms; - SignalSensitiveInput(); - // Make sure that if the omnibox warning gets dynamically hidden, the - // histogram still gets recorded. - NavigateToDifferentHTTPPage(); - if (GetParam()) { - ClearInputEvents(); - } - // Destroy the WebContents to simulate the tab being closed after a - // navigation. - SetContents(nullptr); - histograms.ExpectTotalCount(kHTTPBadNavigationHistogram, 1); - histograms.ExpectTotalCount(kHTTPBadWebContentsDestroyedHistogram, 0); -} - -// Tests that an UMA histogram is recorded after setting the security -// level to HTTP_SHOW_WARNING and closing the tab. -TEST_P(SecurityStateTabHelperHistogramTest, - HTTPOmniboxWarningTabClosedHistogram) { - base::HistogramTester histograms; - SignalSensitiveInput(); - // Destroy the WebContents to simulate the tab being closed. - SetContents(nullptr); - histograms.ExpectTotalCount(kHTTPBadNavigationHistogram, 0); - histograms.ExpectTotalCount(kHTTPBadWebContentsDestroyedHistogram, 1); -} - -TEST_P(SecurityStateTabHelperHistogramTest, FormSubmissionHistogram) { +TEST_F(SecurityStateTabHelperHistogramTest, FormSubmissionHistogram) { base::HistogramTester histograms; StartFormSubmissionNavigation(); histograms.ExpectUniqueSample(kFormSubmissionSecurityLevelHistogram, security_state::HTTP_SHOW_WARNING, 1); } -// Tests that UMA logs the omnibox warning when security level is -// HTTP_SHOW_WARNING. -TEST_P(SecurityStateTabHelperHistogramTest, HTTPOmniboxWarningHistogram) { - base::HistogramTester histograms; - SignalSensitiveInput(); - histograms.ExpectUniqueSample(HistogramName(), true, 1); - - // Fire again and ensure no sample is recorded. - SignalSensitiveInput(); - histograms.ExpectUniqueSample(HistogramName(), true, 1); - - // Navigate to a new page and ensure a sample is recorded. - NavigateToDifferentHTTPPage(); - histograms.ExpectUniqueSample(HistogramName(), true, 1); - SignalSensitiveInput(); - histograms.ExpectUniqueSample(HistogramName(), true, 2); -} - -INSTANTIATE_TEST_CASE_P(SecurityStateTabHelperHistogramTest, - SecurityStateTabHelperHistogramTest, - // Here 'true' to test password field triggered - // histogram and 'false' to test credit card field. - testing::Bool()); - } // namespace
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc index 52abbd4..b07996e 100644 --- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc +++ b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
@@ -28,7 +28,7 @@ #include "components/subresource_filter/core/browser/subresource_filter_features.h" #include "components/subresource_filter/core/common/activation_decision.h" #include "components/subresource_filter/core/common/activation_scope.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc index 3946f88..aeacf661 100644 --- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc +++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
@@ -49,7 +49,7 @@ #include "components/subresource_filter/core/common/scoped_timers.h" #include "components/subresource_filter/core/common/test_ruleset_creator.h" #include "components/subresource_filter/core/common/test_ruleset_utils.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "components/url_pattern_index/proto/rules.pb.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h"
diff --git a/chrome/browser/subresource_filter/subresource_filter_configuration_unittest.cc b/chrome/browser/subresource_filter/subresource_filter_configuration_unittest.cc index 4ae5e050..a628ad6 100644 --- a/chrome/browser/subresource_filter/subresource_filter_configuration_unittest.cc +++ b/chrome/browser/subresource_filter/subresource_filter_configuration_unittest.cc
@@ -8,7 +8,7 @@ #include "components/subresource_filter/core/browser/subresource_filter_features.h" #include "components/subresource_filter/core/common/activation_list.h" #include "components/subresource_filter/core/common/activation_scope.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h"
diff --git a/chrome/browser/subresource_filter/subresource_filter_test_harness.cc b/chrome/browser/subresource_filter/subresource_filter_test_harness.cc index 4fcb53c..68d417f 100644 --- a/chrome/browser/subresource_filter/subresource_filter_test_harness.cc +++ b/chrome/browser/subresource_filter/subresource_filter_test_harness.cc
@@ -28,7 +28,7 @@ #include "components/subresource_filter/core/common/activation_decision.h" #include "components/subresource_filter/core/common/activation_list.h" #include "components/subresource_filter/core/common/test_ruleset_creator.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/navigation_throttle.h" #include "content/public/test/navigation_simulator.h"
diff --git a/chrome/browser/subresource_filter/subresource_filter_unittest.cc b/chrome/browser/subresource_filter/subresource_filter_unittest.cc index 660dfff..35ea52a 100644 --- a/chrome/browser/subresource_filter/subresource_filter_unittest.cc +++ b/chrome/browser/subresource_filter/subresource_filter_unittest.cc
@@ -21,7 +21,7 @@ #include "components/subresource_filter/core/common/activation_list.h" #include "components/subresource_filter/core/common/activation_scope.h" #include "components/subresource_filter/core/common/load_policy.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/devtools_agent_host.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h"
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 7c54b10a..ece032e 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1348,6 +1348,8 @@ "ash/keyboard/chrome_keyboard_controller_client.h", "ash/keyboard/chrome_keyboard_ui.cc", "ash/keyboard/chrome_keyboard_ui.h", + "ash/keyboard/chrome_keyboard_ui_factory.cc", + "ash/keyboard/chrome_keyboard_ui_factory.h", "ash/keyboard/chrome_keyboard_web_contents.cc", "ash/keyboard/chrome_keyboard_web_contents.h", "ash/ksv/keyboard_shortcut_viewer_util.cc",
diff --git a/chrome/browser/ui/ash/ash_shell_init.cc b/chrome/browser/ui/ash/ash_shell_init.cc index 0f876d01..400dc76 100644 --- a/chrome/browser/ui/ash/ash_shell_init.cc +++ b/chrome/browser/ui/ash/ash_shell_init.cc
@@ -11,10 +11,12 @@ #include "ash/shell_init_params.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/ui/ash/chrome_shell_delegate.h" +#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.h" #include "content/public/browser/context_factory.h" #include "content/public/browser/gpu_interface_provider_factory.h" #include "content/public/common/service_manager_connection.h" #include "ui/aura/window_tree_host.h" +#include "ui/base/ui_base_features.h" namespace { @@ -36,6 +38,10 @@ shell_init_params.initial_display_prefs = ash::DisplayPrefs::GetInitialDisplayPrefsFromPrefService( g_browser_process->local_state()); + if (!features::IsUsingWindowService()) { + shell_init_params.keyboard_ui_factory = + std::make_unique<ChromeKeyboardUIFactory>(); + } ash::Shell::CreateInstance(std::move(shell_init_params)); }
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc index 89429fd8..3eefff91 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate.cc +++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc
@@ -52,11 +52,6 @@ Navigate(¶ms); } -std::unique_ptr<keyboard::KeyboardUI> ChromeShellDelegate::CreateKeyboardUI() { - return std::make_unique<ChromeKeyboardUI>( - ProfileManager::GetActiveUserProfile()); -} - ash::AccessibilityDelegate* ChromeShellDelegate::CreateAccessibilityDelegate() { return new ChromeAccessibilityDelegate; }
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.h b/chrome/browser/ui/ash/chrome_shell_delegate.h index 641dc9cd7..27ce5304 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate.h +++ b/chrome/browser/ui/ash/chrome_shell_delegate.h
@@ -15,7 +15,6 @@ // ash::ShellDelegate: bool CanShowWindowForUser(aura::Window* window) const override; - std::unique_ptr<keyboard::KeyboardUI> CreateKeyboardUI() override; std::unique_ptr<ash::ScreenshotDelegate> CreateScreenshotDelegate() override; ash::AccessibilityDelegate* CreateAccessibilityDelegate() override; void OpenKeyboardShortcutHelpPage() const override;
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.cc new file mode 100644 index 0000000..80b7342 --- /dev/null +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.cc
@@ -0,0 +1,17 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.h" + +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.h" + +ChromeKeyboardUIFactory::ChromeKeyboardUIFactory() = default; +ChromeKeyboardUIFactory::~ChromeKeyboardUIFactory() = default; + +std::unique_ptr<keyboard::KeyboardUI> +ChromeKeyboardUIFactory::CreateKeyboardUI() { + return std::make_unique<ChromeKeyboardUI>( + ProfileManager::GetActiveUserProfile()); +}
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.h b/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.h new file mode 100644 index 0000000..2fe19428 --- /dev/null +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.h
@@ -0,0 +1,28 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_ASH_KEYBOARD_CHROME_KEYBOARD_UI_FACTORY_H_ +#define CHROME_BROWSER_UI_ASH_KEYBOARD_CHROME_KEYBOARD_UI_FACTORY_H_ + +#include "base/macros.h" +#include "ui/keyboard/keyboard_ui_factory.h" + +namespace keyboard { +class KeyboardUI; +} + +// ChromeKeyboardUIFactory is the factory class for ChromeKeyboardUI. +class ChromeKeyboardUIFactory : public keyboard::KeyboardUIFactory { + public: + ChromeKeyboardUIFactory(); + ~ChromeKeyboardUIFactory() override; + + private: + // keyboard::KeyboardUIFactory: + std::unique_ptr<keyboard::KeyboardUI> CreateKeyboardUI() override; + + DISALLOW_COPY_AND_ASSIGN(ChromeKeyboardUIFactory); +}; + +#endif // CHROME_BROWSER_UI_ASH_KEYBOARD_CHROME_KEYBOARD_UI_FACTORY_H_
diff --git a/chrome/browser/ui/ash/shelf_browsertest.cc b/chrome/browser/ui/ash/shelf_browsertest.cc index 09d82ae3..09df5f1d 100644 --- a/chrome/browser/ui/ash/shelf_browsertest.cc +++ b/chrome/browser/ui/ash/shelf_browsertest.cc
@@ -42,44 +42,6 @@ DISALLOW_COPY_AND_ASSIGN(ShelfBrowserTest); }; -// Confirm that a status bubble doesn't cause the shelf to darken. -IN_PROC_BROWSER_TEST_F(ShelfBrowserTest, StatusBubble) { - ash::mojom::ShelfTestApiAsyncWaiter shelf(shelf_test_api_.get()); - bool shelf_visible = false; - shelf.IsVisible(&shelf_visible); - EXPECT_TRUE(shelf_visible); - - // Ensure that the browser abuts the shelf. - const int shelf_top = - display::Screen::GetScreen()->GetPrimaryDisplay().work_area().bottom(); - gfx::Rect bounds = browser()->window()->GetBounds(); - bounds.set_height(shelf_top - bounds.y()); - browser()->window()->SetBounds(bounds); - aura::test::WaitForAllChangesToComplete(); - - // Browser does not overlap shelf. - bool has_overlapping_window = false; - shelf.HasOverlappingWindow(&has_overlapping_window); - EXPECT_FALSE(has_overlapping_window); - - // Show status, which may overlap the shelf by a pixel. - browser()->window()->GetStatusBubble()->SetStatus( - base::UTF8ToUTF16("Dummy Status Text")); - aura::test::WaitForAllChangesToComplete(); - shelf.UpdateVisibility(); - - // Ensure that status doesn't cause overlap. - shelf.HasOverlappingWindow(&has_overlapping_window); - EXPECT_FALSE(has_overlapping_window); - - // Ensure that moving the browser slightly down does cause overlap. - bounds.Offset(0, 1); - browser()->window()->SetBounds(bounds); - aura::test::WaitForAllChangesToComplete(); - shelf.HasOverlappingWindow(&has_overlapping_window); - EXPECT_TRUE(has_overlapping_window); -} - class ShelfGuestSessionBrowserTest : public ShelfBrowserTest { protected: void SetUpCommandLine(base::CommandLine* command_line) override {
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 2d133d43c..c658c63 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -23,7 +23,6 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/signin_promo_util.h" -#include "chrome/browser/ssl/insecure_sensitive_input_driver_factory.h" #include "chrome/browser/ssl/security_state_tab_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/translate/chrome_translate_client.h" @@ -451,13 +450,6 @@ #endif // defined(OS_ANDROID) } -void ChromeAutofillClient::DidInteractWithNonsecureCreditCardInput() { - InsecureSensitiveInputDriverFactory* factory = - InsecureSensitiveInputDriverFactory::GetOrCreateForWebContents( - web_contents()); - factory->DidInteractWithNonsecureCreditCardInput(); -} - bool ChromeAutofillClient::IsContextSecure() { content::SSLStatus ssl_status; content::NavigationEntry* navigation_entry =
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index 70af75d..b0d7622 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -119,7 +119,6 @@ const std::vector<autofill::FormStructure*>& forms) override; void DidFillOrPreviewField(const base::string16& autofilled_value, const base::string16& profile_full_name) override; - void DidInteractWithNonsecureCreditCardInput() override; bool IsContextSecure() override; bool ShouldShowSigninPromo() override; bool AreServerCardsSupported() override;
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index 6548c59..b35591a 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc
@@ -52,8 +52,9 @@ #endif #if !defined(OS_ANDROID) -#include "chrome/browser/signin/signin_manager_factory.h" -#include "components/signin/core/browser/signin_manager.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "components/signin/core/browser/signin_pref_names.h" +#include "services/identity/public/cpp/identity_manager.h" #endif using base::UserMetricsAction; @@ -384,9 +385,7 @@ void ShowBrowserSignin(Browser* browser, signin_metrics::AccessPoint access_point) { Profile* original_profile = browser->profile()->GetOriginalProfile(); - SigninManagerBase* manager = - SigninManagerFactory::GetForProfile(original_profile); - DCHECK(manager->IsSigninAllowed()); + DCHECK(original_profile->GetPrefs()->GetBoolean(prefs::kSigninAllowed)); // If the browser's profile is an incognito profile, make sure to use // a browser window from the original profile. The user cannot sign in @@ -428,8 +427,10 @@ NOTREACHED(); #else profiles::BubbleViewMode bubble_view_mode = - manager->IsAuthenticated() ? profiles::BUBBLE_VIEW_MODE_GAIA_REAUTH - : profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN; + IdentityManagerFactory::GetForProfile(original_profile) + ->HasPrimaryAccount() + ? profiles::BUBBLE_VIEW_MODE_GAIA_REAUTH + : profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN; browser->signin_view_controller()->ShowSignin(bubble_view_mode, browser, access_point); #endif @@ -439,10 +440,9 @@ void ShowBrowserSigninOrSettings(Browser* browser, signin_metrics::AccessPoint access_point) { Profile* original_profile = browser->profile()->GetOriginalProfile(); - SigninManagerBase* manager = - SigninManagerFactory::GetForProfile(original_profile); - DCHECK(manager->IsSigninAllowed()); - if (manager->IsAuthenticated()) + DCHECK(original_profile->GetPrefs()->GetBoolean(prefs::kSigninAllowed)); + if (IdentityManagerFactory::GetForProfile(original_profile) + ->HasPrimaryAccount()) ShowSettings(browser); else ShowBrowserSignin(browser, access_point);
diff --git a/chrome/browser/ui/cocoa/first_run_dialog.mm b/chrome/browser/ui/cocoa/first_run_dialog.mm index 39245177..891025e 100644 --- a/chrome/browser/ui/cocoa/first_run_dialog.mm +++ b/chrome/browser/ui/cocoa/first_run_dialog.mm
@@ -146,7 +146,12 @@ // handlers is received. (The ShutdownDetector posts a task to the UI thread's // TaskRunner to begin shutdown upon receiving a SIGTERM.) static_cast<BrowserProcessImpl*>(g_browser_process) - ->SetQuitClosure(run_loop.QuitClosure()); + ->SetQuitClosure(base::BindOnce( + [](base::RunLoop* run_loop) { + [NSApp abortModal]; + run_loop->Quit(); + }, + &run_loop)); // Barring a shutdown signal, the run loop will quit when the user closes the // first run dialog.
diff --git a/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc b/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc index daca056..fa6cdc0 100644 --- a/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc +++ b/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc
@@ -30,6 +30,25 @@ // This message must match the one sent in inline_login.js: sendLSTFetchResults. constexpr char kLSTFetchResultsMessage[] = "lstFetchResults"; +void WriteResultToHandle(const base::Value& result) { + std::string json_result; + if (base::JSONWriter::Write(result, &json_result) && !json_result.empty()) { + // The caller of this Chrome process must provide a stdout handle to + // which Chrome can output the results, otherwise by default the call to + // ::GetStdHandle(STD_OUTPUT_HANDLE) will result in an invalid or null + // handle if Chrome was started without providing a console. + HANDLE output_handle = ::GetStdHandle(STD_OUTPUT_HANDLE); + if (output_handle != nullptr && output_handle != INVALID_HANDLE_VALUE) { + DWORD written; + if (!::WriteFile(output_handle, json_result.c_str(), json_result.length(), + &written, nullptr)) { + SYSLOG(ERROR) + << "Failed to write result of GCPW signin to inherited handle."; + } + } + } +} + void HandleAllGcpwInfoFetched( std::unique_ptr<ScopedKeepAlive> keep_alive, std::unique_ptr<CredentialProviderSigninInfoFetcher> fetcher, @@ -38,24 +57,8 @@ DCHECK(signin_result.is_dict()); DCHECK(fetch_result.is_dict()); if (!signin_result.DictEmpty() && !fetch_result.DictEmpty()) { - std::string json_result; signin_result.MergeDictionary(&fetch_result); - if (base::JSONWriter::Write(signin_result, &json_result) && - !json_result.empty()) { - // The caller of this Chrome process must provide a stdout handle to - // which Chrome can output the results, otherwise by default the call to - // ::GetStdHandle(STD_OUTPUT_HANDLE) will result in an invalid or null - // handle if Chrome was started without providing a console. - HANDLE output_handle = ::GetStdHandle(STD_OUTPUT_HANDLE); - if (output_handle != nullptr && output_handle != INVALID_HANDLE_VALUE) { - DWORD written; - if (!::WriteFile(output_handle, json_result.c_str(), - json_result.length(), &written, nullptr)) { - SYSLOG(ERROR) - << "Failed to write result of GCPW signin to inherited handle."; - } - } - } + WriteResultToHandle(signin_result); } // Release the fetcher and mark it for eventual delete. It is not immediately @@ -69,13 +72,31 @@ void HandleSigninCompleteForGcpwLogin( std::unique_ptr<ScopedKeepAlive> keep_alive, base::Value signin_result, - const std::string& access_token, - const std::string& refresh_token, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) { DCHECK(signin_result.is_dict()); - DCHECK_EQ(signin_result.DictEmpty(), - access_token.empty() && refresh_token.empty()); - if (!signin_result.DictEmpty()) { + DCHECK(signin_result.DictSize() >= 1); + int exit_code = signin_result + .FindKeyOfType(credential_provider::kKeyExitCode, + base::Value::Type::INTEGER) + ->GetInt(); + + // If there was an exit code, write the result now and continue to release + // the keep alive. + if (exit_code != credential_provider::kUiecSuccess) { + WriteResultToHandle(signin_result); + } else if (signin_result.DictSize() > 1) { + std::string access_token = + signin_result + .FindKeyOfType(credential_provider::kKeyAccessToken, + base::Value::Type::STRING) + ->GetString(); + std::string refresh_token = + signin_result + .FindKeyOfType(credential_provider::kKeyRefreshToken, + base::Value::Type::STRING) + ->GetString(); + DCHECK(!access_token.empty() && !refresh_token.empty()); + // Create the fetcher and pass it to the callback so that it can be // deleted once it is finished. auto fetcher = std::make_unique<CredentialProviderSigninInfoFetcher>( @@ -86,10 +107,10 @@ std::move(fetcher), std::move(signin_result))); } - // If the function has not pass ownership of the keep alive yet at this point - // this means there was some error reading the sign in result or the result - // was empty. In this case, return from the method which will implicitly - // release the keep_alive which will close and release everything. + // If the function has not passed ownership of the keep alive yet at this + // point this means there was some error reading the sign in result or the + // result was empty. In this case, return from the method which will + // implicitly release the keep_alive which will close and release everything. } class CredentialProviderWebUIMessageHandler @@ -109,12 +130,20 @@ } private: - base::Value ParseArgs(const base::ListValue* args, - std::string* out_access_token, - std::string* out_refresh_token) { + base::Value ParseArgs(const base::ListValue* args, int* out_exit_code) { + DCHECK(out_exit_code); + const base::Value* dict_result = nullptr; if (!args || args->empty() || !args->Get(0, &dict_result) || !dict_result->is_dict()) { + *out_exit_code = credential_provider::kUiecMissingSigninData; + return base::Value(base::Value::Type::DICTIONARY); + } + const base::Value* exit_code = dict_result->FindKeyOfType( + credential_provider::kKeyExitCode, base::Value::Type::INTEGER); + + if (exit_code && exit_code->GetInt() != credential_provider::kUiecSuccess) { + *out_exit_code = exit_code->GetInt(); return base::Value(base::Value::Type::DICTIONARY); } @@ -133,18 +162,20 @@ password->GetString().empty() || !id || id->GetString().empty() || !access_token || access_token->GetString().empty() || !refresh_token || refresh_token->GetString().empty()) { + *out_exit_code = credential_provider::kUiecMissingSigninData; return base::Value(base::Value::Type::DICTIONARY); } - *out_access_token = access_token->GetString(); - *out_refresh_token = refresh_token->GetString(); + *out_exit_code = credential_provider::kUiecSuccess; return dict_result->Clone(); } void OnSigninComplete(const base::ListValue* args) { - std::string access_token; - std::string refresh_token; - base::Value signin_result = ParseArgs(args, &access_token, &refresh_token); + int exit_code; + base::Value signin_result = ParseArgs(args, &exit_code); + + signin_result.SetKey(credential_provider::kKeyExitCode, + base::Value(exit_code)); content::WebContents* contents = web_ui()->GetWebContents(); content::StoragePartition* partition = @@ -156,7 +187,7 @@ // (like the keep_alive in HandleSigninCompleteForGCPWLogin) or perform // possible error handling. std::move(signin_callback_) - .Run(std::move(signin_result), access_token, refresh_token, + .Run(std::move(signin_result), partition->GetURLLoaderFactoryForBrowserProcess()); } @@ -174,14 +205,16 @@ // |reauth_email| is used to pre fill in the sign in dialog with the user's // e-mail during a reauthorize sign in. This type of sign in is used to update // the user's password. - // |email_domain| is used to pre fill the email domain on Gaia's signin page + // |email_domains| is used to pre fill the email domain on Gaia's signin page // so that the user only needs to enter their user name. CredentialProviderWebDialogDelegate( const std::string& reauth_email, - const std::string& email_domain, + const std::string& reauth_gaia_id, + const std::string& email_domains, HandleGcpwSigninCompleteResult signin_callback) : reauth_email_(reauth_email), - email_domain_(email_domain), + reauth_gaia_id_(reauth_gaia_id), + email_domains_(email_domains), signin_callback_(std::move(signin_callback)) {} GURL GetDialogContentURL() const override { @@ -195,13 +228,18 @@ ? signin::GetPromoURLForDialog(access_point, reason, false) : signin::GetReauthURLWithEmailForDialog(access_point, reason, reauth_email_); + if (!reauth_gaia_id_.empty()) { + base_url = net::AppendQueryParameter( + base_url, credential_provider::kValidateGaiaIdSigninPromoParameter, + reauth_gaia_id_); + } - if (email_domain_.empty()) + if (email_domains_.empty()) return base_url; return net::AppendQueryParameter( - base_url, credential_provider::kEmailDomainSigninPromoParameter, - email_domain_); + base_url, credential_provider::kEmailDomainsSigninPromoParameter, + email_domains_); } ui::ModalType GetDialogModalType() const override { @@ -259,8 +297,13 @@ // E-mail used to pre-fill the e-mail field when a reauth signin is required. const std::string reauth_email_; + // Gaia id to check against if a |reauth_email_| is provided but the final + // e-mail used in sign in does not match. This allows the same gaia user to + // sign in with another e-mail if it has changed. + const std::string reauth_gaia_id_; + // Default domain used for all sign in requests. - const std::string email_domain_; + const std::string email_domains_; // Callback that will be called when a valid sign in has been completed // through the dialog. @@ -300,15 +343,18 @@ // Open a frameless window whose entire surface displays a gaia sign in web // page. - std::string reauth_email = - command_line.GetSwitchValueASCII(credential_provider::kGcpwSigninSwitch); - std::string email_domain = - command_line.GetSwitchValueASCII(credential_provider::kEmailDomainSwitch); + std::string reauth_email = command_line.GetSwitchValueASCII( + credential_provider::kPrefillEmailSwitch); + std::string reauth_gaia_id = + command_line.GetSwitchValueASCII(credential_provider::kGaiaIdSwitch); + std::string email_domains = command_line.GetSwitchValueASCII( + credential_provider::kEmailDomainsSwitch); // Delegate to handle the result of the sign in request. This will // delete itself eventually when it receives the OnDialogClosed call. auto delegate = std::make_unique<CredentialProviderWebDialogDelegate>( - reauth_email, email_domain, std::move(signin_complete_handler)); + reauth_email, reauth_gaia_id, email_domains, + std::move(signin_complete_handler)); // The web dialog view that will contain the web ui for the login screen. // This view will be automatically deleted by the widget that owns it when it
diff --git a/chrome/browser/ui/startup/credential_provider_signin_dialog_win.h b/chrome/browser/ui/startup/credential_provider_signin_dialog_win.h index 7dd099c..1b4d0ac 100644 --- a/chrome/browser/ui/startup/credential_provider_signin_dialog_win.h +++ b/chrome/browser/ui/startup/credential_provider_signin_dialog_win.h
@@ -29,15 +29,12 @@ // Callback signalled by the dialog when the Gaia sign in flow compltes. // Parameters are: -// 1. A base::Value that is of type DICTIONARY. An empty dictionary signals an -// error during the signin process -// 2. The signed in user's access token. -// 3. The signed in user's refresh token. -// 4. A URL loader that will be used by various OAuth fetchers. +// 1. A base::Value that is of type DICTIONARY. The dictionary will always +// contain an exit_code entry and possibly more data if exit_code == +// credential_provider::kUiecSuccess. +// 2. A URL loader that will be used by various OAuth fetchers. using HandleGcpwSigninCompleteResult = base::OnceCallback<void(base::Value, - const std::string&, - const std::string&, scoped_refptr<network::SharedURLLoaderFactory>)>; // Starts the Google Credential Provider for Windows (GCPW) Sign in flow. First
diff --git a/chrome/browser/ui/startup/credential_provider_signin_dialog_win_browsertest.cc b/chrome/browser/ui/startup/credential_provider_signin_dialog_win_browsertest.cc index e44876f..e2ade2c3 100644 --- a/chrome/browser/ui/startup/credential_provider_signin_dialog_win_browsertest.cc +++ b/chrome/browser/ui/startup/credential_provider_signin_dialog_win_browsertest.cc
@@ -84,13 +84,12 @@ // has correctly received and procesed the sign in complete message. void HandleSignInComplete( base::Value signin_result, - const std::string& access_token, - const std::string& refresh_token, scoped_refptr<network::SharedURLLoaderFactory> url_loader); bool signin_complete_called_ = false; std::string result_access_token_; std::string result_refresh_token_; + int exit_code_; base::Value result_value_; CredentialProviderSigninDialogTestDataStorage test_data_storage_; @@ -142,11 +141,23 @@ void CredentialProviderSigninDialogWinDialogTest::HandleSignInComplete( base::Value signin_result, - const std::string& access_token, - const std::string& refresh_token, scoped_refptr<network::SharedURLLoaderFactory> url_loader) { - result_access_token_ = access_token; - result_refresh_token_ = refresh_token; + exit_code_ = signin_result + .FindKeyOfType(credential_provider::kKeyExitCode, + base::Value::Type::INTEGER) + ->GetInt(); + if (exit_code_ == credential_provider::kUiecSuccess) { + result_access_token_ = + signin_result + .FindKeyOfType(credential_provider::kKeyAccessToken, + base::Value::Type::STRING) + ->GetString(); + result_refresh_token_ = + signin_result + .FindKeyOfType(credential_provider::kKeyRefreshToken, + base::Value::Type::STRING) + ->GetString(); + } EXPECT_FALSE(signin_complete_called_); signin_complete_called_ = true; result_value_ = std::move(signin_result); @@ -162,7 +173,7 @@ SendSigninCompleteMessage(test_data_storage_.MakeSignInResponseValue()); EXPECT_TRUE(signin_complete_called_); EXPECT_TRUE(result_value_.is_dict()); - EXPECT_TRUE(result_value_.DictEmpty()); + EXPECT_EQ(result_value_.DictSize(), 1u); EXPECT_TRUE(result_access_token_.empty()); EXPECT_TRUE(result_refresh_token_.empty()); } @@ -178,7 +189,7 @@ test_data_storage_.GetSuccessRefreshToken())); EXPECT_TRUE(signin_complete_called_); EXPECT_TRUE(result_value_.is_dict()); - EXPECT_TRUE(result_value_.DictEmpty()); + EXPECT_EQ(result_value_.DictSize(), 1u); EXPECT_TRUE(result_access_token_.empty()); EXPECT_TRUE(result_refresh_token_.empty()); } @@ -194,7 +205,7 @@ test_data_storage_.GetSuccessRefreshToken())); EXPECT_TRUE(signin_complete_called_); EXPECT_TRUE(result_value_.is_dict()); - EXPECT_TRUE(result_value_.DictEmpty()); + EXPECT_EQ(result_value_.DictSize(), 1u); EXPECT_TRUE(result_access_token_.empty()); EXPECT_TRUE(result_refresh_token_.empty()); } @@ -210,7 +221,7 @@ test_data_storage_.GetSuccessRefreshToken())); EXPECT_TRUE(signin_complete_called_); EXPECT_TRUE(result_value_.is_dict()); - EXPECT_TRUE(result_value_.DictEmpty()); + EXPECT_EQ(result_value_.DictSize(), 1u); EXPECT_TRUE(result_access_token_.empty()); EXPECT_TRUE(result_refresh_token_.empty()); } @@ -226,7 +237,7 @@ test_data_storage_.GetSuccessRefreshToken())); EXPECT_TRUE(signin_complete_called_); EXPECT_TRUE(result_value_.is_dict()); - EXPECT_TRUE(result_value_.DictEmpty()); + EXPECT_EQ(result_value_.DictSize(), 1u); EXPECT_TRUE(result_access_token_.empty()); EXPECT_TRUE(result_refresh_token_.empty()); } @@ -242,7 +253,7 @@ test_data_storage_.GetSuccessAccessToken(), std::string())); EXPECT_TRUE(signin_complete_called_); EXPECT_TRUE(result_value_.is_dict()); - EXPECT_TRUE(result_value_.DictEmpty()); + EXPECT_EQ(result_value_.DictSize(), 1u); EXPECT_TRUE(result_access_token_.empty()); EXPECT_TRUE(result_refresh_token_.empty()); } @@ -254,7 +265,7 @@ SendValidSigninCompleteMessage(); EXPECT_TRUE(signin_complete_called_); EXPECT_TRUE(result_value_.is_dict()); - EXPECT_FALSE(result_value_.DictEmpty()); + EXPECT_GT(result_value_.DictSize(), 1u); const base::DictionaryValue* result_dict; EXPECT_TRUE(result_value_.GetAsDictionary(&result_dict)); std::string id_in_dict; @@ -271,10 +282,67 @@ EXPECT_EQ(result_refresh_token_, test_data_storage_.GetSuccessRefreshToken()); } +// Tests the various exit codes for success / failure. +class CredentialProviderSigninDialogWinDialogExitCodeTest + : public CredentialProviderSigninDialogWinDialogTest, + public ::testing::WithParamInterface<int> {}; + +IN_PROC_BROWSER_TEST_P(CredentialProviderSigninDialogWinDialogExitCodeTest, + SigninResultWithExitCode) { + ShowSigninDialog(); + WaitForDialogToLoad(); + base::Value signin_result = test_data_storage_.MakeValidSignInResponseValue(); + + int expected_error_code = GetParam(); + bool should_succeed = + expected_error_code == (int)credential_provider::kUiecSuccess; + signin_result.SetKey(credential_provider::kKeyExitCode, + base::Value(expected_error_code)); + + SendSigninCompleteMessage(signin_result); + EXPECT_TRUE(signin_complete_called_); + EXPECT_TRUE(result_value_.is_dict()); + EXPECT_EQ(exit_code_, expected_error_code); + const base::Value* exit_code_value = result_value_.FindKeyOfType( + credential_provider::kKeyExitCode, base::Value::Type::INTEGER); + EXPECT_NE(exit_code_value, nullptr); + EXPECT_EQ(exit_code_value->GetInt(), expected_error_code); + + if (should_succeed) { + EXPECT_GT(result_value_.DictSize(), 1u); + + std::string id_in_dict = + result_value_.FindKeyOfType("id", base::Value::Type::STRING) + ->GetString(); + std::string email_in_dict = + result_value_.FindKeyOfType("email", base::Value::Type::STRING) + ->GetString(); + std::string password_in_dict = + result_value_.FindKeyOfType("password", base::Value::Type::STRING) + ->GetString(); + + EXPECT_EQ(id_in_dict, test_data_storage_.GetSuccessId()); + EXPECT_EQ(email_in_dict, test_data_storage_.GetSuccessEmail()); + EXPECT_EQ(password_in_dict, test_data_storage_.GetSuccessPassword()); + EXPECT_EQ(result_access_token_, test_data_storage_.GetSuccessAccessToken()); + EXPECT_EQ(result_refresh_token_, + test_data_storage_.GetSuccessRefreshToken()); + } else { + EXPECT_EQ(result_value_.DictSize(), 1u); + EXPECT_TRUE(result_access_token_.empty()); + EXPECT_TRUE(result_refresh_token_.empty()); + } +} + +INSTANTIATE_TEST_CASE_P( + , + CredentialProviderSigninDialogWinDialogExitCodeTest, + ::testing::Range(0, static_cast<int>(credential_provider::kUiecCount))); + /////////////////////////////////////////////////////////////////////////////// -// CredentialProviderSigninDialogWinIntegrationTest is used for testing the -// integration of the dialog into Chrome, This test mainly verifies correct -// start up state if we provide the --gcpw-signin switch. +// CredentialProviderSigninDialogWinIntegrationTest is used for testing +// the integration of the dialog into Chrome, This test mainly verifies +// correct start up state if we provide the --gcpw-signin switch. class CredentialProviderSigninDialogWinIntegrationTest : public CredentialProviderSigninDialogWinBaseTest {
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_base_view.cc b/chrome/browser/ui/views/autofill/autofill_popup_base_view.cc index 18bb9c9..5202012 100644 --- a/chrome/browser/ui/views/autofill/autofill_popup_base_view.cc +++ b/chrome/browser/ui/views/autofill/autofill_popup_base_view.cc
@@ -13,7 +13,7 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" -#include "chrome/grit/generated_resources.h" +#include "components/strings/grit/components_strings.h" #include "ui/accessibility/platform/ax_platform_node.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/ui_features.h"
diff --git a/chrome/browser/ui/views/autofill/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/save_card_offer_bubble_views.cc index 3a20e78c..0b5eca4 100644 --- a/chrome/browser/ui/views/autofill/save_card_offer_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/save_card_offer_bubble_views.cc
@@ -291,7 +291,7 @@ // Set up expiration date label. auto expiration_date_label = std::make_unique<views::Label>( - l10n_util::GetStringUTF16(IDS_AUTOFILL_FIELD_LABEL_EXPIRATION_DATE), + l10n_util::GetStringUTF16(IDS_SETTINGS_CREDIT_CARD_EXPIRATION_DATE), CONTEXT_BODY_TEXT_LARGE, ChromeTextStyle::STYLE_SECONDARY); expiration_date_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
diff --git a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc index 7a6a35d..a5797485 100644 --- a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc +++ b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
@@ -308,7 +308,7 @@ constexpr int kInputFieldHeight = 28; EditorField tmp_month{ autofill::CREDIT_CARD_EXP_MONTH, - l10n_util::GetStringUTF16(IDS_AUTOFILL_FIELD_LABEL_EXPIRATION_MONTH), + l10n_util::GetStringUTF16(IDS_SETTINGS_CREDIT_CARD_EXPIRATION_MONTH), EditorField::LengthHint::HINT_SHORT, /*required=*/true, EditorField::ControlType::COMBOBOX}; std::unique_ptr<ValidatingCombobox> month_combobox = @@ -320,7 +320,7 @@ EditorField tmp_year{ autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, - l10n_util::GetStringUTF16(IDS_AUTOFILL_FIELD_LABEL_EXPIRATION_YEAR), + l10n_util::GetStringUTF16(IDS_SETTINGS_CREDIT_CARD_EXPIRATION_YEAR), EditorField::LengthHint::HINT_SHORT, /*required=*/true, EditorField::ControlType::COMBOBOX}; std::unique_ptr<ValidatingCombobox> year_combobox = @@ -367,17 +367,17 @@ bool is_server_card = IsEditingServerCard(); return std::vector<EditorField>{ {autofill::CREDIT_CARD_NUMBER, - l10n_util::GetStringUTF16(IDS_AUTOFILL_FIELD_LABEL_CREDIT_CARD_NUMBER), + l10n_util::GetStringUTF16(IDS_SETTINGS_CREDIT_CARD_NUMBER), EditorField::LengthHint::HINT_SHORT, /*required=*/true, is_server_card ? EditorField::ControlType::READONLY_LABEL : EditorField::ControlType::TEXTFIELD_NUMBER}, {autofill::CREDIT_CARD_NAME_FULL, - l10n_util::GetStringUTF16(IDS_AUTOFILL_FIELD_LABEL_NAME_ON_CARD), + l10n_util::GetStringUTF16(IDS_SETTINGS_NAME_ON_CREDIT_CARD), EditorField::LengthHint::HINT_SHORT, /*required=*/true, is_server_card ? EditorField::ControlType::READONLY_LABEL : EditorField::ControlType::TEXTFIELD}, {autofill::CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, - l10n_util::GetStringUTF16(IDS_AUTOFILL_FIELD_LABEL_EXPIRATION_DATE), + l10n_util::GetStringUTF16(IDS_SETTINGS_CREDIT_CARD_EXPIRATION_DATE), EditorField::LengthHint::HINT_SHORT, /*required=*/true, EditorField::ControlType::CUSTOMFIELD}, {kBillingAddressType,
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc index ad150b2..c80280b48 100644 --- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc +++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -85,8 +85,9 @@ void LocalPrinterHandlerDefault::GetDefaultPrinter(DefaultPrinterCallback cb) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + // USER_VISIBLE because the result is displayed in the print preview dialog. base::PostTaskWithTraitsAndReplyWithResult( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, + FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, base::BindOnce(&GetDefaultPrinterAsync), std::move(cb)); } @@ -96,8 +97,9 @@ VLOG(1) << "Enumerate printers start"; DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + // USER_VISIBLE because the result is displayed in the print preview dialog. base::PostTaskWithTraitsAndReplyWithResult( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, + FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, base::BindOnce(&EnumeratePrintersAsync), base::BindOnce(&printing::ConvertPrinterListForCallback, callback, std::move(done_callback))); @@ -108,8 +110,9 @@ GetCapabilityCallback cb) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + // USER_VISIBLE because the result is displayed in the print preview dialog. base::PostTaskWithTraitsAndReplyWithResult( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, + FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, base::BindOnce(&FetchCapabilitiesAsync, device_name), std::move(cb)); }
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index 47c3bcf..cbbd2e8 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -1101,7 +1101,8 @@ const std::string& callback_id, base::Value settings_info) { // Check that |settings_info| is valid. - if (settings_info.FindKeyOfType(printing::kSettingCapabilities, + if (settings_info.is_dict() && + settings_info.FindKeyOfType(printing::kSettingCapabilities, base::Value::Type::DICTIONARY)) { VLOG(1) << "Get printer capabilities finished"; ResolveJavascriptCallback(base::Value(callback_id), settings_info); @@ -1116,8 +1117,11 @@ const std::string& printer_name, base::Value destination_info) { base::Value response(base::Value::Type::DICTIONARY); - base::Value* caps_value = destination_info.FindKeyOfType( - printing::kSettingCapabilities, base::Value::Type::DICTIONARY); + base::Value* caps_value = + destination_info.is_dict() + ? destination_info.FindKeyOfType(printing::kSettingCapabilities, + base::Value::Type::DICTIONARY) + : nullptr; response.SetKey("printerId", base::Value(printer_name)); response.SetKey("success", base::Value(!!caps_value)); response.SetKey("capabilities",
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc index d4e81298..a490247 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -75,12 +75,57 @@ #if defined(OS_WIN) +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" #include "chrome/credential_provider/common/gcp_strings.h" #endif // defined(OS_WIN) namespace { +#if defined(OS_WIN) + +// Returns a list of valid signin domains that were passed in +// |email_domains_parameter| as an argument to the gcpw signin dialog. + +std::vector<std::string> GetEmailDomainsFromParameter( + const std::string& email_domains_parameter) { + return base::SplitString(base::ToLowerASCII(email_domains_parameter), + credential_provider::kEmailDomainsSeparator, + base::WhitespaceHandling::TRIM_WHITESPACE, + base::SplitResult::SPLIT_WANT_NONEMPTY); +} + +// Validates that the |signin_gaia_id| that the user signed in with matches +// the |gaia_id_parameter| passed to the gcpw signin dialog. Also ensures +// that the |signin_email| is in a domain listed in |email_domains_parameter|. +// Returns kUiecSuccess on success. +// Returns the appropriate error code on failure. +credential_provider::UiExitCodes ValidateSigninEmail( + const std::string& gaia_id_parameter, + const std::string& email_domains_parameter, + const std::string& signin_email, + const std::string& signin_gaia_id) { + if (!gaia_id_parameter.empty() && + !base::LowerCaseEqualsASCII(gaia_id_parameter, signin_gaia_id)) { + return credential_provider::kUiecEMailMissmatch; + } + + if (email_domains_parameter.empty()) + return credential_provider::kUiecSuccess; + + std::vector<std::string> all_email_domains = + GetEmailDomainsFromParameter(email_domains_parameter); + std::string email_domain = gaia::ExtractDomainName(signin_email); + + return std::find(all_email_domains.begin(), all_email_domains.end(), + email_domain) != all_email_domains.end() + ? credential_provider::kUiecSuccess + : credential_provider::kUiecInvalidEmailDomain; +} + +#endif + void LogHistogramValue(signin_metrics::AccessPointAction action) { UMA_HISTOGRAM_ENUMERATION("Signin.AllAccessPointActions", action, signin_metrics::HISTOGRAM_MAX); @@ -465,11 +510,14 @@ #if defined(OS_WIN) if (reason == signin_metrics::Reason::REASON_FETCH_LST_ONLY) { - std::string email_domain; + std::string email_domains; if (net::GetValueForKeyInQuery( - current_url, credential_provider::kEmailDomainSigninPromoParameter, - &email_domain)) { - params.SetString("emailDomain", email_domain); + current_url, credential_provider::kEmailDomainsSigninPromoParameter, + &email_domains)) { + std::vector<std::string> all_email_domains = + GetEmailDomainsFromParameter(email_domains); + if (all_email_domains.size() == 1) + params.SetString("emailDomain", all_email_domains[0]); } } #endif @@ -624,16 +672,47 @@ const FinishCompleteLoginParams& params, Profile* profile, Profile::CreateStatus status) { + signin_metrics::Reason reason = + signin::GetSigninReasonForPromoURL(params.url); + + std::string default_email; + net::GetValueForKeyInQuery(params.url, "email", &default_email); + std::string validate_email; + net::GetValueForKeyInQuery(params.url, "validateEmail", &validate_email); + +#if defined(OS_WIN) + if (reason == signin_metrics::Reason::REASON_FETCH_LST_ONLY) { + std::string validate_gaia_id; + net::GetValueForKeyInQuery( + params.url, credential_provider::kValidateGaiaIdSigninPromoParameter, + &validate_gaia_id); + std::string email_domains; + net::GetValueForKeyInQuery( + params.url, credential_provider::kEmailDomainsSigninPromoParameter, + &email_domains); + credential_provider::UiExitCodes exit_code = ValidateSigninEmail( + validate_gaia_id, email_domains, params.email, params.gaia_id); + if (exit_code != credential_provider::kUiecSuccess) { + if (params.handler) { + params.handler->HandleLoginError(base::NumberToString((int)exit_code), + base::UTF8ToUTF16(params.email)); + } + return; + } else { + // Validation has already been done for GCPW, so clear the validate + // argument so it doesn't validate again. GCPW validation allows the + // signin email to not match the email given in the request url if the + // gaia id of the signin email matches the one given in the request url. + validate_email.clear(); + } + } +#endif + // When doing a SAML sign in, this email check may result in a false // positive. This happens when the user types one email address in the // gaia sign in page, but signs in to a different account in the SAML sign in // page. - std::string default_email; - std::string validate_email; - if (net::GetValueForKeyInQuery(params.url, "email", &default_email) && - net::GetValueForKeyInQuery(params.url, "validateEmail", - &validate_email) && - validate_email == "1" && !default_email.empty()) { + if (validate_email == "1" && !default_email.empty()) { if (!gaia::AreEmailsSame(params.email, default_email)) { if (params.handler) { params.handler->HandleLoginError( @@ -647,8 +726,6 @@ signin_metrics::AccessPoint access_point = signin::GetAccessPointForPromoURL(params.url); - signin_metrics::Reason reason = - signin::GetSigninReasonForPromoURL(params.url); LogHistogramValue(signin_metrics::HISTOGRAM_ACCEPTED); bool switch_to_advanced = params.choose_what_to_sync && @@ -725,7 +802,17 @@ signin::GetSigninReasonForPromoURL(current_url); if (reason == signin_metrics::Reason::REASON_FETCH_LST_ONLY) { - SendLSTFetchResultsMessage(base::Value(base::Value::Type::DICTIONARY)); + base::Value error_value(base::Value::Type::DICTIONARY); +#if defined(OS_WIN) + // If the message is an integer error code, send it as part + // of the result. + int exit_code = 0; + if (base::StringToInt(error_msg, &exit_code)) { + error_value.SetKey(credential_provider::kKeyExitCode, + base::Value(exit_code)); + } +#endif + SendLSTFetchResultsMessage(error_value); return; } SyncStarterCallback(OneClickSigninSyncStarter::SYNC_SETUP_FAILURE);
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc b/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc index 211025df..8ca74e8e 100644 --- a/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc +++ b/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc
@@ -14,10 +14,8 @@ #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" -#include "chrome/browser/signin/fake_signin_manager_builder.h" -#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" -#include "chrome/browser/signin/signin_manager_factory.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/browser/signin/signin_promo.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" @@ -43,7 +41,6 @@ #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/signin/core/browser/account_consistency_method.h" -#include "components/signin/core/browser/fake_profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_manager.h" #include "components/signin/core/browser/signin_pref_names.h" #include "content/public/browser/render_frame_host.h" @@ -67,6 +64,7 @@ #include "net/test/embedded_test_server/http_response.h" #include "net/url_request/test_url_fetcher_factory.h" #include "net/url_request/url_request_status.h" +#include "services/identity/public/cpp/identity_test_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" @@ -278,9 +276,9 @@ if (username.empty()) return; - SigninManagerBase* signin_manager = - SigninManagerFactory::GetForProfile(browser()->profile()); - signin_manager->SetAuthenticatedAccountInfo(username, username); + auto* identity_manager = + IdentityManagerFactory::GetForProfile(browser()->profile()); + identity::MakePrimaryAccountAvailable(identity_manager, username); } void InlineLoginUIBrowserTest::EnableSigninAllowed(bool enable) { @@ -451,10 +449,8 @@ // Replace the signin manager and token service with fakes. Do this ahead of // creating the browser so that a bunch of classes don't register as // observers and end up needing to unregister when the fake is substituted. - SigninManagerFactory::GetInstance()->SetTestingFactory( - context, base::BindRepeating(&BuildFakeSigninManagerForTesting)); - ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory( - context, base::BindRepeating(&BuildFakeProfileOAuth2TokenService)); + IdentityTestEnvironmentProfileAdaptor:: + SetIdentityTestEnvironmentFactoriesOnBrowserContext(context); } void SetUp() override { @@ -488,13 +484,12 @@ // Grab references to the fake signin manager and token service. Profile* profile = browser()->profile(); - signin_manager_ = static_cast<FakeSigninManagerForTesting*>( - SigninManagerFactory::GetInstance()->GetForProfile(profile)); - ASSERT_TRUE(signin_manager_); - token_service_ = static_cast<FakeProfileOAuth2TokenService*>( - ProfileOAuth2TokenServiceFactory::GetInstance()->GetForProfile( - profile)); - ASSERT_TRUE(token_service_); + identity_test_env_profile_adaptor_ = + std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile); + } + + void TearDownOnMainThread() override { + identity_test_env_profile_adaptor_.reset(); } void SimulateStartAuthCodeForOAuth2TokenExchangeSuccess( @@ -512,8 +507,6 @@ consumer->OnClientOAuthSuccess(result); } - FakeSigninManagerForTesting* signin_manager() { return signin_manager_; } - FakeProfileOAuth2TokenService* token_service() { return token_service_; } scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory() { return content::BrowserContext::GetDefaultStoragePartition( browser()->profile()) @@ -521,12 +514,17 @@ } protected: + identity::IdentityManager* identity_manager() { + return identity_test_env_profile_adaptor_->identity_test_env() + ->identity_manager(); + } + std::unique_ptr<net::test_server::ControllableHttpResponse> oauth2_token_exchange_success_; private: - FakeSigninManagerForTesting* signin_manager_; - FakeProfileOAuth2TokenService* token_service_; + std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> + identity_test_env_profile_adaptor_; std::unique_ptr< base::CallbackList<void(content::BrowserContext*)>::Subscription> will_create_browser_context_services_subscription_; @@ -693,7 +691,7 @@ // Test signin helper does not create sync starter when reauthenticating. IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, ReauthCallsUpdateCredentials) { - ASSERT_EQ(0ul, token_service()->GetAccounts().size()); + ASSERT_EQ(0ul, identity_manager()->GetAccountsWithRefreshTokens().size()); // See Source enum in components/signin/core/browser/signin_metrics.h for // possible values of access_point=, reason=. @@ -708,7 +706,7 @@ false, // confirm untrusted signin false); SimulateOnClientOAuthSuccess(&helper, "refresh_token"); - ASSERT_EQ(1ul, token_service()->GetAccounts().size()); + ASSERT_EQ(1ul, identity_manager()->GetAccountsWithRefreshTokens().size()); base::RunLoop().RunUntilIdle(); } @@ -716,7 +714,7 @@ // to profile. IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, AddAccountsCallsUpdateCredentials) { - ASSERT_EQ(0ul, token_service()->GetAccounts().size()); + ASSERT_EQ(0ul, identity_manager()->GetAccountsWithRefreshTokens().size()); // See Source enum in components/signin/core/browser/signin_metrics.h for // possible values of access_point=, reason=. @@ -731,7 +729,7 @@ false, // confirm untrusted signin false); SimulateOnClientOAuthSuccess(&helper, "refresh_token"); - ASSERT_EQ(1ul, token_service()->GetAccounts().size()); + ASSERT_EQ(1ul, identity_manager()->GetAccountsWithRefreshTokens().size()); base::RunLoop().RunUntilIdle(); }
diff --git a/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc b/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc index 88885a3d..00536266 100644 --- a/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc +++ b/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
@@ -15,7 +15,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/account_tracker_service_factory.h" +#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/supervised_user/child_accounts/child_account_service.h" #include "chrome/browser/supervised_user/supervised_user_service.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" @@ -23,12 +23,12 @@ #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h" #include "chrome/browser/supervised_user/supervised_user_url_filter.h" #include "chrome/common/channel_info.h" -#include "components/signin/core/browser/account_tracker_service.h" #include "components/supervised_user_error_page/supervised_user_error_page.h" #include "components/url_formatter/url_fixer.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_ui.h" +#include "services/identity/public/cpp/identity_manager.h" using content::BrowserThread; @@ -216,11 +216,12 @@ FilteringBehaviorToString( filter->GetDefaultFilteringBehavior())); - AccountTrackerService* account_tracker = - AccountTrackerServiceFactory::GetForProfile(profile); - // |account_tracker| is null in incognito and guest profiles. - if (account_tracker) { - for (const auto& account: account_tracker->GetAccounts()) { + identity::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile); + // |identity_manager| is null in incognito and guest profiles. + if (identity_manager) { + for (const auto& account : + identity_manager->GetAccountsWithRefreshTokens()) { base::ListValue* section_user = AddSection(section_list.get(), "User Information for " + account.full_name); AddSectionEntry(section_user, "Account id", account.account_id);
diff --git a/chrome/browser/unified_consent/chrome_unified_consent_service_client.cc b/chrome/browser/unified_consent/chrome_unified_consent_service_client.cc index 2ca20c3..e04a760a 100644 --- a/chrome/browser/unified_consent/chrome_unified_consent_service_client.cc +++ b/chrome/browser/unified_consent/chrome_unified_consent_service_client.cc
@@ -5,40 +5,20 @@ #include "chrome/browser/unified_consent/chrome_unified_consent_service_client.h" #include "build/build_config.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" -#include "chrome/browser/metrics/metrics_reporting_state.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/common/pref_names.h" #include "components/contextual_search/buildflags.h" #include "components/contextual_search/core/browser/contextual_search_preference.h" -#include "components/metrics/metrics_pref_names.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/spellcheck/browser/pref_names.h" -#if defined(OS_ANDROID) -#include "chrome/browser/android/metrics/uma_utils.h" -#endif - ChromeUnifiedConsentServiceClient::ChromeUnifiedConsentServiceClient( PrefService* pref_service) : pref_service_(pref_service) { DCHECK(pref_service_); - ObserveServicePrefChange(Service::kAlternateErrorPages, - prefs::kAlternateErrorPagesEnabled, pref_service_); - ObserveServicePrefChange(Service::kMetricsReporting, - metrics::prefs::kMetricsReportingEnabled, - g_browser_process->local_state()); - ObserveServicePrefChange(Service::kNetworkPrediction, - prefs::kNetworkPredictionOptions, pref_service_); - ObserveServicePrefChange(Service::kSafeBrowsing, prefs::kSafeBrowsingEnabled, - pref_service_); ObserveServicePrefChange(Service::kSafeBrowsingExtendedReporting, prefs::kSafeBrowsingScoutReportingEnabled, pref_service_); - ObserveServicePrefChange(Service::kSearchSuggest, - prefs::kSearchSuggestEnabled, pref_service_); ObserveServicePrefChange(Service::kSpellCheck, spellcheck::prefs::kSpellCheckUseSpellingService, pref_service_); @@ -54,30 +34,9 @@ ChromeUnifiedConsentServiceClient::GetServiceState(Service service) { bool enabled; switch (service) { - case Service::kAlternateErrorPages: - enabled = pref_service_->GetBoolean(prefs::kAlternateErrorPagesEnabled); - break; - case Service::kMetricsReporting: - if (!g_browser_process->metrics_service()) - return ServiceState::kNotSupported; - // Uploads are disabled for non-official builds, but UnifiedConsentService - // only cares whether the user has manually disabled metrics reporting. - enabled = g_browser_process->local_state()->GetBoolean( - metrics::prefs::kMetricsReportingEnabled); - break; - case Service::kNetworkPrediction: - enabled = pref_service_->GetInteger(prefs::kNetworkPredictionOptions) == - chrome_browser_net::NETWORK_PREDICTION_DEFAULT; - break; - case Service::kSafeBrowsing: - enabled = pref_service_->GetBoolean(prefs::kSafeBrowsingEnabled); - break; case Service::kSafeBrowsingExtendedReporting: enabled = safe_browsing::IsExtendedReportingEnabled(*pref_service_); break; - case Service::kSearchSuggest: - enabled = pref_service_->GetBoolean(prefs::kSearchSuggestEnabled); - break; case Service::kSpellCheck: enabled = pref_service_->GetBoolean( spellcheck::prefs::kSpellCheckUseSpellingService); @@ -89,6 +48,12 @@ return ServiceState::kNotSupported; #endif break; + case Service::kAlternateErrorPages: + case Service::kMetricsReporting: + case Service::kNetworkPrediction: + case Service::kSafeBrowsing: + case Service::kSearchSuggest: + return ServiceState::kNotSupported; } return enabled ? ServiceState::kEnabled : ServiceState::kDisabled; } @@ -99,37 +64,14 @@ return; switch (service) { - case Service::kAlternateErrorPages: - pref_service_->SetBoolean(prefs::kAlternateErrorPagesEnabled, enabled); - break; - case Service::kMetricsReporting: -#if defined(OS_ANDROID) - // TODO(https://crbug.com/880936): Move inside ChangeMetricsReportingState - chrome::android::SetUsageAndCrashReporting(enabled); -#else - ChangeMetricsReportingState(enabled); -#endif - break; - case Service::kNetworkPrediction: - pref_service_->SetInteger( - prefs::kNetworkPredictionOptions, - enabled ? chrome_browser_net::NETWORK_PREDICTION_DEFAULT - : chrome_browser_net::NETWORK_PREDICTION_NEVER); - break; - case Service::kSafeBrowsing: - pref_service_->SetBoolean(prefs::kSafeBrowsingEnabled, enabled); - break; case Service::kSafeBrowsingExtendedReporting: safe_browsing::SetExtendedReportingPref(pref_service_, enabled); break; - case Service::kSearchSuggest: - pref_service_->SetBoolean(prefs::kSearchSuggestEnabled, enabled); - break; case Service::kSpellCheck: pref_service_->SetBoolean( spellcheck::prefs::kSpellCheckUseSpellingService, enabled); break; - case Service::kContextualSearch: + case Service::kContextualSearch: { #if BUILDFLAG(BUILD_CONTEXTUAL_SEARCH) contextual_search::ContextualSearchPreference* contextual_search_pref = contextual_search::ContextualSearchPreference::GetInstance(); @@ -137,7 +79,16 @@ contextual_search_pref->EnableIfUndecided(pref_service_); else contextual_search_pref->SetPref(pref_service_, false); +#else + NOTREACHED(); #endif break; + } + case Service::kAlternateErrorPages: + case Service::kMetricsReporting: + case Service::kNetworkPrediction: + case Service::kSafeBrowsing: + case Service::kSearchSuggest: + NOTREACHED(); } }
diff --git a/chrome/browser/upgrade_detector/upgrade_detector.cc b/chrome/browser/upgrade_detector/upgrade_detector.cc index 8c433e0..ec63a9e5 100644 --- a/chrome/browser/upgrade_detector/upgrade_detector.cc +++ b/chrome/browser/upgrade_detector/upgrade_detector.cc
@@ -15,6 +15,7 @@ #include "chrome/common/pref_names.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" +#include "ui/base/idle/idle.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/paint_vector_icon.h" @@ -163,21 +164,17 @@ } void UpgradeDetector::CheckIdle() { - // CalculateIdleState expects an interval in seconds. - int idle_time_allowed = - UseTestingIntervals() ? kIdleAmount : kIdleAmount * 60 * 60; - - CalculateIdleState( - idle_time_allowed, - base::Bind(&UpgradeDetector::IdleCallback, base::Unretained(this))); -} - -void UpgradeDetector::IdleCallback(ui::IdleState state) { // Don't proceed while an incognito window is open. The timer will still // keep firing, so this function will get a chance to re-evaluate this. if (chrome::IsIncognitoSessionActive()) return; + // CalculateIdleState expects an interval in seconds. + int idle_time_allowed = + UseTestingIntervals() ? kIdleAmount : kIdleAmount * 60 * 60; + + ui::IdleState state = ui::CalculateIdleState(idle_time_allowed); + switch (state) { case ui::IDLE_STATE_LOCKED: // Computer is locked, auto-restart. @@ -192,10 +189,6 @@ case ui::IDLE_STATE_ACTIVE: case ui::IDLE_STATE_UNKNOWN: break; - default: - NOTREACHED(); // Need to add any new value above (either providing - // automatic restart or show notification to user). - break; } }
diff --git a/chrome/browser/upgrade_detector/upgrade_detector.h b/chrome/browser/upgrade_detector/upgrade_detector.h index f9d009e..e5f1ddd7 100644 --- a/chrome/browser/upgrade_detector/upgrade_detector.h +++ b/chrome/browser/upgrade_detector/upgrade_detector.h
@@ -12,7 +12,6 @@ #include "base/timer/timer.h" #include "chrome/browser/upgrade_detector/upgrade_observer.h" #include "components/prefs/pref_change_registrar.h" -#include "ui/base/idle/idle.h" #include "ui/gfx/image/image.h" class PrefRegistrySimple; @@ -222,12 +221,9 @@ // notified of the change (generally speaking, if an upgrade is available). virtual void OnRelaunchNotificationPeriodPrefChanged() = 0; - // Initiates an Idle check. See IdleCallback below. - void CheckIdle(); - - // The callback for the IdleCheck. Tells us whether Chrome has received any + // Initiates an Idle check. Tells us whether Chrome has received any // input events since the specified time. - void IdleCallback(ui::IdleState state); + void CheckIdle(); // A provider of TimeTicks to the detector and its timers. const base::TickClock* const tick_clock_;
diff --git a/chrome/credential_provider/common/gcp_strings.cc b/chrome/credential_provider/common/gcp_strings.cc index f52b9821..dbab6a2 100644 --- a/chrome/credential_provider/common/gcp_strings.cc +++ b/chrome/credential_provider/common/gcp_strings.cc
@@ -18,6 +18,7 @@ const char kKeySID[] = "sid"; const char kKeyTokenHandle[] = "token_handle"; const char kKeyUsername[] = "user_name"; +const char kKeyExitCode[] = "exit_code"; // Name of registry value that holds user properties. const wchar_t kUserTokenHandle[] = L"th"; @@ -45,9 +46,24 @@ // Chrome is being opened to show the credential provider logon page. This // page is always shown in incognito mode. const char kGcpwSigninSwitch[] = "gcpw-signin"; -const char kEmailDomainSwitch[] = "email-domain"; -const char kEmailDomainSigninPromoParameter[] = "emailDomain"; +// The email to use to prefill the Gaia signin page. +const char kPrefillEmailSwitch[] = "prefill-email"; + +// Comma separated list of valid Gaia signin domains. If email that is signed +// into gaia is not part of these domains no LST will be minted and an error +// will be reported. +const char kEmailDomainsSwitch[] = "email-domains"; + +// Expected gaia-id of user that will be signing into gaia. If the ids do not +// match after signin, no LST will be minted and an error will be reported. +const char kGaiaIdSwitch[] = "gaia-id"; + +// Parameter appended to sign in URL to pass valid signin domains to the inline +// login handler. These domains are separated by ','. +const char kEmailDomainsSigninPromoParameter[] = "emailDomains"; +const char kEmailDomainsSeparator[] = ","; +const char kValidateGaiaIdSigninPromoParameter[] = "validate_gaia_id"; const wchar_t kRunAsCrashpadHandlerEntryPoint[] = L"RunAsCrashpadHandler";
diff --git a/chrome/credential_provider/common/gcp_strings.h b/chrome/credential_provider/common/gcp_strings.h index 9fe6a39..9a26fe3 100644 --- a/chrome/credential_provider/common/gcp_strings.h +++ b/chrome/credential_provider/common/gcp_strings.h
@@ -5,8 +5,39 @@ #ifndef CHROME_CREDENTIAL_PROVIDER_COMMON_GCP_STRINGS_H_ #define CHROME_CREDENTIAL_PROVIDER_COMMON_GCP_STRINGS_H_ +#include <string> +#include <vector> + +#include "base/values.h" + namespace credential_provider { +// The the UI process can exit with the following exit code. +enum UiExitCodes { + // The user completed the sign in successfully. + kUiecSuccess, + + // The sign in was aborted by the user. + kUiecAbort, + + // The sign in timed out. + kUiecTimeout, + + // The process was killed by the GCP. + kUiecKilled, + + // The email is not valid for the given user logging in. + kUiecEMailMissmatch, + + // The email domain is not an accepted domain. + kUiecInvalidEmailDomain, + + // Some signin data was missing. + kUiecMissingSigninData, + + kUiecCount, +}; + // Names of keys returned on json data from UI process. extern const char kKeyEmail[]; extern const char kKeyFullname[]; @@ -19,6 +50,7 @@ extern const char kKeySID[]; extern const char kKeyTokenHandle[]; extern const char kKeyUsername[]; +extern const char kKeyExitCode[]; // Name of registry value that holds user properties. extern const wchar_t kUserTokenHandle[]; @@ -42,10 +74,13 @@ // These are command line switches passed to chrome to start it as a process // used as a logon stub. extern const char kGcpwSigninSwitch[]; -extern const char kEmailDomainSwitch[]; +extern const char kPrefillEmailSwitch[]; +extern const char kEmailDomainsSwitch[]; +extern const char kGaiaIdSwitch[]; -// Parameter appended to sign in URL to pass domain hint to GAIA. -extern const char kEmailDomainSigninPromoParameter[]; +extern const char kEmailDomainsSigninPromoParameter[]; +extern const char kEmailDomainsSeparator[]; +extern const char kValidateGaiaIdSigninPromoParameter[]; // Crashpad related constants extern const wchar_t kRunAsCrashpadHandlerEntryPoint[];
diff --git a/chrome/credential_provider/gaiacp/BUILD.gn b/chrome/credential_provider/gaiacp/BUILD.gn index 02e8b0e7..085f7af8 100644 --- a/chrome/credential_provider/gaiacp/BUILD.gn +++ b/chrome/credential_provider/gaiacp/BUILD.gn
@@ -206,14 +206,12 @@ grdfile_folder = "./" grdfile_name = "gaia_resources" xtb_relative_path = "strings" - grd_files_info = [ - [ - grdfile_folder, - grdfile_name, - xtb_relative_path, - default_embedded_i18_locales - ] - ] + grd_files_info = [ [ + grdfile_folder, + grdfile_name, + xtb_relative_path, + default_embedded_i18_locales, + ] ] output_file_name_base = grdfile_name }
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base.cc b/chrome/credential_provider/gaiacp/gaia_credential_base.cc index c7a383d..ef1c672 100644 --- a/chrome/credential_provider/gaiacp/gaia_credential_base.cc +++ b/chrome/credential_provider/gaiacp/gaia_credential_base.cc
@@ -45,16 +45,22 @@ namespace { -constexpr wchar_t kEmailPatternKey[] = L"ep"; +constexpr wchar_t kEmailDomainsKey[] = L"ed"; -base::string16 GetEmailPattern() { - wchar_t email_pattern[64]; - ULONG length = base::size(email_pattern); - HRESULT hr = GetGlobalFlag(kEmailPatternKey, email_pattern, &length); - if (FAILED(hr)) - email_pattern[0] = 0; - - return base::string16(email_pattern); +base::string16 GetEmailDomains() { + std::vector<wchar_t> email_domains(16); + ULONG length = email_domains.size(); + HRESULT hr = GetGlobalFlag(kEmailDomainsKey, &email_domains[0], &length); + if (FAILED(hr)) { + if (hr == HRESULT_FROM_WIN32(ERROR_MORE_DATA)) { + email_domains.resize(length + 1); + length = email_domains.size(); + hr = GetGlobalFlag(kEmailDomainsKey, &email_domains[0], &length); + if (FAILED(hr)) + email_domains[0] = 0; + } + } + return base::string16(&email_domains[0]); } // Choose a suitable username for the given gaia account. If a username has @@ -112,8 +118,8 @@ } // If the username is longer than 20 characters, truncate. - if (os_username.size() > 20) - os_username.resize(20); + if (os_username.size() > kWindowsUsernameBufferLength - 1) + os_username.resize(kWindowsUsernameBufferLength - 1); // Replace invalid characters. While @ is not strictly invalid according to // MSDN docs, it causes trouble. @@ -152,12 +158,15 @@ // it. LOGFN(INFO) << "exit_code=" << exit_code; - if (exit_code != kUiecSuccess) { - LOGFN(ERROR) << "WaitForProcess hr=" << putHR(hr); + if (exit_code == kUiecAbort) { + LOGFN(ERROR) << "Aborted hr=" << putHR(hr); return E_ABORT; + } else if (exit_code != kUiecSuccess) { + LOGFN(ERROR) << "Error hr=" << putHR(hr); + *status_text = + CGaiaCredentialBase::AllocErrorString(IDS_INVALID_UI_RESPONSE_BASE); + return E_FAIL; } - // TODO(crbug.com/913977): Check for mismatch email pattern error once the - // correct use of email pattern has been handled. *json_result = std::string(&output_buffer[0]); return S_OK; @@ -166,10 +175,41 @@ // This function validates the response from GLS and makes sure it contained // all the fields required to proceed with logon. This does not necessarily // guarantee that the logon will succeed, only that GLS response seems correct. -HRESULT ValidateAndFixResult(base::DictionaryValue* result, BSTR* status_text) { +HRESULT ValidateResult(base::DictionaryValue* result, BSTR* status_text) { DCHECK(result); DCHECK(status_text); + // Check the exit_code to see if any errors were detected by the GLS. + const base::Value* exit_code_value = + result->FindKeyOfType(kKeyExitCode, base::Value::Type::INTEGER); + if (exit_code_value && exit_code_value->GetInt() != kUiecSuccess) { + int exit_code = exit_code_value->GetInt(); + if (exit_code == kUiecEMailMissmatch) { + LOGFN(ERROR) << "Email mismatch"; + *status_text = + CGaiaCredentialBase::AllocErrorString(IDS_EMAIL_MISMATCH_BASE); + return E_FAIL; + } + if (exit_code == kUiecInvalidEmailDomain) { + LOGFN(ERROR) << "Invalid email domain"; + *status_text = + CGaiaCredentialBase::AllocErrorString(IDS_INVALID_EMAIL_DOMAIN_BASE); + return E_FAIL; + } + if (exit_code == kUiecMissingSigninData) { + LOGFN(ERROR) << "Missing sign in data"; + *status_text = + CGaiaCredentialBase::AllocErrorString(IDS_INVALID_UI_RESPONSE_BASE); + return E_FAIL; + } + if (exit_code != kUiecSuccess) { + LOGFN(ERROR) << "Unspecified failure"; + *status_text = + CGaiaCredentialBase::AllocErrorString(IDS_INVALID_UI_RESPONSE_BASE); + return E_FAIL; + } + } + // Check that the webui returned all expected values. bool has_error = false; @@ -221,9 +261,6 @@ return E_UNEXPECTED; } - wchar_t username[kWindowsUsernameBufferLength]; - MakeUsernameForAccount(result, username, base::size(username)); - result->SetString(kKeyUsername, username); return S_OK; } @@ -495,23 +532,21 @@ bool CGaiaCredentialBase::AreCredentialsValid() const { return AreWindowsCredentialsAvailable() && - AreWindowsCredentialsValid(password_); + AreWindowsCredentialsValid(password_) == S_OK; } bool CGaiaCredentialBase::AreWindowsCredentialsAvailable() const { return username_.Length() > 0 && password_.Length() > 0; } -bool CGaiaCredentialBase::AreWindowsCredentialsValid(BSTR password) const { +HRESULT CGaiaCredentialBase::AreWindowsCredentialsValid(BSTR password) const { if (username_.Length() == 0 || user_sid_.Length() == 0) - return false; + return S_FALSE; if (::SysStringLen(password) == 0) - return false; + return S_FALSE; OSUserManager* manager = OSUserManager::Get(); - HRESULT checkpassword_hr = - manager->IsWindowsPasswordValid(username_, password); - return checkpassword_hr == S_OK; + return manager->IsWindowsPasswordValid(username_, password); } HRESULT CGaiaCredentialBase::GetStringValueImpl(DWORD field_id, @@ -553,11 +588,11 @@ authentication_results_.reset(); // Don't reset user_sid_ or username_ as those are set for existing gaia - // users in CReauthCredential::SetUserInfo so that the user account matching - // the email can always be found for that credential even when the user - // cancels signin. These two members are reset in CGaiaCredential to allow - // changing between different users when cancelling signin on an unknown - // gaia user. + // users in CReauthCredential::SetGaiaUserInfo so that the user account + // matching the email can always be found for that credential even when the + // user cancels signin. These two members are reset in CGaiaCredential to + // allow changing between different users when cancelling signin on an + // unknown gaia user. TerminateLogonProcess(); if (events_) { @@ -585,10 +620,8 @@ return S_OK; } -HRESULT CGaiaCredentialBase::GetGlsCommandline( - const wchar_t* email, +HRESULT CGaiaCredentialBase::GetBaseGlsCommandline( base::CommandLine* command_line) { - DCHECK(email); DCHECK(command_line); base::FilePath chrome_path = @@ -603,12 +636,7 @@ LOGFN(INFO) << "App exe: " << command_line->GetProgram().value(); - // If an email pattern is specified, pass it to the webui. - base::string16 email_pattern = GetEmailPattern(); - if (email_pattern[0]) - command_line->AppendSwitchNative(kEmailDomainSwitch, email_pattern); - - command_line->AppendSwitchNative(kGcpwSigninSwitch, email); + command_line->AppendSwitch(kGcpwSigninSwitch); // Get the language selected by the LanguageSelector and pass it onto Chrome. // The language selected will depends on the curent thread UI language. @@ -620,11 +648,41 @@ // The gpu process will be running on an alternative desktop since it does not // have access to the winlogon desktop. This mitigation is required merely to - // be able to start Chrome during winlogon. However, In this scenario no gpu + // be able to start Chrome during winlogon. However, in this scenario no gpu // rendering can be done to the screen, so all the gpu features need to be // disabled. (crbug.com/904902) command_line->AppendSwitch("disable-gpu"); + return S_OK; +} + +HRESULT CGaiaCredentialBase::GetGlsCommandline( + const wchar_t* email, + base::CommandLine* command_line) { + DCHECK(email); + HRESULT hr = GetBaseGlsCommandline(command_line); + if (FAILED(hr)) { + LOGFN(ERROR) << "GetBaseGlsCommandline hr=" << putHR(hr); + return hr; + } + + command_line->AppendSwitchNative(kPrefillEmailSwitch, email); + + // If an email pattern is specified, pass it to the GLS. + base::string16 email_domains = GetEmailDomains(); + if (email_domains[0]) + command_line->AppendSwitchNative(kEmailDomainsSwitch, email_domains); + + // If this is an existing user with an SID, try to get its gaia id and pass + // it to the GLS for verification. + if (user_sid_.Length()) { + LOGFN(INFO) << "Existing user sid: " << user_sid_; + base::string16 gaia_id; + if (GetIdFromSid(OLE2CW(user_sid_), &gaia_id) == S_OK) + command_line->AppendSwitchNative(kGaiaIdSwitch, gaia_id); + LOGFN(INFO) << "Existing user gaia id: " << gaia_id; + } + LOGFN(INFO) << "Command line: " << command_line->GetCommandLineString(); return S_OK; } @@ -653,21 +711,32 @@ // using the old password. If it isn't, return S_FALSE to state that the // login is not complete. if (!AreCredentialsValid()) { - if (AreWindowsCredentialsValid(current_windows_password_)) { + HRESULT windows_cred_hr = + AreWindowsCredentialsValid(current_windows_password_); + if (windows_cred_hr == S_OK) { OSUserManager* manager = OSUserManager::Get(); HRESULT changepassword_hr = manager->ChangeUserPassword( username_, current_windows_password_, password_); if (FAILED(changepassword_hr)) { - LOGFN(ERROR) << "ChangeUserPassword hr=" << putHR(changepassword_hr); - return changepassword_hr; + if (changepassword_hr != HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) { + LOGFN(ERROR) << "ChangeUserPassword hr=" << putHR(changepassword_hr); + return changepassword_hr; + } + LOGFN(ERROR) << "Access was denied to ChangeUserPassword."; + password_ = current_windows_password_; } } else { if (events_) { + int message_id = IDS_INVALID_PASSWORD_BASE; + if (windows_cred_hr == HRESULT_FROM_WIN32(ERROR_ACCOUNT_LOCKED_OUT)) { + message_id = IDS_ACCOUNT_LOCKED_BASE; + LOGFN(ERROR) << "Account is locked."; + } + events_->SetFieldState(this, FID_DESCRIPTION, CPFS_DISPLAY_IN_SELECTED_TILE); - events_->SetFieldString( - this, FID_DESCRIPTION, - GetStringResource(IDS_INVALID_PASSWORD_BASE).c_str()); + events_->SetFieldString(this, FID_DESCRIPTION, + GetStringResource(message_id).c_str()); } return S_FALSE; } @@ -1512,12 +1581,17 @@ std::unique_ptr<base::DictionaryValue> dict = base::DictionaryValue::From(std::move(properties)); - HRESULT hr = ValidateAndFixResult(dict.get(), status_text); + HRESULT hr = ValidateResult(dict.get(), status_text); if (FAILED(hr)) { - LOGFN(ERROR) << "ValidateAndFixResult hr=" << putHR(hr); + LOGFN(ERROR) << "ValidateResult hr=" << putHR(hr); return hr; } + wchar_t username[kWindowsUsernameBufferLength]; + MakeUsernameForAccount(dict.get(), username, base::size(username)); + + dict->SetString(kKeyUsername, username); + // From this point the code assume the dictionary |dict| is valid. base::string16 new_username = GetDictString(dict, kKeyUsername); base::string16 password = GetDictString(dict, kKeyPassword); @@ -1535,7 +1609,7 @@ // user_sid_ should have been verified to match or is empty in call to // ValidateOrCreateUser. - DCHECK(user_sid_.Length() <= 0 || user_sid_ == sid); + DCHECK(user_sid_.Length() == 0 || user_sid_ == sid); dict->SetString(kKeyUsername, new_username); dict->SetString(kKeySID, OLE2CA(sid));
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base.h b/chrome/credential_provider/gaiacp/gaia_credential_base.h index 8bc5d36..86b50a6d 100644 --- a/chrome/credential_provider/gaiacp/gaia_credential_base.h +++ b/chrome/credential_provider/gaiacp/gaia_credential_base.h
@@ -99,7 +99,7 @@ } bool AreCredentialsValid() const; bool AreWindowsCredentialsAvailable() const; - bool AreWindowsCredentialsValid(BSTR password) const; + HRESULT AreWindowsCredentialsValid(BSTR password) const; // IGaiaCredential IFACEMETHODIMP Initialize(IGaiaCredentialProvider* provider) override; @@ -124,9 +124,14 @@ virtual void ResetInternalState(); private: - // Gets the command line to run the Gaia Logon stub (GLS). - virtual HRESULT GetGlsCommandline(const wchar_t* email, - base::CommandLine* command_line); + // Gets the base portion of the command line to run the Gaia Logon stub. + // This portion of the command line would only include the executable and + // any executable specific arguments needed to correctly start the GLS. + virtual HRESULT GetBaseGlsCommandline(base::CommandLine* command_line); + // Gets the full command line to run the Gaia Logon stub (GLS). This + // function calls GetBaseGlsCommandline. + HRESULT GetGlsCommandline(const wchar_t* email, + base::CommandLine* command_line); // Display error message to the user. Virtual so that tests can override. virtual void DisplayErrorInUI(LONG status, LONG substatus, BSTR status_text);
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_provider.cc b/chrome/credential_provider/gaiacp/gaia_credential_provider.cc index 3b14782e..ab4d2ed 100644 --- a/chrome/credential_provider/gaiacp/gaia_credential_provider.cc +++ b/chrome/credential_provider/gaiacp/gaia_credential_provider.cc
@@ -273,14 +273,9 @@ LOGFN(INFO) << "Existing gaia user: sid=" << kv.first << " user=" << kv.second << " email=" << email; - CComPtr<IGaiaCredential> cred; hr = CComCreator<CComObject<CReauthCredential>>::CreateInstance( nullptr, IID_IGaiaCredential, (void**)&cred); - if (FAILED(hr)) { - LOG(ERROR) << "Could not create credential hr=" << putHR(hr); - return hr; - } hr = cred->Initialize(this); if (FAILED(hr)) { @@ -290,11 +285,16 @@ CComPtr<IReauthCredential> reauth; reauth = cred; - hr = reauth->SetUserInfo(CComBSTR(W2COLE(kv.first.c_str())), - CComBSTR(W2COLE(kv.second.c_str())), - CComBSTR(email)); + hr = reauth->SetOSUserInfo(CComBSTR(W2COLE(kv.first.c_str())), + CComBSTR(W2COLE(kv.second.c_str()))); if (FAILED(hr)) { - LOG(ERROR) << "reauth->SetUserInfo hr=" << putHR(hr); + LOG(ERROR) << "reauth->SetOSUserInfo hr=" << putHR(hr); + return hr; + } + + hr = reauth->SetEmailForReauth(CComBSTR(email)); + if (FAILED(hr)) { + LOG(ERROR) << "reauth->SetEmailForReauth hr=" << putHR(hr); return hr; }
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_provider_idl.templ b/chrome/credential_provider/gaiacp/gaia_credential_provider_idl.templ index 8ee9b843..b0b0d048 100644 --- a/chrome/credential_provider/gaiacp/gaia_credential_provider_idl.templ +++ b/chrome/credential_provider/gaiacp/gaia_credential_provider_idl.templ
@@ -58,7 +58,8 @@ pointer_default(unique) ] interface IReauthCredential : IUnknown { - HRESULT SetUserInfo([in] BSTR sid, [in] BSTR username, [in] BSTR email); + HRESULT SetEmailForReauth([in] BSTR email); + HRESULT SetOSUserInfo([in] BSTR sid, [in] BSTR username); }; [
diff --git a/chrome/credential_provider/gaiacp/gaia_resources.grd b/chrome/credential_provider/gaiacp/gaia_resources.grd index 82ac9ea..01d2475 100644 --- a/chrome/credential_provider/gaiacp/gaia_resources.grd +++ b/chrome/credential_provider/gaiacp/gaia_resources.grd
@@ -76,6 +76,9 @@ <message name="IDS_EMAIL_MISMATCH" desc=""> Signing in with this Google Account is not allowed. Try a different account. </message> + <message name="IDS_INVALID_EMAIL_DOMAIN" desc=""> + Signing in with Google Accounts on this domain is not allowed. Try a different account. + </message> <message name="IDS_GAIA_ACCOUNT_FULLNAME" desc=""> Google Credential Provider Helper </message> @@ -100,6 +103,12 @@ <message name="IDS_PASSWORD_UPDATE_NEEDED" desc=""> Your password has changed on Google. Please enter your current Windows password in order to sync your Windows Account with your Google Account. </message> + <message name="IDS_ACCOUNT_IN_USE" desc=""> + Another account on this computer has already registered with this Google Account. Please sign in with a different Google Account. + </message> + <message name="IDS_ACCOUNT_LOCKED" desc=""> + Your account has been locked. Please contact a system adminstrator. + </message> </messages> </release> </grit>
diff --git a/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_ACCOUNT_IN_USE.png.sha1 b/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_ACCOUNT_IN_USE.png.sha1 new file mode 100644 index 0000000..e88f0b07 --- /dev/null +++ b/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_ACCOUNT_IN_USE.png.sha1
@@ -0,0 +1 @@ +b15fcd556d3b0f609ecdf9f2ac90eebef5f81bad \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_ACCOUNT_LOCKED.png.sha1 b/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_ACCOUNT_LOCKED.png.sha1 new file mode 100644 index 0000000..1568ba90 --- /dev/null +++ b/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_ACCOUNT_LOCKED.png.sha1
@@ -0,0 +1 @@ +3baad2941a94ecbdd68090310a934e00ee5616a7 \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_INVALID_EMAIL_DOMAIN.png.sha1 b/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_INVALID_EMAIL_DOMAIN.png.sha1 new file mode 100644 index 0000000..9d11175 --- /dev/null +++ b/chrome/credential_provider/gaiacp/gaia_resources_grd/IDS_INVALID_EMAIL_DOMAIN.png.sha1
@@ -0,0 +1 @@ +88d3a339f08b760c49168bbfc77b9f70a580d162 \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/gcp_utils.cc b/chrome/credential_provider/gaiacp/gcp_utils.cc index ed4d062f..76a9ca4b 100644 --- a/chrome/credential_provider/gaiacp/gcp_utils.cc +++ b/chrome/credential_provider/gaiacp/gcp_utils.cc
@@ -41,7 +41,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/win/current_module.h" -#include "base/win/embedded_i18n/language_Selector.h" +#include "base/win/embedded_i18n/language_selector.h" #include "base/win/registry.h" #include "base/win/win_util.h" #include "chrome/common/chrome_version.h"
diff --git a/chrome/credential_provider/gaiacp/gcp_utils.h b/chrome/credential_provider/gaiacp/gcp_utils.h index d008836b..6895ffe 100644 --- a/chrome/credential_provider/gaiacp/gcp_utils.h +++ b/chrome/credential_provider/gaiacp/gcp_utils.h
@@ -40,24 +40,6 @@ // define STATUS_SUCCESS here instead of including ntstatus.h or SubAuth.h #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) -// The the UI process can exit with the following exit code. -enum UiExitCodes { - // The user completed the sign in successfully. - kUiecSuccess, - - // The sign in was aborted by the user. - kUiecAbort, - - // The sign in timed out. - kUiecTimeout, - - // The process was killed by the GCP. - kUiecKilled, - - // The email does not match the required pattern. - kUiecEMailMissmatch, -}; - // A bitfield indicating which standard handles are to be created. using StdHandlesToCreate = uint32_t;
diff --git a/chrome/credential_provider/gaiacp/os_user_manager.cc b/chrome/credential_provider/gaiacp/os_user_manager.cc index bd4f291..05606eca 100644 --- a/chrome/credential_provider/gaiacp/os_user_manager.cc +++ b/chrome/credential_provider/gaiacp/os_user_manager.cc
@@ -351,10 +351,10 @@ // https://support.microsoft.com/en-ca/help/909264/naming-conventions-in-active-directory-for-computers-domains-sites-and HRESULT hr = S_OK; DWORD name_length = username ? length : 0; - wchar_t domain[256]; - DWORD domain_length = base::size(domain); + wchar_t nt_domain[256]; + DWORD domain_length = base::size(nt_domain); SID_NAME_USE use; - if (!::LookupAccountSid(nullptr, psid, username, &name_length, domain, + if (!::LookupAccountSid(nullptr, psid, username, &name_length, nt_domain, &domain_length, &use)) { hr = HRESULT_FROM_WIN32(::GetLastError()); if (hr != HRESULT_FROM_WIN32(ERROR_NONE_MAPPED)) { @@ -366,7 +366,7 @@ } } - LOGFN(INFO) << "username=" << username; + LOGFN(INFO) << "username=" << username << " ntdomain=" << nt_domain; ::LocalFree(psid); return hr; }
diff --git a/chrome/credential_provider/gaiacp/reauth_credential.cc b/chrome/credential_provider/gaiacp/reauth_credential.cc index eaf783e0..9f5b87a 100644 --- a/chrome/credential_provider/gaiacp/reauth_credential.cc +++ b/chrome/credential_provider/gaiacp/reauth_credential.cc
@@ -36,16 +36,19 @@ return err == 0 ? S_OK : E_FAIL; } -IFACEMETHODIMP CReauthCredential::SetUserInfo(BSTR sid, - BSTR username, - BSTR email) { +IFACEMETHODIMP CReauthCredential::SetEmailForReauth(BSTR email) { + DCHECK(email); + + email_for_reauth_ = email; + return S_OK; +} + +HRESULT CReauthCredential::SetOSUserInfo(BSTR sid, BSTR username) { DCHECK(sid); DCHECK(username); - DCHECK(email); set_user_sid(sid); set_username(username); - email_for_reauth_ = email; return S_OK; }
diff --git a/chrome/credential_provider/gaiacp/reauth_credential.h b/chrome/credential_provider/gaiacp/reauth_credential.h index 4fa2b19..204ed7451 100644 --- a/chrome/credential_provider/gaiacp/reauth_credential.h +++ b/chrome/credential_provider/gaiacp/reauth_credential.h
@@ -42,7 +42,8 @@ DECLARE_PROTECT_FINAL_CONSTRUCT() // IReauthCredential - IFACEMETHODIMP SetUserInfo(BSTR sid, BSTR username, BSTR email) override; + IFACEMETHODIMP SetEmailForReauth(BSTR email) override; + IFACEMETHODIMP SetOSUserInfo(BSTR sid, BSTR username) override; CComBSTR email_for_reauth_; };
diff --git a/chrome/credential_provider/gaiacp/reauth_credential_unittests.cc b/chrome/credential_provider/gaiacp/reauth_credential_unittests.cc index 00dd82c0..41e75f17 100644 --- a/chrome/credential_provider/gaiacp/reauth_credential_unittests.cc +++ b/chrome/credential_provider/gaiacp/reauth_credential_unittests.cc
@@ -7,11 +7,14 @@ #include <atlcomcli.h> #include "base/json/json_writer.h" +#include "base/strings/utf_string_conversions.h" #include "base/test/test_reg_util_win.h" #include "chrome/browser/ui/startup/credential_provider_signin_dialog_win_test_data.h" #include "chrome/credential_provider/common/gcp_strings.h" #include "chrome/credential_provider/gaiacp/gaia_credential_provider_i.h" +#include "chrome/credential_provider/gaiacp/gaia_resources.h" #include "chrome/credential_provider/gaiacp/reauth_credential.h" +#include "chrome/credential_provider/gaiacp/reg_utils.h" #include "chrome/credential_provider/test/com_fakes.h" #include "chrome/credential_provider/test/fake_gls_run_helper.h" #include "chrome/credential_provider/test/gcp_fakes.h" @@ -47,7 +50,7 @@ registry_override_.OverrideRegistry(HKEY_LOCAL_MACHINE)); } -TEST_F(GcpReauthCredentialTest, SetUserInfo) { +TEST_F(GcpReauthCredentialTest, SetOSUserInfoAndReauthEmail) { USES_CONVERSION; CredentialProviderSigninDialogTestDataStorage test_data_storage; @@ -55,12 +58,14 @@ ASSERT_EQ(S_OK, CComCreator<CComObject<CReauthCredential>>::CreateInstance( nullptr, IID_IReauthCredential, (void**)&reauth)); ASSERT_TRUE(!!reauth); + CComPtr<IGaiaCredential> gaia_cred; + gaia_cred = reauth; + ASSERT_TRUE(!!gaia_cred); const CComBSTR kSid(W2COLE(L"sid")); - ASSERT_EQ(S_OK, - reauth->SetUserInfo( - kSid, CComBSTR(W2COLE(L"username")), - CComBSTR(A2COLE(test_data_storage.GetSuccessEmail().c_str())))); + ASSERT_EQ(S_OK, reauth->SetOSUserInfo(kSid, CComBSTR(W2COLE(L"username")))); + ASSERT_EQ(S_OK, reauth->SetEmailForReauth(CComBSTR( + A2COLE(test_data_storage.GetSuccessEmail().c_str())))); CComPtr<ICredentialProviderCredential2> cpc2; ASSERT_EQ(S_OK, reauth->QueryInterface(IID_ICredentialProviderCredential2, @@ -72,23 +77,21 @@ ::CoTaskMemFree(sid); } -TEST_F(GcpReauthCredentialTest, UsernameMismatch) { +TEST_F(GcpReauthCredentialTest, UserGaiaIdMismatch) { USES_CONVERSION; CredentialProviderSigninDialogTestDataStorage test_data_storage; - // Create a valid result with the right user name. - std::string signin_result_utf8; - EXPECT_TRUE(base::JSONWriter::Write(test_data_storage.expected_full_result(), - &signin_result_utf8)); - CComBSTR valid_signin_result = A2COLE(signin_result_utf8.c_str()); + std::string unexpected_gaia_id = "unexpected-gaia-id"; - // Create an invalid result with the wrong user name. - base::Value copy_full_result = + // Create an signin result with the unexpected gaia id. + base::Value unexpected_full_result = test_data_storage.expected_full_result().Clone(); - copy_full_result.SetKey(kKeyEmail, base::Value("foo_bar2@gmail.com")); - EXPECT_TRUE(base::JSONWriter::Write(copy_full_result, &signin_result_utf8)); - CComBSTR invalid_signin_result = A2COLE(signin_result_utf8.c_str()); + unexpected_full_result.SetKey(kKeyId, base::Value(unexpected_gaia_id)); + std::string signin_result_utf8; + EXPECT_TRUE( + base::JSONWriter::Write(unexpected_full_result, &signin_result_utf8)); + CComBSTR unexpected_signin_result = A2COLE(signin_result_utf8.c_str()); // Create a fake credential provider. This object must outlive the reauth // credential so it should be declared first. @@ -99,30 +102,43 @@ CComBSTR password = A2COLE(test_data_storage.GetSuccessPassword().c_str()); CComBSTR email = A2COLE(test_data_storage.GetSuccessEmail().c_str()); - // Create a fake user to reauth. + // Create two fake users to reauth. One associated with the valid Gaia id + // and the other associated to the invalid gaia id. OSUserManager* manager = OSUserManager::Get(); - CComBSTR sid; + CComBSTR first_sid; DWORD error; ASSERT_EQ(S_OK, manager->AddUser(username, password, full_name, L"comment", - true, &sid, &error)); + true, &first_sid, &error)); + ASSERT_EQ(S_OK, SetUserProperty( + OLE2CW(first_sid), A2CW(kKeyId), + base::UTF8ToUTF16(test_data_storage.GetSuccessId()))); - // Initialize a reauth credential. + CComBSTR second_sid; + ASSERT_EQ(S_OK, manager->AddUser(L"foo_bar2", L"pwd2", L"name2", L"comment2", + true, &second_sid, &error)); + ASSERT_EQ(S_OK, SetUserProperty(OLE2CW(second_sid), A2CW(kKeyId), + base::UTF8ToUTF16(unexpected_gaia_id))); + + // Initialize a reauth credential for the valid gaia id. CComPtr<IReauthCredential> reauth; ASSERT_EQ(S_OK, CComCreator<CComObject<CReauthCredential>>::CreateInstance( nullptr, IID_IReauthCredential, (void**)&reauth)); - CComPtr<IGaiaCredential> cred; - ASSERT_EQ(S_OK, reauth->QueryInterface(IID_IGaiaCredential, - reinterpret_cast<void**>(&cred))); - ASSERT_EQ(S_OK, cred->Initialize(&provider)); + CComPtr<IGaiaCredential> gaia_cred; + gaia_cred = reauth; + ASSERT_TRUE(!!gaia_cred); - ASSERT_EQ(S_OK, reauth->SetUserInfo(sid, username, email)); + ASSERT_EQ(S_OK, gaia_cred->Initialize(&provider)); - // Finishing reauth with an invalid username should fail. + ASSERT_EQ(S_OK, reauth->SetOSUserInfo(first_sid, username)); + ASSERT_EQ(S_OK, reauth->SetEmailForReauth(email)); + + // Finishing reauth with an unexpected gaia id should fail. CComBSTR error2; - ASSERT_NE(S_OK, cred->OnUserAuthenticated(invalid_signin_result, &error2)); + ASSERT_NE(S_OK, + gaia_cred->OnUserAuthenticated(unexpected_signin_result, &error2)); - ASSERT_EQ(S_OK, cred->Terminate()); + ASSERT_EQ(S_OK, gaia_cred->Terminate()); EXPECT_EQ(0u, provider.username().Length()); EXPECT_EQ(0u, provider.password().Length()); @@ -163,6 +179,10 @@ DWORD error; ASSERT_EQ(S_OK, manager->AddUser(username, password, full_name, L"comment", true, &sid, &error)); + ASSERT_EQ(S_OK, SetUserProperty( + OLE2CW(sid), L"id", + base::UTF8ToUTF16(test_data_storage.GetSuccessId()))); + ASSERT_EQ(S_OK, SetUserProperty(OLE2CW(sid), L"email", OLE2CW(email))); FakeGaiaCredentialProvider provider; @@ -172,15 +192,15 @@ CreateReauthCredentialWithProvider(&provider, &gaia_cred, &cred)); CComPtr<IReauthCredential> reauth; - ASSERT_EQ(S_OK, cred->QueryInterface(IID_IReauthCredential, - reinterpret_cast<void**>(&reauth))); + reauth = cred; + ASSERT_TRUE(!!reauth); - ASSERT_EQ(S_OK, reauth->SetUserInfo(sid, username, email)); + ASSERT_EQ(S_OK, reauth->SetOSUserInfo(sid, username)); + ASSERT_EQ(S_OK, reauth->SetEmailForReauth(email)); CComPtr<testing::ITestCredential> test; ASSERT_EQ(S_OK, cred.QueryInterface(&test)); - ASSERT_EQ(S_OK, - test->SetGlsEmailAddress(test_data_storage.GetSuccessEmail())); + ASSERT_EQ(S_OK, test->SetGlsEmailAddress(std::string())); ASSERT_EQ(S_OK, run_helper()->StartLogonProcessAndWait(cred)); @@ -195,4 +215,56 @@ ASSERT_STREQ(test->GetErrorText(), NULL); } +TEST_F(GcpReauthCredentialRunnableTest, GaiaIdMismatch) { + USES_CONVERSION; + CredentialProviderSigninDialogTestDataStorage test_data_storage; + CComBSTR username = L"foo_bar"; + CComBSTR full_name = A2COLE(test_data_storage.GetSuccessFullName().c_str()); + CComBSTR password = A2COLE(test_data_storage.GetSuccessPassword().c_str()); + CComBSTR email = A2COLE(test_data_storage.GetSuccessEmail().c_str()); + + // Create a fake user to reauth. + OSUserManager* manager = OSUserManager::Get(); + CComBSTR sid; + DWORD error; + ASSERT_EQ(S_OK, manager->AddUser(username, password, full_name, L"comment", + true, &sid, &error)); + ASSERT_EQ(S_OK, SetUserProperty( + OLE2CW(sid), L"id", + base::UTF8ToUTF16(test_data_storage.GetSuccessId()))); + + std::string unexpected_gaia_id = "unexpected-gaia-id"; + FakeGaiaCredentialProvider provider; + + CComPtr<IGaiaCredential> gaia_cred; + CComPtr<ICredentialProviderCredential> cred; + ASSERT_EQ(S_OK, + CreateReauthCredentialWithProvider(&provider, &gaia_cred, &cred)); + + CComPtr<IReauthCredential> reauth; + reauth = cred; + ASSERT_TRUE(!!reauth); + + ASSERT_EQ(S_OK, reauth->SetOSUserInfo(sid, username)); + ASSERT_EQ(S_OK, reauth->SetEmailForReauth(email)); + + CComPtr<testing::ITestCredential> test; + ASSERT_EQ(S_OK, cred.QueryInterface(&test)); + ASSERT_EQ(S_OK, test->SetGlsEmailAddress(std::string())); + ASSERT_EQ(S_OK, test->SetGaiaIdOverride(unexpected_gaia_id)); + + ASSERT_EQ(S_OK, run_helper()->StartLogonProcessAndWait(cred)); + + ASSERT_EQ(S_OK, gaia_cred->Terminate()); + + // Check that values were propagated to the provider. + EXPECT_EQ(0u, provider.username().Length()); + EXPECT_EQ(0u, provider.password().Length()); + EXPECT_EQ(0u, provider.sid().Length()); + EXPECT_EQ(FALSE, provider.credentials_changed_fired()); + + ASSERT_STREQ(test->GetErrorText(), + GetStringResource(IDS_EMAIL_MISMATCH_BASE).c_str()); +} + } // namespace credential_provider
diff --git a/chrome/credential_provider/gaiacp/reg_utils.cc b/chrome/credential_provider/gaiacp/reg_utils.cc index 1a45328..7d99051 100644 --- a/chrome/credential_provider/gaiacp/reg_utils.cc +++ b/chrome/credential_provider/gaiacp/reg_utils.cc
@@ -57,8 +57,11 @@ DWORD type; ULONG local_length = *length - 1; sts = key.ReadValue(name.c_str(), value, &local_length, &type); - if (sts != ERROR_SUCCESS) + if (sts != ERROR_SUCCESS) { + if (sts == ERROR_MORE_DATA) + *length = local_length; return HRESULT_FROM_WIN32(sts); + } if (type != REG_SZ) return HRESULT_FROM_WIN32(ERROR_CANTREAD); @@ -95,6 +98,7 @@ } else { sts = key.WriteValue(name.c_str(), value.c_str()); } + if (sts != ERROR_SUCCESS) return HRESULT_FROM_WIN32(sts); @@ -192,16 +196,44 @@ wchar_t key_name[128]; swprintf_s(key_name, base::size(key_name), L"%ls\\Users", kGcpRootKeyName); + bool result_found = false; base::win::RegistryKeyIterator iter(HKEY_LOCAL_MACHINE, key_name); for (; iter.Valid(); ++iter) { const wchar_t* user_sid = iter.Name(); wchar_t user_id[256]; ULONG user_length = base::size(user_id); - HRESULT hr = - GetUserProperty(user_sid, kUserId, user_id, &user_length); + HRESULT hr = GetUserProperty(user_sid, kUserId, user_id, &user_length); if (SUCCEEDED(hr) && id == user_id) { + // Make sure there are not 2 users with the same SID. + if (result_found) + return HRESULT_FROM_WIN32(ERROR_USER_EXISTS); + wcsncpy_s(sid, length, user_sid, wcslen(user_sid)); - return S_OK; + result_found = true; + } + } + + return result_found ? S_OK : HRESULT_FROM_WIN32(ERROR_NONE_MAPPED); +} + +HRESULT GetIdFromSid(const wchar_t* sid, base::string16* id) { + DCHECK(id); + + wchar_t key_name[128]; + swprintf_s(key_name, base::size(key_name), L"%ls\\Users", kGcpRootKeyName); + + base::win::RegistryKeyIterator iter(HKEY_LOCAL_MACHINE, key_name); + for (; iter.Valid(); ++iter) { + const wchar_t* user_sid = iter.Name(); + + if (wcscmp(sid, user_sid) == 0) { + wchar_t user_id[256]; + ULONG user_length = base::size(user_id); + HRESULT hr = GetUserProperty(user_sid, kUserId, user_id, &user_length); + if (SUCCEEDED(hr)) { + *id = user_id; + return S_OK; + } } } return HRESULT_FROM_WIN32(ERROR_NONE_MAPPED);
diff --git a/chrome/credential_provider/gaiacp/reg_utils.h b/chrome/credential_provider/gaiacp/reg_utils.h index bec2de9..b7662404 100644 --- a/chrome/credential_provider/gaiacp/reg_utils.h +++ b/chrome/credential_provider/gaiacp/reg_utils.h
@@ -61,6 +61,10 @@ // HRESULT_FROM_WIN32(ERROR_NONE_MAPPED). HRESULT GetSidFromId(const base::string16& id, wchar_t* sid, ULONG length); +// Gets the gaia id associated with the given SID. If none exists, returns +// HRESULT_FROM_WIN32(ERROR_NONE_MAPPED). +HRESULT GetIdFromSid(const wchar_t* sid, base::string16* id); + // Returns the root registry key that needs to be verified in unit tests. const wchar_t* GetUsersRootKeyForTesting();
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_iw.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_iw.xtb index 0638304..b6558473 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_iw.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_iw.xtb
@@ -8,7 +8,7 @@ <translation id="4128734677223009352">הכניסה לחשבון Google נכשלה. צריך לוודא שהמחשב מחובר לאינטרנט ולנסות שוב.</translation> <translation id="6613125771987245372">אין הרשאה להיכנס באמצעות חשבון Google הזה. צריך לנסות חשבון אחר.</translation> <translation id="7357241217513796177">צריך לבדוק אם יש חיבור לרשת ואז אפשר לנסות שוב.</translation> -<translation id="7463006580194749499">הוסף משתמש</translation> +<translation id="7463006580194749499">הוספת משתמש</translation> <translation id="8474372283141585908">ספק פרטי הכניסה של Google</translation> <translation id="866458870819756755">לא ניתן היה ליצור משתמש.</translation> <translation id="8860262547644202689">כלי הסיוע של 'ספק פרטי הכניסה של Google'</translation>
diff --git a/chrome/credential_provider/test/fake_gls_run_helper.cc b/chrome/credential_provider/test/fake_gls_run_helper.cc index f672f66..4100ae5 100644 --- a/chrome/credential_provider/test/fake_gls_run_helper.cc +++ b/chrome/credential_provider/test/fake_gls_run_helper.cc
@@ -24,6 +24,7 @@ constexpr char kGlsUserEmail[] = "gls-user-email"; constexpr char kStartGlsEventName[] = "start-gls-event-name"; +constexpr char kOverrideGaiaId[] = "override-gaia-id"; } // namespace switches @@ -61,14 +62,32 @@ std::string gls_email = command_line->GetSwitchValueASCII(switches::kGlsUserEmail); + std::string gaia_id_override = + command_line->GetSwitchValueASCII(switches::kOverrideGaiaId); + std::string expected_gaia_id = + command_line->GetSwitchValueASCII(kGaiaIdSwitch); + std::string expected_email = + command_line->GetSwitchValueASCII(kPrefillEmailSwitch); + if (expected_email.empty()) { + expected_email = gls_email; + } else { + EXPECT_EQ(gls_email, std::string()); + } + constexpr char default_gaia_id[] = "1234567890"; + if (expected_gaia_id.empty()) + expected_gaia_id = default_gaia_id; base::DictionaryValue dict; - dict.SetString(kKeyEmail, gls_email); - dict.SetString(kKeyFullname, "Full Name"); - dict.SetString(kKeyId, "1234567890"); - dict.SetString(kKeyMdmIdToken, "idt-123456"); - dict.SetString(kKeyPassword, "password"); - dict.SetString(kKeyRefreshToken, "rt-123456"); - dict.SetString(kKeyTokenHandle, "th-123456"); + if (!gaia_id_override.empty() && gaia_id_override != expected_gaia_id) { + dict.SetInteger(kKeyExitCode, kUiecEMailMissmatch); + } else { + dict.SetString(kKeyEmail, expected_email); + dict.SetString(kKeyFullname, "Full Name"); + dict.SetString(kKeyId, expected_gaia_id); + dict.SetString(kKeyMdmIdToken, "idt-123456"); + dict.SetString(kKeyPassword, "password"); + dict.SetString(kKeyRefreshToken, "rt-123456"); + dict.SetString(kKeyTokenHandle, "th-123456"); + } std::string json; if (!base::JSONWriter::Write(dict, &json)) @@ -150,14 +169,20 @@ } // static -HRESULT FakeGlsRunHelper::GetMockGlsCommandline( +HRESULT FakeGlsRunHelper::GetFakeGlsCommandline( const std::string& gls_email, + const std::string& gaia_id_override, const base::string16& start_gls_event_name, base::CommandLine* command_line) { *command_line = base::GetMultiProcessTestChildBaseCommandLine(); command_line->AppendSwitchASCII(::switches::kTestChildProcess, "gls_main"); command_line->AppendSwitchASCII(switches::kGlsUserEmail, gls_email); + if (!gaia_id_override.empty()) { + command_line->AppendSwitchASCII(switches::kOverrideGaiaId, + gaia_id_override); + } + if (!start_gls_event_name.empty()) { command_line->AppendSwitchNative(switches::kStartGlsEventName, start_gls_event_name);
diff --git a/chrome/credential_provider/test/fake_gls_run_helper.h b/chrome/credential_provider/test/fake_gls_run_helper.h index 95b94a7..7769054c 100644 --- a/chrome/credential_provider/test/fake_gls_run_helper.h +++ b/chrome/credential_provider/test/fake_gls_run_helper.h
@@ -32,8 +32,9 @@ HRESULT StartLogonProcessAndWait(ICredentialProviderCredential* cred); FakeOSUserManager* fake_os_user_manager() { return &fake_os_user_manager_; } - static HRESULT GetMockGlsCommandline( + static HRESULT GetFakeGlsCommandline( const std::string& gls_email, + const std::string& gaia_id_override, const base::string16& start_gls_event_name, base::CommandLine* command_line);
diff --git a/chrome/credential_provider/test/test_credential.h b/chrome/credential_provider/test/test_credential.h index e2ad058..a0d5168 100644 --- a/chrome/credential_provider/test/test_credential.h +++ b/chrome/credential_provider/test/test_credential.h
@@ -29,6 +29,8 @@ public: virtual HRESULT STDMETHODCALLTYPE SetGlsEmailAddress(const std::string& email) = 0; + virtual HRESULT STDMETHODCALLTYPE + SetGaiaIdOverride(const std::string& gaia_id) = 0; virtual HRESULT STDMETHODCALLTYPE WaitForGls() = 0; virtual HRESULT STDMETHODCALLTYPE SetStartGlsEventName(const base::string16& event_name) = 0; @@ -48,7 +50,7 @@ // A CGaiaCredentialBase is required to call base class functions in the // following ITestCredential implementations: // GetFinalUsername, AreCredentialsValid, AreWindowsCredentialsAvailable, -// AreWindowsCredentialsValid, DisplayErrorInUI, GetGlsCommandline +// AreWindowsCredentialsValid, DisplayErrorInUI, GetBaseGlsCommandline // Also the following IGaiaCredential function needs to be overridden to // notify the completion of the fake GLS that this credential runs: // OnUserAuthenticated. @@ -60,6 +62,7 @@ // ITestCredential. IFACEMETHODIMP SetGlsEmailAddress(const std::string& email) override; + IFACEMETHODIMP SetGaiaIdOverride(const std::string& gaia_id) override; IFACEMETHODIMP WaitForGls() override; IFACEMETHODIMP SetStartGlsEventName( const base::string16& event_name) override; @@ -76,14 +79,14 @@ BSTR* status_text) override; // Overrides to build a dummy command line for testing. - HRESULT GetGlsCommandline(const wchar_t* email, - base::CommandLine* command_line) override; + HRESULT GetBaseGlsCommandline(base::CommandLine* command_line) override; // Override to catch completion of the GLS process on failure and also log // the error message. void DisplayErrorInUI(LONG status, LONG substatus, BSTR status_text) override; std::string gls_email_; + std::string gaia_id_override_; base::WaitableEvent gls_done_; base::win::ScopedHandle process_continue_event_; base::string16 start_gls_event_name_; @@ -106,6 +109,12 @@ } template <class T> +HRESULT CTestCredentialBase<T>::SetGaiaIdOverride(const std::string& gaia_id) { + gaia_id_override_ = gaia_id; + return S_OK; +} + +template <class T> HRESULT CTestCredentialBase<T>::WaitForGls() { return gls_done_.TimedWait(base::TimeDelta::FromSeconds(30)) ? S_OK @@ -143,7 +152,8 @@ template <class T> bool CTestCredentialBase<T>::AreWindowsCredentialsValid() { - return T::AreWindowsCredentialsValid(this->get_current_windows_password()); + return T::AreWindowsCredentialsValid(this->get_current_windows_password()) == + S_OK; } template <class T> @@ -162,11 +172,10 @@ } template <class T> -HRESULT CTestCredentialBase<T>::GetGlsCommandline( - const wchar_t* /*email*/, +HRESULT CTestCredentialBase<T>::GetBaseGlsCommandline( base::CommandLine* command_line) { - HRESULT hr = FakeGlsRunHelper::GetMockGlsCommandline( - gls_email_, start_gls_event_name_, command_line); + HRESULT hr = FakeGlsRunHelper::GetFakeGlsCommandline( + gls_email_, gaia_id_override_, start_gls_event_name_, command_line); // Reset the manual event since GLS will be started upon return. gls_done_.Reset();
diff --git a/chrome/test/base/chrome_render_view_host_test_harness.cc b/chrome/test/base/chrome_render_view_host_test_harness.cc index a2c4cc05a..0e1fcd5 100644 --- a/chrome/test/base/chrome_render_view_host_test_harness.cc +++ b/chrome/test/base/chrome_render_view_host_test_harness.cc
@@ -37,15 +37,17 @@ AccountTrackerServiceFactory::GetForProfile(profile); SigninErrorController* signin_error_controller = SigninErrorControllerFactory::GetForProfile(profile); + ProfileOAuth2TokenService* token_service = + ProfileOAuth2TokenServiceFactory::GetForProfile(profile); #if defined (OS_CHROMEOS) - std::unique_ptr<SigninManagerBase> signin(new SigninManagerBase( - signin_client, account_tracker_service, signin_error_controller)); + std::unique_ptr<SigninManagerBase> signin( + new SigninManagerBase(signin_client, token_service, + account_tracker_service, signin_error_controller)); signin->Initialize(NULL); return std::move(signin); #else std::unique_ptr<FakeSigninManager> manager(new FakeSigninManager( - signin_client, ProfileOAuth2TokenServiceFactory::GetForProfile(profile), - account_tracker_service, + signin_client, token_service, account_tracker_service, GaiaCookieManagerServiceFactory::GetForProfile(profile), signin_error_controller)); manager->Initialize(g_browser_process->local_state());
diff --git a/chrome/test/base/view_event_test_platform_part_chromeos.cc b/chrome/test/base/view_event_test_platform_part_chromeos.cc index 10cc6af9..3794a523 100644 --- a/chrome/test/base/view_event_test_platform_part_chromeos.cc +++ b/chrome/test/base/view_event_test_platform_part_chromeos.cc
@@ -14,6 +14,7 @@ #include "ash/test_shell_delegate.h" #include "base/command_line.h" #include "base/macros.h" +#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_ui_factory.h" #include "chromeos/audio/cras_audio_handler.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/power_policy_controller.h" @@ -69,6 +70,10 @@ init_params.context_factory = context_factory; init_params.context_factory_private = context_factory_private; init_params.gpu_interface_provider = content::CreateGpuInterfaceProvider(); + if (!features::IsUsingWindowService()) { + init_params.keyboard_ui_factory = + std::make_unique<ChromeKeyboardUIFactory>(); + } base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( switches::kHostWindowBounds, "0+0-1280x800"); ash::Shell::CreateInstance(std::move(init_params));
diff --git a/chrome/test/data/password/invisible_password.html b/chrome/test/data/password/invisible_password.html deleted file mode 100644 index dc63f68..0000000 --- a/chrome/test/data/password/invisible_password.html +++ /dev/null
@@ -1,10 +0,0 @@ -<html> -<body> -<!-- Invisible password form. --> -<form id='hidden_password_form' method='POST' action='done.html' style="display:none;"> - <input type='text' id="hidden_password_form_username" placeholder='Username' /> - <input type='password' id="hidden_password_form_password" placeholder='Password' /> - <input type='submit' /> -</form> -</body> -</html>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index 9d952046..c5bb4b8 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -14,7 +14,7 @@ <translation id="5222676887888702881">יציאה</translation> <translation id="5457599981699367932">גלוש כאורח</translation> <translation id="54609108002486618">מנוהל</translation> -<translation id="5832805196449965646">הוסף משתמש</translation> +<translation id="5832805196449965646">הוספת משתמש</translation> <translation id="5895138241574237353">הפעל מחדש</translation> <translation id="7658239707568436148">ביטול</translation> <translation id="9111102763498581341">בטל נעילה</translation>
diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc index 7bde728..6f72fbb 100644 --- a/components/autofill/content/browser/content_autofill_driver.cc +++ b/components/autofill/content/browser/content_autofill_driver.cc
@@ -182,19 +182,6 @@ bounding_box.width(), bounding_box.height()); } -void ContentAutofillDriver::DidInteractWithCreditCardForm() { - // If there is an autofill manager, notify its client about credit card - // inputs on non-secure pages. - if (!autofill_manager_) - return; - if (content::IsOriginSecure( - content::WebContents::FromRenderFrameHost(render_frame_host_) - ->GetVisibleURL())) { - return; - } - autofill_manager_->client()->DidInteractWithNonsecureCreditCardInput(); -} - void ContentAutofillDriver::FormsSeen(const std::vector<FormData>& forms, base::TimeTicks timestamp) { autofill_handler_->OnFormsSeen(forms, timestamp);
diff --git a/components/autofill/content/browser/content_autofill_driver.h b/components/autofill/content/browser/content_autofill_driver.h index 4668b03..edbf490 100644 --- a/components/autofill/content/browser/content_autofill_driver.h +++ b/components/autofill/content/browser/content_autofill_driver.h
@@ -71,7 +71,6 @@ void PopupHidden() override; gfx::RectF TransformBoundingBoxToViewportCoordinates( const gfx::RectF& bounding_box) override; - void DidInteractWithCreditCardForm() override; // mojom::AutofillDriver: void FormsSeen(const std::vector<FormData>& forms,
diff --git a/components/autofill/content/browser/content_autofill_driver_unittest.cc b/components/autofill/content/browser/content_autofill_driver_unittest.cc index fd830d0e..76597c0 100644 --- a/components/autofill/content/browser/content_autofill_driver_unittest.cc +++ b/components/autofill/content/browser/content_autofill_driver_unittest.cc
@@ -21,7 +21,6 @@ #include "components/autofill/core/common/autofill_switches.h" #include "components/autofill/core/common/form_data_predictions.h" #include "content/public/browser/browser_context.h" -#include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/ssl_status.h" #include "content/public/browser/storage_partition.h" @@ -252,7 +251,6 @@ class MockAutofillClient : public TestAutofillClient { public: MOCK_METHOD0(OnFirstUserGestureObserved, void()); - MOCK_METHOD0(DidInteractWithNonsecureCreditCardInput, void()); }; class TestContentAutofillDriver : public ContentAutofillDriver { @@ -458,36 +456,4 @@ EXPECT_EQ(input_value, output_value); } -// Tests that credit card form interactions trigger a call to the client's -// |DidInteractWithNonsecureCreditCardInput| function if the page is HTTP. -TEST_F(ContentAutofillDriverTest, CreditCardFormInteraction) { - GURL url("http://example.test"); - NavigateAndCommit(url); - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - - EXPECT_CALL(*test_autofill_client_, - DidInteractWithNonsecureCreditCardInput()); - driver_->DidInteractWithCreditCardForm(); -} - -// Tests that credit card form interactions do NOT trigger a call to the -// client's |DidInteractWithNonsecureCreditCardInput| function if the page -// is HTTPS. -TEST_F(ContentAutofillDriverTest, CreditCardFormInteractionOnHTTPS) { - EXPECT_CALL(*test_autofill_client_, DidInteractWithNonsecureCreditCardInput()) - .Times(0); - - GURL url("https://example.test"); - NavigateAndCommit(url); - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - - driver_->DidInteractWithCreditCardForm(); -} - } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h index 7ded1f3c..5b3f98d 100644 --- a/components/autofill/core/browser/autofill_client.h +++ b/components/autofill/core/browser/autofill_client.h
@@ -323,10 +323,6 @@ const base::string16& autofilled_value, const base::string16& profile_full_name) = 0; - // Inform the client that the user interacted with a non-secure credit card - // field. - virtual void DidInteractWithNonsecureCreditCardInput() = 0; - // If the context is secure. virtual bool IsContextSecure() = 0;
diff --git a/components/autofill/core/browser/autofill_driver.h b/components/autofill/core/browser/autofill_driver.h index 304d818..82f8a68 100644 --- a/components/autofill/core/browser/autofill_driver.h +++ b/components/autofill/core/browser/autofill_driver.h
@@ -102,10 +102,6 @@ // renderers cannot do this transformation themselves. virtual gfx::RectF TransformBoundingBoxToViewportCoordinates( const gfx::RectF& bounding_box) = 0; - - // Called when the user interacted with a credit card form, so that - // the current page's security state can be updated appropriately. - virtual void DidInteractWithCreditCardForm() = 0; }; } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index d4b3eb3f..fb9a1b34 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -1379,13 +1379,9 @@ DCHECK(form_structure); DCHECK(autofill_field); + form_structure->RationalizePhoneNumbersInSection(autofill_field->section); + FormData result = form; - - if (base::FeatureList::IsEnabled( - features::kAutofillRationalizeFieldTypePredictions)) { - form_structure->RationalizePhoneNumbersInSection(autofill_field->section); - } - DCHECK_EQ(form_structure->field_count(), form.fields.size()); // Only record the types that are filled for an eventual refill if all the @@ -2111,7 +2107,6 @@ if (got_autofillable_form) { if (context->focused_field->Type().group() == CREDIT_CARD) { context->is_filling_credit_card = true; - driver()->DidInteractWithCreditCardForm(); credit_card_form_event_logger_->OnDidInteractWithAutofillableForm( context->form_structure->form_signature(), sync_state_); } else {
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc index 5f43f7f..bb5831e 100644 --- a/components/autofill/core/browser/autofill_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -2990,60 +2990,27 @@ std::vector<FormData> forms_copy; forms_copy.push_back(form_data_copy); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); + FormsSeen(forms); + int page_id = 1; + int response_page_id = 0; + FormData response_data; + FillAutofillFormDataAndSaveResults( + page_id, form_with_multiple_componentized_phone_fields, + *form_with_multiple_componentized_phone_fields.fields.begin(), + MakeFrontendID(std::string(), guid), &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_with_multiple_componentized_phone_fields, - *form_with_multiple_componentized_phone_fields.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify only the first complete set of phone number fields are filled. - ASSERT_EQ(8U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("1"), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - EXPECT_EQ(base::string16(), response_data.fields[5].value); - EXPECT_EQ(base::string16(), response_data.fields[6].value); - EXPECT_EQ(base::string16(), response_data.fields[7].value); - } - - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormsSeen(forms_copy); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_data_copy, *form_data_copy.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Sanity check for old behavior: all phone number fields are filled. - ASSERT_EQ(8U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("1"), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - EXPECT_EQ(ASCIIToUTF16("1"), response_data.fields[5].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[6].value); - EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[7].value); - } + // Verify only the first complete set of phone number fields are filled. + ASSERT_EQ(8U, response_data.fields.size()); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[0].value); + EXPECT_EQ(ASCIIToUTF16("1"), response_data.fields[1].value); + EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); + EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[3].value); + EXPECT_EQ(base::string16(), response_data.fields[4].value); + EXPECT_EQ(base::string16(), response_data.fields[5].value); + EXPECT_EQ(base::string16(), response_data.fields[6].value); + EXPECT_EQ(base::string16(), response_data.fields[7].value); } TEST_F(AutofillManagerTest, FillFirstPhoneNumber_WholeNumbers) { @@ -3079,52 +3046,23 @@ std::vector<FormData> forms_copy; forms_copy.push_back(form_data_copy); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); + FormsSeen(forms); + int page_id = 1; + int response_page_id = 0; + FormData response_data; + FillAutofillFormDataAndSaveResults( + page_id, form_with_multiple_whole_number_fields, + *form_with_multiple_whole_number_fields.fields.begin(), + MakeFrontendID(std::string(), guid), &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_with_multiple_whole_number_fields, - *form_with_multiple_whole_number_fields.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify only the first complete set of phone number fields are filled. - ASSERT_EQ(4U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(base::string16(), response_data.fields[3].value); - } - - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormsSeen(forms_copy); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_data_copy, *form_data_copy.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Sanity check for old behavior: all phone number fields are filled. - ASSERT_EQ(4U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); - } + // Verify only the first complete set of phone number fields are filled. + ASSERT_EQ(4U, response_data.fields.size()); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[0].value); + EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[1].value); + EXPECT_EQ(base::string16(), response_data.fields[2].value); + EXPECT_EQ(base::string16(), response_data.fields[3].value); } TEST_F(AutofillManagerTest, FillFirstPhoneNumber_FillPartsOnceOnly) { @@ -3175,61 +3113,28 @@ std::vector<FormData> forms_copy; forms_copy.push_back(form_data_copy); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); + FormsSeen(forms); + int page_id = 1; + int response_page_id = 0; + FormData response_data; + FillAutofillFormDataAndSaveResults( + page_id, form_with_multiple_componentized_phone_fields, + *form_with_multiple_componentized_phone_fields.fields.begin(), + MakeFrontendID(std::string(), guid), &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_with_multiple_componentized_phone_fields, - *form_with_multiple_componentized_phone_fields.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify only the first complete set of phone number fields are filled, - // and phone components are not filled more than once. - ASSERT_EQ(8U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("1"), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - EXPECT_EQ(base::string16(), response_data.fields[5].value); - EXPECT_EQ(base::string16(), response_data.fields[6].value); - EXPECT_EQ(base::string16(), response_data.fields[7].value); - } - - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormsSeen(forms_copy); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_data_copy, *form_data_copy.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Sanity check for old behavior: all phone number fields are filled. - ASSERT_EQ(8U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("1"), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - EXPECT_EQ(ASCIIToUTF16("1"), response_data.fields[5].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[6].value); - EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[7].value); - } + // Verify only the first complete set of phone number fields are filled, + // and phone components are not filled more than once. + ASSERT_EQ(8U, response_data.fields.size()); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[0].value); + EXPECT_EQ(ASCIIToUTF16("1"), response_data.fields[1].value); + EXPECT_EQ(base::string16(), response_data.fields[2].value); + EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); + EXPECT_EQ(base::string16(), response_data.fields[4].value); + EXPECT_EQ(base::string16(), response_data.fields[5].value); + EXPECT_EQ(base::string16(), response_data.fields[6].value); + EXPECT_EQ(base::string16(), response_data.fields[7].value); } // Verify when extension is misclassified, and there is a complete @@ -3275,55 +3180,24 @@ std::vector<FormData> forms_copy; forms_copy.push_back(form_data_copy); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); + FormsSeen(forms); + int page_id = 1; + int response_page_id = 0; + FormData response_data; + FillAutofillFormDataAndSaveResults( + page_id, form_with_misclassified_extension, + *form_with_misclassified_extension.fields.begin(), + MakeFrontendID(std::string(), guid), &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_with_misclassified_extension, - *form_with_misclassified_extension.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify the misclassified extension field is not filled. - ASSERT_EQ(5U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(base::string16(), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - } - - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormsSeen(forms_copy); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_data_copy, *form_data_copy.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Sanity check for old behavior: the misclassified extension field is - // filled. - ASSERT_EQ(5U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(base::string16(), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[3].value); - EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[4].value); - } + // Verify the misclassified extension field is not filled. + ASSERT_EQ(5U, response_data.fields.size()); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[0].value); + EXPECT_EQ(base::string16(), response_data.fields[1].value); + EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); + EXPECT_EQ(ASCIIToUTF16("5554567"), response_data.fields[3].value); + EXPECT_EQ(base::string16(), response_data.fields[4].value); } // Verify when no complete number can be found, we do best-effort filling. @@ -3363,53 +3237,24 @@ std::vector<FormData> forms_copy; forms_copy.push_back(form_data_copy); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); + FormsSeen(forms); + int page_id = 1; + int response_page_id = 0; + FormData response_data; + FillAutofillFormDataAndSaveResults( + page_id, form_with_no_complete_number, + *form_with_no_complete_number.fields.begin(), + MakeFrontendID(std::string(), guid), &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_with_no_complete_number, - *form_with_no_complete_number.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify when there is no complete phone number fields, we do best effort - // filling. - ASSERT_EQ(4U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(base::string16(), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); - EXPECT_EQ(base::string16(), response_data.fields[3].value); - } - - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_data_copy, *form_data_copy.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Sanity check for old behavior: always do best effort filling. - ASSERT_EQ(4U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(base::string16(), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); - EXPECT_EQ(base::string16(), response_data.fields[3].value); - } + // Verify when there is no complete phone number fields, we do best effort + // filling. + ASSERT_EQ(4U, response_data.fields.size()); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[0].value); + EXPECT_EQ(base::string16(), response_data.fields[1].value); + EXPECT_EQ(ASCIIToUTF16("650"), response_data.fields[2].value); + EXPECT_EQ(base::string16(), response_data.fields[3].value); } // When the focus is on second phone field explicitly, we will fill the @@ -3447,58 +3292,26 @@ std::vector<FormData> forms_copy; forms_copy.push_back(form_data_copy); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); + FormsSeen(forms); + int page_id = 1; + int response_page_id = 0; + FormData response_data; + auto it = form_with_multiple_whole_number_fields.fields.begin(); + // Move it to point to "shipping number". + std::advance(it, 3); + FillAutofillFormDataAndSaveResults( + page_id, form_with_multiple_whole_number_fields, *it, + MakeFrontendID(std::string(), guid), &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - auto it = form_with_multiple_whole_number_fields.fields.begin(); - // Move it to point to "shipping number". - std::advance(it, 3); - FillAutofillFormDataAndSaveResults( - page_id, form_with_multiple_whole_number_fields, *it, - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify when the second phone number field is being focused, we fill - // that field *AND* the first phone number field. - ASSERT_EQ(4U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); - } - - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - auto it = form_data_copy.fields.begin(); - // Move it to point to "shipping number". - std::advance(it, 3); - FillAutofillFormDataAndSaveResults(page_id, form_data_copy, *it, - MakeFrontendID(std::string(), guid), - &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Sanity check for old behavior: fill all the phone fields we can find. - ASSERT_EQ(4U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); - } + // Verify when the second phone number field is being focused, we fill + // that field *AND* the first phone number field. + ASSERT_EQ(4U, response_data.fields.size()); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[0].value); + EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[1].value); + EXPECT_EQ(base::string16(), response_data.fields[2].value); + EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); } TEST_F(AutofillManagerTest, FillFirstPhoneNumber_HiddenFieldShouldNotCount) { @@ -3536,52 +3349,23 @@ std::vector<FormData> forms_copy; forms_copy.push_back(form_data_copy); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); + FormsSeen(forms); + int page_id = 1; + int response_page_id = 0; + FormData response_data; + FillAutofillFormDataAndSaveResults( + page_id, form_with_multiple_whole_number_fields, + *form_with_multiple_whole_number_fields.fields.begin(), + MakeFrontendID(std::string(), guid), &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_with_multiple_whole_number_fields, - *form_with_multiple_whole_number_fields.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify hidden/non-focusable phone field is set to only_fill_when_focused. - ASSERT_EQ(4U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(base::string16(), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); - } - - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - page_id, form_data_copy, *form_data_copy.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Sanity check for old behavior: fill hidden phone fields. - ASSERT_EQ(4U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16(""), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); - } + // Verify hidden/non-focusable phone field is set to only_fill_when_focused. + ASSERT_EQ(4U, response_data.fields.size()); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[0].value); + EXPECT_EQ(base::string16(), response_data.fields[1].value); + EXPECT_EQ(base::string16(), response_data.fields[2].value); + EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); } // The hidden and the presentational fields should be filled, only if their @@ -3702,107 +3486,51 @@ std::vector<FormData> forms_copy; forms_copy.push_back(form_data_copy); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); + FormsSeen(forms); + int page_id = 1; + int response_page_id = 0; + FormData response_data; + // Fill first sections. + FillAutofillFormDataAndSaveResults( + page_id, form_with_multiple_sections, + *form_with_multiple_sections.fields.begin(), + MakeFrontendID(std::string(), guid), &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - // Fill first sections. - FillAutofillFormDataAndSaveResults( - page_id, form_with_multiple_sections, - *form_with_multiple_sections.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); + // Verify first section is filled with rationalization. + ASSERT_EQ(9U, response_data.fields.size()); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[0].value); + EXPECT_EQ(ASCIIToUTF16("123 Apple St."), response_data.fields[1].value); + EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[2].value); + EXPECT_EQ(base::string16(), response_data.fields[3].value); + EXPECT_EQ(base::string16(), response_data.fields[4].value); + EXPECT_EQ(base::string16(), response_data.fields[5].value); + EXPECT_EQ(base::string16(), response_data.fields[6].value); + EXPECT_EQ(base::string16(), response_data.fields[7].value); + EXPECT_EQ(base::string16(), response_data.fields[8].value); - // Verify first section is filled with rationalization. - ASSERT_EQ(9U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("123 Apple St."), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[2].value); - EXPECT_EQ(base::string16(), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - EXPECT_EQ(base::string16(), response_data.fields[5].value); - EXPECT_EQ(base::string16(), response_data.fields[6].value); - EXPECT_EQ(base::string16(), response_data.fields[7].value); - EXPECT_EQ(base::string16(), response_data.fields[8].value); + // Fill second section. + auto it = form_with_multiple_sections.fields.begin(); + std::advance(it, 6); // Pointing to second section. - // Fill second section. - auto it = form_with_multiple_sections.fields.begin(); - std::advance(it, 6); // Pointing to second section. + FillAutofillFormDataAndSaveResults(page_id, form_with_multiple_sections, *it, + MakeFrontendID(std::string(), guid), + &response_page_id, &response_data); + EXPECT_EQ(1, response_page_id); - FillAutofillFormDataAndSaveResults(page_id, form_with_multiple_sections, - *it, MakeFrontendID(std::string(), guid), - &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify second section is filled with rationalization. - ASSERT_EQ(9U, response_data.fields.size()); - EXPECT_EQ(base::string16(), response_data.fields[0].value); - EXPECT_EQ(base::string16(), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(base::string16(), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[5].value); - EXPECT_EQ(ASCIIToUTF16("123 Apple St."), response_data.fields[6].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[7].value); - EXPECT_EQ(base::string16(), response_data.fields[8].value); - } - - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormsSeen(forms); - int page_id = 1; - int response_page_id = 0; - FormData response_data; - // Fill first section. - FillAutofillFormDataAndSaveResults( - page_id, form_data_copy, *form_data_copy.fields.begin(), - MakeFrontendID(std::string(), guid), &response_page_id, &response_data); - - // Verify first section is filled without rationalization. - ASSERT_EQ(9U, response_data.fields.size()); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[0].value); - EXPECT_EQ(ASCIIToUTF16("123 Apple St."), response_data.fields[1].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[2].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - EXPECT_EQ(base::string16(), response_data.fields[5].value); - EXPECT_EQ(base::string16(), response_data.fields[6].value); - EXPECT_EQ(base::string16(), response_data.fields[7].value); - EXPECT_EQ(base::string16(), response_data.fields[8].value); - - // Fill second section. - auto it = form_data_copy.fields.begin(); - std::advance(it, 6); // Pointing to second section. - - FillAutofillFormDataAndSaveResults(page_id, form_data_copy, *it, - MakeFrontendID(std::string(), guid), - &response_page_id, &response_data); - EXPECT_EQ(1, response_page_id); - - // Verify second section is filled without rationalization. - ASSERT_EQ(9U, response_data.fields.size()); - EXPECT_EQ(base::string16(), response_data.fields[0].value); - EXPECT_EQ(base::string16(), response_data.fields[1].value); - EXPECT_EQ(base::string16(), response_data.fields[2].value); - EXPECT_EQ(base::string16(), response_data.fields[3].value); - EXPECT_EQ(base::string16(), response_data.fields[4].value); - EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), - response_data.fields[5].value); - EXPECT_EQ(ASCIIToUTF16("123 Apple St."), response_data.fields[6].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[7].value); - EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[8].value); - } + // Verify second section is filled with rationalization. + ASSERT_EQ(9U, response_data.fields.size()); + EXPECT_EQ(base::string16(), response_data.fields[0].value); + EXPECT_EQ(base::string16(), response_data.fields[1].value); + EXPECT_EQ(base::string16(), response_data.fields[2].value); + EXPECT_EQ(base::string16(), response_data.fields[3].value); + EXPECT_EQ(base::string16(), response_data.fields[4].value); + EXPECT_EQ(ASCIIToUTF16("Charles Hardin Holley"), + response_data.fields[5].value); + EXPECT_EQ(ASCIIToUTF16("123 Apple St."), response_data.fields[6].value); + EXPECT_EQ(ASCIIToUTF16("6505554567"), response_data.fields[7].value); + EXPECT_EQ(base::string16(), response_data.fields[8].value); } // Test that we can still fill a form when a field has been removed from it. @@ -6221,38 +5949,6 @@ } } -// Tests that querying for credit card field suggestions notifies the -// driver of an interaction with a credit card field. -TEST_F(AutofillManagerTest, NotifyDriverOfCreditCardInteraction) { - // Set up a credit card form. - FormData form; - form.name = ASCIIToUTF16("MyForm"); - form.origin = GURL("https://myform.com/form.html"); - form.action = GURL("https://myform.com/submit.html"); - FormFieldData field; - test::CreateTestFormField("Name on Card", "nameoncard", "", "text", &field); - field.should_autocomplete = false; - form.fields.push_back(field); - test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field); - field.should_autocomplete = true; - form.fields.push_back(field); - test::CreateTestFormField("Expiration Month", "ccexpiresmonth", "", "text", - &field); - field.should_autocomplete = false; - form.fields.push_back(field); - form.fields.push_back(field); - std::vector<FormData> forms(1, form); - FormsSeen(forms); - EXPECT_FALSE(autofill_driver_->GetDidInteractWithCreditCardForm()); - - // The driver should always be notified. - for (const FormFieldData& field : form.fields) { - GetAutofillSuggestions(form, field); - EXPECT_TRUE(autofill_driver_->GetDidInteractWithCreditCardForm()); - autofill_driver_->ClearDidInteractWithCreditCardForm(); - } -} - // Tests that a form with server only types is still autofillable if the form // gets updated in cache. TEST_F(AutofillManagerTest, DisplaySuggestionsForUpdatedServerTypedForm) {
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc index 90ee0db..f865dcc 100644 --- a/components/autofill/core/browser/autofill_metrics.cc +++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -57,10 +57,6 @@ NUM_FIELD_TYPE_GROUPS_FOR_METRICS }; -const int KMaxFieldTypeGroupMetric = - (NUM_FIELD_TYPE_GROUPS_FOR_METRICS << 8) | - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS; - std::string PreviousSaveCreditCardPromptUserDecisionToString( int previous_save_credit_card_prompt_user_decision) { DCHECK_LT(previous_save_credit_card_prompt_user_decision, @@ -236,22 +232,6 @@ namespace { -// A version of the UMA_HISTOGRAM_ENUMERATION macro that allows the |name| -// to vary over the program's runtime. -// TODO(crbug.com/850520): Remove this function when the remaining logs use the -// histogram_functions instead. -void LogUMAHistogramEnumeration(const std::string& name, - int sample, - int boundary_value) { - DCHECK_LT(sample, boundary_value); - - // Note: This leaks memory, which is expected behavior. - base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( - name, 1, boundary_value, boundary_value + 1, - base::HistogramBase::kUmaTargetedHistogramFlag); - histogram->Add(sample); -} - const char* GetQualityMetricPredictionSource( AutofillMetrics::QualityMetricPredictionSource source) { switch (source) { @@ -371,18 +351,16 @@ // Only log aggregate true negative; do not log type specific metrics // for UNKNOWN/EMPTY. DVLOG(2) << "TRUE NEGATIVE"; - base::UmaHistogramEnumeration( + base::UmaHistogramSparse( aggregate_histogram, (is_empty ? AutofillMetrics::TRUE_NEGATIVE_EMPTY : (is_ambiguous ? AutofillMetrics::TRUE_NEGATIVE_AMBIGUOUS - : AutofillMetrics::TRUE_NEGATIVE_UNKNOWN)), - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS); + : AutofillMetrics::TRUE_NEGATIVE_UNKNOWN))); if (log_rationalization_metrics) { - base::UmaHistogramEnumeration( + base::UmaHistogramSparse( rationalization_quality_histogram, (is_empty ? AutofillMetrics::RATIONALIZATION_GOOD - : AutofillMetrics::RATIONALIZATION_OK), - AutofillMetrics::NUM_RATIONALIZATION_QUALITY_METRICS); + : AutofillMetrics::RATIONALIZATION_OK)); } return; } @@ -393,20 +371,17 @@ // automatically if there has been no rationalization. if (predicted_type == actual_type) { DVLOG(2) << "TRUE POSITIVE"; - base::UmaHistogramEnumeration( - aggregate_histogram, AutofillMetrics::TRUE_POSITIVE, - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS); - LogUMAHistogramEnumeration( + base::UmaHistogramSparse(aggregate_histogram, + AutofillMetrics::TRUE_POSITIVE); + base::UmaHistogramSparse( type_specific_histogram, - GetFieldTypeGroupMetric(actual_type, AutofillMetrics::TRUE_POSITIVE), - KMaxFieldTypeGroupMetric); + GetFieldTypeGroupMetric(actual_type, AutofillMetrics::TRUE_POSITIVE)); if (log_rationalization_metrics) { bool duplicated_filling = DuplicatedFilling(form, field); - base::UmaHistogramEnumeration( + base::UmaHistogramSparse( rationalization_quality_histogram, (duplicated_filling ? AutofillMetrics::RATIONALIZATION_BAD - : AutofillMetrics::RATIONALIZATION_OK), - AutofillMetrics::NUM_RATIONALIZATION_QUALITY_METRICS); + : AutofillMetrics::RATIONALIZATION_OK)); } return; } @@ -414,24 +389,21 @@ DVLOG(2) << "MISMATCH"; // Here the prediction is wrong, but user has to provide some value still. // This should be a false negative. - base::UmaHistogramEnumeration( - aggregate_histogram, AutofillMetrics::FALSE_NEGATIVE_MISMATCH, - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS); + base::UmaHistogramSparse(aggregate_histogram, + AutofillMetrics::FALSE_NEGATIVE_MISMATCH); // Log FALSE_NEGATIVE_MISMATCH for predicted type if it did predicted // something but actual type is different. if (predicted_type != UNKNOWN_TYPE) - LogUMAHistogramEnumeration( + base::UmaHistogramSparse( type_specific_histogram, GetFieldTypeGroupMetric(predicted_type, - AutofillMetrics::FALSE_NEGATIVE_MISMATCH), - KMaxFieldTypeGroupMetric); + AutofillMetrics::FALSE_NEGATIVE_MISMATCH)); if (log_rationalization_metrics) { // Logging RATIONALIZATION_OK despite of type mismatch here because autofill // would have got it wrong with or without rationalization. Rationalization // here does not help, neither does it do any harm. - base::UmaHistogramEnumeration( - rationalization_quality_histogram, AutofillMetrics::RATIONALIZATION_OK, - AutofillMetrics::NUM_RATIONALIZATION_QUALITY_METRICS); + base::UmaHistogramSparse(rationalization_quality_histogram, + AutofillMetrics::RATIONALIZATION_OK); } return; } @@ -451,25 +423,22 @@ // Only log aggregate true negative; do not log type specific metrics // for UNKNOWN/EMPTY. DVLOG(2) << "TRUE NEGATIVE"; - base::UmaHistogramEnumeration( + base::UmaHistogramSparse( aggregate_histogram, (is_empty ? AutofillMetrics::TRUE_NEGATIVE_EMPTY : (is_ambiguous ? AutofillMetrics::TRUE_NEGATIVE_AMBIGUOUS - : AutofillMetrics::TRUE_NEGATIVE_UNKNOWN)), - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS); + : AutofillMetrics::TRUE_NEGATIVE_UNKNOWN))); return; } DVLOG(2) << "TRUE POSITIVE"; // Log both aggregate and type specific true positive if we correctly // predict that type with which the field was filled. - base::UmaHistogramEnumeration( - aggregate_histogram, AutofillMetrics::TRUE_POSITIVE, - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS); - LogUMAHistogramEnumeration( + base::UmaHistogramSparse(aggregate_histogram, + AutofillMetrics::TRUE_POSITIVE); + base::UmaHistogramSparse( type_specific_histogram, - GetFieldTypeGroupMetric(actual_type, AutofillMetrics::TRUE_POSITIVE), - KMaxFieldTypeGroupMetric); + GetFieldTypeGroupMetric(actual_type, AutofillMetrics::TRUE_POSITIVE)); return; } @@ -483,12 +452,9 @@ (is_empty ? AutofillMetrics::FALSE_POSITIVE_EMPTY : (is_ambiguous ? AutofillMetrics::FALSE_POSITIVE_AMBIGUOUS : AutofillMetrics::FALSE_POSITIVE_UNKNOWN)); - base::UmaHistogramEnumeration( - aggregate_histogram, metric, - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS); - LogUMAHistogramEnumeration(type_specific_histogram, - GetFieldTypeGroupMetric(predicted_type, metric), - KMaxFieldTypeGroupMetric); + base::UmaHistogramSparse(aggregate_histogram, metric); + base::UmaHistogramSparse(type_specific_histogram, + GetFieldTypeGroupMetric(predicted_type, metric)); return; } @@ -497,14 +463,12 @@ // unknown. if (predicted_type == UNKNOWN_TYPE) { DVLOG(2) << "FALSE NEGATIVE"; - base::UmaHistogramEnumeration( - aggregate_histogram, AutofillMetrics::FALSE_NEGATIVE_UNKNOWN, - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS); - LogUMAHistogramEnumeration( + base::UmaHistogramSparse(aggregate_histogram, + AutofillMetrics::FALSE_NEGATIVE_UNKNOWN); + base::UmaHistogramSparse( type_specific_histogram, GetFieldTypeGroupMetric(actual_type, - AutofillMetrics::FALSE_NEGATIVE_UNKNOWN), - KMaxFieldTypeGroupMetric); + AutofillMetrics::FALSE_NEGATIVE_UNKNOWN)); return; } @@ -515,19 +479,16 @@ // This is a mismatch. From the reference of the actual type, this is a false // negative (it was T, but predicted U). From the reference of the prediction, // this is a false positive (predicted it was T, but it was U). - base::UmaHistogramEnumeration( - aggregate_histogram, AutofillMetrics::FALSE_NEGATIVE_MISMATCH, - AutofillMetrics::NUM_FIELD_TYPE_QUALITY_METRICS); - LogUMAHistogramEnumeration( + base::UmaHistogramSparse(aggregate_histogram, + AutofillMetrics::FALSE_NEGATIVE_MISMATCH); + base::UmaHistogramSparse( type_specific_histogram, GetFieldTypeGroupMetric(actual_type, - AutofillMetrics::FALSE_NEGATIVE_MISMATCH), - KMaxFieldTypeGroupMetric); - LogUMAHistogramEnumeration( + AutofillMetrics::FALSE_NEGATIVE_MISMATCH)); + base::UmaHistogramSparse( type_specific_histogram, GetFieldTypeGroupMetric(predicted_type, - AutofillMetrics::FALSE_POSITIVE_MISMATCH), - KMaxFieldTypeGroupMetric); + AutofillMetrics::FALSE_POSITIVE_MISMATCH)); } // Logs field type prediction quality metrics. The primary histogram name is @@ -1646,8 +1607,9 @@ void AutofillMetrics::LogUploadEvent(SubmissionSource submission_source, bool was_sent) { UMA_HISTOGRAM_BOOLEAN("Autofill.UploadEvent", was_sent); - LogUMAHistogramEnumeration( - SubmissionSourceToUploadEventMetric(submission_source), was_sent, 2); + base::UmaHistogramEnumeration( + SubmissionSourceToUploadEventMetric(submission_source), + was_sent ? UploadEventStatus::kSent : UploadEventStatus::kNotSent); } // static
diff --git a/components/autofill/core/browser/autofill_metrics.h b/components/autofill/core/browser/autofill_metrics.h index 60201c86..66ba7b2 100644 --- a/components/autofill/core/browser/autofill_metrics.h +++ b/components/autofill/core/browser/autofill_metrics.h
@@ -833,6 +833,9 @@ NUM_CONVERTED_ADDRESS_CONVERSION_TYPES }; + // To record whether or not the upload event was sent, + enum class UploadEventStatus { kNotSent, kSent, kMaxValue = kSent }; + // Utility to log URL keyed form interaction events. class FormInteractionsUkmLogger { public:
diff --git a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc index 8463dfb..f929c04 100644 --- a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc +++ b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
@@ -90,9 +90,7 @@ } bool AutofillSaveCardInfoBarDelegateMobile::IsGooglePayBrandingEnabled() const { - return upload_ && - base::FeatureList::IsEnabled( - features::kAutofillUpstreamUseGooglePayBrandingOnMobile); + return upload_; } base::string16 AutofillSaveCardInfoBarDelegateMobile::GetDescriptionText()
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index 8e15a71..7d159ac 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -529,9 +529,7 @@ 1 << AutofillMetrics::FORM_CONTAINS_UPI_VPA_HINT; } - if (base::FeatureList::IsEnabled( - features::kAutofillRationalizeFieldTypePredictions)) - RationalizeFieldTypePredictions(); + RationalizeFieldTypePredictions(); AutofillMetrics::LogDetermineHeuristicTypesTiming( base::TimeTicks::Now() - determine_heuristic_types_start_time); @@ -727,14 +725,8 @@ !query_response_has_no_server_data); form->UpdateAutofillCount(); - if (base::FeatureList::IsEnabled( - features::kAutofillRationalizeRepeatedServerPredictions)) - form->RationalizeRepeatedFields(form_interactions_ukm_logger); - - if (base::FeatureList::IsEnabled( - features::kAutofillRationalizeFieldTypePredictions)) - form->RationalizeFieldTypePredictions(); - + form->RationalizeRepeatedFields(form_interactions_ukm_logger); + form->RationalizeFieldTypePredictions(); form->IdentifySections(false); }
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index 0ce878f..6e37ca47 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -33,7 +33,6 @@ using autofill::features::kAutofillEnforceMinRequiredFieldsForHeuristics; using autofill::features::kAutofillEnforceMinRequiredFieldsForQuery; using autofill::features::kAutofillEnforceMinRequiredFieldsForUpload; -using autofill::features::kAutofillRationalizeRepeatedServerPredictions; namespace autofill { @@ -5178,36 +5177,14 @@ std::string response_string; ASSERT_TRUE(response.SerializeToString(&response_string)); - // Test that the expiry month field is rationalized away when enabled. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormStructure::ParseQueryResponse(response_string, forms, nullptr); - ASSERT_EQ(1U, forms.size()); - ASSERT_EQ(4U, forms[0]->field_count()); - EXPECT_EQ(NAME_FULL, forms[0]->field(0)->Type().GetStorableType()); - EXPECT_EQ(ADDRESS_HOME_LINE1, forms[0]->field(1)->Type().GetStorableType()); - EXPECT_EQ(UNKNOWN_TYPE, forms[0]->field(2)->Type().GetStorableType()); - EXPECT_EQ(EMAIL_ADDRESS, forms[0]->field(3)->Type().GetStorableType()); - } - - // Sanity check that the enable/disabled works. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormStructure::ParseQueryResponse(response_string, forms, nullptr); - ASSERT_EQ(1U, forms.size()); - ASSERT_EQ(4U, forms[0]->field_count()); - EXPECT_EQ(NAME_FULL, forms[0]->field(0)->Type().GetStorableType()); - EXPECT_EQ(ADDRESS_HOME_LINE1, forms[0]->field(1)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_MONTH, - forms[0]->field(2)->Type().GetStorableType()); - EXPECT_EQ(EMAIL_ADDRESS, forms[0]->field(3)->Type().GetStorableType()); - } + // Test that the expiry month field is rationalized away. + FormStructure::ParseQueryResponse(response_string, forms, nullptr); + ASSERT_EQ(1U, forms.size()); + ASSERT_EQ(4U, forms[0]->field_count()); + EXPECT_EQ(NAME_FULL, forms[0]->field(0)->Type().GetStorableType()); + EXPECT_EQ(ADDRESS_HOME_LINE1, forms[0]->field(1)->Type().GetStorableType()); + EXPECT_EQ(UNKNOWN_TYPE, forms[0]->field(2)->Type().GetStorableType()); + EXPECT_EQ(EMAIL_ADDRESS, forms[0]->field(3)->Type().GetStorableType()); } TEST_F(FormStructureTest, ParseQueryResponse_RationalizeCCName) { @@ -5240,35 +5217,13 @@ std::string response_string; ASSERT_TRUE(response.SerializeToString(&response_string)); - // Test that the name fields are rationalized when enabled. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormStructure::ParseQueryResponse(response_string, forms, nullptr); - ASSERT_EQ(1U, forms.size()); - ASSERT_EQ(3U, forms[0]->field_count()); - EXPECT_EQ(NAME_FIRST, forms[0]->field(0)->Type().GetStorableType()); - EXPECT_EQ(NAME_LAST, forms[0]->field(1)->Type().GetStorableType()); - EXPECT_EQ(EMAIL_ADDRESS, forms[0]->field(2)->Type().GetStorableType()); - } - - // Sanity check that the enable/disabled works. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormStructure::ParseQueryResponse(response_string, forms, nullptr); - ASSERT_EQ(1U, forms.size()); - ASSERT_EQ(3U, forms[0]->field_count()); - EXPECT_EQ(CREDIT_CARD_NAME_FIRST, - forms[0]->field(0)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_NAME_LAST, - forms[0]->field(1)->Type().GetStorableType()); - EXPECT_EQ(EMAIL_ADDRESS, forms[0]->field(2)->Type().GetStorableType()); - } + // Test that the name fields are rationalized. + FormStructure::ParseQueryResponse(response_string, forms, nullptr); + ASSERT_EQ(1U, forms.size()); + ASSERT_EQ(3U, forms[0]->field_count()); + EXPECT_EQ(NAME_FIRST, forms[0]->field(0)->Type().GetStorableType()); + EXPECT_EQ(NAME_LAST, forms[0]->field(1)->Type().GetStorableType()); + EXPECT_EQ(EMAIL_ADDRESS, forms[0]->field(2)->Type().GetStorableType()); } TEST_F(FormStructureTest, ParseQueryResponse_RationalizeMultiMonth_1) { @@ -5313,44 +5268,18 @@ std::string response_string; ASSERT_TRUE(response.SerializeToString(&response_string)); - // Test that the extra month field is rationalized away when enabled. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormStructure::ParseQueryResponse(response_string, forms, nullptr); - ASSERT_EQ(1U, forms.size()); - ASSERT_EQ(5U, forms[0]->field_count()); - EXPECT_EQ(CREDIT_CARD_NAME_FULL, - forms[0]->field(0)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_NUMBER, forms[0]->field(1)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_MONTH, - forms[0]->field(2)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_2_DIGIT_YEAR, - forms[0]->field(3)->Type().GetStorableType()); - EXPECT_EQ(UNKNOWN_TYPE, forms[0]->field(4)->Type().GetStorableType()); - } - - // Sanity check that the enable/disabled works. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - - FormStructure::ParseQueryResponse(response_string, forms, nullptr); - ASSERT_EQ(1U, forms.size()); - ASSERT_EQ(5U, forms[0]->field_count()); - EXPECT_EQ(CREDIT_CARD_NAME_FULL, - forms[0]->field(0)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_NUMBER, forms[0]->field(1)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_MONTH, - forms[0]->field(2)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_2_DIGIT_YEAR, - forms[0]->field(3)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_MONTH, - forms[0]->field(4)->Type().GetStorableType()); - } + // Test that the extra month field is rationalized away. + FormStructure::ParseQueryResponse(response_string, forms, nullptr); + ASSERT_EQ(1U, forms.size()); + ASSERT_EQ(5U, forms[0]->field_count()); + EXPECT_EQ(CREDIT_CARD_NAME_FULL, + forms[0]->field(0)->Type().GetStorableType()); + EXPECT_EQ(CREDIT_CARD_NUMBER, forms[0]->field(1)->Type().GetStorableType()); + EXPECT_EQ(CREDIT_CARD_EXP_MONTH, + forms[0]->field(2)->Type().GetStorableType()); + EXPECT_EQ(CREDIT_CARD_EXP_2_DIGIT_YEAR, + forms[0]->field(3)->Type().GetStorableType()); + EXPECT_EQ(UNKNOWN_TYPE, forms[0]->field(4)->Type().GetStorableType()); } TEST_F(FormStructureTest, ParseQueryResponse_RationalizeMultiMonth_2) { @@ -5390,38 +5319,16 @@ std::string response_string; ASSERT_TRUE(response.SerializeToString(&response_string)); - // Test that the extra month field is rationalized away when enabled. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - FormStructure::ParseQueryResponse(response_string, forms, nullptr); - ASSERT_EQ(1U, forms.size()); - ASSERT_EQ(4U, forms[0]->field_count()); - EXPECT_EQ(CREDIT_CARD_NAME_FULL, - forms[0]->field(0)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_NUMBER, forms[0]->field(1)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, - forms[0]->field(2)->Type().GetStorableType()); - EXPECT_EQ(UNKNOWN_TYPE, forms[0]->field(3)->Type().GetStorableType()); - } - - // Sanity check that the enable/disabled works. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - autofill::features::kAutofillRationalizeFieldTypePredictions); - FormStructure::ParseQueryResponse(response_string, forms, nullptr); - ASSERT_EQ(1U, forms.size()); - ASSERT_EQ(4U, forms[0]->field_count()); - EXPECT_EQ(CREDIT_CARD_NAME_FULL, - forms[0]->field(0)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_NUMBER, forms[0]->field(1)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, - forms[0]->field(2)->Type().GetStorableType()); - EXPECT_EQ(CREDIT_CARD_EXP_MONTH, - forms[0]->field(3)->Type().GetStorableType()); - } + // Test that the extra month field is rationalized away. + FormStructure::ParseQueryResponse(response_string, forms, nullptr); + ASSERT_EQ(1U, forms.size()); + ASSERT_EQ(4U, forms[0]->field_count()); + EXPECT_EQ(CREDIT_CARD_NAME_FULL, + forms[0]->field(0)->Type().GetStorableType()); + EXPECT_EQ(CREDIT_CARD_NUMBER, forms[0]->field(1)->Type().GetStorableType()); + EXPECT_EQ(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, + forms[0]->field(2)->Type().GetStorableType()); + EXPECT_EQ(UNKNOWN_TYPE, forms[0]->field(3)->Type().GetStorableType()); } TEST_F(FormStructureTest, FindLongestCommonPrefix) { @@ -5520,10 +5427,6 @@ // Tests that a form that has only one address predicted as // ADDRESS_HOME_STREET_ADDRESS is not modified by the address rationalization. TEST_F(FormStructureTest, RationalizeRepeatedFields_OneAddress) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -5570,10 +5473,6 @@ // ADDRESS_HOME_STREET_ADDRESS is modified by the address rationalization to be // ADDRESS_HOME_LINE1 and ADDRESS_HOME_LINE2 instead. TEST_F(FormStructureTest, RationalizeRepreatedFields_TwoAddresses) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -5626,10 +5525,6 @@ // ADDRESS_HOME_STREET_ADDRESS is modified by the address rationalization to be // ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2 and ADDRESS_HOME_LINE3 instead. TEST_F(FormStructureTest, RationalizeRepreatedFields_ThreeAddresses) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -5690,9 +5585,6 @@ // This doesn't happen in real world, bc four address lines mean multiple // sections according to the heuristics. TEST_F(FormStructureTest, RationalizeRepreatedFields_FourAddresses) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -5762,10 +5654,6 @@ // Tests that a form that has only one address in each section predicted as // ADDRESS_HOME_STREET_ADDRESS is not modified by the address rationalization. TEST_F(FormStructureTest, RationalizeRepreatedFields_OneAddressEachSection) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -5839,15 +5727,11 @@ // Tests a form that has multiple sections with multiple number of address // fields predicted as ADDRESS_HOME_STREET_ADDRESS. The last section -// doesn't happen in real world, bc it is in fact two sections according to +// doesn't happen in real world, because it is in fact two sections according to // heuristics, and is only made for testing. TEST_F( FormStructureTest, RationalizeRepreatedFields_SectionTwoAddress_SectionThreeAddress_SectionFourAddresses) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -6001,10 +5885,6 @@ // while the sections are previously determined by the heuristics. TEST_F(FormStructureTest, RationalizeRepreatedFields_MultipleSectionsByHeuristics_OneAddressEach) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -6078,10 +5958,6 @@ TEST_F( FormStructureTest, RationalizeRepreatedFields_MultipleSectionsByHeuristics_TwoAddress_ThreeAddress) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -6171,10 +6047,6 @@ TEST_F(FormStructureTest, RationalizeRepreatedFields_StateCountry_NoRationalization) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -6270,10 +6142,6 @@ } TEST_F(FormStructureTest, RationalizeRepreatedFields_CountryStateNoHeuristics) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -6405,10 +6273,6 @@ TEST_F(FormStructureTest, RationalizeRepreatedFields_StateCountryWithHeuristics) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -6540,10 +6404,6 @@ } TEST_F(FormStructureTest, RationalizeRepreatedFields_FirstFieldRationalized) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field; @@ -6605,10 +6465,6 @@ } TEST_F(FormStructureTest, RationalizeRepreatedFields_LastFieldRationalized) { - base::test::ScopedFeatureList feature_list; - InitFeature(&feature_list, kAutofillRationalizeRepeatedServerPredictions, - true); - FormData form; form.origin = GURL("http://foo.com"); FormFieldData field;
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc index 7fc5e5d..9625f38 100644 --- a/components/autofill/core/browser/test_autofill_client.cc +++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -189,8 +189,6 @@ const base::string16& profile_full_name) { } -void TestAutofillClient::DidInteractWithNonsecureCreditCardInput() {} - bool TestAutofillClient::IsContextSecure() { // Simplified secure context check for tests. return form_origin_.SchemeIs("https");
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h index 0960eca..955c26d 100644 --- a/components/autofill/core/browser/test_autofill_client.h +++ b/components/autofill/core/browser/test_autofill_client.h
@@ -101,7 +101,6 @@ const std::vector<autofill::FormStructure*>& forms) override; void DidFillOrPreviewField(const base::string16& autofilled_value, const base::string16& profile_full_name) override; - void DidInteractWithNonsecureCreditCardInput() override; // By default, TestAutofillClient will report that the context is // secure. This can be adjusted by calling set_form_origin() with an // http:// URL.
diff --git a/components/autofill/core/browser/test_autofill_driver.cc b/components/autofill/core/browser/test_autofill_driver.cc index 4ffa86a..23e869b9 100644 --- a/components/autofill/core/browser/test_autofill_driver.cc +++ b/components/autofill/core/browser/test_autofill_driver.cc
@@ -78,18 +78,6 @@ return bounding_box; } -void TestAutofillDriver::DidInteractWithCreditCardForm() { - did_interact_with_credit_card_form_ = true; -} - -void TestAutofillDriver::ClearDidInteractWithCreditCardForm() { - did_interact_with_credit_card_form_ = false; -} - -bool TestAutofillDriver::GetDidInteractWithCreditCardForm() const { - return did_interact_with_credit_card_form_; -} - void TestAutofillDriver::SetIsIncognito(bool is_incognito) { is_incognito_ = is_incognito; }
diff --git a/components/autofill/core/browser/test_autofill_driver.h b/components/autofill/core/browser/test_autofill_driver.h index dd742de..e04c11d 100644 --- a/components/autofill/core/browser/test_autofill_driver.h +++ b/components/autofill/core/browser/test_autofill_driver.h
@@ -44,15 +44,10 @@ void PopupHidden() override; gfx::RectF TransformBoundingBoxToViewportCoordinates( const gfx::RectF& bounding_box) override; - void DidInteractWithCreditCardForm() override; // Methods unique to TestAutofillDriver that tests can use to specialize // functionality. - void ClearDidInteractWithCreditCardForm(); - - bool GetDidInteractWithCreditCardForm() const; - void SetIsIncognito(bool is_incognito); void SetIsInMainFrame(bool is_in_main_frame); @@ -68,7 +63,6 @@ scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; bool is_incognito_ = false; bool is_in_main_frame_ = false; - bool did_interact_with_credit_card_form_ = false; DISALLOW_COPY_AND_ASSIGN(TestAutofillDriver); };
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 78851c8..7c96752 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -160,16 +160,6 @@ const base::Feature kAutofillPrefilledFields{"AutofillPrefilledFields", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kAutofillRationalizeFieldTypePredictions{ - "AutofillRationalizeFieldTypePredictions", - base::FEATURE_ENABLED_BY_DEFAULT}; - -// Controls whether Autofill should rationalize repeated server type -// predictions. -const base::Feature kAutofillRationalizeRepeatedServerPredictions{ - "AutofillRationalizeRepeatedServerPredictions", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Controls whether or not a group of fields not enclosed in a form can be // considered a form. If this is enabled, unowned fields will only constitute // a form if there are signals to suggest that this might a checkout page. @@ -294,12 +284,6 @@ "AutofillUpstreamEditableExpirationDate", base::FEATURE_DISABLED_BY_DEFAULT}; -// Controls whether the credit card upload bubble shows the Google Pay logo and -// a shorter "Save card?" header message on mobile. -const base::Feature kAutofillUpstreamUseGooglePayBrandingOnMobile{ - "AutofillUpstreamUseGooglePayOnAndroidBranding", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Controls whether to use the API or use the legacy server. const base::Feature kAutofillUseApi{"AutofillUseApi", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index 4cf32f6..6c99a55 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -52,8 +52,6 @@ extern const base::Feature kAutofillNoLocalSaveOnUploadSuccess; extern const base::Feature kAutofillOverrideWithRaterConsensus; extern const base::Feature kAutofillPrefilledFields; -extern const base::Feature kAutofillRationalizeFieldTypePredictions; -extern const base::Feature kAutofillRationalizeRepeatedServerPredictions; extern const base::Feature kAutofillRestrictUnownedFieldsToFormlessCheckout; extern const base::Feature kAutofillRichMetadataQueries; extern const base::Feature kAutofillSaveCardDialogUnlabeledExpirationDate;
diff --git a/components/autofill/ios/browser/autofill_driver_ios.h b/components/autofill/ios/browser/autofill_driver_ios.h index 75ec90b2..2624127f 100644 --- a/components/autofill/ios/browser/autofill_driver_ios.h +++ b/components/autofill/ios/browser/autofill_driver_ios.h
@@ -54,7 +54,6 @@ void RendererShouldClearPreviewedForm() override; void RendererShouldAcceptDataListSuggestion( const base::string16& value) override; - void DidInteractWithCreditCardForm() override; AutofillManager* autofill_manager() { return &autofill_manager_; }
diff --git a/components/autofill/ios/browser/autofill_driver_ios.mm b/components/autofill/ios/browser/autofill_driver_ios.mm index 94da426d..bba0e29e 100644 --- a/components/autofill/ios/browser/autofill_driver_ios.mm +++ b/components/autofill/ios/browser/autofill_driver_ios.mm
@@ -116,12 +116,6 @@ const base::string16& value) { } -void AutofillDriverIOS::DidInteractWithCreditCardForm() { - if (!web::IsOriginSecure(web_state_->GetLastCommittedURL())) { - autofill_manager_.client()->DidInteractWithNonsecureCreditCardInput(); - } -} - void AutofillDriverIOS::RendererShouldClearFilledSection() {} void AutofillDriverIOS::RendererShouldClearPreviewedForm() {
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp index b8fc39c6..1bd264b 100644 --- a/components/autofill_strings.grdp +++ b/components/autofill_strings.grdp
@@ -189,6 +189,18 @@ </message> </if> + <if expr="not is_android"> + <message name="IDS_AUTOFILL_POPUP_ACCESSIBLE_NODE_DATA" desc="The accessibility text to speak when we display an autofill popup."> + Autofill + </message> + <message name="IDS_AUTOFILL_FIELD_LABEL_PHONE" desc="The label of the Phone entry in a settings-like UI to enter a phone number."> + Phone + </message> + <message name="IDS_AUTOFILL_FIELD_LABEL_BILLING_ADDRESS" desc="Title of the field representing the billing address of a credit card."> + Billing Address + </message> + </if> + <!-- Autofill save credit card bubble or infobar prompt --> <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT" desc="Text to show for the Autofill save credit card prompt accept button. The prompt can be either a bubble or an infobar."> Save
diff --git a/components/content_settings/core/browser/content_settings_default_provider.cc b/components/content_settings/core/browser/content_settings_default_provider.cc index c50d1c3..c3829e0 100644 --- a/components/content_settings/core/browser/content_settings_default_provider.cc +++ b/components/content_settings/core/browser/content_settings_default_provider.cc
@@ -66,20 +66,25 @@ public: explicit DefaultRuleIterator(const base::Value* value) { if (value) - value_.reset(value->DeepCopy()); + value_ = value->Clone(); + else + is_done_ = true; } - bool HasNext() const override { return !!value_; } + bool HasNext() const override { return !is_done_; } Rule Next() override { DCHECK(HasNext()); + is_done_ = true; return Rule(ContentSettingsPattern::Wildcard(), - ContentSettingsPattern::Wildcard(), - value_.release()); + ContentSettingsPattern::Wildcard(), std::move(value_)); } private: - std::unique_ptr<base::Value> value_; + bool is_done_ = false; + base::Value value_; + + DISALLOW_COPY_AND_ASSIGN(DefaultRuleIterator); }; } // namespace
diff --git a/components/content_settings/core/browser/content_settings_ephemeral_provider.cc b/components/content_settings/core/browser/content_settings_ephemeral_provider.cc index 7e80a06..b6c889f 100644 --- a/components/content_settings/core/browser/content_settings_ephemeral_provider.cc +++ b/components/content_settings/core/browser/content_settings_ephemeral_provider.cc
@@ -71,7 +71,8 @@ if (in_value) { content_settings_rules_.SetValue( primary_pattern, secondary_pattern, content_type, resource_identifier, - store_last_modified_ ? clock_->Now() : base::Time(), in_value); + store_last_modified_ ? clock_->Now() : base::Time(), + std::move(*in_value)); NotifyObservers(primary_pattern, secondary_pattern, content_type, resource_identifier); } else {
diff --git a/components/content_settings/core/browser/content_settings_ephemeral_provider_unittest.cc b/components/content_settings/core/browser/content_settings_ephemeral_provider_unittest.cc index 33e6b6d..e19f36f 100644 --- a/components/content_settings/core/browser/content_settings_ephemeral_provider_unittest.cc +++ b/components/content_settings/core/browser/content_settings_ephemeral_provider_unittest.cc
@@ -60,7 +60,7 @@ EXPECT_NE(nullptr, rule_iterator); EXPECT_TRUE(rule_iterator->HasNext()); content_settings::Rule rule = rule_iterator->Next(); - EXPECT_EQ(base::Value(CONTENT_SETTING_ALLOW), *rule.value); + EXPECT_EQ(base::Value(CONTENT_SETTING_ALLOW), rule.value); // Overwrite previous value. EXPECT_TRUE(provider()->SetWebsiteSetting( @@ -72,10 +72,10 @@ EXPECT_NE(nullptr, rule_iterator); EXPECT_TRUE(rule_iterator->HasNext()); rule = rule_iterator->Next(); - EXPECT_EQ(base::Value(CONTENT_SETTING_BLOCK), *rule.value); + EXPECT_EQ(base::Value(CONTENT_SETTING_BLOCK), rule.value); } -// Tests if storage of a persistent perference is rejected. +// Tests if storage of a persistent preference is rejected. TEST_F(ContentSettingsEphemeralProviderTest, PersistentTypeRejection) { ContentSettingsPattern site_pattern = ContentSettingsPattern::FromString("https://example.com");
diff --git a/components/content_settings/core/browser/content_settings_global_value_map.cc b/components/content_settings/core/browser/content_settings_global_value_map.cc index bbf50c9..8ef1658 100644 --- a/components/content_settings/core/browser/content_settings_global_value_map.cc +++ b/components/content_settings/core/browser/content_settings_global_value_map.cc
@@ -25,7 +25,7 @@ DCHECK(HasNext()); is_done_ = true; return Rule(ContentSettingsPattern::Wildcard(), - ContentSettingsPattern::Wildcard(), new base::Value(setting_)); + ContentSettingsPattern::Wildcard(), base::Value(setting_)); } private:
diff --git a/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc b/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc index 5a8fff9d..d45ed16 100644 --- a/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc +++ b/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc
@@ -38,10 +38,9 @@ Rule Next() override { DCHECK(HasNext()); - DCHECK(current_rule_->second.value.get()); Rule to_return(current_rule_->first.primary_pattern, current_rule_->first.secondary_pattern, - current_rule_->second.value->DeepCopy()); + current_rule_->second.value.Clone()); ++current_rule_; return to_return; } @@ -117,7 +116,7 @@ OriginIdentifierValueMap::~OriginIdentifierValueMap() {} -base::Value* OriginIdentifierValueMap::GetValue( +const base::Value* OriginIdentifierValueMap::GetValue( const GURL& primary_url, const GURL& secondary_url, ContentSettingsType content_type, @@ -133,7 +132,7 @@ for (const auto& entry : it->second) { if (entry.first.primary_pattern.Matches(primary_url) && entry.first.secondary_pattern.Matches(secondary_url)) { - return entry.second.value.get(); + return &entry.second.value; } } return nullptr; @@ -164,18 +163,16 @@ ContentSettingsType content_type, const ResourceIdentifier& resource_identifier, base::Time last_modified, - base::Value* value) { + base::Value value) { DCHECK(primary_pattern.IsValid()); DCHECK(secondary_pattern.IsValid()); - DCHECK(value); // TODO(raymes): Remove this after we track down the cause of // crbug.com/531548. CHECK_NE(CONTENT_SETTINGS_TYPE_DEFAULT, content_type); EntryMapKey key(content_type, resource_identifier); PatternPair patterns(primary_pattern, secondary_pattern); - // This will create the entry and the linked_ptr if needed. ValueEntry* entry = &entries_[key][patterns]; - entry->value.reset(value); + entry->value = std::move(value); entry->last_modified = last_modified; }
diff --git a/components/content_settings/core/browser/content_settings_origin_identifier_value_map.h b/components/content_settings/core/browser/content_settings_origin_identifier_value_map.h index f27816b6..5c96828 100644 --- a/components/content_settings/core/browser/content_settings_origin_identifier_value_map.h +++ b/components/content_settings/core/browser/content_settings_origin_identifier_value_map.h
@@ -12,7 +12,6 @@ #include <string> #include "base/macros.h" -#include "base/memory/linked_ptr.h" #include "base/time/time.h" #include "components/content_settings/core/common/content_settings.h" @@ -47,7 +46,7 @@ struct ValueEntry { base::Time last_modified; - linked_ptr<base::Value> value; + base::Value value; ValueEntry(); ~ValueEntry(); }; @@ -94,7 +93,7 @@ // Returns a weak pointer to the value for the given |primary_pattern|, // |secondary_pattern|, |content_type|, |resource_identifier| tuple. If // no value is stored for the passed parameter |NULL| is returned. - base::Value* GetValue( + const base::Value* GetValue( const GURL& primary_url, const GURL& secondary_url, ContentSettingsType content_type, @@ -107,15 +106,14 @@ const ResourceIdentifier& resource_identifier) const; // Sets the |value| for the given |primary_pattern|, |secondary_pattern|, - // |content_type|, |resource_identifier| tuple. The method takes the ownership - // of the passed |value|. The caller can also store a |last_modified| date - // for each value. + // |content_type|, |resource_identifier| tuple. The caller can also store a + // |last_modified| date for each value. void SetValue(const ContentSettingsPattern& primary_pattern, const ContentSettingsPattern& secondary_pattern, ContentSettingsType content_type, const ResourceIdentifier& resource_identifier, base::Time last_modified, - base::Value* value); + base::Value value); // Deletes the map entry for the given |primary_pattern|, // |secondary_pattern|, |content_type|, |resource_identifier| tuple.
diff --git a/components/content_settings/core/browser/content_settings_policy_provider.cc b/components/content_settings/core/browser/content_settings_policy_provider.cc index c8f4b63..3e636a9 100644 --- a/components/content_settings/core/browser/content_settings_policy_provider.cc +++ b/components/content_settings/core/browser/content_settings_policy_provider.cc
@@ -273,7 +273,7 @@ value_map->SetValue( pattern_pair.first, secondary_pattern, content_type, ResourceIdentifier(), base::Time(), - new base::Value(kPrefsForManagedContentSettingsMap[i].setting)); + base::Value(kPrefsForManagedContentSettingsMap[i].setting)); } } } @@ -366,7 +366,7 @@ value_map->SetValue(pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, - std::string(), base::Time(), setting.DeepCopy()); + std::string(), base::Time(), setting.Clone()); } } @@ -409,7 +409,7 @@ // Don't set a timestamp for policy settings. value_map_.SetValue(ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(), entry.content_type, - std::string(), base::Time(), new base::Value(setting)); + std::string(), base::Time(), base::Value(setting)); } }
diff --git a/components/content_settings/core/browser/content_settings_pref.cc b/components/content_settings/core/browser/content_settings_pref.cc index 24cc5ce..defa57b5 100644 --- a/components/content_settings/core/browser/content_settings_pref.cc +++ b/components/content_settings/core/browser/content_settings_pref.cc
@@ -133,7 +133,7 @@ if (value) { map_to_modify->SetValue(primary_pattern, secondary_pattern, content_type_, resource_identifier, modified_time, - value->DeepCopy()); + value->Clone()); } else { map_to_modify->DeleteValue( primary_pattern, @@ -283,7 +283,7 @@ // Per resource settings store a single timestamps for all resources. value_map_.SetValue(pattern_pair.first, pattern_pair.second, content_type_, resource_identifier, last_modified, - setting_ptr->DeepCopy()); + setting_ptr->Clone()); } } } @@ -295,7 +295,7 @@ DCHECK(IsValueAllowedForType(value, content_type_)); value_map_.SetValue(pattern_pair.first, pattern_pair.second, content_type_, ResourceIdentifier(), last_modified, - value->DeepCopy()); + value->Clone()); } } }
diff --git a/components/content_settings/core/browser/content_settings_rule.cc b/components/content_settings/core/browser/content_settings_rule.cc index 13d6a0a..2e845ed4 100644 --- a/components/content_settings/core/browser/content_settings_rule.cc +++ b/components/content_settings/core/browser/content_settings_rule.cc
@@ -10,23 +10,22 @@ namespace content_settings { -Rule::Rule() {} +Rule::Rule() = default; -Rule::Rule( - const ContentSettingsPattern& primary_pattern, - const ContentSettingsPattern& secondary_pattern, - base::Value* value) +Rule::Rule(const ContentSettingsPattern& primary_pattern, + const ContentSettingsPattern& secondary_pattern, + base::Value value) : primary_pattern(primary_pattern), secondary_pattern(secondary_pattern), - value(value) { - DCHECK(value); -} + value(std::move(value)) {} -Rule::Rule(const Rule& other) = default; +Rule::Rule(Rule&& other) = default; -Rule::~Rule() {} +Rule& Rule::operator=(Rule&& other) = default; -RuleIterator::~RuleIterator() {} +Rule::~Rule() = default; + +RuleIterator::~RuleIterator() = default; ConcatenationIterator::ConcatenationIterator( std::vector<std::unique_ptr<RuleIterator>> iterators, @@ -41,7 +40,7 @@ } } -ConcatenationIterator::~ConcatenationIterator() {} +ConcatenationIterator::~ConcatenationIterator() = default; bool ConcatenationIterator::HasNext() const { return !iterators_.empty(); @@ -51,7 +50,9 @@ auto current_iterator = iterators_.begin(); DCHECK(current_iterator != iterators_.end()); DCHECK((*current_iterator)->HasNext()); - const Rule& to_return = (*current_iterator)->Next(); + const Rule& next_rule = (*current_iterator)->Next(); + Rule to_return(next_rule.primary_pattern, next_rule.secondary_pattern, + next_rule.value.Clone()); if (!(*current_iterator)->HasNext()) iterators_.erase(current_iterator); return to_return;
diff --git a/components/content_settings/core/browser/content_settings_rule.h b/components/content_settings/core/browser/content_settings_rule.h index 8c24e60c..aae9e3f5 100644 --- a/components/content_settings/core/browser/content_settings_rule.h +++ b/components/content_settings/core/browser/content_settings_rule.h
@@ -11,7 +11,7 @@ #include <vector> #include "base/compiler_specific.h" -#include "base/memory/linked_ptr.h" +#include "base/macros.h" #include "base/synchronization/lock.h" #include "base/values.h" #include "components/content_settings/core/common/content_settings_pattern.h" @@ -20,16 +20,18 @@ struct Rule { Rule(); - // Rule takes ownership of |value|. Rule(const ContentSettingsPattern& primary_pattern, const ContentSettingsPattern& secondary_pattern, - base::Value* value); - Rule(const Rule& other); + base::Value value); + Rule(Rule&& other); + Rule& operator=(Rule&& other); ~Rule(); ContentSettingsPattern primary_pattern; ContentSettingsPattern secondary_pattern; - linked_ptr<base::Value> value; + base::Value value; + + DISALLOW_COPY_AND_ASSIGN(Rule); }; class RuleIterator { @@ -41,8 +43,7 @@ class ConcatenationIterator : public RuleIterator { public: - // ConcatenationIterator takes ownership of the pointers in the |iterators| - // list and |auto_lock|. |auto_lock| can be NULL if no locking is needed. + // |auto_lock| can be null if no locking is needed. ConcatenationIterator(std::vector<std::unique_ptr<RuleIterator>> iterators, base::AutoLock* auto_lock); ~ConcatenationIterator() override;
diff --git a/components/content_settings/core/browser/content_settings_rule_unittest.cc b/components/content_settings/core/browser/content_settings_rule_unittest.cc index ab218fb..fd5a76b5 100644 --- a/components/content_settings/core/browser/content_settings_rule_unittest.cc +++ b/components/content_settings/core/browser/content_settings_rule_unittest.cc
@@ -16,8 +16,7 @@ class ListIterator : public RuleIterator { public: - explicit ListIterator(const std::list<Rule>& rules) - : rules_(rules) {} + explicit ListIterator(std::list<Rule> rules) : rules_(std::move(rules)) {} ~ListIterator() override {} @@ -25,9 +24,7 @@ Rule Next() override { EXPECT_FALSE(rules_.empty()); - // |front()| returns a reference but we're going to discard the object - // referred to; force copying here. - Rule rule = rules_.front(); + Rule rule = std::move(rules_.front()); rules_.pop_front(); return rule; } @@ -41,22 +38,18 @@ TEST(RuleTest, ConcatenationIterator) { std::list<Rule> rules1; rules1.push_back(Rule(ContentSettingsPattern::FromString("a"), - ContentSettingsPattern::Wildcard(), - new base::Value(0))); + ContentSettingsPattern::Wildcard(), base::Value(0))); rules1.push_back(Rule(ContentSettingsPattern::FromString("b"), - ContentSettingsPattern::Wildcard(), - new base::Value(0))); + ContentSettingsPattern::Wildcard(), base::Value(0))); std::list<Rule> rules2; rules2.push_back(Rule(ContentSettingsPattern::FromString("c"), - ContentSettingsPattern::Wildcard(), - new base::Value(0))); + ContentSettingsPattern::Wildcard(), base::Value(0))); rules2.push_back(Rule(ContentSettingsPattern::FromString("d"), - ContentSettingsPattern::Wildcard(), - new base::Value(0))); + ContentSettingsPattern::Wildcard(), base::Value(0))); std::vector<std::unique_ptr<RuleIterator>> iterators; - iterators.push_back(std::unique_ptr<RuleIterator>(new ListIterator(rules1))); - iterators.push_back(std::unique_ptr<RuleIterator>(new ListIterator(rules2))); + iterators.push_back(std::make_unique<ListIterator>(std::move(rules1))); + iterators.push_back(std::make_unique<ListIterator>(std::move(rules2))); ConcatenationIterator concatenation_iterator(std::move(iterators), nullptr); Rule rule;
diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc index 21adee1..7b32f55c 100644 --- a/components/content_settings/core/browser/host_content_settings_map.cc +++ b/components/content_settings/core/browser/host_content_settings_map.cc
@@ -340,7 +340,7 @@ content_settings::Rule rule = rule_iterator->Next(); if (rule.primary_pattern == wildcard && rule.secondary_pattern == wildcard) { - return content_settings::ValueToContentSetting(rule.value.get()); + return content_settings::ValueToContentSetting(&rule.value); } } } @@ -812,9 +812,9 @@ return; while (rule_iterator->HasNext()) { - const content_settings::Rule& rule = rule_iterator->Next(); + content_settings::Rule rule = rule_iterator->Next(); settings->emplace_back( - rule.primary_pattern, rule.secondary_pattern, rule.value->Clone(), + rule.primary_pattern, rule.secondary_pattern, std::move(rule.value), kProviderNamesSourceMap[provider_type].provider_name, incognito); } } @@ -967,7 +967,7 @@ *primary_pattern = rule.primary_pattern; if (secondary_pattern) *secondary_pattern = rule.secondary_pattern; - return base::WrapUnique(rule.value->DeepCopy()); + return rule.value.CreateDeepCopy(); } } }
diff --git a/components/content_settings/core/test/content_settings_mock_provider.cc b/components/content_settings/core/test/content_settings_mock_provider.cc index 67f584a4..2dadbbc 100644 --- a/components/content_settings/core/test/content_settings_mock_provider.cc +++ b/components/content_settings/core/test/content_settings_mock_provider.cc
@@ -30,7 +30,8 @@ return false; if (value) { value_map_.SetValue(requesting_url_pattern, embedding_url_pattern, - content_type, resource_identifier, base::Time(), value); + content_type, resource_identifier, base::Time(), + std::move(*value)); } else { value_map_.DeleteValue(requesting_url_pattern, embedding_url_pattern, content_type, resource_identifier);
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc index 6d63c45..871d9859 100644 --- a/components/password_manager/core/browser/password_manager.cc +++ b/components/password_manager/core/browser/password_manager.cc
@@ -421,7 +421,7 @@ bool is_manually_triggered) { DCHECK(client_->IsSavingAndFillingEnabledForCurrentPage()); - PasswordFormManager* form_manager = GetMatchingPendingManager(form); + PasswordFormManagerInterface* form_manager = GetMatchedManager(driver, form); if (form_manager) { form_manager->SetGenerationElement(generation_element); form_manager->SetGenerationPopupWasShown(true, is_manually_triggered); @@ -430,12 +430,14 @@ // If there is no corresponding PasswordFormManager, we create one. This is // not the common case, and should only happen when there is a bug in our - // ability to detect forms. - auto manager = std::make_unique<PasswordFormManager>( - this, client_, driver->AsWeakPtr(), form, - std::make_unique<FormSaverImpl>(client_->GetPasswordStore()), nullptr); - manager->Init(nullptr); - pending_login_managers_.push_back(std::move(manager)); + // ability to detect forms. No matched |NewPasswordFormManager| is unlikely. + if (!is_new_form_parsing_for_saving_enabled_) { + auto manager = std::make_unique<PasswordFormManager>( + this, client_, driver->AsWeakPtr(), form, + std::make_unique<FormSaverImpl>(client_->GetPasswordStore()), nullptr); + manager->Init(nullptr); + pending_login_managers_.push_back(std::move(manager)); + } } void PasswordManager::ProvisionallySavePassword(
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index affd8da..38f0e77 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -2003,6 +2003,39 @@ } } +TEST_F(PasswordManagerTest, SetGenerationElementAndReasonForForm) { + // Verifies that |SetGenerationElementAndReasonForForm| method works for both + // old and new parsers. + for (bool new_parser : {false, true}) { + SCOPED_TRACE(testing::Message("new_parser = ") << new_parser); + base::test::ScopedFeatureList scoped_feature_list; + if (new_parser) + TurnOnNewParsingForSaving(&scoped_feature_list); + + EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) + .WillRepeatedly(Return(true)); + PasswordForm form(MakeSimpleForm()); + EXPECT_CALL(*store_, GetLogins(PasswordStore::FormDigest(form), _)) + .Times(new_parser ? 2 : 1); + manager()->OnPasswordFormsParsed(&driver_, {form}); + + manager()->SetGenerationElementAndReasonForForm(&driver_, form, + ASCIIToUTF16("psw"), false); + EXPECT_CALL(*store_, AddLogin(_)); + manager()->OnPresaveGeneratedPassword(&driver_, form); + + const PasswordFormManagerInterface* form_manager = nullptr; + if (new_parser) { + ASSERT_EQ(1u, manager()->form_managers().size()); + form_manager = manager()->form_managers().front().get(); + } else { + ASSERT_EQ(1u, manager()->pending_login_managers().size()); + form_manager = manager()->pending_login_managers().front().get(); + } + EXPECT_TRUE(form_manager->HasGeneratedPassword()); + } +} + TEST_F(PasswordManagerTest, PasswordGenerationNoCorrespondingPasswordFormManager) { // Verifies that if there is no corresponding password form manager for the
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto index ea85c1f..d19ea22e 100644 --- a/components/policy/proto/chrome_device_policy.proto +++ b/components/policy/proto/chrome_device_policy.proto
@@ -109,6 +109,9 @@ optional bool report_session_status = 8 [default = true]; optional bool report_os_update_status = 10 [default = false]; optional bool report_running_kiosk_app = 11 [default = false]; + optional bool report_power_status = 12 [default = false]; + optional bool report_storage_status = 13 [default = false]; + optional bool report_board_status = 14 [default = false]; // Frequency to report device status, default to 3 hours. optional int64 device_status_frequency = 9 [default = 10800000];
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index f5635c0..e15221e6 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -791,6 +791,78 @@ CHANNEL_STABLE = 4; } +// Frequently changing data for battery. +message BatterySample { + optional int64 timestamp = 1; + // Battery voltage + optional int64 voltage = 2; + // Battery remaining capacity (mWatt-hours) + optional int64 remaining_capacity = 3; + // Temperature in Celsius. + optional int32 temperature = 4; + // TODO(crbug/916991): We should also include battery charge rate here. +} + +// Status of the single battery +message BatteryInfo { + optional string serial = 1; + optional string manufacturer = 2; + optional string battery_health = 3; + // Design capacity (mWatt-hours) + optional int64 design_capacity = 4; + // Full charge capacity (mWatt-hours) + optional int64 full_charge_capacity = 5; + optional int32 cycle_count = 6; + // Last sampling data. + repeated BatterySample samples = 7; +} + +// Status of the power subsystem +message PowerStatus { + enum PowerSource { + POWER_UNKNOWN = 0; + POWER_AC = 1; + POWER_BATTERY = 2; + } + optional PowerSource power_source = 1; + repeated BatteryInfo batteries = 2; +} + +// Status of the single storage device +message DiskInfo { + optional string serial = 1; + optional string manufacturer = 2; + optional string model = 3; + optional int64 size = 4; + // SSD / eMMC / HDD + optional string type = 5; + optional string health = 6; + // volume_id for volumes on this disk. + repeated string volumes = 7; +} + +// Status of the storage subsystem. +message StorageStatus { + repeated DiskInfo disks = 1; +} + +// Sampling for single temperature measurements +message ThermalSample { + optional int64 timestamp = 1; + optional int32 temperature = 2; +} + +// Temperature measurement series for thermal point. +message ThermalInfo { + optional string label = 1; + optional int32 temperature = 2; +} + +// Status for various on-board components +message BoardStatus { + repeated ThermalInfo thermal = 1; +} + // Report device level status. message DeviceStatusReportRequest { reserved 4, 7, 13, 20; @@ -859,6 +931,15 @@ // Whether hardware write protect switch is on. optional bool write_protect_switch = 24; + + // Status of the power subsystem. + optional PowerStatus power_status = 25; + + // Status of the storage subsystem. + optional StorageStatus storage_status = 26; + + // Status of various main board components. + optional BoardStatus board_status = 27; } message OsUpdateStatus {
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index 1337073..ee3f8f3 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -2943,12 +2943,12 @@ <ph name="PRODUCT_OS_NAME" /> ভার্সন 70 বা উর্দ্ধতর ভার্সনে সাপোর্ট করা হয়। পুরানো ক্লায়েন্টের জন্য এই মান রোলব্যাক বন্ধ করা আছে বোঝায়।</translation> <translation id="7620869951155758729">এই নীতি অভিভাবকীয় অ্যাক্সেস কোড তৈরি করার এবং যাচাই করার কনফিগারেশন নির্দিষ্ট করে। - |current_config| অ্যাক্সেস কোড তৈরি করতে সবসময় ব্যবহার করার হয় এবং শুধুমাত্র অ্যাক্সেস কোডটি যখন |future_config|-এর মাধ্যমে যাচাই করা হয়না তখন এটি যাচাই করার জন্য ব্যবহার করা উচিত। + অ্যাক্সেস কোড তৈরি করতে সবসময় |current_config| ব্যবহার করা হয় এবং অ্যাক্সেস কোডটি |future_config|-এর মাধ্যমে যাচাই করা না গেলে, তবেই যাচাই করার জন্য এটি ব্যবহার করা উচিত। |future_config| হল প্রাথমিক কনফিগারেশন যা অ্যাক্সেস কোড যাচাই করার জন্য ব্যবহার করা হয়। - শুধুমাত্র অ্যাক্সেস কোডটি যখন |future_config| অথবা |current_config|-এর মাধ্যমে যাচাই করা হয়না তখন এটি যাচাই করার জন্য |old_configs| ব্যবহার করা উচিত। + অ্যাক্সেস কোডটি |future_config| অথবা |current_config|-এর মাধ্যমে যাচাই করা না গেলে, তবেই এটি যাচাই করার জন্য |old_configs| ব্যবহার করা উচিত। - এই নীতি ব্যবহার করার প্রত্যাশিত উপায় ধীরে ধীরে অ্যাক্সেস কোড কনফিগারেশনে ঘোরানো হয়। নতুন কনফিগারেশন সবসময় |future_config|-এ রাখা হয় এবং - একই সময়ে আগে থেকে থাকা মানটি |current_config|-এ সরানো হয়। |current_config|-এর আগের মানগুলি |old_configs|-এ সরানো হয় এবং রোটেশন সাইকেল সমাপ্ত হওয়ার পরে মুছে ফেলা হয়। + এই নীতি ব্যবহার করার প্রত্যাশিত উপায় হল ধীরে ধীরে অ্যাক্সেস কোড কনফিগারেশন ঘোরানো। নতুন কনফিগারেশন সবসময় |future_config|-এ রাখা হয় এবং + একই সময়ে আগে থেকে থাকা মানটি |current_config|-এ সরানো হয়। |current_config|-এর আগের মানগুলি |old_configs|-এ সরানো হয় এবং রোটেশন সাইকেল সমাপ্ত হওয়ার পরে মুছে ফেলা হয়। এই নীতি শুধুমাত্র চাইল্ড ইউজারের উপরে প্রযোজ্য। যখন এই নীতি সেট করা হয় তখন অভিভাবকীয় অ্যাক্সেস কোড চাইল্ড ইউজারের ডিভাইসে যাচাই করা যেতে পারে।
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index c68431e..2817b20 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -2652,12 +2652,12 @@ |current_config| का इस्तेमाल हमेशा एक्सेस कोड जनरेट करने के लिए किया जाता है और एक्सेस कोड की पुष्टि करने के लिए इसे तभी इस्तेमाल करना चाहिए जब |future_config| से उसकी पुष्टि नहीं की जा सकती हो. |future_config| एक्सेस कोड की पुष्टि करने के लिए इस्तेमाल किया जाने वाला प्राथमिक कॉन्फ़िगरेशन है. - एक्सेस कोड की पुष्टि करने के लिए |old_configs| इस्तेमाल तभी करना चाहिए जब न तो |future_config| से और न ही |current_config| से उसकी पुष्टि नहीं की जा सकती हो. + एक्सेस कोड की पुष्टि करने के लिए |old_configs| इस्तेमाल तभी करना चाहिए जब न तो |future_config| से और न ही |current_config| से उसकी पुष्टि की जा सकती हो. इस नीति के इस्तेमाल का कारगर तरीका एक्सेस कोड कॉन्फ़िगरेशन में धीरे-धीरे बदलाव करना है. नया कॉन्फ़िगरेशन हमेशा |future_config| में रखा जाता है और उसी समय मौजूदा मान को |current_config| में ले जाते हैं. |current_config| के पिछले मान |old_configs| में ले जाए जाते हैं और बदलाव का काम खत्म हो जाने के बाद हटा लिए जाते हैं. - यह नीति सिर्फ़ ऐसे उपयोगकर्ता पर लागू होती है जिसकी उम्र तय की गई सीमा से कम है. + यह नीति सिर्फ़ ऐसे उपयोगकर्ता पर लागू होती है, जिसकी उम्र तय की गई सीमा से कम है. जब यह नीति सेट की जाती है, तो बच्चे के डिवाइस पर अभिभावक एक्सेस कोड की पुष्टि की जा सकती है. जब यह नीति सेट नहीं की जाती है, तो बच्चे के डिवाइस पर अभिभावक एक्सेस कोड की पुष्टि नहीं की जा सकती है.</translation> <translation id="7625444193696794922">उस रिलीज़ चैनल को निर्दिष्ट करती है, जिससे यह डिवाइस लॉक किया जाना चाहिए.</translation>
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index 74250cd..905ead19 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -783,7 +783,7 @@ <translation id="3030000825273123558">הפעל דיווח על מדדים</translation> <translation id="3034580675120919256">מאפשר לך לקבוע אם מותר לאתרים להפעיל JavaScript. ניתן להפעיל JavaScript עבור כל האתרים או לבטל את ההגדרה עבור כל האתרים. אם לא הגדרת מדיניות זו, המערכת תשתמש ב-'AllowJavaScript' והמשתמש יוכל לשנות זאת.</translation> <translation id="3038323923255997294">המשך הפעלת יישומים ברקע כאשר <ph name="PRODUCT_NAME" /> סגור</translation> -<translation id="3046192273793919231">שלח מנות רשת לשרת הניהול כדי לנטר את הסטטוס המקוון</translation> +<translation id="3046192273793919231">שליחת מנות רשת לשרת הניהול כדי לנטר את הסטטוס המקוון</translation> <translation id="3047732214002457234">שליטה בדיווח הנתונים של Chrome Cleanup ל-Google</translation> <translation id="304775240152542058">המדיניות הזו קובעת פרמטרים של שורת הפקודה להפעלת הדפדפן החלופי. @@ -1007,7 +1007,7 @@ <translation id="3709266154059827597">הגדר רשימה שחורה של התקנת תוספים</translation> <translation id="3711895659073496551">השהה</translation> <translation id="3715569262675717862">אימות המבוסס על אישורי לקוח</translation> -<translation id="3736879847913515635">ניתן להוסיף מישהו דרך מנהל המשתמשים</translation> +<translation id="3736879847913515635">ניתן להוסיף משתמשים דרך מנהל המשתמשים</translation> <translation id="3748900290998155147">מציינת אם חסימות מצב שינה מותרות. בקשות לחסימות מצב שינה יכולות להתבצע על-ידי אפליקציות ARC ועל-ידי תוספים. כדי שתוסף יוכל לבקש חסימות מצב שינה, עליו לעשות זאת דרך ה-API של תוסף ניהול צריכת החשמל. אם המדיניות הזו מוגדרת כ-true או אינה מוגדרת, חסימות מצב שינה יבוצעו למטרת ניהול צריכת החשמל. @@ -1155,7 +1155,7 @@ כל פריט ברשימה שמצוינת במדיניות הוא אובייקט המורכב משני חלקים: "share_url" ו-"mode". הרכיב "share_url" צריך להיות כתובת ה-URL של התקן הרשת לשיתוף קבצים, והרכיב "mode" צריך להיות "drop_down", שמציין כי "share_url" יתווסף לתפריט הנפתח של איתור התקני רשת לשיתוף קבצים.</translation> <translation id="3925377537407648234">הגדרה של רזולוציית המסך ושל אחוז שינוי הגודל</translation> -<translation id="3939893074578116847">שלח מנות רשת לשרת הניהול כדי לנטר את הסטטוס המקוון וכדי +<translation id="3939893074578116847">שליחת מנות רשת לשרת הניהול כדי לנטר את הסטטוס המקוון וכדי שהשרת יוכל לזהות אם המכשיר נמצא במצב לא מקוון. אם מדיניות זו מוגדרת לערך true, מנות רשת לניטור (הנקראות <ph name="HEARTBEATS_TERM" />) יישלחו. @@ -1496,7 +1496,7 @@ <translation id="4917385247580444890">חזק</translation> <translation id="4923806312383904642">מתן הרשאה לתכונת WebDriver לעקוף סעיפי מדיניות שאינם תואמים לה</translation> <translation id="494613465159630803">Cast Receiver</translation> -<translation id="4962262530309732070">אם המדיניות מוגדרת כ-true או שהיא לא מוגדרת, <ph name="PRODUCT_NAME" /> יאפשר הוספת מישהו ממנהל המשתמשים. +<translation id="4962262530309732070">אם המדיניות מוגדרת כ-true או שהיא לא מוגדרת, <ph name="PRODUCT_NAME" /> יאפשר הוספה של משתמש ממנהל המשתמשים. אם המדיניות מוגדרת כ-false, <ph name="PRODUCT_NAME" /> לא יאפשר יצירה של פרופילים חדשים ממנהל המשתמשים.</translation> <translation id="4970855112942626932">השבתת כניסה לחשבון בדפדפן</translation> @@ -2083,7 +2083,7 @@ אם המדיניות הזו לא מוגדרת, המקלדת על המסך מושבתת כשמסך ההתחברות מוצג בפעם הראשונה. משתמשים יכולים להפעיל או להשבית את המקלדת על המסך בכל עת, והסטטוס שלה במסך ההתחברות נשמר בין משתמשים שונים.</translation> <translation id="6573305661369899995">הגדר מקור חיצוני להגבלות על כתובות אתרים</translation> <translation id="6598235178374410284">תמונה של דמות משתמש</translation> -<translation id="6603004149426829878">שלח אותות מיקום זמינים אל השרת בכל פעם שהמערכת מזהה את אזור זמן</translation> +<translation id="6603004149426829878">שליחת אותות מיקום זמינים אל השרת בכל פעם שהמערכת מזהה את אזור זמן</translation> <translation id="6628646143828354685">מאפשרת לך לקבוע אם אתרים יכולים לקבל גישה אל התקני Bluetooth קרובים. ניתן לחסום את הגישה לחלוטין, או שהמשתמש יתבקש להעניק אישור בכל פעם שאתר רוצה לקבל גישה אל התקני Bluetooth קרובים. אם המדיניות הזו לא תוגדר, יעשה שימוש ב-'3' והמשתמש יוכל לשנות את ההגדרה.</translation> @@ -2537,13 +2537,13 @@ אם תוסף אינו כלול ברשימה, או אם הרשימה אינה מוגדרת, הקריאה ל-API תיכשל ויוצג קוד שגיאה.</translation> <translation id="7618907117929117943">חזרה למצב קודם והשארת גרסת היעד אם גרסת ה-OS חדשה מגרסת היעד, ואם אפשר להעביר את התצורה ברמת המכשיר (כולל פרטי הכניסה לרשת) בחזרה למצב הקודם, גם לדלג על OOBE אחרי החזרה למצב הקודם. אין לבצע או לבטל חזרה למצב קודם אם הפעולות האלה לא אפשריות (מפני שגרסת היעד לא תומכת בשחזור נתונים' או עקב שינוי שאינו תואם לגרסאות קודמות). נתמכת ב-<ph name="PRODUCT_OS_NAME" /> מגרסה 70 ואילך. בלקוחות ישנים יותר, משמעות הערך הזה היא שהחזרה למצב קודם מושבתת.</translation> -<translation id="7620869951155758729">המדיניות הזו מציינת את התצורה שבה נעשה שימוש כדי ליצור ולאמת קוד גישה של הורים. +<translation id="7620869951155758729">המדיניות הזו מציינת את התצורה שמשמשת ליצירה ואימות של קוד גישה להורים. יצירת קוד גישה תמיד מתבצעת עם |current_config|, ויש להשתמש בתצורה הזו לאימות קוד הגישה רק כשלא ניתן לאמת אותו באמצעות |future_config|. - |future_config| היא התצורה הראשית שבה נעשה שימוש לאימות קוד גישה. - יש להשתמש ב-|old_configs| לאימות גישה רק כשלא ניתן לאמת אותו באמצעות |future_config| או |current_config|. + |future_config| היא התצורה הראשית שמשמשת לאימות של קוד גישה. + יש להשתמש ב-|old_configs| לאימות של קוד גישה רק כשלא ניתן לאמת אותו באמצעות |future_config| או |current_config|. - הדרך הצפויה לשימוש במדיניות הזו היא סבב הדרגתי בין תצורות קוד הגישה. התצורה החדשה תמיד מועברת אל |future_config|. כשזה קורה, הערך הקיים מועבר אל |current_config|. הערכים הקודמים של |current_config| מועברים אל |old_configs| והמערכת מסירה אותם בסיום הסבב. +הדרך הצפויה לשימוש במדיניות הזו היא סבב הדרגתי בין תצורות קוד הגישה. התצורה החדשה תמיד מועברת אל |future_config|. כשזה קורה, הערך הקיים מועבר אל |current_config|. הערכים הקודמים של |current_config| מועברים אל |old_configs| והמערכת מסירה אותם בסיום הסבב. המדיניות הזו חלה רק על משתמש של ילד. כשהמדיניות הזו מוגדרת אפשר לאמת את קוד הגישה של ההורה במכשיר של הילד.
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index d836788..b6d79edb 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -2750,13 +2750,13 @@ |current_config| ಅನ್ನು ಯಾವಾಗಲೂ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ರಚಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ ಮತ್ತು |future_config| ಜೊತೆಗೆ ಮೌಲ್ಯೀಕರಿಸಲಾಗದ ಸಂದರ್ಭದಲ್ಲಿ ಮಾತ್ರ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ಮೌಲ್ಯೀಕರಿಸಲು ಬಳಸಬೇಕು. |future_config| ಇದು ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ಮೌಲ್ಯೀಕರಿಸುವುದಕ್ಕಾಗಿ ಬಳಸಲಾದ ಪ್ರಾಥಮಿಕ ಕಾನ್ಫಿಗರ್ ಆಗಿದೆ. - |future_config| ಅಥವಾ |current_config| ಜೊತೆಗೆ ಮೌಲ್ಯೀಕರಿಸಲಾಗದ ಸಂದರ್ಭದಲ್ಲಿ ಮಾತ್ರ |old_configs| ಅನ್ನು ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ಮೌಲ್ಯೀಕರಿಸುವುದಕ್ಕಾಗಿ ಬಳಸಬೇಕು. + ಪ್ರವೇಶದ ಕೋಡ್ ಅನ್ನು |future_config| ಇಲ್ಲವೇ |current_config| ಜೊತೆಗೆ ಮೌಲ್ಯೀಕರಿಸಲಾಗದ ಸಂದರ್ಭದಲ್ಲಿ ಮಾತ್ರ |old_configs| ಬಳಸಿ ಮೌಲ್ಯೀಕರಿಸಬೇಕು. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಬಳಸುವ ನಿರೀಕ್ಷಿತ ವಿಧಾನವು ಸಾಮಾನ್ಯವಾಗಿ ಪ್ರವೇಶ ಕೋಡ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ. ಹೊಸ ಕಾನ್ಫಿಗರೇಶನ್ ಯಾವಾಗಲೂ |future_config| ನಲ್ಲಿರಿಸುತ್ತದೆ ಮತ್ತು ಅದೇ ಸಮಯದಲ್ಲಿ ಪ್ರಸ್ತುತ ಮೌಲ್ಯವು |current_config| ಗೆ ಸರಿಯುತ್ತದೆ. |current_config| ನ ಹಿಂದಿನ ಮೌಲ್ಯಗಳು |old_configs| ಗೆ ಸರಿಯುತ್ತವೆ ಮತ್ತು ತಿರುಗಿಸುವಿಕೆ ಕ್ರಿಯೆಯು ಸಂಪೂರ್ಣಗೊಂಡ ನಂತರ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. +ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಬಳಸುವ ನಿರೀಕ್ಷಿತ ವಿಧಾನದಲ್ಲಿ ಪ್ರವೇಶದ ಕೋಡ್ನ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಕ್ರಮೇಣವಾಗಿ ಬದಲಾಯಿಸಲಾಗುತ್ತದೆ. ಹೊಸ ಕಾನ್ಫಿಗರೇಶನ್ ಯಾವಾಗಲೂ |future_config| ನಲ್ಲಿರಿಸುತ್ತದೆ ಮತ್ತು ಅದೇ ಸಮಯದಲ್ಲಿ ಪ್ರಸ್ತುತ ಮೌಲ್ಯವು |current_config| ಗೆ ಸರಿಯುತ್ತದೆ. |current_config| ನ ಹಿಂದಿನ ಮೌಲ್ಯಗಳು |old_configs| ಗೆ ಸರಿಯುತ್ತವೆ ಮತ್ತು ತಿರುಗಿಸುವಿಕೆ ಕ್ರಿಯೆಯು ಸಂಪೂರ್ಣಗೊಂಡ ನಂತರ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯು ಮಕ್ಕಳ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ ಅನ್ವಯಿಸುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದಾಗ, ಪೋಷಕ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ಮಕ್ಕಳ ಬಳಕೆದಾರ ಸಾಧನದಲ್ಲಿ ಪರಿಶೀಲಿಸಬಹುದಾಗಿದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದಾಗ, ಪೋಷಕ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ಮಕ್ಕಳ ಬಳಕೆದಾರ ಸಾಧನದಲ್ಲಿ ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> + ಬಳಕೆದಾರರು ಮಕ್ಕಳಾಗಿದ್ದರೆ ಮಾತ್ರ ಈ ಕಾರ್ಯನೀತಿಯು ಅನ್ವಯಿಸುತ್ತದೆ. + ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದಾಗ, ಪೋಷಕ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ಬಳಕೆದಾರರಾಗಿರುವ ಮಕ್ಕಳ ಸಾಧನದಲ್ಲಿ ಪರಿಶೀಲಿಸಬಹುದಾಗಿದೆ. + ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದಾಗ, ಪೋಷಕ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ಬಳಕೆದಾರರಾಗಿರುವ ಮಕ್ಕಳ ಸಾಧನದಲ್ಲಿ ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> <translation id="7625444193696794922">ಈ ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಬೇಕಾದ ಬಿಡುಗಡೆ ಚಾನಲ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ.</translation> <translation id="7632724434767231364">GSSAPI ಲೈಬ್ರರಿ ಹೆಸರು</translation> <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> ರಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ನ ಸ್ಥಳವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಸ್ಥಳವನ್ನು ಬದಲಿಸುವುದರಿಂದ ತಡೆಯುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ, <ph name="PRODUCT_NAME" /> ನಿರ್ದಿಷ್ಟ ಸ್ಥಳವನ್ನು ಬಳಸುತ್ತದೆ. ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ ಸ್ಥಳವನ್ನು ಬೆಂಬಲಿಸದಿದ್ದರೆ, ಬದಲಿಗೆ 'en-US' ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಹೊಂದಿಸದಿದ್ದಲ್ಲಿ, ಬಳಕೆದಾರ ನಿರ್ದಿಷ್ಟ ಪಡಿಸಿದ ಪ್ರಾಶಸ್ತ್ಯ ಸ್ಥಳವನ್ನು (ಕಾನ್ಫಿಗರ್ ಮಾಡಿದರೆ) <ph name="PRODUCT_NAME" /> ಬಳಸುತ್ತದೆ, ಸಿಸ್ಟಂ ಸ್ಥಳ ಅಥವಾ 'en-US' ನ ಹಿನ್ನೆಲೆಯ ಸ್ಥಳವನ್ನು ಬಳಸುತ್ತದೆ.</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 1ee0da8..39c0e9f 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -2637,7 +2637,7 @@ |future_config| is de primaire configuratie die wordt gebruikt om de toegangscode te valideren. |old_configs| moet alleen worden gebruikt om de toegangscode te valideren wanneer deze niet kan worden gevalideerd met |future_config| of |current_config|. - De verwachte gebruiksmethode van dit beleid is de configuratie voor de toegangscode geleidelijk rouleren. Een nieuwe configuratie wordt altijd in |future_config| geplaatst en tegelijkertijd wordt de bestaande waarde verplaatst naar |current_config|. De eerdere waarden van |current_config| worden verplaatst naar |old_configs| en verwijderd nadat de roulatiecyclus is afgelopen. + Dit beleid is bedoeld om de configuratie voor de toegangscode geleidelijk te rouleren. Een nieuwe configuratie wordt altijd in |future_config| geplaatst en tegelijkertijd wordt de bestaande waarde verplaatst naar |current_config|. De eerdere waarden van |current_config| worden verplaatst naar |old_configs| en verwijderd nadat de roulatiecyclus is afgelopen. Dit beleid is alleen van toepassing op gebruikers met een kinderaccount. Wanneer dit beleid is ingesteld, kan de toegangscode voor ouders worden geverifieerd op het apparaat van de gebruiker met een kinderaccount.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 9020cb6d..df0a576 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -2548,8 +2548,7 @@ Основная конфигурация для подтверждения кода доступа – |future_config|. Настройки |old_configs| рекомендуется использовать для подтверждения кода доступа только в том случае, если это невозможно сделать с помощью конфигураций |future_config| и |current_config|. - Назначение этого правила – последовательное чередование конфигураций кода доступа. Новая конфигурация всегда сохраняется в настройках |future_config|, при этом - текущее значение переносится в |current_config|. Предыдущие значения конфигурации |current_config| перемещаются в настройки |old_configs|, а затем удаляются после завершения цикла чередования. + Назначение этого правила – последовательное чередование конфигураций кода доступа. Новая конфигурация всегда сохраняется в настройках |future_config|, при этом текущее значение переносится в |current_config|. Предыдущие значения конфигурации |current_config| перемещаются в настройки |old_configs|, а затем удаляются после завершения цикла чередования. Это правило применяется только к детским аккаунтам. Если оно задано, родительский код доступа можно подтвердить на устройстве ребенка.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index 74e8a199..3b3be76 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -2576,8 +2576,8 @@ அணுகல் குறியீட்டு உள்ளமைவை சுழற்சி முறையில் மாற்றுவதே இந்தக் கொள்கையைப் பயன்படுத்துவதற்கான உகந்த வழியாகும். புதிய உள்ளமைவு எப்போதும் |future_config| இல் பயன்படுத்தப்படும் அதேநேரம், அச்சமயத்தில் உள்ள மதிப்பு |current_config|க்கு நகர்த்தப்படும். |current_config| இன் முந்தைய மதிப்புகள் |old_configs|க்கு நகர்த்தப்பட்டு, சுழற்சி முறை முடிவடைந்தவுடன் அகற்றப்படும். உபநிலைப் பயனருக்கு மட்டுமே இந்தக் கொள்கை பொருந்தும். - இந்தக் கொள்கை அமைக்கப்பட்டால், உபநிலைப் பயனரின் சாதனத்தில் 'முதல்நிலை அணுகல் குறியீட்டைச்’ சரிபார்க்கலாம். - இந்தக் கொள்கை அமைக்கப்படாவிட்டால், உபநிலைப் பயனரின் சாதனத்தில் 'முதல்நிலை அணுகல் குறியீட்டைச்’ சரிபார்க்க முடியாது.</translation> + இந்தக் கொள்கை அமைக்கப்பட்டால் உபநிலைப் பயனரின் சாதனத்தில் 'முதல்நிலை அணுகல் குறியீட்டைச்’ சரிபார்க்கலாம். + இந்தக் கொள்கை அமைக்கப்படாவிட்டால் உபநிலைப் பயனரின் சாதனத்தில் 'முதல்நிலை அணுகல் குறியீட்டைச்’ சரிபார்க்க முடியாது.</translation> <translation id="7625444193696794922">இந்த சாதனம் பூட்டப்பட வேண்டிய வெளியீட்டு சேனலைக் குறிப்பிடுகிறது.</translation> <translation id="7632724434767231364">GSSAPI லைப்ரரி பெயர்</translation> <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> இல் பயன்பாட்டின் மொழியை உள்ளமைக்கிறது மற்றும் பயனர்கள் அதை மாற்றுவதைத் தடுக்கிறது. நீங்கள் இந்த அமைப்பை இயக்கினால், <ph name="PRODUCT_NAME" /> ஆனது குறிப்பிடப்பட்ட மொழியைப் பயன்படுத்தும். உள்ளமைக்கப்பட்ட மொழியானது ஆதரிக்கப்படவில்லை என்றால், அதற்கு மாற்றாக 'en-US' பயன்படுத்தப்படும். இந்த அமைப்பு முடக்கப்பட்டிருந்தால் அல்லது உள்ளமைக்கப்படவில்லை என்றால், <ph name="PRODUCT_NAME" /> ஆனது பயனர் குறிப்பிட்ட மொழியைப் பயன்படுத்தும் (உள்ளமைக்கப்பட்டால்), கணினியின் மொழியைப் பயன்படுத்தும் அல்லது 'en-US' க்கு மீட்டமைக்கப்படும்.</translation>
diff --git a/components/security_state/content/content_utils.cc b/components/security_state/content/content_utils.cc index 38e7083..dfda31fb 100644 --- a/components/security_state/content/content_utils.cc +++ b/components/security_state/content/content_utils.cc
@@ -72,29 +72,6 @@ l10n_util::GetStringUTF8(IDS_EDITED_NONSECURE_DESCRIPTION))); } } - - if (security_info.security_level != security_state::HTTP_SHOW_WARNING) - return; - - if (security_info.field_edit_downgraded_security_level) { - security_style_explanations->neutral_explanations.push_back( - content::SecurityStyleExplanation( - l10n_util::GetStringUTF8(IDS_EDITED_NONSECURE), - l10n_util::GetStringUTF8(IDS_EDITED_NONSECURE_DESCRIPTION))); - } - if (security_info.insecure_input_events.password_field_shown || - security_info.insecure_input_events.credit_card_field_edited) { - security_style_explanations->neutral_explanations.push_back( - content::SecurityStyleExplanation( - l10n_util::GetStringUTF8(IDS_PRIVATE_USER_DATA_INPUT), - l10n_util::GetStringUTF8(IDS_PRIVATE_USER_DATA_INPUT_DESCRIPTION))); - } - if (security_info.incognito_downgraded_security_level) { - security_style_explanations->neutral_explanations.push_back( - content::SecurityStyleExplanation( - l10n_util::GetStringUTF8(IDS_INCOGNITO_NONSECURE), - l10n_util::GetStringUTF8(IDS_INCOGNITO_NONSECURE_DESCRIPTION))); - } } void ExplainSafeBrowsingSecurity(
diff --git a/components/security_state/content/content_utils_browsertest.cc b/components/security_state/content/content_utils_browsertest.cc index 70dc4d3..f7a1362 100644 --- a/components/security_state/content/content_utils_browsertest.cc +++ b/components/security_state/content/content_utils_browsertest.cc
@@ -50,59 +50,6 @@ }; #if defined(OS_WIN) -#define MAYBE_VisibleSecurityStateNonsecureFormInputs \ - DISABLED_VisibleSecurityStateNonsecureFormInputs -#else -#define MAYBE_VisibleSecurityStateNonsecureFormInputs \ - VisibleSecurityStateNonsecureFormInputs -#endif -// Tests that the NavigationEntry's flags for nonsecure password/credit -// card inputs are reflected in the VisibleSecurityState. -IN_PROC_BROWSER_TEST_F(SecurityStateContentUtilsBrowserTest, - MAYBE_VisibleSecurityStateNonsecureFormInputs) { - ASSERT_TRUE(https_server_.Start()); - EXPECT_TRUE(NavigateToURL(shell(), https_server_.GetURL("/hello.html"))); - - content::WebContents* contents = shell()->web_contents(); - ASSERT_TRUE(contents); - - // First, ensure the flag is not set prematurely. - content::SSLStatus& ssl_status = - contents->GetController().GetVisibleEntry()->GetSSL(); - SSLStatusInputEventData* ssl_status_input_events = - static_cast<SSLStatusInputEventData*>(ssl_status.user_data.get()); - InsecureInputEventData events; - if (ssl_status_input_events) - events = *ssl_status_input_events->input_events(); - ASSERT_FALSE(events.password_field_shown); - ASSERT_FALSE(events.credit_card_field_edited); - - // Next, ensure they aren't set on the VisibleSecurityState. - std::unique_ptr<security_state::VisibleSecurityState> - visible_security_state_no_sensitive_inputs = - GetVisibleSecurityState(contents); - EXPECT_FALSE(visible_security_state_no_sensitive_inputs->insecure_input_events - .password_field_shown); - EXPECT_FALSE(visible_security_state_no_sensitive_inputs->insecure_input_events - .credit_card_field_edited); - - // Now, set the flags on the NavigationEntry and test that they are - // reflected in the VisibleSecurityState. - events.password_field_shown = true; - events.credit_card_field_edited = true; - ssl_status.user_data = - std::make_unique<security_state::SSLStatusInputEventData>(events); - - std::unique_ptr<security_state::VisibleSecurityState> - visible_security_state_sensitive_inputs = - GetVisibleSecurityState(contents); - EXPECT_TRUE(visible_security_state_sensitive_inputs->insecure_input_events - .password_field_shown); - EXPECT_TRUE(visible_security_state_sensitive_inputs->insecure_input_events - .credit_card_field_edited); -} - -#if defined(OS_WIN) #define MAYBE_VisibleSecurityStateInsecureFieldEdit \ DISABLED_VisibleSecurityStateInsecureFieldEdit #else
diff --git a/components/security_state/content/content_utils_unittest.cc b/components/security_state/content/content_utils_unittest.cc index 2f6bf1e..1c8191d 100644 --- a/components/security_state/content/content_utils_unittest.cc +++ b/components/security_state/content/content_utils_unittest.cc
@@ -660,55 +660,6 @@ EXPECT_EQ(blink::kWebSecurityStyleNeutral, security_style); // Verify no explanation was shown, because Form Not Secure was not triggered. EXPECT_EQ(0u, explanations.neutral_explanations.size()); - - explanations.neutral_explanations.clear(); - security_info.insecure_input_events.credit_card_field_edited = true; - security_style = GetSecurityStyle(security_info, &explanations); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, security_style); - // Verify one explanation was shown, because Form Not Secure was triggered. - EXPECT_EQ(1u, explanations.neutral_explanations.size()); - - // Check that when both password and credit card fields get displayed, only - // one explanation is added. - explanations.neutral_explanations.clear(); - security_info.insecure_input_events.credit_card_field_edited = true; - security_info.insecure_input_events.password_field_shown = true; - security_style = GetSecurityStyle(security_info, &explanations); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, security_style); - // Verify only one explanation was shown when Form Not Secure is triggered. - EXPECT_EQ(1u, explanations.neutral_explanations.size()); - - // Verify that two explanations are shown when the Incognito and - // FormNotSecure flags are both set. - explanations.neutral_explanations.clear(); - security_info.insecure_input_events.credit_card_field_edited = true; - security_info.insecure_input_events.password_field_shown = false; - security_info.incognito_downgraded_security_level = true; - security_style = GetSecurityStyle(security_info, &explanations); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, security_style); - EXPECT_EQ(2u, explanations.neutral_explanations.size()); - - // Verify that three explanations are shown when the Incognito, FormNotSecure, - // and Insecure Field Edit flags are all set. - explanations.neutral_explanations.clear(); - security_info.insecure_input_events.credit_card_field_edited = true; - security_info.insecure_input_events.password_field_shown = false; - security_info.incognito_downgraded_security_level = true; - security_info.field_edit_downgraded_security_level = true; - security_style = GetSecurityStyle(security_info, &explanations); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, security_style); - EXPECT_EQ(3u, explanations.neutral_explanations.size()); - - // Verify that one explanation is shown when the Insecure Field Edit flags - // alone is set. - explanations.neutral_explanations.clear(); - security_info.insecure_input_events.credit_card_field_edited = false; - security_info.insecure_input_events.password_field_shown = false; - security_info.incognito_downgraded_security_level = false; - security_info.field_edit_downgraded_security_level = true; - security_style = GetSecurityStyle(security_info, &explanations); - EXPECT_EQ(blink::kWebSecurityStyleNeutral, security_style); - EXPECT_EQ(1u, explanations.neutral_explanations.size()); } // Tests that a security level of DANGEROUS on an HTTP page with insecure form
diff --git a/components/security_state/core/features.cc b/components/security_state/core/features.cc index e9598812..f6810147 100644 --- a/components/security_state/core/features.cc +++ b/components/security_state/core/features.cc
@@ -10,12 +10,9 @@ const base::Feature kMarkHttpAsFeature{"MarkHttpAs", base::FEATURE_ENABLED_BY_DEFAULT}; const char kMarkHttpAsFeatureParameterName[] = "treatment"; -const char kMarkHttpAsParameterWarning[] = "warning"; const char kMarkHttpAsParameterDangerous[] = "dangerous"; const char kMarkHttpAsParameterWarningAndDangerousOnFormEdits[] = "warning-and-dangerous-on-form-edits"; -const char kMarkHttpAsParameterWarningAndDangerousOnPasswordsAndCreditCards[] = - "warning-and-dangerous-on-passwords-and-credit-cards"; } // namespace features } // namespace security_state
diff --git a/components/security_state/core/features.h b/components/security_state/core/features.h index 4a0e4b78f..1e9b0c8 100644 --- a/components/security_state/core/features.h +++ b/components/security_state/core/features.h
@@ -13,25 +13,18 @@ // This feature enables more aggressive warnings for nonsecure http:// pages. // The exact warning treatment is dependent on the parameter 'treatment' which // can have the following values: -// - 'warning': Show a Not Secure warning on all http:// pages // - 'dangerous': Treat all http:// pages as actively dangerous // - 'warning-and-dangerous-on-form-edits': Show a Not Secure warning on all // http:// pages, and treat them as actively dangerous when the user edits // form fields -// - 'warning-and-dangerous-on-passwords-and-credit-cards': Show a Not Secure -// warning on all http:// pages, and treat them as actively dangerous when -// there is a sensitive field extern const base::Feature kMarkHttpAsFeature; // The parameter name which controls the warning treatment. extern const char kMarkHttpAsFeatureParameterName[]; // The different parameter values, described above. -extern const char kMarkHttpAsParameterWarning[]; extern const char kMarkHttpAsParameterDangerous[]; extern const char kMarkHttpAsParameterWarningAndDangerousOnFormEdits[]; -extern const char - kMarkHttpAsParameterWarningAndDangerousOnPasswordsAndCreditCards[]; } // namespace features } // namespace security_state
diff --git a/components/security_state/core/insecure_input_event_data.h b/components/security_state/core/insecure_input_event_data.h index 568d458..e6b9c913 100644 --- a/components/security_state/core/insecure_input_event_data.h +++ b/components/security_state/core/insecure_input_event_data.h
@@ -10,20 +10,11 @@ // Stores flags about Input Events in the page that may influence // its security level. struct InsecureInputEventData { - InsecureInputEventData() - : insecure_field_edited(false), - password_field_shown(false), - credit_card_field_edited(false) {} + InsecureInputEventData() : insecure_field_edited(false) {} ~InsecureInputEventData() {} // True if the user edited a field on a non-secure page. bool insecure_field_edited; - - // True if a password input field was shown on a non-secure page. - bool password_field_shown; - - // True if a credit card input field was edited on a non-secure page. - bool credit_card_field_edited; }; } // namespace security_state
diff --git a/components/security_state/core/security_state.cc b/components/security_state/core/security_state.cc index 6e825c52..cb27b57 100644 --- a/components/security_state/core/security_state.cc +++ b/components/security_state/core/security_state.cc
@@ -32,11 +32,8 @@ } // For nonsecure pages, sets |security_level| in |*security_info| based on the -// provided information and the kMarkHttpAsFeature field trial. Also sets the -// explanatory fields |incognito_downgraded_security_level| and -// |field_edit_downgraded_security_level|. +// provided information and the kMarkHttpAsFeature field trial. void SetSecurityLevelAndRelatedFieldsForNonSecureFieldTrial( - bool is_incognito, bool is_error_page, const InsecureInputEventData& input_events, SecurityInfo* security_info) { @@ -49,43 +46,12 @@ security_info->security_level = DANGEROUS; return; } - - if (parameter == - features:: - kMarkHttpAsParameterWarningAndDangerousOnPasswordsAndCreditCards) { - security_info->security_level = (input_events.password_field_shown || - input_events.credit_card_field_edited) - ? DANGEROUS - : HTTP_SHOW_WARNING; - return; - } - - // By default, if the feature is enabled, show a warning on all http:// - // pages and mark as dangerous on form edits. - security_info->security_level = - input_events.insecure_field_edited ? DANGEROUS : HTTP_SHOW_WARNING; - // Do not set |field_edit_downgraded_security_level| here because that - // field is for specifically for when the security level was downgraded - // from NONE to HTTP_SHOW_WARNING, not from HTTP_SHOW_WARNING to DANGEROUS - // as in this case. - return; } - // No warning treatment is configured via field trial. Default to warning on - // incognito or editing or sensitive form fields. + // Default to dangerous on editing form fields and otherwise + // warning. security_info->security_level = - (is_incognito || input_events.insecure_field_edited || - input_events.password_field_shown || - input_events.credit_card_field_edited) - ? HTTP_SHOW_WARNING - : NONE; - security_info->incognito_downgraded_security_level = - (is_incognito && !is_error_page && - security_info->security_level == HTTP_SHOW_WARNING); - - security_info->field_edit_downgraded_security_level = - (security_info->security_level == HTTP_SHOW_WARNING && - input_events.insecure_field_edited); + input_events.insecure_field_edited ? DANGEROUS : HTTP_SHOW_WARNING; } ContentStatus GetContentStatus(bool displayed, bool ran) { @@ -98,9 +64,7 @@ return CONTENT_STATUS_NONE; } -// Sets |security_level| in |*security_info| based on the provided information, -// as well as the explanatory fields |incognito_downgraded_security_level| and -// |field_edit_downgraded_security_level|. +// Sets |security_level| in |*security_info| based on the provided information. void SetSecurityLevelAndRelatedFields( const VisibleSecurityState& visible_security_state, bool used_policy_installed_certificate, @@ -113,12 +77,6 @@ visible_security_state.malicious_content_status != MALICIOUS_CONTENT_STATUS_NONE); - // Initialize the related fields; they'll be set to true in - // SetSecurityLevelAndRelatedFieldsForNonSecureFieldTrial() below if - // necessary. - security_info->incognito_downgraded_security_level = false; - security_info->field_edit_downgraded_security_level = false; - // Override the connection security information if the website failed the // browser's malware checks. if (visible_security_state.malicious_content_status != @@ -144,8 +102,7 @@ // Likewise, ftp: URLs are always non-secure, and are uncommon enough that // we can treat them as such without significant user impact. // - // Display a "Not secure" badge for all these URLs, regardless of whether - // they show a password or credit card field. + // Display a "Not secure" badge for all these URLs. if (url.SchemeIs(url::kDataScheme) || url.SchemeIs(url::kFtpScheme)) { security_info->security_level = SecurityLevel::HTTP_SHOW_WARNING; return; @@ -161,7 +118,6 @@ (url.IsStandard() || IsNonsecureBlobUrl(url, is_origin_secure_callback))) { SetSecurityLevelAndRelatedFieldsForNonSecureFieldTrial( - visible_security_state.is_incognito, visible_security_state.is_error_page, visible_security_state.insecure_input_events, security_info); return; @@ -326,9 +282,7 @@ obsolete_ssl_status(net::OBSOLETE_SSL_NONE), pkp_bypassed(false), contained_mixed_form(false), - cert_missing_subject_alt_name(false), - incognito_downgraded_security_level(false), - field_edit_downgraded_security_level(false) {} + cert_missing_subject_alt_name(false) {} SecurityInfo::~SecurityInfo() {} @@ -355,7 +309,6 @@ displayed_content_with_cert_errors(false), ran_content_with_cert_errors(false), pkp_bypassed(false), - is_incognito(false), is_error_page(false), is_view_source(false) {}
diff --git a/components/security_state/core/security_state.h b/components/security_state/core/security_state.h index 2a3896a..6b027df 100644 --- a/components/security_state/core/security_state.h +++ b/components/security_state/core/security_state.h
@@ -142,12 +142,6 @@ // True if the server's certificate does not contain a // subjectAltName extension with a domain name or IP address. bool cert_missing_subject_alt_name; - // True if the |security_level| was downgraded to HTTP_SHOW_WARNING because - // the page was loaded while Incognito. - bool incognito_downgraded_security_level; - // True if the |security_level| was downgraded to HTTP_SHOW_WARNING because - // of a field edit recorded in |insecure_input_events|. - bool field_edit_downgraded_security_level; // Contains information about input events that may impact the security // level of the page. InsecureInputEventData insecure_input_events; @@ -188,8 +182,6 @@ bool ran_content_with_cert_errors; // True if PKP was bypassed due to a local trust anchor. bool pkp_bypassed; - // True if the page was displayed in an Incognito context. - bool is_incognito; // True if the page was an error page. // TODO(estark): this field is not populated on iOS. https://crbug.com/760647 bool is_error_page;
diff --git a/components/security_state/core/security_state_unittest.cc b/components/security_state/core/security_state_unittest.cc index 594e41a..53dedf4 100644 --- a/components/security_state/core/security_state_unittest.cc +++ b/components/security_state/core/security_state_unittest.cc
@@ -55,7 +55,6 @@ contained_mixed_form_(false), ran_mixed_content_(false), malicious_content_status_(MALICIOUS_CONTENT_STATUS_NONE), - is_incognito_(false), is_error_page_(false), is_view_source_(false), has_policy_certificate_(false) {} @@ -89,13 +88,6 @@ MaliciousContentStatus malicious_content_status) { malicious_content_status_ = malicious_content_status; } - void set_password_field_shown(bool password_field_shown) { - insecure_input_events_.password_field_shown = password_field_shown; - } - void set_credit_card_field_edited(bool credit_card_field_edited) { - insecure_input_events_.credit_card_field_edited = credit_card_field_edited; - } - void set_is_incognito(bool is_incognito) { is_incognito_ = is_incognito; } void set_is_error_page(bool is_error_page) { is_error_page_ = is_error_page; } @@ -122,7 +114,6 @@ state->contained_mixed_form = contained_mixed_form_; state->ran_mixed_content = ran_mixed_content_; state->malicious_content_status = malicious_content_status_; - state->is_incognito = is_incognito_; state->is_error_page = is_error_page_; state->is_view_source = is_view_source_; state->insecure_input_events = insecure_input_events_; @@ -144,7 +135,6 @@ bool contained_mixed_form_; bool ran_mixed_content_; MaliciousContentStatus malicious_content_status_; - bool is_incognito_; bool is_error_page_; bool is_view_source_; bool has_policy_certificate_; @@ -298,43 +288,21 @@ EXPECT_EQ(DANGEROUS, security_info.security_level); } -// Tests that pseudo URLs always cause an HTTP_SHOW_WARNING to be shown, -// regardless of whether a password or credit card field was displayed. +// Tests that pseudo URLs always cause an HTTP_SHOW_WARNING to be shown. TEST(SecurityStateTest, AlwaysWarnOnDataUrls) { TestSecurityStateHelper helper; helper.SetUrl(GURL("data:text/html,<html>test</html>")); - helper.set_password_field_shown(false); - helper.set_credit_card_field_edited(false); SecurityInfo security_info; helper.GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.insecure_input_events.password_field_shown); - EXPECT_FALSE(security_info.insecure_input_events.credit_card_field_edited); EXPECT_EQ(HTTP_SHOW_WARNING, security_info.security_level); } -// Tests that FTP URLs always cause an HTTP_SHOW_WARNING to be shown, -// regardless of whether a password or credit card field was displayed. +// Tests that FTP URLs always cause an HTTP_SHOW_WARNING to be shown. TEST(SecurityStateTest, AlwaysWarnOnFtpUrls) { TestSecurityStateHelper helper; helper.SetUrl(GURL("ftp://example.test/")); - helper.set_password_field_shown(false); - helper.set_credit_card_field_edited(false); SecurityInfo security_info; helper.GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.insecure_input_events.password_field_shown); - EXPECT_FALSE(security_info.insecure_input_events.credit_card_field_edited); - EXPECT_EQ(HTTP_SHOW_WARNING, security_info.security_level); -} - -// Tests that password fields cause the security level to be downgraded -// to HTTP_SHOW_WARNING. -TEST(SecurityStateTest, PasswordFieldWarning) { - TestSecurityStateHelper helper; - helper.SetUrl(GURL(kHttpUrl)); - helper.set_password_field_shown(true); - SecurityInfo security_info; - helper.GetSecurityInfo(&security_info); - EXPECT_TRUE(security_info.insecure_input_events.password_field_shown); EXPECT_EQ(HTTP_SHOW_WARNING, security_info.security_level); } @@ -350,46 +318,6 @@ } } -// Tests that credit card fields cause the security level to be downgraded -// to HTTP_SHOW_WARNING. -TEST(SecurityStateTest, CreditCardFieldWarning) { - TestSecurityStateHelper helper; - helper.SetUrl(GURL(kHttpUrl)); - helper.set_credit_card_field_edited(true); - SecurityInfo security_info; - helper.GetSecurityInfo(&security_info); - EXPECT_TRUE(security_info.insecure_input_events.credit_card_field_edited); - EXPECT_EQ(HTTP_SHOW_WARNING, security_info.security_level); -} - -// Tests that neither |password_field_shown| nor -// |credit_card_field_edited| is set when the corresponding -// VisibleSecurityState flags are not set. -TEST(SecurityStateTest, PrivateUserDataNotSet) { - TestSecurityStateHelper helper; - helper.SetUrl(GURL(kHttpUrl)); - SecurityInfo security_info; - helper.GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.insecure_input_events.password_field_shown); - EXPECT_FALSE(security_info.insecure_input_events.credit_card_field_edited); - EXPECT_EQ(HTTP_SHOW_WARNING, security_info.security_level); -} - -// Tests that neither |password_field_shown| nor -// |credit_card_field_edited| is set on pseudo URLs when the -// corresponding VisibleSecurityState flags are not set. -TEST(SecurityStateTest, PrivateUserDataNotSetOnPseudoUrls) { - for (const char* const url : kPseudoUrls) { - TestSecurityStateHelper helper; - helper.SetUrl(GURL(url)); - SecurityInfo security_info; - helper.GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.insecure_input_events.password_field_shown); - EXPECT_FALSE(security_info.insecure_input_events.credit_card_field_edited); - EXPECT_EQ(HTTP_SHOW_WARNING, security_info.security_level); - } -} - // Tests that if |is_view_source| NONE is returned for a secure site. TEST(SecurityStateTest, ViewSourceRemovesSecure) { TestSecurityStateHelper helper; @@ -416,44 +344,6 @@ EXPECT_EQ(DANGEROUS, security_info.security_level); } -// Tests that |incognito_downgraded_security_level| is set only when the -// corresponding VisibleSecurityState flag is set. The incognito downgrade is -// only performed when the HTTP-Bad feature is disabled. -TEST(SecurityStateTest, IncognitoFlagPropagates) { - TestSecurityStateHelper helper; - helper.SetUrl(GURL(kHttpUrl)); - SecurityInfo security_info; - - { - // When the feature is disabled, the downgraded flag should be set for - // incognito http pages. - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); - helper.set_is_incognito(false); - helper.GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.incognito_downgraded_security_level); - - helper.set_is_incognito(true); - helper.GetSecurityInfo(&security_info); - EXPECT_TRUE(security_info.incognito_downgraded_security_level); - } - - { - // When the feature is enabled, the downgraded flag should never be set. - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - security_state::features::kMarkHttpAsFeature); - helper.set_is_incognito(false); - helper.GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.incognito_downgraded_security_level); - - helper.set_is_incognito(true); - helper.GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.incognito_downgraded_security_level); - } -} - TEST(SecurityStateTest, DetectSubjectAltName) { TestSecurityStateHelper helper; @@ -556,46 +446,82 @@ } } -// Tests that a field edit is reflected in the SecurityInfo. -TEST(SecurityStateTest, FieldEdit) { +// Tests that HTTP_SHOW_WARNING is set on normal http pages but DANGEROUS on +// form edits with default feature enabled. +TEST(SecurityStateTest, WarningAndDangerousOnFormEditsWhenFeatureEnabled) { TestSecurityStateHelper helper; helper.SetUrl(GURL(kHttpUrl)); + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + security_state::features::kMarkHttpAsFeature); { - // Test that a warning is shown on field edits, when the feature is - // disabled. - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - security_state::features::kMarkHttpAsFeature); + SecurityInfo security_info; + helper.GetSecurityInfo(&security_info); + EXPECT_FALSE(security_info.insecure_input_events.insecure_field_edited); + EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); + } - SecurityInfo no_field_edit_security_info; - helper.GetSecurityInfo(&no_field_edit_security_info); - EXPECT_FALSE(no_field_edit_security_info.insecure_input_events - .insecure_field_edited); - EXPECT_FALSE( - no_field_edit_security_info.field_edit_downgraded_security_level); - EXPECT_EQ(NONE, no_field_edit_security_info.security_level); + helper.set_insecure_field_edit(true); - helper.set_insecure_field_edit(true); - + { SecurityInfo security_info; helper.GetSecurityInfo(&security_info); EXPECT_TRUE(security_info.insecure_input_events.insecure_field_edited); - EXPECT_TRUE(security_info.field_edit_downgraded_security_level); + EXPECT_EQ(DANGEROUS, security_info.security_level); + } +} + +// Tests that HTTP_SHOW_WARNING is set on normal http pages but DANGEROUS on +// form edits with default feature disabled. +TEST(SecurityStateTest, WarningAndDangerousOnFormEditsWhenFeatureDisabled) { + TestSecurityStateHelper helper; + helper.SetUrl(GURL(kHttpUrl)); + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + security_state::features::kMarkHttpAsFeature); + + { + SecurityInfo security_info; + helper.GetSecurityInfo(&security_info); + EXPECT_FALSE(security_info.insecure_input_events.insecure_field_edited); EXPECT_EQ(HTTP_SHOW_WARNING, security_info.security_level); } - { - // Test that the default enabled configuration shows the dangerous warning - // on field edits. - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - security_state::features::kMarkHttpAsFeature); + helper.set_insecure_field_edit(true); + { SecurityInfo security_info; helper.GetSecurityInfo(&security_info); EXPECT_TRUE(security_info.insecure_input_events.insecure_field_edited); - EXPECT_FALSE(security_info.field_edit_downgraded_security_level); + EXPECT_EQ(DANGEROUS, security_info.security_level); + } +} + +// Tests that DANGEROUS is set on normal http pages regardless of form edits +// when kMarkHttpAsFeature is set to always DANGEROUS +TEST(SecurityStateTest, AlwaysDangerousWhenFeatureMarksAllAsDangerous) { + TestSecurityStateHelper helper; + helper.SetUrl(GURL(kHttpUrl)); + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeatureWithParameters( + security_state::features::kMarkHttpAsFeature, + {{security_state::features::kMarkHttpAsFeatureParameterName, + security_state::features::kMarkHttpAsParameterDangerous}}); + + { + SecurityInfo security_info; + helper.GetSecurityInfo(&security_info); + EXPECT_FALSE(security_info.insecure_input_events.insecure_field_edited); + EXPECT_EQ(DANGEROUS, security_info.security_level); + } + + helper.set_insecure_field_edit(true); + + { + SecurityInfo security_info; + helper.GetSecurityInfo(&security_info); + EXPECT_TRUE(security_info.insecure_input_events.insecure_field_edited); EXPECT_EQ(DANGEROUS, security_info.security_level); } } @@ -631,16 +557,14 @@ EXPECT_FALSE(IsSslCertificateValid(SecurityLevel::HTTP_SHOW_WARNING)); } -// Tests that HTTP_SHOW_WARNING is not set in incognito for error pages. -TEST(SecurityStateTest, IncognitoErrorPage) { +// Tests that HTTP_SHOW_WARNING is not set for error pages. +TEST(SecurityStateTest, ErrorPage) { TestSecurityStateHelper helper; SecurityInfo security_info; helper.SetUrl(GURL("http://nonexistent.test")); - helper.set_is_incognito(true); helper.set_is_error_page(true); helper.GetSecurityInfo(&security_info); EXPECT_EQ(SecurityLevel::NONE, security_info.security_level); - EXPECT_FALSE(security_info.incognito_downgraded_security_level); // Sanity-check that if it's not an error page, the security level is // downgraded. @@ -649,83 +573,6 @@ EXPECT_EQ(SecurityLevel::HTTP_SHOW_WARNING, security_info.security_level); } -// Tests that HTTP_SHOW_WARNING is set on normal http pages but DANGEROUS on -// form edits when the default feature configuration is enabled. -TEST(SecurityStateTest, WarningAndDangerousOnFormEdits) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - security_state::features::kMarkHttpAsFeature); - - TestSecurityStateHelper helper; - helper.SetUrl(GURL(kHttpUrl)); - - { - SecurityInfo security_info; - helper.GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - } - - { - SecurityInfo security_info; - helper.set_insecure_field_edit(true); - helper.GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::DANGEROUS, security_info.security_level); - } - - { - SecurityInfo security_info; - helper.set_insecure_field_edit(false); - helper.set_password_field_shown(true); - helper.GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - } -} - -// Tests that HTTP_SHOW_WARNING is set on normal http pages but DANGEROUS on -// sensitive fields when the -// 'warning-and-dangerous-on-passwords-and-credit-cards' field trial -// configuration is enabled. -TEST(SecurityStateTest, WarningAndDangerousOnSensitiveFields) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( - security_state::features::kMarkHttpAsFeature, - {{security_state::features::kMarkHttpAsFeatureParameterName, - security_state::features:: - kMarkHttpAsParameterWarningAndDangerousOnPasswordsAndCreditCards}}); - - TestSecurityStateHelper helper; - helper.SetUrl(GURL(kHttpUrl)); - - { - SecurityInfo security_info; - helper.GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - } - - { - SecurityInfo security_info; - helper.set_insecure_field_edit(true); - helper.GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); - } - - { - SecurityInfo security_info; - helper.set_insecure_field_edit(false); - helper.set_password_field_shown(true); - helper.GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::DANGEROUS, security_info.security_level); - } - - { - SecurityInfo security_info; - helper.set_password_field_shown(false); - helper.set_credit_card_field_edited(true); - helper.GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::DANGEROUS, security_info.security_level); - } -} - // Tests that the billing status is set, and it overrides valid HTTPS. TEST(SecurityStateTest, BillingOverridesValidHTTPS) { TestSecurityStateHelper helper;
diff --git a/components/security_state_strings.grdp b/components/security_state_strings.grdp index b649d6f6..75f1f9f 100644 --- a/components/security_state_strings.grdp +++ b/components/security_state_strings.grdp
@@ -1,18 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <grit-part> <!-- Strings describing Chrome security policy for DevTools security panel --> - <message name="IDS_PRIVATE_USER_DATA_INPUT" desc="Summary phrase for a security problem where the site collects private user data on an insecure page." translateable="false"> - Private user data input - </message> - <message name="IDS_PRIVATE_USER_DATA_INPUT_DESCRIPTION" desc="Description of a security problem where the site collects private user data on an insecure page, which results in an omnibox warning." translateable="false"> - This page includes a password or credit card input over HTTP. A warning has been added to the URL bar. - </message> - <message name="IDS_INCOGNITO_NONSECURE" desc="Summary phrase for a security problem where the site is non-secure (HTTP) and the user is browsing Incognito." translateable="false"> - Non-secure page loaded in incognito mode - </message> - <message name="IDS_INCOGNITO_NONSECURE_DESCRIPTION" desc="Description of a security problem where the site is non-secure (HTTP) and the user is browsing Incognito, which results in an omnibox warning." translateable="false"> - This page was loaded non-securely in an incognito window. A warning has been added to the URL bar. - </message> <message name="IDS_EDITED_NONSECURE_SUMMARY" desc="Main summary for an HTTP page where a user has entered data in a form field." translateable="false"> This page is insecure (unencrypted HTTP). </message>
diff --git a/components/signin/core/browser/account_reconcilor_unittest.cc b/components/signin/core/browser/account_reconcilor_unittest.cc index 48d102c..d42fbea 100644 --- a/components/signin/core/browser/account_reconcilor_unittest.cc +++ b/components/signin/core/browser/account_reconcilor_unittest.cc
@@ -353,7 +353,7 @@ &test_signin_client_, &test_url_loader_factory_), #if defined(OS_CHROMEOS) - signin_manager_(&test_signin_client_, &account_tracker_), + signin_manager_(&test_signin_client_, &token_service_, &account_tracker_), #else signin_manager_(&test_signin_client_, &token_service_,
diff --git a/components/signin/core/browser/fake_signin_manager.cc b/components/signin/core/browser/fake_signin_manager.cc index 8013a5e..5a19dca 100644 --- a/components/signin/core/browser/fake_signin_manager.cc +++ b/components/signin/core/browser/fake_signin_manager.cc
@@ -14,9 +14,11 @@ FakeSigninManagerBase::FakeSigninManagerBase( SigninClient* client, + ProfileOAuth2TokenService* token_service, AccountTrackerService* account_tracker_service, SigninErrorController* signin_error_controller) : SigninManagerBase(client, + token_service, account_tracker_service, signin_error_controller) {}
diff --git a/components/signin/core/browser/fake_signin_manager.h b/components/signin/core/browser/fake_signin_manager.h index 33a2af3..1196edd 100644 --- a/components/signin/core/browser/fake_signin_manager.h +++ b/components/signin/core/browser/fake_signin_manager.h
@@ -19,6 +19,7 @@ public: FakeSigninManagerBase( SigninClient* client, + ProfileOAuth2TokenService* token_service, AccountTrackerService* account_tracker_service, SigninErrorController* signin_error_controller = nullptr); ~FakeSigninManagerBase() override;
diff --git a/components/signin/core/browser/signin_manager.cc b/components/signin/core/browser/signin_manager.cc index f3e9f1b1..0602af4 100644 --- a/components/signin/core/browser/signin_manager.cc +++ b/components/signin/core/browser/signin_manager.cc
@@ -33,11 +33,10 @@ SigninErrorController* signin_error_controller, signin::AccountConsistencyMethod account_consistency) : SigninManagerBase(client, + token_service, account_tracker_service, signin_error_controller), type_(SIGNIN_TYPE_NONE), - client_(client), - token_service_(token_service), cookie_manager_service_(cookie_manager_service), account_consistency_(account_consistency), signin_manager_signed_in_(false), @@ -126,7 +125,7 @@ possibly_invalid_email_ = source.possibly_invalid_email_; temp_refresh_token_ = source.temp_refresh_token_; password_ = source.password_; - source.client_->AfterCredentialsCopied(); + source.signin_client()->AfterCredentialsCopied(); } void SigninManager::ClearTransientSigninData() { @@ -175,7 +174,7 @@ signin_metrics::ProfileSignout signout_source_metric, signin_metrics::SignoutDelete signout_delete_metric, RemoveAccountsOption remove_option) { - client_->PreSignOut( + signin_client()->PreSignOut( base::BindOnce(&SigninManager::OnSignoutDecisionReached, base::Unretained(this), signout_source_metric, signout_delete_metric, remove_option), @@ -218,13 +217,14 @@ AccountInfo account_info = GetAuthenticatedAccountInfo(); const std::string account_id = GetAuthenticatedAccountId(); const std::string username = account_info.email; - const base::Time signin_time = base::Time::FromInternalValue( - client_->GetPrefs()->GetInt64(prefs::kSignedInTime)); + const base::Time signin_time = + base::Time::FromDeltaSinceWindowsEpoch(base::TimeDelta::FromMicroseconds( + signin_client()->GetPrefs()->GetInt64(prefs::kSignedInTime))); ClearAuthenticatedAccountId(); - client_->GetPrefs()->ClearPref(prefs::kGoogleServicesHostedDomain); - client_->GetPrefs()->ClearPref(prefs::kGoogleServicesAccountId); - client_->GetPrefs()->ClearPref(prefs::kGoogleServicesUserAccountId); - client_->GetPrefs()->ClearPref(prefs::kSignedInTime); + signin_client()->GetPrefs()->ClearPref(prefs::kGoogleServicesHostedDomain); + signin_client()->GetPrefs()->ClearPref(prefs::kGoogleServicesAccountId); + signin_client()->GetPrefs()->ClearPref(prefs::kGoogleServicesUserAccountId); + signin_client()->GetPrefs()->ClearPref(prefs::kSignedInTime); // Determine the duration the user was logged in and log that to UMA. if (!signin_time.is_null()) { @@ -240,13 +240,13 @@ case RemoveAccountsOption::kRemoveAllAccounts: VLOG(0) << "Revoking all refresh tokens on server. Reason: sign out, " << "IsSigninAllowed: " << IsSigninAllowed(); - token_service_->RevokeAllCredentials( + token_service()->RevokeAllCredentials( signin_metrics::SourceForRefreshTokenOperation:: kSigninManager_ClearPrimaryAccount); break; case RemoveAccountsOption::kRemoveAuthenticatedAccountIfInError: - if (token_service_->RefreshTokenHasError(account_id)) - token_service_->RevokeCredentials( + if (token_service()->RefreshTokenHasError(account_id)) + token_service()->RevokeCredentials( account_id, signin_metrics::SourceForRefreshTokenOperation:: kSigninManager_ClearPrimaryAccount); break; @@ -258,9 +258,8 @@ FireGoogleSignedOut(account_info); } -void SigninManager::Initialize(PrefService* local_state) { - SigninManagerBase::Initialize(local_state); - +void SigninManager::FinalizeInitBeforeLoadingRefreshTokens( + PrefService* local_state) { // local_state can be null during unit tests. if (local_state) { local_state_pref_registrar_.Init(local_state); @@ -269,12 +268,12 @@ base::Bind(&SigninManager::OnGoogleServicesUsernamePatternChanged, weak_pointer_factory_.GetWeakPtr())); } - signin_allowed_.Init(prefs::kSigninAllowed, client_->GetPrefs(), + signin_allowed_.Init(prefs::kSigninAllowed, signin_client()->GetPrefs(), base::Bind(&SigninManager::OnSigninAllowedPrefChanged, base::Unretained(this))); std::string account_id = - client_->GetPrefs()->GetString(prefs::kGoogleServicesAccountId); + signin_client()->GetPrefs()->GetString(prefs::kGoogleServicesAccountId); std::string user = account_id.empty() ? std::string() : account_tracker_service()->GetAccountInfo(account_id).email; if (!account_id.empty() && (!IsAllowedUsername(user) || !IsSigninAllowed())) { @@ -303,12 +302,11 @@ // It is important to only load credentials after starting to observe the // token service. - token_service_->AddObserver(this); - token_service_->LoadCredentials(GetAuthenticatedAccountId()); + token_service()->AddObserver(this); } void SigninManager::Shutdown() { - token_service_->RemoveObserver(this); + token_service()->RemoveObserver(this); account_tracker_service()->RemoveObserver(this); local_state_pref_registrar_.RemoveAll(); SigninManagerBase::Shutdown(); @@ -389,7 +387,7 @@ if (!temp_refresh_token_.empty()) { std::string account_id = GetAuthenticatedAccountId(); - token_service_->UpdateCredentials( + token_service()->UpdateCredentials( account_id, temp_refresh_token_, signin_metrics::SourceForRefreshTokenOperation:: kSigninManager_LegacyPreDiceSigninFlow); @@ -412,8 +410,9 @@ void SigninManager::OnSignedIn() { bool reauth_in_progress = IsAuthenticated(); - client_->GetPrefs()->SetInt64(prefs::kSignedInTime, - base::Time::Now().ToInternalValue()); + signin_client()->GetPrefs()->SetInt64( + prefs::kSignedInTime, + base::Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds()); SetAuthenticatedAccountInfo(possibly_invalid_gaia_id_, possibly_invalid_email_); @@ -427,8 +426,8 @@ if (!reauth_in_progress) FireGoogleSigninSucceeded(); - signin_metrics::LogSigninProfile(client_->IsFirstRun(), - client_->GetInstallDate()); + signin_metrics::LogSigninProfile(signin_client()->IsFirstRun(), + signin_client()->GetInstallDate()); PostSignedIn(); } @@ -451,8 +450,8 @@ if (!signin_manager_signed_in_ || !user_info_fetched_by_account_tracker_) return; - client_->PostSignedIn(GetAuthenticatedAccountId(), - GetAuthenticatedAccountInfo().email, password_); + signin_client()->PostSignedIn(GetAuthenticatedAccountId(), + GetAuthenticatedAccountInfo().email, password_); password_.clear(); } @@ -470,7 +469,7 @@ } void SigninManager::OnRefreshTokensLoaded() { - token_service_->RemoveObserver(this); + token_service()->RemoveObserver(this); if (account_tracker_service()->GetMigrationState() == AccountTrackerService::MIGRATION_IN_PROGRESS) { @@ -478,12 +477,12 @@ } // Remove account information from the account tracker service if needed. - if (token_service_->HasLoadCredentialsFinishedWithNoErrors()) { + if (token_service()->HasLoadCredentialsFinishedWithNoErrors()) { std::vector<AccountInfo> accounts_in_tracker_service = account_tracker_service()->GetAccounts(); for (const auto& account : accounts_in_tracker_service) { if (GetAuthenticatedAccountId() != account.account_id && - !token_service_->RefreshTokenIsAvailable(account.account_id)) { + !token_service()->RefreshTokenIsAvailable(account.account_id)) { DVLOG(0) << "Removed account from account tracker service: " << account.account_id; account_tracker_service()->RemoveAccount(account.account_id);
diff --git a/components/signin/core/browser/signin_manager.h b/components/signin/core/browser/signin_manager.h index 83682f78..d91d8b1 100644 --- a/components/signin/core/browser/signin_manager.h +++ b/components/signin/core/browser/signin_manager.h
@@ -48,8 +48,6 @@ class GaiaCookieManagerService; class GoogleServiceAuthError; class PrefService; -class ProfileOAuth2TokenService; -class SigninClient; class SigninErrorController; namespace identity { @@ -143,7 +141,9 @@ // On platforms where SigninManager is responsible for dealing with // invalid username policy updates, we need to check this during // initialization and sign the user out. - void Initialize(PrefService* local_state) override; + void FinalizeInitBeforeLoadingRefreshTokens( + PrefService* local_state) override; + void Shutdown() override; // If applicable, merge the signed in account into the cookie jar. @@ -268,14 +268,6 @@ // token service so that it does not need to mint new ones. std::string temp_refresh_token_; - // The SigninClient object associated with this object. Must outlive this - // object. - SigninClient* client_; - - // The ProfileOAuth2TokenService instance associated with this object. Must - // outlive this object. - ProfileOAuth2TokenService* token_service_; - // Object used to use the token to push a GAIA cookie into the cookie jar. GaiaCookieManagerService* cookie_manager_service_;
diff --git a/components/signin/core/browser/signin_manager_base.cc b/components/signin/core/browser/signin_manager_base.cc index 85fb881..6dde0dd 100644 --- a/components/signin/core/browser/signin_manager_base.cc +++ b/components/signin/core/browser/signin_manager_base.cc
@@ -16,6 +16,7 @@ #include "components/prefs/pref_service.h" #include "components/signin/core/browser/account_info.h" #include "components/signin/core/browser/account_tracker_service.h" +#include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_client.h" #include "components/signin/core/browser/signin_error_controller.h" #include "components/signin/core/browser/signin_pref_names.h" @@ -26,9 +27,11 @@ SigninManagerBase::SigninManagerBase( SigninClient* client, + ProfileOAuth2TokenService* token_service, AccountTrackerService* account_tracker_service, SigninErrorController* signin_error_controller) : client_(client), + token_service_(token_service), account_tracker_service_(account_tracker_service), signin_error_controller_(signin_error_controller), initialized_(false), @@ -148,8 +151,13 @@ } SetAuthenticatedAccountId(account_id); } + FinalizeInitBeforeLoadingRefreshTokens(local_state); + token_service()->LoadCredentials(GetAuthenticatedAccountId()); } +void SigninManagerBase::FinalizeInitBeforeLoadingRefreshTokens( + PrefService* local_state) {} + bool SigninManagerBase::IsInitialized() const { return initialized_; } bool SigninManagerBase::IsSigninAllowed() const {
diff --git a/components/signin/core/browser/signin_manager_base.h b/components/signin/core/browser/signin_manager_base.h index 89365f6a..6dc0895 100644 --- a/components/signin/core/browser/signin_manager_base.h +++ b/components/signin/core/browser/signin_manager_base.h
@@ -41,6 +41,7 @@ class AccountTrackerService; class PrefRegistrySimple; class PrefService; +class ProfileOAuth2TokenService; class SigninClient; class SigninErrorController; @@ -95,6 +96,7 @@ private: #endif SigninManagerBase(SigninClient* client, + ProfileOAuth2TokenService* token_service, AccountTrackerService* account_tracker_service, SigninErrorController* signin_error_controller); #if !defined(OS_CHROMEOS) @@ -110,7 +112,7 @@ static void RegisterPrefs(PrefRegistrySimple* registry); // If user was signed in, load tokens from DB if available. - virtual void Initialize(PrefService* local_state); + void Initialize(PrefService* local_state); bool IsInitialized() const; // Returns true if a signin to Chrome is allowed (by policy or pref). @@ -157,6 +159,8 @@ // Gives access to the SigninClient instance associated with this instance. SigninClient* signin_client() const { return client_; } + ProfileOAuth2TokenService* token_service() const { return token_service_; } + // Adds a callback that will be called when this instance is shut down.Not // intended for general usage, but rather for usage only by the Identity // Service implementation during the time period of conversion of Chrome to @@ -171,6 +175,10 @@ return account_tracker_service_; } + // Invoked at the end of |Initialize| before the refresh token for the primary + // account is loaded. + virtual void FinalizeInitBeforeLoadingRefreshTokens(PrefService* local_state); + // Sets the authenticated user's account id. // If the user is already authenticated with the same account id, then this // method is a no-op. @@ -200,6 +208,11 @@ friend class SigninManager; SigninClient* client_; + + // The ProfileOAuth2TokenService instance associated with this object. Must + // outlive this object. + ProfileOAuth2TokenService* token_service_; + AccountTrackerService* account_tracker_service_; SigninErrorController* signin_error_controller_; bool initialized_;
diff --git a/components/signin/core/browser/signin_tracker_unittest.cc b/components/signin/core/browser/signin_tracker_unittest.cc index 87a6d5c8..e897771 100644 --- a/components/signin/core/browser/signin_tracker_unittest.cc +++ b/components/signin/core/browser/signin_tracker_unittest.cc
@@ -56,7 +56,9 @@ &signin_client_, &test_url_loader_factory_), #if defined(OS_CHROMEOS) - fake_signin_manager_(&signin_client_, &account_tracker_) { + fake_signin_manager_(&signin_client_, + &fake_oauth2_token_service_, + &account_tracker_) { #else fake_signin_manager_(&signin_client_, &fake_oauth2_token_service_,
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 808bab9..64ae93d 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">ያልታወቀ ስም</translation> <translation id="1050038467049342496">ሌሎች መተግበሪያዎችን ይዝጉ</translation> <translation id="1055184225775184556">&አክልን ቀልብስ</translation> +<translation id="1058479211578257048">ካርዶችን በማቀመጥ ላይ...</translation> <translation id="10614374240317010">በጭራሽ አልተቀመጠም</translation> <translation id="1066396345355680611">ከ<ph name="SITE" /> እና ሌሎች አንዳንድ ጣቢያዎች የመጣ ጥበቃ የሚደረግለት የይዘት መዳረሻ ሊያጡ ይችላሉ።</translation> <translation id="106701514854093668">የዴስክቶፕ ዕልባቶች</translation> @@ -530,6 +531,7 @@ <translation id="4358461427845829800">የመክፈያ ዘዴዎችን ያቀናብሩ...</translation> <translation id="4372948949327679948">የተጠበቀው የ<ph name="VALUE_TYPE" /> ዋጋ ነው።</translation> <translation id="4377125064752653719"><ph name="DOMAIN" />ን ለመድረስ ሞክረዋል፣ ነገር ግን አገልጋዩ ያቀረበው የእውቅና ማረጋገጫ በሰጪው ተሽሯል። ይህ ማለት አገልጋዩ ያቀረበው የደህንነት ምስክርነቶች ፈጽሞ ሊታመኑ አይገባም። ከአጥቂ ጋር እየተገናኙ ሊሆን ይችላል።</translation> +<translation id="4378154925671717803">ስልክ</translation> <translation id="4406896451731180161">የፍለጋ ውጤቶች</translation> <translation id="4408413947728134509">ኩኪዎች <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">የመውሰጃ አድራሻ</translation> @@ -602,6 +604,7 @@ <translation id="4989163558385430922">ሁሉንም ይመልከቱ</translation> <translation id="4989809363548539747">ይህ ተሰኪ አይደገፍም</translation> <translation id="5002932099480077015">የነቃ እንደሆነ Chrome ለበለጠ ፈጣን ቅጽ አሞላል ሲባል በዚህ መሳሪያ ላይ ያለው የካርድዎን ቅጂ ያከማቻል።</translation> +<translation id="5014174725590676422">በChrome ውስጥ Google ረዳት የመጀመሪያ ማሄድ ማያ ገጽ ይታያል</translation> <translation id="5015510746216210676">የማሽን ስም፦</translation> <translation id="5018422839182700155">ይህን ገጽ መክፈት አልተቻለም</translation> <translation id="5019198164206649151">የመጠባበቂያ ማከማቻ በመጥፎ ሁኔታ ላይ</translation> @@ -713,6 +716,7 @@ <translation id="5720705177508910913">የአሁኑ ተጠቃሚ</translation> <translation id="5730040223043577876">Chrome የእርስዎን ይለፍ ቃል በሌሎች ጣቢያዎች ላይ ዳግም ከተጠቀሙበት እንደገና እንዲያዋቅሩት ይመክራል።</translation> <translation id="5732392974455271431">የእርስዎ ወላጆች እገዳውን ሊያነሱልዎ ይችላሉ</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{ካርድ በGoogle መለያዎ ውስጥ ያስቀምጡ}one{ካርዶችን ወደ የእርስዎ የGoogle መለያ ያስቀምጡ}other{ካርዶችን ወደ የእርስዎ የGoogle መለያ ያስቀምጡ}}</translation> <translation id="5763042198335101085">ትክክለኛ የኢሜይል አድራሻ ያስገቡ</translation> <translation id="5765072501007116331">የማድረሻ ዘዴዎችን እና መስፈርቶችን ለመመልከት አድራሻ ይምረጡ</translation> <translation id="5770114862687765385">ፋይሉ የተበላሸ ይመስላል። ክፍለ-ጊዜውን ዳግም ለማስጀመር የ«ዳግም አዝራር» አዝራሩን ጠቅ ያድርጉት።</translation> @@ -1194,6 +1198,7 @@ <translation id="9080712759204168376">የትዕዛዝ ማጠቃለያ</translation> <translation id="9103872766612412690"><ph name="SITE" /> የእርስዎን መረጃ ለመጠበቅ በመደበኝነት ምስጠራን ይጠቀማል። Chromium አሁን ከ<ph name="SITE" /> ጋር ለመገናኘት ሲሞክር ድር ጣቢያው ያልተለመዱ እና ትክክል ያልሆኑ ምስክርነቶችን መልሷል። ይህ አንድ አጥቂ <ph name="SITE" />ን አስመስሎ ለመቅረብ ሲሞክር ነው ወይም አንድ የWi-Fi መግቢያ ገጽ ግንኙነቱን ሲቋረጥ ሊከሰት ይችላል። Chromium ማንኛውም የውሂብ ልውውጥ ከመካሄዱ በፊት ግንኙነቱን ስላቋረጠው አሁንም የእርስዎ መረጃ ደህንነት የተጠበቀ ነው።</translation> <translation id="9106062320799175032">የመክፈያ አድራሻ ያክሉ</translation> +<translation id="9110718169272311511">በChrome ውስጥ Google ረዳት ከማያ ገጹ ግርጌ አጠገብ ይታያል</translation> <translation id="9114524666733003316">ካርድን በማረጋገጥ ላይ...</translation> <translation id="9128870381267983090">ከአውታረ መረብ ጋር ይገናኙ</translation> <translation id="9137013805542155359">የመጀመሪያውን አሳይ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 2276a3b..a472161 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">اسم غير معروف</translation> <translation id="1050038467049342496">إغلاق التطبيقات الأخرى</translation> <translation id="1055184225775184556">تراجع عن الإ&ضافة</translation> +<translation id="1058479211578257048">جارٍ حفظ البطاقات...</translation> <translation id="10614374240317010">لم يتم الحفظ مطلقًا</translation> <translation id="1066396345355680611">قد تفقد إمكانية الوصول إلى محتوى محمي من <ph name="SITE" /> وبعض المواقع الأخرى.</translation> <translation id="106701514854093668">الإشارات المرجعية على سطح المكتب</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">إدارة طرق الدفع...</translation> <translation id="4372948949327679948">القيمة <ph name="VALUE_TYPE" /> المتوقعة.</translation> <translation id="4377125064752653719">لقد حاولت الوصول إلى <ph name="DOMAIN" />، ولكن جهة إصدار الشهادة التي قدمها الخادم قد أبطلت الشهادة. وهذا يعني أن بيانات اعتماد الأمان التي قدمها الخادم يجب عدم الوثوق بها مطلقًا. فقد تكون على اتصال بأحد المهاجمين.</translation> +<translation id="4378154925671717803">هاتف</translation> <translation id="4406896451731180161">نتائج البحث</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> من ملفات تعريف الارتباط</translation> <translation id="4415426530740016218">عنوان الاستلام</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">عرض الكل</translation> <translation id="4989809363548539747">هذا المكوِّن الإضافي غير مدعوم</translation> <translation id="5002932099480077015">إذا تم التمكين، سيخزن Chrome نسخة من بطاقتك على هذا الجهاز لملء النموذج بشكل أسرع.</translation> +<translation id="5014174725590676422">يتم عرض شاشة التشغيل الأولى "لمساعد Google" على Chrome</translation> <translation id="5015510746216210676">اسم الجهاز:</translation> <translation id="5018422839182700155">يتعذّر فتح هذه الصفحة</translation> <translation id="5019198164206649151">التخزين المساعد في حالة سيئة</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">المستخدم الحالي</translation> <translation id="5730040223043577876">يُوصي Chrome بإعادة تحديد كلمة المرور في حال إعادة استخدامها في مواقع ويب أخرى.</translation> <translation id="5732392974455271431">يمكن لوالديك إلغاء الحظر لك</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{حفظ بطاقة واحدة في حسابك على Google}zero{حفظ بطاقات في حسابك على Google}two{حفظ بطاقتين في حسابك على Google}few{حفظ بطاقات في حسابك على Google}many{حفظ بطاقات في حسابك على Google}other{حفظ بطاقات في حسابك على Google}}</translation> <translation id="5763042198335101085">أدخِل عنوان بريد إلكتروني صحيحًا</translation> <translation id="5765072501007116331">لعرض طرق التسليم ومتطلباته، حدِّد عنوانًا</translation> <translation id="5770114862687765385">يبدو أن الملف تالف. انقر على الزر "إعادة تعيين" لإعادة تعيين الجلسة.</translation> @@ -1195,6 +1199,7 @@ <translation id="9080712759204168376">ملخص الطلبات</translation> <translation id="9103872766612412690">يستخدم <ph name="SITE" /> التشفير عادة لحماية معلوماتك. عندما حاول Chromium الاتصال بموقع <ph name="SITE" /> هذه المرة، أرجَع موقع الويب بيانات اعتماد غير عادية وغير صحيحة. وقد يحدث هذا عندما يحاول أحد المهاجمين التظاهر بأنه موقع <ph name="SITE" />، أو إذا قاطعت شاشة تسجيل دخول Wi-Fi الاتصال. ولكن لا تزال معلوماتك آمنة نظرًا لأن Chromium أوقَفَ الاتصال قبل تبادل أي بيانات.</translation> <translation id="9106062320799175032">إضافة عنوان إرسال الفواتير</translation> +<translation id="9110718169272311511">يتوفَّر "مساعد Google" على Chrome بالقرب من أسفل الشاشة</translation> <translation id="9114524666733003316">جارٍ التحقق من البطاقة...</translation> <translation id="9128870381267983090">الاتصال بالشبكة</translation> <translation id="9137013805542155359">إظهار الصفحة الأصلية</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index ccd686c2..4ea95733 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Управление на начините на плащане...</translation> <translation id="4372948949327679948">Очаквана е стойност от тип <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Направихте опит да се свържете с/ъс <ph name="DOMAIN" />, но сървърът предoстави сертификат, анулиран от издателя си. Това означава, че в никакъв случай не трябва да се доверявате на представените от сървъра идентификационни данни за сигурност. Възможно е да сте се свързали с извършител на атака.</translation> +<translation id="4378154925671717803">Телефон</translation> <translation id="4406896451731180161">резултата от търсенето</translation> <translation id="4408413947728134509">„Бисквитки“ <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Адрес за вземане</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 1436d71..ddb8531e 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">অজানা নাম</translation> <translation id="1050038467049342496">অন্যান্য অ্যাপ্লিকেশানগুলি বন্ধ করুন</translation> <translation id="1055184225775184556">&যোগ করাকে পূর্বাবস্থায় ফেরান</translation> +<translation id="1058479211578257048">কার্ড সেভ করা হচ্ছে...</translation> <translation id="10614374240317010">কখনও সংরক্ষিত হয়নি</translation> <translation id="1066396345355680611">আপনি <ph name="SITE" /> এবং অন্যান্য সাইট থেকে প্রিমিয়াম কন্টেন্টে অ্যাক্সেস হারাতে পারেন।</translation> <translation id="106701514854093668">ডেস্কটপ বুকমার্ক</translation> @@ -532,6 +533,7 @@ <translation id="4358461427845829800">পেমেন্ট পদ্ধতিগুলি পরিচালনা করুন...</translation> <translation id="4372948949327679948">প্রত্যাশিত <ph name="VALUE_TYPE" /> মান৷</translation> <translation id="4377125064752653719">আপনি <ph name="DOMAIN" />-এ পৌঁছানোর প্রচেষ্টা করেছেন, তবে সার্ভারটি যে শংসাপত্রটি উপস্থাপন করেছে সেটির জারিকর্তা সেটিকে প্রত্যাহার করেছে৷ এর অর্থ হ'ল সার্ভারটি যে সুরক্ষা প্রমানপত্র উপস্থাপন করেছে তা কোনওমতেই বিশ্বাসযোগ্য নয়৷ হতে পারে আপনি একজন আক্রমণকারীর সাথে যোগাযোগ করছেন৷</translation> +<translation id="4378154925671717803">ফোন</translation> <translation id="4406896451731180161">সার্চের ফলাফলগুলি</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" />টি কুকিজ</translation> <translation id="4415426530740016218">পিক-আপের ঠিকানা</translation> @@ -604,6 +606,7 @@ <translation id="4989163558385430922">সবগুলি দেখুন</translation> <translation id="4989809363548539747">এই প্লাগ ইন সমর্থিত নয়</translation> <translation id="5002932099480077015">সক্রিয় করা হলে, ফর্ম পূরনের কাজ দ্রুত করতে Chrome এই ডিভাইসে আপনার কার্ডের একটি প্রতিলিপি সংরক্ষণ করবে।</translation> +<translation id="5014174725590676422">Chrome প্রথমবার চালানোর সময়ে Google অ্যাসিস্ট্যান্ট কীভাবে কাজ করবে তা দেখানো হয়েছে</translation> <translation id="5015510746216210676">মেশিনের নাম:</translation> <translation id="5018422839182700155">এই পৃষ্ঠাটি খোলা যাচ্ছে না</translation> <translation id="5019198164206649151">ব্যাকিং স্টোরটি ত্রুটিপূর্ণ অবস্থায় আছে</translation> @@ -657,7 +660,7 @@ <translation id="5344579389779391559">এই পৃষ্ঠাতে আপনাকে চার্জ করা হতে পারে</translation> <translation id="5355557959165512791">ওয়েবসাইটটির শংসাপত্র তুলে নেওয়ার কারণে আপনি এখন <ph name="SITE" /> এ যেতে পারবেন না। নেটওয়ার্ক ত্রুটি এবং আক্রমণ সাধারণত সাময়িকভাবে হয়, তাই এই পৃষ্ঠাটি সম্ভবত পরে কাজ করবে।</translation> <translation id="536296301121032821">নীতি সেটিংস সংরক্ষণ করতে ব্যর্থ হয়েছে</translation> -<translation id="5363056109122666249">আপনি সাইন-ইন করে আছেন তাই Chrome আপনার কার্ডগুলি Google অ্যাকাউন্টে সেভ করার পরামর্শ দিচ্ছে। আপনি সেটিংস থেকে এই আচরণটি পরিবর্তন করতে পারেন।</translation> +<translation id="5363056109122666249">আপনি সাইন-ইন করে আছেন বলে Chrome আপনার কার্ডগুলি Google অ্যাকাউন্টে সেভ করার পরামর্শ দিচ্ছে। আপনি সেটিংস থেকে এই আচরণটি পরিবর্তন করতে পারেন।</translation> <translation id="5371425731340848620">কার্ড আপডেট করুন</translation> <translation id="5377026284221673050">"আপনার ঘড়ি লেটে চলছে" অথবা "আপনার ঘড়ি ফাস্ট আছে" অথবা "<span class="error-code">NET::ERR_CERT_DATE_INVALID</span>"</translation> <translation id="5384855140246857529">সমস্ত ডিভাইসে আপনার কার্ড ব্যবহার করতে, সাইন-ইন করে সিঙ্ক চালু করুন।</translation> @@ -715,6 +718,7 @@ <translation id="5720705177508910913">বর্তমান ব্যবহারকারী</translation> <translation id="5730040223043577876">Chrome-এর নীতি অনুযায়ী আপনার পাসওয়ার্ড বদলে ফেলা উচিত যদি আপনি সেটি অন্য কোনও সাইটে ব্যবহার করে থাকেন।</translation> <translation id="5732392974455271431">আপনার পিতামাতা এটি আপনার জন্য অবরোধ মুক্ত করতে পারবেন</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Google অ্যাকাউন্টে কার্ড সেভ করুন}one{Google অ্যাকাউন্টে কার্ড সেভ করুন}other{Google অ্যাকাউন্টে কার্ড সেভ করুন}}</translation> <translation id="5763042198335101085">একটি সঠিক ইমেল আইডি লিখুন</translation> <translation id="5765072501007116331">ডেলিভারির পদ্ধতি এবং প্রয়োজনীয়তাগুলি দেখতে একটি ঠিকানা বেছে নিন</translation> <translation id="5770114862687765385">ফাইলটি ত্রুটিপূর্ণ বলে মনে হচ্ছে। সেশনটি রিসেট করার জন্য 'রিসেট' বোতামে ক্লিক করুন।</translation> @@ -878,7 +882,7 @@ <translation id="7016992613359344582">এই চার্জটি একবার করা হতে পারে অথবা বারবার করা হতে পারে এবং স্পষ্টভাবে তথ্য নাও থাকতে পারে।</translation> <translation id="7029809446516969842">পাসওয়ার্ড</translation> <translation id="7050187094878475250">আমি <ph name="DOMAIN" />-এ সংযোগ করার চেষ্টা করেছেন, কিন্তু সার্ভার একটি শংসাপত্র উপস্থাপন করেছে যার বৈধতার সময়সীমা এত বেশী যে বিশ্বাসযোগ্য নয়।</translation> -<translation id="705310974202322020">{NUM_CARDS,plural, =1{এই কার্ডটি এই মুহূর্তে সেভ করা যাবে না}one{এই কার্ডগুলি এই মুহূর্তে সেভ করা যাবে না}other{এই কার্ডগুলি এই মুহূর্তে সেভ করা যাবে না}}</translation> +<translation id="705310974202322020">{NUM_CARDS,plural, =1{এই মুহূর্তে কার্ডটি সেভ করা যাবে না}one{এই মুহূর্তে কার্ডগুলি সেভ করা যাবে না}other{এই মুহূর্তে কার্ডগুলি সেভ করা যাবে না}}</translation> <translation id="7053983685419859001">ব্লক করুন</translation> <translation id="7064851114919012435">পরিচিতি তথ্য</translation> <translation id="7079718277001814089">এই সাইটে মালওয়ের আছে</translation> @@ -949,7 +953,7 @@ <translation id="7451311239929941790">এই সমস্যা সম্পর্কে <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" />।</translation> <translation id="7453467225369441013">বেশিরভাগ সাইট থেকে আপনাকে সাইন-আউট করিয়ে দেয়। তবে আপনার Google অ্যাকাউন্ট থেকে আপনাকে সাইন-আউট করানো হবে না।</translation> <translation id="7455133967321480974">বিশ্বব্যাপী ডিফল্ট ব্যবহার করুন (অবরোধ করুন)</translation> -<translation id="7460618730930299168">আপনি যা বেছে নিয়েছেন তার থেকে স্ক্রিনিংটি আলাদা। চালিয়ে যাবেন?</translation> +<translation id="7460618730930299168">আপনি যা বেছে নিয়েছেন তার থেকে স্ক্রিনিংটি আলাদা। এগিয়ে যাবেন?</translation> <translation id="7473891865547856676">না থাক</translation> <translation id="7481312909269577407">ফরওয়ার্ড</translation> <translation id="7485870689360869515">কোনো ডেটা পাওয়া যায়নি৷</translation> @@ -989,7 +993,7 @@ <translation id="7681101578153515023">সার্চ ইঞ্জিন পরিবর্তন করুন</translation> <translation id="7682287625158474539">শিপিং</translation> <translation id="7687186412095877299">আপনার সেভ করা পেমেন্ট পদ্ধতি দিয়ে পেমেন্ট ফর্ম পূরণ করে</translation> -<translation id="769721561045429135">এই মুহূর্তে, আপনার কাছে কার্ড রয়েছে যা শুধুমাত্র এই ডিভাইসে ব্যবহার করা যেতে পারে। কার্ডগুলির পর্যালোচনা চালিয়ে যেতে ক্লিক করুন।</translation> +<translation id="769721561045429135">এই মুহূর্তে, আপনার কাছে থাকা কার্ডগুলি শুধুমাত্র এই ডিভাইসে ব্যবহার করা যেতে পারে। কার্ডগুলির পর্যালোচনা চালিয়ে যেতে ক্লিক করুন।</translation> <translation id="7699293099605015246">নিবন্ধ এখন পাওয়া যাবে না</translation> <translation id="7701040980221191251">কিছুই নয়</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> এ এগিয়ে যান (নিরাপদ নয়) <ph name="END_LINK" /></translation> @@ -1055,7 +1059,7 @@ <translation id="8103161714697287722">পেমেন্টের পদ্ধতি</translation> <translation id="8118489163946903409">পেমেন্টের পদ্ধতি</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" আপনার কম্পিউটার বা নেটওয়ার্কে সঠিক ভাবে ইনস্টল করা হয়নি। আপনার IT প্রশাসককে এই সমস্যাটি সমাধান করতে বলুন।</translation> -<translation id="8130693978878176684">আমি আর সাহায্য করতে পারব না, ম্যানুয়ালি চালিয়ে যান।</translation> +<translation id="8130693978878176684">আমি আর সাহায্য করতে পারব না, নিজের মতো করে এগিয়ে যান।</translation> <translation id="8131740175452115882">নিশ্চিত হন</translation> <translation id="8149426793427495338">আপনার কম্পিউটারটি নিদ্রা মোডে গিয়েছে।</translation> <translation id="8150722005171944719"><ph name="URL" />এ ফাইলটি পাঠযোগ্য নয়৷ এটা মুছে ফেলা হয়েছে পারে, সরিয়ে দেওয়া হয়েছে, অথবা ফাইল অনুমতি প্রবেশাধিকার প্রতিরোধ করতে পারে৷</translation> @@ -1194,6 +1198,7 @@ <translation id="9080712759204168376">অর্ডারের সারসংক্ষেপ</translation> <translation id="9103872766612412690"><ph name="SITE" /> সাধারণত আপনার তথ্য সুরক্ষিত রাখতে এনক্রিপশান ব্যবহার করে। এইবার যখন Chromium <ph name="SITE" /> এর সাথে সংযোগ স্থাপন করার চেষ্টা করেছে, তখন ওয়েবসাইটটি অস্বাভাবিক এবং ভুল শংসাপত্র পাঠিয়েছে। হয় একজন আক্রমণকারী <ph name="SITE" /> হওয়ার ভান করছে, অথবা একটি ওয়াই-ফাই প্রবেশ করুন স্ক্রীণ সংযোগকে বাধাপ্রদান করেছে। আপনার তথ্য এখনো নিরাপদ আছে কারণ কোনো ডেটা আদানপ্রদানের আগেই Chromium সংযোগটিকে বন্ধ করে দিয়েছে।</translation> <translation id="9106062320799175032">বিলিংয়ের ঠিকানা যোগ করুন</translation> +<translation id="9110718169272311511">Crome-এর নিচের অংশ থেকে Google অ্যাসিস্ট্যান্ট অ্যাক্সেস করা যাবে</translation> <translation id="9114524666733003316">কার্ড নিশ্চিত করা হচ্ছে...</translation> <translation id="9128870381267983090">নেটওয়ার্কে সংযোগ করুন</translation> <translation id="9137013805542155359">প্রকৃত রূপ দেখান</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index eaccbe2..b160c20 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Gestiona les formes de pagament...</translation> <translation id="4372948949327679948">Valor <ph name="VALUE_TYPE" /> esperat.</translation> <translation id="4377125064752653719">Heu provat d'accedir a <ph name="DOMAIN" />, però l'emissor ha revocat el certificat que ha presentat el servidor. Això vol dir que no heu de confiar gens en les credencials de seguretat que ha presentat el servidor. És possible que us estigueu comunicant amb un atacant.</translation> +<translation id="4378154925671717803">Telèfon</translation> <translation id="4406896451731180161">resultats de la cerca</translation> <translation id="4408413947728134509">Galetes <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Adreça de recollida</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 63409f9..3097ae59 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -527,6 +527,7 @@ <translation id="4358461427845829800">Spravovat platební metody...</translation> <translation id="4372948949327679948">Očekávána hodnota <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Pokusili jste se přejít na web <ph name="DOMAIN" />, ale certifikát prezentovaný tímto webem byl vydavatelem certifikátu zrušen. To znamená, že bezpečnostním pověřením, která web prezentoval, nelze zcela důvěřovat. Je možné, že komunikujete s útočníkem.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">výsledky vyhledávání</translation> <translation id="4408413947728134509">Soubory cookie <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Adresa vyzvednutí</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 98a50eb..a2a2f83 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Administrer betalingsmetoder...</translation> <translation id="4372948949327679948">Forventet <ph name="VALUE_TYPE" />-værdi.</translation> <translation id="4377125064752653719">Du har forsøgt at få fat på <ph name="DOMAIN" />, men serverens certifikat er blevet tilbagekaldt af udgiveren. Det betyder, at du bestemt ikke bør have tillid til serverens sikkerhedsoplysninger. Du kommunikerer muligvis med en hacker.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">søgeresultater</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Afhentningsadresse</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 009fb51..678e29b 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -530,6 +530,7 @@ <translation id="4358461427845829800">Zahlungsmethoden verwalten…</translation> <translation id="4372948949327679948">Erwarteter <ph name="VALUE_TYPE" />-Wert</translation> <translation id="4377125064752653719">Sie haben versucht, auf <ph name="DOMAIN" /> zuzugreifen, das vom Server übermittelte Zertifikat wurde jedoch vom entsprechenden Aussteller widerrufen. Das bedeutet, dass die vom Server übermittelten Sicherheitsinformationen nicht vertrauenswürdig sind. Möglicherweise kommunizieren Sie mit einem Hacker.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">Suchergebnisse</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Abholadresse</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index f50634d..a55ad71 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">άγνωστο όνομα</translation> <translation id="1050038467049342496">Κλείστε τις άλλες εφαρμογές</translation> <translation id="1055184225775184556">&Αναίρεση προσθήκης</translation> +<translation id="1058479211578257048">Αποθήκευση καρτών…</translation> <translation id="10614374240317010">Δεν έχει αποθηκευθεί ποτέ</translation> <translation id="1066396345355680611">Ενδέχεται να χάσετε την πρόσβαση σε προστατευμένο περιεχόμενο από τον ιστότοπο <ph name="SITE" /> και ορισμένους άλλους ιστοτόπους.</translation> <translation id="106701514854093668">Σελιδοδείκτες επιτραπέζιου υπολογιστή</translation> @@ -532,6 +533,7 @@ <translation id="4358461427845829800">Διαχείριση τρόπων πληρωμής…</translation> <translation id="4372948949327679948">Αναμενόμενη τιμή <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Προσπαθήσατε να μεταβείτε στον τομέα <ph name="DOMAIN" />, όμως το πιστοποιητικό που παρουσιάστηκε από το διακομιστή ανακλήθηκε από τον εκδότη του. Αυτό σημαίνει ότι τα διαπιστευτήρια ασφαλείας που παρουσιάστηκαν από το διακομιστή δεν πρέπει σε καμία περίπτωση να θεωρηθούν αξιόπιστα. Ενδέχεται να επικοινωνείτε με κάποιον εισβολέα.</translation> +<translation id="4378154925671717803">Τηλέφωνο</translation> <translation id="4406896451731180161">αποτελέσματα αναζήτησης</translation> <translation id="4408413947728134509">Cookie <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Διεύθυνση παραλαβής</translation> @@ -604,6 +606,7 @@ <translation id="4989163558385430922">Εμφάνιση όλων</translation> <translation id="4989809363548539747">Αυτή η προσθήκη δεν υποστηρίζεται</translation> <translation id="5002932099480077015">Εάν ενεργοποιηθεί, το Chrome θα αποθηκεύσει ένα αντίγραφο της κάρτας σας σε αυτήν τη συσκευή για ταχύτερη συμπλήρωση φορμών.</translation> +<translation id="5014174725590676422">Εμφανίζεται ο Βοηθός Google στην η οθόνη πρώτης εκτέλεσης του Chrome</translation> <translation id="5015510746216210676">Όνομα συσκευής:</translation> <translation id="5018422839182700155">Δεν είναι δυνατό το άνοιγμα αυτής της σελίδας</translation> <translation id="5019198164206649151">Η αποθήκευση αντιγράφων ασφαλείας είναι σε κακή κατάσταση</translation> @@ -715,6 +718,7 @@ <translation id="5720705177508910913">Τρέχων χρήστης</translation> <translation id="5730040223043577876">Το Chrome συνιστά την επαναφορά του κωδικού πρόσβασης, εάν τον έχετε χρησιμοποιήσει και σε άλλους ιστοτόπους.</translation> <translation id="5732392974455271431">Οι γονείς σου μπορούν να καταργήσουν τον αποκλεισμό του</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Αποθήκευση κάρτας στον Βοηθό Google}other{Αποθήκευση καρτών στον Βοηθό Google}}</translation> <translation id="5763042198335101085">Εισαγάγετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου</translation> <translation id="5765072501007116331">Για να δείτε τρόπους και απαιτήσεις παράδοσης, επιλέξτε μια διεύθυνση</translation> <translation id="5770114862687765385">Το αρχείο φαίνεται να είναι κατεστραμμένο. Κάντε κλικ στο κουμπί "Επαναφορά" για να επαναφέρετε την περίοδο λειτουργίας.</translation> @@ -1196,6 +1200,7 @@ <translation id="9080712759204168376">Σύνοψη παραγγελίας</translation> <translation id="9103872766612412690">Κανονικά, ο ιστότοπος <ph name="SITE" /> χρησιμοποιεί κρυπτογράφηση για να προστατεύει τα στοιχεία σας. Όταν το Chromium επιχείρησε πρόσφατα να συνδεθεί στο <ph name="SITE" />, ο ιστότοπος ανταποκρίθηκε δημιουργώντας ασυνήθιστα και εσφαλμένα διαπιστευτήρια. Αυτό μπορεί να συμβεί όταν κάποιος εισβολέας προσπαθεί να υποκριθεί ότι είναι ο ιστότοπος <ph name="SITE" /> ή όταν κάποια οθόνη σύνδεσης Wi-Fi έχει διακόψει τη σύνδεσή σας. Τα στοιχεία σας εξακολουθούν να είναι ασφαλή επειδή το Chromium διέκοψε τη σύνδεση πριν από την ανταλλαγή δεδομένων.</translation> <translation id="9106062320799175032">Προσθήκη διεύθυνσης χρέωσης</translation> +<translation id="9110718169272311511">Ο Βοηθός Google στο Chrome είναι διαθέσιμος κοντά στο κάτω μέρος της οθόνης</translation> <translation id="9114524666733003316">Επιβεβαίωση κάρτας…</translation> <translation id="9128870381267983090">Σύνδεση σε δίκτυο</translation> <translation id="9137013805542155359">Εμφάνιση πρωτοτύπου</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 0687310..9df1fc1e 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">unknown name</translation> <translation id="1050038467049342496">Close other apps</translation> <translation id="1055184225775184556">&Undo Add</translation> +<translation id="1058479211578257048">Saving cards...</translation> <translation id="10614374240317010">Never saved</translation> <translation id="1066396345355680611">You may lose access to protected content from <ph name="SITE" /> and some other sites.</translation> <translation id="106701514854093668">Desktop Bookmarks</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">Manage payment methods...</translation> <translation id="4372948949327679948">Expected <ph name="VALUE_TYPE" /> value.</translation> <translation id="4377125064752653719">You attempted to reach <ph name="DOMAIN" />, but the certificate that the server presented has been revoked by its issuer. This means that the security credentials the server presented absolutely should not be trusted. You may be communicating with an attacker.</translation> +<translation id="4378154925671717803">Phone</translation> <translation id="4406896451731180161">search results</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Pickup Address</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">See all</translation> <translation id="4989809363548539747">This plug-in is not supported</translation> <translation id="5002932099480077015">If enabled, Chrome will store a copy of your card on this device for faster form filling.</translation> +<translation id="5014174725590676422">Google Assistant in Chrome first run screen is shown</translation> <translation id="5015510746216210676">Machine Name:</translation> <translation id="5018422839182700155">Can't open this page</translation> <translation id="5019198164206649151">Backing store in bad state</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">Current user</translation> <translation id="5730040223043577876">Chrome recommends resetting your password if you reused it on other sites.</translation> <translation id="5732392974455271431">Your parents can unblock it for you</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Save card in your Google account}other{Save cards in your Google account}}</translation> <translation id="5763042198335101085">Enter a valid email address</translation> <translation id="5765072501007116331">To see delivery methods and requirements, select an address</translation> <translation id="5770114862687765385">The file seems to be corrupted. Click the 'Reset' button to reset the session.</translation> @@ -1194,6 +1198,7 @@ <translation id="9080712759204168376">Order Summary</translation> <translation id="9103872766612412690"><ph name="SITE" /> normally uses encryption to protect your information. When Chromium tried to connect to <ph name="SITE" /> this time, the website sent back unusual and incorrect credentials. This may happen when an attacker is trying to pretend to be <ph name="SITE" />, or a Wi-Fi sign-in screen has interrupted the connection. Your information is still secure because Chromium stopped the connection before any data was exchanged.</translation> <translation id="9106062320799175032">Add Billing Address</translation> +<translation id="9110718169272311511">Google Assistant in Chrome is available near bottom of the screen</translation> <translation id="9114524666733003316">Confirming card...</translation> <translation id="9128870381267983090">Connect to network</translation> <translation id="9137013805542155359">Show original</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index b4ca0a7..b8a74b5d 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -532,6 +532,7 @@ <translation id="4358461427845829800">Administrar formas de pago…</translation> <translation id="4372948949327679948">Valor <ph name="VALUE_TYPE" /> esperado.</translation> <translation id="4377125064752653719">Intentaste acceder a <ph name="DOMAIN" />, pero el emisor anuló el certificado que presentó el servidor. Esto significa que no se debe confiar en absoluto en las credenciales de seguridad que presentó el servidor. Te puedes estar comunicando con un atacante.</translation> +<translation id="4378154925671717803">Teléfono</translation> <translation id="4406896451731180161">resultados de búsqueda</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Dirección de retiro</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index be6aed3f1..a66db53 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Gestiona tus métodos de pago...</translation> <translation id="4372948949327679948">Se esperaba un valor <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Has intentado acceder a <ph name="DOMAIN" />, pero el emisor ha revocado el certificado mostrado por el servidor, lo que significa que las credenciales de seguridad presentadas por el servidor no son de confianza. Es posible que hayas accedido a la página de un atacante.</translation> +<translation id="4378154925671717803">Teléfono</translation> <translation id="4406896451731180161">resultados de la búsqueda</translation> <translation id="4408413947728134509">Cookies: <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Dirección de recogida</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index ea657de5..59978fa 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Halda makseviise …</translation> <translation id="4372948949327679948">Oodatud väärtus: <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Püüdsite jõuda saidile <ph name="DOMAIN" />, kuid sertifikaadi väljaandja on serveri esitatud sertifikaadi tagasi võtnud. See tähendab, et serveri esitatud turvamandaate ei tohiks mingil juhul usaldada. Võimalik, et suhtlete ründajaga.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">otsingutulemused</translation> <translation id="4408413947728134509">Küpsisefailid: <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Kättesaamisaadress</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index fc642b4..1b34ee3 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">مدیریت روشهای پرداخت…</translation> <translation id="4372948949327679948">مقدار مورد انتظار <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">شما سعی در دسترسی به <ph name="DOMAIN" /> را داشتید، اما صادر کننده، گواهی ارائه شده از سوی سرور را باطل کرده است. یعنی اصلاً نباید به اطلاعات کاربری که این سرور ارائه میکند اطمینان کرد. ممکن است شما با مهاجمی در ارتباط باشید.</translation> +<translation id="4378154925671717803">تلفن</translation> <translation id="4406896451731180161">نتایج جستجو</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> کوکی</translation> <translation id="4415426530740016218">نشانی تحویل گرفتن</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 02bcd1aa..0d132d2 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -532,6 +532,7 @@ <translation id="4358461427845829800">Hallinnoi maksutapoja…</translation> <translation id="4372948949327679948">Odotettu <ph name="VALUE_TYPE" />-arvo.</translation> <translation id="4377125064752653719">Yritit yhdistää sivustoon <ph name="DOMAIN" />, mutta varmenteen myöntäjä on kumonnut palvelimen esittämän varmenteen. Palvelimen esittämiin suojaustietoihin ei siis tule luottaa. Saatat olla tekemisissä hakkerin kanssa.</translation> +<translation id="4378154925671717803">Puhelin</translation> <translation id="4406896451731180161">hakutulokset</translation> <translation id="4408413947728134509">Evästeet <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Nouto-osoite</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 3336dbb1..a90c285 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Pamahalaan ang mga paraan ng pagbabayad...</translation> <translation id="4372948949327679948">Inaasahang <ph name="VALUE_TYPE" /> na halaga.</translation> <translation id="4377125064752653719">Tinangka mong maabot ang <ph name="DOMAIN" />, subalit ang certificate na ipinakita ng server ay binawi ng nagbigay nito. Nangangahulugan ito na ang mga kredensyal sa seguridad na ipinakita ng server ay talagang hindi dapat pagkatiwalaan. Maaaring nakikipag-ugnay ka sa isang nang-aatake.</translation> +<translation id="4378154925671717803">Telepono</translation> <translation id="4406896451731180161">mga resulta ng paghahanap</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Address sa Pag-pick up</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index c9cdccb..a76e8d9 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Gérer les modes de paiement…</translation> <translation id="4372948949327679948">Valeur attendue : <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Vous avez tenté d'accéder à <ph name="DOMAIN" />, mais le certificat présenté par le serveur a été révoqué par son émetteur. Cela signifie que le certificat présenté par le serveur ne doit pas être approuvé. Il est donc possible que vous communiquiez avec un pirate informatique.</translation> +<translation id="4378154925671717803">Téléphone</translation> <translation id="4406896451731180161">résultats de recherche</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Adresse d'enlèvement</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index e349800e..17d76e59 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -530,6 +530,7 @@ <translation id="4358461427845829800">ચુકવણી પદ્ધતિઓ મેનેજ કરો…</translation> <translation id="4372948949327679948">અપેક્ષિત <ph name="VALUE_TYPE" /> મૂલ્ય.</translation> <translation id="4377125064752653719">તમે <ph name="DOMAIN" /> પર પહોંચવાનો પ્રયાસ કર્યો, પણ સર્વર દ્વારા પ્રસ્તુત કરવામાં આવેલું પ્રમાણપત્ર તેના રજૂકર્તા દ્વારા જ રદ કરવામાં આવ્યું છે. આનો અર્થ છે કે સર્વરે પ્રસ્તુત કરેલા સુરક્ષા પ્રમાણપત્રો પૂર્ણપણે વિશ્વસનીય નથી. તમે કોઈ હુમલાખોર જોડે વાત કરતા હોઈ શકો છો.</translation> +<translation id="4378154925671717803">ફોન</translation> <translation id="4406896451731180161">શોધ પરિણામો</translation> <translation id="4408413947728134509">કુકી <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">પિકઅપ માટેનું સરનામું</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index c24d73e..89eb3792 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">भुगतान विधियां प्रबंधित करें...</translation> <translation id="4372948949327679948">अपेक्षित <ph name="VALUE_TYPE" /> मान.</translation> <translation id="4377125064752653719">आपने <ph name="DOMAIN" /> तक पहुंचने का प्रयास किया, लेकिन सर्वर द्वारा प्रस्तुत प्रमाणपत्र को उसके जारीकर्ता द्वारा रद्द कर दिया गया है. इसका अर्थ है कि सर्वर द्वारा प्रस्तुत सुरक्षा प्रमाणिकता पर पूर्णतया विश्वास नहीं करना चाहिए. हो सकता है कि आप किसी हमलावर से बातचीत कर रहे हों.</translation> +<translation id="4378154925671717803">फ़ोन</translation> <translation id="4406896451731180161">खोज परिणाम</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> कुकी</translation> <translation id="4415426530740016218">पिकअप का पता</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 138892f..884ed37 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -530,6 +530,7 @@ <translation id="4358461427845829800">Upravljajte načinima plaćanja...</translation> <translation id="4372948949327679948">Očekivana vrijednost vrste <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Pokušali ste doseći domenu <ph name="DOMAIN" />, ali certifikat koji je poslužitelj predstavio povučen je od strane izdavača. Prema tome nikako ne biste trebali vjerovati sigurnosnim certifikatima koje predstavlja poslužitelj. Možda komunicirate s napadačem.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">rezultati pretraživanja</translation> <translation id="4408413947728134509">Kolačića: <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Adresa preuzimanja</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index dc4df12..4f75b03 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -529,6 +529,7 @@ <translation id="4358461427845829800">Fizetési módok kezelése…</translation> <translation id="4372948949327679948">Várt <ph name="VALUE_TYPE" /> érték.</translation> <translation id="4377125064752653719">A(z) <ph name="DOMAIN" /> webhelyet próbálta megnyitni, de a kiállító visszavonta a szerver által bemutatott tanúsítványt. Ez azt jelenti, hogy a szerver biztonsági igazolásaiban egyáltalán nem lehet megbízni. Lehet, hogy egy támadóval áll kapcsolatban.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">keresési találat</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> cookie</translation> <translation id="4415426530740016218">Átvételi cím</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index a5f494d..125d45a 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">nama tidak diketahui</translation> <translation id="1050038467049342496">Tutup aplikasi lain</translation> <translation id="1055184225775184556">&Urungkan Penambahan</translation> +<translation id="1058479211578257048">Menyimpan kartu...</translation> <translation id="10614374240317010">Jangan pernah disimpan</translation> <translation id="1066396345355680611">Anda dapat kehilangan akses ke konten yang dilindungi dari <ph name="SITE" /> dan beberapa situs lain.</translation> <translation id="106701514854093668">Bookmark Desktop</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">Kelola metode pembayaran...</translation> <translation id="4372948949327679948">Nilai <ph name="VALUE_TYPE" /> yang diharapkan.</translation> <translation id="4377125064752653719">Anda berusaha menjangkau <ph name="DOMAIN" />, tetapi sertifikat yang disajikan oleh server telah dibatalkan oleh penerbitnya. Artinya informasi rahasia keamanan yang disajikan tidak dapat dipercaya. Anda mungkin sedang berkomunikasi dengan penyerang.</translation> +<translation id="4378154925671717803">Ponsel</translation> <translation id="4406896451731180161">hasil penelusuran</translation> <translation id="4408413947728134509">Cookie <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Alamat Pengambilan</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">Lihat semua</translation> <translation id="4989809363548539747">Plugin ini tidak didukung</translation> <translation id="5002932099480077015">Jika diaktifkan, Chrome akan menyimpan salinan kartu Anda di perangkat ini untuk pengisian formulir yang lebih cepat.</translation> +<translation id="5014174725590676422">Layar penggunaan pertama Asisten Google di Chrome ditampilkan</translation> <translation id="5015510746216210676">Nama Mesin:</translation> <translation id="5018422839182700155">Tidak dapat membuka halaman ini</translation> <translation id="5019198164206649151">Penyimpanan cadangan dalam kondisi buruk</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">Pengguna saat ini</translation> <translation id="5730040223043577876">Chrome menyarankan untuk menyetel ulang sandi jika Anda juga menggunakannya di situs lain.</translation> <translation id="5732392974455271431">Orang tua dapat membuka blokirnya untukmu</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Simpan kartu di Akun Google Anda}other{Simpan kartu di Akun Google Anda}}</translation> <translation id="5763042198335101085">Masukkan alamat email yang valid</translation> <translation id="5765072501007116331">Untuk melihat persyaratan dan metode pengiriman, pilih alamat</translation> <translation id="5770114862687765385">File tersebut sepertinya rusak. Harap klik tombol 'Setel Ulang' untuk menyetel ulang sesi.</translation> @@ -1190,6 +1194,7 @@ <translation id="9080712759204168376">Ringkasan Pesanan</translation> <translation id="9103872766612412690"><ph name="SITE" /> biasanya menggunakan enkripsi untuk melindungi informasi Anda. Saat Chromium mencoba menyambung ke <ph name="SITE" /> kali ini, situs web mengembalikan kredensial yang salah dan tidak biasa. Hal ini dapat terjadi jika ada penyerang yang berpura-pura menjadi <ph name="SITE" />, atau layar masuk Wi-Fi mengganggu sambungan. Informasi Anda masih aman karena Chromium menghentikan sambungan sebelum terjadi pertukaran data apa pun.</translation> <translation id="9106062320799175032">Tambahkan Alamat Penagihan</translation> +<translation id="9110718169272311511">Asisten Google di Chrome tersedia di dekat bagian bawah layar</translation> <translation id="9114524666733003316">Mengonfirmasi kartu...</translation> <translation id="9128870381267983090">Sambungkan ke jaringan</translation> <translation id="9137013805542155359">Perlihatkan halaman asli</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 38b9670..971b604 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">nome sconosciuto</translation> <translation id="1050038467049342496">Chiudi altre app</translation> <translation id="1055184225775184556">&Annulla aggiunta</translation> +<translation id="1058479211578257048">Salvataggio delle carte...</translation> <translation id="10614374240317010">Mai salvate</translation> <translation id="1066396345355680611">Potresti non riuscire più ad accedere ai contenuti protetti del sito <ph name="SITE" /> e di altri siti.</translation> <translation id="106701514854093668">Preferiti desktop</translation> @@ -528,6 +529,7 @@ <translation id="4358461427845829800">Gestisci metodi di pagamento…</translation> <translation id="4372948949327679948">È previsto il valore <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Hai tentato di accedere a <ph name="DOMAIN" /> ma il server ha presentato un certificato revocato dall'autorità di certificazione. Ciò significa che le credenziali di sicurezza presentate dal server non sono assolutamente attendibili. Potresti avere stabilito una comunicazione con un utente malintenzionato.</translation> +<translation id="4378154925671717803">Telefono</translation> <translation id="4406896451731180161">risultati di ricerca</translation> <translation id="4408413947728134509">Cookie: <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Indirizzo di ritiro</translation> @@ -600,6 +602,7 @@ <translation id="4989163558385430922">Mostra tutto</translation> <translation id="4989809363548539747">Questo plug-in non è supportato</translation> <translation id="5002932099480077015">Se questa opzione viene attivata, Chrome memorizza una copia della carta sul dispositivo per velocizzare la compilazione dei moduli.</translation> +<translation id="5014174725590676422">È mostrata la schermata della prima esecuzione dell'Assistente Google in Chrome</translation> <translation id="5015510746216210676">Nome macchina:</translation> <translation id="5018422839182700155">Impossibile aprire questa pagina</translation> <translation id="5019198164206649151">Archivio di backup in stato non valido</translation> @@ -711,6 +714,7 @@ <translation id="5720705177508910913">Utente corrente</translation> <translation id="5730040223043577876">Chrome ti consiglia di reimpostare la password, se l'hai utilizzata su altri siti.</translation> <translation id="5732392974455271431">I tuoi genitori possono sbloccarlo per te</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Salva la carta nel tuo Account Google}other{Salva carte nel tuo Account Google}}</translation> <translation id="5763042198335101085">Inserisci un indirizzo email valido</translation> <translation id="5765072501007116331">Seleziona un indirizzo per conoscere i requisiti e i metodi di consegna</translation> <translation id="5770114862687765385">Sembra che il file sia danneggiato. Fai clic sul pulsante "Ripristina" per ripristinare la sessione.</translation> @@ -1190,6 +1194,7 @@ <translation id="9080712759204168376">Riepilogo dell'ordine</translation> <translation id="9103872766612412690"><ph name="SITE" /> in genere utilizza la crittografia per proteggere le tue informazioni. Questa volta, quando Chromium ha provato a connettersi a <ph name="SITE" />, il sito web ha restituito credenziali insolite e sbagliate. È possibile che un malintenzionato stia cercando di spacciarsi per il sito <ph name="SITE" /> oppure che una schermata di accesso alla rete Wi-Fi abbia interrotto la connessione. Le tue informazioni sono ancora al sicuro perché Chromium ha interrotto la connessione prima che avvenissero scambi di dati.</translation> <translation id="9106062320799175032">Aggiungi indirizzo di fatturazione</translation> +<translation id="9110718169272311511">L'Assistente Google in Chrome è disponibile nella parte inferiore dello schermo</translation> <translation id="9114524666733003316">Conferma della carta...</translation> <translation id="9128870381267983090">Collegati alla rete</translation> <translation id="9137013805542155359">Mostra originale</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index f5bee9c..cfd443f 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -244,7 +244,7 @@ <translation id="2501278716633472235">חזור</translation> <translation id="2503184589641749290">כרטיסי חיוב וכרטיסים משולמים מראש שהסוחר מקבל</translation> <translation id="2515629240566999685">לבדוק את האות באזור שלך</translation> -<translation id="2523886232349826891">יישמר רק במכשיר הזה</translation> +<translation id="2523886232349826891">הכרטיס יישמר רק במכשיר הזה</translation> <translation id="2524461107774643265">הוספת עוד מידע</translation> <translation id="2536110899380797252">הוספת כתובת</translation> <translation id="2539524384386349900">זהה</translation> @@ -288,7 +288,7 @@ <translation id="2799020568854403057">האתר שאתה עומד לעבור אליו מכיל יישומים מזיקים</translation> <translation id="2799223571221894425">הפעל מחדש</translation> <translation id="2803306138276472711">לאחרונה, 'גלישה בטוחה של Google' <ph name="BEGIN_LINK" />זיהתה תוכנה זדונית<ph name="END_LINK" /> באתר <ph name="SITE" />. אתרים שבדרך כלל נחשבים לבטוחים נדבקים לעתים בתוכנה זדונית.</translation> -<translation id="2824775600643448204">סרגל חיפוש וכתובות</translation> +<translation id="2824775600643448204">שורת חיפוש וכתובות אתרים</translation> <translation id="2826760142808435982">החיבור מוצפן ומאומת באמצעות <ph name="CIPHER" /> ומשתמש ב-<ph name="KX" /> כמנגנון להחלפת מפתחות.</translation> <translation id="2835170189407361413">נקה טופס</translation> <translation id="2847118875340931228">פתיחת חלון גלישה בסתר</translation> @@ -331,7 +331,7 @@ <translation id="3137507986424712703">{COUNT,plural, =0{ללא}=1{נתוני כניסה של חשבון אחד}two{נתוני כניסה של 2 חשבונות}many{נתוני כניסה של # חשבונות}other{נתוני כניסה של # חשבונות}}</translation> <translation id="3145945101586104090">פענוח התגובה נכשל</translation> <translation id="3150653042067488994">שגיאת שרת זמנית</translation> -<translation id="3154506275960390542">דף זה כולל טופס שעשוי להישלח באופן לא מאובטח. הנתונים שתשלח יהיו גלויים במהלך ההעברה, וקיימת סכנה שמישהו ישנה את הפרטים שהשרת יקבל.</translation> +<translation id="3154506275960390542">דף זה כולל טופס שעשוי להישלח באופן לא מאובטח. הנתונים ששולחים יהיו גלויים במהלך ההעברה, וקיימת סכנה שמישהו ישנה את הפרטים שהשרת יקבל.</translation> <translation id="3157931365184549694">שחזר</translation> <translation id="3162559335345991374">ייתכן שתידרש להיכנס לדף ההתחברות של רשת ה-Wi-Fi שבה אתה משתמש.</translation> <translation id="3167968892399408617">דפים שאתה מציג בכרטיסיות גלישה בסתר לא יישארו בהיסטוריית הדפדפן, באחסון קובצי ה-Cookie או בהיסטוריית החיפושים לאחר שתסגור את כל כרטיסיות הגלישה בסתר. קבצים שהורדת או סימניות שיצרת יישמרו.</translation> @@ -531,6 +531,7 @@ <translation id="4358461427845829800">ניהול אמצעי תשלום...</translation> <translation id="4372948949327679948">צפוי ערך מסוג <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">ניסית להשיג את <ph name="DOMAIN" />, אך האישור שהשרת הציג בוטל על ידי המנפיק שלו. פירוש הדבר שאין כל אפשרות לתת אמון באישורי האבטחה שהשרת הציג. ייתכן שאתה מתקשר עם תוקף.</translation> +<translation id="4378154925671717803">טלפון</translation> <translation id="4406896451731180161">תוצאות חיפוש</translation> <translation id="4408413947728134509">קובצי Cookie <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">כתובת איסוף</translation> @@ -764,7 +765,7 @@ <translation id="6047233362582046994">אם אתה מבין את סיכוני האבטחה, תוכל <ph name="BEGIN_LINK" />להיכנס לאתר הזה<ph name="END_LINK" /> לפני הסרת היישומים המזיקים.</translation> <translation id="6047927260846328439">ייתכן שבתוכן הזה יש מידע מטעה שנועד לגרום לך להתקין תוכנות או לחשוף מידע אישי. <ph name="BEGIN_LINK" />הצג בכל זאת<ph name="END_LINK" /></translation> <translation id="6051221802930200923">נכון לעכשיו אי אפשר לבקר באתר <ph name="SITE" />, מאחר שבאתר הזה נעשה שימוש בנעיצת אישורים. שגיאות רשת ומתקפות הן בדרך כלל זמניות, כך שהדף הזה יחזור כנראה לפעול מאוחר יותר.</translation> -<translation id="6058977677006700226">רוצה להשתמש בכרטיסים שלך בכל המכשירים שברשותך?</translation> +<translation id="6058977677006700226">רוצה להשתמש בכרטיסים בכל המכשירים שברשותך?</translation> <translation id="6059925163896151826">מכשירי USB</translation> <translation id="6071091556643036997">סוג המדיניות אינו חוקי.</translation> <translation id="6080696365213338172">ניגשת לתוכן באמצעות אישור שהוענק על ידי מנהל מערכת. מנהל המערכת שלך עשוי ליירט נתונים שתספק ל-<ph name="DOMAIN" />.</translation> @@ -822,7 +823,7 @@ <translation id="6507833130742554667">אפשר לשלם באמצעות כרטיסי אשראי וחיוב.</translation> <translation id="6508722015517270189">הפעלה מחדש של Chrome</translation> <translation id="6529602333819889595">&ביצוע מחדש של מחיקה</translation> -<translation id="6534179046333460208">הצעות לאינטרנט הווירטופיזי</translation> +<translation id="6534179046333460208">הצעות לאינטרנט הפיזי</translation> <translation id="6563469144985748109">המנהל שלך עדיין לא אישר זאת</translation> <translation id="6569060085658103619">אתה מציג דף של תוסף</translation> <translation id="6596325263575161958">אפשרויות הצפנה</translation> @@ -969,7 +970,7 @@ <translation id="7542995811387359312">מילוי אוטומטי של פרטי כרטיס אשראי מושבת כיוון שטופס זה אינו משתמש בחיבור מאובטח.</translation> <translation id="7543525346216957623">יש לבקש רשות מההורים</translation> <translation id="7548892272833184391">פתרון שגיאות חיבור</translation> -<translation id="7549584377607005141">דף אינטרנט זה זקוק לנתונים שהזנת קודם לכן כדי שהוא יוצג כראוי. אתה יכול לשלוח שוב את הנתונים, אך פעולה זו תגרום לחזרה על כל פעולה שדף זה ביצע בעבר.</translation> +<translation id="7549584377607005141">דף אינטרנט זה זקוק לנתונים שהזנת קודם לכן כדי שהוא יוצג כראוי. ניתן שוב את הנתונים, אך פעולה זו תגרום לחזרה על כל פעולה שדף זה ביצע בעבר.</translation> <translation id="7552846755917812628">אולי הטיפים האלו יעזרו לך:</translation> <translation id="7554791636758816595">כרטיסייה חדשה</translation> <translation id="7564049878696755256">הגישה שלך לחשבון <ph name="ORG_NAME" /> עשויה להישלל והזהות שלך עשויה להיגנב. ההמלצה של Chrome היא לשנות את הסיסמה עכשיו.</translation> @@ -1072,7 +1073,7 @@ <translation id="8202097416529803614">סיכום הזמנה</translation> <translation id="8211406090763984747">החיבור מאובטח</translation> <translation id="8218327578424803826">מיקום מוקצה:</translation> -<translation id="8225771182978767009">האדם שהגדיר את המחשב הזה בחר לחסום את האתר הזה.</translation> +<translation id="8225771182978767009">המשתמש שהגדיר את המחשב הזה בחר לחסום את האתר הזה.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">פתח את הדף בכרטיסייה חדשה של גלישה בסתר</translation> <translation id="8241707690549784388">הדף שאתה מחפש השתמש במידע שהזנת. החזרה לדף זה עלולה לגרום לכפילות בפעולות שביצעת. האם ברצונך להמשיך?</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 624bfc3..e6d589b 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">お支払い方法を管理...</translation> <translation id="4372948949327679948"><ph name="VALUE_TYPE" /> 値が想定されます。</translation> <translation id="4377125064752653719"><ph name="DOMAIN" /> にアクセスしようとしましたが、サーバーから提示された証明書は発行元により取り消されています。これは、サーバーから提示されたセキュリティ認証情報が信頼できないことを示しており、悪意のあるユーザーと通信しようとしている可能性があります。</translation> +<translation id="4378154925671717803">電話</translation> <translation id="4406896451731180161">検索結果</translation> <translation id="4408413947728134509">Cookie <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">集荷先住所</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 253ef84..de8a1f9 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -527,6 +527,7 @@ <translation id="4358461427845829800">ಪಾವತಿ ವಿಧಾನಗಳನ್ನು ನಿರ್ವಹಿಸಿ...</translation> <translation id="4372948949327679948">ನಿರೀಕ್ಷಿತ <ph name="VALUE_TYPE" /> ಮೌಲ್ಯ.</translation> <translation id="4377125064752653719">ನೀವು <ph name="DOMAIN" /> ಅನ್ನು ತಲುಪಲು ಪ್ರಯತ್ನಿಸಿದಿರಿ, ಆದರೆ ಸರ್ವರ್ ನೀಡಿದ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಅದರ ನೀಡುವವರು ಹಿಂತೆಗೆದುಕೊಂಡಿದ್ದಾರೆ. ಇದರರ್ಥ ಸರ್ವರ್ ನೀಡಿದ ಸುರಕ್ಷತೆ ರುಜುವಾತುಗಳನ್ನು ಖಂಡಿತವಾಗಿ ನಂಬಲಾಗುವುದಿಲ್ಲ. ನೀವು ಆಕ್ರಮಣಕಾರರೊಂದಿಗೆ ಸಂವಹಿಸುತ್ತಿರಬಹುದು.</translation> +<translation id="4378154925671717803">ಫೋನ್</translation> <translation id="4406896451731180161">ಹುಡುಕಾಟದ ಫಲಿತಾಂಶಗಳು</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> ಕುಕೀಗಳು</translation> <translation id="4415426530740016218">ಪಿಕಪ್ ವಿಳಾಸ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index c84f9a8..fd3b50dd 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">결제 수단 관리...</translation> <translation id="4372948949327679948">예상 <ph name="VALUE_TYPE" /> 값입니다.</translation> <translation id="4377125064752653719"><ph name="DOMAIN" />에 접속하려 했으나 발행기관에서 서버가 전달한 인증서를 폐기했습니다. 이는 서버가 제시한 보안 자격증명 정보를 신뢰할 수 없음을 의미합니다. 사용자는 현재 공격자와 통신 중일 수도 있습니다.</translation> +<translation id="4378154925671717803">전화기</translation> <translation id="4406896451731180161">검색결과</translation> <translation id="4408413947728134509">쿠키 <ph name="NUM_COOKIES" />개</translation> <translation id="4415426530740016218">픽업 주소</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index d7668fc..37e73f6 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">nežinomas pavadinimas</translation> <translation id="1050038467049342496">Uždarykite kitas programas</translation> <translation id="1055184225775184556">&Anuliuoti pridėjimą</translation> +<translation id="1058479211578257048">Išsaugomos kortelės...</translation> <translation id="10614374240317010">Niekada neišsaugota</translation> <translation id="1066396345355680611">Galite prarasti prieigą prie saugomo turinio iš <ph name="SITE" /> ir kelių kitų svetainių.</translation> <translation id="106701514854093668">Žymės staliniame kompiuteryje</translation> @@ -532,6 +533,7 @@ <translation id="4358461427845829800">Tvarkyti mokėjimo metodus...</translation> <translation id="4372948949327679948">Numatyta „<ph name="VALUE_TYPE" />“ vertė.</translation> <translation id="4377125064752653719">Bandėte pasiekti svetainę „<ph name="DOMAIN" />“, bet sertifikatą, kurį pateikė serveris, anuliavo jo išdavėjas. Tai reiškia, kad saugos kredencialais, kuriuos pateikė serveris, visiškai negalima pasitikėti. Galbūt bendraujate su užpuoliku.</translation> +<translation id="4378154925671717803">Telefonas</translation> <translation id="4406896451731180161">paieškos rezultatai</translation> <translation id="4408413947728134509">Slapukai <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Paėmimo adresas</translation> @@ -604,6 +606,7 @@ <translation id="4989163558385430922">Žr. viską</translation> <translation id="4989809363548539747">Šis papildinys nepalaikomas</translation> <translation id="5002932099480077015">Jei šis nustatymas įgalintas, „Chrome“ saugos kortelės kopiją šiame įrenginyje, kad būtų galima greičiau užpildyti formas.</translation> +<translation id="5014174725590676422">Rodomas „Google“ padėjėjo sistemoje „Chrome“ pirmosios paleisties ekranas</translation> <translation id="5015510746216210676">Įrenginio pavadinimas:</translation> <translation id="5018422839182700155">Negalima atidaryti šio puslapio</translation> <translation id="5019198164206649151">Bloga atsarginio atminties įrenginio būsena</translation> @@ -715,6 +718,7 @@ <translation id="5720705177508910913">Dabartinis naudotojas</translation> <translation id="5730040223043577876">„Chrome“ rekomenduoja iš naujo nustatyti slaptažodį, jei naudojate jį kitose svetainėse.</translation> <translation id="5732392974455271431">Jūsų tėvai gali atblokuoti ją už jus</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Išsaugokite kortelę „Google“ paskyroje}one{Išsaugokite korteles „Google“ paskyroje}few{Išsaugokite korteles „Google“ paskyroje}many{Išsaugokite korteles „Google“ paskyroje}other{Išsaugokite korteles „Google“ paskyroje}}</translation> <translation id="5763042198335101085">Įveskite galiojantį el. pašto adresą</translation> <translation id="5765072501007116331">Jei norite peržiūrėti pristatymo metodus ir reikalavimus, pasirinkite adresą.</translation> <translation id="5770114862687765385">Panašu, kad failas sugadintas. Spustelėkite nustatymo iš naujo mygtuką ir nustatykite sesiją iš naujo.</translation> @@ -1196,6 +1200,7 @@ <translation id="9080712759204168376">Užsakymų suvestinė</translation> <translation id="9103872766612412690">Svetainėje <ph name="SITE" /> įprastai naudojama šifruotė informacijai apsaugoti. Šį kartą „Chromium“ bandant prisijungti prie <ph name="SITE" />, ji pateikė neįprastus ir netinkamus prisijungimo duomenis. Gali būti, kad užpuolėjas bando apsimesti svetaine <ph name="SITE" /> arba „Wi-Fi“ prisijungimo ekrane nutrūko ryšys. Jūsų informacija vis tiek liko apsaugota, nes „Chromium“ sustabdė prisijungimą prieš apsikeitimą bet kokiais duomenimis.</translation> <translation id="9106062320799175032">Atsiskaitymo adreso pridėjimas</translation> +<translation id="9110718169272311511">„Google“ padėjėjas sistemoje „Chrome“ rodomas netoli ekrano apačios</translation> <translation id="9114524666733003316">Kortelė patvirtinama...</translation> <translation id="9128870381267983090">Prisijungti prie tinklo</translation> <translation id="9137013805542155359">Rodyti originalą</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 49e7b15..b95dd2c3 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -530,6 +530,7 @@ <translation id="4358461427845829800">Pārvaldīt maksājumu veidus...</translation> <translation id="4372948949327679948">Tika gaidīta vērtība <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Jūs mēģinājāt sasniegt <ph name="DOMAIN" />, bet izdevējs atsauca servera uzrādīto sertifikātu. Tas nozīmē, ka servera uzrādītie drošības akreditācijas dati itin nemaz nav uzticami. Iespējams, jūs sazināties ar uzbrucēju.</translation> +<translation id="4378154925671717803">Tālrunis</translation> <translation id="4406896451731180161">meklēšanas rezultāti</translation> <translation id="4408413947728134509">Sīkfaili <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Saņemšanas adrese</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 26d1db8..f2062966 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">അജ്ഞാത നാമം</translation> <translation id="1050038467049342496">മറ്റ് ആപ്പുകൾ അടയ്ക്കുക</translation> <translation id="1055184225775184556">&ചേർത്തത് പഴയപടിയാക്കുക</translation> +<translation id="1058479211578257048">കാർഡുകൾ സംരക്ഷിക്കുന്നു...</translation> <translation id="10614374240317010">ഒരിക്കലും സംരക്ഷിച്ചില്ല</translation> <translation id="1066396345355680611">നിങ്ങൾക്ക്, <ph name="SITE" /> എന്ന സൈറ്റിൽ നിന്നും മറ്റുസൈറ്റുകളിൽ നിന്നുമുള്ള സംരക്ഷിത ഉള്ളടക്കത്തിലേക്കുള്ള ആക്സസ് നഷ്ടമായേക്കാം.</translation> <translation id="106701514854093668">ഡെസ്ക്ടോപ്പ് ബുക്ക്മാർക്കുകൾ</translation> @@ -530,6 +531,7 @@ <translation id="4358461427845829800">പേയ്മെന്റ് രീതികൾ മാനേജ് ചെയ്യുക...</translation> <translation id="4372948949327679948">പ്രതീക്ഷിച്ച <ph name="VALUE_TYPE" /> മൂല്യം.</translation> <translation id="4377125064752653719">നിങ്ങള് <ph name="DOMAIN" /> എന്നതില് എത്താന് ശ്രമിച്ചു, പക്ഷേ സെര്വര് നൽകിയ സര്ട്ടിഫിക്കറ്റ് അത് നല്കിയ ആള് അസാധുവാക്കി. സെര്വര് നല്കിയ സുരക്ഷാ ക്രെഡന്ഷ്യലുകള് തികച്ചും വിശ്വാസയോഗ്യമല്ല എന്നാണ് ഇതിനര്ത്ഥം. നിങ്ങള് ഒരു ആക്രമണകാരിയുമായിട്ടാകാം ആശയവിനിമയം നടത്തുന്നത്.</translation> +<translation id="4378154925671717803">ഫോൺ</translation> <translation id="4406896451731180161">തിരയൽ ഫലങ്ങൾ</translation> <translation id="4408413947728134509">കുക്കികൾ <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">പിക്കപ്പ് വിലാസം</translation> @@ -602,6 +604,7 @@ <translation id="4989163558385430922">എല്ലാം കാണുക</translation> <translation id="4989809363548539747">ഈ പ്ലഗിൻ പിന്തുണയ്ക്കുന്നില്ല</translation> <translation id="5002932099480077015">പ്രവർത്തനക്ഷമമാക്കിയെങ്കിൽ, വേഗത്തിൽ ഫോം പൂരിപ്പിക്കാൻ Chrome ഈ ഉപകരണത്തിൽ നിങ്ങളുടെ കാർഡിന്റെ ഒരു പകർപ്പ് സൂക്ഷിക്കും.</translation> +<translation id="5014174725590676422">Chrome-ലെ Google അസിസ്റ്റന്റ്, ആദ്യ റൺ സ്ക്രീൻ കാണിക്കുന്നു</translation> <translation id="5015510746216210676">മെഷീനിന്റെ പേര്:</translation> <translation id="5018422839182700155">ഈ പേജ് തുറക്കാനായില്ല</translation> <translation id="5019198164206649151">ബാക്കിംഗ് സംഭരണം മോശം അവസ്ഥയിലാണ്</translation> @@ -713,6 +716,7 @@ <translation id="5720705177508910913">നിലവിലെ ഉപയോക്താവ്</translation> <translation id="5730040223043577876">മറ്റ് സൈറ്റുകളിൽ നിങ്ങളുടെ പാസ്വേഡ് പുനരുപയോഗിച്ചിട്ടുണ്ടെങ്കിൽ, അത് പുനഃസജ്ജീകരിക്കാൻ Chrome ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="5732392974455271431">നിങ്ങൾക്ക് വേണ്ടി ഇത് അൺബ്ലോക്കുചെയ്യാൻ രക്ഷിതാക്കൾക്ക് കഴിയും</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{നിങ്ങളുടെ Google അക്കൗണ്ടിൽ കാർഡ് സംരക്ഷിക്കുക}other{നിങ്ങളുടെ Google അക്കൗണ്ടിൽ കാർഡുകൾ സംരക്ഷിക്കുക}}</translation> <translation id="5763042198335101085">ശരിയായ ഇമെയിൽ വിലാസം നൽകുക</translation> <translation id="5765072501007116331">ഡെലിവറി രീതികളും ആവശ്യകതകളും കാണാൻ ഒരു വിലാസം തിരഞ്ഞെടുക്കുക</translation> <translation id="5770114862687765385">ഫയൽ കേടായതായി തോന്നുന്നു. സെഷന് പുനഃസജ്ജീകരിക്കാൻ 'പുനഃസജ്ജീകരിക്കുക' ബട്ടൺ ക്ലിക്ക് ചെയ്യുക.</translation> @@ -1190,6 +1194,7 @@ <translation id="9080712759204168376">ഓർഡർ സംഗ്രഹം</translation> <translation id="9103872766612412690">നിങ്ങളുടെ വിവരങ്ങൾ പരിരക്ഷിക്കാൻ സാധാരണയായി <ph name="SITE" />, എൻക്രിപ്ഷൻ ഉപയോഗിക്കുന്നു. ഇത്തവണ <ph name="SITE" />, സൈറ്റിലേക്ക് കണക്റ്റ് ചെയ്യാൻ Chromium ശ്രമിച്ചപ്പോൾ, അസാധാരണമായതും തെറ്റായതുമായ ക്രെഡൻഷ്യലുകൾ വെബ്സൈറ്റ് തിരികെ അയച്ചു. ഒരു ആക്രമണകാരി <ph name="SITE" /> എന്നതായി ഭാവിക്കാൻ ശ്രമിക്കുമ്പോഴോ Wi-Fi സൈൻ ഇൻ സ്ക്രീൻ, കണക്ഷനെ തടസ്സപ്പെടുത്തുമ്പോഴോ ആണ് ഇങ്ങനെ സംഭവിക്കാനിടയുള്ളത്. ഏതെങ്കിലും ഡാറ്റ കൈമാറുന്നതിനുമുമ്പ് Chromium കണക്ഷൻ അവസാനിപ്പിച്ചതിനാൽ, നിങ്ങളുടെ വിവരങ്ങൾ തുടർന്നും സുരക്ഷിതമായിരിക്കും.</translation> <translation id="9106062320799175032">ബില്ലിംഗ് വിലാസം ചേർക്കുക</translation> +<translation id="9110718169272311511">Chrome-ലെ Google അസിസ്റ്റന്റ്, സ്ക്രീനിന്റെ ചുവടെ ലഭ്യമാണ്</translation> <translation id="9114524666733003316">കാർഡ് സ്ഥിരീകരിക്കുന്നു...</translation> <translation id="9128870381267983090">നെറ്റ്വര്ക്കിലേക്ക് ബന്ധിപ്പിക്കുക</translation> <translation id="9137013805542155359">യഥാര്ത്ഥമായത് കാണിക്കുക</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 632a6ae..6fb3ff0 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">पेमेंट पद्धती व्यवस्थापित करा</translation> <translation id="4372948949327679948">अपेक्षित <ph name="VALUE_TYPE" /> मूल्य.</translation> <translation id="4377125064752653719">तुम्ही <ph name="DOMAIN" /> वर पोहोचण्याचा प्रयत्न केला, परंतु सर्व्हरने सादर केलेले प्रमाणपत्र त्याच्या जारीकर्त्याद्वारे मागे घेतले गेले आहे. याचा अर्थ सर्व्हरने सादर केलेल्या सुरक्षा क्रेडेंशियलवर अजिबात विश्वास ठेवला जाऊ नये. तुम्ही कदाचित आक्रमणकर्त्याशी संवाद प्रइंस्टॉल करत आहात.</translation> +<translation id="4378154925671717803">फोन</translation> <translation id="4406896451731180161">शोध परिणाम</translation> <translation id="4408413947728134509">कुकीज <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">घेण्याचा पत्ता</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index c5023cb..01e09203 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -532,6 +532,7 @@ <translation id="4358461427845829800">Urus kaedah pembayaran...</translation> <translation id="4372948949327679948">Nilai <ph name="VALUE_TYPE" /> yang dijangka.</translation> <translation id="4377125064752653719">Anda cuba untuk mencapai <ph name="DOMAIN" />, tetapi sijil yang diberi pelayan telah dibatalkan oleh pengeluarnya. Ini bermakna bahawa bukti kelayakan keselamatan yang diberi pelayan sememangnya tidak harus dipercayai. Anda mungkin berkomunikasi dengan penyerang.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">hasil carian</translation> <translation id="4408413947728134509">Kuki <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Alamat Pengambilan</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 1b8d0a5..9130a61 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -527,6 +527,7 @@ <translation id="4358461427845829800">Betaalmethoden beheren...</translation> <translation id="4372948949327679948">Verwachte <ph name="VALUE_TYPE" /> waarde.</translation> <translation id="4377125064752653719">Je probeert <ph name="DOMAIN" /> te bereiken, maar het certificaat dat de server heeft geretourneerd, is ingetrokken door de uitgever. Dat betekent dat de veiligheidsgaranties die de server heeft geretourneerd, absoluut niet kunnen worden vertrouwd. Het kan zijn dat je met een hacker aan het communiceren bent.</translation> +<translation id="4378154925671717803">Telefoon</translation> <translation id="4406896451731180161">zoekresultaten</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> cookies</translation> <translation id="4415426530740016218">Ophaaladres</translation> @@ -652,7 +653,7 @@ <translation id="5344579389779391559">Deze pagina brengt je mogelijk kosten in rekening</translation> <translation id="5355557959165512791">Je kunt <ph name="SITE" /> momenteel niet bezoeken, omdat het bijbehorende certificaat is ingetrokken. Netwerkfouten en aanvallen zijn doorgaans tijdelijk, dus deze pagina werkt later waarschijnlijk correct.</translation> <translation id="536296301121032821">Opslaan van beleidsinstellingen is mislukt</translation> -<translation id="5363056109122666249">Chrome biedt aan je kaarten in je Google-account op te slaan omdat je bent ingelogd. Je kunt dit gedrag wijzigen in de instellingen.</translation> +<translation id="5363056109122666249">Chrome biedt aan je kaarten in je Google-account op te slaan omdat je bent ingelogd. Je kunt dit wijzigen in de instellingen.</translation> <translation id="5371425731340848620">Kaart updaten</translation> <translation id="5377026284221673050">'Je klok loopt achter', 'Je klok loopt voor' of '<span class="error-code">NET::ERR_CERT_DATE_INVALID</span>'</translation> <translation id="5384855140246857529">Als je je kaarten op alle apparaten wilt gebruiken, moet je inloggen en synchronisatie inschakelen.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index c250f2c..887f710 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Administrer betalingsmåter…</translation> <translation id="4372948949327679948">Forventet <ph name="VALUE_TYPE" />-verdi.</translation> <translation id="4377125064752653719">Du forsøkte å gå til <ph name="DOMAIN" />, men sertifikatet tjeneren presenterte har blitt trukket tilbake av utstederen. Dette innebærer at sikkerhetsinformasjonen tjeneren presenterte ikke er klarert. Det kan hende at du kommuniserer med en angriper.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">søkeresultater</translation> <translation id="4408413947728134509">Informasjonskapsler <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Henteadresse</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index c7ec7baf..3005fe6a 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">nieznana nazwa</translation> <translation id="1050038467049342496">Zamknij inne aplikacje</translation> <translation id="1055184225775184556">&Cofnij dodanie</translation> +<translation id="1058479211578257048">Zapisuję karty…</translation> <translation id="10614374240317010">Nigdy nie zapisane</translation> <translation id="1066396345355680611">Możesz stracić dostęp do treści chronionych na: <ph name="SITE" /> i na niektórych innych stronach.</translation> <translation id="106701514854093668">Zakładki na komputerze</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">Zarządzaj formami płatności…</translation> <translation id="4372948949327679948">Oczekiwano wartości typu <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Próbujesz wejść na <ph name="DOMAIN" />, ale serwer przedstawił certyfikat unieważniony przez wystawcę. Oznacza to, że dane uwierzytelniające podane przez serwer są zupełnie niewiarygodne. Możliwe, że komunikujesz się z intruzem.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">wyniki wyszukiwania</translation> <translation id="4408413947728134509">Pliki cookie (<ph name="NUM_COOKIES" />)</translation> <translation id="4415426530740016218">Adres odbioru</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">Pokaż wszystko</translation> <translation id="4989809363548539747">Ta wtyczka nie jest obsługiwana</translation> <translation id="5002932099480077015">Jeśli włączysz tę opcję, Chrome zapisze kopię Twojej karty na tym urządzeniu, by umożliwić Ci szybsze wypełnianie formularzy.</translation> +<translation id="5014174725590676422">Wyświetlany jest ekran pierwszego uruchomienia Asystenta Google w Chrome</translation> <translation id="5015510746216210676">Nazwa komputera:</translation> <translation id="5018422839182700155">Nie można otworzyć tej strony</translation> <translation id="5019198164206649151">Nieprawidłowy stan magazynu wspomagającego</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">Bieżący użytkownik</translation> <translation id="5730040223043577876">Chrome zaleca zresetowanie hasła, jeśli zostało użyte na innej stronie.</translation> <translation id="5732392974455271431">Mogą ją dla Ciebie odblokować Twoi rodzice</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Zapisywanie karty na koncie Google}few{Zapisywanie kart na koncie Google}many{Zapisywanie kart na koncie Google}other{Zapisywanie kart na koncie Google}}</translation> <translation id="5763042198335101085">Wpisz prawidłowy adres e-mail</translation> <translation id="5765072501007116331">Aby zobaczyć metody dostawy oraz wymagania, wybierz adres</translation> <translation id="5770114862687765385">Plik wygląda na uszkodzony. Kliknij przycisk „Zresetuj”, by zresetować sesję.</translation> @@ -1194,6 +1198,7 @@ <translation id="9080712759204168376">Podsumowanie zamówienia</translation> <translation id="9103872766612412690"><ph name="SITE" /> zazwyczaj używa szyfrowania do ochrony Twoich informacji. Gdy tym razem przeglądarka Chromium próbowała połączyć się ze stroną <ph name="SITE" />, odesłała ona nietypowe i nieprawidłowe dane logowania. Może się tak zdarzyć, gdy pod stronę <ph name="SITE" /> podszywa się osoba atakująca albo gdy ekran logowania do sieci Wi-Fi przerwie połączenie. Twoje informacje są nadal bezpieczne, bo połączenie w Chromium zakończyło się przed wymianą jakichkolwiek danych.</translation> <translation id="9106062320799175032">Dodaj adres rozliczeniowy</translation> +<translation id="9110718169272311511">Asystent Google w Chrome jest dostępny u dołu ekranu</translation> <translation id="9114524666733003316">Sprawdzam kartę…</translation> <translation id="9128870381267983090">Połącz z siecią</translation> <translation id="9137013805542155359">Pokaż tekst oryginalny</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index c104e16..abbcf1f8 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">nome desconhecido</translation> <translation id="1050038467049342496">Fechar outros apps</translation> <translation id="1055184225775184556">&Desfazer adicionar</translation> +<translation id="1058479211578257048">Salvando cartões…</translation> <translation id="10614374240317010">Nunca salvas</translation> <translation id="1066396345355680611">É possível que você perca o acesso a conteúdos protegidos de <ph name="SITE" /> e de alguns outros sites.</translation> <translation id="106701514854093668">Favoritos em computador</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">Gerenciar formas de pagamento…</translation> <translation id="4372948949327679948">Valor <ph name="VALUE_TYPE" /> esperado.</translation> <translation id="4377125064752653719">Você tentou acessar <ph name="DOMAIN" />, mas o certificado que o servidor apresentou foi revogado pelo seu emissor. Isso significa que as credenciais de segurança que o servidor apresentou não são nem um pouco seguras. Talvez você esteja se comunicando com um invasor.</translation> +<translation id="4378154925671717803">Telefone</translation> <translation id="4406896451731180161">resultados da pesquisa</translation> <translation id="4408413947728134509">Cookies: <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Endereço de Retirada</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">Ver tudo</translation> <translation id="4989809363548539747">Este plug-in não é compatível</translation> <translation id="5002932099480077015">Se ativado, o Chrome armazenará uma cópia do seu cartão neste dispositivo para preencher formulários mais rapidamente.</translation> +<translation id="5014174725590676422">Exibição da tela de primeiro acesso do Google Assistente no Chrome</translation> <translation id="5015510746216210676">Nome do computador:</translation> <translation id="5018422839182700155">Não é possível abrir essa página</translation> <translation id="5019198164206649151">Armazenamento de backup em estado inválido</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">Usuário atual</translation> <translation id="5730040223043577876">O Chrome recomenda redefinir sua senha se você a reutilizou em outros sites.</translation> <translation id="5732392974455271431">Seus responsáveis podem desbloqueá-lo para você</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Salvar cartão na Conta do Google}one{Salvar cartão na Conta do Google}other{Salvar cartões na Conta do Google}}</translation> <translation id="5763042198335101085">Informe um endereço de e-mail válido.</translation> <translation id="5765072501007116331">Para ver métodos e requisitos de entrega, selecione um endereço</translation> <translation id="5770114862687765385">O arquivo parece estar corrompido. Clique no botão "Redefinir" para reiniciar a sessão.</translation> @@ -1196,6 +1200,7 @@ <translation id="9103872766612412690">O site <ph name="SITE" /> geralmente usa criptografia para proteger suas informações. Quando o Chromium tentou se conectar a <ph name="SITE" /> dessa vez, o website retornou credenciais incomuns e incorretas. Isso pode acontecer quando um invasor está fingindo ser <ph name="SITE" /> ou quando uma tela de login por Wi-Fi interrompeu a conexão. Suas informações ainda estão protegidas, porque o Chromium interrompeu a conexão antes que os dados fossem trocados.</translation> <translation id="9106062320799175032">Adicione um Endereço de Faturamento</translation> +<translation id="9110718169272311511">O Google Assistente no Chrome está disponível perto da parte inferior da tela</translation> <translation id="9114524666733003316">Confirmando cartão…</translation> <translation id="9128870381267983090">Conectar-se à rede</translation> <translation id="9137013805542155359">Mostrar original</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index d984267..540b16b 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">nome desconhecido</translation> <translation id="1050038467049342496">Fechar outras aplicações</translation> <translation id="1055184225775184556">&Anular adição</translation> +<translation id="1058479211578257048">A guardar os cartões…</translation> <translation id="10614374240317010">Nunca guardadas</translation> <translation id="1066396345355680611">Pode perder o acesso ao conteúdo protegido de <ph name="SITE" /> e de outros sites.</translation> <translation id="106701514854093668">Marcadores do Ambiente de Trabalho</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">Gerir métodos de pagamento…</translation> <translation id="4372948949327679948">Valor <ph name="VALUE_TYPE" /> esperado.</translation> <translation id="4377125064752653719">Tentou aceder a <ph name="DOMAIN" />, mas o certificado que o servidor apresentou foi revogado pelo emissor. Isto significa que as credenciais de segurança apresentadas pelo servidor não deverão, em circunstância alguma, ser consideradas fidedignas. Pode estar a comunicar com um utilizador mal intencionado.</translation> +<translation id="4378154925671717803">Telemóvel</translation> <translation id="4406896451731180161">resultados da pesquisa</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Endereço de recolha</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">Ver tudo</translation> <translation id="4989809363548539747">Este plug-in não é compatível</translation> <translation id="5002932099480077015">Quando esta opção está ativada, o Chrome armazena uma cópia do seu cartão neste dispositivo para preencher formulários mais rapidamente.</translation> +<translation id="5014174725590676422">É apresentado o primeiro ecrã de execução do Assistente Google no Chrome.</translation> <translation id="5015510746216210676">Nome do computador:</translation> <translation id="5018422839182700155">Não é possível abrir esta página</translation> <translation id="5019198164206649151">Armazenamento de segurança em mau estado</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">Utilizador atual</translation> <translation id="5730040223043577876">O Chrome recomenda a reposição da palavra-passe se a tiver reutilizado noutros sites.</translation> <translation id="5732392974455271431">Os teus pais podem desbloquear-te</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Guardar o cartão na sua Conta Google}other{Guardar os cartões na sua Conta Google}}</translation> <translation id="5763042198335101085">Introduza um endereço de email válido</translation> <translation id="5765072501007116331">Para ver os métodos de fornecimento e os requisitos, selecione um endereço</translation> <translation id="5770114862687765385">O ficheiro parece estar danificado. Clique no botão "Repor" para repor a sessão.</translation> @@ -1054,7 +1058,7 @@ <translation id="8103161714697287722">Método de pagamento</translation> <translation id="8118489163946903409">Método de pagamento</translation> <translation id="8127301229239896662">O "<ph name="SOFTWARE_NAME" />" não foi instalado corretamente no computador ou na rede. Peça ao gestor de TI que resolva este problema.</translation> -<translation id="8130693978878176684">Já não posso ajudar mais, continue por sua conta.</translation> +<translation id="8130693978878176684">Não é possível ajudar mais, continue por sua conta.</translation> <translation id="8131740175452115882">Confirmar</translation> <translation id="8149426793427495338">O computador entrou em suspensão.</translation> <translation id="8150722005171944719">O ficheiro em <ph name="URL" /> não é legível. Pode ter sido removido, movido ou as permissões do ficheiro podem estar a impedir o acesso.</translation> @@ -1194,6 +1198,7 @@ <translation id="9080712759204168376">Resumo da encomenda</translation> <translation id="9103872766612412690">Normalmente, o site <ph name="SITE" /> utiliza a encriptação para proteger as suas informações. Quando o Chromium tentou estabelecer ligação a <ph name="SITE" /> desta vez, o Website devolveu credenciais invulgares e incorretas. Isto pode acontecer quando um utilizador mal intencionado tenta simular ser <ph name="SITE" /> ou quando um ecrã de início de sessão Wi-Fi interrompe a ligação. As suas informações continuam seguras porque o Chromium interrompeu a ligação antes de qualquer troca de dados.</translation> <translation id="9106062320799175032">Adicionar endereço de faturação</translation> +<translation id="9110718169272311511">O Assistente Google no Chrome está disponível junto à parte inferior do ecrã.</translation> <translation id="9114524666733003316">A confirmar o cartão…</translation> <translation id="9128870381267983090">Ligar à rede</translation> <translation id="9137013805542155359">Mostrar original</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 1fe9db1..0dd8f15 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">nume necunoscut</translation> <translation id="1050038467049342496">închide celelalte aplicații;</translation> <translation id="1055184225775184556">&Anulați adăugarea</translation> +<translation id="1058479211578257048">Se salvează cardurile…</translation> <translation id="10614374240317010">Nu se salvează niciodată</translation> <translation id="1066396345355680611">Este posibil să pierzi accesul la conținutul protejat de pe <ph name="SITE" /> și de pe alte site-uri.</translation> <translation id="106701514854093668">Marcaje desktop</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">Gestionează metodele de plată...</translation> <translation id="4372948949327679948">Se aștepta valoarea <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Ați încercat să accesați <ph name="DOMAIN" />, dar certificatul furnizat de server a fost revocat de emitentul său. Aceasta înseamnă că acreditările de securitate furnizate de server nu sunt deloc de încredere. Este posibil să comunicați cu un atacator.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">rezultate ale căutării</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> cookie-uri</translation> <translation id="4415426530740016218">Adresă de preluare</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">Afișează-le pe toate</translation> <translation id="4989809363548539747">Acest plugin nu este acceptat</translation> <translation id="5002932099480077015">Dacă este activată, Chrome va stoca o copie a cardului pe acest dispozitiv, pentru completarea mai rapidă a formularelor.</translation> +<translation id="5014174725590676422">Se afișează ecranul pentru prima rulare a Asistentului Google în Chrome</translation> <translation id="5015510746216210676">Numele dispozitivului:</translation> <translation id="5018422839182700155">Pagina nu poate fi deschisă</translation> <translation id="5019198164206649151">Depozit de fundal în stare nevalidă</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">Utilizator curent</translation> <translation id="5730040223043577876">Chrome îți recomandă să resetezi parola dacă ai folosit-o și pe alte site-uri.</translation> <translation id="5732392974455271431">Părinții tăi îl pot debloca pentru tine</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Salvează cardul în Contul Google}few{Salvează cardurile în Contul Google}other{Salvează cardurile în Contul Google}}</translation> <translation id="5763042198335101085">Introdu o adresă de e-mail validă</translation> <translation id="5765072501007116331">Pentru a vedea metodele de livrare și cerințele, selectează o adresă</translation> <translation id="5770114862687765385">Fișierul pare deteriorat. Pentru a reseta sesiunea, dă clic pe butonul „Resetează”.</translation> @@ -1195,6 +1199,7 @@ <translation id="9080712759204168376">Rezumatul comenzii</translation> <translation id="9103872766612412690">Site-ul <ph name="SITE" /> folosește în mod obișnuit criptarea pentru a-ți proteja informațiile. Când Chromium a încercat să se conecteze la <ph name="SITE" /> de această dată, site-ul a returnat date de conectare neobișnuite și incorecte. Acest lucru s-a întâmplat fie pentru că un atacator încearcă să falsifice site-ul <ph name="SITE" />, fie pentru că un ecran de conectare Wi-Fi a întrerupt conexiunea. Securitatea informațiilor tale nu a fost afectată, deoarece Chromium a oprit conexiunea înainte ca datele să fie transferate.</translation> <translation id="9106062320799175032">Adaugă o adresă de facturare</translation> +<translation id="9110718169272311511">Asistentul Google în Chrome este disponibil în partea de jos a ecranului</translation> <translation id="9114524666733003316">Se confirmă cardul…</translation> <translation id="9128870381267983090">Conectați-vă la rețea</translation> <translation id="9137013805542155359">Afișează originalul</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index db402b0a..e2909283 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -244,7 +244,7 @@ <translation id="2501278716633472235">Назад</translation> <translation id="2503184589641749290">Дебетовые карты и карты предоплаты, которые принимаются к оплате</translation> <translation id="2515629240566999685">Проверьте уровень сигнала сети.</translation> -<translation id="2523886232349826891">Карта сохранена только на этом устройстве</translation> +<translation id="2523886232349826891">Карта будет сохранена только на этом устройстве</translation> <translation id="2524461107774643265">Укажите дополнительную информацию</translation> <translation id="2536110899380797252">Добавить адрес</translation> <translation id="2539524384386349900">Определять</translation> @@ -530,6 +530,7 @@ <translation id="4358461427845829800">Управление способами оплаты…</translation> <translation id="4372948949327679948">Ожидаемое значение: <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Вы попытались перейти на сайт <ph name="DOMAIN" />, однако сертификат, предоставленный сервером, был отозван издателем. Это означает, что учетные данные безопасности, предоставленные сервером, не заслуживают доверия. Возможно, вы имеете дело со злоумышленниками.</translation> +<translation id="4378154925671717803">Телефон</translation> <translation id="4406896451731180161">Результаты поиска</translation> <translation id="4408413947728134509">Настройки файлов cookie <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Адрес получения</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index c37dcc2..8e5bac6f 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">neznámy názov</translation> <translation id="1050038467049342496">Zavrite ostatné aplikácie</translation> <translation id="1055184225775184556">&Vrátiť späť pridanie</translation> +<translation id="1058479211578257048">Ukladajú sa karty…</translation> <translation id="10614374240317010">Neuložené</translation> <translation id="1066396345355680611">Môžete stratiť prístup ku chránenému obsahu z webu <ph name="SITE" /> a niektorých ďalších webov.</translation> <translation id="106701514854093668">Záložky v počítači</translation> @@ -527,6 +528,7 @@ <translation id="4358461427845829800">Spravovať spôsoby platby…</translation> <translation id="4372948949327679948">Očakávaná hodnota <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Pokúsili ste sa o prístup na stránky <ph name="DOMAIN" />, avšak certifikát poskytnutý serverom bol vydavateľom zrušený. Znamená to, že povereniam zabezpečenia, ktoré predložil server, sa celkom nedá dôverovať. Je možné, že komunikujete s útočníkom.</translation> +<translation id="4378154925671717803">Telefón</translation> <translation id="4406896451731180161">výsledky vyhľadávania</translation> <translation id="4408413947728134509">Súbory cookie: <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Adresa vyzdvihnutia</translation> @@ -599,6 +601,7 @@ <translation id="4989163558385430922">Zobraziť všetko</translation> <translation id="4989809363548539747">Tento doplnok nie je podporovaný</translation> <translation id="5002932099480077015">Ak túto možnosť povolíte, Chrome bude uchovávať kópiu vašej karty na tomto zariadení na účely rýchlejšieho dopĺňania formulárov.</translation> +<translation id="5014174725590676422">Zobrazuje sa obrazovka pri prvom spustení Asistenta Google v Chrome</translation> <translation id="5015510746216210676">Názov počítača:</translation> <translation id="5018422839182700155">Táto stránka sa nedá otvoriť</translation> <translation id="5019198164206649151">Zlý stav záložného ukladacieho priestoru</translation> @@ -710,6 +713,7 @@ <translation id="5720705177508910913">Aktuálny používateľ</translation> <translation id="5730040223043577876">Ak ste heslo použili aj na iných weboch, Chrome ho odporúča obnoviť.</translation> <translation id="5732392974455271431">Vaši rodičia ho môžu pre vás odblokovať</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Uloženie karty do účtu Google}few{Uloženie kariet do účtu Google}many{Save cards in your Google Account}other{Uloženie kariet do účtu Google}}</translation> <translation id="5763042198335101085">Zadajte platnú e-mailovú adresu</translation> <translation id="5765072501007116331">Ak chcete zobraziť spôsoby a požiadavky doručenia, vyberte adresu</translation> <translation id="5770114862687765385">Súbor je zrejme poškodený. Obnovte reláciu kliknutím na tlačidlo Obnoviť.</translation> @@ -1190,6 +1194,7 @@ <translation id="9080712759204168376">Súhrn objednávky</translation> <translation id="9103872766612412690">Web <ph name="SITE" /> zvyčajne chráni vaše informácie pomocou šifrovania. Keď sa prehliadač Chromium tentokrát pokúsil pripojiť k webu <ph name="SITE" />, odoslal späť nezvyčajné a nesprávne poverenia. Môže sa to stať vtedy, keď sa za web <ph name="SITE" /> snaží vydávať útočník alebo keď pripojenie preruší prihlasovacia obrazovka siete Wi‑Fi. Vaše informácie sú stále zabezpečené, pretože prehliadač Chromium zastavil pripojenie ešte pred výmenou dát.</translation> <translation id="9106062320799175032">Pridanie fakturačnej adresy</translation> +<translation id="9110718169272311511">Asistent Google sa v Chrome nachádza v dolnej časti obrazovky</translation> <translation id="9114524666733003316">Overuje sa karta…</translation> <translation id="9128870381267983090">Pripojiť k sieti</translation> <translation id="9137013805542155359">Zobraziť originál</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 3846983..11cbe9d5 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Upravljanje plačilnih sredstev ...</translation> <translation id="4372948949327679948">Pričakovana vrednost je vrste <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Poskusili ste dostopati do domene <ph name="DOMAIN" />, vendar je izdajatelj preklical potrdilo, ki ga je poslal strežnik. To pomeni, da varnostnim poverilnicam, ki jih je poslal strežnik, nikakor ne smete zaupati. Morda komunicirate z napadalcem.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">rezultati iskanja</translation> <translation id="4408413947728134509">Piškotki <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Naslov za prevzem</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index f816701a..f937863 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Управљајте начинима плаћања...</translation> <translation id="4372948949327679948">Очекивана вредност je <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Покушали сте да контактирате <ph name="DOMAIN" />, али је издавач опозвао сертификат који је сервер навео. То значи да никако не треба имати поверења у безбедносне акредитиве које је сервер навео. Могуће је да комуницирате са нападачем.</translation> +<translation id="4378154925671717803">Телефон</translation> <translation id="4406896451731180161">резултати претраге</translation> <translation id="4408413947728134509">Колачићи (<ph name="NUM_COOKIES" />)</translation> <translation id="4415426530740016218">Адреса преузимања</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 6b4877b..3f8ed69 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Hantera betalningsmetoder …</translation> <translation id="4372948949327679948">Ett <ph name="VALUE_TYPE" />-värde förväntades.</translation> <translation id="4377125064752653719">Du försökte öppna <ph name="DOMAIN" />, men servern visade ett certifikat som har återkallats av utfärdaren. Det innebär att säkerhetsuppgifterna som servern visar inte är absolut tillförlitliga. Du kanske kommunicerar med en skadlig server.</translation> +<translation id="4378154925671717803">Mobil</translation> <translation id="4406896451731180161">sökresultat</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Hämtningsadress</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 7958ae7c..ea7da09 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">jina lisilojulikana</translation> <translation id="1050038467049342496">Funga programu nyingine</translation> <translation id="1055184225775184556">Tendua Kuongeza</translation> +<translation id="1058479211578257048">Inahifadhi kadi...</translation> <translation id="10614374240317010">Haijahifadhiwa kamwe</translation> <translation id="1066396345355680611">Utapoteza idhini ya kufikia maudhui yanayolindwa kwenye <ph name="SITE" /> na tovuti nyingine.</translation> <translation id="106701514854093668">Alamisho za Eneokazi</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">Dhibiti njia za kulipa...</translation> <translation id="4372948949327679948">Thamani <ph name="VALUE_TYPE" /> inayotarajiwa.</translation> <translation id="4377125064752653719">Ulijaribu kufikia <ph name="DOMAIN" />, lakini cheti kilichowasilishwa na seva kimebatilishwa na mtoaji wacho. Huku ni kumaanisha kuwa stakabadhi za usalama zilizowasilishwa na seva hii hazifai kuaminiwa kabisa. Huenda ukawa unawasiliana na mshabulizi.</translation> +<translation id="4378154925671717803">Simu</translation> <translation id="4406896451731180161">matokeo ya utafutaji</translation> <translation id="4408413947728134509">Vidakuzi <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Anwani ya Mahali pa Kuchukulia Bidhaa</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">Angalia vyote</translation> <translation id="4989809363548539747">Programu jalizi hii haitumiki</translation> <translation id="5002932099480077015">Ikiwashwa, Chrome itahifadhi nakala ya kadi yako kwenye kifaa hiki kwa ajili ya kujaza fomu haraka zaidi.</translation> +<translation id="5014174725590676422">Inaonyesha skrini ya haraka ya programu ya Mratibu wa Google katika Chrome</translation> <translation id="5015510746216210676">Jina la Mashine:</translation> <translation id="5018422839182700155">Ukurasa huu haufunguki</translation> <translation id="5019198164206649151">Hifadhi la kucheleza liko katika hali mbaya</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">Mtumiaji wa sasa</translation> <translation id="5730040223043577876">Chrome inapendekeza ubadilishe nenosiri lako ikiwa ulilitumia tena kwenye tovuti zingine.</translation> <translation id="5732392974455271431">Wazazi wako wanaweza kukuondolea kizuizi</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Hifadhi kadi katika Akaunti yako ya Google}other{Hifadhi kadi katika Akaunti yako ya Google}}</translation> <translation id="5763042198335101085">Andika anwani sahihi ya barua pepe</translation> <translation id="5765072501007116331">Chagua mahali ili uone njia za kusafirisha na mahitaji</translation> <translation id="5770114862687765385">Inaonekana faili imeharibika. Bofya kitufe cha 'Pakia upya' ili uanzishe upya kipindi.</translation> @@ -1191,6 +1195,7 @@ <translation id="9080712759204168376">Muhtasari wa Agizo</translation> <translation id="9103872766612412690">Kwa kawaida <ph name="SITE" /> hutumia usimbaji fiche ili kulinda maelezo yako. Chromium ilipojaribu kuunganisha kwenye <ph name="SITE" /> wakati huu, tovuti ilituma kitambulisho kisicho cha kawaida na kisicho sahihi. Hili linaweza kutokea mvamizi anapojaribu kujifanya kuwa <ph name="SITE" />, au uchanganuzi wa kuingia katika Wi-Fi umeingilia muunganisho. Maelezo yako yangali salama kwa sababu Chromium ilisimamisha muunganisho kabla data yoyote itumwe.</translation> <translation id="9106062320799175032">Ongeza Anwani ya Kutuma Bili</translation> +<translation id="9110718169272311511">Programu ya Mratibu wa Google katika Chrome inapatikana karibu na sehemu ya chini ya skrini</translation> <translation id="9114524666733003316">Inathibitisha kadi…</translation> <translation id="9128870381267983090">Unganisha kwenye mtandao</translation> <translation id="9137013805542155359">Onyesha asili</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 9fef2fa..a8bc802 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -528,6 +528,7 @@ <translation id="4358461427845829800">கட்டண முறைகளை நிர்வகி...</translation> <translation id="4372948949327679948">எதிர்பார்த்த <ph name="VALUE_TYPE" /> மதிப்பு.</translation> <translation id="4377125064752653719"><ph name="DOMAIN" /> ஐ அடைய முயற்சி செய்தீர்கள். ஆனால் சேவையகம் வழங்கிய சான்றிதழானது அதன் வழங்குநரால் நிராகரிக்கப்பட்டது. அதாவது, சேவையகம் வழங்கிய பாதுகாப்பு நம்பிக்கைச்சான்றுகளை நிச்சயமாக எக்காரணத்தைக்கொண்டும் நம்பக்கூடாது. போலியான ஒன்றுடன் நீங்கள் தகவல் பரிமாற்றம் செய்துகொண்டிருக்கக்கூடும்.</translation> +<translation id="4378154925671717803">மொபைல்</translation> <translation id="4406896451731180161">தேடல் முடிவுகள்</translation> <translation id="4408413947728134509">குக்கீகள் (<ph name="NUM_COOKIES" />)</translation> <translation id="4415426530740016218">பிக்அப் முகவரி</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 6e7f907..2810915 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">చెల్లింపు పద్ధతులను నిర్వహించండి...</translation> <translation id="4372948949327679948">ఆశిస్తున్న <ph name="VALUE_TYPE" /> విలువ.</translation> <translation id="4377125064752653719"><ph name="DOMAIN" />ను చేరుకోవడానికి మీరు ప్రయత్నించారు, కానీ సర్వర్ అందించిన సర్టిఫికెట్ దాన్ని జారీ చేసినవారు రద్దు చేసారు. సర్వర్ అందించిన భద్రత ఆధారాలు ఖచ్చితంగా విశ్వసించబడలేదని దీని అర్థం. మీరు దాడి చేసే వారితో కమ్యూనికేట్ చేస్తూ ఉండవచ్చు.</translation> +<translation id="4378154925671717803">ఫోన్</translation> <translation id="4406896451731180161">శోధన ఫలితాలు</translation> <translation id="4408413947728134509">కుక్కీలు <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">పికప్ చిరునామా</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 5f08650..e242548 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">จัดการวิธีการชำระเงิน...</translation> <translation id="4372948949327679948">ค่า <ph name="VALUE_TYPE" /> ที่คาดไว้</translation> <translation id="4377125064752653719">คุณพยายามเข้าถึง <ph name="DOMAIN" /> แต่ใบรับรองที่เซิร์ฟเวอร์แจ้งมาถูกเพิกถอนโดยผู้ออกใบรับรอง ซึ่งหมายความว่าข้อมูลรับรองด้านความปลอดภัยที่เซิร์ฟเวอร์แจ้งมานั้นไม่สามารถเชื่อถือได้ คุณอาจกำลังติดต่อกับคนที่คิดจะโจมตีคุณ</translation> +<translation id="4378154925671717803">โทรศัพท์</translation> <translation id="4406896451731180161">ผลการค้นหา</translation> <translation id="4408413947728134509">คุกกี้ <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">ที่อยู่ในการรับ</translation> @@ -949,7 +950,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" />เกี่ยวกับปัญหานี้</translation> <translation id="7453467225369441013">นำคุณออกจากระบบของเว็บไซต์ส่วนใหญ่ แต่คุณจะไม่ออกจากระบบบัญชี Google</translation> <translation id="7455133967321480974">ใช้ค่าเริ่มต้นสากล (บล็อก)</translation> -<translation id="7460618730930299168">การคัดกรองแตกต่างจากที่คุณเลือก ต้องการดำเนินการต่อไหม</translation> +<translation id="7460618730930299168">การแสดงบนหน้าจอแตกต่างจากที่คุณเลือก ต้องการดำเนินการต่อไหม</translation> <translation id="7473891865547856676">ไม่ ขอบคุณ</translation> <translation id="7481312909269577407">ส่งต่อ</translation> <translation id="7485870689360869515">ไม่พบข้อมูล</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 1ee7101..123c43d 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Ödeme yöntemlerini yönet...</translation> <translation id="4372948949327679948">Beklenen <ph name="VALUE_TYPE" /> değeri.</translation> <translation id="4377125064752653719"><ph name="DOMAIN" /> adresine ulaşmayı denediniz, ancak sunucunun sağladığı sertifika, sertifikayı veren tarafından iptal edildi. Bu, sunucunun sağladığı güvenlik kimlik bilgilerine kesinlikle güvenilmemesi gerektiği anlamına gelir. Bir saldırganla irtibat kuruyor olabilirsiniz.</translation> +<translation id="4378154925671717803">Telefon</translation> <translation id="4406896451731180161">arama sonuçları</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> çerez</translation> <translation id="4415426530740016218">Alınacağı Adres</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 4df783f..7cc7692 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">Невідоме ім’я</translation> <translation id="1050038467049342496">Закрийте інші додатки</translation> <translation id="1055184225775184556">&Відмінити додавання</translation> +<translation id="1058479211578257048">Зберігання карток…</translation> <translation id="10614374240317010">Ніколи не зберігалося</translation> <translation id="1066396345355680611">Ви можете втратити доступ до захищеного вмісту на сайті <ph name="SITE" /> і деяких інших сайтах.</translation> <translation id="106701514854093668">Закладки для настільного комп’ютера</translation> @@ -531,6 +532,7 @@ <translation id="4358461427845829800">Керувати способами оплати…</translation> <translation id="4372948949327679948">Очікуване значення: <ph name="VALUE_TYPE" />.</translation> <translation id="4377125064752653719">Ви пробували зв’язатися з доменом <ph name="DOMAIN" />, проте сервер надав сертифікат, відкликаний його видавцем. Це означає, що не варто довіряти обліковим даним системи захисту, наданим сервером. Можливо, ви обмінюєтеся даними зі зловмисником.</translation> +<translation id="4378154925671717803">Телефон</translation> <translation id="4406896451731180161">результати пошуку</translation> <translation id="4408413947728134509">Файли cookie: <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Адреса отримання</translation> @@ -603,6 +605,7 @@ <translation id="4989163558385430922">Показати все</translation> <translation id="4989809363548539747">Цей плагін не підтримується</translation> <translation id="5002932099480077015">Коли цю функцію ввімкнено, Chrome зберігає копію даних вашої картки на пристрої, щоб ви могли швидше заповнювати форми.</translation> +<translation id="5014174725590676422">Показано екран першого запуску Google Асистента в Chrome</translation> <translation id="5015510746216210676">Назва пристрою:</translation> <translation id="5018422839182700155">Не вдається відкрити цю сторінку</translation> <translation id="5019198164206649151">Резервний носій пошкоджено</translation> @@ -714,6 +717,7 @@ <translation id="5720705177508910913">Поточний користувач</translation> <translation id="5730040223043577876">Chrome радить скинути пароль, якщо ви застосовували його на інших сайтах.</translation> <translation id="5732392974455271431">Батьки можуть розблокувати його</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{Збережіть картку в обліковому записі Google}one{Збережіть картки в обліковому записі Google}few{Збережіть картки в обліковому записі Google}many{Збережіть картки в обліковому записі Google}other{Збережіть картки в обліковому записі Google}}</translation> <translation id="5763042198335101085">Введіть дійсну електронну адресу</translation> <translation id="5765072501007116331">Укажіть адресу, щоб переглянути способи доставки та вимоги.</translation> <translation id="5770114862687765385">Схоже, файл пошкоджено. Натисніть кнопку "Скинути", щоб завершити сеанс.</translation> @@ -1195,6 +1199,7 @@ <translation id="9080712759204168376">Підсумок замовлення</translation> <translation id="9103872766612412690">Веб-сайт <ph name="SITE" /> зазвичай використовує шифрування для захисту вашої інформації. Під час цієї спроби Chromium під’єднатися до сторінки <ph name="SITE" /> з неї отримано незвичні й неправильні облікові дані. Це може статися, коли зловмисник намагається видавати себе за веб-сайт <ph name="SITE" /> або з’єднання перервано екраном входу Wi-Fi. Ваша інформація залишається захищеною, оскільки Chromium припинив з’єднання до того, як почався обмін будь-якими даними.</translation> <translation id="9106062320799175032">Додайте платіжну адресу</translation> +<translation id="9110718169272311511">Google Асистент розташований унизу екрана Chrome</translation> <translation id="9114524666733003316">Підтверджуються дані картки…</translation> <translation id="9128870381267983090">З'єднатися з мережею</translation> <translation id="9137013805542155359">Показати оригінал</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index eee8d12..39d17ef8 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -531,6 +531,7 @@ <translation id="4358461427845829800">Quản lý phương thức thanh toán...</translation> <translation id="4372948949327679948">Giá trị <ph name="VALUE_TYPE" /> mong đợi.</translation> <translation id="4377125064752653719">Bạn đã cố truy cập vào <ph name="DOMAIN" /> nhưng chứng chỉ mà máy chủ xuất trình đã bị nhà phát hành thu hồi. Điều này có nghĩa là giấy ủy nhiệm bảo mật mà máy chủ xuất trình hoàn toàn không đáng tin cậy. Bạn có thể đang giao tiếp với kẻ tấn công.</translation> +<translation id="4378154925671717803">Điện thoại</translation> <translation id="4406896451731180161">kết quả tìm kiếm</translation> <translation id="4408413947728134509">Cookie <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">Địa chỉ nhận hàng</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 21474aec..5ec78f7c 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -10,6 +10,7 @@ <translation id="1038842779957582377">未知名称</translation> <translation id="1050038467049342496">关闭其他应用</translation> <translation id="1055184225775184556">撤消添加(&U)</translation> +<translation id="1058479211578257048">正在保存银行卡…</translation> <translation id="10614374240317010">一律不保存</translation> <translation id="1066396345355680611">您可能会无法再访问 <ph name="SITE" /> 及其他一些网站上的受保护内容。</translation> <translation id="106701514854093668">桌面书签</translation> @@ -528,6 +529,7 @@ <translation id="4358461427845829800">管理付款方式…</translation> <translation id="4372948949327679948">应使用<ph name="VALUE_TYPE" />值。</translation> <translation id="4377125064752653719">您尝试访问的是 <ph name="DOMAIN" />,但服务器出示的证书已被其颁发者吊销。这表明绝对不应该信任此服务器出示的安全凭据。您可能正在与攻击者进行通信。</translation> +<translation id="4378154925671717803">电话机</translation> <translation id="4406896451731180161">搜索结果</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" />Cookie</translation> <translation id="4415426530740016218">取货地址</translation> @@ -600,6 +602,7 @@ <translation id="4989163558385430922">查看全部</translation> <translation id="4989809363548539747">该插件不受支持</translation> <translation id="5002932099480077015">如果您选中此项,Chrome 会将您的卡的副本存储在此设备上,以加快表单填写速度。</translation> +<translation id="5014174725590676422">显示 Chrome 中的 Google 助理的首次运行屏幕</translation> <translation id="5015510746216210676">设备名称:</translation> <translation id="5018422839182700155">无法打开此网页</translation> <translation id="5019198164206649151">后备存储状态不佳</translation> @@ -711,6 +714,7 @@ <translation id="5720705177508910913">当前用户</translation> <translation id="5730040223043577876">如果您在其他网站上重复使用了您的密码,Chrome 建议您重置该密码。</translation> <translation id="5732392974455271431">您的父母可为您取消屏蔽此网站</translation> +<translation id="5737183892635480227">{NUM_CARDS,plural, =1{将这张卡保存在您的 Google 帐号中}other{将这些卡保存在您的 Google 帐号中}}</translation> <translation id="5763042198335101085">请输入有效的电子邮件地址</translation> <translation id="5765072501007116331">要查看递送方式和要求,请选择相应地址</translation> <translation id="5770114862687765385">该文件似乎已受损。请点击“重置”按钮以重置此会话。</translation> @@ -1051,7 +1055,7 @@ <translation id="8103161714697287722">付款方式</translation> <translation id="8118489163946903409">付款方式</translation> <translation id="8127301229239896662">“<ph name="SOFTWARE_NAME" />”没有正确地安装到您的计算机或网络上。请让您的 IT 管理员解决此问题。</translation> -<translation id="8130693978878176684">我已无法再提供帮助,请自行继续。</translation> +<translation id="8130693978878176684">我已无法再提供帮助,接下来请自行操作。</translation> <translation id="8131740175452115882">确认</translation> <translation id="8149426793427495338">您的计算机已进入休眠模式。</translation> <translation id="8150722005171944719">无法读取 <ph name="URL" /> 上的文件。该文件可能已遭到删除、移动,或者文件权限不允许进行访问。</translation> @@ -1191,6 +1195,7 @@ <translation id="9080712759204168376">订单摘要</translation> <translation id="9103872766612412690"><ph name="SITE" /> 通常会使用加密技术来保护您的信息。Chromium 此次尝试连接到 <ph name="SITE" /> 时,此网站发回了异常的错误凭据。这可能是因为有攻击者在试图冒充 <ph name="SITE" />,或 Wi-Fi 登录屏幕中断了此次连接。请放心,您的信息仍然是安全的,因为 Chromium 尚未进行任何数据交换便停止了连接。</translation> <translation id="9106062320799175032">添加帐单邮寄地址</translation> +<translation id="9110718169272311511">Chrome 中的 Google 助理位于屏幕底部附近</translation> <translation id="9114524666733003316">正在确认信用卡…</translation> <translation id="9128870381267983090">连接到网络</translation> <translation id="9137013805542155359">显示原始网页</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index c614aca..920f67d 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -530,6 +530,7 @@ <translation id="4358461427845829800">管理付款方式...</translation> <translation id="4372948949327679948">預期的「<ph name="VALUE_TYPE" />」值。</translation> <translation id="4377125064752653719">你嘗試前往 <ph name="DOMAIN" />,但是發行者已撤銷伺服器提供的憑證。在這種情況下,請勿信任伺服器提供的安全性憑證,因為你的連線對象可能是攻擊者的電腦。</translation> +<translation id="4378154925671717803">電話</translation> <translation id="4406896451731180161">搜尋結果</translation> <translation id="4408413947728134509"><ph name="NUM_COOKIES" /> 個 Cookie</translation> <translation id="4415426530740016218">取件地址</translation>
diff --git a/components/subresource_filter/content/DEPS b/components/subresource_filter/content/DEPS index 6fa6163..69411d2 100644 --- a/components/subresource_filter/content/DEPS +++ b/components/subresource_filter/content/DEPS
@@ -4,6 +4,7 @@ "+ipc", "+services/network/public/cpp", "+third_party/blink/public/common", + "+third_party/blink/public/mojom", ] specific_include_rules = {
diff --git a/components/subresource_filter/content/browser/BUILD.gn b/components/subresource_filter/content/browser/BUILD.gn index d52d634..1f52117 100644 --- a/components/subresource_filter/content/browser/BUILD.gn +++ b/components/subresource_filter/content/browser/BUILD.gn
@@ -44,6 +44,7 @@ "//components/safe_browsing/db:database_manager", "//components/safe_browsing/db:util", "//components/subresource_filter/content/common", + "//components/subresource_filter/content/mojom", "//components/subresource_filter/core/browser", "//components/subresource_filter/core/common", "//components/ukm:ukm", @@ -104,6 +105,7 @@ "//components/prefs:test_support", "//components/safe_browsing/db:util", "//components/subresource_filter/content/common", + "//components/subresource_filter/content/mojom", "//components/subresource_filter/core/browser", "//components/subresource_filter/core/browser:test_support", "//components/subresource_filter/core/common",
diff --git a/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle.h b/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle.h index 8305d1e..fc89ea4 100644 --- a/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle.h +++ b/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle.h
@@ -13,7 +13,7 @@ #include "base/time/time.h" #include "base/timer/elapsed_timer.h" #include "components/subresource_filter/content/browser/verified_ruleset_dealer.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/navigation_throttle.h" namespace subresource_filter {
diff --git a/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle_unittest.cc b/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle_unittest.cc index dc285e4..f0e2ffb 100644 --- a/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle_unittest.cc +++ b/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle_unittest.cc
@@ -22,7 +22,7 @@ #include "components/subresource_filter/core/common/scoped_timers.h" #include "components/subresource_filter/core/common/test_ruleset_creator.h" #include "components/subresource_filter/core/common/test_ruleset_utils.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "components/url_pattern_index/proto/rules.pb.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents_observer.h"
diff --git a/components/subresource_filter/content/browser/async_document_subresource_filter.h b/components/subresource_filter/content/browser/async_document_subresource_filter.h index 3c87ecb..7071d6e 100644 --- a/components/subresource_filter/content/browser/async_document_subresource_filter.h +++ b/components/subresource_filter/content/browser/async_document_subresource_filter.h
@@ -15,7 +15,7 @@ #include "components/subresource_filter/content/browser/verified_ruleset_dealer.h" #include "components/subresource_filter/core/common/document_subresource_filter.h" #include "components/subresource_filter/core/common/load_policy.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "url/gurl.h" #include "url/origin.h"
diff --git a/components/subresource_filter/content/browser/async_document_subresource_filter_test_utils.h b/components/subresource_filter/content/browser/async_document_subresource_filter_test_utils.h index 7987e4ab..864093d 100644 --- a/components/subresource_filter/content/browser/async_document_subresource_filter_test_utils.h +++ b/components/subresource_filter/content/browser/async_document_subresource_filter_test_utils.h
@@ -8,7 +8,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/macros.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" namespace subresource_filter { namespace testing {
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc index 57462a4d..2e647ea 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
@@ -21,6 +21,7 @@ #include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h" #include "components/subresource_filter/content/common/subresource_filter_messages.h" #include "components/subresource_filter/content/common/subresource_filter_utils.h" +#include "components/subresource_filter/content/mojom/subresource_filter_agent.mojom.h" #include "components/subresource_filter/core/browser/subresource_filter_constants.h" #include "components/subresource_filter/core/common/common_features.h" #include "content/public/browser/navigation_handle.h" @@ -123,10 +124,17 @@ transferred_ad_frame || base::ContainsKey(ad_frames_, frame_host); DCHECK(!is_ad_subframe || !navigation_handle->IsInMainFrame()); + bool parent_is_ad = base::ContainsKey(ad_frames_, frame_host->GetParent()); + + blink::mojom::AdFrameType ad_frame_type = blink::mojom::AdFrameType::kNonAd; + if (is_ad_subframe) + ad_frame_type = parent_is_ad ? blink::mojom::AdFrameType::kChildAd + : blink::mojom::AdFrameType::kRootAd; + mojom::SubresourceFilterAgentAssociatedPtr agent; frame_host->GetRemoteAssociatedInterfaces()->GetInterface(&agent); agent->ActivateForNextCommittedLoad(filter->activation_state().Clone(), - is_ad_subframe); + ad_frame_type); } void ContentSubresourceFilterThrottleManager::DidFinishNavigation(
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h index 9bb8cf1d..fdd519e7 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h
@@ -18,7 +18,7 @@ #include "components/subresource_filter/content/browser/subresource_filter_observer.h" #include "components/subresource_filter/content/browser/verified_ruleset_dealer.h" #include "components/subresource_filter/core/common/activation_decision.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/web_contents_binding_set.h" #include "content/public/browser/web_contents_observer.h"
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc index 24b3ae4..581f747 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
@@ -22,10 +22,11 @@ #include "components/subresource_filter/content/browser/subresource_filter_client.h" #include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h" #include "components/subresource_filter/content/common/subresource_filter_messages.h" +#include "components/subresource_filter/content/mojom/subresource_filter_agent.mojom.h" #include "components/subresource_filter/core/common/common_features.h" #include "components/subresource_filter/core/common/test_ruleset_creator.h" #include "components/subresource_filter/core/common/test_ruleset_utils.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "components/url_pattern_index/proto/rules.pb.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_throttle.h" @@ -70,10 +71,12 @@ } // mojom::SubresourceFilterAgent: - void ActivateForNextCommittedLoad(mojom::ActivationStatePtr activation_state, - bool is_ad_subframe) override { + void ActivateForNextCommittedLoad( + mojom::ActivationStatePtr activation_state, + blink::mojom::AdFrameType ad_frame_type = + blink::mojom::AdFrameType::kNonAd) override { last_activation_ = std::move(activation_state); - is_ad_subframe_ = is_ad_subframe; + is_ad_subframe_ = ad_frame_type != blink::mojom::AdFrameType::kNonAd; } // These methods reset state back to default when they are called.
diff --git a/components/subresource_filter/content/browser/page_load_statistics.h b/components/subresource_filter/content/browser/page_load_statistics.h index d47e6e34..f77ef93 100644 --- a/components/subresource_filter/content/browser/page_load_statistics.h +++ b/components/subresource_filter/content/browser/page_load_statistics.h
@@ -6,7 +6,7 @@ #define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_PAGE_LOAD_STATISTICS_H_ #include "base/macros.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" namespace subresource_filter {
diff --git a/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle_unittest.cc b/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle_unittest.cc index 379c684..3dd4c72 100644 --- a/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle_unittest.cc +++ b/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle_unittest.cc
@@ -18,7 +18,7 @@ #include "components/subresource_filter/content/browser/subresource_filter_observer_test_utils.h" #include "components/subresource_filter/core/browser/subresource_filter_constants.h" #include "components/subresource_filter/core/common/test_ruleset_creator.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/test/navigation_simulator.h"
diff --git a/components/subresource_filter/content/browser/subresource_filter_client.h b/components/subresource_filter/content/browser/subresource_filter_client.h index 392e7a3..ce82afe 100644 --- a/components/subresource_filter/content/browser/subresource_filter_client.h +++ b/components/subresource_filter/content/browser/subresource_filter_client.h
@@ -7,7 +7,7 @@ #include "components/subresource_filter/content/browser/verified_ruleset_dealer.h" #include "components/subresource_filter/core/common/activation_decision.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/web_contents.h" namespace content {
diff --git a/components/subresource_filter/content/browser/subresource_filter_observer_manager.cc b/components/subresource_filter/content/browser/subresource_filter_observer_manager.cc index 087446d..64184f2e 100644 --- a/components/subresource_filter/content/browser/subresource_filter_observer_manager.cc +++ b/components/subresource_filter/content/browser/subresource_filter_observer_manager.cc
@@ -4,7 +4,7 @@ #include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" namespace subresource_filter {
diff --git a/components/subresource_filter/content/browser/subresource_filter_observer_test_utils.cc b/components/subresource_filter/content/browser/subresource_filter_observer_test_utils.cc index 5a9035e..17b1988 100644 --- a/components/subresource_filter/content/browser/subresource_filter_observer_test_utils.cc +++ b/components/subresource_filter/content/browser/subresource_filter_observer_test_utils.cc
@@ -5,7 +5,7 @@ #include "components/subresource_filter/content/browser/subresource_filter_observer_test_utils.h" #include "base/logging.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h"
diff --git a/components/subresource_filter/content/browser/subresource_filter_observer_test_utils.h b/components/subresource_filter/content/browser/subresource_filter_observer_test_utils.h index dc9870ae..a25a47a 100644 --- a/components/subresource_filter/content/browser/subresource_filter_observer_test_utils.h +++ b/components/subresource_filter/content/browser/subresource_filter_observer_test_utils.h
@@ -16,7 +16,7 @@ #include "components/subresource_filter/content/browser/subresource_filter_observer.h" #include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h" #include "components/subresource_filter/core/common/load_policy.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/browser/web_contents_observer.h" #include "url/gurl.h"
diff --git a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc index 03bc17f..b17dc36 100644 --- a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc +++ b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc
@@ -32,7 +32,7 @@ #include "components/subresource_filter/core/common/activation_list.h" #include "components/subresource_filter/core/common/test_ruleset_creator.h" #include "components/subresource_filter/core/common/test_ruleset_utils.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "components/ukm/content/source_url_recorder.h" #include "components/ukm/test_ukm_recorder.h" #include "components/url_pattern_index/proto/rules.pb.h"
diff --git a/components/subresource_filter/content/mojom/BUILD.gn b/components/subresource_filter/content/mojom/BUILD.gn new file mode 100644 index 0000000..025e259a --- /dev/null +++ b/components/subresource_filter/content/mojom/BUILD.gn
@@ -0,0 +1,18 @@ +# Copyright 2018 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//mojo/public/tools/bindings/mojom.gni") + +mojom("mojom") { + sources = [ + "subresource_filter_agent.mojom", + ] + deps = [ + "//components/subresource_filter/core/mojom", + "//mojo/public/mojom/base", + "//third_party/blink/public/mojom:mojom_platform", + ] + overridden_deps = [ "//third_party/blink/public/mojom:mojom_platform" ] + component_deps = [ "//third_party/blink/public/common" ] +}
diff --git a/components/subresource_filter/mojom/OWNERS b/components/subresource_filter/content/mojom/OWNERS similarity index 100% copy from components/subresource_filter/mojom/OWNERS copy to components/subresource_filter/content/mojom/OWNERS
diff --git a/components/subresource_filter/content/mojom/subresource_filter_agent.mojom b/components/subresource_filter/content/mojom/subresource_filter_agent.mojom new file mode 100644 index 0000000..7a1b2f8 --- /dev/null +++ b/components/subresource_filter/content/mojom/subresource_filter_agent.mojom
@@ -0,0 +1,19 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module subresource_filter.mojom; + +import "components/subresource_filter/core/mojom/subresource_filter.mojom"; +import "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom"; + +interface SubresourceFilterAgent { + // Instructs the renderer to activate subresource filtering at the specified + // |activation_state| for the document load committed next in a frame. + // + // Most be called just before mojom::FrameNavigationControl::CommitNavigation, + // at ReadyToCommitNavigation time. If not called, the default behavior is + // mojom::ActivationLevel::kDisabled. + ActivateForNextCommittedLoad(ActivationState activation_state, + blink.mojom.AdFrameType ad_type); +}; \ No newline at end of file
diff --git a/components/subresource_filter/content/renderer/BUILD.gn b/components/subresource_filter/content/renderer/BUILD.gn index 8531c9b..131caba 100644 --- a/components/subresource_filter/content/renderer/BUILD.gn +++ b/components/subresource_filter/content/renderer/BUILD.gn
@@ -18,6 +18,7 @@ deps = [ "//base", "//components/subresource_filter/content/common", + "//components/subresource_filter/content/mojom", "//components/subresource_filter/core/common", "//content/public/common", "//content/public/renderer", @@ -39,6 +40,7 @@ "//base", "//base/test:test_support", "//components/subresource_filter/content/common", + "//components/subresource_filter/content/mojom", "//components/subresource_filter/core/common", "//components/subresource_filter/core/common:test_support", "//testing/gmock",
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc index 6db93050..20b21bbd 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
@@ -91,8 +91,9 @@ return render_frame()->GetWebFrame()->IsAdSubframe(); } -void SubresourceFilterAgent::SetIsAdSubframe() { - render_frame()->GetWebFrame()->SetIsAdSubframe(); +void SubresourceFilterAgent::SetIsAdSubframe( + blink::mojom::AdFrameType ad_frame_type) { + render_frame()->GetWebFrame()->SetIsAdSubframe(ad_frame_type); } // static @@ -186,10 +187,11 @@ void SubresourceFilterAgent::ActivateForNextCommittedLoad( mojom::ActivationStatePtr activation_state, - bool is_ad_subframe) { + blink::mojom::AdFrameType ad_frame_type) { activation_state_for_next_commit_ = *activation_state; - if (is_ad_subframe) - SetIsAdSubframe(); + if (ad_frame_type != blink::mojom::AdFrameType::kNonAd) { + SetIsAdSubframe(ad_frame_type); + } } void SubresourceFilterAgent::OnDestruct() {
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.h b/components/subresource_filter/content/renderer/subresource_filter_agent.h index 7d1c9de8..8338bb1 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent.h +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.h
@@ -9,8 +9,9 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "components/subresource_filter/content/mojom/subresource_filter_agent.mojom.h" #include "components/subresource_filter/content/renderer/ad_resource_tracker.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer_tracker.h" #include "mojo/public/cpp/bindings/associated_binding.h" @@ -70,11 +71,12 @@ // True if the frame has been heuristically determined to be an ad subframe. virtual bool IsAdSubframe(); - virtual void SetIsAdSubframe(); + virtual void SetIsAdSubframe(blink::mojom::AdFrameType ad_frame_type); // mojom::SubresourceFilterAgent: - void ActivateForNextCommittedLoad(mojom::ActivationStatePtr activation_state, - bool is_ad_subframe) override; + void ActivateForNextCommittedLoad( + mojom::ActivationStatePtr activation_state, + blink::mojom::AdFrameType ad_frame_type) override; private: // Assumes that the parent will be in a local frame relative to this one, upon
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc index 14de844..4f9f7b0 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc +++ b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
@@ -29,6 +29,8 @@ namespace { +using AdFrameType = blink::mojom::AdFrameType; + // The SubresourceFilterAgent with its dependencies on Blink mocked out. // // This approach is somewhat rudimentary, but appears to be the best compromise @@ -64,7 +66,10 @@ } bool IsAdSubframe() override { return is_ad_subframe_; } - void SetIsAdSubframe() override { is_ad_subframe_ = true; } + void SetIsAdSubframe( + AdFrameType ad_frame_type = AdFrameType::kNonAd) override { + is_ad_subframe_ = true; + } blink::WebDocumentSubresourceFilter* filter() { return last_injected_filter_.get(); @@ -145,17 +150,19 @@ // No DidFinishLoad is called in this case. } - void StartLoadAndSetActivationState(mojom::ActivationLevel level, - bool is_ad_subframe = false) { + void StartLoadAndSetActivationState( + mojom::ActivationLevel level, + AdFrameType ad_type = AdFrameType::kNonAd) { mojom::ActivationState state; state.activation_level = level; - StartLoadAndSetActivationState(state, is_ad_subframe); + StartLoadAndSetActivationState(state, ad_type); } - void StartLoadAndSetActivationState(mojom::ActivationState state, - bool is_ad_subframe = false) { + void StartLoadAndSetActivationState( + mojom::ActivationState state, + AdFrameType ad_type = AdFrameType::kNonAd) { agent_as_rfo()->DidStartProvisionalLoad(nullptr, true); - agent()->ActivateForNextCommittedLoad(state.Clone(), is_ad_subframe); + agent()->ActivateForNextCommittedLoad(state.Clone(), ad_type); agent_as_rfo()->DidCommitProvisionalLoad( false /* is_same_document_navigation */, ui::PAGE_TRANSITION_LINK); } @@ -252,14 +259,16 @@ SetTestRulesetToDisallowURLsWithPathSuffix(kTestFirstURLPathSuffix)); MemoryMappedRuleset::SetMemoryMapFailuresForTesting(true); ExpectNoSubresourceFilterGetsInjected(); - StartLoadAndSetActivationState(mojom::ActivationLevel::kEnabled, - false /* is_associated_with_ad_subframe */); + StartLoadAndSetActivationState( + mojom::ActivationLevel::kEnabled, + AdFrameType::kNonAd /* is_associated_with_ad_subframe */); ASSERT_TRUE(::testing::Mock::VerifyAndClearExpectations(agent())); MemoryMappedRuleset::SetMemoryMapFailuresForTesting(false); ExpectSubresourceFilterGetsInjected(); - StartLoadAndSetActivationState(mojom::ActivationLevel::kEnabled, - false /* is_associated_with_ad_subframe */); + StartLoadAndSetActivationState( + mojom::ActivationLevel::kEnabled, + AdFrameType::kNonAd /* is_associated_with_ad_subframe */); } TEST_F(SubresourceFilterAgentTest, Disabled_NoFilterIsInjected) { @@ -462,7 +471,7 @@ state->activation_level = mojom::ActivationLevel::kEnabled; state->measure_performance = true; agent()->ActivateForNextCommittedLoad(std::move(state), - false /* is_ad_subframe */); + AdFrameType::kNonAd /* ad_type */); agent_as_rfo()->DidFailProvisionalLoad( blink::WebURLError(net::ERR_FAILED, blink::WebURL())); agent_as_rfo()->DidStartProvisionalLoad(nullptr, true); @@ -562,8 +571,9 @@ SetTestRulesetToDisallowURLsWithPathSuffix(kTestFirstURLPathSuffix)); ExpectSubresourceFilterGetsInjected(); - StartLoadAndSetActivationState(mojom::ActivationLevel::kDryRun, - true /* is_associated_with_ad_subframe */); + StartLoadAndSetActivationState( + mojom::ActivationLevel::kDryRun, + AdFrameType::kRootAd /* is_associated_with_ad_subframe */); ASSERT_TRUE(::testing::Mock::VerifyAndClearExpectations(agent())); // Test the ad subframe value that is set at the filter. @@ -579,8 +589,9 @@ ASSERT_NO_FATAL_FAILURE( SetTestRulesetToDisallowURLsWithPathSuffix("somethingNotMatched")); ExpectSubresourceFilterGetsInjected(); - StartLoadAndSetActivationState(mojom::ActivationLevel::kDryRun, - false /* is_associated_with_ad_subframe */); + StartLoadAndSetActivationState( + mojom::ActivationLevel::kDryRun, + AdFrameType::kNonAd /* is_associated_with_ad_subframe */); ASSERT_TRUE(::testing::Mock::VerifyAndClearExpectations(agent())); EXPECT_TRUE(agent()->IsAdSubframe());
diff --git a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc index 91af3f8..a6b6c46 100644 --- a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc +++ b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc
@@ -12,7 +12,7 @@ #include "base/message_loop/message_loop_current.h" #include "components/subresource_filter/core/common/load_policy.h" #include "components/subresource_filter/core/common/memory_mapped_ruleset.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_request.h" #include "url/gurl.h"
diff --git a/components/subresource_filter/core/browser/subresource_filter_features.h b/components/subresource_filter/core/browser/subresource_filter_features.h index c376d8d..72549240 100644 --- a/components/subresource_filter/core/browser/subresource_filter_features.h +++ b/components/subresource_filter/core/browser/subresource_filter_features.h
@@ -15,7 +15,7 @@ #include "base/strings/string_piece.h" #include "components/subresource_filter/core/common/activation_list.h" #include "components/subresource_filter/core/common/activation_scope.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" namespace base { namespace trace_event {
diff --git a/components/subresource_filter/core/common/BUILD.gn b/components/subresource_filter/core/common/BUILD.gn index 6acaad4..e5aa774 100644 --- a/components/subresource_filter/core/common/BUILD.gn +++ b/components/subresource_filter/core/common/BUILD.gn
@@ -30,7 +30,7 @@ public_deps = [ "//components/subresource_filter/core/common/flat:indexed_ruleset", - "//components/subresource_filter/mojom", + "//components/subresource_filter/core/mojom", "//components/url_pattern_index", ]
diff --git a/components/subresource_filter/core/common/document_subresource_filter.h b/components/subresource_filter/core/common/document_subresource_filter.h index 19e2fa0d..af1254c 100644 --- a/components/subresource_filter/core/common/document_subresource_filter.h +++ b/components/subresource_filter/core/common/document_subresource_filter.h
@@ -14,7 +14,7 @@ #include "base/memory/ref_counted.h" #include "components/subresource_filter/core/common/indexed_ruleset.h" #include "components/subresource_filter/core/common/load_policy.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "components/url_pattern_index/proto/rules.pb.h" class GURL;
diff --git a/components/subresource_filter/mojom/BUILD.gn b/components/subresource_filter/core/mojom/BUILD.gn similarity index 100% rename from components/subresource_filter/mojom/BUILD.gn rename to components/subresource_filter/core/mojom/BUILD.gn
diff --git a/components/subresource_filter/mojom/OWNERS b/components/subresource_filter/core/mojom/OWNERS similarity index 100% rename from components/subresource_filter/mojom/OWNERS rename to components/subresource_filter/core/mojom/OWNERS
diff --git a/components/subresource_filter/mojom/subresource_filter.mojom b/components/subresource_filter/core/mojom/subresource_filter.mojom similarity index 87% rename from components/subresource_filter/mojom/subresource_filter.mojom rename to components/subresource_filter/core/mojom/subresource_filter.mojom index d8753722..516eb45 100644 --- a/components/subresource_filter/mojom/subresource_filter.mojom +++ b/components/subresource_filter/core/mojom/subresource_filter.mojom
@@ -78,16 +78,4 @@ // evaluating subresource loads in its allowLoad method. The time metrics are // equal to zero if performance measurements were disabled for the load. SetDocumentLoadStatistics(DocumentLoadStatistics statistics); -}; - -interface SubresourceFilterAgent { - // Instructs the renderer to activate subresource filtering at the specified - // |activation_state| for the document load committed next in a frame. - // - // Most be called just before mojom::FrameNavigationControl::CommitNavigation, - // at ReadyToCommitNavigation time. If not called, the default behavior is - // mojom::ActivationLevel::kDisabled. - ActivateForNextCommittedLoad(ActivationState activation_state, - bool is_ad_subframe); -}; - +}; \ No newline at end of file
diff --git a/components/subresource_filter/tools/filter_tool.cc b/components/subresource_filter/tools/filter_tool.cc index 06b4dba..69e1b85c 100644 --- a/components/subresource_filter/tools/filter_tool.cc +++ b/components/subresource_filter/tools/filter_tool.cc
@@ -17,7 +17,7 @@ #include "base/values.h" #include "components/subresource_filter/core/common/document_subresource_filter.h" #include "components/subresource_filter/core/common/load_policy.h" -#include "components/subresource_filter/mojom/subresource_filter.mojom.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "components/url_pattern_index/flat/url_pattern_index_generated.h" #include "components/url_pattern_index/proto/rules.pb.h" #include "components/url_pattern_index/url_rule_util.h"
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index 7eabf897..7cde5af0 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc
@@ -402,6 +402,21 @@ content::GetNetworkChangeNotifier()); network_change_notifier->OnConnectionChanged( net::NetworkChangeNotifier::CONNECTION_ETHERNET); + // If the network service is enabled, set the connection type for its + // NetworkChangeNotifier instance as well. + if (base::FeatureList::IsEnabled(network::features::kNetworkService) && + !IsNetworkServiceRunningInProcess()) { + network::mojom::NetworkChangeManagerPtr manager_ptr; + network::mojom::NetworkChangeManagerRequest request( + mojo::MakeRequest(&manager_ptr)); + GetNetworkService()->GetNetworkChangeManager(std::move(request)); + manager_ptr->OnNetworkChanged( + /*dns_changed=*/false, /*ip_address_changed=*/false, + /*connection_type_changed=*/true, + network::mojom::ConnectionType::CONNECTION_ETHERNET, + /*connection_subtype_changed=*/false, + network::mojom::ConnectionSubtype::SUBTYPE_UNKNOWN); + } #endif if (base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/content/public/test/test_browser_thread_bundle.cc b/content/public/test/test_browser_thread_bundle.cc index 77db4f2..964ddff1 100644 --- a/content/public/test/test_browser_thread_bundle.cc +++ b/content/public/test/test_browser_thread_bundle.cc
@@ -41,8 +41,7 @@ int options) : base::test::ScopedTaskEnvironment(main_thread_type, execution_control_mode), - options_(options), - threads_created_(false) { + options_(options) { // Infer |options_| from |main_thread_type|. switch (main_thread_type) { case base::test::ScopedTaskEnvironment::MainThreadType::DEFAULT: @@ -70,8 +69,6 @@ options) {} TestBrowserThreadBundle::~TestBrowserThreadBundle() { - CHECK(threads_created_); - // To ensure a clean teardown, each thread's message loop must be flushed // just before the thread is destroyed. But stopping a fake thread does not // automatically flush the message loop, so we have to do it manually. @@ -116,8 +113,6 @@ // Check for conflicting options can't have two IO threads. CHECK(!(options_ & IO_MAINLOOP) || !(options_ & REAL_IO_THREAD)); - // There must be a thread to start to use DONT_CREATE_BROWSER_THREADS - CHECK((options_ & ~IO_MAINLOOP) != DONT_CREATE_BROWSER_THREADS); // Check for conflicting main loop options. CHECK(!(options_ & IO_MAINLOOP) || !(options_ & PLAIN_MAINLOOP)); @@ -140,13 +135,6 @@ ui_thread_ = std::make_unique<TestBrowserThread>( BrowserThread::UI, base::ThreadTaskRunnerHandle::Get()); - if (!(options_ & DONT_CREATE_BROWSER_THREADS)) - CreateBrowserThreads(); -} - -void TestBrowserThreadBundle::CreateBrowserThreads() { - CHECK(!threads_created_); - if (options_ & REAL_IO_THREAD) { io_thread_ = std::make_unique<TestBrowserThread>(BrowserThread::IO); io_thread_->StartIOThread(); @@ -155,8 +143,6 @@ BrowserThread::IO, base::ThreadTaskRunnerHandle::Get()); } - threads_created_ = true; - // Consider startup complete such that after-startup-tasks always run in // the scope of the test they were posted from (http://crbug.com/732018). SetBrowserStartupIsCompleteForTesting();
diff --git a/content/public/test/test_browser_thread_bundle.h b/content/public/test/test_browser_thread_bundle.h index 9eb42916..7108320 100644 --- a/content/public/test/test_browser_thread_bundle.h +++ b/content/public/test/test_browser_thread_bundle.h
@@ -115,16 +115,14 @@ // base::FileDescriptorWatcher API on POSIX). IO_MAINLOOP = 1 << 0, REAL_IO_THREAD = 1 << 1, - DONT_CREATE_BROWSER_THREADS = 1 << 2, // The main thread will use a plain main loop instead of a MessageLoopForUI. // (i.e. will support ThreadTaskRunnerHandle::Get() and RunLoop only). - PLAIN_MAINLOOP = 1 << 3, + PLAIN_MAINLOOP = 1 << 2, }; // Deprecated. explicit TestBrowserThreadBundle(int options); - // |options| here to support REAL_IO_THREAD & DONT_CREATE_BROWSER_THREADS. TestBrowserThreadBundle( base::test::ScopedTaskEnvironment::MainThreadType main_thread_type = base::test::ScopedTaskEnvironment::MainThreadType::UI, @@ -132,10 +130,6 @@ base::test::ScopedTaskEnvironment::ExecutionMode::ASYNC, int options = DEFAULT); - // Creates browser threads; should only be called from other classes if the - // DONT_CREATE_BROWSER_THREADS option was used when the bundle was created. - void CreateBrowserThreads(); - // Runs all tasks posted to TaskScheduler and main thread until idle. // Note: At the moment, this will not process BrowserThread::IO if this // TestBrowserThreadBundle is using a REAL_IO_THREAD. @@ -166,7 +160,6 @@ std::unique_ptr<TestBrowserThread> io_thread_; int options_; - bool threads_created_; #if defined(OS_WIN) std::unique_ptr<base::win::ScopedCOMInitializer> com_initializer_;
diff --git a/content/renderer/media/stream/media_stream_constraints_util_audio.cc b/content/renderer/media/stream/media_stream_constraints_util_audio.cc index 24d2cd3f..d3514fd 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_audio.cc +++ b/content/renderer/media/stream/media_stream_constraints_util_audio.cc
@@ -239,6 +239,12 @@ // echoCancellation, googEchoCancellation and echoCancellationType. class EchoCancellationContainer { public: + // Default constructor intended to temporarily create an empty object. + EchoCancellationContainer() + : ec_mode_allowed_values_(EchoCancellationTypeSet::EmptySet()), + device_parameters_(media::AudioParameters::UnavailableDeviceParams()), + is_device_capture_(true) {} + EchoCancellationContainer(std::vector<EchoCancellationType> allowed_values, bool has_active_source, bool is_device_capture, @@ -360,11 +366,12 @@ static base::Optional<EchoCancellationType> ToEchoCancellationType( const char* blink_type) { - if (strcmp(blink_type, blink::kEchoCancellationTypeBrowser) == 0) { + std::string blink_type_str = std::string(blink_type); + if (blink_type_str == blink::kEchoCancellationTypeBrowser) { return EchoCancellationType::kEchoCancellationAec2; - } else if (strcmp(blink_type, blink::kEchoCancellationTypeAec3) == 0) { + } else if (blink_type_str == blink::kEchoCancellationTypeAec3) { return EchoCancellationType::kEchoCancellationAec3; - } else if (strcmp(blink_type, blink::kEchoCancellationTypeSystem) == 0) { + } else if (blink_type_str == blink::kEchoCancellationTypeSystem) { return EchoCancellationType::kEchoCancellationSystem; } else { return base::nullopt; @@ -650,7 +657,7 @@ const char* failed_constraint_name = nullptr; failed_constraint_name = - echo_cancellation_container_->ApplyConstraintSet(constraint_set); + echo_cancellation_container_.ApplyConstraintSet(constraint_set); if (failed_constraint_name != nullptr) return failed_constraint_name; @@ -685,13 +692,13 @@ AudioProcessingProperties properties; Score ec_score(0.0); std::tie(ec_score, properties.echo_cancellation_type) = - echo_cancellation_container_->SelectSettingsAndScore(constraint_set); + echo_cancellation_container_.SelectSettingsAndScore(constraint_set); score += ec_score; // Update the default settings for each audio-processing properties // according to |echo_cancellation| and whether the source considered is // device capture. - echo_cancellation_container_->UpdateDefaultValues( + echo_cancellation_container_.UpdateDefaultValues( constraint_set.echo_cancellation, &properties); for (size_t i = 0; i < kNumBooleanContainerIds; ++i) { @@ -717,7 +724,7 @@ if (container.IsEmpty()) return true; } - return echo_cancellation_container_->IsEmpty() || + return echo_cancellation_container_.IsEmpty() || sample_size_container_.IsEmpty(); } @@ -837,7 +844,7 @@ // the option without processing. int GetProcessingPriority(const BooleanConstraint& ec_constraint) const { bool use_processing_by_default = - echo_cancellation_container_->GetDefaultValueForAudioProperties( + echo_cancellation_container_.GetDefaultValueForAudioProperties( ec_constraint); switch (processing_type_) { @@ -852,7 +859,7 @@ ProcessingType processing_type_; std::array<BooleanContainer, kNumBooleanContainerIds> boolean_containers_; - base::Optional<EchoCancellationContainer> echo_cancellation_container_; + EchoCancellationContainer echo_cancellation_container_; IntegerContainer sample_size_container_; };
diff --git a/docs/gpu/vaapi.md b/docs/gpu/vaapi.md new file mode 100644 index 0000000..9b54899df --- /dev/null +++ b/docs/gpu/vaapi.md
@@ -0,0 +1,224 @@ +# VaAPI + +This page documents tracing and debugging the Video Acceleration API (VaAPI or +VA-API) on ChromeOS. The VA-API is an open-source library and API specification, +providing access to graphics hardware acceleration capabilities for video and +image processing. The VaAPI is used on ChromeOS on both Intel and AMD platforms. + +[TOC] + +## Overview + +VaAPI code is developed upstream on the [VaAPI GitHub repository], from which +ChromeOS is a downstream client via the [libva] package, with packaged backends +for e.g. both [Intel] and [AMD]. + +[VaAPI GitHub repository]: https://github.com/intel/libva +[libva]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/x11-libs/libva/ +[Intel]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/x11-libs/libva-intel-driver/ +[AMD]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/media-libs/libva-amdgpu-driver/ + +## Tracing VaAPI video decoding + +A simplified diagram of the buffer circulation is provided below. The "client" +is always a Renderer process via a Mojo/IPC communication. Essentially the VaAPI +Video Decode Accelerator ([VaVDA]) receives encoded BitstreamBuffers from the +"client", and sends them to the "va internals", which eventually produces +decoded video in PictureBuffers. The VaVDA may or may not use the `Vpp` unit for +pixel format adaptation, depending on the codec used, silicon generation and +other specifics. + +``` + K BitstreamBuffers +-----+ +-------------------+ + C --------------------->| Va | -----> | + L <---------------------| VDA | <---- va internals | + I (encoded stuff) | | | | + E | | | +-----+ +----+ + N <---------------------| | <----| |<------| lib| + T --------------------->| | ---->| Vpp |------>| va | + N +-----+ +-+-----+ M +----+ + PictureBuffers VASurfaces + (decoded stuff) +``` +*** aside +PictureBuffers are created by the "client" but allocated and filled in by the +VaVDA. `K` is unrelated to both `M` and `N`. +*** + +[VaVDA]: https://cs.chromium.org/chromium/src/media/gpu/vaapi/vaapi_video_decode_accelerator.h?type=cs&q=vaapivideodecodeaccelerator&sq=package:chromium&g=0&l=57 + +### Tracing memory consumption + +Tracing memory consumption is done via the [MemoryInfra] system. Please take a +minute and read that document (in particular the [difference between +`effective_size` and `size`]). The VaAPI lives inside the GPU process (a.k.a. +Viz process), so please familiarize yourself with the [GPU Memory Tracing] +document. The VaVDA provides information by implementing the [Memory Dump +Provider] interface, but the information provided varies with the executing mode +as explained next. + +#### Internal VASurfaces accountancy + +The usage of the `Vpp` unit is controlled by the member variable +[`|decode_using_client_picture_buffers_|`] and is very advantageous in terms of +CPU, power and memory consumption (see [crbug.com/822346]). + +* When [`|decode_using_client_picture_buffers_|`] is false, `libva` uses a set + of internally allocated VASurfaces that are accounted for in the + `gpu/vaapi/decoder` tracing category (see screenshot below). Each of these + VASurfaces is backed by a Buffer Object large enough to hold, at least, the + decoded image in YUV semiplanar format. In the diagram above, `M` varies: 4 + for VP8, 9 for VP9, 4-12 for H264/AVC1 (see [`GetNumReferenceFrames()`]). + + + +* When [`|decode_using_client_picture_buffers_|`] is true, `libva` can decode + directly on the client's PictureBuffers, `M = 0`, and the `gpu/vaapi/decoder` + category is not present in the GPU MemoryInfra. + +[MemoryInfra]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/memory-infra/README.md#memoryinfra +[difference between `effective_size` and `size`]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/memory-infra#effective_size-vs_size +[GPU Memory Tracing]: ../memory-infra/probe-gpu.md +[Memory Dump Provider]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/memory-infra/adding_memory_infra_tracing.md +[`|decode_using_client_picture_buffers_|`]: https://cs.chromium.org/search/?q=decode_using_client_picture_buffers_&sq=package:chromium&type=cs +[crbug.com/822346]: https://crbug.com/822346 +[`GetNumReferenceFrames()`]: https://cs.chromium.org/search/?q=GetNumReferenceFrames+file:%5Esrc/media/gpu/+package:%5Echromium$+file:%5C.cc&type=cs + +#### PictureBuffers accountancy + +VaVDA allocates storage for the N PictureBuffers provided by the client by means +of VaapiPicture{NativePixmapOzone}s, backed by NativePixmaps, themselves backed +by DmaBufs (the client only knows about the client Texture IDs). The GPU's +TextureManager accounts for these textures, but: +- They are not correctly identified as being backed by NativePixmaps (see + [crbug.com/514914]). +- They are not correctly linked back to the Renderer or ARC++ client on behalf + of whom the allocation took place, like e.g. [the probe-gpu example] (see + [crbug.com/721674]). + +See e.g. the following ToT example for 10 1920x1080p textures (32bpp); finding +the desired `context_group` can be tricky. + + + +[crbug.com/514914]: https://crbug.com/514914 +[the probe-gpu example]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/memory-infra/probe-gpu.md#example +[crbug.com/721674]: https://crbug.com/721674 + +### Tracing power consumption + +Power consumption is available on ChromeOS test/dev images via the command line +binary [`dump_intel_rapl_consumption`]; this tool averages the power +consumption of the four SoC domains over a configurable period of time, usually +a few seconds. These domains are, in the order presented by the tool: + +* `pkg`: estimated power consumption of the whole SoC; in particular, this is a + superset of pp0 and pp1, including all accessory silicon, e.g. video + processing. +* `pp0`: CPU set. +* `pp1`/`gfx`: Integrated GPU or GPUs. +* `dram`: estimated power consumption of the DRAM, from the bus activity. + +Googlers can read more about this topic under +[go/power-consumption-meas-in-intel]. + +`dump_intel_rapl_consumption` is usually run while a given workload is active +(e.g. a video playback) with an interval larger than a second to smooth out all +kinds of system services that would show up in smaller periods, e.g. WiFi. + +```shell +dump_intel_rapl_consumption --interval_ms=2000 --repeat --verbose +``` + +E.g. on a nocturne main1, the average power consumption while playing back the +first minute of a 1080p VP9 [video], the average consumptions in watts are: + +|`pkg` |`pp0` |`pp1`/`gfx` |`dram`| +| ---: | ---: | ---: | ---: | +| 2.63 | 1.44 | 0.29 | 0.87 | + +As can be seen, `pkg` ~= `pp0` + `pp1` + 1W, this extra watt is the cost of all +the associated silicon, e.g. bridges, bus controllers, caches, and the media +processing engine. + +[`dump_intel_rapl_consumption`]: https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/tools/dump_intel_rapl_consumption.cc +[video]: https://commons.wikimedia.org/wiki/File:Big_Buck_Bunny_4K.webm +[go/power-consumption-meas-in-intel]: http://go/power-consumption-meas-in-intel + +### Tracing CPU cycles and instantaneous buffer usage + +TODO(mcasas): fill in this section. + +## Verifying VaAPI installation and usage + +### <a name="verify-driver"></a> Verify the VaAPI is correctly installed and can be loaded + +`vainfo` is a small command line utility used to enumerate the supported +operation modes; it's developed in the [libva-utils] repository, but more +concretely available on ChromeOS dev images ([media-video/libva-utils] package) +and under Debian systems ([vainfo]). `vainfo` will try to load the appropriate +backend driver for the system and/or GPUs and fail if it cannot find/load it. + +[libva-utils]: https://github.com/intel/libva-utils +[media-video/libva-utils]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/media-video/libva-utils +[vainfo]: https://packages.debian.org/sid/main/vainfo + +### <a name="verify-vaapi"></a> Verify the VaAPI supports and/or uses a given codec + +A few steps are customary to verify the support and use of a given codec. + +To verify that the build and platform supports video acceleration, launch +Chromium and navigate to `chrome://gpu`, then: +* Search for the "Video Acceleration Information" Section: this should + enumerate the available accelerated codecs and resolutions. +* If this section is empty, oftentimes the "Log Messages" Section immediately + below might indicate an associated error, e.g.: + + > vaInitialize failed: unknown libva error + + that can usually be reproduced with `vainfo`, see the [previous + section](#verify-driver). + +To verify that a given video is being played back using the accelerated video +decoding backend: +* Navigate to a url that causes a video to be played. Leave it playing. +* Navigate to the `chrome://media-internals` tab. + * Find the entry associated to the video-playing tab. + * Scroll down to "`Player Properties`" and check the "`video_decoder`" entry: + it should say "GpuVideoDecoder". + +### VaAPI on Linux + +This configuration is **unsupported** (see [docs/linux_hw_video_decode.md]), the +following instructions are provided only as a reference for developers to test +the code paths on a Linux machine. + +* Follow the instructions under the [Linux build setup] document, adding the GN + argument `use_vaapi=true` in the args.gn file (please refer to the [Setting up + the build]) Section). +* To support proprietary codecs such as, e.g. H264/AVC1, add the options + `proprietary_codecs = true` and `ffmpeg_branding = "Chrome"` to the GN args. +* Build Chromium as usual. + +At this point you should make sure the appropriate VA driver backend is working +correctly; try running `vainfo` from the command line and verify no errors show +up. + +To run Chromium using VaAPI two arguments are necessary: +* `--ignore-gpu-blacklist` +* `--use-gl=desktop` or `--use-gl=egl` + +Also, the environment variable `MESA_GLSL_CACHE_DISABLE=false` should be set: + +**TODO(crbug.com/917091): Further clarify the env variable and the flags** + +```shell + MESA_GLSL_CACHE_DISABLE=false ./out/gn/chrome --ignore-gpu-blacklist --use-gl=egl +``` + +Refer to the [previous section](#verify-vaapi) to verify support and use of +the VaAPI. + +[docs/linux_hw_video_decode.md]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux_hw_video_decode.md +[Linux build setup]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux_build_instructions.md +[Setting up the build]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux_build_instructions.md#setting-up-the-build
diff --git a/docs/updating_clang.md b/docs/updating_clang.md index 18d139c..0a47fc2 100644 --- a/docs/updating_clang.md +++ b/docs/updating_clang.md
@@ -46,7 +46,6 @@ ```shell git cl try && - git cl try -m tryserver.blink -b linux_trusty_blink_rel && git cl try -B luci.chromium.try -b ios-device -b mac_chromium_asan_rel_ng \ -b linux_chromium_cfi_rel_ng \ -b linux_chromium_chromeos_asan_rel_ng -b linux_chromium_msan_rel_ng \
diff --git a/extensions/browser/api/idle/idle_api.cc b/extensions/browser/api/idle/idle_api.cc index 17ae5a82..5131c7c 100644 --- a/extensions/browser/api/idle/idle_api.cc +++ b/extensions/browser/api/idle/idle_api.cc
@@ -4,8 +4,6 @@ #include "extensions/browser/api/idle/idle_api.h" -#include "base/bind.h" -#include "base/callback.h" #include "base/values.h" #include "extensions/browser/api/idle/idle_api_constants.h" #include "extensions/browser/api/idle/idle_manager.h" @@ -38,14 +36,13 @@ EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &threshold)); threshold = ClampThreshold(threshold); - IdleManagerFactory::GetForBrowserContext(context_)->QueryState( - threshold, base::Bind(&IdleQueryStateFunction::IdleStateCallback, this)); + ui::IdleState state = + IdleManagerFactory::GetForBrowserContext(context_)->QueryState(threshold); - return RespondLater(); + return RespondNow(OneArgument(IdleManager::CreateIdleValue(state))); } void IdleQueryStateFunction::IdleStateCallback(ui::IdleState state) { - Respond(OneArgument(IdleManager::CreateIdleValue(state))); } ExtensionFunction::ResponseAction IdleSetDetectionIntervalFunction::Run() {
diff --git a/extensions/browser/api/idle/idle_api_unittest.cc b/extensions/browser/api/idle/idle_api_unittest.cc index 8470b13..69f3a1de 100644 --- a/extensions/browser/api/idle/idle_api_unittest.cc +++ b/extensions/browser/api/idle/idle_api_unittest.cc
@@ -43,8 +43,8 @@ public: TestIdleProvider(); ~TestIdleProvider() override; - void CalculateIdleState(int idle_threshold, ui::IdleCallback notify) override; - void CalculateIdleTime(ui::IdleTimeCallback notify) override; + ui::IdleState CalculateIdleState(int idle_threshold) override; + int CalculateIdleTime() override; bool CheckIdleStateIsLocked() override; void set_idle_time(int idle_time); @@ -61,21 +61,18 @@ TestIdleProvider::~TestIdleProvider() { } -void TestIdleProvider::CalculateIdleState(int idle_threshold, - ui::IdleCallback notify) { +ui::IdleState TestIdleProvider::CalculateIdleState(int idle_threshold) { if (locked_) { - notify.Run(ui::IDLE_STATE_LOCKED); + return ui::IDLE_STATE_LOCKED; + } else if (idle_time_ >= idle_threshold) { + return ui::IDLE_STATE_IDLE; } else { - if (idle_time_ >= idle_threshold) { - notify.Run(ui::IDLE_STATE_IDLE); - } else { - notify.Run(ui::IDLE_STATE_ACTIVE); - } + return ui::IDLE_STATE_ACTIVE; } } -void TestIdleProvider::CalculateIdleTime(ui::IdleTimeCallback notify) { - notify.Run(idle_time_); +int TestIdleProvider::CalculateIdleTime() { + return idle_time_; } bool TestIdleProvider::CheckIdleStateIsLocked() {
diff --git a/extensions/browser/api/idle/idle_manager.cc b/extensions/browser/api/idle/idle_manager.cc index be613eb4..ae442aa 100644 --- a/extensions/browser/api/idle/idle_manager.cc +++ b/extensions/browser/api/idle/idle_manager.cc
@@ -70,8 +70,8 @@ DefaultIdleProvider(); ~DefaultIdleProvider() override; - void CalculateIdleState(int idle_threshold, ui::IdleCallback notify) override; - void CalculateIdleTime(ui::IdleTimeCallback notify) override; + ui::IdleState CalculateIdleState(int idle_threshold) override; + int CalculateIdleTime() override; bool CheckIdleStateIsLocked() override; }; @@ -81,13 +81,12 @@ DefaultIdleProvider::~DefaultIdleProvider() { } -void DefaultIdleProvider::CalculateIdleState(int idle_threshold, - ui::IdleCallback notify) { - ui::CalculateIdleState(idle_threshold, notify); +ui::IdleState DefaultIdleProvider::CalculateIdleState(int idle_threshold) { + return ui::CalculateIdleState(idle_threshold); } -void DefaultIdleProvider::CalculateIdleTime(ui::IdleTimeCallback notify) { - ui::CalculateIdleTime(notify); +int DefaultIdleProvider::CalculateIdleTime() { + return ui::CalculateIdleTime(); } bool DefaultIdleProvider::CheckIdleStateIsLocked() { @@ -122,9 +121,7 @@ last_state_(ui::IDLE_STATE_ACTIVE), idle_time_provider_(new DefaultIdleProvider()), event_delegate_(new DefaultEventDelegate(context)), - extension_registry_observer_(this), - weak_factory_(this) { -} + extension_registry_observer_(this) {} IdleManager::~IdleManager() { } @@ -168,9 +165,9 @@ } } -void IdleManager::QueryState(int threshold, const QueryStateCallback& notify) { +ui::IdleState IdleManager::QueryState(int threshold) { DCHECK(thread_checker_.CalledOnValidThread()); - idle_time_provider_->CalculateIdleState(threshold, notify); + return idle_time_provider_->CalculateIdleState(threshold); } void IdleManager::SetThreshold(const std::string& extension_id, int threshold) { @@ -232,12 +229,7 @@ void IdleManager::UpdateIdleState() { DCHECK(thread_checker_.CalledOnValidThread()); - idle_time_provider_->CalculateIdleTime(base::Bind( - &IdleManager::UpdateIdleStateCallback, weak_factory_.GetWeakPtr())); -} - -void IdleManager::UpdateIdleStateCallback(int idle_time) { - DCHECK(thread_checker_.CalledOnValidThread()); + int idle_time = idle_time_provider_->CalculateIdleTime(); bool locked = idle_time_provider_->CheckIdleStateIsLocked(); int listener_count = 0;
diff --git a/extensions/browser/api/idle/idle_manager.h b/extensions/browser/api/idle/idle_manager.h index 59d6195ae..e8e83d1f 100644 --- a/extensions/browser/api/idle/idle_manager.h +++ b/extensions/browser/api/idle/idle_manager.h
@@ -9,10 +9,8 @@ #include <memory> #include <string> -#include "base/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/macros.h" -#include "base/memory/weak_ptr.h" #include "base/scoped_observer.h" #include "base/threading/thread_checker.h" #include "base/timer/timer.h" @@ -32,8 +30,6 @@ namespace extensions { class ExtensionRegistry; -typedef base::Callback<void(ui::IdleState)> QueryStateCallback; - struct IdleMonitor { explicit IdleMonitor(ui::IdleState initial_state); @@ -50,9 +46,8 @@ public: IdleTimeProvider() {} virtual ~IdleTimeProvider() {} - virtual void CalculateIdleState(int idle_threshold, - ui::IdleCallback notify) = 0; - virtual void CalculateIdleTime(ui::IdleTimeCallback notify) = 0; + virtual ui::IdleState CalculateIdleState(int idle_threshold) = 0; + virtual int CalculateIdleTime() = 0; virtual bool CheckIdleStateIsLocked() = 0; private: @@ -89,7 +84,7 @@ void OnListenerAdded(const EventListenerInfo& details) override; void OnListenerRemoved(const EventListenerInfo& details) override; - void QueryState(int threshold, const QueryStateCallback& notify); + ui::IdleState QueryState(int threshold); void SetThreshold(const std::string& extension_id, int threshold); static std::unique_ptr<base::Value> CreateIdleValue(ui::IdleState idle_state); @@ -122,7 +117,6 @@ void StartPolling(); void StopPolling(); void UpdateIdleState(); - void UpdateIdleStateCallback(int idle_time); content::BrowserContext* const context_; @@ -140,8 +134,6 @@ ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> extension_registry_observer_; - base::WeakPtrFactory<IdleManager> weak_factory_; - DISALLOW_COPY_AND_ASSIGN(IdleManager); };
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index 0f838e8..d72125c 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc
@@ -258,7 +258,16 @@ void FeatureInfo::Initialize(ContextType context_type, bool is_passthrough_cmd_decoder, - const DisallowedFeatures& disallowed_features) { + const DisallowedFeatures& disallowed_features, + bool force_reinitialize) { + if (initialized_) { + DCHECK_EQ(context_type, context_type_); + DCHECK_EQ(is_passthrough_cmd_decoder, is_passthrough_cmd_decoder_); + DCHECK(disallowed_features == disallowed_features_); + if (!force_reinitialize) + return; + } + disallowed_features_ = disallowed_features; context_type_ = context_type; is_passthrough_cmd_decoder_ = is_passthrough_cmd_decoder; @@ -272,20 +281,24 @@ break; } InitializeFeatures(); + initialized_ = true; } void FeatureInfo::InitializeForTesting( const DisallowedFeatures& disallowed_features) { + initialized_ = false; Initialize(CONTEXT_TYPE_OPENGLES2, false /* is_passthrough_cmd_decoder */, disallowed_features); } void FeatureInfo::InitializeForTesting() { + initialized_ = false; Initialize(CONTEXT_TYPE_OPENGLES2, false /* is_passthrough_cmd_decoder */, DisallowedFeatures()); } void FeatureInfo::InitializeForTesting(ContextType context_type) { + initialized_ = false; Initialize(context_type, false /* is_passthrough_cmd_decoder */, DisallowedFeatures()); }
diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h index c4a2893..922eb929 100644 --- a/gpu/command_buffer/service/feature_info.h +++ b/gpu/command_buffer/service/feature_info.h
@@ -154,7 +154,8 @@ // Initializes the feature information. Needs a current GL context. void Initialize(ContextType context_type, bool is_passthrough_cmd_decoder, - const DisallowedFeatures& disallowed_features); + const DisallowedFeatures& disallowed_features, + bool force_reinitialize = false); // Helper that defaults to no disallowed features and a GLES2 context. void InitializeForTesting(); @@ -232,6 +233,8 @@ void InitializeFeatures(); void InitializeFloatAndHalfFloatFeatures(const gfx::ExtensionSet& extensions); + bool initialized_ = false; + Validators validators_; DisallowedFeatures disallowed_features_;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h index 01be2ce..37f590e1 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -65,6 +65,10 @@ oes_texture_half_float_linear = false; } + bool operator==(const DisallowedFeatures& other) const { + return !std::memcmp(this, &other, sizeof(*this)); + } + bool npot_support = false; bool chromium_color_buffer_float_rgba = false; bool chromium_color_buffer_float_rgb = false;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc index 0c5c3138..79191cf8 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -3677,9 +3677,9 @@ // Make sure newly enabled extensions are exposed and usable. context_->ReinitializeDynamicBindings(); - feature_info_->Initialize(feature_info_->context_type(), - true /* is_passthrough_cmd_decoder */, - feature_info_->disallowed_features()); + feature_info_->Initialize( + feature_info_->context_type(), true /* is_passthrough_cmd_decoder */, + feature_info_->disallowed_features(), true /* force_reinitialize */); return error::kNoError; }
diff --git a/gpu/command_buffer/service/gr_cache_controller_unittest.cc b/gpu/command_buffer/service/gr_cache_controller_unittest.cc index b4c489cc..ee2bea37 100644 --- a/gpu/command_buffer/service/gr_cache_controller_unittest.cc +++ b/gpu/command_buffer/service/gr_cache_controller_unittest.cc
@@ -6,6 +6,7 @@ #include "base/bind_helpers.h" #include "base/test/test_mock_time_task_runner.h" +#include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/raster_decoder_context_state.h" #include "gpu/config/gpu_driver_bug_workarounds.h" #include "gpu/config/gpu_feature_info.h" @@ -39,7 +40,9 @@ std::move(share_group), std::move(surface), std::move(context), false /* use_virtualized_gl_contexts */, base::DoNothing()); context_state_->InitializeGrContext(workarounds, nullptr); - context_state_->InitializeGL(workarounds, GpuFeatureInfo()); + auto feature_info = + base::MakeRefCounted<gles2::FeatureInfo>(workarounds, GpuFeatureInfo()); + context_state_->InitializeGL(std::move(feature_info)); controller_ = std::make_unique<GrCacheController>(context_state_.get(), task_runner_);
diff --git a/gpu/command_buffer/service/raster_decoder_context_state.cc b/gpu/command_buffer/service/raster_decoder_context_state.cc index dc08769..2b974f5 100644 --- a/gpu/command_buffer/service/raster_decoder_context_state.cc +++ b/gpu/command_buffer/service/raster_decoder_context_state.cc
@@ -66,8 +66,7 @@ GpuProcessActivityFlags* activity_flags, gl::ProgressReporter* progress_reporter) { if (!use_vulkan_gr_context) { - DCHECK(context_->IsCurrent(surface())); - + DCHECK(context_->IsCurrent(nullptr)); sk_sp<GrGLInterface> interface(gl::init::CreateGrGLInterface( *context_->GetVersionInfo(), workarounds.use_es2_for_oopr, progress_reporter)); @@ -118,15 +117,20 @@ } bool RasterDecoderContextState::InitializeGL( - const GpuDriverBugWorkarounds& gpu_driver_bug_workarounds, - const GpuFeatureInfo& gpu_feature_info) { - if (use_vulkan_gr_context) + scoped_refptr<gles2::FeatureInfo> feature_info) { + // We still need initialize GL when Vulkan is used, because RasterDecoder + // depends on GL. + // TODO(penghuang): don't initialize GL when RasterDecoder can work without + // GL. + if (IsGLInitialized()) { + DCHECK(feature_info == feature_info_); + DCHECK(context_state_); return true; - DCHECK(!context_state_); + } - feature_info_ = base::MakeRefCounted<gles2::FeatureInfo>( - gpu_driver_bug_workarounds, gpu_feature_info); + DCHECK(context_->IsCurrent(nullptr)); + feature_info_ = std::move(feature_info); feature_info_->Initialize(gpu::CONTEXT_TYPE_OPENGLES2, false /* is_passthrough_cmd_decoder */, gles2::DisallowedFeatures()); @@ -135,8 +139,10 @@ const GLint kGLES2RequiredMinimumVertexAttribs = 8u; GLint max_vertex_attribs = 0; api->glGetIntegervFn(GL_MAX_VERTEX_ATTRIBS, &max_vertex_attribs); - if (max_vertex_attribs < kGLES2RequiredMinimumVertexAttribs) + if (max_vertex_attribs < kGLES2RequiredMinimumVertexAttribs) { + feature_info_ = nullptr; return false; + } context_state_ = std::make_unique<gles2::ContextState>( feature_info_.get(), false /* track_texture_and_sampler_units */); @@ -154,8 +160,11 @@ auto virtual_context = base::MakeRefCounted<GLContextVirtual>( share_group_.get(), real_context_.get(), weak_ptr_factory_.GetWeakPtr()); - if (!virtual_context->Initialize(surface_.get(), gl::GLContextAttribs())) + if (!virtual_context->Initialize(surface_.get(), gl::GLContextAttribs())) { + feature_info_ = nullptr; + context_state_ = nullptr; return false; + } context_ = std::move(virtual_context); MakeCurrent(nullptr); } @@ -179,12 +188,13 @@ void RasterDecoderContextState::MarkContextLost() { if (!context_lost_) { context_lost_ = true; - context_state_->MarkContextLost(); + // context_state_ could be nullptr for some unittests. + if (context_state_) + context_state_->MarkContextLost(); if (gr_context) gr_context->abandonContext(); std::move(context_lost_callback).Run(); } - // TODO notify gpu channel manager. } bool RasterDecoderContextState::IsCurrent(gl::GLSurface* surface) {
diff --git a/gpu/command_buffer/service/raster_decoder_context_state.h b/gpu/command_buffer/service/raster_decoder_context_state.h index d34c6222..c30f9ac 100644 --- a/gpu/command_buffer/service/raster_decoder_context_state.h +++ b/gpu/command_buffer/service/raster_decoder_context_state.h
@@ -27,7 +27,6 @@ namespace gpu { class GpuDriverBugWorkarounds; -struct GpuFeatureInfo; class GpuProcessActivityFlags; class ServiceTransferCache; namespace gles2 { @@ -58,9 +57,8 @@ GpuProcessActivityFlags* activity_flags = nullptr, gl::ProgressReporter* progress_reporter = nullptr); - // TODO(penghuang) do not depend on ContextGroup. - bool InitializeGL(const GpuDriverBugWorkarounds& gpu_driver_bug_workarounds, - const GpuFeatureInfo& gpu_feature_info); + bool InitializeGL(scoped_refptr<gles2::FeatureInfo> feature_info); + bool IsGLInitialized() const { return !!feature_info_; } bool MakeCurrent(gl::GLSurface* surface); void MarkContextLost(); @@ -75,6 +73,7 @@ gl::GLContext* context() { return context_.get(); } gl::GLContext* real_context() { return real_context_.get(); } gl::GLSurface* surface() { return surface_.get(); } + gles2::FeatureInfo* feature_info() { return feature_info_.get(); } gles2::ContextState* context_state() const { return context_state_.get(); } bool context_lost() const { return context_lost_; }
diff --git a/gpu/command_buffer/service/raster_decoder_unittest.cc b/gpu/command_buffer/service/raster_decoder_unittest.cc index 5c01948..4ecc1c0 100644 --- a/gpu/command_buffer/service/raster_decoder_unittest.cc +++ b/gpu/command_buffer/service/raster_decoder_unittest.cc
@@ -221,14 +221,15 @@ share_group.get(), surface.get(), gl::GLContextAttribs()); ASSERT_TRUE(context->MakeCurrent(surface.get())); + auto feature_info = + base::MakeRefCounted<gles2::FeatureInfo>(workarounds, gpu_feature_info); + context_state_ = new raster::RasterDecoderContextState( std::move(share_group), std::move(surface), std::move(context), false /* use_virtualized_gl_contexts */, base::DoNothing()); context_state_->InitializeGrContext(workarounds, nullptr); - context_state_->InitializeGL(workarounds, gpu_feature_info); + context_state_->InitializeGL(feature_info); - scoped_refptr<gles2::FeatureInfo> feature_info = - new gles2::FeatureInfo(workarounds, gpu_feature_info); group_ = new gles2::ContextGroup( gpu_preferences_, false, &mailbox_manager_, nullptr /* memory_tracker */, &shader_translator_cache_,
diff --git a/gpu/command_buffer/service/raster_decoder_unittest_base.cc b/gpu/command_buffer/service/raster_decoder_unittest_base.cc index 28caf24..abf807ef 100644 --- a/gpu/command_buffer/service/raster_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/raster_decoder_unittest_base.cc
@@ -250,11 +250,7 @@ init.lose_context_when_out_of_memory; attribs.context_type = context_type; - // Setup expections for RasterDecoderContextState::InitializeGL() - // It will initialize a FeatureInfo and - gles2::TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( - gl_.get(), all_extensions.c_str(), "" /* gl_renderer */, - init.gl_version.c_str(), CONTEXT_TYPE_OPENGLES2); + // Setup expectations for RasterDecoderContextState::InitializeGL(). EXPECT_CALL(*gl_, GetIntegerv(GL_MAX_VERTEX_ATTRIBS, _)) .WillOnce(SetArgPointee<1>(8u)) .RetiresOnSaturation(); @@ -266,8 +262,7 @@ feature_info->workarounds().use_virtualized_gl_contexts, base::DoNothing()); - raster_decoder_context_state_->InitializeGL(init.workarounds, - gpu_feature_info); + raster_decoder_context_state_->InitializeGL(feature_info); decoder_.reset(RasterDecoder::Create(this, command_buffer_service_.get(), &outputter_, group_.get(),
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc index 242928fd..354a0c6c 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
@@ -57,7 +57,9 @@ std::move(share_group), surface_, context_, false /* use_virtualized_gl_contexts */, base::DoNothing()); context_state_->InitializeGrContext(workarounds, nullptr); - context_state_->InitializeGL(workarounds, GpuFeatureInfo()); + auto feature_info = + base::MakeRefCounted<gles2::FeatureInfo>(workarounds, GpuFeatureInfo()); + context_state_->InitializeGL(std::move(feature_info)); memory_type_tracker_ = std::make_unique<MemoryTypeTracker>(nullptr); shared_image_representation_factory_ =
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc index 77eeed0..9b1a5b4 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc
@@ -56,19 +56,19 @@ preferences, workarounds, GpuFeatureInfo(), factory); scoped_refptr<gl::GLShareGroup> share_group = new gl::GLShareGroup(); - context_state_ = new raster::RasterDecoderContextState( + auto feature_info = + base::MakeRefCounted<gles2::FeatureInfo>(workarounds, GpuFeatureInfo()); + context_state_ = base::MakeRefCounted<raster::RasterDecoderContextState>( std::move(share_group), surface_, context_, false /* use_virtualized_gl_contexts */, base::DoNothing()); context_state_->InitializeGrContext(workarounds, nullptr); - context_state_->InitializeGL(workarounds, GpuFeatureInfo()); + context_state_->InitializeGL(feature_info); memory_type_tracker_ = std::make_unique<MemoryTypeTracker>(nullptr); shared_image_representation_factory_ = std::make_unique<SharedImageRepresentationFactory>( &shared_image_manager_, nullptr); - scoped_refptr<gles2::FeatureInfo> feature_info = - new gles2::FeatureInfo(workarounds, GpuFeatureInfo()); supports_etc1_ = feature_info->validators()->compressed_texture_format.IsValid( GL_ETC1_RGB8_OES);
diff --git a/gpu/command_buffer/tests/fuzzer_main.cc b/gpu/command_buffer/tests/fuzzer_main.cc index 8f10415..5d6ebca8 100644 --- a/gpu/command_buffer/tests/fuzzer_main.cc +++ b/gpu/command_buffer/tests/fuzzer_main.cc
@@ -364,7 +364,7 @@ share_group_, surface_, context_, config_.workarounds.use_virtualized_gl_contexts, base::DoNothing()); context_state->InitializeGrContext(config_.workarounds, nullptr); - context_state->InitializeGL(config_.workarounds, gpu_feature_info); + context_state->InitializeGL(feature_info); auto* context = context_state->context(); decoder_.reset(raster::RasterDecoder::Create( command_buffer_.get(), command_buffer_->service(), &outputter_,
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc index 56275e39..dfac9af0 100644 --- a/gpu/ipc/in_process_command_buffer.cc +++ b/gpu/ipc/in_process_command_buffer.cc
@@ -570,8 +570,7 @@ context_state_ = base::MakeRefCounted<raster::RasterDecoderContextState>( gl_share_group_, surface_, real_context, use_virtualized_gl_context_, base::DoNothing()); - context_state_->InitializeGL(workarounds, - task_executor_->gpu_feature_info()); + context_state_->InitializeGL(context_group_->feature_info()); gr_shader_cache_ = params.gr_shader_cache; context_state_->InitializeGrContext(workarounds, params.gr_shader_cache, params.activity_flags);
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc index 5b186c5..ae0b2ad 100644 --- a/gpu/ipc/service/gpu_channel_manager.cc +++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -424,18 +424,23 @@ /*synthetic_loss=*/false), vulkan_context_provider_); - if (!vulkan_context_provider_) { - if (!raster_decoder_context_state_->InitializeGL( - gpu_driver_bug_workarounds(), gpu_feature_info())) { - raster_decoder_context_state_ = nullptr; - return nullptr; - } - } - - const bool enable_raster_transport = + // OOP-R needs GrContext for raster tiles. + bool need_gr_context = gpu_feature_info_.status_values[GPU_FEATURE_TYPE_OOP_RASTERIZATION] == gpu::kGpuFeatureStatusEnabled; - if (enable_raster_transport || features::IsUsingSkiaRenderer()) { + + // SkiaRenderer needs GrContext to composite output surface. + need_gr_context |= features::IsUsingSkiaRenderer(); + + if (need_gr_context) { + if (!vulkan_context_provider_) { + auto feature_info = base::MakeRefCounted<gles2::FeatureInfo>( + gpu_driver_bug_workarounds(), gpu_feature_info()); + if (!raster_decoder_context_state_->InitializeGL(feature_info.get())) { + raster_decoder_context_state_ = nullptr; + return nullptr; + } + } raster_decoder_context_state_->InitializeGrContext( gpu_driver_bug_workarounds_, gr_shader_cache(), &activity_flags_, watchdog_);
diff --git a/gpu/ipc/service/raster_command_buffer_stub.cc b/gpu/ipc/service/raster_command_buffer_stub.cc index 1751107..4488c5a 100644 --- a/gpu/ipc/service/raster_command_buffer_stub.cc +++ b/gpu/ipc/service/raster_command_buffer_stub.cc
@@ -93,22 +93,6 @@ return ContextResult::kFatalFailure; } - auto feature_info = base::MakeRefCounted<gles2::FeatureInfo>( - manager->gpu_driver_bug_workarounds(), manager->gpu_feature_info()); - gpu::GpuMemoryBufferFactory* gmb_factory = - manager->gpu_memory_buffer_factory(); - context_group_ = base::MakeRefCounted<gles2::ContextGroup>( - manager->gpu_preferences(), gles2::PassthroughCommandDecoderSupported(), - manager->mailbox_manager(), CreateMemoryTracker(init_params), - manager->shader_translator_cache(), - manager->framebuffer_completeness_cache(), std::move(feature_info), - init_params.attribs.bind_generates_resource, channel_->image_manager(), - gmb_factory ? gmb_factory->AsImageFactory() : nullptr, - /*progress_reporter=*/manager->watchdog(), manager->gpu_feature_info(), - manager->discardable_manager(), - manager->passthrough_discardable_manager(), - manager->shared_image_manager()); - ContextResult result; auto raster_decoder_context_state = manager->GetRasterDecoderContextState(&result); @@ -119,6 +103,32 @@ return result; } + if (!raster_decoder_context_state->IsGLInitialized()) { + if (!raster_decoder_context_state->MakeCurrent(nullptr) || + !raster_decoder_context_state->InitializeGL( + base::MakeRefCounted<gles2::FeatureInfo>( + manager->gpu_driver_bug_workarounds(), + manager->gpu_feature_info()))) { + LOG(ERROR) << "Failed to Initialize GL for RasterDecoderContextState"; + return ContextResult::kFatalFailure; + } + } + + gpu::GpuMemoryBufferFactory* gmb_factory = + manager->gpu_memory_buffer_factory(); + context_group_ = base::MakeRefCounted<gles2::ContextGroup>( + manager->gpu_preferences(), gles2::PassthroughCommandDecoderSupported(), + manager->mailbox_manager(), CreateMemoryTracker(init_params), + manager->shader_translator_cache(), + manager->framebuffer_completeness_cache(), + raster_decoder_context_state->feature_info(), + init_params.attribs.bind_generates_resource, channel_->image_manager(), + gmb_factory ? gmb_factory->AsImageFactory() : nullptr, + /*progress_reporter=*/manager->watchdog(), manager->gpu_feature_info(), + manager->discardable_manager(), + manager->passthrough_discardable_manager(), + manager->shared_image_manager()); + surface_ = raster_decoder_context_state->surface(); share_group_ = raster_decoder_context_state->share_group(); use_virtualized_gl_context_ =
diff --git a/ios/build/bots/scripts/run.py b/ios/build/bots/scripts/run.py index 5ae6fd7..9b9622e 100755 --- a/ios/build/bots/scripts/run.py +++ b/ios/build/bots/scripts/run.py
@@ -40,15 +40,18 @@ if args.xcode_parallelization: tr = xcodebuild_runner.SimulatorParallelTestRunner( args.app, + args.iossim, args.xcode_build_version, args.version, args.platform, out_dir=args.out_dir, mac_toolchain=args.mac_toolchain_cmd, - retry=args.retries, + retries=args.retries, shards=args.shards, xcode_path=args.xcode_path, - test_cases=args.test_cases + test_cases=args.test_cases, + test_args=test_args, + env_vars=args.env_var ) elif args.replay_path != 'NO_PATH': tr = test_runner.WprProxySimulatorTestRunner(
diff --git a/ios/build/bots/scripts/xcodebuild_runner.py b/ios/build/bots/scripts/xcodebuild_runner.py index a178364..3e9ee6b 100644 --- a/ios/build/bots/scripts/xcodebuild_runner.py +++ b/ios/build/bots/scripts/xcodebuild_runner.py
@@ -465,31 +465,39 @@ def __init__( self, - app, + app_path, + iossim_path, xcode_build_version, version, platform, out_dir, mac_toolchain=None, - retry=1, + retries=1, shards=1, xcode_path=None, - test_cases=None + test_cases=None, + test_args=None, + env_vars=None ): """Initializes a new instance of SimulatorParallelTestRunner class. Args: - app: (str) A path to egtests_app. + app_path: (str) A path to egtests_app. + iossim_path: Path to the compiled iossim binary to use. + Not used, but is required by the base class. xcode_build_version: (str) Xcode build version for running tests. version: (str) iOS version to run simulator on. platform: (str) Name of device. out_dir: (str) A directory to emit test data into. mac_toolchain: (str) A command to run `mac_toolchain` tool. - retry: (int) A number to retry test run, will re-run only failed tests. + retries: (int) A number to retry test run, will re-run only failed tests. shards: (int) A number of shards. Default is 1. xcode_path: (str) A path to Xcode.app folder. test_cases: (list) List of tests to be included in the test run. None or [] to include all tests. + test_args: List of strings to pass as arguments to the test when + launching. + env_vars: List of environment variables to pass to the test itself. Raises: AppNotFoundError: If the given app does not exist. @@ -497,16 +505,22 @@ XcodeVersionNotFoundError: If the given Xcode version does not exist. XCTestPlugInNotFoundError: If the .xctest PlugIn does not exist. """ - self.app = os.path.abspath(app) - self.xcode_build_version = xcode_build_version - self.version = version - self.platform = platform - self.out_dir = out_dir - self.mac_toolchain = mac_toolchain - self.retry = retry or 1 - self.shards = shards or 1 - self.xcode_path = xcode_path - self.test_cases = test_cases + super(SimulatorParallelTestRunner, self).__init__( + app_path, + iossim_path, + platform, + version, + xcode_build_version, + out_dir, + env_vars=env_vars, + mac_toolchain=mac_toolchain, + retries=retries or 1, + shards=shards or 1, + test_args=test_args, + test_cases=test_cases, + xcode_path=xcode_path, + xctest=False + ) self._init_sharding_data() self.logs = collections.OrderedDict() self.test_results = collections.OrderedDict() @@ -527,7 +541,7 @@ """ self.sharding_data = [ { - 'app': self.app, + 'app': self.app_path, # Destination is required to run tests via xcodebuild and it # looks like # 'platform=iOS Simulator,OS=<os_version>,Name=<simulator-name>' @@ -559,7 +573,7 @@ EgtestsApp(params['app'], filtered_tests=params['test_cases']), params['destination'], shards=params['shards'], - retries=self.retry, + retries=self.retries, out_dir=os.path.join(self.out_dir, destinaion_folder(params['destination'])), env=self.get_launch_env()))
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn index 764c485..2e03f56 100644 --- a/ios/chrome/app/BUILD.gn +++ b/ios/chrome/app/BUILD.gn
@@ -235,6 +235,7 @@ "//ios/chrome/browser/upgrade", "//ios/chrome/browser/variations:ios_chrome_ui_string_overrider_factory", "//ios/chrome/browser/voice", + "//ios/chrome/browser/web", "//ios/chrome/browser/web:tab_id_tab_helper", "//ios/chrome/browser/web:web_internal", "//ios/chrome/browser/web_state_list",
diff --git a/ios/chrome/app/intents/Intents.intentdefinition b/ios/chrome/app/intents/Intents.intentdefinition index 1ec8047..6079d66 100644 --- a/ios/chrome/app/intents/Intents.intentdefinition +++ b/ios/chrome/app/intents/Intents.intentdefinition
@@ -7,18 +7,18 @@ <key>INIntentDefinitionModelVersion</key> <string>1.0</string> <key>INIntentDefinitionSystemVersion</key> - <string>17G65</string> + <string>18A391</string> <key>INIntentDefinitionToolsBuildVersion</key> - <string>10A254a</string> + <string>10B61</string> <key>INIntentDefinitionToolsVersion</key> - <string>10.0</string> + <string>10.1</string> <key>INIntents</key> <array> <dict> <key>INIntentCategory</key> <string>information</string> - <key>INIntentDescription</key> - <string></string> + <key>INIntentDefaultImageName</key> + <string>AppIcon</string> <key>INIntentDescriptionID</key> <string>k0Ho6W</string> <key>INIntentLastParameterTag</key>
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 1676ed1..9e631dc 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -108,7 +108,6 @@ #import "ios/chrome/browser/tabs/tab.h" #import "ios/chrome/browser/tabs/tab_model.h" #import "ios/chrome/browser/tabs/tab_model_observer.h" -#import "ios/chrome/browser/tabs/tab_util.h" #import "ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.h" #import "ios/chrome/browser/ui/browser_view_controller.h" #include "ios/chrome/browser/ui/commands/browser_commands.h" @@ -135,6 +134,7 @@ #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.h" #import "ios/chrome/browser/web/tab_id_tab_helper.h" +#import "ios/chrome/browser/web/web_navigation_util.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #include "ios/chrome/common/app_group/app_group_utils.h" #include "ios/net/cookies/cookie_store_ios.h" @@ -2194,13 +2194,13 @@ if (!(currentTabInTargetBVC.webState && IsURLNtp(currentTabInTargetBVC.webState->GetVisibleURL()))) { [targetBVC appendTabAddedCompletion:tabOpenedCompletion]; - [targetTabModel - insertTabWithLoadParams:CreateWebLoadParams(URL, transition, - /*post_data=*/nullptr) - opener:nil - openedByDOM:NO - atIndex:targetTabModel.count - inBackground:NO]; + auto params = web_navigation_util::CreateWebLoadParams( + URL, transition, /*post_data=*/nullptr); + [targetTabModel insertTabWithLoadParams:params + opener:nil + openedByDOM:NO + atIndex:targetTabModel.count + inBackground:NO]; } Tab* newTab = currentTabInTargetBVC; @@ -2275,13 +2275,13 @@ ? TabSwitcherDismissalMode::NORMAL : TabSwitcherDismissalMode::INCOGNITO; [targetInterface.bvc appendTabAddedCompletion:tabOpenedCompletion]; - tab = [targetInterface.tabModel - insertTabWithLoadParams:CreateWebLoadParams(url, transition, - /*post_data=*/nullptr) - opener:nil - openedByDOM:NO - atIndex:tabIndex - inBackground:NO]; + auto params = web_navigation_util::CreateWebLoadParams( + url, transition, /*post_data=*/nullptr); + tab = [targetInterface.tabModel insertTabWithLoadParams:params + opener:nil + openedByDOM:NO + atIndex:tabIndex + inBackground:NO]; } else { // Voice search, QRScanner and the omnibox are presented by the BVC. // They must be started after the BVC view is added in the hierarchy.
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 6c8bb93..9cbb34a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">ወደ የንባብ ዝርዝር ታክሏል</translation> <translation id="1821253160463689938">የእርስዎን ምርጫዎች ለማስታወስ ኩኪዎችን ይጠቀማል፣ እነዚያን ገጾች ባይጎበኙም እንኳ</translation> <translation id="1876721852596493031">የጥቅመት ብዛትን ላክ</translation> -<translation id="1880677175115548835">ጽሑፍ ይምረጡ</translation> <translation id="1886928167269928266">የጊዜ መጀመሪያ</translation> <translation id="1911619930368729126">ወደ Google Drive ስቀል</translation> <translation id="1941314575388338491">ለመቅዳት ሁለቴ መታ ያድርጉ።</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">የአሰሳ ውሂብን በማጽዳት ላይ...</translation> <translation id="2256128224215992540">የፍለጋ እና የጣቢያ አስተያየት ጥቆማዎች</translation> <translation id="2267753748892043616">መለያ አክል</translation> +<translation id="2268044343513325586">አጽዳ</translation> <translation id="2273327106802955778">ተጨማሪ ምናሌ</translation> <translation id="2320166752086256636">የቁልፍ ሰሌዳን ደብቅ</translation> <translation id="2339560363438331454">ማመሳሰል እና የGoogle አገልግሎቶች</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 0c1a6da..c2c60990 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">تمت الإضافة إلى قائمة القراءة</translation> <translation id="1821253160463689938">يستخدم ملفات تعريف الارتباط لتذكّر الإعدادات المُفضّلة حتى إذا لم تزُر تلك الصفحات.</translation> <translation id="1876721852596493031">إرسال بيانات الاستخدام</translation> -<translation id="1880677175115548835">اختيار نص</translation> <translation id="1886928167269928266">بدايةَ الوقت</translation> <translation id="1911619930368729126">التحميل إلى Google Drive</translation> <translation id="1941314575388338491">انقر مرّتين للنسخ.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">جارٍ محو بيانات التصفُّح...</translation> <translation id="2256128224215992540">اقتراحات البحث والمواقع</translation> <translation id="2267753748892043616">إضافة حساب</translation> +<translation id="2268044343513325586">تحسين</translation> <translation id="2273327106802955778">قائمة "المزيد"</translation> <translation id="2320166752086256636">إخفاء لوحة المفاتيح</translation> <translation id="2339560363438331454">خدمات Google والمزامنة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index 42a81a9..1707594b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Добавихте към списъка за четене</translation> <translation id="1821253160463689938">Използва „бисквитки“ за запомняне на предпочитанията ви дори ако не посещавате тези страници</translation> <translation id="1876721852596493031">Send Usage Data</translation> -<translation id="1880677175115548835">Избиране на текста</translation> <translation id="1886928167269928266">Самото начало</translation> <translation id="1911619930368729126">Качване в Google Диск</translation> <translation id="1941314575388338491">Докоснете двукратно, за да копирате.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Данните за сърфирането се изчистват...</translation> <translation id="2256128224215992540">Предлагани сайтове и търсене</translation> <translation id="2267753748892043616">Добавяне на профил</translation> +<translation id="2268044343513325586">Прецизиране</translation> <translation id="2273327106802955778">Меню „Още“</translation> <translation id="2320166752086256636">Скриване на клавиатурата</translation> <translation id="2339560363438331454">Синхр. и услуги на Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 9165ac0..66806df6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">পড়ার তালিকায় যোগ করা হয়েছে</translation> <translation id="1821253160463689938">আপনার পছন্দগুলি মনে রাখার জন্য কুকি ব্যবহার করে। আপনি সেই সমস্ত পৃষ্ঠায় না গেলেও তা করে থাকে</translation> <translation id="1876721852596493031">ব্যবহারের ডেটা পাঠান</translation> -<translation id="1880677175115548835">টেক্সট বেছে নিন</translation> <translation id="1886928167269928266">শুরুর সময়</translation> <translation id="1911619930368729126">Google ড্রাইভে আপলোড করুন</translation> <translation id="1941314575388338491">কপি করতে দুবার আলতো চাপুন।</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">ব্রাউজিং ডেটা মোছা হচ্ছে…</translation> <translation id="2256128224215992540">সার্চ এবং সাইটের প্রস্তাবনা</translation> <translation id="2267753748892043616">অ্যাকাউন্ট যোগ করুন</translation> +<translation id="2268044343513325586">রিফাইন করুন</translation> <translation id="2273327106802955778">‘আরও’ মেনু</translation> <translation id="2320166752086256636">কীবোর্ড লুকান</translation> <translation id="2339560363438331454">সিঙ্ক এবং Google পরিষেবাগুলি</translation> @@ -347,7 +347,7 @@ <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" />টি আইটেম মোছা হয়েছে</translation> <translation id="6541915733953096570">গত এক ঘণ্টা</translation> <translation id="6548479190262846511">এই সাইটের জন্য কোনও পাসওয়ার্ড পাওয়া যায়নি</translation> -<translation id="6642362222295953972">আগে থেকে থাকা ট্যাবে পরিবর্তন করুন</translation> +<translation id="6642362222295953972">আগে থেকে থাকা ট্যাবে পাল্টান</translation> <translation id="6643016212128521049">সাফ করুন</translation> <translation id="6656103420185847513">ফোল্ডার সম্পাদনা করুন</translation> <translation id="6657585470893396449">পাসওয়ার্ড</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index dc43258..32f56a5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">S'ha afegit a la llista de lectura</translation> <translation id="1821253160463689938">Utilitza galetes per recordar les teves preferències, fins i tot si no visites aquestes pàgines</translation> <translation id="1876721852596493031">Envia les dades d'ús</translation> -<translation id="1880677175115548835">Selecciona el text</translation> <translation id="1886928167269928266">L'inici</translation> <translation id="1911619930368729126">Penja a Google Drive</translation> <translation id="1941314575388338491">Feu doble toc per copiar-ho.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">S'estan esborrant les dades de navegació...</translation> <translation id="2256128224215992540">Suggeriments de cerques i llocs</translation> <translation id="2267753748892043616">Afegeix un compte</translation> +<translation id="2268044343513325586">Restringeix</translation> <translation id="2273327106802955778">Més opcions del menú</translation> <translation id="2320166752086256636">Amaga el teclat</translation> <translation id="2339560363438331454">Sincron. i serveis de Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index 9ebb704..5f9c2612 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Přidáno do seznamu četby</translation> <translation id="1821253160463689938">Používá soubory cookie k uložení vašeho nastavení i v případě, že stránky nenavštívíte</translation> <translation id="1876721852596493031">Odesílat data o využití</translation> -<translation id="1880677175115548835">Vybrat text</translation> <translation id="1886928167269928266">Od počátku věků</translation> <translation id="1911619930368729126">Nahrát na Disk Google</translation> <translation id="1941314575388338491">Zkopírujete dvojitým klepnutím.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Mazání údajů o prohlížení...</translation> <translation id="2256128224215992540">Návrhy vyhledávacích dotazů a webů</translation> <translation id="2267753748892043616">Přidat účet</translation> +<translation id="2268044343513325586">Upřesnit</translation> <translation id="2273327106802955778">Nabídka Další</translation> <translation id="2320166752086256636">Skrýt klávesnici</translation> <translation id="2339560363438331454">Synchronizace a služby Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index c548ff8f..28dea29a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Føjet til læseliste</translation> <translation id="1821253160463689938">Anvender cookies til at huske dine præferencer, også selvom du ikke besøger siderne</translation> <translation id="1876721852596493031">Send anvendelsesdata</translation> -<translation id="1880677175115548835">Vælg tekst</translation> <translation id="1886928167269928266">Altid</translation> <translation id="1911619930368729126">Upload til Google Drev</translation> <translation id="1941314575388338491">Tryk to gange for at kopiere.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Browserdata ryddes...</translation> <translation id="2256128224215992540">Søge- og websiteforslag</translation> <translation id="2267753748892043616">Tilføj konto</translation> +<translation id="2268044343513325586">Juster</translation> <translation id="2273327106802955778">Menuen Mere</translation> <translation id="2320166752086256636">Skjul tastaturet</translation> <translation id="2339560363438331454">Synkronisering og Google-tjenester</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 2e860a3..dc81b661 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Zur Leseliste hinzugefügt</translation> <translation id="1821253160463689938">Zum Speichern Ihrer Einstellungen werden Cookies verwendet, auch wenn Sie diese Seiten nicht besuchen</translation> <translation id="1876721852596493031">Nutzungsdaten senden</translation> -<translation id="1880677175115548835">Text auswählen</translation> <translation id="1886928167269928266">Für gesamten Zeitraum</translation> <translation id="1911619930368729126">Auf Google Drive hochladen</translation> <translation id="1941314575388338491">Tippen Sie zum Kopieren hier doppelt.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Browserdaten werden gelöscht…</translation> <translation id="2256128224215992540">Vorschläge für Suche & Websites</translation> <translation id="2267753748892043616">Konto hinzufügen</translation> +<translation id="2268044343513325586">Verfeinern</translation> <translation id="2273327106802955778">Menü "Mehr"</translation> <translation id="2320166752086256636">Tastatur ausblenden</translation> <translation id="2339560363438331454">Synchronisierung und Google-Dienste</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 22e5cba..ec10e4f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Προστέθηκε στη λίστα ανάγνωσης</translation> <translation id="1821253160463689938">Χρησιμοποιεί cookie για την απομνημόνευση των προτιμήσεών σας, ακόμα κι αν δεν επισκέπτεστε αυτές τις σελίδες</translation> <translation id="1876721852596493031">Αποστ. δεδομ. χρήσης</translation> -<translation id="1880677175115548835">Επιλογή κειμένου</translation> <translation id="1886928167269928266">Από την αρχή</translation> <translation id="1911619930368729126">Μεταφόρ.στο Google Drive</translation> <translation id="1941314575388338491">Πατήστε δύο φορές για αντιγραφή.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Διαγραφή δεδομένων περιήγησης…</translation> <translation id="2256128224215992540">Προτάσεις αναζήτησης και ιστοτόπων</translation> <translation id="2267753748892043616">Προσθήκη λογαριασμού</translation> +<translation id="2268044343513325586">Περιορισμός</translation> <translation id="2273327106802955778">Μενού "Περισσότερα"</translation> <translation id="2320166752086256636">Απόκρυψη πληκτρολογίου</translation> <translation id="2339560363438331454">Συγχρ. και Υπηρ. Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index 2d029bc5..d1f6516 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Added to Reading List</translation> <translation id="1821253160463689938">Uses cookies to remember your preferences, even if you don't visit those pages</translation> <translation id="1876721852596493031">Send usage data</translation> -<translation id="1880677175115548835">Select text</translation> <translation id="1886928167269928266">Beginning of Time</translation> <translation id="1911619930368729126">Upload to Google Drive</translation> <translation id="1941314575388338491">Double tap to copy.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Clearing browsing data…</translation> <translation id="2256128224215992540">Search and Site Suggestions</translation> <translation id="2267753748892043616">Add Account</translation> +<translation id="2268044343513325586">Refine</translation> <translation id="2273327106802955778">More menu</translation> <translation id="2320166752086256636">Hide keyboard</translation> <translation id="2339560363438331454">Sync and Google Services</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index b6394b2..3ed646f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Se agregó a la lista de lectura</translation> <translation id="1821253160463689938">Usa cookies para recordar tus preferencias, incluso si no visitas esas páginas</translation> <translation id="1876721852596493031">Enviar datos de uso</translation> -<translation id="1880677175115548835">Seleccionar texto</translation> <translation id="1886928167269928266">Principio</translation> <translation id="1911619930368729126">Cargar a Google Drive</translation> <translation id="1941314575388338491">Presiona dos veces para copiar.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Borrando datos de navegación…</translation> <translation id="2256128224215992540">Sugerencias de sitios y búsqueda</translation> <translation id="2267753748892043616">Agregar cuenta</translation> +<translation id="2268044343513325586">Definir mejor</translation> <translation id="2273327106802955778">Menú Más</translation> <translation id="2320166752086256636">Ocultar el teclado</translation> <translation id="2339560363438331454">Sincronización y servicios</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 7d3c66f..6c2c2198 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Añadida a Lista de lectura</translation> <translation id="1821253160463689938">Usa cookies para recordar tus preferencias aunque no visites esas páginas</translation> <translation id="1876721852596493031">Enviar datos de uso</translation> -<translation id="1880677175115548835">Seleccionar texto</translation> <translation id="1886928167269928266">Desde siempre</translation> <translation id="1911619930368729126">Subir a Google Drive</translation> <translation id="1941314575388338491">Toca dos veces para copiar.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Borrando datos de navegación...</translation> <translation id="2256128224215992540">Sugerencias de búsqueda y sitios web</translation> <translation id="2267753748892043616">Añadir cuenta</translation> +<translation id="2268044343513325586">Restringir</translation> <translation id="2273327106802955778">Menú más</translation> <translation id="2320166752086256636">Ocultar teclado</translation> <translation id="2339560363438331454">Servicios de Google y sincronización</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index ab2b444..855c7dbe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Lisati lugemisloendisse</translation> <translation id="1821253160463689938">Kasutage küpsisefaile oma eelistuste meelespidamiseks isegi siis, kui te neid lehti ei külasta</translation> <translation id="1876721852596493031">Kasutusandm. saatm.</translation> -<translation id="1880677175115548835">Valige tekst</translation> <translation id="1886928167269928266">Alates algusest</translation> <translation id="1911619930368729126">Laadi üles Google Drive'i</translation> <translation id="1941314575388338491">Kopeerimiseks topeltpuudutage.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Sirvimisandmete kustutamine …</translation> <translation id="2256128224215992540">Otsingu- ja saidisoovitused</translation> <translation id="2267753748892043616">Lisa konto</translation> +<translation id="2268044343513325586">Täpsustamine</translation> <translation id="2273327106802955778">Rohkem menüü-üksusi</translation> <translation id="2320166752086256636">Peida klaviatuur</translation> <translation id="2339560363438331454">Sünkroonimine ja Google'i teen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index b98cf3e..af97f6b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">به فهرست خواندن اضافه شد</translation> <translation id="1821253160463689938">از کوکیها برای به خاطر سپردن تنظیمات برگزیدهتان استفاده میکند، حتی اگر از آن صفحهها بازدید نکنید</translation> <translation id="1876721852596493031">ارسال داده استفاده</translation> -<translation id="1880677175115548835">انتخاب نوشتار</translation> <translation id="1886928167269928266">از ابتدا</translation> <translation id="1911619930368729126">بارگذاری در Google Drive</translation> <translation id="1941314575388338491">برای کپی کردن دو ضربه سریع بزنید.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">درحال پاک کردن دادههای محصول مرور…</translation> <translation id="2256128224215992540">پیشنهادات جستجو و سایت</translation> <translation id="2267753748892043616">افزودن حساب</translation> +<translation id="2268044343513325586">فیلتر</translation> <translation id="2273327106802955778">منوی بیشتر</translation> <translation id="2320166752086256636">پنهان کردن صفحهکلید</translation> <translation id="2339560363438331454">همگامسازی و سرویسهای Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 0bf3587..ec0e846 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Lisättiin lukulistalle</translation> <translation id="1821253160463689938">Käyttää evästeitä asetustesi muistamiseen, vaikka et kävisi kyseisillä sivuilla</translation> <translation id="1876721852596493031">Lähetä käyttötietoja</translation> -<translation id="1880677175115548835">Valitse tekstiä</translation> <translation id="1886928167269928266">Alusta asti</translation> <translation id="1911619930368729126">Lähetä Google Driveen</translation> <translation id="1941314575388338491">Kopioi kaksoisnapauttamalla.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Selaustietoja poistetaan…</translation> <translation id="2256128224215992540">Haku- ja sivustoehdotukset</translation> <translation id="2267753748892043616">Lisää tili</translation> +<translation id="2268044343513325586">Tarkenna</translation> <translation id="2273327106802955778">Lisäasetusvalikko</translation> <translation id="2320166752086256636">Piilota näppäimistö</translation> <translation id="2339560363438331454">Synkronointi ja Google-palvelut</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index e60f20c..4f22616 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Idinagdag sa Listahan ng Mga Babasahin</translation> <translation id="1821253160463689938">Gumamit ng mga cookie para matandaan ang iyong mga kagustuhan, kahit na hindi mo binibisita ang mga page na iyon</translation> <translation id="1876721852596493031">Magpadala ng Data</translation> -<translation id="1880677175115548835">Piliin ang text</translation> <translation id="1886928167269928266">Mula sa Umpisa</translation> <translation id="1911619930368729126">I-upload sa Google Drive</translation> <translation id="1941314575388338491">I-double tap upang kopyahin.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Kini-clear ang data mula sa pag-browse...</translation> <translation id="2256128224215992540">Mga Suhestyon sa Paghahanap at Site</translation> <translation id="2267753748892043616">Magdagdag ng Account</translation> +<translation id="2268044343513325586">Pinuhin</translation> <translation id="2273327106802955778">Higit pang menu</translation> <translation id="2320166752086256636">Itago ang keyboard</translation> <translation id="2339560363438331454">Sync at Mga Serbisyo ng Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index c23a0c3..7f27980 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Page ajoutée à la liste de lecture</translation> <translation id="1821253160463689938">Utilise des cookies pour mémoriser vos préférences, même si vous n'accédez pas à ces pages</translation> <translation id="1876721852596493031">Envoyer les données d'utilisation</translation> -<translation id="1880677175115548835">Sélectionner du texte</translation> <translation id="1886928167269928266">Depuis le début</translation> <translation id="1911619930368729126">Importer dans Google Drive</translation> <translation id="1941314575388338491">Appuyez deux fois pour copier.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Effacement des données de navigation…</translation> <translation id="2256128224215992540">Suggestions de recherches et de sites</translation> <translation id="2267753748892043616">Ajouter un compte</translation> +<translation id="2268044343513325586">Affiner</translation> <translation id="2273327106802955778">Menu Plus</translation> <translation id="2320166752086256636">Masquer le clavier</translation> <translation id="2339560363438331454">Services Google/Sync</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 8bcc0f1..c45d487 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">વાંચન સૂચિમાં ઉમેર્યું</translation> <translation id="1821253160463689938">તમારી પસંદગીઓ યાદ રાખવા માટે કુકીનો ઉપયોગ કરે છે, પછી ભલે તમે તે પેજની મુલાકાત ન પણ લો</translation> <translation id="1876721852596493031">ઉપયોગ ડેટા મોકલો</translation> -<translation id="1880677175115548835">ટેક્સ્ટ પસંદ કરો</translation> <translation id="1886928167269928266">શરૂઆતથી</translation> <translation id="1911619930368729126">Google ડ્રાઇવ પર અપલોડ કરો</translation> <translation id="1941314575388338491">કૉપિ કરવા માટે બે વાર ટૅપ કરો.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">બ્રાઉઝિંગ ડેટા સાફ થઈ રહ્યો છે...</translation> <translation id="2256128224215992540">શોધ અને સાઇટ વિશે સૂચનો</translation> <translation id="2267753748892043616">એકાઉન્ટ ઉમેરો</translation> +<translation id="2268044343513325586">સુધારો</translation> <translation id="2273327106802955778">વધુ મેનૂ</translation> <translation id="2320166752086256636">કીબોર્ડ છુપાવો</translation> <translation id="2339560363438331454">સિંક અને Google સેવાઓ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index e50f6e1..4d8cf56 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">पठन सूची में जोड़ा गया</translation> <translation id="1821253160463689938">आपकी पसंद याद रखने के लिए कुकी का इस्तेमाल करती है, भले ही आप उन पेजों पर नहीं जाते</translation> <translation id="1876721852596493031">उपयोग डेटा भेजें</translation> -<translation id="1880677175115548835">लेख चुनें</translation> <translation id="1886928167269928266">शुरुआत से</translation> <translation id="1911619930368729126">Google डिस्क पर अपलोड करें</translation> <translation id="1941314575388338491">कॉपी करने के लिए डबल टैप करें.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">ब्राउज़िंग डेटा साफ़ हो रहा है...</translation> <translation id="2256128224215992540">खोज और साइट सुझाव</translation> <translation id="2267753748892043616">खाता जोड़ें</translation> +<translation id="2268044343513325586">परिशोधित करें</translation> <translation id="2273327106802955778">अधिक मेनू</translation> <translation id="2320166752086256636">कीबोर्ड छिपाएं</translation> <translation id="2339560363438331454">सिंक, Google सेवाएं</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index c446c6e..9644c07d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Dodano na popis za čitanje</translation> <translation id="1821253160463689938">Upotrebljava kolačiće za pamćenje vaših postavki, čak i ako ne posjetite te stranice</translation> <translation id="1876721852596493031">Slanje pod. o upot.</translation> -<translation id="1880677175115548835">Odaberite tekst</translation> <translation id="1886928167269928266">Od početka</translation> <translation id="1911619930368729126">Prenesi na Google disk</translation> <translation id="1941314575388338491">Dodirnite dvaput da biste kopirali.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Brisanje podataka o pregledavanju...</translation> <translation id="2256128224215992540">Prijedlozi pretraživanja i web-lokacija</translation> <translation id="2267753748892043616">Dodaj račun</translation> +<translation id="2268044343513325586">Pročišćavanje</translation> <translation id="2273327106802955778">Izbornik Više</translation> <translation id="2320166752086256636">Sakrij tipkovnicu</translation> <translation id="2339560363438331454">Sinkronizacija i Googleove usluge</translation> @@ -224,7 +224,7 @@ <translation id="4666531726415300315">Prijavljeni ste kao <ph name="EMAIL" />. Vaši su podaci šifrirani vašom šifrom za sinkronizaciju. Unesite je da biste pokrenuli sinkronizaciju.</translation> -<translation id="4689564913179979534">Upravljate načinima plaćanja...</translation> +<translation id="4689564913179979534">Upravljajte načinima plaćanja...</translation> <translation id="473775607612524610">Ažuriraj</translation> <translation id="4747097190499141774">Enkripcija šifrom ne uključuje podatke o načinima plaćanja i adresama s Google Paya. Samo osoba koja ima vašu šifru može čitati vaše kriptirane podatke. Šifra se ne šalje Googleu niti se na njemu pohranjuje. Ako zaboravite šifru ili želite promijeniti tu postavku, morate poništiti sinkronizaciju. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="4749030437873592350">Traži na stranici...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index f26df7d..dd8e106 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Hozzáadva az olvasási listához</translation> <translation id="1821253160463689938">Cookie-kat használ a preferenciák megjegyzésére még akkor is, ha Ön nem keresi fel az adott oldalakat</translation> <translation id="1876721852596493031">Használati adatok küldése</translation> -<translation id="1880677175115548835">Szöveg kijelölése</translation> <translation id="1886928167269928266">Mindenkori</translation> <translation id="1911619930368729126">Feltöltés Google Drive-ba</translation> <translation id="1941314575388338491">A másoláshoz koppintson duplán.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Böngészési adatok törlése…</translation> <translation id="2256128224215992540">Keresési és webhelyjavaslatok</translation> <translation id="2267753748892043616">Fiók hozzáadása</translation> +<translation id="2268044343513325586">Pontosítás</translation> <translation id="2273327106802955778">Továbbiak menü</translation> <translation id="2320166752086256636">Billentyűzet elrejtése</translation> <translation id="2339560363438331454">Szinkronizálás és Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 5db2405e..e6228e1e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Ditambahkan ke Daftar Baca</translation> <translation id="1821253160463689938">Menggunakan cookie untuk mengingat preferensi, meski Anda tidak membuka halaman tersebut</translation> <translation id="1876721852596493031">Krm Data Penggunaan</translation> -<translation id="1880677175115548835">Pilih teks</translation> <translation id="1886928167269928266">Awal Waktu</translation> <translation id="1911619930368729126">Upload ke Google Drive</translation> <translation id="1941314575388338491">Ketuk dua kali untuk menyalin.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Menghapus data browsing...</translation> <translation id="2256128224215992540">Saran Situs dan Penelusuran</translation> <translation id="2267753748892043616">Tambahkan Akun</translation> +<translation id="2268044343513325586">Saring</translation> <translation id="2273327106802955778">Menu lainnya</translation> <translation id="2320166752086256636">Sembunyikan keyboard</translation> <translation id="2339560363438331454">Sinkronisasi dan Layanan Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index d242136..a2f2287 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Aggiunta all'elenco di lettura</translation> <translation id="1821253160463689938">Utilizza i cookie per memorizzare le tue preferenze, anche se non visiti quelle pagine</translation> <translation id="1876721852596493031">Invia dati di utilizzo</translation> -<translation id="1880677175115548835">Seleziona testo</translation> <translation id="1886928167269928266">Tutto</translation> <translation id="1911619930368729126">Carica su Google Drive</translation> <translation id="1941314575388338491">Tocca due volte per copiare.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Cancellazione dati di navigazione…</translation> <translation id="2256128224215992540">Suggerimenti di ricerche e siti</translation> <translation id="2267753748892043616">Aggiungi account</translation> +<translation id="2268044343513325586">Perfeziona</translation> <translation id="2273327106802955778">Menu Altro</translation> <translation id="2320166752086256636">Nascondi tastiera</translation> <translation id="2339560363438331454">Sincronizzazione e servizi Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 7666f38..ba26d6ec 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">נוסף לרשימת הקריאה</translation> <translation id="1821253160463689938">שימוש בקובצי cookie כדי לשמור את ההעדפות שלך, גם אם לא נכנסת אל הדפים האלה</translation> <translation id="1876721852596493031">שלח נתוני שימוש</translation> -<translation id="1880677175115548835">בחירת טקסט</translation> <translation id="1886928167269928266">משחר ההיסטוריה</translation> <translation id="1911619930368729126">העלה אל Google Drive</translation> <translation id="1941314575388338491">הקש פעמיים כדי להעתיק.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">מנקה נתוני גלישה…</translation> <translation id="2256128224215992540">הצעות למונחי חיפוש ולאתרים</translation> <translation id="2267753748892043616">הוסף חשבון</translation> +<translation id="2268044343513325586">צמצם</translation> <translation id="2273327106802955778">התפריט 'עוד'</translation> <translation id="2320166752086256636">הסתר מקלדת</translation> <translation id="2339560363438331454">סנכרון ושירותי Google</translation> @@ -194,7 +194,7 @@ <translation id="4084682180776658562">סימניה</translation> <translation id="411254640334432676">ההורדה נכשלה.</translation> <translation id="4112644173421521737">חיפוש</translation> -<translation id="4121993058175073134">כדי לשלוח נתוני ייצוא ברשת, הגדר את חשבון האימייל שלך ביישום 'הגדרות'.</translation> +<translation id="4121993058175073134">כדי לשלוח נתוני ייצוא ברשת, יש להגדיר את חשבון האימייל שלך ביישום 'הגדרות'.</translation> <translation id="4124987746317609294">טווח זמן</translation> <translation id="4172051516777682613">הצג תמיד</translation> <translation id="418156467088430727">הצג גרסה לא מקוונת בכרטיסייה חדשה</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index b826def..4aee1e5b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">リーディング リストに追加しました</translation> <translation id="1821253160463689938">Cookie を使って設定を保存します(これらのページにアクセスしない場合も Cookie が保持されます)</translation> <translation id="1876721852596493031">使用状況データ送信</translation> -<translation id="1880677175115548835">テキストを選択</translation> <translation id="1886928167269928266">始めから</translation> <translation id="1911619930368729126">ドライブにアップロード</translation> <translation id="1941314575388338491">ダブルタップしてコピー。</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">閲覧データを削除しています...</translation> <translation id="2256128224215992540">検索とサイトの候補を表示</translation> <translation id="2267753748892043616">アカウントを追加</translation> +<translation id="2268044343513325586">絞り込み</translation> <translation id="2273327106802955778">その他のメニュー</translation> <translation id="2320166752086256636">キーボードを非表示</translation> <translation id="2339560363438331454">同期と Google サービス</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 8f0ebd4..a93a214 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">ಓದುವ ಪಟ್ಟಿಗೆ ಸೇರಿಸಲಾಗಿದೆ</translation> <translation id="1821253160463689938">ನೀವು ಆ ಪುಟಗಳಿಗೆ ಭೇಟಿ ನೀಡದಿದ್ದರೂ, ನಿಮ್ಮ ಆದ್ಯತೆಗಳನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲು ಕುಕೀಗಳನ್ನು ಬಳಸುತ್ತದೆ</translation> <translation id="1876721852596493031">ಬಳಕೆ ಡೇಟಾ ಕಳುಹಿಸಿ</translation> -<translation id="1880677175115548835">ಪಠ್ಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="1886928167269928266">ಆರಂಭದ ಸಮಯ</translation> <translation id="1911619930368729126">Google ಡ್ರೈವ್ಗೆ ಅಪ್ಲೋಡ್ ಮಾಡಿ</translation> <translation id="1941314575388338491">ನಕಲಿಸಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="2256128224215992540">ಹುಡುಕಾಟ ಹಾಗೂ ಸೈಟ್ ಕುರಿತಾದ ಸಲಹೆಗಳು</translation> <translation id="2267753748892043616">ಖಾತೆ ಸೇರಿಸಿ</translation> +<translation id="2268044343513325586">ಪರಿಷ್ಕರಿಸು</translation> <translation id="2273327106802955778">ಹೆಚ್ಚಿನ ಮೆನು</translation> <translation id="2320166752086256636">ಕೀಬೋರ್ಡ್ ಮರೆಮಾಡಿ</translation> <translation id="2339560363438331454">ಸಿಂಕ್ ಮತ್ತು Google ಸೇವೆಗಳು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 34073d1c..8849fa2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">읽기 목록에 추가됨</translation> <translation id="1821253160463689938">페이지를 방문하지 않더라도 쿠키를 사용하여 환경설정 저장</translation> <translation id="1876721852596493031">사용 데이터 보내기</translation> -<translation id="1880677175115548835">텍스트 선택</translation> <translation id="1886928167269928266">전체</translation> <translation id="1911619930368729126">Google 드라이브로 업로드</translation> <translation id="1941314575388338491">복사하려면 두 번 탭하세요.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">인터넷 사용 기록 삭제 중...</translation> <translation id="2256128224215992540">검색 및 사이트 제안</translation> <translation id="2267753748892043616">계정 추가</translation> +<translation id="2268044343513325586">상세검색</translation> <translation id="2273327106802955778">더보기 메뉴</translation> <translation id="2320166752086256636">키보드 숨기기</translation> <translation id="2339560363438331454">동기화 및 Google 서비스</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 6c6c7e3e..0bddc0b9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Pridėta prie skaitymo sąrašo</translation> <translation id="1821253160463689938">Naudojami slapukai, siekiant įsiminti jūsų nuostatas, net jei nesilankote tuose puslapiuose</translation> <translation id="1876721852596493031">Siųsti naud. duom.</translation> -<translation id="1880677175115548835">Pasirinkti tekstą</translation> <translation id="1886928167269928266">Laiko pradžia</translation> <translation id="1911619930368729126">Įkelti į „Google“ diską</translation> <translation id="1941314575388338491">Dukart palieskite, kad nukopijuotumėte.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Išvalomi naršymo duomenis...</translation> <translation id="2256128224215992540">Paieškos / svetain. pasiūl.</translation> <translation id="2267753748892043616">Pridėti paskyrą</translation> +<translation id="2268044343513325586">Patikslinti</translation> <translation id="2273327106802955778">Daugiau meniu</translation> <translation id="2320166752086256636">Slėpti klaviatūrą</translation> <translation id="2339560363438331454">Sinchron. ir „Google“ paslaugos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index 8f6ac44..865cbcb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Pievienota lasīšanas sarakstam</translation> <translation id="1821253160463689938">Izmanto sīkfailus, lai iegaumētu jūsu preferences, pat ja neapmeklējāt šīs lapas</translation> <translation id="1876721852596493031">Sūtīt liet. datus</translation> -<translation id="1880677175115548835">Atlasīt tekstu</translation> <translation id="1886928167269928266">No paša sākuma</translation> <translation id="1911619930368729126">Augšupielādēt Google diskā</translation> <translation id="1941314575388338491">Veiciet dubultskārienu, lai kopētu.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Notiek pārlūkošanas datu notīrīšana…</translation> <translation id="2256128224215992540">Meklēšanas un vietņu ieteikumi</translation> <translation id="2267753748892043616">Pievienot kontu</translation> +<translation id="2268044343513325586">Uzlabot</translation> <translation id="2273327106802955778">Izvēlne Vairāk</translation> <translation id="2320166752086256636">Paslēpt tastatūru</translation> <translation id="2339560363438331454">Sinhronizēšana un Google pakalpojumi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 4b4824c..af6286f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">വായനാ ലിസ്റ്റിൽ ചേർത്തു</translation> <translation id="1821253160463689938">നിങ്ങൾ ആ പേജുകൾ സന്ദർശിക്കുന്നില്ലെങ്കിൽ പോലും, നിങ്ങളുടെ മുൻഗണനകൾ ഓർമ്മിക്കുന്നതിന് കുക്കികളെ ഉപയോഗിക്കുന്നു</translation> <translation id="1876721852596493031">ഉപയോഗ ഡാറ്റ അയയ്ക്കൂ</translation> -<translation id="1880677175115548835">ടെക്സ്റ്റ് തിരഞ്ഞെടുക്കുക</translation> <translation id="1886928167269928266">തുടക്കം മുതൽ</translation> <translation id="1911619930368729126">Google ഡ്രൈവിലേക്ക് അപ്ലോഡുചെയ്യുക</translation> <translation id="1941314575388338491">പകർത്താൻ രണ്ടുതവണ ടാപ്പുചെയ്യുക.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കുന്നു...</translation> <translation id="2256128224215992540">തിരയലും സൈറ്റ് നിർദ്ദേശങ്ങളും</translation> <translation id="2267753748892043616">അക്കൗണ്ട് ചേർക്കുക</translation> +<translation id="2268044343513325586">പരിഷ്ക്കരിക്കുക</translation> <translation id="2273327106802955778">കൂടുതൽ ഓപ്ഷൻ മെനു</translation> <translation id="2320166752086256636">കീബോർഡ് മറയ്ക്കുക</translation> <translation id="2339560363438331454">സമന്വയവും Google സേവനങ്ങളും</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index b462b66..afec7495 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">वाचन सूचीमध्ये जोडले</translation> <translation id="1821253160463689938">तुम्ही त्या पेजना भेट दिली नसली तरीही, तुमची प्राधान्ये लक्षात ठेवण्यासाठी कुकीचा वापर करते</translation> <translation id="1876721852596493031">वापरलेला डेटा पाठवा</translation> -<translation id="1880677175115548835">मजकूर निवडा</translation> <translation id="1886928167269928266">सुरूवातीपासून</translation> <translation id="1911619930368729126">Google ड्राइव्हवर अपलोड करा</translation> <translation id="1941314575388338491">कॉपी करण्यासाठी दोनदा टॅप करा.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">ब्राउझिंग डेटा साफ करत आहे...</translation> <translation id="2256128224215992540">शोध आणि साइट सूचना</translation> <translation id="2267753748892043616">खाते जोडा</translation> +<translation id="2268044343513325586">परिष्कृत करा</translation> <translation id="2273327106802955778">अधिक मेनू</translation> <translation id="2320166752086256636">कीबोर्ड लपवा</translation> <translation id="2339560363438331454">सिंक आणि Google सेवा</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 59c4a2b6..b1d3bbe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Ditambahkan pada Senarai Bacaan</translation> <translation id="1821253160463689938">Menggunakan kuki untuk mengingati pilihan anda, walaupun anda tidak melawati halaman tersebut</translation> <translation id="1876721852596493031">Hantar Data Penggunaan</translation> -<translation id="1880677175115548835">Pilih teks</translation> <translation id="1886928167269928266">Permulaan Masa</translation> <translation id="1911619930368729126">Muat naik ke Google Drive</translation> <translation id="1941314575388338491">Ketik dua kali untuk menyalin.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Mengosongkan data semakan imbas...</translation> <translation id="2256128224215992540">Cadangan Carian dan Tapak</translation> <translation id="2267753748892043616">Tambahkan Akaun</translation> +<translation id="2268044343513325586">Perhalusi</translation> <translation id="2273327106802955778">Lagi menu</translation> <translation id="2320166752086256636">Sembunyikan papan kekunci</translation> <translation id="2339560363438331454">Segerak dan Perkhidmatan Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index b0c4cca..1a6972f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Toegevoegd aan leeslijst</translation> <translation id="1821253160463689938">Maakt gebruik van cookies om je voorkeuren te onthouden, zelfs als je deze pagina's niet bezoekt</translation> <translation id="1876721852596493031">Gebruiksgegevens verzenden</translation> -<translation id="1880677175115548835">Tekst selecteren</translation> <translation id="1886928167269928266">Het eerste gebruik</translation> <translation id="1911619930368729126">Uploaden naar Google Drive</translation> <translation id="1941314575388338491">Dubbeltik om te kopiëren.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Browsegegevens wissen…</translation> <translation id="2256128224215992540">Zoek- en sitesuggesties</translation> <translation id="2267753748892043616">Account toevoegen</translation> +<translation id="2268044343513325586">Verfijnen</translation> <translation id="2273327106802955778">Menu Meer</translation> <translation id="2320166752086256636">Toetsenbord verbergen</translation> <translation id="2339560363438331454">Synchronisatie en Google-services</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 2daf61a..cf96e77 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Lagt til i leselisten</translation> <translation id="1821253160463689938">Bruker informasjonskapsler til å huske preferansene dine, selv om du ikke går til de sidene</translation> <translation id="1876721852596493031">Send bruksdata</translation> -<translation id="1880677175115548835">Merk tekst</translation> <translation id="1886928167269928266">Tidenes morgen</translation> <translation id="1911619930368729126">Last opp til Google Disk</translation> <translation id="1941314575388338491">Dobbelttrykk for å kopiere.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Sletter nettlesingsdata …</translation> <translation id="2256128224215992540">Nettsteds- og søkeforslag</translation> <translation id="2267753748892043616">Legg til konto</translation> +<translation id="2268044343513325586">Finstem</translation> <translation id="2273327106802955778">Mer-menyen</translation> <translation id="2320166752086256636">Skjul tastaturet</translation> <translation id="2339560363438331454">Synk. og Google-tjenester</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index f3022d9d..cd740377 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Dodano do listy Do przeczytania</translation> <translation id="1821253160463689938">Twoje ustawienia będą zapisywane w plikach cookie, nawet jeśli nie odwiedzisz tych stron</translation> <translation id="1876721852596493031">Wysyłaj dane na temat użytkowania</translation> -<translation id="1880677175115548835">Zaznacz tekst</translation> <translation id="1886928167269928266">Od początku</translation> <translation id="1911619930368729126">Prześlij na Dysk Google</translation> <translation id="1941314575388338491">Kliknij dwukrotnie, by skopiować.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Czyszczę dane przeglądania…</translation> <translation id="2256128224215992540">Podpowiadanie stron internetowych i wyszukiwanych słów</translation> <translation id="2267753748892043616">Dodaj konto</translation> +<translation id="2268044343513325586">Zawęź</translation> <translation id="2273327106802955778">Menu Więcej</translation> <translation id="2320166752086256636">Ukryj klawiaturę</translation> <translation id="2339560363438331454">Synchronizacja i usługi Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index 53753ca..93586e12 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Adicionada à lista de leitura</translation> <translation id="1821253160463689938">Utiliza cookies para lembrar suas preferências, mesmo se você não acessar essas páginas</translation> <translation id="1876721852596493031">Enviar dados de uso</translation> -<translation id="1880677175115548835">Selecionar texto</translation> <translation id="1886928167269928266">Desde o começo</translation> <translation id="1911619930368729126">Enviar para o Google Drive</translation> <translation id="1941314575388338491">Toque duas vezes para copiar.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Limpando dados de navegação…</translation> <translation id="2256128224215992540">Sugestões de pesquisa e sites</translation> <translation id="2267753748892043616">Adicionar conta</translation> +<translation id="2268044343513325586">Refinar</translation> <translation id="2273327106802955778">Menu "Mais"</translation> <translation id="2320166752086256636">Ocultar teclado</translation> <translation id="2339560363438331454">Serviços do Google e de sincronização</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index a32318a2..143a768f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Adicionada à lista de leitura</translation> <translation id="1821253160463689938">Utiliza cookies para memorizar as suas preferências, mesmo que não visite essas páginas.</translation> <translation id="1876721852596493031">Enviar Dados de Uso</translation> -<translation id="1880677175115548835">Selecionar texto</translation> <translation id="1886928167269928266">Desde sempre</translation> <translation id="1911619930368729126">Carregar p/ Google Drive</translation> <translation id="1941314575388338491">Toque duas vezes para copiar.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">A limpar os dados de navegação…</translation> <translation id="2256128224215992540">Sugestões de pesquisa e de sites</translation> <translation id="2267753748892043616">Adicionar conta</translation> +<translation id="2268044343513325586">Refinar</translation> <translation id="2273327106802955778">Menu Mais</translation> <translation id="2320166752086256636">Ocultar teclado</translation> <translation id="2339560363438331454">Sincronização e serviços Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index d181374..50c7bac9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">S-a adăugat în lista de lectură</translation> <translation id="1821253160463689938">Folosește cookie-uri pentru a-ți reține preferințele, chiar dacă nu accesezi paginile respective</translation> <translation id="1876721852596493031">Trim. date utilizare</translation> -<translation id="1880677175115548835">Selectează text</translation> <translation id="1886928167269928266">De la început</translation> <translation id="1911619930368729126">Încarcă în Google Drive</translation> <translation id="1941314575388338491">Atinge de două ori pentru a copia.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Se șterg datele de navigare...</translation> <translation id="2256128224215992540">Sugestii de căutare și de site-uri</translation> <translation id="2267753748892043616">Adaugă un cont</translation> +<translation id="2268044343513325586">Rafinează</translation> <translation id="2273327106802955778">Meniul Mai multe</translation> <translation id="2320166752086256636">Ascunde tastatura</translation> <translation id="2339560363438331454">Sincronizarea și Serviciile Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 928c9f6..0663f36 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Добавлено в список чтения</translation> <translation id="1821253160463689938">Использовать файлы cookie, чтобы запомнить ваши предпочтения, даже если вы не открываете эти страницы</translation> <translation id="1876721852596493031">Отправка статистики</translation> -<translation id="1880677175115548835">Выбрать текст</translation> <translation id="1886928167269928266">За все время</translation> <translation id="1911619930368729126">Загрузить на Google Диск</translation> <translation id="1941314575388338491">Чтобы копировать, нажмите дважды.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Удаление данных о работе в браузере…</translation> <translation id="2256128224215992540">Подсказки запросов и сайтов</translation> <translation id="2267753748892043616">Добавить аккаунт</translation> +<translation id="2268044343513325586">Уточнить</translation> <translation id="2273327106802955778">Меню "Ещё"</translation> <translation id="2320166752086256636">Скрыть клавиатуру</translation> <translation id="2339560363438331454">Синхронизация сервисов Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index a1255b58..131718a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Pridané do zoznamu na čítanie</translation> <translation id="1821253160463689938">Používa súbory cookie na zapamätanie si predvolieb, dokonca aj keď dané stránky nenavštívite</translation> <translation id="1876721852596493031">Odosielanie údajov o používaní</translation> -<translation id="1880677175115548835">Vybrať text</translation> <translation id="1886928167269928266">Celé obdobie</translation> <translation id="1911619930368729126">Nahrať na Disk Google</translation> <translation id="1941314575388338491">Dvojitým klepnutím skopírujete.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Vymazávajú sa dáta prehliadania…</translation> <translation id="2256128224215992540">Návrhy vyhľadávania a webov</translation> <translation id="2267753748892043616">Pridať účet</translation> +<translation id="2268044343513325586">Upraviť</translation> <translation id="2273327106802955778">Ponuka Viac</translation> <translation id="2320166752086256636">Skryť klávesnicu</translation> <translation id="2339560363438331454">Synchronizácia a služby Googlu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 480a0c3..b50a5b9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Dodano na bralni seznam</translation> <translation id="1821253160463689938">Uporablja piškotke, da si zapomni vaše nastavitve, tudi če teh strani ne obiskujete</translation> <translation id="1876721852596493031">Pošlji pod. o upor.</translation> -<translation id="1880677175115548835">Izbira besedila</translation> <translation id="1886928167269928266">Beginning of Time</translation> <translation id="1911619930368729126">Prenos v Google Drive</translation> <translation id="1941314575388338491">Dvakrat se dotaknite, če želite kopirati.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Brisanje podatkov brskanja …</translation> <translation id="2256128224215992540">Predlogi za iskanje in spletna mesta</translation> <translation id="2267753748892043616">Dodaj račun</translation> +<translation id="2268044343513325586">Izboljšaj iskanje</translation> <translation id="2273327106802955778">More menu</translation> <translation id="2320166752086256636">Skrij tipkovnico</translation> <translation id="2339560363438331454">Sinhr. in Googlove storitve</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 294c90c..a35e57fe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Додато је на листу за читање</translation> <translation id="1821253160463689938">Користи колачиће да би се запамтила подешавања, чак и када не посећујете те странице</translation> <translation id="1876721852596493031">Шаљи подат. о кориш.</translation> -<translation id="1880677175115548835">Изаберите текст</translation> <translation id="1886928167269928266">Одувек</translation> <translation id="1911619930368729126">Отпреми у Google диск</translation> <translation id="1941314575388338491">Додирните двапут да бисте копирали.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Бришу се подаци прегледања...</translation> <translation id="2256128224215992540">Предлози за претрагу и сајтове</translation> <translation id="2267753748892043616">Додај налог</translation> +<translation id="2268044343513325586">Прецизирај</translation> <translation id="2273327106802955778">Мени Још</translation> <translation id="2320166752086256636">Сакриј тастатуру</translation> <translation id="2339560363438331454">Синхронизација и Google услуге</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index 55cf27da..c4e82d5c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Har lagts till i läslistan</translation> <translation id="1821253160463689938">Kommer ihåg med hjälp av cookies vad du brukar välja även om du inte besöker sidorna i fråga</translation> <translation id="1876721852596493031">Skicka statistik</translation> -<translation id="1880677175115548835">Markera text</translation> <translation id="1886928167269928266">Tidens början</translation> <translation id="1911619930368729126">Ladda upp till Google Drive</translation> <translation id="1941314575388338491">Tryck snabbt två gånger om du vill kopiera informationen.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Tar bort webbinformation …</translation> <translation id="2256128224215992540">Sök- och webbplatsförslag</translation> <translation id="2267753748892043616">Lägg till konto</translation> +<translation id="2268044343513325586">Finjustera</translation> <translation id="2273327106802955778">Mer-menyn</translation> <translation id="2320166752086256636">Dölj tangentbordet</translation> <translation id="2339560363438331454">Synk och Googles tjänster</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index dc8e934..8b4c9e7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Imeongezwa kwenye Orodha ya Kusoma</translation> <translation id="1821253160463689938">Hutumia vidakuzi kukumbuka mapendeleo yako, hata usipotembelea kurasa hizo</translation> <translation id="1876721852596493031">Tuma Data ya Utumiaji</translation> -<translation id="1880677175115548835">Chagua maandishi</translation> <translation id="1886928167269928266">Kutoka Mwanzo</translation> <translation id="1911619930368729126">Pakia kwenye Hifadhi ya Google</translation> <translation id="1941314575388338491">Gusa mara mbili ili unakili.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Inafuta data ya kuvinjari...</translation> <translation id="2256128224215992540">Mapendekezo ya Utafutaji na Tovuti</translation> <translation id="2267753748892043616">Ongeza Akaunti</translation> +<translation id="2268044343513325586">Chuja</translation> <translation id="2273327106802955778">Menyu zaidi</translation> <translation id="2320166752086256636">Ficha kibodi</translation> <translation id="2339560363438331454">Huduma za Google na Usawazishaji</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 5540e26..a5c69b0b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">வாசிப்புப் பட்டியலில் சேர்க்கப்பட்டது</translation> <translation id="1821253160463689938">நீங்கள் அந்தப் பக்கங்களைப் பார்வையிடவில்லை என்றாலும், உங்கள் விருப்பத்தேர்வுகளை நினைவில்கொள்ள குக்கீகளைப் பயன்படுத்தும்</translation> <translation id="1876721852596493031">பயன்பாடு தரவு அனுப்பு</translation> -<translation id="1880677175115548835">உரையைத் தேர்வுசெய்க</translation> <translation id="1886928167269928266">தொடக்கத்திலிருந்து</translation> <translation id="1911619930368729126">Google இயக்ககத்தில் பதிவேற்றுக</translation> <translation id="1941314575388338491">நகலெடுக்க, இருமுறை தட்டவும்.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">உலாவிய தரவை அழிக்கிறது...</translation> <translation id="2256128224215992540">தேடல் மற்றும் தளப் பரிந்துரைகள்</translation> <translation id="2267753748892043616">கணக்கைச் சேர்</translation> +<translation id="2268044343513325586">துல்லியமாக்கு</translation> <translation id="2273327106802955778">மேலும் விருப்பங்களுக்கான மெனு</translation> <translation id="2320166752086256636">விசைப்பலகையை மறை</translation> <translation id="2339560363438331454">ஒத்திசைவு & Google சேவைகள்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index b824dd1..bdb896e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">పఠన జాబితాకు జోడించబడింది</translation> <translation id="1821253160463689938">మీ ప్రాధాన్యతలను గుర్తుంచుకోవడానికి కుక్కీలను ఉపయోగిస్తుంది, మీరు ఆ పేజీలను సందర్శించకపోయినా కూడా అది అమలవుతుంది</translation> <translation id="1876721852596493031">వినియోగ డేటాను పంపు</translation> -<translation id="1880677175115548835">వచనాన్ని ఎంచుకోండి</translation> <translation id="1886928167269928266">ప్రారంభ సమయం</translation> <translation id="1911619930368729126">Google డిస్క్కి అప్. చే.</translation> <translation id="1941314575388338491">కాపీ చేయడానికి రెండుసార్లు నొక్కండి.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">బ్రౌజింగ్ డేటాను తీసివేస్తోంది...</translation> <translation id="2256128224215992540">శోధన & సైట్ సూచనలు</translation> <translation id="2267753748892043616">ఖాతాను జోడించు</translation> +<translation id="2268044343513325586">మరింత మెరుగుపరచండి</translation> <translation id="2273327106802955778">మరిన్ని మెను</translation> <translation id="2320166752086256636">కీబోర్డ్ను దాచు</translation> <translation id="2339560363438331454">సింక్ మరియు Google సేవలు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 8138062..217cf2dc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">เพิ่มไปยังเรื่องรออ่านแล้ว</translation> <translation id="1821253160463689938">ใช้คุกกี้เพื่อให้จดจำค่ากำหนดของคุณ แม้ว่าคุณไม่ได้เข้าชมหน้าเว็บเหล่านั้น</translation> <translation id="1876721852596493031">ส่งข้อมูลการใช้งาน</translation> -<translation id="1880677175115548835">เลือกข้อความ</translation> <translation id="1886928167269928266">ตั้งแต่ต้น</translation> <translation id="1911619930368729126">อัปโหลดไปยัง Google ไดรฟ์</translation> <translation id="1941314575388338491">แตะสองครั้งเพื่อคัดลอก</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">กำลังล้างข้อมูลการท่องเว็บ...</translation> <translation id="2256128224215992540">คำแนะนำการค้นหาและเว็บไซต์</translation> <translation id="2267753748892043616">เพิ่มบัญชี</translation> +<translation id="2268044343513325586">ปรับแต่ง</translation> <translation id="2273327106802955778">เมนูเพิ่มเติม</translation> <translation id="2320166752086256636">ซ่อนแป้นพิมพ์</translation> <translation id="2339560363438331454">การซิงค์และบริการของ Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index e18dc76..7f9180b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Okuma Listesine eklendi</translation> <translation id="1821253160463689938">Belirtilen sayfaları ziyaret etmiyor olsanız bile tercihlerinizi hatırlamak için çerezler kullanır</translation> <translation id="1876721852596493031">Kull. Veril. Gönder</translation> -<translation id="1880677175115548835">Metin seç</translation> <translation id="1886928167269928266">En Baştan</translation> <translation id="1911619930368729126">Google Drive'a yükle</translation> <translation id="1941314575388338491">Kopyalamak için iki kez dokunun.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Göz atma verileri temizleniyor...</translation> <translation id="2256128224215992540">Arama ve Site Önerileri</translation> <translation id="2267753748892043616">Hesap Ekle</translation> +<translation id="2268044343513325586">Hassaslaştır</translation> <translation id="2273327106802955778">Diğer menüsü</translation> <translation id="2320166752086256636">Klavyeyi gizle</translation> <translation id="2339560363438331454">Senkronizasyon ve Google Hizmetleri</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index eb550866..7b512b7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Додано в список читання</translation> <translation id="1821253160463689938">Використовує файли cookie, щоб зберігати налаштування, навіть якщо ви не відвідуєте ці сторінки</translation> <translation id="1876721852596493031">Надсилати статистику</translation> -<translation id="1880677175115548835">Вибрати текст</translation> <translation id="1886928167269928266">Весь період</translation> <translation id="1911619930368729126">Завантажити на Google Диск</translation> <translation id="1941314575388338491">Двічі торкніться, щоб скопіювати.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Очищення даних веб-перегляду…</translation> <translation id="2256128224215992540">Пропозиції термінів і сайтів</translation> <translation id="2267753748892043616">Додати обліковий запис</translation> +<translation id="2268044343513325586">Уточнити</translation> <translation id="2273327106802955778">Більше опцій</translation> <translation id="2320166752086256636">Сховати клавіатуру</translation> <translation id="2339560363438331454">Синхрон. та серв. Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index f32c623c..c8823b86 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">Đã thêm vào Danh sách đọc</translation> <translation id="1821253160463689938">Sử dụng cookie để ghi nhớ tùy chọn của bạn, ngay cả khi bạn không truy cập vào các trang đó</translation> <translation id="1876721852596493031">Gửi dữ liệu sử dụng</translation> -<translation id="1880677175115548835">Chọn văn bản</translation> <translation id="1886928167269928266">Mọi thứ</translation> <translation id="1911619930368729126">Tải lên Google Drive</translation> <translation id="1941314575388338491">Nhấn đúp để sao chép.</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">Đang xóa dữ liệu duyệt web...</translation> <translation id="2256128224215992540">Đề xuất trang web & tìm kiếm</translation> <translation id="2267753748892043616">Thêm tài khoản</translation> +<translation id="2268044343513325586">Tinh chỉnh</translation> <translation id="2273327106802955778">Menu khác</translation> <translation id="2320166752086256636">Ẩn bàn phím</translation> <translation id="2339560363438331454">Đồng bộ hóa và các dịch vụ của Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index f3c0812..90894e93 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -62,7 +62,6 @@ <translation id="1820259098641718022">已添加到阅读清单</translation> <translation id="1821253160463689938">使用 Cookie 记住您的偏好设置(即使您不访问这些网页)</translation> <translation id="1876721852596493031">发送使用情况数据</translation> -<translation id="1880677175115548835">选择文字</translation> <translation id="1886928167269928266">全部</translation> <translation id="1911619930368729126">上传到Google云端硬盘</translation> <translation id="1941314575388338491">点按两次即可复制。</translation> @@ -82,6 +81,7 @@ <translation id="2239626343334228536">正在清除浏览数据…</translation> <translation id="2256128224215992540">搜索和网站建议</translation> <translation id="2267753748892043616">添加帐号</translation> +<translation id="2268044343513325586">优化</translation> <translation id="2273327106802955778">“更多”菜单</translation> <translation id="2320166752086256636">隐藏键盘</translation> <translation id="2339560363438331454">同步功能和 Google 服务</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 600db7e..50fb823 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -81,6 +81,7 @@ <translation id="2239626343334228536">正在清除瀏覽資料...</translation> <translation id="2256128224215992540">搜尋與網站建議</translation> <translation id="2267753748892043616">新增帳戶</translation> +<translation id="2268044343513325586">修正搜尋</translation> <translation id="2273327106802955778">[更多] 選單</translation> <translation id="2320166752086256636">隱藏鍵盤</translation> <translation id="2339560363438331454">同步處理和 Google 服務</translation>
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm index a14130ce..e720bd33 100644 --- a/ios/chrome/browser/about_flags.mm +++ b/ios/chrome/browser/about_flags.mm
@@ -84,32 +84,17 @@ const FeatureEntry::FeatureParam kMarkHttpAsDangerous[] = { {security_state::features::kMarkHttpAsFeatureParameterName, security_state::features::kMarkHttpAsParameterDangerous}}; -const FeatureEntry::FeatureParam kMarkHttpAsWarning[] = { - {security_state::features::kMarkHttpAsFeatureParameterName, - security_state::features::kMarkHttpAsParameterWarning}}; const FeatureEntry::FeatureParam kMarkHttpAsWarningAndDangerousOnFormEdits[] = { {security_state::features::kMarkHttpAsFeatureParameterName, security_state::features:: kMarkHttpAsParameterWarningAndDangerousOnFormEdits}}; -const FeatureEntry::FeatureParam - kMarkHttpAsWarningAndDangerousOnPasswordsAndCreditCards[] = { - {security_state::features::kMarkHttpAsFeatureParameterName, - security_state::features:: - kMarkHttpAsParameterWarningAndDangerousOnPasswordsAndCreditCards}}; const FeatureEntry::FeatureVariation kMarkHttpAsFeatureVariations[] = { {"(mark as actively dangerous)", kMarkHttpAsDangerous, base::size(kMarkHttpAsDangerous), nullptr}, - {"(mark with a Not Secure warning)", kMarkHttpAsWarning, - base::size(kMarkHttpAsWarning), nullptr}, {"(mark with a Not Secure warning and dangerous on form edits)", kMarkHttpAsWarningAndDangerousOnFormEdits, - base::size(kMarkHttpAsWarningAndDangerousOnFormEdits), nullptr}, - {"(mark with a Not Secure warning and dangerous on passwords and credit " - "card fields)", - kMarkHttpAsWarningAndDangerousOnPasswordsAndCreditCards, - base::size(kMarkHttpAsWarningAndDangerousOnPasswordsAndCreditCards), - nullptr}}; + base::size(kMarkHttpAsWarningAndDangerousOnFormEdits), nullptr}}; const FeatureEntry::Choice kUseDdljsonApiChoices[] = { {flags_ui::kGenericExperimentChoiceDefault, "", ""}, @@ -252,13 +237,6 @@ flags_ui::kOsIos, FEATURE_VALUE_TYPE( autofill::features::kAutofillDownstreamUseGooglePayBrandingOniOS)}, - {"enable-autofill-credit-card-upload-google-pay-branding", - flag_descriptions::kAutofillUpstreamUseGooglePayBrandingOnMobileName, - flag_descriptions:: - kAutofillUpstreamUseGooglePayBrandingOnMobileDescription, - flags_ui::kOsIos, - FEATURE_VALUE_TYPE( - autofill::features::kAutofillUpstreamUseGooglePayBrandingOnMobile)}, {"enable-autofill-save-credit-card-uses-strike-system", flag_descriptions::kEnableAutofillSaveCreditCardUsesStrikeSystemName, flag_descriptions::
diff --git a/ios/chrome/browser/autofill/autofill_controller_unittest.mm b/ios/chrome/browser/autofill/autofill_controller_unittest.mm index 40e70848..7a3cfa4 100644 --- a/ios/chrome/browser/autofill/autofill_controller_unittest.mm +++ b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
@@ -27,7 +27,6 @@ #include "components/infobars/core/infobar.h" #include "components/infobars/core/infobar_manager.h" #include "components/keyed_service/core/service_access_type.h" -#include "components/security_state/ios/ssl_status_input_event_data.h" #import "ios/chrome/browser/autofill/form_suggestion_controller.h" #include "ios/chrome/browser/autofill/personal_data_manager_factory.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" @@ -41,7 +40,6 @@ #include "ios/chrome/browser/web_data_service_factory.h" #import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_manager.h" -#include "ios/web/public/ssl_status.h" #import "ios/web/public/web_state/js/crw_js_injection_receiver.h" #include "ios/web/public/web_state/web_frame.h" #include "ios/web/public/web_state/web_frame_util.h" @@ -658,66 +656,6 @@ credit_card.GetInfo(AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), "en-US")); }; -// Checks that an HTTP page containing a credit card results in a navigation -// entry with the "credit card interaction" bit set to true. -TEST_F(AutofillControllerTest, HttpCreditCard) { - LoadHtml(kCreditCardAutofocusFormHtml, GURL("http://chromium.test")); - WaitForSuggestionRetrieval(/*wait_for_trigger=*/NO); - - web::SSLStatus ssl_status = - web_state()->GetNavigationManager()->GetLastCommittedItem()->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl_status.user_data.get()); - EXPECT_TRUE(input_events && - input_events->input_events()->credit_card_field_edited); -}; - -// Checks that an HTTP page without a credit card form does not result in a -// navigation entry with the "credit card interaction" bit set to true. -TEST_F(AutofillControllerTest, HttpNoCreditCard) { - LoadHtml(kNoCreditCardFormHtml, GURL("http://chromium.test")); - WaitForSuggestionRetrieval(/*wait_for_trigger=*/NO); - - web::SSLStatus ssl_status = - web_state()->GetNavigationManager()->GetLastCommittedItem()->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl_status.user_data.get()); - EXPECT_FALSE(input_events && - input_events->input_events()->credit_card_field_edited); -}; - -// Checks that an HTTPS page containing a credit card form does not result in a -// navigation entry with the "credit card interaction" bit set to true. -TEST_F(AutofillControllerTest, HttpsCreditCard) { - LoadHtml(kCreditCardAutofocusFormHtml, GURL("https://chromium.test")); - WaitForSuggestionRetrieval(/*wait_for_trigger=*/NO); - - web::SSLStatus ssl_status = - web_state()->GetNavigationManager()->GetLastCommittedItem()->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl_status.user_data.get()); - EXPECT_FALSE(input_events && - input_events->input_events()->credit_card_field_edited); -}; - -// Checks that an HTTPS page without a credit card form does not result in a -// navigation entry with the "credit card interaction" bit set to true. -TEST_F(AutofillControllerTest, HttpsNoCreditCard) { - LoadHtml(kNoCreditCardFormHtml, GURL("https://chromium.test")); - WaitForSuggestionRetrieval(/*wait_for_trigger=*/NO); - - web::SSLStatus ssl_status = - web_state()->GetNavigationManager()->GetLastCommittedItem()->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl_status.user_data.get()); - EXPECT_FALSE(input_events && - input_events->input_events()->credit_card_field_edited); -}; - } // namespace } // namespace autofill
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc index 7bb1abbe..4e331cb 100644 --- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -180,12 +180,6 @@ "Transmit rich form/field metadata when querying the autofill server. " "This feature only works on the Canary and Dev channels."; -const char kAutofillUpstreamUseGooglePayBrandingOnMobileName[] = - "Enable Google Pay branding when offering credit card upload"; -const char kAutofillUpstreamUseGooglePayBrandingOnMobileDescription[] = - "If enabled, shows the Google Pay logo and a shorter header message when " - "credit card upload to Google Payments is offered."; - const char kBrowserContainerFullscreenName[] = "Browser Container Fullscreen"; const char kBrowserContainerFullscreenDescription[] = "When enabled, the BrowserContainer is fullscreen. No UI change should be "
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h index 2429949..6f69b42 100644 --- a/ios/chrome/browser/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -138,11 +138,6 @@ extern const char kAutofillRichMetadataQueriesName[]; extern const char kAutofillRichMetadataQueriesDescription[]; -// Title and description for the flag to control GPay branding in credit card -// upstream infobar. -extern const char kAutofillUpstreamUseGooglePayBrandingOnMobileName[]; -extern const char kAutofillUpstreamUseGooglePayBrandingOnMobileDescription[]; - // Title and description for the flag to make browser container fullscreen. extern const char kBrowserContainerFullscreenName[]; extern const char kBrowserContainerFullscreenDescription[];
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm index 6d37f542..2e71b2b 100644 --- a/ios/chrome/browser/passwords/password_controller.mm +++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -52,7 +52,6 @@ #import "ios/chrome/browser/passwords/notify_auto_signin_view_controller.h" #import "ios/chrome/browser/passwords/password_form_filler.h" #include "ios/chrome/browser/passwords/password_manager_features.h" -#import "ios/chrome/browser/ssl/insecure_input_tab_helper.h" #include "ios/chrome/browser/sync/profile_sync_service_factory.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" #import "ios/chrome/browser/ui/commands/application_commands.h" @@ -586,13 +585,6 @@ return; if (!forms.empty()) { - // Notify web_state about password forms, so that this can be taken into - // account for the security state. - if (_webState && !web::IsOriginSecure(_webState->GetLastCommittedURL())) { - InsecureInputTabHelper::GetOrCreateForWebState(_webState) - ->DidShowPasswordFieldInInsecureContext(); - } - [self.suggestionHelper updateStateOnPasswordFormExtracted]; // Invoke the password manager callback to autofill password forms
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm index f1095dcb..72e8ba09 100644 --- a/ios/chrome/browser/passwords/password_controller_unittest.mm +++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -28,7 +28,6 @@ #include "components/password_manager/ios/test_helpers.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" -#include "components/security_state/ios/ssl_status_input_event_data.h" #import "ios/chrome/browser/autofill/form_suggestion_controller.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/passwords/password_form_filler.h" @@ -37,7 +36,6 @@ #import "ios/chrome/browser/web/chrome_web_test.h" #import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_manager.h" -#include "ios/web/public/ssl_status.h" #import "ios/web/public/test/fakes/test_web_state.h" #import "ios/web/public/test/web_js_test.h" #include "ios/web/public/web_state/web_frame.h" @@ -1172,62 +1170,6 @@ [passwordController webState:&web_state didLoadPageWithSuccess:YES]; } -// Tests that an HTTP page without a password field does not update the SSL -// status to indicate |password_field_shown|. -TEST_F(PasswordControllerTest, HTTPNoPassword) { - LoadHtml(kHtmlWithoutPasswordForm, GURL("http://chromium.test")); - - web::SSLStatus ssl_status = - web_state()->GetNavigationManager()->GetLastCommittedItem()->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl_status.user_data.get()); - EXPECT_FALSE(input_events && - input_events->input_events()->password_field_shown); -} - -// Tests that an HTTP page with a password field updates the SSL status -// to indicate |password_field_shown|. -TEST_F(PasswordControllerTest, HTTPPassword) { - LoadHtml(kHtmlWithPasswordForm, GURL("http://chromium.test")); - - web::SSLStatus ssl_status = - web_state()->GetNavigationManager()->GetLastCommittedItem()->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl_status.user_data.get()); - ASSERT_TRUE(input_events); - EXPECT_TRUE(input_events->input_events()->password_field_shown); -} - -// Tests that an HTTPS page without a password field does not update the SSL -// status to indicate |password_field_shown|. -TEST_F(PasswordControllerTest, HTTPSNoPassword) { - LoadHtml(kHtmlWithoutPasswordForm, GURL("https://chromium.test")); - - web::SSLStatus ssl_status = - web_state()->GetNavigationManager()->GetLastCommittedItem()->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl_status.user_data.get()); - EXPECT_FALSE(input_events && - input_events->input_events()->password_field_shown); -} - -// Tests that an HTTPS page with a password field does not update the SSL status -// to indicate |password_field_shown|. -TEST_F(PasswordControllerTest, HTTPSPassword) { - LoadHtml(kHtmlWithPasswordForm, GURL("https://chromium.test")); - - web::SSLStatus ssl_status = - web_state()->GetNavigationManager()->GetLastCommittedItem()->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl_status.user_data.get()); - EXPECT_FALSE(input_events && - input_events->input_events()->password_field_shown); -} - // Checks that when the user set a focus on a field of a password form which was // not sent to the store then the request the the store is sent. TEST_F(PasswordControllerTest, SendingToStoreDynamicallyAddedFormsOnFocus) {
diff --git a/ios/chrome/browser/ssl/insecure_input_tab_helper.h b/ios/chrome/browser/ssl/insecure_input_tab_helper.h index 3ba551b..3f1aed7 100644 --- a/ios/chrome/browser/ssl/insecure_input_tab_helper.h +++ b/ios/chrome/browser/ssl/insecure_input_tab_helper.h
@@ -25,14 +25,6 @@ static InsecureInputTabHelper* GetOrCreateForWebState( web::WebState* web_state); - // This method should be called when a form containing a password field is - // parsed in a non-secure context. - void DidShowPasswordFieldInInsecureContext(); - - // This method should be called when the autofill component detects a credit - // card field was interacted with in a non-secure context. - void DidInteractWithNonsecureCreditCardInput(); - // This method should be called when the user edits a field in a non-secure // context. void DidEditFieldInInsecureContext();
diff --git a/ios/chrome/browser/ssl/insecure_input_tab_helper.mm b/ios/chrome/browser/ssl/insecure_input_tab_helper.mm index 21a7741b..b21588a 100644 --- a/ios/chrome/browser/ssl/insecure_input_tab_helper.mm +++ b/ios/chrome/browser/ssl/insecure_input_tab_helper.mm
@@ -65,38 +65,6 @@ return helper; } -void InsecureInputTabHelper::DidShowPasswordFieldInInsecureContext() { - DCHECK(!web::IsOriginSecure(web_state_->GetLastCommittedURL())); - - security_state::SSLStatusInputEventData* input_events = - GetOrCreateSSLStatusInputEventData(web_state_); - if (!input_events) - return; - - // If the first password field for the web contents was just - // shown, update the SSLStatusInputEventData. - if (!input_events->input_events()->password_field_shown) { - input_events->input_events()->password_field_shown = true; - web_state_->DidChangeVisibleSecurityState(); - } -} - -void InsecureInputTabHelper::DidInteractWithNonsecureCreditCardInput() { - DCHECK(!web::IsOriginSecure(web_state_->GetLastCommittedURL())); - - security_state::SSLStatusInputEventData* input_events = - GetOrCreateSSLStatusInputEventData(web_state_); - if (!input_events) - return; - - // If the first credit card field for the web contents was just - // shown, update the SSLStatusInputEventData. - if (!input_events->input_events()->credit_card_field_edited) { - input_events->input_events()->credit_card_field_edited = true; - web_state_->DidChangeVisibleSecurityState(); - } -} - void InsecureInputTabHelper::DidEditFieldInInsecureContext() { DCHECK(!web::IsOriginSecure(web_state_->GetLastCommittedURL()));
diff --git a/ios/chrome/browser/ssl/ios_security_state_tab_helper.mm b/ios/chrome/browser/ssl/ios_security_state_tab_helper.mm index bf8c0aa..49791f8f 100644 --- a/ios/chrome/browser/ssl/ios_security_state_tab_helper.mm +++ b/ios/chrome/browser/ssl/ios_security_state_tab_helper.mm
@@ -52,7 +52,6 @@ state->displayed_mixed_content = (ssl.content_status & web::SSLStatus::DISPLAYED_INSECURE_CONTENT) ? true : false; - state->is_incognito = web_state_->GetBrowserState()->IsOffTheRecord(); security_state::SSLStatusInputEventData* input_events = static_cast<security_state::SSLStatusInputEventData*>(
diff --git a/ios/chrome/browser/ssl/ios_security_state_tab_helper_unittest.mm b/ios/chrome/browser/ssl/ios_security_state_tab_helper_unittest.mm index 2e3f68c..69e0281f 100644 --- a/ios/chrome/browser/ssl/ios_security_state_tab_helper_unittest.mm +++ b/ios/chrome/browser/ssl/ios_security_state_tab_helper_unittest.mm
@@ -5,9 +5,7 @@ #import "ios/chrome/browser/ssl/ios_security_state_tab_helper.h" #include "components/security_state/core/security_state.h" -#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/ssl/insecure_input_tab_helper.h" -#import "ios/chrome/browser/web/chrome_web_test.h" #import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_manager.h" #include "ios/web/public/ssl_status.h" @@ -17,47 +15,6 @@ #error "This file requires ARC support." #endif -// This test fixture enables Incognito mode and creates an -// IOSSecurityStateTabHelper for the WebState. -class IOSSecurityStateTabHelperIncognitoTest : public ChromeWebTest { - protected: - void SetUp() override { - ChromeWebTest::SetUp(); - ASSERT_TRUE(web_state()->GetBrowserState()->IsOffTheRecord()); - IOSSecurityStateTabHelper::CreateForWebState(web_state()); - } - - // Returns the SecurityInfo for current WebState(). - void GetSecurityInfo(security_state::SecurityInfo* result) const { - IOSSecurityStateTabHelper::FromWebState(web_state()) - ->GetSecurityInfo(result); - } - - // WebTest - web::BrowserState* GetBrowserState() override { - return chrome_browser_state_->GetOffTheRecordChromeBrowserState(); - } -}; - -// Ensures that the security level of an HTTPS page loaded in Incognito mode -// is not downgraded. -TEST_F(IOSSecurityStateTabHelperIncognitoTest, - SecurityInfoNotDowngradedForHTTPS) { - LoadHtml(@"<html><body></body></html>", GURL("https://chromium.test")); - security_state::SecurityInfo security_info; - GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.incognito_downgraded_security_level); -} - -// Ensures that the security level of an HTTP page loaded in Incognito mode -// is downgraded. -TEST_F(IOSSecurityStateTabHelperIncognitoTest, SecurityInfoDowngradedForHTTP) { - LoadHtml(@"<html><body></body></html>", GURL("http://chromium.test")); - security_state::SecurityInfo security_info; - GetSecurityInfo(&security_info); - EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level); -} - // This test fixture creates an IOSSecurityStateTabHelper and an // InsecureInputTabHelper for the WebState, then loads a non-secure // HTML document. @@ -87,16 +44,6 @@ InsecureInputTabHelper* insecure_input_; }; -// Ensures that an HTTP page in non-Incognito mode does not downgrade to -// non-secure. -TEST_F(IOSSecurityStateTabHelperTest, SecurityInfoNotDowngradedInNonIncognito) { - LoadHtml(@"<html><body></body></html>", GURL("http://chromium.test")); - security_state::SecurityInfo security_info; - IOSSecurityStateTabHelper::FromWebState(web_state()) - ->GetSecurityInfo(&security_info); - EXPECT_FALSE(security_info.incognito_downgraded_security_level); -} - // Ensures that |insecure_field_edited| is set only when an editing event has // been reported. TEST_F(IOSSecurityStateTabHelperTest, SecurityInfoAfterEditing) { @@ -111,34 +58,6 @@ EXPECT_TRUE(events.insecure_field_edited); } -// Ensures that |password_field_shown| is set only when a password field has -// been reported. -TEST_F(IOSSecurityStateTabHelperTest, SecurityInfoWithInsecurePasswordField) { - // Verify |password_field_shown| is not set prematurely. - security_state::InsecureInputEventData events = GetInsecureInputEventData(); - EXPECT_FALSE(events.password_field_shown); - - // Simulate a password field display and verify |password_field_shown| - // is noted in the insecure_input_events. - insecure_input()->DidShowPasswordFieldInInsecureContext(); - events = GetInsecureInputEventData(); - EXPECT_TRUE(events.password_field_shown); -} - -// Ensures that |credit_card_field_edited| is set only when a credit card field -// interaction has been reported. -TEST_F(IOSSecurityStateTabHelperTest, SecurityInfoWithInsecureCreditCardField) { - // Verify |credit_card_field_edited| is not set prematurely. - security_state::InsecureInputEventData events = GetInsecureInputEventData(); - EXPECT_FALSE(events.credit_card_field_edited); - - // Simulate a credit card field display and verify |credit_card_field_edited| - // is noted in the insecure_input_events. - insecure_input()->DidInteractWithNonsecureCreditCardInput(); - events = GetInsecureInputEventData(); - EXPECT_TRUE(events.credit_card_field_edited); -} - // Ensures that re-navigating to the same page does not keep // |insecure_field_set| set. TEST_F(IOSSecurityStateTabHelperTest, InsecureInputClearedOnRenavigation) {
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn index 70c13aa..40711f7 100644 --- a/ios/chrome/browser/tabs/BUILD.gn +++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -16,7 +16,6 @@ "tab_model_synced_window_delegate_getter.h", "tab_private.h", "tab_title_util.h", - "tab_util.h", ] public_deps = [ "//ios/web", @@ -64,7 +63,6 @@ "tab_parenting_observer.mm", "tab_title_util.h", "tab_title_util.mm", - "tab_util.mm", ] deps = [ ":tabs", @@ -158,7 +156,6 @@ "tab_model_unittest.mm", "tab_title_util_unittest.mm", "tab_unittest.mm", - "tab_util_unittest.mm", ] deps = [ ":tabs",
diff --git a/ios/chrome/browser/tabs/tab_util.h b/ios/chrome/browser/tabs/tab_util.h deleted file mode 100644 index d21d574..0000000 --- a/ios/chrome/browser/tabs/tab_util.h +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_TABS_TAB_UTIL_H_ -#define IOS_CHROME_BROWSER_TABS_TAB_UTIL_H_ - -#include "components/search_engines/template_url.h" -#import "ios/web/public/navigation_manager.h" -#include "ui/base/page_transition_types.h" - -class GURL; - -// Creates a WebLoadParams object for loading |url| with |transition_type|. If -// |post_data| is nonnull, the data and content-type of the post data will be -// added to the return value as well. -web::NavigationManager::WebLoadParams CreateWebLoadParams( - const GURL& url, - ui::PageTransition transition_type, - TemplateURLRef::PostContent* post_data); - -#endif // IOS_CHROME_BROWSER_TABS_TAB_UTIL_H_
diff --git a/ios/chrome/browser/tabs/tab_util_unittest.mm b/ios/chrome/browser/tabs/tab_util_unittest.mm deleted file mode 100644 index 32a5871..0000000 --- a/ios/chrome/browser/tabs/tab_util_unittest.mm +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "ios/chrome/browser/tabs/tab_util.h" - -#include "components/search_engines/template_url.h" -#import "ios/web/public/navigation_manager.h" -#include "testing/gtest/include/gtest/gtest.h" -#import "testing/gtest_mac.h" -#include "testing/platform_test.h" -#include "ui/base/page_transition_types.h" -#include "url/gurl.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -typedef PlatformTest TabUtilsTest; - -TEST_F(TabUtilsTest, CreateWebLoadParamsWithoutPost) { - // No post params, check URL and transition. - GURL url("http://test.info/"); - web::NavigationManager::WebLoadParams params = CreateWebLoadParams( - url, ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK, - /*post_data=*/nullptr); - EXPECT_EQ(params.url, url); - EXPECT_TRUE(PageTransitionCoreTypeIs( - params.transition_type, - ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK)); - // There should be no post data, and no extra headers. - EXPECT_EQ(params.post_data, nil); - EXPECT_EQ(params.extra_headers, nil); -} - -TEST_F(TabUtilsTest, CreateWebLoadParamsWithPost) { - // With post params. - GURL url("http://test.info/"); - std::string post_data = "sphinx of black quartz judge my vow"; - TemplateURLRef::PostContent post_content("text/plain", post_data); - web::NavigationManager::WebLoadParams params = - CreateWebLoadParams(url, ui::PageTransition::PAGE_TRANSITION_FORM_SUBMIT, - /*post_data=*/&post_content); - EXPECT_EQ(params.url, url); - EXPECT_TRUE(PageTransitionCoreTypeIs( - params.transition_type, ui::PageTransition::PAGE_TRANSITION_FORM_SUBMIT)); - // Post data should be the same length as post_data - EXPECT_EQ(params.post_data.length, post_data.length()); - EXPECT_NSEQ(params.extra_headers[@"Content-Type"], @"text/plain"); -}
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 dde5129..08cf210 100644 --- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h +++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
@@ -111,7 +111,6 @@ const std::vector<FormStructure*>& forms) override; void DidFillOrPreviewField(const base::string16& autofilled_value, const base::string16& profile_full_name) override; - void DidInteractWithNonsecureCreditCardInput() override; bool IsContextSecure() override; bool ShouldShowSigninPromo() override; bool AreServerCardsSupported() 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 f671456e..8818af0 100644 --- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm +++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
@@ -32,7 +32,6 @@ #include "ios/chrome/browser/infobars/infobar_utils.h" #include "ios/chrome/browser/metrics/ukm_url_recorder.h" #include "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/ssl/insecure_input_tab_helper.h" #include "ios/chrome/browser/ssl/ios_security_state_tab_helper.h" #include "ios/chrome/browser/sync/profile_sync_service_factory.h" #include "ios/chrome/browser/translate/chrome_ios_translate_client.h" @@ -331,11 +330,6 @@ const base::string16& autofilled_value, const base::string16& profile_full_name) {} -void ChromeAutofillClientIOS::DidInteractWithNonsecureCreditCardInput() { - InsecureInputTabHelper::GetOrCreateForWebState(web_state_) - ->DidInteractWithNonsecureCreditCardInput(); -} - bool ChromeAutofillClientIOS::IsContextSecure() { return IsContextSecureForWebState(web_state_); }
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm index 04441e2..5f610d1 100644 --- a/ios/chrome/browser/ui/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -57,9 +57,6 @@ #include "ios/chrome/browser/reading_list/reading_list_model_factory.h" #include "ios/chrome/browser/search_engines/template_url_service_factory.h" #include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" -#include "ios/chrome/browser/sessions/session_util.h" -#include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios.h" -#include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios_factory.h" #import "ios/chrome/browser/signin/account_consistency_service_factory.h" #include "ios/chrome/browser/signin/account_reconcilor_factory.h" #import "ios/chrome/browser/snapshots/snapshot_generator_delegate.h" @@ -73,7 +70,6 @@ #import "ios/chrome/browser/tabs/tab_model.h" #import "ios/chrome/browser/tabs/tab_model_observer.h" #import "ios/chrome/browser/tabs/tab_private.h" -#import "ios/chrome/browser/tabs/tab_util.h" #import "ios/chrome/browser/translate/chrome_ios_translate_client.h" #import "ios/chrome/browser/ui/activity_services/activity_service_legacy_coordinator.h" #import "ios/chrome/browser/ui/activity_services/requirements/activity_service_presentation.h" @@ -172,6 +168,7 @@ #include "ios/chrome/browser/web/print_tab_helper.h" #import "ios/chrome/browser/web/repost_form_tab_helper.h" #import "ios/chrome/browser/web/sad_tab_tab_helper.h" +#import "ios/chrome/browser/web/web_navigation_util.h" #include "ios/chrome/browser/web/web_state_printer.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_usage_enabler/web_state_list_web_usage_enabler.h" @@ -1186,13 +1183,14 @@ SnapshotTabHelper::FromWebState(self.currentWebState)->UpdateSnapshot(); } - [self.tabModel insertTabWithLoadParams:CreateWebLoadParams( - GURL(kChromeUINewTabURL), - ui::PAGE_TRANSITION_TYPED, nullptr) - opener:nil - openedByDOM:NO - atIndex:self.tabModel.count - inBackground:NO]; + [self.tabModel + insertTabWithLoadParams:web_navigation_util::CreateWebLoadParams( + GURL(kChromeUINewTabURL), + ui::PAGE_TRANSITION_TYPED, nullptr) + opener:nil + openedByDOM:NO + atIndex:self.tabModel.count + inBackground:NO]; } - (void)appendTabAddedCompletion:(ProceduralBlock)tabAddedCompletion { @@ -2546,105 +2544,6 @@ return webState->GetView(); } -// Switch to the tab corresponding to |params|. -- (void)switchToTabWithParams: - (const web::NavigationManager::WebLoadParams&)params { - const GURL& URL = params.url; - - NSInteger newWebStateIndex = 0; - WebStateList* webStateList = self.tabModel.webStateList; - NSInteger currentWebStateIndex = webStateList->active_index(); - web::WebState* currentWebState = webStateList->GetActiveWebState(); - - // TODO(crbug.com/893121): This should probably live in the WebStateList. - while (newWebStateIndex < webStateList->count()) { - web::WebState* webState = webStateList->GetWebStateAt(newWebStateIndex); - - if (webState != currentWebState && URL == webState->GetVisibleURL()) { - break; - } - newWebStateIndex++; - } - - BOOL isNTPWithoutHistory = - IsVisibleURLNewTabPage(currentWebState) && - currentWebState->GetNavigationManager() && - !currentWebState->GetNavigationManager()->CanGoBack() && - !currentWebState->GetNavigationManager()->CanGoForward(); - - if (newWebStateIndex >= webStateList->count()) { - // If the tab containing the URL has been closed. - if (isNTPWithoutHistory) { - // It is NTP, just load the URL. - ChromeLoadParams currentPageParams(params); - [self loadURLWithParams:currentPageParams]; - } else { - // Open the URL in foreground. - OpenNewTabCommand* newTabCommand = - [[OpenNewTabCommand alloc] initWithURL:URL - referrer:web::Referrer() - inIncognito:self.isOffTheRecord - inBackground:NO - appendTo:kCurrentTab]; - [self.dispatcher openURLInNewTab:newTabCommand]; - } - return; - } - - web::WebState* webStateBeingActivated = - webStateList->GetWebStateAt(newWebStateIndex); - - if (![self canShowTabStrip]) { - // Add animations only if the tab strip isn't shown. - UIView* snapshotView = [self.view snapshotViewAfterScreenUpdates:NO]; - - // TODO(crbug.com/904992): Do not repurpose SnapshotGeneratorDelegate. - SwipeView* swipeView = [[SwipeView alloc] - initWithFrame:self.contentArea.frame - topMargin:[self snapshotGenerator:nil - snapshotEdgeInsetsForWebState:webStateBeingActivated] - .top]; - - [swipeView setTopToolbarImage:[self.primaryToolbarCoordinator - toolbarSideSwipeSnapshotForWebState: - webStateBeingActivated]]; - [swipeView setBottomToolbarImage:[self.secondaryToolbarCoordinator - toolbarSideSwipeSnapshotForWebState: - webStateBeingActivated]]; - - SnapshotTabHelper::FromWebState(webStateBeingActivated) - ->RetrieveColorSnapshot(^(UIImage* image) { - if (PagePlaceholderTabHelper::FromWebState(webStateBeingActivated) - ->will_add_placeholder_for_next_navigation()) { - [swipeView setImage:SnapshotTabHelper::GetDefaultSnapshotImage()]; - } else { - [swipeView setImage:image]; - } - }); - - SwitchToTabAnimationView* animationView = - [[SwitchToTabAnimationView alloc] initWithFrame:self.view.bounds]; - - [self.view addSubview:animationView]; - - SwitchToTabAnimationPosition position = - newWebStateIndex > webStateList->active_index() - ? SwitchToTabAnimationPositionAfter - : SwitchToTabAnimationPositionBefore; - [animationView animateFromCurrentView:snapshotView - toNewView:swipeView - inPosition:position]; - } - webStateList->ActivateWebStateAt(newWebStateIndex); - - // Close the tab if it is NTP with no back/forward history to avoid having - // empty tabs. - if (isNTPWithoutHistory) { - webStateList->CloseWebStateAt(currentWebStateIndex, - WebStateList::CLOSE_USER_ACTION); - } -} - #pragma mark - Private Methods: Find Bar UI - (void)hideFindBarWithAnimation:(BOOL)animate { @@ -3540,13 +3439,14 @@ TemplateURLRef::PostContent postContent; GURL result(defaultURL->image_url_ref().ReplaceSearchTerms( search_args, templateUrlService->search_terms_data(), &postContent)); - [self.tabModel insertTabWithLoadParams:CreateWebLoadParams( - result, ui::PAGE_TRANSITION_TYPED, - &postContent) - opener:nil - openedByDOM:NO - atIndex:self.tabModel.count - inBackground:NO]; + [self.tabModel + insertTabWithLoadParams:web_navigation_util::CreateWebLoadParams( + result, ui::PAGE_TRANSITION_TYPED, + &postContent) + opener:nil + openedByDOM:NO + atIndex:self.tabModel.count + inBackground:NO]; } // Saves the image at the given URL on the system's album. The referrer is used @@ -4215,15 +4115,6 @@ [self.dispatcher openURLInNewTab:command]; } -- (void)loadSessionTab:(const sessions::SessionTab*)sessionTab { - WebStateList* webStateList = self.tabModel.webStateList; - webStateList->ReplaceWebStateAt( - webStateList->active_index(), - session_util::CreateWebStateWithNavigationEntries( - [self.tabModel browserState], sessionTab->current_navigation_index, - sessionTab->navigations)); -} - #pragma mark - UrlLoader helpers // Opens a new tab in the current mode, following |command| parameters. The @@ -4249,8 +4140,25 @@ CGPointEqualToPoint(command.originPoint, CGPointZero)) { openTab(); } else { - [self animateNewTabInBackgroundFromPoint:command.originPoint - withCompletion:openTab]; + self.inNewTabAnimation = YES; + // Exit fullscreen if needed. + FullscreenControllerFactory::GetInstance() + ->GetForBrowserState(_browserState) + ->ExitFullscreen(); + const CGFloat kAnimatedViewSize = 50; + BackgroundTabAnimationView* animatedView = + [[BackgroundTabAnimationView alloc] + initWithFrame:CGRectMake(0, 0, kAnimatedViewSize, + kAnimatedViewSize)]; + __weak UIView* weakAnimatedView = animatedView; + auto completionBlock = ^() { + self.inNewTabAnimation = NO; + [weakAnimatedView removeFromSuperview]; + openTab(); + }; + [self.view addSubview:animatedView]; + [animatedView animateFrom:command.originPoint + toTabGridButtonWithCompletion:completionBlock]; } } @@ -4263,6 +4171,105 @@ CHECK(true); } +// Switch to the tab corresponding to |params|. +- (void)switchToTabWithParams: + (const web::NavigationManager::WebLoadParams&)params { + const GURL& URL = params.url; + + NSInteger newWebStateIndex = 0; + WebStateList* webStateList = self.tabModel.webStateList; + NSInteger currentWebStateIndex = webStateList->active_index(); + web::WebState* currentWebState = webStateList->GetActiveWebState(); + + // TODO(crbug.com/893121): This should probably live in the WebStateList. + while (newWebStateIndex < webStateList->count()) { + web::WebState* webState = webStateList->GetWebStateAt(newWebStateIndex); + + if (webState != currentWebState && URL == webState->GetVisibleURL()) { + break; + } + newWebStateIndex++; + } + + BOOL isNTPWithoutHistory = + IsVisibleURLNewTabPage(currentWebState) && + currentWebState->GetNavigationManager() && + !currentWebState->GetNavigationManager()->CanGoBack() && + !currentWebState->GetNavigationManager()->CanGoForward(); + + if (newWebStateIndex >= webStateList->count()) { + // If the tab containing the URL has been closed. + if (isNTPWithoutHistory) { + // It is NTP, just load the URL. + ChromeLoadParams currentPageParams(params); + [self loadURLWithParams:currentPageParams]; + } else { + // Open the URL in foreground. + OpenNewTabCommand* newTabCommand = + [[OpenNewTabCommand alloc] initWithURL:URL + referrer:web::Referrer() + inIncognito:self.isOffTheRecord + inBackground:NO + appendTo:kCurrentTab]; + [self.dispatcher openURLInNewTab:newTabCommand]; + } + return; + } + + web::WebState* webStateBeingActivated = + webStateList->GetWebStateAt(newWebStateIndex); + + if (![self canShowTabStrip]) { + // Add animations only if the tab strip isn't shown. + UIView* snapshotView = [self.view snapshotViewAfterScreenUpdates:NO]; + + // TODO(crbug.com/904992): Do not repurpose SnapshotGeneratorDelegate. + SwipeView* swipeView = [[SwipeView alloc] + initWithFrame:self.contentArea.frame + topMargin:[self snapshotGenerator:nil + snapshotEdgeInsetsForWebState:webStateBeingActivated] + .top]; + + [swipeView setTopToolbarImage:[self.primaryToolbarCoordinator + toolbarSideSwipeSnapshotForWebState: + webStateBeingActivated]]; + [swipeView setBottomToolbarImage:[self.secondaryToolbarCoordinator + toolbarSideSwipeSnapshotForWebState: + webStateBeingActivated]]; + + SnapshotTabHelper::FromWebState(webStateBeingActivated) + ->RetrieveColorSnapshot(^(UIImage* image) { + if (PagePlaceholderTabHelper::FromWebState(webStateBeingActivated) + ->will_add_placeholder_for_next_navigation()) { + [swipeView setImage:SnapshotTabHelper::GetDefaultSnapshotImage()]; + } else { + [swipeView setImage:image]; + } + }); + + SwitchToTabAnimationView* animationView = + [[SwitchToTabAnimationView alloc] initWithFrame:self.view.bounds]; + + [self.view addSubview:animationView]; + + SwitchToTabAnimationPosition position = + newWebStateIndex > webStateList->active_index() + ? SwitchToTabAnimationPositionAfter + : SwitchToTabAnimationPositionBefore; + [animationView animateFromCurrentView:snapshotView + toNewView:swipeView + inPosition:position]; + } + webStateList->ActivateWebStateAt(newWebStateIndex); + + // Close the tab if it is NTP with no back/forward history to avoid having + // empty tabs. + if (isNTPWithoutHistory) { + webStateList->CloseWebStateAt(currentWebStateIndex, + WebStateList::CLOSE_USER_ACTION); + } +} + #pragma mark - ToolbarCoordinatorDelegate (Public) - (void)locationBarDidBecomeFirstResponder { @@ -4339,11 +4346,11 @@ #pragma mark - BrowserCommands - (void)goBack { - self.currentWebState->GetNavigationManager()->GoBack(); + web_navigation_util::GoBack(self.currentWebState); } - (void)goForward { - self.currentWebState->GetNavigationManager()->GoForward(); + web_navigation_util::GoForward(self.currentWebState); } - (void)stopLoading { @@ -4821,29 +4828,6 @@ return; } -- (void)animateNewTabInBackgroundFromPoint:(CGPoint)originPoint - withCompletion:(ProceduralBlock)completion { - self.inNewTabAnimation = YES; - - // Exit fullscreen if needed. - FullscreenControllerFactory::GetInstance() - ->GetForBrowserState(_browserState) - ->ExitFullscreen(); - const CGFloat kAnimatedViewSize = 50; - BackgroundTabAnimationView* animatedView = [[BackgroundTabAnimationView alloc] - initWithFrame:CGRectMake(0, 0, kAnimatedViewSize, kAnimatedViewSize)]; - __weak UIView* weakAnimatedView = animatedView; - auto completionBlock = ^() { - self.inNewTabAnimation = NO; - [weakAnimatedView removeFromSuperview]; - if (completion) - completion(); - }; - [self.view addSubview:animatedView]; - [animatedView animateFrom:originPoint - toTabGridButtonWithCompletion:completionBlock]; -} - #pragma mark - InfobarPositioner - (UIView*)parentView { @@ -5090,13 +5074,14 @@ - (void)captivePortalDetectorTabHelper: (CaptivePortalDetectorTabHelper*)tabHelper connectWithLandingURL:(const GURL&)landingURL { - [self.tabModel insertTabWithLoadParams:CreateWebLoadParams( - landingURL, - ui::PAGE_TRANSITION_TYPED, nullptr) - opener:nil - openedByDOM:NO - atIndex:self.tabModel.count - inBackground:NO]; + [self.tabModel + insertTabWithLoadParams:web_navigation_util::CreateWebLoadParams( + landingURL, ui::PAGE_TRANSITION_TYPED, + nullptr) + opener:nil + openedByDOM:NO + atIndex:self.tabModel.count + inBackground:NO]; } #pragma mark - PageInfoPresentation
diff --git a/ios/chrome/browser/ui/omnibox/BUILD.gn b/ios/chrome/browser/ui/omnibox/BUILD.gn index 199dd7d3..a14bca0 100644 --- a/ios/chrome/browser/ui/omnibox/BUILD.gn +++ b/ios/chrome/browser/ui/omnibox/BUILD.gn
@@ -21,6 +21,8 @@ source_set("omnibox_popup_shared") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ + "omnibox_constants.h", + "omnibox_constants.mm", "truncating_attributed_label.h", "truncating_attributed_label.mm", ]
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_constants.h b/ios/chrome/browser/ui/omnibox/omnibox_constants.h new file mode 100644 index 0000000..a97dbd29 --- /dev/null +++ b/ios/chrome/browser/ui/omnibox/omnibox_constants.h
@@ -0,0 +1,13 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONSTANTS_H_ +#define IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONSTANTS_H_ + +#import <Foundation/Foundation.h> + +// The a11y identifier for the shortcuts table view cell in the omnibox popup. +extern NSString* const kShortcutsAccessibilityIdentifier; + +#endif // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_constants.mm b/ios/chrome/browser/ui/omnibox/omnibox_constants.mm new file mode 100644 index 0000000..0e978c0 --- /dev/null +++ b/ios/chrome/browser/ui/omnibox/omnibox_constants.mm
@@ -0,0 +1,11 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/omnibox/omnibox_constants.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +NSString* const kShortcutsAccessibilityIdentifier = @"OmniboxShortcuts";
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm index 2002409..39d9764 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
@@ -9,6 +9,7 @@ #include "base/ios/ios_util.h" #include "base/metrics/histogram_macros.h" #import "ios/chrome/browser/ui/omnibox/image_retriever.h" +#import "ios/chrome/browser/ui/omnibox/omnibox_constants.h" #import "ios/chrome/browser/ui/omnibox/omnibox_util.h" #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.h" #import "ios/chrome/browser/ui/omnibox/popup/self_sizing_table_view.h" @@ -258,6 +259,7 @@ DCHECK(self.shortcutsViewController); UITableViewCell* cell = [[UITableViewCell alloc] init]; + _shortcutsCell = cell; cell.backgroundColor = [UIColor clearColor]; [self.shortcutsViewController willMoveToParentViewController:self]; [self addChildViewController:self.shortcutsViewController]; @@ -266,6 +268,7 @@ NO; AddSameConstraints(self.shortcutsViewController.view, cell.contentView); [self.shortcutsViewController didMoveToParentViewController:self]; + cell.accessibilityIdentifier = kShortcutsAccessibilityIdentifier; return cell; }
diff --git a/ios/chrome/browser/ui/omnibox/popup/shortcuts/BUILD.gn b/ios/chrome/browser/ui/omnibox/popup/shortcuts/BUILD.gn index fdefec0..24d6d4e 100644 --- a/ios/chrome/browser/ui/omnibox/popup/shortcuts/BUILD.gn +++ b/ios/chrome/browser/ui/omnibox/popup/shortcuts/BUILD.gn
@@ -88,6 +88,8 @@ "//ios/chrome/browser/reading_list", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui:feature_flags", + "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant", + "//ios/chrome/browser/ui/omnibox:omnibox_popup_shared", "//ios/chrome/test/app:test_support", "//ios/chrome/test/base:base", "//ios/chrome/test/earl_grey:test_support",
diff --git a/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm b/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm index 8540638..51e5a0e 100644 --- a/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm +++ b/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm
@@ -8,6 +8,8 @@ #include "base/strings/sys_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h" +#import "ios/chrome/browser/ui/omnibox/omnibox_constants.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" @@ -231,6 +233,29 @@ assertWithMatcher:grey_sufficientlyVisible()]; } +// Tests that on the NTP the shortcuts don't show up. +- (void)testNTPShortcutsDontShowUp { + [[self class] closeAllTabs]; + [ChromeEarlGrey openNewTab]; + + // Tap the fake omnibox. + [[EarlGrey + selectElementWithMatcher:grey_accessibilityID( + ntp_home::FakeOmniboxAccessibilityID())] + performAction:grey_tap()]; + // Wait for the real omnibox to be visible. + [ChromeEarlGrey + waitForElementWithMatcherSufficientlyVisible:chrome_test_util::Omnibox()]; + + // The shortcuts should not show up here. + // The shortcuts are similar to the NTP tiles, so in this test it's necessary + // to differentiate where the tile is actually coming from; therefore check + // the a11y identifier of the shortcuts. + [[EarlGrey selectElementWithMatcher:grey_accessibilityID( + kShortcutsAccessibilityIdentifier)] + assertWithMatcher:grey_nil()]; +} + #pragma mark - helpers - (void)navigateToAPage {
diff --git a/ios/chrome/browser/ui/recent_tabs/BUILD.gn b/ios/chrome/browser/ui/recent_tabs/BUILD.gn index c980782..d932eff 100644 --- a/ios/chrome/browser/ui/recent_tabs/BUILD.gn +++ b/ios/chrome/browser/ui/recent_tabs/BUILD.gn
@@ -65,6 +65,7 @@ "//ios/chrome/browser/browser_state", "//ios/chrome/browser/metrics:metrics_internal", "//ios/chrome/browser/sessions", + "//ios/chrome/browser/sessions:serialisation", "//ios/chrome/browser/sync", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/authentication", @@ -77,6 +78,8 @@ "//ios/chrome/browser/ui/table_view:presentation", "//ios/chrome/browser/ui/util", "//ios/chrome/browser/url_loading", + "//ios/chrome/browser/web_state_list", + "//ios/chrome/browser/web_state_list", "//ios/chrome/common/favicon", "//ui/base", ]
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h index 7c502cc..b65bbea3 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h
@@ -12,6 +12,7 @@ namespace ios { class ChromeBrowserState; } +class WebStateList; @protocol ApplicationCommands; @protocol RecentTabsTableViewControllerDelegate; @@ -31,6 +32,8 @@ @property(nonatomic, assign) WindowOpenDisposition restoredTabDisposition; // RecentTabsTableViewControllerDelegate delegate. @property(nonatomic, weak) id<RecentTabsTableViewControllerDelegate> delegate; +// WebStateList for tabs restored by this object. +@property(nonatomic, assign) WebStateList* webStateList; // Delegate to present the tab UI. @property(nonatomic, weak) id<RecentTabsPresentationDelegate>
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm index 6bb3629..a0f9ad40 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -17,6 +17,7 @@ #include "components/unified_consent/feature.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/metrics/new_tab_page_uma.h" +#include "ios/chrome/browser/sessions/session_util.h" #include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios.h" #include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios_factory.h" #include "ios/chrome/browser/sync/session_sync_service_factory.h" @@ -46,12 +47,16 @@ #import "ios/chrome/browser/ui/url_loader.h" #import "ios/chrome/browser/ui/util/top_view_controller.h" #include "ios/chrome/browser/ui/util/ui_util.h" +#import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/url_loading/url_loading_util.h" +#include "ios/chrome/browser/web_state_list/web_state_list.h" +#include "ios/chrome/browser/web_state_list/web_state_opener.h" #import "ios/chrome/common/favicon/favicon_attributes.h" #import "ios/chrome/common/favicon/favicon_view.h" #include "ios/chrome/grit/ios_chromium_strings.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/web/public/web_state/context_menu_params.h" +#import "ios/web/public/web_state/web_state.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/time_format.h" @@ -218,6 +223,7 @@ historyItem.title = l10n_util::GetNSString(IDS_HISTORY_SHOWFULLHISTORY_LINK); historyItem.image = [UIImage imageNamed:@"show_history"]; historyItem.hideChevron = YES; + historyItem.textColor = UIColorFromRGB(kTableViewTextLabelColorBlue); historyItem.cellAccessibilityIdentifier = kRecentTabsShowFullHistoryCellAccessibilityIdentifier; [model addItem:historyItem @@ -860,7 +866,25 @@ "MobileRecentTabManagerTabFromOtherDeviceOpened")); new_tab_page_uma::RecordAction( self.browserState, new_tab_page_uma::ACTION_OPENED_FOREIGN_SESSION); - [self.loader loadSessionTab:toLoad]; + std::unique_ptr<web::WebState> web_state = + session_util::CreateWebStateWithNavigationEntries( + self.browserState, toLoad->current_navigation_index, + toLoad->navigations); + switch (self.restoredTabDisposition) { + case WindowOpenDisposition::CURRENT_TAB: + self.webStateList->ReplaceWebStateAt(self.webStateList->active_index(), + std::move(web_state)); + break; + case WindowOpenDisposition::NEW_FOREGROUND_TAB: + self.webStateList->InsertWebState( + self.webStateList->count(), std::move(web_state), + (WebStateList::INSERT_FORCE_INDEX | WebStateList::INSERT_ACTIVATE), + WebStateOpener()); + break; + default: + NOTREACHED(); + break; + } } [self.presentationDelegate showActiveRegularTabFromRecentTabs]; } @@ -905,7 +929,7 @@ sectionIsCollapsed:[self.tableViewModel sectionIdentifierForSection:section]]; DisclosureDirection direction = - collapsed ? DisclosureDirectionUp : DisclosureDirectionDown; + collapsed ? DisclosureDirectionTrailing : DisclosureDirectionDown; [disclosureHeaderView animateHighlightAndRotateToDirection:direction]; disclosureItem.collapsed = collapsed;
diff --git a/ios/chrome/browser/ui/settings/autofill_credit_card_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill_credit_card_table_view_controller.mm index 41d46ae..b12e6f3c 100644 --- a/ios/chrome/browser/ui/settings/autofill_credit_card_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill_credit_card_table_view_controller.mm
@@ -19,6 +19,7 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/ui/settings/autofill_credit_card_edit_table_view_controller.h" #import "ios/chrome/browser/ui/settings/cells/autofill_data_item.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #include "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.h"
diff --git a/ios/chrome/browser/ui/settings/autofill_profile_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill_profile_table_view_controller.mm index b53bcc94..e222bd28 100644 --- a/ios/chrome/browser/ui/settings/autofill_profile_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill_profile_table_view_controller.mm
@@ -17,6 +17,7 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/ui/settings/autofill_profile_edit_table_view_controller.h" #import "ios/chrome/browser/ui/settings/cells/autofill_data_item.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/settings/cells/settings_text_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
diff --git a/ios/chrome/browser/ui/settings/block_popups_table_view_controller.mm b/ios/chrome/browser/ui/settings/block_popups_table_view_controller.mm index 5df680fe..0e496a60 100644 --- a/ios/chrome/browser/ui/settings/block_popups_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/block_popups_table_view_controller.mm
@@ -14,6 +14,7 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h" #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" #import "ios/chrome/browser/ui/settings/utils/content_setting_backed_boolean.h"
diff --git a/ios/chrome/browser/ui/settings/cells/BUILD.gn b/ios/chrome/browser/ui/settings/cells/BUILD.gn index 28d12eb..2326f3f4 100644 --- a/ios/chrome/browser/ui/settings/cells/BUILD.gn +++ b/ios/chrome/browser/ui/settings/cells/BUILD.gn
@@ -34,6 +34,8 @@ "settings_image_detail_text_item.mm", "settings_search_item.h", "settings_search_item.mm", + "settings_switch_cell.h", + "settings_switch_cell.mm", "settings_switch_item.h", "settings_switch_item.mm", "settings_text_item.h",
diff --git a/ios/chrome/browser/ui/settings/cells/settings_switch_cell.h b/ios/chrome/browser/ui/settings/cells/settings_switch_cell.h new file mode 100644 index 0000000..edce90b --- /dev/null +++ b/ios/chrome/browser/ui/settings/cells/settings_switch_cell.h
@@ -0,0 +1,32 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_SWITCH_CELL_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_SWITCH_CELL_H_ + +#import <UIKit/UIKit.h> + +// SettingsSwitchCell implements a UITableViewCell subclass containing an icon, +// a text label, and a switch. +// If the preferred content size category is an accessibility category, the +// switch is displayed below the label. Otherwise, it is on the trailing side. +@interface SettingsSwitchCell : UITableViewCell + +// UILabel corresponding to |text| from the item. +@property(nonatomic, readonly, strong) UILabel* textLabel; + +// The switch view. +@property(nonatomic, readonly, strong) UISwitch* switchView; + +// Returns the default text color used for the given |state|. ++ (UIColor*)defaultTextColorForState:(UIControlState)state; + +// Sets the image that should be displayed at the leading edge of the cell. If +// set to nil, the icon will be hidden and the remaining content will expand to +// fill the full width of the cell. +- (void)setIconImage:(UIImage*)image; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_SWITCH_CELL_H_
diff --git a/ios/chrome/browser/ui/settings/cells/settings_switch_cell.mm b/ios/chrome/browser/ui/settings/cells/settings_switch_cell.mm new file mode 100644 index 0000000..5f40955 --- /dev/null +++ b/ios/chrome/browser/ui/settings/cells/settings_switch_cell.mm
@@ -0,0 +1,227 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" + +#import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h" +#include "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h" +#import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/common/ui_util/constraints_ui_util.h" +#include "ios/chrome/grit/ios_strings.h" +#include "ui/base/l10n/l10n_util_mac.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { +// Padding used between the icon and the text labels. +const CGFloat kIconTrailingPadding = 12; + +// Padding used on the top and bottom edges of the cell. +const CGFloat kVerticalPadding = 16; + +// Size of the icon image. +const CGFloat kIconImageSize = 28; +} // namespace + +@interface SettingsSwitchCell () + +// The image view for the leading icon. +@property(nonatomic, readonly, strong) UIImageView* iconImageView; + +// Constraints that are used when the iconImageView is visible and hidden. +@property(nonatomic, strong) NSLayoutConstraint* iconVisibleConstraint; +@property(nonatomic, strong) NSLayoutConstraint* iconHiddenConstraint; + +// Constraints that are used when the preferred content size is an +// "accessibility" category. +@property(nonatomic, strong) NSArray* accessibilityConstraints; +// Constraints that are used when the preferred content size is *not* an +// "accessibility" category. +@property(nonatomic, strong) NSArray* standardConstraints; + +@end + +@implementation SettingsSwitchCell + +@synthesize accessibilityConstraints = _accessibilityConstraints; +@synthesize standardConstraints = _standardConstraints; +@synthesize iconHiddenConstraint = _iconHiddenConstraint; +@synthesize iconVisibleConstraint = _iconVisibleConstraint; +@synthesize textLabel = _textLabel; + +- (instancetype)initWithStyle:(UITableViewCellStyle)style + reuseIdentifier:(NSString*)reuseIdentifier { + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; + if (self) { + self.isAccessibilityElement = YES; + + _iconImageView = [[UIImageView alloc] init]; + _iconImageView.translatesAutoresizingMaskIntoConstraints = NO; + _iconImageView.hidden = YES; + [self.contentView addSubview:_iconImageView]; + + _textLabel = [[UILabel alloc] init]; + _textLabel.translatesAutoresizingMaskIntoConstraints = NO; + _textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + _textLabel.adjustsFontForContentSizeCategory = YES; + _textLabel.textColor = [UIColor blackColor]; + _textLabel.numberOfLines = 0; + [self.contentView addSubview:_textLabel]; + + _switchView = [[UISwitch alloc] initWithFrame:CGRectZero]; + _switchView.translatesAutoresizingMaskIntoConstraints = NO; + _switchView.onTintColor = UIColorFromRGB(kTableViewSwitchTintColor); + [_switchView + setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh + 1 + forAxis: + UILayoutConstraintAxisHorizontal]; + _switchView.accessibilityHint = l10n_util::GetNSString( + IDS_IOS_TOGGLE_SETTING_SWITCH_ACCESSIBILITY_HINT); + [self.contentView addSubview:_switchView]; + + // Set up the constraints assuming that the icon image is hidden. + _iconVisibleConstraint = [_textLabel.leadingAnchor + constraintEqualToAnchor:_iconImageView.trailingAnchor + constant:kIconTrailingPadding]; + _iconHiddenConstraint = [_textLabel.leadingAnchor + constraintEqualToAnchor:self.contentView.leadingAnchor + constant:kTableViewHorizontalSpacing]; + + _standardConstraints = @[ + [_switchView.centerYAnchor + constraintEqualToAnchor:self.contentView.centerYAnchor], + [_textLabel.trailingAnchor + constraintLessThanOrEqualToAnchor:_switchView.leadingAnchor + constant:-kTableViewHorizontalSpacing], + ]; + _accessibilityConstraints = @[ + [_switchView.topAnchor constraintEqualToAnchor:_textLabel.bottomAnchor + constant:kVerticalPadding], + [_switchView.leadingAnchor + constraintEqualToAnchor:self.contentView.leadingAnchor + constant:kTableViewHorizontalSpacing], + [_switchView.bottomAnchor + constraintEqualToAnchor:self.contentView.bottomAnchor + constant:-kVerticalPadding], + [_textLabel.trailingAnchor + constraintLessThanOrEqualToAnchor:self.contentView.trailingAnchor + constant:-kTableViewHorizontalSpacing], + ]; + + [NSLayoutConstraint activateConstraints:@[ + [_iconImageView.leadingAnchor + constraintEqualToAnchor:self.contentView.leadingAnchor + constant:kTableViewHorizontalSpacing], + [_iconImageView.widthAnchor constraintEqualToConstant:kIconImageSize], + [_iconImageView.heightAnchor constraintEqualToConstant:kIconImageSize], + + [_switchView.trailingAnchor + constraintEqualToAnchor:self.contentView.trailingAnchor + constant:-kTableViewHorizontalSpacing], + + [_iconImageView.centerYAnchor + constraintEqualToAnchor:_textLabel.centerYAnchor], + + _iconHiddenConstraint, + ]]; + + if (UIContentSizeCategoryIsAccessibilityCategory( + self.traitCollection.preferredContentSizeCategory)) { + [NSLayoutConstraint activateConstraints:_accessibilityConstraints]; + } else { + [NSLayoutConstraint activateConstraints:_standardConstraints]; + } + + AddOptionalVerticalPadding(self.contentView, _textLabel, kVerticalPadding); + } + return self; +} + ++ (UIColor*)defaultTextColorForState:(UIControlState)state { + return (state & UIControlStateDisabled) + ? UIColorFromRGB(kSettingsCellsDetailTextColor) + : [UIColor blackColor]; +} + +- (void)setIconImage:(UIImage*)image { + BOOL hidden = (image == nil); + if (hidden == self.iconImageView.hidden) { + return; + } + + self.iconImageView.image = image; + self.iconImageView.hidden = hidden; + if (hidden) { + self.iconVisibleConstraint.active = NO; + self.iconHiddenConstraint.active = YES; + } else { + self.iconHiddenConstraint.active = NO; + self.iconVisibleConstraint.active = YES; + } +} + +#pragma mark - UIView + +- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { + [super traitCollectionDidChange:previousTraitCollection]; + BOOL isCurrentContentSizeAccessibility = + UIContentSizeCategoryIsAccessibilityCategory( + self.traitCollection.preferredContentSizeCategory); + if (UIContentSizeCategoryIsAccessibilityCategory( + previousTraitCollection.preferredContentSizeCategory) != + isCurrentContentSizeAccessibility) { + if (isCurrentContentSizeAccessibility) { + [NSLayoutConstraint deactivateConstraints:_standardConstraints]; + [NSLayoutConstraint activateConstraints:_accessibilityConstraints]; + } else { + [NSLayoutConstraint deactivateConstraints:_accessibilityConstraints]; + [NSLayoutConstraint activateConstraints:_standardConstraints]; + } + } +} + +#pragma mark - UITableViewCell + +- (void)prepareForReuse { + [super prepareForReuse]; + + [self setIconImage:nil]; + [_switchView removeTarget:nil + action:nil + forControlEvents:[_switchView allControlEvents]]; +} + +#pragma mark - UIAccessibility + +- (CGPoint)accessibilityActivationPoint { + // Center the activation point over the switch, so that double-tapping toggles + // the switch. + CGRect switchFrame = + UIAccessibilityConvertFrameToScreenCoordinates(_switchView.frame, self); + return CGPointMake(CGRectGetMidX(switchFrame), CGRectGetMidY(switchFrame)); +} + +- (NSString*)accessibilityHint { + if (_switchView.enabled) { + return _switchView.accessibilityHint; + } else { + return @""; + } +} + +- (NSString*)accessibilityLabel { + return _textLabel.text; +} + +- (NSString*)accessibilityValue { + if (_switchView.on) { + return l10n_util::GetNSString(IDS_IOS_SETTING_ON); + } else { + return l10n_util::GetNSString(IDS_IOS_SETTING_OFF); + } +} + +@end
diff --git a/ios/chrome/browser/ui/settings/cells/settings_switch_item.h b/ios/chrome/browser/ui/settings/cells/settings_switch_item.h index 0477663..e5a2f17 100644 --- a/ios/chrome/browser/ui/settings/cells/settings_switch_item.h +++ b/ios/chrome/browser/ui/settings/cells/settings_switch_item.h
@@ -26,26 +26,4 @@ @end -// SettingsSwitchCell implements a UITableViewCell subclass containing an icon, -// a text label, and a switch. -// If the preferred content size category is an accessibility category, the -// switch is displayed below the label. Otherwise, it is on the trailing side. -@interface SettingsSwitchCell : UITableViewCell - -// UILabel corresponding to |text| from the item. -@property(nonatomic, readonly, strong) UILabel* textLabel; - -// The switch view. -@property(nonatomic, readonly, strong) UISwitch* switchView; - -// Returns the default text color used for the given |state|. -+ (UIColor*)defaultTextColorForState:(UIControlState)state; - -// Sets the image that should be displayed at the leading edge of the cell. If -// set to nil, the icon will be hidden and the remaining content will expand to -// fill the full width of the cell. -- (void)setIconImage:(UIImage*)image; - -@end - #endif // IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_SWITCH_ITEM_H_
diff --git a/ios/chrome/browser/ui/settings/cells/settings_switch_item.mm b/ios/chrome/browser/ui/settings/cells/settings_switch_item.mm index 0e4a053..18f220f0 100644 --- a/ios/chrome/browser/ui/settings/cells/settings_switch_item.mm +++ b/ios/chrome/browser/ui/settings/cells/settings_switch_item.mm
@@ -4,28 +4,12 @@ #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" -#import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h" -#include "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h" -#import "ios/chrome/browser/ui/util/uikit_ui_util.h" -#import "ios/chrome/common/ui_util/constraints_ui_util.h" -#include "ios/chrome/grit/ios_strings.h" -#include "ui/base/l10n/l10n_util_mac.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -namespace { -// Padding used between the icon and the text labels. -const CGFloat kIconTrailingPadding = 12; - -// Padding used on the top and bottom edges of the cell. -const CGFloat kVerticalPadding = 16; - -// Size of the icon image. -const CGFloat kIconImageSize = 28; -} // namespace - @implementation SettingsSwitchItem - (instancetype)initWithType:(NSInteger)type { @@ -58,205 +42,3 @@ } @end - -#pragma mark - SettingsSwitchCell - -@interface SettingsSwitchCell () - -// The image view for the leading icon. -@property(nonatomic, readonly, strong) UIImageView* iconImageView; - -// Constraints that are used when the iconImageView is visible and hidden. -@property(nonatomic, strong) NSLayoutConstraint* iconVisibleConstraint; -@property(nonatomic, strong) NSLayoutConstraint* iconHiddenConstraint; - -// Constraints that are used when the preferred content size is an -// "accessibility" category. -@property(nonatomic, strong) NSArray* accessibilityConstraints; -// Constraints that are used when the preferred content size is *not* an -// "accessibility" category. -@property(nonatomic, strong) NSArray* standardConstraints; - -@end - -@implementation SettingsSwitchCell - -@synthesize accessibilityConstraints = _accessibilityConstraints; -@synthesize standardConstraints = _standardConstraints; -@synthesize iconHiddenConstraint = _iconHiddenConstraint; -@synthesize iconVisibleConstraint = _iconVisibleConstraint; -@synthesize textLabel = _textLabel; - -- (instancetype)initWithStyle:(UITableViewCellStyle)style - reuseIdentifier:(NSString*)reuseIdentifier { - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - self.isAccessibilityElement = YES; - - _iconImageView = [[UIImageView alloc] init]; - _iconImageView.translatesAutoresizingMaskIntoConstraints = NO; - _iconImageView.hidden = YES; - [self.contentView addSubview:_iconImageView]; - - _textLabel = [[UILabel alloc] init]; - _textLabel.translatesAutoresizingMaskIntoConstraints = NO; - _textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; - _textLabel.adjustsFontForContentSizeCategory = YES; - _textLabel.textColor = [UIColor blackColor]; - _textLabel.numberOfLines = 0; - [self.contentView addSubview:_textLabel]; - - _switchView = [[UISwitch alloc] initWithFrame:CGRectZero]; - _switchView.translatesAutoresizingMaskIntoConstraints = NO; - _switchView.onTintColor = UIColorFromRGB(kTableViewSwitchTintColor); - [_switchView - setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh + 1 - forAxis: - UILayoutConstraintAxisHorizontal]; - _switchView.accessibilityHint = l10n_util::GetNSString( - IDS_IOS_TOGGLE_SETTING_SWITCH_ACCESSIBILITY_HINT); - [self.contentView addSubview:_switchView]; - - // Set up the constraints assuming that the icon image is hidden. - _iconVisibleConstraint = [_textLabel.leadingAnchor - constraintEqualToAnchor:_iconImageView.trailingAnchor - constant:kIconTrailingPadding]; - _iconHiddenConstraint = [_textLabel.leadingAnchor - constraintEqualToAnchor:self.contentView.leadingAnchor - constant:kTableViewHorizontalSpacing]; - - _standardConstraints = @[ - [_switchView.centerYAnchor - constraintEqualToAnchor:self.contentView.centerYAnchor], - [_textLabel.trailingAnchor - constraintLessThanOrEqualToAnchor:_switchView.leadingAnchor - constant:-kTableViewHorizontalSpacing], - ]; - _accessibilityConstraints = @[ - [_switchView.topAnchor constraintEqualToAnchor:_textLabel.bottomAnchor - constant:kVerticalPadding], - [_switchView.leadingAnchor - constraintEqualToAnchor:self.contentView.leadingAnchor - constant:kTableViewHorizontalSpacing], - [_switchView.bottomAnchor - constraintEqualToAnchor:self.contentView.bottomAnchor - constant:-kVerticalPadding], - [_textLabel.trailingAnchor - constraintLessThanOrEqualToAnchor:self.contentView.trailingAnchor - constant:-kTableViewHorizontalSpacing], - ]; - - [NSLayoutConstraint activateConstraints:@[ - [_iconImageView.leadingAnchor - constraintEqualToAnchor:self.contentView.leadingAnchor - constant:kTableViewHorizontalSpacing], - [_iconImageView.widthAnchor constraintEqualToConstant:kIconImageSize], - [_iconImageView.heightAnchor constraintEqualToConstant:kIconImageSize], - - [_switchView.trailingAnchor - constraintEqualToAnchor:self.contentView.trailingAnchor - constant:-kTableViewHorizontalSpacing], - - [_iconImageView.centerYAnchor - constraintEqualToAnchor:_textLabel.centerYAnchor], - - _iconHiddenConstraint, - ]]; - - if (UIContentSizeCategoryIsAccessibilityCategory( - self.traitCollection.preferredContentSizeCategory)) { - [NSLayoutConstraint activateConstraints:_accessibilityConstraints]; - } else { - [NSLayoutConstraint activateConstraints:_standardConstraints]; - } - - AddOptionalVerticalPadding(self.contentView, _textLabel, kVerticalPadding); - } - return self; -} - -+ (UIColor*)defaultTextColorForState:(UIControlState)state { - return (state & UIControlStateDisabled) - ? UIColorFromRGB(kSettingsCellsDetailTextColor) - : [UIColor blackColor]; -} - -- (void)setIconImage:(UIImage*)image { - BOOL hidden = (image == nil); - if (hidden == self.iconImageView.hidden) { - return; - } - - self.iconImageView.image = image; - self.iconImageView.hidden = hidden; - if (hidden) { - self.iconVisibleConstraint.active = NO; - self.iconHiddenConstraint.active = YES; - } else { - self.iconHiddenConstraint.active = NO; - self.iconVisibleConstraint.active = YES; - } -} - -#pragma mark - UIView - -- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { - [super traitCollectionDidChange:previousTraitCollection]; - BOOL isCurrentContentSizeAccessibility = - UIContentSizeCategoryIsAccessibilityCategory( - self.traitCollection.preferredContentSizeCategory); - if (UIContentSizeCategoryIsAccessibilityCategory( - previousTraitCollection.preferredContentSizeCategory) != - isCurrentContentSizeAccessibility) { - if (isCurrentContentSizeAccessibility) { - [NSLayoutConstraint deactivateConstraints:_standardConstraints]; - [NSLayoutConstraint activateConstraints:_accessibilityConstraints]; - } else { - [NSLayoutConstraint deactivateConstraints:_accessibilityConstraints]; - [NSLayoutConstraint activateConstraints:_standardConstraints]; - } - } -} - -#pragma mark - UITableViewCell - -- (void)prepareForReuse { - [super prepareForReuse]; - - [self setIconImage:nil]; - [_switchView removeTarget:nil - action:nil - forControlEvents:[_switchView allControlEvents]]; -} - -#pragma mark - UIAccessibility - -- (CGPoint)accessibilityActivationPoint { - // Center the activation point over the switch, so that double-tapping toggles - // the switch. - CGRect switchFrame = - UIAccessibilityConvertFrameToScreenCoordinates(_switchView.frame, self); - return CGPointMake(CGRectGetMidX(switchFrame), CGRectGetMidY(switchFrame)); -} - -- (NSString*)accessibilityHint { - if (_switchView.enabled) { - return _switchView.accessibilityHint; - } else { - return @""; - } -} - -- (NSString*)accessibilityLabel { - return _textLabel.text; -} - -- (NSString*)accessibilityValue { - if (_switchView.on) { - return l10n_util::GetNSString(IDS_IOS_SETTING_ON); - } else { - return l10n_util::GetNSString(IDS_IOS_SETTING_OFF); - } -} - -@end
diff --git a/ios/chrome/browser/ui/settings/handoff_table_view_controller.mm b/ios/chrome/browser/ui/settings/handoff_table_view_controller.mm index 363d3de..c9abff1 100644 --- a/ios/chrome/browser/ui/settings/handoff_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/handoff_table_view_controller.mm
@@ -8,6 +8,7 @@ #include "components/handoff/pref_names_ios.h" #include "components/prefs/pref_member.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.h" #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/settings/passwords_table_view_controller.mm b/ios/chrome/browser/ui/settings/passwords_table_view_controller.mm index cf0978ad..8e8974df 100644 --- a/ios/chrome/browser/ui/settings/passwords_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/passwords_table_view_controller.mm
@@ -32,6 +32,7 @@ #import "ios/chrome/browser/passwords/save_passwords_consumer.h" #import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h" #import "ios/chrome/browser/ui/settings/cells/settings_search_item.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/settings/password_details_table_view_controller.h" #import "ios/chrome/browser/ui/settings/password_details_table_view_controller_delegate.h"
diff --git a/ios/chrome/browser/ui/settings/privacy_table_view_controller.mm b/ios/chrome/browser/ui/settings/privacy_table_view_controller.mm index f71b5fd..b60c244 100644 --- a/ios/chrome/browser/ui/settings/privacy_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy_table_view_controller.mm
@@ -25,6 +25,7 @@ #import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h" #import "ios/chrome/browser/ui/settings/cells/settings_detail_item.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/dataplan_usage_table_view_controller.h"
diff --git a/ios/chrome/browser/ui/settings/translate_table_view_controller.mm b/ios/chrome/browser/ui/settings/translate_table_view_controller.mm index 13b1535..af04f82 100644 --- a/ios/chrome/browser/ui/settings/translate_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/translate_table_view_controller.mm
@@ -16,6 +16,7 @@ #include "ios/chrome/browser/application_context.h" #import "ios/chrome/browser/translate/chrome_ios_translate_client.h" #import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/settings/settings_utils.h" #import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h"
diff --git a/ios/chrome/browser/ui/settings/voice_search_table_view_controller.mm b/ios/chrome/browser/ui/settings/voice_search_table_view_controller.mm index 3ee191c..cad4a73 100644 --- a/ios/chrome/browser/ui/settings/voice_search_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/voice_search_table_view_controller.mm
@@ -9,6 +9,7 @@ #include "base/strings/sys_string_conversions.h" #include "components/prefs/pref_member.h" #include "components/prefs/pref_service.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.h" #include "ios/chrome/browser/voice/speech_input_locale_config.h"
diff --git a/ios/chrome/browser/ui/settings/voice_search_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/voice_search_table_view_controller_unittest.mm index e238085b..41771d7 100644 --- a/ios/chrome/browser/ui/settings/voice_search_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/voice_search_table_view_controller_unittest.mm
@@ -14,6 +14,7 @@ #include "components/prefs/pref_member.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h" #include "ios/chrome/browser/voice/speech_input_locale_config_impl.h"
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm index 4114126c..aaf1522 100644 --- a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm +++ b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm
@@ -27,6 +27,7 @@ #import "ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_interacting.h" #include "ios/chrome/browser/ui/util/ui_util.h" #import "ios/chrome/browser/web/page_placeholder_tab_helper.h" +#import "ios/chrome/browser/web/web_navigation_util.h" #import "ios/web/public/navigation_item.h" #import "ios/web/public/web_client.h" #import "ios/web/public/web_state/web_state_observer_bridge.h" @@ -459,12 +460,13 @@ onOverThresholdCompletion:^{ BOOL wantsBack = IsSwipingBack(gesture.direction); web::WebState* webState = [weakCurrentTab webState]; - if (wantsBack) { - [[model_ currentTab] goBack]; - } else { - [[model_ currentTab] goForward]; + if (webState) { + if (wantsBack) { + web_navigation_util::GoBack(webState); + } else { + web_navigation_util::GoForward(webState); + } } - // Checking -IsLoading() is likely incorrect, but to narrow the scope of // fixes for slim navigation manager, only ignore this state when // slim is disabled. With slim navigation enabled, this false when
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm index 2d4ff0ba..0772732 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -210,6 +210,8 @@ baseViewController.remoteTabsViewController.loader = self.URLLoader; baseViewController.remoteTabsViewController.restoredTabDisposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; + baseViewController.remoteTabsViewController.webStateList = + self.regularTabModel.webStateList; baseViewController.remoteTabsViewController.presentationDelegate = self; // Insert the launch screen view in front of this view to hide it until after
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_url_loader.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_url_loader.mm index 8f0891b..2da1988 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_url_loader.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_url_loader.mm
@@ -54,18 +54,6 @@ #pragma mark - UrlLoader -// Loading a |sessionTab| normally means navigating on the currently visible tab -// view. This is not the case while in the tab grid. A new WebState is appended -// and activated instead of replacing the current active WebState. -- (void)loadSessionTab:(const sessions::SessionTab*)sessionTab { - DCHECK(self.regularBrowserState); - std::unique_ptr<web::WebState> webState = - session_util::CreateWebStateWithNavigationEntries( - self.regularBrowserState, sessionTab->current_navigation_index, - sessionTab->navigations); - AppendAndActivateWebState(self.regularWebStateList, std::move(webState)); -} - // In tab grid, |inBackground| is ignored, which means that the new WebState is // activated. |appendTo| is also ignored, so the new WebState is always appended // at the end of the list. The page transition type is explicit rather than
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.h b/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.h index df303d5f..7a104eb 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.h +++ b/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.h
@@ -22,13 +22,13 @@ // UIColor for the cell's textLabel. Default is // kTableViewTextLabelColorLightGrey. ChromeTableViewStyler's |cellTitleColor| // takes precedence over the default color, but not over |textColor|. -@property(nonatomic, assign) UIColor* textColor; +@property(nonatomic, strong) UIColor* textColor; // Main text to be displayed. @property(nonatomic, strong) NSString* text; // UIColor for the cell's detailTextLabel. Default is // kTableViewSecondaryLabelLightGrayTextColor. -@property(nonatomic, assign) UIColor* detailTextColor; +@property(nonatomic, strong) UIColor* detailTextColor; // Detail text to be displayed. @property(nonatomic, strong) NSString* detailText;
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.h b/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.h index d6d43d6..125c02d 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.h +++ b/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.h
@@ -25,7 +25,7 @@ @interface TableViewDisclosureHeaderFooterView : UITableViewHeaderFooterView // Indicates in what direction the disclosure accessory should point. typedef NS_ENUM(NSInteger, DisclosureDirection) { - DisclosureDirectionUp = 2, + DisclosureDirectionTrailing = 2, DisclosureDirectionDown, }; // Shows the text of the TableViewDisclosureHeaderFooterItem.
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.mm index 26a6699..182b40b 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.mm +++ b/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.mm
@@ -8,6 +8,7 @@ #include "base/numerics/math_constants.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" +#import "ios/chrome/browser/ui/util/rtl_geometry.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util_mac.h" @@ -19,8 +20,6 @@ namespace { // Identity rotation angle that positions disclosure pointing down. constexpr float kRotationNinetyCW = (90 / 180.0) * M_PI; -// Identity rotation angle that positions disclosure pointing up. -constexpr float kRotationNinetyCCW = -(90 / 180.0) * M_PI; } @implementation TableViewDisclosureHeaderFooterItem @@ -47,7 +46,7 @@ header.isAccessibilityElement = YES; header.accessibilityTraits |= UIAccessibilityTraitButton; DisclosureDirection direction = - self.collapsed ? DisclosureDirectionUp : DisclosureDirectionDown; + self.collapsed ? DisclosureDirectionTrailing : DisclosureDirectionDown; [header setInitialDirection:direction]; if (styler.headerFooterTitleColor) header.titleLabel.textColor = styler.headerFooterTitleColor; @@ -215,10 +214,17 @@ // needed. - (void)rotateToDirection:(DisclosureDirection)direction animate:(BOOL)animate { DisclosureDirection originalDirection = self.disclosureDirection; + + // Default trailing rotation is 0 (no rotation), rotate 180 degrees if RTL. + float trailingRotation = 0; + if (base::i18n::IsRTL()) { + trailingRotation = (-180 / 180.0) * M_PI; + } + if (originalDirection != direction) { self.disclosureDirection = direction; CGFloat angle = direction == DisclosureDirectionDown ? kRotationNinetyCW - : kRotationNinetyCCW; + : trailingRotation; // Update the accessibility hint to match the new direction. self.accessibilityHint =
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_image_item.h b/ios/chrome/browser/ui/table_view/cells/table_view_image_item.h index 989b577..ec46d5a3d 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_image_item.h +++ b/ios/chrome/browser/ui/table_view/cells/table_view_image_item.h
@@ -20,6 +20,9 @@ @property(nonatomic, readwrite, copy) NSString* cellAccessibilityIdentifier; // If YES the cell's chevron will be hidden. @property(nonatomic, readwrite, assign) BOOL hideChevron; +// UIColor for the cell's textLabel. ChromeTableViewStyler's |cellTitleColor| +// takes precedence over the default color, but not over |textColor|. +@property(nonatomic, strong) UIColor* textColor; @end
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_image_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_image_item.mm index 9c862ec..a3c637d 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_image_item.mm +++ b/ios/chrome/browser/ui/table_view/cells/table_view_image_item.mm
@@ -46,8 +46,11 @@ cell.chevronImageView.hidden = self.hideChevron; cell.imageView.backgroundColor = styler.tableViewBackgroundColor; cell.titleLabel.backgroundColor = styler.tableViewBackgroundColor; - if (styler.cellTitleColor) + if (self.textColor) { + cell.titleLabel.textColor = self.textColor; + } else if (styler.cellTitleColor) { cell.titleLabel.textColor = styler.cellTitleColor; + } } @end
diff --git a/ios/chrome/browser/ui/url_loader.h b/ios/chrome/browser/ui/url_loader.h index 3d9310e..cbba6bd 100644 --- a/ios/chrome/browser/ui/url_loader.h +++ b/ios/chrome/browser/ui/url_loader.h
@@ -30,9 +30,6 @@ // of loading a URL. - (void)webPageOrderedOpen:(OpenNewTabCommand*)command; -// Load a tab with the given session. -- (void)loadSessionTab:(const sessions::SessionTab*)sessionTab; - @end #endif // IOS_CHROME_BROWSER_UI_URL_LOADER_H_
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn index beed9565..60108e74 100644 --- a/ios/chrome/browser/web/BUILD.gn +++ b/ios/chrome/browser/web/BUILD.gn
@@ -25,6 +25,8 @@ "repost_form_tab_helper.mm", "sad_tab_tab_helper.h", "sad_tab_tab_helper.mm", + "web_navigation_util.h", + "web_navigation_util.mm", ] deps = [ ":feature_flags", @@ -33,6 +35,7 @@ "//components/error_page/common", "//components/image_fetcher/ios", "//components/resources:components_resources_grit", + "//components/search_engines", "//components/strings", "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser", @@ -88,6 +91,7 @@ "sad_tab_tab_helper_unittest.mm", "services_unittest.mm", "tab_id_tab_helper_unittest.mm", + "web_navigation_util_unittest.mm", ] deps = [ ":accessibility", @@ -98,6 +102,7 @@ ":web_internal", "//base:base", "//base/test:test_support", + "//components/search_engines", "//components/services/unzip/public/interfaces", "//components/strings:components_strings_grit", "//ios/chrome/browser/browser_state:test_support",
diff --git a/ios/chrome/browser/web/web_navigation_util.h b/ios/chrome/browser/web/web_navigation_util.h new file mode 100644 index 0000000..09755c2b --- /dev/null +++ b/ios/chrome/browser/web/web_navigation_util.h
@@ -0,0 +1,40 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_WEB_WEB_NAVIGATION_UTIL_H_ +#define IOS_CHROME_BROWSER_WEB_WEB_NAVIGATION_UTIL_H_ + +#include "components/search_engines/template_url.h" +#import "ios/web/public/navigation_manager.h" +#include "ui/base/page_transition_types.h" + +namespace web { +class WebState; +} + +class GURL; + +namespace web_navigation_util { + +// Creates a WebLoadParams object for loading |url| with |transition_type|. If +// |post_data| is nonnull, the data and content-type of the post data will be +// added to the return value as well. +web::NavigationManager::WebLoadParams CreateWebLoadParams( + const GURL& url, + ui::PageTransition transition_type, + TemplateURLRef::PostContent* post_data); + +// Navigates to the previous item on the navigation stack for |web_state|. +// |web_state| can't be null. This method is for user initiated navigations as +// it logs "Back" user action. +void GoBack(web::WebState* web_state); + +// Navigates to the next item on the navigation stack for |web_state|. +// |web_state| can't be null. This method is for user initiated navigations as +// it logs "Forward" user action. +void GoForward(web::WebState* web_state); + +} // namespace web_navigation_util + +#endif // IOS_CHROME_BROWSER_WEB_WEB_NAVIGATION_UTIL_H_
diff --git a/ios/chrome/browser/tabs/tab_util.mm b/ios/chrome/browser/web/web_navigation_util.mm similarity index 62% rename from ios/chrome/browser/tabs/tab_util.mm rename to ios/chrome/browser/web/web_navigation_util.mm index 129bff9..a20a4d5 100644 --- a/ios/chrome/browser/tabs/tab_util.mm +++ b/ios/chrome/browser/web/web_navigation_util.mm
@@ -2,17 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/tabs/tab_util.h" +#import "ios/chrome/browser/web/web_navigation_util.h" #import <Foundation/Foundation.h> +#include "base/metrics/user_metrics.h" +#include "base/metrics/user_metrics_action.h" #include "base/strings/sys_string_conversions.h" +#import "ios/web/public/navigation_manager.h" +#import "ios/web/public/web_state/web_state.h" #include "url/gurl.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif +namespace web_navigation_util { + web::NavigationManager::WebLoadParams CreateWebLoadParams( const GURL& URL, ui::PageTransition transition_type, @@ -30,3 +36,17 @@ } return params; } + +void GoBack(web::WebState* web_state) { + DCHECK(web_state); + base::RecordAction(base::UserMetricsAction("Back")); + web_state->GetNavigationManager()->GoBack(); +} + +void GoForward(web::WebState* web_state) { + DCHECK(web_state); + base::RecordAction(base::UserMetricsAction("Forward")); + web_state->GetNavigationManager()->GoForward(); +} + +} // namespace web_navigation_util
diff --git a/ios/chrome/browser/web/web_navigation_util_unittest.mm b/ios/chrome/browser/web/web_navigation_util_unittest.mm new file mode 100644 index 0000000..41102a3 --- /dev/null +++ b/ios/chrome/browser/web/web_navigation_util_unittest.mm
@@ -0,0 +1,95 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/web/web_navigation_util.h" + +#include "base/test/metrics/user_action_tester.h" +#include "components/search_engines/template_url.h" +#import "ios/web/public/navigation_manager.h" +#import "ios/web/public/test/fakes/test_navigation_manager.h" +#import "ios/web/public/test/fakes/test_web_state.h" +#include "testing/gtest/include/gtest/gtest.h" +#import "testing/gtest_mac.h" +#include "testing/platform_test.h" +#include "ui/base/page_transition_types.h" +#include "url/gurl.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +class WebNavigationUtilsTest : public PlatformTest { + protected: + WebNavigationUtilsTest() { + auto navigation_manager = std::make_unique<web::TestNavigationManager>(); + navigation_manager_ = navigation_manager.get(); + web_state_.SetNavigationManager(std::move(navigation_manager)); + } + + web::TestWebState web_state_; + web::TestNavigationManager* navigation_manager_ = nullptr; + base::UserActionTester user_action_tester_; +}; + +TEST_F(WebNavigationUtilsTest, CreateWebLoadParamsWithoutPost) { + // No post params, check URL and transition. + GURL url("http://test.test/"); + auto params = web_navigation_util::CreateWebLoadParams( + url, ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK, + /*post_data=*/nullptr); + EXPECT_EQ(url, params.url); + EXPECT_TRUE(PageTransitionCoreTypeIs( + params.transition_type, + ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK)); + // There should be no post data, and no extra headers. + EXPECT_FALSE(params.post_data); + EXPECT_FALSE(params.extra_headers); +} + +TEST_F(WebNavigationUtilsTest, CreateWebLoadParamsWithPost) { + // With post params. + GURL url("http://test.test/"); + std::string post_data = "sphinx of black quartz judge my vow"; + TemplateURLRef::PostContent post_content("text/plain", post_data); + auto params = web_navigation_util::CreateWebLoadParams( + url, ui::PageTransition::PAGE_TRANSITION_FORM_SUBMIT, + /*post_data=*/&post_content); + EXPECT_EQ(url, params.url); + EXPECT_TRUE(PageTransitionCoreTypeIs( + params.transition_type, ui::PageTransition::PAGE_TRANSITION_FORM_SUBMIT)); + // Post data should be the same length as post_data + EXPECT_EQ(post_data.length(), params.post_data.length); + EXPECT_NSEQ(@"text/plain", params.extra_headers[@"Content-Type"]); +} + +// Tests that GoBack updates the last committed item and log user action. +TEST_F(WebNavigationUtilsTest, GoBack) { + GURL url1("http:/test1.test/"); + navigation_manager_->AddItem(url1, ui::PageTransition::PAGE_TRANSITION_LINK); + GURL url2("http:/test2.test/"); + navigation_manager_->AddItem(url2, ui::PageTransition::PAGE_TRANSITION_LINK); + GURL url3("http:/test3.test/"); + navigation_manager_->AddItem(url3, ui::PageTransition::PAGE_TRANSITION_LINK); + EXPECT_EQ(2, navigation_manager_->GetLastCommittedItemIndex()); + EXPECT_EQ(0, user_action_tester_.GetActionCount("Back")); + web_navigation_util::GoBack(&web_state_); + EXPECT_EQ(1, navigation_manager_->GetLastCommittedItemIndex()); + EXPECT_EQ(1, user_action_tester_.GetActionCount("Back")); +} + +// Tests that GoForward updates the last committed item and log user action. +TEST_F(WebNavigationUtilsTest, GoForward) { + GURL url1("http:/test1.test/"); + navigation_manager_->AddItem(url1, ui::PageTransition::PAGE_TRANSITION_LINK); + GURL url2("http:/test2.test/"); + navigation_manager_->AddItem(url2, ui::PageTransition::PAGE_TRANSITION_LINK); + GURL url3("http:/test3.test/"); + navigation_manager_->AddItem(url3, ui::PageTransition::PAGE_TRANSITION_LINK); + navigation_manager_->SetLastCommittedItemIndex(1); + EXPECT_EQ(1, navigation_manager_->GetLastCommittedItemIndex()); + EXPECT_EQ(0, user_action_tester_.GetActionCount("Forward")); + web_navigation_util::GoForward(&web_state_); + EXPECT_EQ(2, navigation_manager_->GetLastCommittedItemIndex()); + EXPECT_EQ(1, user_action_tester_.GetActionCount("Forward")); +}
diff --git a/ios/chrome/common/ui_util/constraints_ui_util.h b/ios/chrome/common/ui_util/constraints_ui_util.h index 9069c88..d5501fc0 100644 --- a/ios/chrome/common/ui_util/constraints_ui_util.h +++ b/ios/chrome/common/ui_util/constraints_ui_util.h
@@ -119,8 +119,8 @@ id<LayoutGuideProvider> view2); // Deprecated version: void AddSameCenterXConstraint(UIView* unused_parentView, - UIView* subview1, - UIView* subview2); + id<LayoutGuideProvider> subview1, + id<LayoutGuideProvider> subview2); // Adds a constraint that |view1| and |view2| are center-aligned vertically. // |view1| and |view2| must be in the same view hierarchy. @@ -128,8 +128,8 @@ id<LayoutGuideProvider> view2); // Deprecated version: void AddSameCenterYConstraint(UIView* unused_parentView, - UIView* subview1, - UIView* subview2); + id<LayoutGuideProvider> subview1, + id<LayoutGuideProvider> subview2); // Adds constraints to make two views' size and center equal by pinning leading, // trailing, top and bottom anchors. @@ -166,12 +166,12 @@ // the padding is optional so that the inner views are not artificially // shortened when fixed-size cells cut into that padding. The padding is added // between |outerView| and |innerView|. -void AddOptionalVerticalPadding(UIView* outerView, - UIView* innerView, +void AddOptionalVerticalPadding(id<LayoutGuideProvider> outerView, + id<LayoutGuideProvider> innerView, CGFloat padding); -void AddOptionalVerticalPadding(UIView* outerView, - UIView* topInnerView, - UIView* bottomInnerView, +void AddOptionalVerticalPadding(id<LayoutGuideProvider> outerView, + id<LayoutGuideProvider> topInnerView, + id<LayoutGuideProvider> bottomInnerView, CGFloat padding); #pragma mark - Safe Area.
diff --git a/ios/chrome/common/ui_util/constraints_ui_util.mm b/ios/chrome/common/ui_util/constraints_ui_util.mm index fc110529..93059a4f 100644 --- a/ios/chrome/common/ui_util/constraints_ui_util.mm +++ b/ios/chrome/common/ui_util/constraints_ui_util.mm
@@ -73,8 +73,8 @@ } void AddSameCenterXConstraint(UIView* unused_parentView, - UIView* subview1, - UIView* subview2) { + id<LayoutGuideProvider> subview1, + id<LayoutGuideProvider> subview2) { AddSameCenterXConstraint(subview1, subview2); } @@ -85,8 +85,8 @@ } void AddSameCenterYConstraint(UIView* unused_parentView, - UIView* subview1, - UIView* subview2) { + id<LayoutGuideProvider> subview1, + id<LayoutGuideProvider> subview2) { AddSameCenterYConstraint(subview1, subview2); } @@ -140,15 +140,15 @@ [NSLayoutConstraint activateConstraints:constraints]; } -void AddOptionalVerticalPadding(UIView* outerView, - UIView* innerView, +void AddOptionalVerticalPadding(id<LayoutGuideProvider> outerView, + id<LayoutGuideProvider> innerView, CGFloat padding) { AddOptionalVerticalPadding(outerView, innerView, innerView, padding); } -void AddOptionalVerticalPadding(UIView* outerView, - UIView* topInnerView, - UIView* bottomInnerView, +void AddOptionalVerticalPadding(id<LayoutGuideProvider> outerView, + id<LayoutGuideProvider> topInnerView, + id<LayoutGuideProvider> bottomInnerView, CGFloat padding) { NSLayoutConstraint* topPaddingConstraint = [topInnerView.topAnchor constraintGreaterThanOrEqualToAnchor:outerView.topAnchor
diff --git a/ios/chrome/test/earl_grey/chrome_actions.mm b/ios/chrome/test/earl_grey/chrome_actions.mm index 3ca9734..c4f53a3 100644 --- a/ios/chrome/test/earl_grey/chrome_actions.mm +++ b/ios/chrome/test/earl_grey/chrome_actions.mm
@@ -8,6 +8,7 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.h" #import "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_switch_item.h" #import "ios/chrome/browser/ui/settings/cells/legacy/legacy_sync_switch_item.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/web/public/test/earl_grey/web_view_actions.h"
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm index 205ffb0..11a9649c3 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -26,6 +26,7 @@ #import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h" #import "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_switch_item.h" +#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data_ui_constants.h"
diff --git a/ios/chrome/test/fakes/fake_url_loader.mm b/ios/chrome/test/fakes/fake_url_loader.mm index b30beb1..f676948 100644 --- a/ios/chrome/test/fakes/fake_url_loader.mm +++ b/ios/chrome/test/fakes/fake_url_loader.mm
@@ -45,9 +45,6 @@ self.inIncognito = command.inIncognito; } -- (void)loadSessionTab:(const sessions::SessionTab*)sessionTab { -} - - (const GURL&)url { return _url; }
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn index b0dfe6f..93b73a97 100644 --- a/ios/third_party/material_components_ios/BUILD.gn +++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -224,6 +224,8 @@ "src/components/FlexibleHeader/src/MDCFlexibleHeaderViewController.h", "src/components/FlexibleHeader/src/MDCFlexibleHeaderViewController.m", "src/components/FlexibleHeader/src/MaterialFlexibleHeader.h", + "src/components/FlexibleHeader/src/private/MDCFlexibleHeaderMinMaxHeight.h", + "src/components/FlexibleHeader/src/private/MDCFlexibleHeaderMinMaxHeight.m", "src/components/FlexibleHeader/src/private/MDCFlexibleHeaderTopSafeArea.h", "src/components/FlexibleHeader/src/private/MDCFlexibleHeaderTopSafeArea.m", "src/components/FlexibleHeader/src/private/MDCStatusBarShifter.h",
diff --git a/ios/web/public/test/fakes/test_navigation_manager.mm b/ios/web/public/test/fakes/test_navigation_manager.mm index cecff9c..62f93ba 100644 --- a/ios/web/public/test/fakes/test_navigation_manager.mm +++ b/ios/web/public/test/fakes/test_navigation_manager.mm
@@ -119,11 +119,11 @@ } bool TestNavigationManager::CanGoBack() const { - return false; + return items_index_ > 0; } bool TestNavigationManager::CanGoForward() const { - return false; + return items_index_ < GetItemCount() - 1; } bool TestNavigationManager::CanGoToOffset(int offset) const { @@ -132,11 +132,11 @@ } void TestNavigationManager::GoBack() { - NOTREACHED(); + items_index_--; } void TestNavigationManager::GoForward() { - NOTREACHED(); + items_index_++; } void TestNavigationManager::GoToIndex(int index) {
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 e9c7cde8..88fbc23 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
@@ -104,7 +104,6 @@ const std::vector<FormStructure*>& forms) override; void DidFillOrPreviewField(const base::string16& autofilled_value, const base::string16& profile_full_name) override; - void DidInteractWithNonsecureCreditCardInput() override; bool IsContextSecure() override; bool ShouldShowSigninPromo() override; bool AreServerCardsSupported() 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 c9f342e..867df73 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
@@ -230,8 +230,6 @@ const base::string16& autofilled_value, const base::string16& profile_full_name) {} -void WebViewAutofillClientIOS::DidInteractWithNonsecureCreditCardInput() {} - bool WebViewAutofillClientIOS::IsContextSecure() { return IsContextSecureForWebState(web_state_); }
diff --git a/ios/web_view/internal/sync/web_view_profile_sync_service_factory.mm b/ios/web_view/internal/sync/web_view_profile_sync_service_factory.mm index aa3e8834..e5625561 100644 --- a/ios/web_view/internal/sync/web_view_profile_sync_service_factory.mm +++ b/ios/web_view/internal/sync/web_view_profile_sync_service_factory.mm
@@ -12,7 +12,6 @@ #include "components/invalidation/impl/profile_invalidation_provider.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/signin/core/browser/device_id_helper.h" -#include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/sync/base/model_type.h" #include "components/sync/device_info/local_device_info_provider_impl.h" #include "components/sync/driver/startup_controller.h" @@ -23,7 +22,6 @@ #include "ios/web_view/internal/autofill/web_view_personal_data_manager_factory.h" #include "ios/web_view/internal/passwords/web_view_password_store_factory.h" #include "ios/web_view/internal/signin/web_view_identity_manager_factory.h" -#include "ios/web_view/internal/signin/web_view_oauth2_token_service_factory.h" #import "ios/web_view/internal/sync/web_view_gcm_profile_service_factory.h" #import "ios/web_view/internal/sync/web_view_model_type_store_service_factory.h" #import "ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.h" @@ -64,7 +62,6 @@ // when it is shut down. Specify those dependencies here to build the proper // destruction order. DependsOn(WebViewIdentityManagerFactory::GetInstance()); - DependsOn(WebViewOAuth2TokenServiceFactory::GetInstance()); DependsOn(WebViewPersonalDataManagerFactory::GetInstance()); DependsOn(WebViewWebDataServiceWrapperFactory::GetInstance()); DependsOn(WebViewPasswordStoreFactory::GetInstance());
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc index 1dfbf111..bf12715 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -294,9 +294,12 @@ PLATFORM_FAILURE, ); } - TRACE_COUNTER_ID2("media,gpu", "Vaapi frames at client", this, "used", - pictures_.size() - available_picture_buffers_.size(), - "available", available_picture_buffers_.size()); + { + base::AutoLock auto_lock(lock_); + TRACE_COUNTER_ID2("media,gpu", "Vaapi frames at client", this, "used", + pictures_.size() - available_picture_buffers_.size(), + "available", available_picture_buffers_.size()); + } DVLOGF(4) << "Notifying output picture id " << output_id << " for input " << input_id @@ -317,8 +320,11 @@ if (!client_) return; - if (pending_output_cbs_.empty() || available_picture_buffers_.empty()) - return; + { + base::AutoLock auto_lock(lock_); + if (pending_output_cbs_.empty() || available_picture_buffers_.empty()) + return; + } auto output_cb = std::move(pending_output_cbs_.front()); pending_output_cbs_.pop(); @@ -535,6 +541,7 @@ if (!awaiting_va_surfaces_recycle_) return; + base::AutoLock auto_lock(lock_); if (!pending_output_cbs_.empty() || pictures_.size() != available_va_surfaces_.size()) { // Either: @@ -567,7 +574,7 @@ VLOGF(2) << "Requesting " << requested_num_pics_ << " pictures of size: " << requested_pic_size_.ToString(); - VideoPixelFormat format = GfxBufferFormatToVideoPixelFormat( + const VideoPixelFormat format = GfxBufferFormatToVideoPixelFormat( vaapi_picture_factory_->GetBufferFormat()); task_runner_->PostTask( FROM_HERE, @@ -702,27 +709,30 @@ return; } - if (!pictures_.count(picture_buffer_id)) { - CloseGpuMemoryBufferHandle(gpu_memory_buffer_handle); + { + base::AutoLock auto_lock(lock_); + if (!pictures_.count(picture_buffer_id)) { + CloseGpuMemoryBufferHandle(gpu_memory_buffer_handle); - // It's possible that we've already posted a DismissPictureBuffer for this - // picture, but it has not yet executed when this ImportBufferForPicture - // was posted to us by the client. In that case just ignore this (we've - // already dismissed it and accounted for that). - DVLOGF(3) << "got picture id=" << picture_buffer_id - << " not in use (anymore?)."; - return; - } + // It's possible that we've already posted a DismissPictureBuffer for this + // picture, but it has not yet executed when this ImportBufferForPicture + // was posted to us by the client. In that case just ignore this (we've + // already dismissed it and accounted for that). + DVLOGF(3) << "got picture id=" << picture_buffer_id + << " not in use (anymore?)."; + return; + } - VaapiPicture* picture = pictures_[picture_buffer_id].get(); - if (!picture->ImportGpuMemoryBufferHandle( - VideoPixelFormatToGfxBufferFormat(pixel_format), - gpu_memory_buffer_handle)) { - // ImportGpuMemoryBufferHandle will close the handles even on failure, so - // we don't need to do this ourselves. - VLOGF(1) << "Failed to import GpuMemoryBufferHandle"; - NotifyError(PLATFORM_FAILURE); - return; + VaapiPicture* picture = pictures_[picture_buffer_id].get(); + if (!picture->ImportGpuMemoryBufferHandle( + VideoPixelFormatToGfxBufferFormat(pixel_format), + gpu_memory_buffer_handle)) { + // ImportGpuMemoryBufferHandle will close the handles even on failure, so + // we don't need to do this ourselves. + VLOGF(1) << "Failed to import GpuMemoryBufferHandle"; + NotifyError(PLATFORM_FAILURE); + return; + } } ReusePictureBuffer(picture_buffer_id); @@ -736,24 +746,24 @@ TRACE_EVENT1("media,gpu", "VAVDA::ReusePictureBuffer", "Picture id", picture_buffer_id); - if (!pictures_.count(picture_buffer_id)) { - // It's possible that we've already posted a DismissPictureBuffer for this - // picture, but it has not yet executed when this ReusePictureBuffer - // was posted to us by the client. In that case just ignore this (we've - // already dismissed it and accounted for that). - DVLOGF(3) << "got picture id=" << picture_buffer_id - << " not in use (anymore?)."; - return; - } - { base::AutoLock auto_lock(lock_); - available_picture_buffers_.push_back(picture_buffer_id); - } - TRACE_COUNTER_ID2("media,gpu", "Vaapi frames at client", this, "used", - pictures_.size() - available_picture_buffers_.size(), - "available", available_picture_buffers_.size()); + if (!pictures_.count(picture_buffer_id)) { + // It's possible that we've already posted a DismissPictureBuffer for this + // picture, but it has not yet executed when this ReusePictureBuffer + // was posted to us by the client. In that case just ignore this (we've + // already dismissed it and accounted for that). + DVLOGF(3) << "got picture id=" << picture_buffer_id + << " not in use (anymore?)."; + return; + } + + available_picture_buffers_.push_back(picture_buffer_id); + TRACE_COUNTER_ID2("media,gpu", "Vaapi frames at client", this, "used", + pictures_.size() - available_picture_buffers_.size(), + "available", available_picture_buffers_.size()); + } TryOutputPicture(); } @@ -966,10 +976,10 @@ if (state_ == kResetting || state_ == kDestroying) return; } - pending_output_cbs_.push( base::BindOnce(&VaapiVideoDecodeAccelerator::OutputPicture, weak_this_, dec_surface, bitstream_id, visible_rect, color_space)); + TryOutputPicture(); } @@ -1017,14 +1027,16 @@ void VaapiVideoDecodeAccelerator::RecycleVASurfaceID( VASurfaceID va_surface_id) { DCHECK(task_runner_->BelongsToCurrentThread()); - base::AutoLock auto_lock(lock_); - available_va_surfaces_.push_back(va_surface_id); - if (!decode_using_client_picture_buffers_) { - TRACE_COUNTER_ID2("media,gpu", "Vaapi VASurfaceIDs", this, "used", - pictures_.size() - available_va_surfaces_.size(), - "available", available_va_surfaces_.size()); + { + base::AutoLock auto_lock(lock_); + available_va_surfaces_.push_back(va_surface_id); + if (!decode_using_client_picture_buffers_) { + TRACE_COUNTER_ID2("media,gpu", "Vaapi VASurfaceIDs", this, "used", + pictures_.size() - available_va_surfaces_.size(), + "available", available_va_surfaces_.size()); + } + surfaces_available_.Signal(); } - surfaces_available_.Signal(); TryOutputPicture(); }
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.h b/media/gpu/vaapi/vaapi_video_decode_accelerator.h index 898f266..abc8c52 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.h +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.h
@@ -25,6 +25,7 @@ #include "base/single_thread_task_runner.h" #include "base/synchronization/condition_variable.h" #include "base/synchronization/lock.h" +#include "base/thread_annotations.h" #include "base/threading/thread.h" #include "base/trace_event/memory_dump_provider.h" #include "media/base/bitstream_buffer.h" @@ -115,16 +116,16 @@ // |decoder_|. This method will sleep if no |input_buffers_| are available. // Returns true if a new buffer has been set up, false if an early exit has // been requested (due to initiated reset/flush/destroy). - bool GetCurrInputBuffer_Locked(); + bool GetCurrInputBuffer_Locked() EXCLUSIVE_LOCKS_REQUIRED(lock_); // Signals the client that |curr_input_buffer_| has been read and can be // returned. Will also release the mapping. - void ReturnCurrInputBuffer_Locked(); + void ReturnCurrInputBuffer_Locked() EXCLUSIVE_LOCKS_REQUIRED(lock_); // Waits for more surfaces to become available. Returns true once they do or // false if an early exit has been requested (due to an initiated // reset/flush/destroy). - bool WaitForSurfaces_Locked(); + bool WaitForSurfaces_Locked() EXCLUSIVE_LOCKS_REQUIRED(lock_); // Continue decoding given input buffers and sleep waiting for input/output // as needed. Will exit if a new set of surfaces or reset/flush/destroy @@ -198,24 +199,26 @@ kDestroying, }; - // |lock_| protects |input_buffers_|, |curr_input_buffer_|, |state_| and - // |available_picture_buffers_|. base::Lock lock_; - State state_; + State state_ GUARDED_BY(lock_); + // Only used on |task_runner_|. Config::OutputMode output_mode_; // Queue of available InputBuffers. - base::queue<std::unique_ptr<InputBuffer>> input_buffers_; + base::queue<std::unique_ptr<InputBuffer>> input_buffers_ GUARDED_BY(lock_); // Signalled when input buffers are queued onto |input_buffers_| queue. base::ConditionVariable input_ready_; - // Current input buffer at decoder. + // Current input buffer at decoder. Only used on |decoder_thread_task_runner_| std::unique_ptr<InputBuffer> curr_input_buffer_; + // Only used on |task_runner_|. std::unique_ptr<VaapiPictureFactory> vaapi_picture_factory_; - // Constructed in Initialize() when the codec information is received. + // The following variables are constructed/initialized in Initialize() when + // the codec information is received. |vaapi_wrapper_| is thread safe. scoped_refptr<VaapiWrapper> vaapi_wrapper_; + // Only used on |decoder_thread_task_runner_|. std::unique_ptr<AcceleratedVideoDecoder> decoder_; // VaapiWrapper for VPP (Video Post Processing). This is used for copying @@ -226,14 +229,15 @@ // are allocated at AssignPictureBuffers() and are kept until dtor or // TryFinishSurfaceSetChange(). Comes after |vaapi_wrapper_| to ensure all // pictures are destroyed before this is destroyed. - base::small_map<std::map<int32_t, std::unique_ptr<VaapiPicture>>> pictures_; + base::small_map<std::map<int32_t, std::unique_ptr<VaapiPicture>>> pictures_ + GUARDED_BY(lock_); // List of PictureBuffer ids available to be sent to |client_| via // OutputPicture() (|client_| returns them via ReusePictureBuffer()). - std::list<int32_t> available_picture_buffers_; + std::list<int32_t> available_picture_buffers_ GUARDED_BY(lock_); // VASurfaceIDs no longer in use that can be passed back to |decoder_| for // reuse, once it requests them. - std::list<VASurfaceID> available_va_surfaces_; + std::list<VASurfaceID> available_va_surfaces_ GUARDED_BY(lock_); // Signalled when output surfaces are queued into |available_va_surfaces_|. base::ConditionVariable surfaces_available_; @@ -245,15 +249,13 @@ // If we don't have any available |pictures_| at the time when the decoder // requests output, we'll store the request in this queue for later and run it // once the client gives us more textures via ReusePictureBuffer(). + // Only used on |task_runner_|. base::queue<base::OnceClosure> pending_output_cbs_; // Under some circumstances, we can pass to libva our own VASurfaceIDs to - // decode onto, which skips one copy. + // decode onto, which skips one copy. Only used on |task_runner_|. bool decode_using_client_picture_buffers_; - // ChildThread's task runner. - const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; - // WeakPtr<> pointing to |this| for use in posting tasks from the decoder // thread back to the ChildThread. Because the decoder thread is a member of // this class, any task running on the decoder thread is guaranteed that this @@ -262,26 +264,29 @@ // decoder thread to the ChildThread should use |weak_this_|. base::WeakPtr<VaapiVideoDecodeAccelerator> weak_this_; - // Callback used when creating VASurface objects. + // Callback used when creating VASurface objects. Only used on |task_runner_|. VASurface::ReleaseCB va_surface_release_cb_; - // To expose client callbacks from VideoDecodeAccelerator. - // NOTE: all calls to these objects *MUST* be executed on task_runner_. + // To expose client callbacks from VideoDecodeAccelerator. Used only on + // |task_runner_|. std::unique_ptr<base::WeakPtrFactory<Client>> client_ptr_factory_; base::WeakPtr<Client> client_; + // ChildThread's task runner. + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + base::Thread decoder_thread_; // Use this to post tasks to |decoder_thread_| instead of // |decoder_thread_.task_runner()| because the latter will be NULL once // |decoder_thread_.Stop()| returns. scoped_refptr<base::SingleThreadTaskRunner> decoder_thread_task_runner_; - // Whether we are waiting for any pending_output_cbs_ to be run before - // NotifyingFlushDone. + // Whether we are waiting for any |pending_output_cbs_| to be run before + // NotifyingFlushDone. Only used on |task_runner_|. bool finish_flush_pending_; // Decoder requested a new surface set and we are waiting for all the surfaces - // to be returned before we can free them. + // to be returned before we can free them. Only used on |task_runner_|. bool awaiting_va_surfaces_recycle_; // Last requested number/resolution of output picture buffers and their
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc index 3041c10e..ae451c3 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
@@ -165,6 +165,7 @@ } void SetVdaStateToUnitialized() { + base::AutoLock auto_lock(vda_.lock_); vda_.state_ = VaapiVideoDecodeAccelerator::kUninitialized; }
diff --git a/net/BUILD.gn b/net/BUILD.gn index 8f0a9ab..99b6ee8e 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -5345,7 +5345,6 @@ if (enable_reporting) { sources += [ - "network_error_logging/network_error_logging_end_to_end_test.cc", "network_error_logging/network_error_logging_service_unittest.cc", "reporting/reporting_browsing_data_remover_unittest.cc", "reporting/reporting_cache_unittest.cc",
diff --git a/net/network_error_logging/network_error_logging_end_to_end_test.cc b/net/network_error_logging/network_error_logging_end_to_end_test.cc deleted file mode 100644 index 69d82e7..0000000 --- a/net/network_error_logging/network_error_logging_end_to_end_test.cc +++ /dev/null
@@ -1,245 +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. - -#include "base/macros.h" -#include "base/run_loop.h" -#include "base/single_thread_task_runner.h" -#include "base/strings/stringprintf.h" -#include "base/test/values_test_util.h" -#include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" -#include "base/values.h" -#include "build/build_config.h" -#include "net/base/net_errors.h" -#include "net/network_error_logging/network_error_logging_service.h" -#include "net/reporting/reporting_policy.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" -#include "net/test/test_with_scoped_task_environment.h" -#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request.h" -#include "net/url_request/url_request_context.h" -#include "net/url_request/url_request_context_builder.h" -#include "net/url_request/url_request_status.h" -#include "net/url_request/url_request_test_util.h" -#include "testing/gtest/include/gtest/gtest.h" - -#if defined(OS_LINUX) || defined(OS_ANDROID) -#include "net/proxy_resolution/proxy_config.h" -#include "net/proxy_resolution/proxy_config_service_fixed.h" -#endif // defined(OS_LINUX) || defined(OS_ANDROID) - -namespace net { -namespace { - -const char kGroup[] = "network-errors"; -const int kMaxAgeSec = 86400; - -const char kConfigurePath[] = "/configure"; -const char kFailPath[] = "/fail"; -const char kReportPath[] = "/report"; - -class HungHttpResponse : public test_server::HttpResponse { - public: - HungHttpResponse() = default; - - void SendResponse(const test_server::SendBytesCallback& send, - const test_server::SendCompleteCallback& done) override {} - - private: - DISALLOW_COPY_AND_ASSIGN(HungHttpResponse); -}; - -class NetworkErrorLoggingEndToEndTest : public TestWithScopedTaskEnvironment { - protected: - NetworkErrorLoggingEndToEndTest() - : main_task_runner_(base::ThreadTaskRunnerHandle::Get()), - test_server_(test_server::EmbeddedTestServer::TYPE_HTTPS), - upload_should_hang_(false), - upload_received_(false) { - // Make report delivery happen instantly. - auto policy = ReportingPolicy::Create(); - policy->delivery_interval = base::TimeDelta::FromSeconds(0); - - URLRequestContextBuilder builder; -#if defined(OS_LINUX) || defined(OS_ANDROID) - builder.set_proxy_config_service(std::make_unique<ProxyConfigServiceFixed>( - ProxyConfigWithAnnotation::CreateDirect())); -#endif // defined(OS_LINUX) || defined(OS_ANDROID) - builder.set_reporting_policy(std::move(policy)); - builder.set_network_error_logging_enabled(true); - url_request_context_ = builder.Build(); - - EXPECT_TRUE(url_request_context_->reporting_service()); - EXPECT_TRUE(url_request_context_->network_error_logging_service()); - - test_server_.RegisterRequestHandler(base::BindRepeating( - &NetworkErrorLoggingEndToEndTest::HandleConfigureRequest, - base::Unretained(this))); - test_server_.RegisterRequestHandler( - base::BindRepeating(&NetworkErrorLoggingEndToEndTest::HandleFailRequest, - base::Unretained(this))); - test_server_.RegisterRequestHandler(base::BindRepeating( - &NetworkErrorLoggingEndToEndTest::HandleReportRequest, - base::Unretained(this))); - EXPECT_TRUE(test_server_.Start()); - } - - ~NetworkErrorLoggingEndToEndTest() override { - EXPECT_TRUE(test_server_.ShutdownAndWaitUntilComplete()); - } - - GURL GetConfigureURL() { return test_server_.GetURL(kConfigurePath); } - - GURL GetFailURL() { return test_server_.GetURL(kFailPath); } - - GURL GetReportURL() { return test_server_.GetURL(kReportPath); } - - std::unique_ptr<test_server::HttpResponse> HandleConfigureRequest( - const test_server::HttpRequest& request) { - if (request.relative_url != kConfigurePath) - return nullptr; - - GURL endpoint_url = GetReportURL(); - - auto response = std::make_unique<test_server::BasicHttpResponse>(); - response->AddCustomHeader( - "Report-To", - base::StringPrintf("{\"endpoints\":[{\"url\":\"%s\"}],\"group\":\"%s\"," - "\"max_age\":%d}", - endpoint_url.spec().c_str(), kGroup, kMaxAgeSec)); - response->AddCustomHeader( - "NEL", base::StringPrintf("{\"report_to\":\"%s\",\"max_age\":%d}", - kGroup, kMaxAgeSec)); - response->set_content_type("text/plain"); - response->set_content(""); - return std::move(response); - } - - std::unique_ptr<test_server::HttpResponse> HandleFailRequest( - const test_server::HttpRequest& request) { - if (request.relative_url != kFailPath) - return nullptr; - - return std::make_unique<test_server::RawHttpResponse>("", ""); - } - - std::unique_ptr<test_server::HttpResponse> HandleReportRequest( - const test_server::HttpRequest& request) { - if (request.relative_url != kReportPath) - return nullptr; - - EXPECT_TRUE(request.has_content); - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&NetworkErrorLoggingEndToEndTest::OnUploadReceived, - base::Unretained(this), request.content)); - - if (upload_should_hang_) - return std::make_unique<HungHttpResponse>(); - - auto response = std::make_unique<test_server::BasicHttpResponse>(); - response->set_content_type("text/plain"); - response->set_content(""); - return std::move(response); - } - - void OnUploadReceived(std::string content) { - upload_received_ = true; - upload_content_ = content; - upload_run_loop_.Quit(); - } - - scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; - std::unique_ptr<URLRequestContext> url_request_context_; - test_server::EmbeddedTestServer test_server_; - - bool upload_should_hang_; - bool upload_received_; - std::string upload_content_; - base::RunLoop upload_run_loop_; - - private: - DISALLOW_COPY_AND_ASSIGN(NetworkErrorLoggingEndToEndTest); -}; - -#if defined(OS_WIN) || defined(OS_FUCHSIA) -// TODO(https://crbug.com/829650): Fix and re-enable these tests. -#define MAYBE_ReportNetworkError DISABLED_ReportNetworkError -#else -#define MAYBE_ReportNetworkError ReportNetworkError -#endif -TEST_F(NetworkErrorLoggingEndToEndTest, MAYBE_ReportNetworkError) { - TestDelegate configure_delegate; - configure_delegate.set_on_complete(base::DoNothing()); - auto configure_request = url_request_context_->CreateRequest( - GetConfigureURL(), DEFAULT_PRIORITY, &configure_delegate, - TRAFFIC_ANNOTATION_FOR_TESTS); - configure_request->set_method("GET"); - configure_request->Start(); - - TestDelegate fail_delegate; - fail_delegate.set_on_complete(base::DoNothing()); - auto fail_request = url_request_context_->CreateRequest( - GetFailURL(), DEFAULT_PRIORITY, &fail_delegate, - TRAFFIC_ANNOTATION_FOR_TESTS); - fail_request->set_method("GET"); - fail_request->Start(); - - upload_run_loop_.Run(); - - EXPECT_TRUE(upload_received_); - auto reports = base::test::ParseJson(upload_content_); - - base::ListValue* reports_list; - ASSERT_TRUE(reports->GetAsList(&reports_list)); - ASSERT_EQ(1u, reports_list->GetSize()); - base::DictionaryValue* report_dict; - ASSERT_TRUE(reports_list->GetDictionary(0u, &report_dict)); - - ExpectDictStringValue("network-error", *report_dict, "type"); - ExpectDictStringValue(GetFailURL().spec(), *report_dict, "url"); - base::DictionaryValue* body_dict; - ASSERT_TRUE(report_dict->GetDictionary("body", &body_dict)); - - ExpectDictStringValue("http.response.invalid.empty", *body_dict, "type"); - ExpectDictIntegerValue(0, *body_dict, "status_code"); -} - -#if defined(OS_WIN) || defined(OS_FUCHSIA) -// TODO(https://crbug.com/829650): Fix and re-enable these tests. -#define MAYBE_UploadAtShutdown DISABLED_UploadAtShutdown -#else -#define MAYBE_UploadAtShutdown UploadAtShutdown -#endif -// Make sure an upload that is in progress at shutdown does not crash. -// This verifies that https://crbug.com/792978 is fixed. -TEST_F(NetworkErrorLoggingEndToEndTest, MAYBE_UploadAtShutdown) { - upload_should_hang_ = true; - - TestDelegate configure_delegate; - configure_delegate.set_on_complete(base::DoNothing()); - auto configure_request = url_request_context_->CreateRequest( - GetConfigureURL(), DEFAULT_PRIORITY, &configure_delegate, - TRAFFIC_ANNOTATION_FOR_TESTS); - configure_request->set_method("GET"); - configure_request->Start(); - - TestDelegate fail_delegate; - fail_delegate.set_on_complete(base::DoNothing()); - auto fail_request = url_request_context_->CreateRequest( - GetFailURL(), DEFAULT_PRIORITY, &fail_delegate, - TRAFFIC_ANNOTATION_FOR_TESTS); - fail_request->set_method("GET"); - fail_request->Start(); - - upload_run_loop_.Run(); - - // Let Reporting and NEL shut down with the upload still pending to see if - // they crash. -} - -} // namespace -} // namespace net
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc index 1208b19b..a948c93 100644 --- a/net/socket/udp_socket_unittest.cc +++ b/net/socket/udp_socket_unittest.cc
@@ -157,19 +157,19 @@ } void UDPSocketTest::ConnectTest(bool use_nonblocking_io) { - const uint16_t kPort = 9999; std::string simple_message("hello world!"); // Setup the server to listen. - IPEndPoint server_address(IPAddress::IPv4Localhost(), kPort); + IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */); TestNetLog server_log; std::unique_ptr<UDPServerSocket> server( new UDPServerSocket(&server_log, NetLogSource())); if (use_nonblocking_io) server->UseNonBlockingIO(); server->AllowAddressReuse(); - int rv = server->Listen(server_address); - ASSERT_THAT(rv, IsOk()); + ASSERT_THAT(server->Listen(server_address), IsOk()); + // Get bound port. + ASSERT_THAT(server->GetLocalAddress(&server_address), IsOk()); // Setup the client. TestNetLog client_log; @@ -178,20 +178,19 @@ if (use_nonblocking_io) client->UseNonBlockingIO(); - rv = client->Connect(server_address); - EXPECT_THAT(rv, IsOk()); + EXPECT_THAT(client->Connect(server_address), IsOk()); // Client sends to the server. - rv = WriteSocket(client.get(), simple_message); - EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv)); + EXPECT_EQ(simple_message.length(), + static_cast<size_t>(WriteSocket(client.get(), simple_message))); // Server waits for message. std::string str = RecvFromSocket(server.get()); EXPECT_EQ(simple_message, str); // Server echoes reply. - rv = SendToSocket(server.get(), simple_message); - EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv)); + EXPECT_EQ(simple_message.length(), + static_cast<size_t>(SendToSocket(server.get(), simple_message))); // Client waits for response. str = ReadSocket(client.get()); @@ -200,7 +199,7 @@ // Test asynchronous read. Server waits for message. base::RunLoop run_loop; int read_result = 0; - rv = server->RecvFrom( + int rv = server->RecvFrom( buffer_.get(), kMaxRead, &recv_from_address_, base::Bind(&ReadCompleteCallback, &read_result, run_loop.QuitClosure())); EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); @@ -221,20 +220,23 @@ // Check the server's log. TestNetLogEntry::List server_entries; server_log.GetEntries(&server_entries); - EXPECT_EQ(5u, server_entries.size()); + ASSERT_EQ(6u, server_entries.size()); EXPECT_TRUE( LogContainsBeginEvent(server_entries, 0, NetLogEventType::SOCKET_ALIVE)); EXPECT_TRUE(LogContainsEvent(server_entries, 1, - NetLogEventType::UDP_BYTES_RECEIVED, + NetLogEventType::UDP_LOCAL_ADDRESS, NetLogEventPhase::NONE)); EXPECT_TRUE(LogContainsEvent(server_entries, 2, - NetLogEventType::UDP_BYTES_SENT, + NetLogEventType::UDP_BYTES_RECEIVED, NetLogEventPhase::NONE)); EXPECT_TRUE(LogContainsEvent(server_entries, 3, + NetLogEventType::UDP_BYTES_SENT, + NetLogEventPhase::NONE)); + EXPECT_TRUE(LogContainsEvent(server_entries, 4, NetLogEventType::UDP_BYTES_RECEIVED, NetLogEventPhase::NONE)); EXPECT_TRUE( - LogContainsEndEvent(server_entries, 4, NetLogEventType::SOCKET_ALIVE)); + LogContainsEndEvent(server_entries, 5, NetLogEventType::SOCKET_ALIVE)); // Check the client's log. TestNetLogEntry::List client_entries; @@ -320,13 +322,10 @@ #define MAYBE_LocalBroadcast LocalBroadcast #endif TEST_F(UDPSocketTest, MAYBE_LocalBroadcast) { - const uint16_t kPort = 9999; std::string first_message("first message"), second_message("second message"); - IPEndPoint broadcast_address; - ASSERT_TRUE(CreateUDPAddress("127.255.255.255", kPort, &broadcast_address)); IPEndPoint listen_address; - ASSERT_TRUE(CreateUDPAddress("0.0.0.0", kPort, &listen_address)); + ASSERT_TRUE(CreateUDPAddress("0.0.0.0", 0 /* port */, &listen_address)); TestNetLog server1_log, server2_log; std::unique_ptr<UDPServerSocket> server1( @@ -338,20 +337,23 @@ server2->AllowAddressReuse(); server2->AllowBroadcast(); - int rv = server1->Listen(listen_address); - EXPECT_THAT(rv, IsOk()); - rv = server2->Listen(listen_address); - EXPECT_THAT(rv, IsOk()); + EXPECT_THAT(server1->Listen(listen_address), IsOk()); + // Get bound port. + EXPECT_THAT(server1->GetLocalAddress(&listen_address), IsOk()); + EXPECT_THAT(server2->Listen(listen_address), IsOk()); - rv = SendToSocket(server1.get(), first_message, broadcast_address); - ASSERT_EQ(static_cast<int>(first_message.size()), rv); + IPEndPoint broadcast_address; + ASSERT_TRUE(CreateUDPAddress("127.255.255.255", listen_address.port(), + &broadcast_address)); + ASSERT_EQ(static_cast<int>(first_message.size()), + SendToSocket(server1.get(), first_message, broadcast_address)); std::string str = RecvFromSocket(server1.get()); ASSERT_EQ(first_message, str); str = RecvFromSocket(server2.get()); ASSERT_EQ(first_message, str); - rv = SendToSocket(server2.get(), second_message, broadcast_address); - ASSERT_EQ(static_cast<int>(second_message.size()), rv); + ASSERT_EQ(static_cast<int>(second_message.size()), + SendToSocket(server2.get(), second_message, broadcast_address)); str = RecvFromSocket(server1.get()); ASSERT_EQ(second_message, str); str = RecvFromSocket(server2.get()); @@ -438,33 +440,28 @@ // not bind the client's reads to only be from that endpoint, and that we need // to always use recvfrom() to disambiguate. TEST_F(UDPSocketTest, VerifyConnectBindsAddr) { - const uint16_t kPort1 = 9999; - const uint16_t kPort2 = 10000; std::string simple_message("hello world!"); std::string foreign_message("BAD MESSAGE TO GET!!"); // Setup the first server to listen. - IPEndPoint server1_address(IPAddress::IPv4Localhost(), kPort1); + IPEndPoint server1_address(IPAddress::IPv4Localhost(), 0 /* port */); UDPServerSocket server1(nullptr, NetLogSource()); - server1.AllowAddressReuse(); - int rv = server1.Listen(server1_address); - ASSERT_THAT(rv, IsOk()); + ASSERT_THAT(server1.Listen(server1_address), IsOk()); + // Get the bound port. + ASSERT_THAT(server1.GetLocalAddress(&server1_address), IsOk()); // Setup the second server to listen. - IPEndPoint server2_address(IPAddress::IPv4Localhost(), kPort2); + IPEndPoint server2_address(IPAddress::IPv4Localhost(), 0 /* port */); UDPServerSocket server2(nullptr, NetLogSource()); - server2.AllowAddressReuse(); - rv = server2.Listen(server2_address); - ASSERT_THAT(rv, IsOk()); + ASSERT_THAT(server2.Listen(server2_address), IsOk()); // Setup the client, connected to server 1. UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource()); - rv = client.Connect(server1_address); - EXPECT_THAT(rv, IsOk()); + EXPECT_THAT(client.Connect(server1_address), IsOk()); // Client sends to server1. - rv = WriteSocket(&client, simple_message); - EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv)); + EXPECT_EQ(simple_message.length(), + static_cast<size_t>(WriteSocket(&client, simple_message))); // Server1 waits for message. std::string str = RecvFromSocket(&server1); @@ -472,16 +469,17 @@ // Get the client's address. IPEndPoint client_address; - rv = client.GetLocalAddress(&client_address); - EXPECT_THAT(rv, IsOk()); + EXPECT_THAT(client.GetLocalAddress(&client_address), IsOk()); // Server2 sends reply. - rv = SendToSocket(&server2, foreign_message, client_address); - EXPECT_EQ(foreign_message.length(), static_cast<size_t>(rv)); + EXPECT_EQ(foreign_message.length(), + static_cast<size_t>( + SendToSocket(&server2, foreign_message, client_address))); // Server1 sends reply. - rv = SendToSocket(&server1, simple_message, client_address); - EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv)); + EXPECT_EQ(simple_message.length(), + static_cast<size_t>( + SendToSocket(&server1, simple_message, client_address))); // Client waits for response. str = ReadSocket(&client); @@ -628,20 +626,19 @@ EXPECT_FALSE(callback.have_result()); } -// Some Android devices do not support multicast socket. +// Some Android devices do not support multicast. // The ones supporting multicast need WifiManager.MulitcastLock to enable it. // http://goo.gl/jjAk9 #if !defined(OS_ANDROID) TEST_F(UDPSocketTest, JoinMulticastGroup) { - const uint16_t kPort = 9999; const char kGroup[] = "237.132.100.17"; IPAddress group_ip; EXPECT_TRUE(group_ip.AssignFromIPLiteral(kGroup)); #if defined(OS_WIN) || defined(OS_FUCHSIA) - IPEndPoint bind_address(IPAddress::AllZeros(group_ip.size()), kPort); + IPEndPoint bind_address(IPAddress::AllZeros(group_ip.size()), 0 /* port */); #else - IPEndPoint bind_address(group_ip, kPort); + IPEndPoint bind_address(group_ip, 0 /* port */); #endif // defined(OS_WIN) || defined(OS_FUCHSIA) UDPSocket socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource()); @@ -672,16 +669,15 @@ #if !defined(OS_FUCHSIA) // TODO(https://crbug.com/900709): SO_REUSEPORT doesn't work on Fuchsia. TEST_F(UDPSocketTest, SharedMulticastAddress) { - const uint16_t kPort = 9999; const char kGroup[] = "224.0.0.251"; IPAddress group_ip; ASSERT_TRUE(group_ip.AssignFromIPLiteral(kGroup)); - IPEndPoint send_address(group_ip, kPort); #if defined(OS_WIN) || defined(OS_FUCHSIA) - IPEndPoint receive_address(IPAddress::AllZeros(group_ip.size()), kPort); + IPEndPoint receive_address(IPAddress::AllZeros(group_ip.size()), + 0 /* port */); #else - IPEndPoint receive_address(send_address); + IPEndPoint receive_address(group_ip, 0 /* port */); #endif // defined(OS_WIN) || defined(OS_FUCHSIA) NetworkInterfaceList interfaces; @@ -695,6 +691,8 @@ IsOk()); ASSERT_THAT(socket1.Listen(receive_address), IsOk()); ASSERT_THAT(socket1.JoinGroup(group_ip), IsOk()); + // Get the bound port. + ASSERT_THAT(socket1.GetLocalAddress(&receive_address), IsOk()); // Setup second receiving socket. UDPServerSocket socket2(nullptr, NetLogSource()); @@ -705,6 +703,7 @@ ASSERT_THAT(socket2.JoinGroup(group_ip), IsOk()); // Setup client socket. + IPEndPoint send_address(group_ip, receive_address.port()); UDPClientSocket client_socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource()); ASSERT_THAT(client_socket.Connect(send_address), IsOk()); @@ -725,9 +724,8 @@ #endif // !defined(OS_ANDROID) TEST_F(UDPSocketTest, MulticastOptions) { - const uint16_t kPort = 9999; IPEndPoint bind_address; - ASSERT_TRUE(CreateUDPAddress("0.0.0.0", kPort, &bind_address)); + ASSERT_TRUE(CreateUDPAddress("0.0.0.0", 0 /* port */, &bind_address)); UDPSocket socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource()); // Before binding. @@ -1198,31 +1196,30 @@ #endif TEST_F(UDPSocketTest, ReadWithSocketOptimization) { - const uint16_t kPort = 10000; std::string simple_message("hello world!"); // Setup the server to listen. - IPEndPoint server_address(IPAddress::IPv4Localhost(), kPort); + IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */); UDPServerSocket server(NULL, NetLogSource()); server.AllowAddressReuse(); - int rv = server.Listen(server_address); - ASSERT_THAT(rv, IsOk()); + ASSERT_THAT(server.Listen(server_address), IsOk()); + // Get bound port. + ASSERT_THAT(server.GetLocalAddress(&server_address), IsOk()); // Setup the client, enable experimental optimization and connected to the // server. UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource()); client.EnableRecvOptimization(); - rv = client.Connect(server_address); - EXPECT_THAT(rv, IsOk()); + EXPECT_THAT(client.Connect(server_address), IsOk()); // Get the client's address. IPEndPoint client_address; - rv = client.GetLocalAddress(&client_address); - EXPECT_THAT(rv, IsOk()); + EXPECT_THAT(client.GetLocalAddress(&client_address), IsOk()); // Server sends the message to the client. - rv = SendToSocket(&server, simple_message, client_address); - EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv)); + EXPECT_EQ(simple_message.length(), + static_cast<size_t>( + SendToSocket(&server, simple_message, client_address))); // Client receives the message. std::string str = ReadSocket(&client); @@ -1238,37 +1235,38 @@ // For the optimized path, the buffer size should be at least // 1 byte greater than the message. TEST_F(UDPSocketTest, ReadWithSocketOptimizationTruncation) { - const uint16_t kPort = 10000; std::string too_long_message(kMaxRead + 1, 'A'); std::string right_length_message(kMaxRead - 1, 'B'); std::string exact_length_message(kMaxRead, 'C'); // Setup the server to listen. - IPEndPoint server_address(IPAddress::IPv4Localhost(), kPort); + IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */); UDPServerSocket server(NULL, NetLogSource()); server.AllowAddressReuse(); - int rv = server.Listen(server_address); - ASSERT_THAT(rv, IsOk()); + ASSERT_THAT(server.Listen(server_address), IsOk()); + // Get bound port. + ASSERT_THAT(server.GetLocalAddress(&server_address), IsOk()); // Setup the client, enable experimental optimization and connected to the // server. UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource()); client.EnableRecvOptimization(); - rv = client.Connect(server_address); - EXPECT_THAT(rv, IsOk()); + EXPECT_THAT(client.Connect(server_address), IsOk()); // Get the client's address. IPEndPoint client_address; - rv = client.GetLocalAddress(&client_address); - EXPECT_THAT(rv, IsOk()); + EXPECT_THAT(client.GetLocalAddress(&client_address), IsOk()); // Send messages to the client. - rv = SendToSocket(&server, too_long_message, client_address); - EXPECT_EQ(too_long_message.length(), static_cast<size_t>(rv)); - rv = SendToSocket(&server, right_length_message, client_address); - EXPECT_EQ(right_length_message.length(), static_cast<size_t>(rv)); - rv = SendToSocket(&server, exact_length_message, client_address); - EXPECT_EQ(exact_length_message.length(), static_cast<size_t>(rv)); + EXPECT_EQ(too_long_message.length(), + static_cast<size_t>( + SendToSocket(&server, too_long_message, client_address))); + EXPECT_EQ(right_length_message.length(), + static_cast<size_t>( + SendToSocket(&server, right_length_message, client_address))); + EXPECT_EQ(exact_length_message.length(), + static_cast<size_t>( + SendToSocket(&server, exact_length_message, client_address))); // Client receives the messages. @@ -1276,9 +1274,8 @@ // In that case, the client is expected to get |ERR_MSG_TOO_BIG| when the // data is read. TestCompletionCallback callback; - rv = client.Read(buffer_.get(), kMaxRead, callback.callback()); - rv = callback.GetResult(rv); - EXPECT_EQ(ERR_MSG_TOO_BIG, rv); + int rv = client.Read(buffer_.get(), kMaxRead, callback.callback()); + EXPECT_EQ(ERR_MSG_TOO_BIG, callback.GetResult(rv)); // 2. The second message is |right_length_message|. Its size is // one byte smaller than the size of the buffer. In that case, the client
diff --git a/remoting/resources/remoting_strings_bn.xtb b/remoting/resources/remoting_strings_bn.xtb index ba01ce37..738aa1b 100644 --- a/remoting/resources/remoting_strings_bn.xtb +++ b/remoting/resources/remoting_strings_bn.xtb
@@ -24,7 +24,7 @@ <translation id="1520828917794284345">মানানসই করতে ডেস্কটপের আকার পরিবর্তন করুন</translation> <translation id="154040539590487450">দূরবর্তী অ্যাক্সেস পরিষেবা শুরু করতে ব্যর্থ হয়েছে৷</translation> <translation id="1546934824884762070">একটি অপ্রত্যাশিত ত্রুটি ঘটেছে৷ দয়া করে বিকাশকারীদের কাছে এই সমস্যাটির বিষয়ে জানান৷</translation> -<translation id="1624185583382384493">Chrome রিমোট ডেস্কটপ এখন ওয়েবে উপলভ্য। আমাদের <ph name="LINK_BEGIN" />ওয়েব অ্যাপ<ph name="LINK_END" /> ব্যবহার করে দেখুন যা দ্রুত কাজ করে এবং বিনামূল্যে, আরও ফিচারের সাথে একাধিক মনিটরের জন্য সাপোর্ট অন্তর্ভুক্ত।</translation> +<translation id="1624185583382384493">Chrome রিমোট ডেস্কটপ এখন ওয়েবে উপলভ্য। আমাদের <ph name="LINK_BEGIN" />ওয়েব অ্যাপ<ph name="LINK_END" /> ব্যবহার করে দেখুন যা দ্রুত কাজ করে এবং বিনামূল্যে, আরও ফিচারের সাথে একাধিক মনিটরে কাজ করার সুবিধা রয়েছে।</translation> <translation id="1643640058022401035">এই পৃষ্ঠাটি ছেড়ে গেলেও সেটা আপনার Chromoting অধিবেশনটিকে শেষ করবে৷</translation> <translation id="1654128982815600832">এই কম্পিউটারটিতে দূরবর্তী সংযোগ সক্ষম করা হচ্ছে...</translation> <translation id="170207782578677537">এই কম্পিউটারটিতে নথিভুক্ত করতে ব্যর্থ হয়েছে৷</translation> @@ -243,7 +243,7 @@ <translation id="6198252989419008588">পিন পরিবর্তন করুন</translation> <translation id="6204583485351780592"><ph name="HOSTNAME" /> (পুরানো)</translation> <translation id="6221358653751391898">আপনি Chrome-এ প্রবেশ করা অবস্থায় নেই৷ অনুগ্রহ করে প্রবেশ করুন এবং আবার চেষ্টা করুন৷</translation> -<translation id="6227369581881558336">ফাইল ট্রান্সফার সহ নতুন ফিচারের সাথে Chrome রিমোট ডেস্কটপ এখন ওয়েবে উপলভ্য! আমাদের <ph name="LINK_BEGIN" />ওয়েব অ্যাপ<ph name="LINK_END" />দেখুন।</translation> +<translation id="6227369581881558336">ফাইল ট্রান্সফার সহ নতুন ফিচারের সাথে Chrome রিমোট ডেস্কটপ এখন ওয়েবে উপলভ্য! আমাদের <ph name="LINK_BEGIN" />ওয়েব অ্যাপ<ph name="LINK_END" /> দেখুন।</translation> <translation id="6284412385303060032">ব্যবহারকারী নির্দিষ্ট একটি অধিবেশনে চলমান একটি হোস্টে স্যুইচ করার মাধ্যমে কার্টেন মোডকে সমর্থন করার জন্য কনসোল লজিক স্ক্রিনে চলমান হোস্টকে শাটডাউন করা হয়েছে।</translation> <translation id="629730747756840877">অ্যাকাউন্ট</translation> <translation id="6304318647555713317">ক্লায়েন্ট</translation>
diff --git a/remoting/resources/remoting_strings_es-419.xtb b/remoting/resources/remoting_strings_es-419.xtb index ff59dc76..b2d0bcc 100644 --- a/remoting/resources/remoting_strings_es-419.xtb +++ b/remoting/resources/remoting_strings_es-419.xtb
@@ -24,7 +24,7 @@ <translation id="1520828917794284345">Ajustar el tamaño del escritorio</translation> <translation id="154040539590487450">No se pudo iniciar el servicio de acceso remoto.</translation> <translation id="1546934824884762070">Se produjo un error inesperado. Informa este problema a los programadores.</translation> -<translation id="1624185583382384493">Escritorio remoto de Chrome ahora está disponible en la Web. Prueba nuestra <ph name="LINK_BEGIN" />aplicación web<ph name="LINK_END" />: es rápida y gratuita, con más funciones, como la capacidad mejorada de conectarse a varios monitores.</translation> +<translation id="1624185583382384493">Escritorio remoto de Chrome ahora está disponible en la Web. Prueba nuestra <ph name="LINK_BEGIN" />aplicación web<ph name="LINK_END" />; es rápida y gratuita, con más funciones, como la capacidad mejorada de conectarse a varios monitores.</translation> <translation id="1643640058022401035">Al abandonar esta página, se cerrará tu sesión en Chromoting.</translation> <translation id="1654128982815600832">Habilitando conexiones remotas para esta computadora…</translation> <translation id="170207782578677537">No se pudo registrar esta computadora.</translation>
diff --git a/remoting/resources/remoting_strings_iw.xtb b/remoting/resources/remoting_strings_iw.xtb index f7eb65a..8e30e2ce 100644 --- a/remoting/resources/remoting_strings_iw.xtb +++ b/remoting/resources/remoting_strings_iw.xtb
@@ -8,17 +8,17 @@ <translation id="1199593201721843963">השבת חיבורים מרוחקים</translation> <translation id="1291443878853470558">אם ברצונך להשתמש ב-Chromoting כדי לגשת למחשב זה, עליך להפעיל חיבורים מרוחקים.</translation> <translation id="1297009705180977556">אירעה שגיאת התחברות אל <ph name="HOSTNAME" /></translation> -<translation id="1300633907480909701">גש למחשבים שלך באופן מאובטח ממכשיר Android שלך. +<translation id="1300633907480909701">גישה מאובטחת למחשבים שלך ממכשיר Android שלך. -• בכל אחד מהמחשבים שלך, הגדר גישה מרחוק באמצעות אפליקציית שולחן העבודה המרוחק של Chrome, שבחנות האינטרנט של Chrome: https://chrome.google.com/remotedesktop -• במכשיר Android, פתח את האפליקציה והקש על מחשב הנמצא במצב מקוון כדי להתחבר אליו. +• בכל אחד מהמחשבים שלך, מגדירים גישה מרחוק באמצעות אפליקציית Chrome Remote Desktop, שבחנות האינטרנט של Chrome: https://chrome.google.com/remotedesktop +• במכשיר Android, פותחים את האפליקציה ומקישים על מחשב הנמצא במצב מקוון כדי להתחבר אליו. מחשבים מרוחקים שאין להם מקלדות עבור אנגלית של ארה"ב עשויים לקבל קלט טקסט שגוי. בקרוב נוסיף תמיכה לפריסות מקלדת נוספות! -למידע על פרטיות, עדיין במדיניות הפרטיות של Google (http://goo.gl/SyrVzj) ומדיניות הפרטיות של Chrome (http://goo.gl/0uXE5d).</translation> +למידע על פרטיות, ניתן לעיין במדיניות הפרטיות של Google (http://goo.gl/SyrVzj) ובמדיניות הפרטיות של Chrome (http://goo.gl/0uXE5d).</translation> <translation id="1324095856329524885">(התכונה הזו אינה זמינה עדיין בשביל המחשב שלך)</translation> <translation id="1342297293546459414">הצג תוכן של מחשב משותף ושלוט בו.</translation> -<translation id="1389790901665088353">הורד את מנהל ההתקנה של מארח שולחן העבודה המרוחק של Chrome</translation> +<translation id="1389790901665088353">הורדת המתקין של מארח Chrome Remote Desktop</translation> <translation id="1450760146488584666">האובייקט המבוקש אינו קיים.</translation> <translation id="1480046233931937785">שותפים לעשייה</translation> <translation id="1520828917794284345">שנה את גודל שולחן העבודה</translation> @@ -28,8 +28,8 @@ <translation id="1643640058022401035">יציאה מדף זה תגרום לסיום ההפעלה של Chromoting.</translation> <translation id="1654128982815600832">מפעיל חיבורים מרוחקים למחשב זה...</translation> <translation id="170207782578677537">הרישום של מחשב זה נכשל.</translation> -<translation id="1727412735341161734">שולחן עבודה מרוחק של Chrome</translation> -<translation id="174018511426417793">אין לך מחשבים רשומים. כדי להפעיל חיבורים מרוחקים למחשב, התקן את 'שולחן עבודה מרוחק של Chrome' במחשב היעד ולחץ על '<ph name="BUTTON_NAME" />'.</translation> +<translation id="1727412735341161734">Chrome Remote Desktop</translation> +<translation id="174018511426417793">אין לך מחשבים רשומים. כדי להפעיל חיבורים מרוחקים למחשב, יש להתקין את Chrome Remote Desktop במחשב היעד וללחוץ על '<ph name="BUTTON_NAME" />'.</translation> <translation id="1742469581923031760">מתחבר…</translation> <translation id="1770394049404108959">איני יכול לפתוח את היישום.</translation> <translation id="177096447311351977">IP הערוץ של הלקוח: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' ערוץ='<ph name="CHANNEL_TYPE" />' חיבור='<ph name="CONNECTION_TYPE" />'.</translation> @@ -39,21 +39,21 @@ <translation id="195619862187186579">פריסות מקלדת</translation> <translation id="1996161829609978754">Chrome מוריד את מתקין המארח של Chromoting. בסיום ההורדה, הפעל את המתקין לפני שתמשיך.</translation> <translation id="2009755455353575666">החיבור נכשל</translation> -<translation id="2013884659108657024">Chrome מוריד את מתקין המארח של 'שולחן עבודה מרוחק של Chrome'. בסיום ההורדה, הפעל את המתקין לפני שתמשיך.</translation> +<translation id="2013884659108657024">Chrome מוריד את מתקין המארח של Chrome Remote Desktop. בסיום ההורדה, יש להפעיל את המתקין לפני שממשיכים.</translation> <translation id="2013996867038862849">כל הלקוחות המותאמים נמחקו.</translation> <translation id="2038229918502634450">מתבצע אתחול של המארח כדי להחיל שינוי במדיניות.</translation> <translation id="2046651113449445291">הלקוחות הבאים הותאמו למחשב זה ויכולים להתחבר מבלי לספק PIN. ניתן לבטל הרשאה זו בכל עת, בנפרד או עבור כל הלקוחות.</translation> <translation id="2078880767960296260">תהליך מארח</translation> <translation id="20876857123010370">מצב משטח מגע</translation> <translation id="2089514346391228378">הופעלו חיבורים מרוחקים למחשב זה.</translation> -<translation id="2118549242412205620">גש למחשבים שלך באופן מאובטח ממכשיר Android שלך. +<translation id="2118549242412205620">גישה מאובטחת למחשבים שלך ממכשיר Android שלך. -• בכל אחד מהמחשבים שלך, הגדר גישה מרחוק באמצעות אפליקציית שולחן העבודה המרוחק של Chrome, שבחנות האינטרנט של Chrome: https://chrome.google.com/remotedesktop -• במכשיר Android, פתח את האפליקציה והקש על מחשב הנמצא במצב מקוון כדי להתחבר אליו. +• בכל אחד מהמחשבים, מגדירים גישה מרחוק באמצעות אפליקציית Chrome Remote Desktop, שבחנות האינטרנט של Chrome: https://chrome.google.com/remotedesktop +• במכשיר Android, פותחים את האפליקציה ומקישים על מחשב הנמצא במצב מקוון כדי להתחבר אליו. -למידע על פרטיות, עדיין במדיניות הפרטיות של Google (http://goo.gl/SyrVzj) ומדיניות הפרטיות של Chrome (http://goo.gl/0uXE5d).</translation> +למידע על פרטיות, ניתן לעיין במדיניות הפרטיות של Google (http://goo.gl/SyrVzj) ובמדיניות הפרטיות של Chrome (http://goo.gl/0uXE5d).</translation> <translation id="2124408767156847088">גש למחשבים שלך באופן מאובטח ממכשיר Android שלך.</translation> -<translation id="2208514473086078157">הגדרות המדיניות אינן מאפשרות שיתוף של מחשב זה כמארח שולחן עבודה מרוחק של Chrome. פנה למנהל המערכת שלך לקבלת סיוע.</translation> +<translation id="2208514473086078157">הגדרות המדיניות אינן מאפשרות שיתוף של מחשב זה כמארח Chrome Remote Desktop. יש לפנות למנהל המערכת שלך לקבלת סיוע.</translation> <translation id="2220529011494928058">דיווח על בעיה</translation> <translation id="2221097377466213233">השתמש במקש Ctrl למקש Win (⌘ ב-Mac)</translation> <translation id="2235518894410572517">שתף מחשב זה ואפשר למשתמש אחר להציג את התוכן שלו ולשלוט בו.</translation> @@ -62,20 +62,20 @@ <translation id="225614027745146050">ברוכים הבאים</translation> <translation id="228809120910082333">אשר את החשבון ומספר ה-PIN שלך שמפורטים למטה, כדי לאפשר גישה באמצעות Chromoting.</translation> <translation id="2314101195544969792">לא הייתה פעילות ב-<ph name="APPLICATION_NAME" /> במשך זמן-מה. אתה תנותק בקרוב.</translation> -<translation id="2317666076142640974">יש לך הזדמנות לקבל הצצה מקדימה אל <ph name="LINK_BEGIN" />אפליקציית האינטרנט 'שולחן העבודה המרוחק של Chrome'<ph name="LINK_END" />. נשמח לקבל ממך משוב.</translation> +<translation id="2317666076142640974">יש לך הזדמנות לקבל הצצה מקדימה אל <ph name="LINK_BEGIN" />אפליקציית האינטרנט Chrome Remote Desktop<ph name="LINK_END" />. נשמח לקבל ממך משוב.</translation> <translation id="2320166752086256636">הסתר מקלדת</translation> <translation id="2332192922827071008">פתיחת ההעדפות</translation> <translation id="2353140552984634198">תוכל לגשת למחשב זה באופן מאובטח באמצעות Chromoting.</translation> <translation id="2359808026110333948">המשך</translation> <translation id="2366718077645204424">לא ניתן להשיג את המארח. הסיבה לכך יכולה להיות תצורת הרשת שבה אתה משתמש.</translation> <translation id="2370754117186920852">המארח <ph name="OPTIONAL_OFFLINE_REASON" /> נראה לאחרונה במצב מקוון <ph name="RELATIVE_TIMESTAMP" />.</translation> -<translation id="2405928220797050937">האפליקציה הזו כבר לא נתמכת. כדי לוודא שיש לך גישה לתכונות ולעדכוני האבטחה העדכניים ביותר, השתמש ב<ph name="LINK_BEGIN" />אפליקציית האינטרנט 'שולחן העבודה המרוחק של Chrome'<ph name="LINK_END" />.</translation> -<translation id="2499160551253595098">עזור לנו לשפר את 'שולחן עבודה מרוחק של Chrome' בכך שתאפשר לנו לאסוף סטטיסטיקות שימוש ודוחות קריסה.</translation> +<translation id="2405928220797050937">האפליקציה הזו כבר לא נתמכת. כדי לוודא שיש לך גישה לתכונות ולעדכוני האבטחה העדכניים ביותר, יש להשתמש ב<ph name="LINK_BEGIN" />אפליקציית האינטרנט Chrome Remote Desktop<ph name="LINK_END" />.</translation> +<translation id="2499160551253595098">רוצה לעזור לנו לשפר את Chrome Remote Desktop? אנו זקוקים לאישורך כדי לאסוף סטטיסטיקות שימוש ודוחות קריסה.</translation> <translation id="2509394361235492552">בוצעה התחברות אל <ph name="HOSTNAME" /></translation> -<translation id="2512228156274966424">שים לב: על מנת לוודא שכל מקשי הקיצור זמינים, ניתן להגדיר את שולחן העבודה המרוחק של Chrome ל'פתח כחלון'.</translation> +<translation id="2512228156274966424">הערה: על מנת לוודא שכל מקשי הקיצור זמינים, ניתן להגדיר את Chrome Remote Desktop ל'פתח כחלון'.</translation> <translation id="2540992418118313681">האם ברצונך לשתף מחשב זה כך שמשתמש אחר יראה אותו וישלוט בו?</translation> <translation id="2579271889603567289">המארח קרס או שלא הופעל.</translation> -<translation id="2599300881200251572">שירות זה מאפשר חיבורים נכנסים מלקוחות שולחן העבודה המרוחק של Chrome.</translation> +<translation id="2599300881200251572">שירות זה מאפשר חיבורים נכנסים מלקוחות Chrome Remote Desktop.</translation> <translation id="2647232381348739934">שירות Chromoting</translation> <translation id="2676780859508944670">עובד…</translation> <translation id="2699970397166997657">Chromoting</translation> @@ -88,8 +88,8 @@ <translation id="2891243864890517178">בשביל Mac (OS X Yosemite 10.10 ואילך)</translation> <translation id="289405675947420287">האפליקציה מאפשרת לגשת למחשב באופן מאובטח ממכשיר ה-iOS. זה מהיר, פשוט ובחינם. -• יש להוריד את האפליקציה 'שולחן עבודה מרוחק של Chrome' מחנות האינטרנט של Chrome למחשב שאליו רוצים לגשת מרחוק. -• יש להתקין את התוכנה 'שולחן עבודה מרוחק של Chrome' ולפעול לפי ההוראות לסיום תהליך ההגדרה. +• יש להוריד את האפליקציה Chrome Remote Desktop מחנות האינטרנט של Chrome למחשב שאליו רוצים לגשת מרחוק. +• יש להתקין את התוכנה Chrome Remote Desktop ולפעול לפי ההוראות לסיום תהליך ההגדרה. • במכשיר ה-iOS, יש לפתוח את האפליקציה ולהקיש על אחד מהמחשבים שבמצב מקוון כדי להתחבר אליו.</translation> <translation id="2894654864775534701">המחשב הזו משותף כרגע כחלק מחשבון אחר.</translation> <translation id="2919669478609886916">אתה משתף כעת את המחשב הזה עם משתמש אחר. האם ברצונך להמשיך את השיתוף?</translation> @@ -104,10 +104,10 @@ <translation id="310979712355504754">מחק הכל</translation> <translation id="3150823315463303127">המארח לא הצליח לקרוא את המדיניות.</translation> <translation id="3171922709365450819">המכשיר הזה לא נתמך על-ידי הלקוח הזה כי נדרש עבורו אימות של צד שלישי.</translation> -<translation id="3194245623920924351">שולחן עבודה מרוחק של Chrome</translation> -<translation id="3197730452537982411">שולחן עבודה מרוחק</translation> +<translation id="3194245623920924351">Chrome Remote Desktop</translation> +<translation id="3197730452537982411">Remote Desktop</translation> <translation id="324272851072175193">שליחת ההוראות באימייל</translation> -<translation id="3258789396564295715">תוכל לגשת למחשב זה באופן מאובטח באמצעות 'שולחן עבודה מרוחק של Chrome'.</translation> +<translation id="3258789396564295715">ניתן לגשת למחשב זה באופן מאובטח באמצעות Chrome Remote Desktop.</translation> <translation id="3286521253923406898">בקר מארח Chromoting</translation> <translation id="3305934114213025800"><ph name="PRODUCT_NAME" /> מבקש אישור לבצע שינויים.</translation> <translation id="332624996707057614">ערוך את שם המחשב</translation> @@ -124,12 +124,12 @@ <translation id="3649256019230929621">מזער את החלון</translation> <translation id="369442766917958684">פועל במצב לא מקוון.</translation> <translation id="3695446226812920698">איך עושים זאת</translation> -<translation id="3718805989288361841">אירעה שגיאה בהגדרות המדיניות לשולחן העבודה המרוחק של Chrome. פנה למנהל המערכת כדי לקבל עזרה.</translation> -<translation id="3776024066357219166">הפעילות של 'שולחן עבודה מרוחק של Chrome' הסתיימה.</translation> +<translation id="3718805989288361841">אירעה שגיאה בהגדרות המדיניות של Chrome Remote Desktop. יש לפנות למנהל המערכת כדי לקבל עזרה.</translation> +<translation id="3776024066357219166">הפעילות של Chrome Remote Desktop הסתיימה.</translation> <translation id="3846148461359626420">• חוויה משופרת בהזזת התצוגה ובזום ב-iPhone X. • שיפורי יציבות ותיקוני באגים.</translation> <translation id="3870154837782082782">Google Inc.</translation> -<translation id="3884839335308961732">אשר את החשבון ומספר ה-PIN שלך שמפורטים למטה כדי לאפשר גישה באמצעות שולחן העבודה המרוחק של Chrome.</translation> +<translation id="3884839335308961732">יש לאשר את החשבון ומספר ה-PIN שלך שמפורטים למטה כדי לאפשר גישה באמצעות Chrome Remote Desktop.</translation> <translation id="3897092660631435901">תפריט</translation> <translation id="3905196214175737742">דומיין לא חוקי של בעל המארח.</translation> <translation id="3908017899227008678">הקטן להתאמה</translation> @@ -137,7 +137,7 @@ <translation id="3933246213702324812">Chromoting ב-<ph name="HOSTNAME" /> אינו מעודכן ויש לעדכן אותו.</translation> <translation id="3950820424414687140">כניסה</translation> <translation id="3989511127559254552">כדי להמשיך, ראשית עליך להעניק הרשאות גישה מורחבות למחשב שלך. עליך לעשות זאת פעם אחת בלבד.</translation> -<translation id="4006787130661126000">אם ברצונך להשתמש ב'שולחן עבודה מרוחק של Chrome' כדי לגשת למחשב זה, עליך להפעיל חיבורים מרוחקים.</translation> +<translation id="4006787130661126000">אם ברצונך להשתמש ב-Chrome Remote Desktop כדי לגשת למחשב זה, עליך להפעיל חיבורים מרוחקים.</translation> <translation id="405887016757208221">המחשב המרוחק לא הצליח לאתחל את ההפעלה. אם הבעיה נמשכת, נסה להגדיר שוב את המארח.</translation> <translation id="4068946408131579958">כל החיבורים</translation> <translation id="409800995205263688">הערה: הגדרות המדיניות מתירות חיבורים רק בין מחשבים הנמצאים בתוך הרשת שלך.</translation> @@ -152,7 +152,7 @@ <translation id="4240294130679914010">מסיר ההתקנה של מארח Chromoting</translation> <translation id="4277463233460010382">מחשב זה מוגדר לאפשר ללקוח אחד או יותר להתחבר מבלי להזין PIN.</translation> <translation id="4277736576214464567">קוד הגישה אינו חוקי. נסה שוב.</translation> -<translation id="4361728918881830843">כדי להפעיל חיבורים מרחוק למחשב אחר, התקן את 'שולחן עבודה מרוחק של Chrome' במחשב האחר ולחץ על '<ph name="BUTTON_NAME" />'.</translation> +<translation id="4361728918881830843">כדי להפעיל חיבורים מרחוק למחשב אחר, יש להתקין את Chrome Remote Desktop במחשב האחר וללחוץ על '<ph name="BUTTON_NAME" />'.</translation> <translation id="4394049700291259645">השבת</translation> <translation id="4405930547258349619">ספריית ליבה</translation> <translation id="4430435636878359009">השבת חיבורים מרוחקים למחשב זה</translation> @@ -169,9 +169,9 @@ <translation id="4660011489602794167">הצגת מקלדת</translation> <translation id="4703302905453407178">רכיב נדרש הפסיק לפעול. דיווח על בעיה זו למפתחים.</translation> <translation id="4703799847237267011">הפעילות של Chromoting הסתיימה.</translation> -<translation id="4706355010316049867">שולחן עבודה -מרוחק -Chrome +<translation id="4706355010316049867">Chrome +Remote +Desktop גישה תמיכה מחשב @@ -196,7 +196,7 @@ כדי להפעיל את הפונקציונליות הזו, יש להציג את חלונית העדפות האבטחה והפרטיות על ידי לחיצה על הלחצן '<ph name="BUTTON_NAME" />'. אחר כך, יש לסמן את התיבה לצד '<ph name="SERVICE_SCRIPT_NAME" />'.</translation> <translation id="5064360042339518108"><ph name="HOSTNAME" /> (לא מקוון)</translation> -<translation id="5070121137485264635">המארח המרוחק דורש שתבצע אימות מול אתר של צד שלישי. כדי להמשיך, עליך להעניק לשולחן העבודה המרוחק של Chrome הרשאות נוספות כדי לגשת לכתובת זו:</translation> +<translation id="5070121137485264635">המארח המרוחק דורש לבצע אימות מול אתר של צד שלישי. כדי להמשיך, עליך להעניק ל-Chrome Remote Desktop הרשאות נוספות כדי לגשת לכתובת זו:</translation> <translation id="507204348399810022">האם אתה בטוח שברצונך להשבית את החיבורים המרוחקים אל <ph name="HOSTNAME" />?</translation> <translation id="5081343395220691640">לא ניתן לתקשר עם השרת: <ph name="ERROR" /></translation> <translation id="5156271271724754543">הזן את אותו PIN בשתי התיבות.</translation> @@ -204,12 +204,12 @@ <translation id="518094545883702183">המידע הזה משמש רק לאבחון הבעיה שדיווחת עליה. הוא זמין רק למי שבוחן את הדוח, ונשמר למשך זמן של 30 ימים לכל היותר.</translation> <translation id="5204575267916639804">שאלות נפוצות</translation> <translation id="5222676887888702881">יציאה</translation> -<translation id="5254120496627797685">יציאה מדף זה תגרום לסיום הפעילות של 'שולחן עבודה מרוחק של Chrome'.</translation> +<translation id="5254120496627797685">יציאה מדף זה תגרום לסיום הפעילות של Chrome Remote Desktop.</translation> <translation id="5308380583665731573">התחברות</translation> <translation id="533625276787323658">אין מחשבים שניתן להתחבר אליהם</translation> <translation id="5363265567587775042">בקש מבעל המחשב שאליו אתה רוצה לגשת שילחץ על “<ph name="SHARE" />” וייתן לך את קוד הגישה.</translation> -<translation id="5379087427956679853">'שולחן עבודה מרוחק של Chrome' מאפשר לך לשתף את המחשב שלך דרך האינטרנט באופן מאובטח. על שני המשתמשים להפעיל את היישום 'שולחן עבודה מרוחק של Chrome', שניתן למצוא בכתובת <ph name="URL" />.</translation> -<translation id="5397086374758643919">מסיר ההתקנה של מארח שולחן העבודה המרוחק של Chrome</translation> +<translation id="5379087427956679853">Chrome Remote Desktop מאפשר לשתף את המחשב שלך דרך האינטרנט באופן מאובטח. על שני המשתמשים להפעיל את היישום Chrome Remote Desktop, שניתן למצוא בכתובת <ph name="URL" />.</translation> +<translation id="5397086374758643919">מסיר ההתקנה של מארח Chrome Remote Desktop</translation> <translation id="5419185025274123272">לא ניתן היה לאפס את היישום. תוכל עדיין לשלוח דוח באגים.</translation> <translation id="5419418238395129586">חיבור אחרון לרשת: <ph name="DATE" /></translation> <translation id="544077782045763683">המארח כבה.</translation> @@ -233,7 +233,7 @@ <translation id="6040143037577758943">סגור</translation> <translation id="6062854958530969723">אתחול המארח נכשל.</translation> <translation id="6091564239975589852">שלח מקשים</translation> -<translation id="6099500228377758828">שירות שולחן העבודה המרוחק של Chrome</translation> +<translation id="6099500228377758828">שירות Chrome Remote Desktop</translation> <translation id="6122191549521593678">מקוון</translation> <translation id="6167788864044230298">Chrome App Streaming</translation> <translation id="6173536234069435147">איני יכול לפתוח את הקבצים שלי ב-Google Drive.</translation> @@ -271,7 +271,7 @@ <translation id="6930242544192836755">משך החיבור</translation> <translation id="6939719207673461467">הצג/הסתר מקלדת.</translation> <translation id="6944854424004126054">שחזר חלון</translation> -<translation id="6948905685698011662">שולחן העבודה המרוחק של Chrome זמין עכשיו באינטרנט. נסה את <ph name="LINK_BEGIN" />אפליקציית האינטרנט החינמית<ph name="LINK_END" />.</translation> +<translation id="6948905685698011662">Chrome Remote Desktop זמין עכשיו באינטרנט. רוצה לנסות את <ph name="LINK_BEGIN" />אפליקציית האינטרנט החינמית<ph name="LINK_END" />?.</translation> <translation id="6963936880795878952">החיבורים למחשב המרוחק חסומים באופן זמני משום שמישהו ניסה להתחבר אליו עם PIN לא חוקי. נסה שוב מאוחר יותר.</translation> <translation id="6965382102122355670">אישור</translation> <translation id="6985691951107243942">האם אתה בטוח שברצונך להשבית את החיבורים המרוחקים אל <ph name="HOSTNAME" />? אם תשנה את דעתך, יהיה עליך להיכנס למחשב זה כדי להפעיל מחדש את החיבורים.</translation> @@ -281,13 +281,13 @@ <translation id="7026930240735156896">יש להגדיר את המחשב לגישה מרחוק בהתאם להוראות</translation> <translation id="7038683108611689168">עזור לנו לשפר את Chromoting בכך שתאפשר לנו לאסוף סטטיסטיקות שימוש ודוחות קריסה.</translation> <translation id="7067321367069083429">המסך פועל כמסך מגע</translation> -<translation id="7116737094673640201">ברוכים הבאים אל שולחן העבודה המרוחק של Chrome</translation> +<translation id="7116737094673640201">ברוכים הבאים אל Chrome Remote Desktop</translation> <translation id="7144878232160441200">נסה שוב</translation> -<translation id="7149517134817561223">יישום לשליחת פקודות אל המארח של שולחן העבודה המרוחק של Chrome.</translation> +<translation id="7149517134817561223">יישום לשליחת פקודות אל המארח של Chrome Remote Desktop.</translation> <translation id="7215059001581613786">הזן PIN המורכב משש ספרות או יותר.</translation> <translation id="7312846573060934304">המארח אינו מקוון.</translation> <translation id="7319983568955948908">הפסק את השיתוף</translation> -<translation id="7401733114166276557">שולחן עבודה מרוחק של Chrome</translation> +<translation id="7401733114166276557">Chrome Remote Desktop</translation> <translation id="7434397035092923453">נדחתה גישה עבור לקוח: <ph name="CLIENT_USERNAME" />.</translation> <translation id="7444276978508498879">לקוח שהתחבר: <ph name="CLIENT_USERNAME" />.</translation> <translation id="7526139040829362392">החלף חשבון</translation> @@ -311,10 +311,10 @@ <translation id="7970576581263377361">האימות נכשל. היכנס שוב ל-Chromium.</translation> <translation id="7981525049612125370">פג התוקף של ההפעלה המרוחקת.</translation> <translation id="8041089156583427627"> שליחת משוב</translation> -<translation id="8041721485428375115">בהורדת מנהל ההתקנה של מארח שולחן העבודה המרוחק של Chrome, אתה מביע הסכמה ל<ph name="LINK_BEGIN" />תנאים ולהגבלות<ph name="LINK_END" /> של Google.</translation> +<translation id="8041721485428375115">בהורדת מנהל ההתקנה של מארח Chrome Remote Desktop, את/ה מביע/ה הסכמה ל<ph name="LINK_BEGIN" />תנאים ולהגבלות<ph name="LINK_END" /> של Google.</translation> <translation id="8060029310790625334">מרכז העזרה</translation> <translation id="806699900641041263">המערכת יוצרת התחברות אל <ph name="HOSTNAME" /></translation> -<translation id="8073845705237259513">כדי להשתמש ב'שולחן עבודה מרוחק של Chrome', עליך להוסיף חשבון Google למכשיר שלך.</translation> +<translation id="8073845705237259513">כדי להשתמש ב-Chrome Remote Desktop, עליך להוסיף חשבון Google למכשיר שלך.</translation> <translation id="80739703311984697">המארח המרוחק דורש שתבצע אימות מול אתר של צד שלישי. כדי להמשיך, עליך להעניק ל-Chromoting הרשאות נוספות כדי לגשת לכתובת זו:</translation> <translation id="809687642899217504">המחשבים שלי</translation> <translation id="811307782653349804">גש למחשב שלך מכל מקום.</translation> @@ -335,7 +335,7 @@ <translation id="8509907436388546015">תהליך השילוב של שולחנות עבודה</translation> <translation id="8513093439376855948">מארח העברת הודעות ייעודי עבור ניהול אירוח מרחוק</translation> <translation id="8525306231823319788">מסך מלא</translation> -<translation id="8548209692293300397">נכנסת בעבר כ-<ph name="USER_NAME" /> (<ph name="USER_EMAIL" />). כדי להיכנס למחשבים שלך בחשבון הזה, <ph name="LINK_BEGIN" />היכנס אל Google Chrome<ph name="LINK_END" /> עם החשבון והתקן מחדש את שולחן העבודה המרוחק של Chrome.</translation> +<translation id="8548209692293300397">נכנסת בעבר כ-<ph name="USER_NAME" /> (<ph name="USER_EMAIL" />). כדי להיכנס למחשבים שלך בחשבון הזה, <ph name="LINK_BEGIN" />יש להיכנס אל Google Chrome<ph name="LINK_END" /> עם החשבון ולהתקין מחדש את Chrome Remote Desktop.</translation> <translation id="8642984861538780905">איכות סבירה</translation> <translation id="8705151241155781642">• נוספה תמיכה ב-Android 9.0 Pie. • תמיכה בשינוי הרזולוציה של המחשב המרוחק כך שתתאים למסך של מכשיר ה-Android.</translation> @@ -347,7 +347,7 @@ <translation id="894763922177556086">איכות טובה</translation> <translation id="895780780740011433">ל-Windows מגירסה 7 ואילך</translation> <translation id="897805526397249209">כדי להפעיל חיבורים מרוחקים למחשב אחר, התקן את Chromoting במחשב האחר ולחץ על '<ph name="BUTTON_NAME" />'.</translation> -<translation id="8998327464021325874">בקר מארח שולחן העבודה המרוחק של Chrome</translation> +<translation id="8998327464021325874">בקר מארח של Chrome Remote Desktop</translation> <translation id="9016232822027372900">התחבר בכל זאת</translation> <translation id="906458777597946297">הגדל את החלון</translation> <translation id="9111855907838866522">התחברת למכשיר המרוחק שלך. כדי לפתוח את התפריט יש להקיש במסך עם ארבע אצבעות.</translation> @@ -358,7 +358,7 @@ <translation id="9213184081240281106">תצורה לא חוקית של המארח.</translation> <translation id="951991426597076286">דחה</translation> <translation id="962733587145768554">בחר באפשרות '<ph name="SHARE" />' בתיבת הדו-שיח של החיבור כדי להשלים את התהליך.</translation> -<translation id="979100198331752041">שולחן העבודה המרוחק של Chrome ב-<ph name="HOSTNAME" /> אינו מעודכן ויש לעדכן אותו.</translation> +<translation id="979100198331752041">Chrome Remote Desktop ב-<ph name="HOSTNAME" /> אינו מעודכן ויש לעדכן אותו.</translation> <translation id="981121421437150478">לא מקוון</translation> <translation id="985602178874221306">מחברי Chromium</translation> <translation id="992215271654996353"><ph name="HOSTNAME" /> (התחברות אחרונה <ph name="DATE_OR_TIME" />)</translation>
diff --git a/remoting/resources/remoting_strings_zh-CN.xtb b/remoting/resources/remoting_strings_zh-CN.xtb index 5d73f89f..708c44d4 100644 --- a/remoting/resources/remoting_strings_zh-CN.xtb +++ b/remoting/resources/remoting_strings_zh-CN.xtb
@@ -24,7 +24,7 @@ <translation id="1520828917794284345">将桌面调整为合适大小</translation> <translation id="154040539590487450">无法启动远程访问服务。</translation> <translation id="1546934824884762070">发生意外错误。请将此问题报告给开发者。</translation> -<translation id="1624185583382384493">Chrome 远程桌面现已上线。欢迎试用我们的这款<ph name="LINK_BEGIN" />网络应用<ph name="LINK_END" />,它既快捷又免费,而且添加了更多功能,包括改进了对同时使用多个显示器的支持。</translation> +<translation id="1624185583382384493">Chrome 远程桌面现已推出网页版。欢迎试用我们的这款<ph name="LINK_BEGIN" />网络应用<ph name="LINK_END" />,它既快捷又免费,而且添加了更多功能,包括更好地支持同时使用多个显示器。</translation> <translation id="1643640058022401035">如果您离开此页,那么您的 Chrome 远程访问会话就会结束。</translation> <translation id="1654128982815600832">正在对此计算机启用远程连接…</translation> <translation id="170207782578677537">无法注册此计算机。</translation> @@ -243,7 +243,7 @@ <translation id="6198252989419008588">更改 PIN</translation> <translation id="6204583485351780592"><ph name="HOSTNAME" />(已过期)</translation> <translation id="6221358653751391898">您尚未登录 Chrome。请登录,然后重试。</translation> -<translation id="6227369581881558336">Chrome 远程桌面现已上线,这款应用包含一些新功能(包括文件传输)!查看我们的这款<ph name="LINK_BEGIN" />网络应用<ph name="LINK_END" />。</translation> +<translation id="6227369581881558336">Chrome 远程桌面现已推出网页版,这款应用包含一些新功能(包括文件传输)!查看我们的这款<ph name="LINK_BEGIN" />网络应用<ph name="LINK_END" />。</translation> <translation id="6284412385303060032">在控制台逻辑屏幕运行的主机已关闭。这是为了切换到在用户特定会话中运行的主机,以便为 Curtain 模式提供支持。</translation> <translation id="629730747756840877">帐号</translation> <translation id="6304318647555713317">客户端</translation>
diff --git a/services/identity/identity_manager_impl_unittest.cc b/services/identity/identity_manager_impl_unittest.cc index 9d2c6bcf..6f947f59 100644 --- a/services/identity/identity_manager_impl_unittest.cc +++ b/services/identity/identity_manager_impl_unittest.cc
@@ -42,7 +42,7 @@ : signin_client_(&pref_service_), token_service_(&pref_service_), #if defined(OS_CHROMEOS) - signin_manager_(&signin_client_, &account_tracker_), + signin_manager_(&signin_client_, &token_service_, &account_tracker_), #else signin_manager_(&signin_client_, &token_service_,
diff --git a/services/identity/public/cpp/accounts_mutator.cc b/services/identity/public/cpp/accounts_mutator.cc index a80285a1..6fce82d9 100644 --- a/services/identity/public/cpp/accounts_mutator.cc +++ b/services/identity/public/cpp/accounts_mutator.cc
@@ -4,18 +4,10 @@ #include "services/identity/public/cpp/accounts_mutator.h" -#include "components/signin/core/browser/profile_oauth2_token_service.h" - namespace identity { -AccountsMutator::AccountsMutator(ProfileOAuth2TokenService* token_service) - : token_service_(token_service) {} +AccountsMutator::AccountsMutator(ProfileOAuth2TokenService* token_service) {} AccountsMutator::~AccountsMutator() {} -void AccountsMutator::LoadAccountsFromDisk( - const std::string& primary_account_id) { - token_service_->LoadCredentials(primary_account_id); -} - } // namespace identity
diff --git a/services/identity/public/cpp/accounts_mutator.h b/services/identity/public/cpp/accounts_mutator.h index 471be5b3..08d0dbc 100644 --- a/services/identity/public/cpp/accounts_mutator.h +++ b/services/identity/public/cpp/accounts_mutator.h
@@ -20,22 +20,7 @@ explicit AccountsMutator(ProfileOAuth2TokenService* token_service); ~AccountsMutator(); - // Loads credentials from a backing persistent store to make them available - // after service is used between profile restarts. - // - // The primary account is specified with the |primary_account_id| argument. - // For a regular profile, the primary account id comes from IdentityManager. - // For a supervised user, the id comes from SupervisedUserService. - // NOTE: In normal usage this method SHOULD NOT be called as the loading of - // accounts from disk occurs as part of the internal startup flow. The method - // is only used in production for a very small number of corner case startup - // flows. - // TODO(https://crbug.com/740117): Eliminate the need to expose this. - void LoadAccountsFromDisk(const std::string& primary_account_id); - private: - ProfileOAuth2TokenService* token_service_; - DISALLOW_COPY_AND_ASSIGN(AccountsMutator); };
diff --git a/services/identity/public/cpp/accounts_mutator_unittest.cc b/services/identity/public/cpp/accounts_mutator_unittest.cc index 36e7ffc8..0b71e1d 100644 --- a/services/identity/public/cpp/accounts_mutator_unittest.cc +++ b/services/identity/public/cpp/accounts_mutator_unittest.cc
@@ -66,17 +66,8 @@ DISALLOW_COPY_AND_ASSIGN(AccountsMutatorTest); }; -// Tests that requesting a load of accounts results in the notification -// firing that tokens were loaded. -TEST_F(AccountsMutatorTest, LoadAccountsFromDisk) { - base::RunLoop run_loop; - token_service_observer()->set_on_refresh_tokens_loaded_callback( - run_loop.QuitClosure()); - - // Load the accounts and ensure that we see the resulting notification that - // they were loaded. - accounts_mutator()->LoadAccountsFromDisk(""); - run_loop.Run(); +TEST_F(AccountsMutatorTest, Basic) { + // Should not crash. } } // namespace identity
diff --git a/services/identity/public/cpp/identity_manager.h b/services/identity/public/cpp/identity_manager.h index 5beebe4..261db311 100644 --- a/services/identity/public/cpp/identity_manager.h +++ b/services/identity/public/cpp/identity_manager.h
@@ -33,18 +33,12 @@ class UserSessionManager; } -// Necessary to declare this class as a friend. -namespace file_manager { -class MultiProfileFilesAppBrowserTest; -} - namespace network { class SharedURLLoaderFactory; } // Necessary to declare these classes as friends. class ArcSupportHostTest; -class MultiProfileDownloadNotificationTest; namespace identity { @@ -324,9 +318,6 @@ const std::string& account_id, const GoogleServiceAuthError& auth_error); - friend MultiProfileDownloadNotificationTest; - friend file_manager::MultiProfileFilesAppBrowserTest; - // These clients needs to call SetPrimaryAccountSynchronously(). friend ArcSupportHostTest; friend arc::ArcTermsOfServiceDefaultNegotiatorTest;
diff --git a/services/identity/public/cpp/identity_manager_unittest.cc b/services/identity/public/cpp/identity_manager_unittest.cc index aa3f169..8c8e31b 100644 --- a/services/identity/public/cpp/identity_manager_unittest.cc +++ b/services/identity/public/cpp/identity_manager_unittest.cc
@@ -466,7 +466,7 @@ DCHECK_EQ(account_consistency, signin::AccountConsistencyMethod::kDisabled) << "AccountConsistency is not used by SigninManagerBase"; signin_manager_ = std::make_unique<FakeSigninManagerBase>( - &signin_client_, &account_tracker_); + &signin_client_, &token_service_, &account_tracker_); #else signin_manager_ = std::make_unique<FakeSigninManager>( &signin_client_, &token_service_, &account_tracker_,
diff --git a/services/identity/public/cpp/identity_test_environment.cc b/services/identity/public/cpp/identity_test_environment.cc index 99cef72..76f8b57 100644 --- a/services/identity/public/cpp/identity_test_environment.cc +++ b/services/identity/public/cpp/identity_test_environment.cc
@@ -67,7 +67,7 @@ signin_client_(pref_service()), token_service_(pref_service()), #if defined(OS_CHROMEOS) - signin_manager_(&signin_client_, &account_tracker_) { + signin_manager_(&signin_client_, &token_service_, &account_tracker_) { #else signin_manager_(&signin_client_, &token_service_,
diff --git a/services/identity/public/cpp/primary_account_mutator_impl.cc b/services/identity/public/cpp/primary_account_mutator_impl.cc index 3b544c3..947f6ffe 100644 --- a/services/identity/public/cpp/primary_account_mutator_impl.cc +++ b/services/identity/public/cpp/primary_account_mutator_impl.cc
@@ -114,7 +114,8 @@ void PrimaryAccountMutatorImpl::LegacyCopyCredentialsFrom( const PrimaryAccountMutator& source) { - NOTIMPLEMENTED(); + signin_manager_->CopyCredentialsFrom( + *static_cast<const PrimaryAccountMutatorImpl&>(source).signin_manager_); } } // namespace identity
diff --git a/services/identity/public/cpp/primary_account_mutator_unittest.cc b/services/identity/public/cpp/primary_account_mutator_unittest.cc index e2e6b96..0ff9333 100644 --- a/services/identity/public/cpp/primary_account_mutator_unittest.cc +++ b/services/identity/public/cpp/primary_account_mutator_unittest.cc
@@ -845,3 +845,101 @@ EXPECT_EQ(identity_manager->GetPrimaryAccountId(), std::string()); EXPECT_TRUE(identity_manager->GetPrimaryAccountInfo().IsEmpty()); } + +// Checks that copying the credentials from another PrimaryAccountMutator works. +TEST_F(PrimaryAccountMutatorTest, CopyCredentialsFrom) { + base::test::ScopedTaskEnvironment task_environment; + identity::IdentityTestEnvironment environment; + + identity::IdentityManager* identity_manager = environment.identity_manager(); + identity::PrimaryAccountMutator* primary_account_mutator = + identity_manager->GetPrimaryAccountMutator(); + + // Abort the test if the current platform does not support mutation of the + // primary account (the returned PrimaryAccountMutator* will be null). + if (!primary_account_mutator) + return; + + // We will need another PrimaryAccountMutator to copy the credentials from the + // one used previously and check that they match later on. + identity::IdentityTestEnvironment other_environment; + identity::IdentityManager* other_identity_manager = + other_environment.identity_manager(); + identity::PrimaryAccountMutator* other_primary_account_mutator = + other_identity_manager->GetPrimaryAccountMutator(); + + AccountInfo account_info = + environment.MakeAccountAvailable(kPrimaryAccountEmail); + + // Start a signin process for the account we just made available so that we + // can check whether the credentials copied to another PrimaryAccountMutator. + base::RunLoop run_loop; + std::string signed_account_refresh_token; + primary_account_mutator->LegacyStartSigninWithRefreshTokenForPrimaryAccount( + kRefreshToken, account_info.gaia, account_info.email, kPassword, + base::BindOnce( + [](std::string* out_refresh_token, const std::string& refresh_token) { + *out_refresh_token = refresh_token; + }, + base::Unretained(&signed_account_refresh_token))); + run_loop.RunUntilIdle(); + + // The refresh token assigned to the account should match the one passed. + EXPECT_EQ(signed_account_refresh_token, kRefreshToken); + + // This is a good moment to copy the credentials from one mutator to the other + // since internal transient data hold by the SigninManager in this state will + // be non-empty while the authentication process is ongoing (e.g. possibly + // invalid account ID, Gaia ID and email), allowing us to compare values. + base::RunLoop run_loop2; + other_primary_account_mutator->LegacyCopyCredentialsFrom( + *primary_account_mutator); + run_loop2.RunUntilIdle(); + + EXPECT_TRUE(primary_account_mutator->LegacyIsPrimaryAccountAuthInProgress()); + EXPECT_TRUE( + other_primary_account_mutator->LegacyIsPrimaryAccountAuthInProgress()); + + AccountInfo auth_in_progress_account_info = + primary_account_mutator->LegacyPrimaryAccountForAuthInProgress(); + AccountInfo other_auth_in_progress_account_info = + other_primary_account_mutator->LegacyPrimaryAccountForAuthInProgress(); + + EXPECT_FALSE(auth_in_progress_account_info.IsEmpty()); + EXPECT_FALSE(other_auth_in_progress_account_info.IsEmpty()); + + EXPECT_EQ(auth_in_progress_account_info.account_id, + other_auth_in_progress_account_info.account_id); + EXPECT_EQ(auth_in_progress_account_info.gaia, + other_auth_in_progress_account_info.gaia); + EXPECT_EQ(auth_in_progress_account_info.email, + other_auth_in_progress_account_info.email); + + // Finally, complete the signin process so that we can do further checks. + base::RunLoop run_loop3; + primary_account_mutator->LegacyCompletePendingPrimaryAccountSignin(); + run_loop3.RunUntilIdle(); + + // An account has been authenticated now, so there should be a primary account + // authenticated and no authentication process reported as in progress now. + EXPECT_TRUE(identity_manager->HasPrimaryAccount()); + EXPECT_FALSE(primary_account_mutator->LegacyIsPrimaryAccountAuthInProgress()); + + // Query again the information for each of the two different environments now + // that the original one has completed the authentication process and compare + // them one more time: they should not match as the original one is no longer + // in the middle of the authentication process. + EXPECT_TRUE(identity_manager->HasPrimaryAccount()); + EXPECT_FALSE(other_identity_manager->HasPrimaryAccount()); + + EXPECT_FALSE(primary_account_mutator->LegacyIsPrimaryAccountAuthInProgress()); + EXPECT_TRUE( + other_primary_account_mutator->LegacyIsPrimaryAccountAuthInProgress()); + + auth_in_progress_account_info = + primary_account_mutator->LegacyPrimaryAccountForAuthInProgress(); + other_auth_in_progress_account_info = + other_primary_account_mutator->LegacyPrimaryAccountForAuthInProgress(); + EXPECT_TRUE(auth_in_progress_account_info.IsEmpty()); + EXPECT_FALSE(other_auth_in_progress_account_info.IsEmpty()); +}
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 26d273b3..e0d65be 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -590,27 +590,6 @@ ] } ], - "AutofillDeleteDisusedData": [ - { - "platforms": [ - "android", - "chromeos", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillDeleteDisusedAddresses", - "AutofillDeleteDisusedCreditCards" - ] - } - ] - } - ], "AutofillDropdownLayout": [ { "platforms": [ @@ -803,26 +782,6 @@ ] } ], - "AutofillResetFullServerCardsOnAuthError": [ - { - "platforms": [ - "android", - "chromeos", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillResetFullServerCardsOnAuthError" - ] - } - ] - } - ], "AutofillSingleClick": [ { "platforms": [ @@ -959,22 +918,6 @@ ] } ], - "AutofillUpstreamUseGooglePayOnAndroidBranding": [ - { - "platforms": [ - "android", - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillUpstreamUseGooglePayOnAndroidBranding" - ] - } - ] - } - ], "AutomaticTabDiscarding": [ { "platforms": [
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index f68b4a3..efc254b 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -9,6 +9,7 @@ # are typemapped to a type in renderer/core. mojom("mojom_platform") { sources = [ + "ad_tagging/ad_frame.mojom", "array_buffer/array_buffer_contents.mojom", "associated_interfaces/associated_interfaces.mojom", "background_fetch/background_fetch.mojom",
diff --git a/components/subresource_filter/mojom/OWNERS b/third_party/blink/public/mojom/ad_tagging/OWNERS similarity index 100% copy from components/subresource_filter/mojom/OWNERS copy to third_party/blink/public/mojom/ad_tagging/OWNERS
diff --git a/third_party/blink/public/mojom/ad_tagging/ad_frame.mojom b/third_party/blink/public/mojom/ad_tagging/ad_frame.mojom new file mode 100644 index 0000000..efa9971 --- /dev/null +++ b/third_party/blink/public/mojom/ad_tagging/ad_frame.mojom
@@ -0,0 +1,16 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module blink.mojom; + +// Enumeration of ad frame types. +enum AdFrameType { + // Frame is not an ad. + kNonAd, + // Frame is an ad whose parent frame is an ad. + kChildAd, + // Frame is an ad whose parent frame is not an ad. + kRootAd +}; +
diff --git a/third_party/blink/public/platform/modules/insecure_input/insecure_input_service.mojom b/third_party/blink/public/platform/modules/insecure_input/insecure_input_service.mojom index 424b8f4..3ee3591 100644 --- a/third_party/blink/public/platform/modules/insecure_input/insecure_input_service.mojom +++ b/third_party/blink/public/platform/modules/insecure_input/insecure_input_service.mojom
@@ -5,9 +5,7 @@ module blink.mojom; // InsecureInputService receives per-frame notifications about insecure input -// operations (display of password fields, editing of any fields) on the page. +// operations (e.g. editing of any fields) on the page. interface InsecureInputService { - PasswordFieldVisibleInInsecureContext(); - AllPasswordFieldsInInsecureContextInvisible(); DidEditFieldInInsecureContext(); };
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h index 0e6895b..2db0a75 100644 --- a/third_party/blink/public/web/web_local_frame.h +++ b/third_party/blink/public/web/web_local_frame.h
@@ -12,6 +12,7 @@ #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" #include "third_party/blink/public/common/feature_policy/feature_policy.h" #include "third_party/blink/public/common/frame/sandbox_flags.h" +#include "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom-shared.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_focus_type.h" @@ -718,7 +719,7 @@ // This setter is available in case the embedder has more information about // whether or not the frame is an ad. - virtual void SetIsAdSubframe() = 0; + virtual void SetIsAdSubframe(blink::mojom::AdFrameType ad_frame_type) = 0; // Testing ------------------------------------------------------------------
diff --git a/third_party/blink/renderer/bindings/core/v8/BUILD.gn b/third_party/blink/renderer/bindings/core/v8/BUILD.gn index 4096585..b68f5066 100644 --- a/third_party/blink/renderer/bindings/core/v8/BUILD.gn +++ b/third_party/blink/renderer/bindings/core/v8/BUILD.gn
@@ -150,8 +150,6 @@ "$bindings_core_v8_output_dir/v8_custom_element_form_associated_callback.h", "$bindings_core_v8_output_dir/v8_custom_element_value_setter.cc", "$bindings_core_v8_output_dir/v8_custom_element_value_setter.h", - "$bindings_core_v8_output_dir/v8_display_lock_callback.cc", - "$bindings_core_v8_output_dir/v8_display_lock_callback.h", "$bindings_core_v8_output_dir/v8_event_handler_non_null.cc", "$bindings_core_v8_output_dir/v8_event_handler_non_null.h", "$bindings_core_v8_output_dir/v8_frame_request_callback.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.cc index f00ecd5..db31c69 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.cc
@@ -15,7 +15,7 @@ namespace blink { ScriptPromiseResolver::ScriptPromiseResolver(ScriptState* script_state) - : PausableObject(ExecutionContext::From(script_state)), + : ContextLifecycleObserver(ExecutionContext::From(script_state)), state_(kPending), script_state_(script_state), resolver_(script_state) { @@ -25,8 +25,8 @@ } } -#if DCHECK_IS_ON() ScriptPromiseResolver::~ScriptPromiseResolver() { +#if DCHECK_IS_ON() // This is here temporarily to make it easier to track down which promise // resolvers are being abandoned. // TODO(crbug.com/873980): Remove this. @@ -41,8 +41,8 @@ DCHECK(state_ == kDetached || !is_promise_called_ || !GetScriptState()->ContextIsValid() || !GetExecutionContext() || GetExecutionContext()->IsContextDestroyed()); -} #endif +} void ScriptPromiseResolver::Reject(ExceptionState& exception_state) { DCHECK(exception_state.HadException()); @@ -50,15 +50,6 @@ exception_state.ClearException(); } -void ScriptPromiseResolver::Pause() { - deferred_resolve_task_.Cancel(); -} - -void ScriptPromiseResolver::Unpause() { - if (state_ == kResolving || state_ == kRejecting) - ScheduleResolveOrReject(); -} - void ScriptPromiseResolver::Detach() { if (state_ == kDetached) return; @@ -115,7 +106,7 @@ void ScriptPromiseResolver::Trace(blink::Visitor* visitor) { visitor->Trace(script_state_); - PausableObject::Trace(visitor); + ContextLifecycleObserver::Trace(visitor); } } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h index f6df6136..1b247be6 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h +++ b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h
@@ -8,7 +8,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_for_core.h" #include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/dom/pausable_object.h" +#include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/platform/bindings/scoped_persistent.h" #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" @@ -28,37 +28,32 @@ // functionalities. // - A ScriptPromiseResolver retains a ScriptState. A caller // can call resolve or reject from outside of a V8 context. -// - This class is an PausableObject and keeps track of the associated -// ExecutionContext state. When the ExecutionContext is suspended, -// resolve or reject will be delayed. When it is stopped, resolve or reject +// - This class is an ContextLifecycleObserver and keeps track of the +// associated ExecutionContext state. When it is stopped, resolve or reject // will be ignored. // // There are cases where promises cannot work (e.g., where the thread is being // terminated). In such cases operations will silently fail. class CORE_EXPORT ScriptPromiseResolver : public GarbageCollectedFinalized<ScriptPromiseResolver>, - public PausableObject { + public ContextLifecycleObserver { USING_GARBAGE_COLLECTED_MIXIN(ScriptPromiseResolver); WTF_MAKE_NONCOPYABLE(ScriptPromiseResolver); public: static ScriptPromiseResolver* Create(ScriptState* script_state) { - ScriptPromiseResolver* resolver = - MakeGarbageCollected<ScriptPromiseResolver>(script_state); - resolver->PauseIfNeeded(); - return resolver; + return MakeGarbageCollected<ScriptPromiseResolver>(script_state); } // You need to call suspendIfNeeded after the construction because // this is an PausableObject. explicit ScriptPromiseResolver(ScriptState*); + virtual ~ScriptPromiseResolver(); #if DCHECK_IS_ON() // Eagerly finalized so as to ensure valid access to getExecutionContext() // from the destructor's assert. EAGERLY_FINALIZE(); - - ~ScriptPromiseResolver() override; #endif // Anything that can be passed to toV8 can be passed to this function. @@ -90,9 +85,7 @@ return resolver_.Promise(); } - // PausableObject implementation. - void Pause() override; - void Unpause() override; + // ContextLifecycleObserver implementation. void ContextDestroyed(ExecutionContext*) override { Detach(); } // Calling this function makes the resolver release its internal resources. @@ -140,8 +133,7 @@ } if (GetExecutionContext()->IsContextPaused()) { - // Retain this object until it is actually resolved or rejected. - KeepAliveWhilePending(); + ScheduleResolveOrReject(); return; } // TODO(esprehn): This is a hack, instead we should CHECK that
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc index 45a9cc0e..901c64be 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc
@@ -202,10 +202,7 @@ class ScriptPromiseResolverKeepAlive : public ScriptPromiseResolver { public: static ScriptPromiseResolverKeepAlive* Create(ScriptState* script_state) { - ScriptPromiseResolverKeepAlive* resolver = - MakeGarbageCollected<ScriptPromiseResolverKeepAlive>(script_state); - resolver->PauseIfNeeded(); - return resolver; + return MakeGarbageCollected<ScriptPromiseResolverKeepAlive>(script_state); } explicit ScriptPromiseResolverKeepAlive(ScriptState* script_state)
diff --git a/third_party/blink/renderer/controller/oom_intervention_impl_test.cc b/third_party/blink/renderer/controller/oom_intervention_impl_test.cc index be70356..8aa10b35 100644 --- a/third_party/blink/renderer/controller/oom_intervention_impl_test.cc +++ b/third_party/blink/renderer/controller/oom_intervention_impl_test.cc
@@ -290,7 +290,7 @@ WebString::FromUTF8("non-ad")); LocalFrame* local_adframe = ToLocalFrame(WebFrame::ToCoreFrame(*ad_iframe)); - local_adframe->SetIsAdSubframe(); + local_adframe->SetIsAdSubframe(blink::mojom::AdFrameType::kRootAd); LocalFrame* local_non_adframe = ToLocalFrame(WebFrame::ToCoreFrame(*non_ad_iframe));
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index a127d8ee..25fadd3 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1797,7 +1797,6 @@ "css/threaded/font_object_threaded_test.cc", "css/threaded/text_renderer_threaded_test.cc", "display_lock/display_lock_budget_test.cc", - "display_lock/display_lock_context_test.cc", "dom/attr_test.cc", "dom/document_statistics_collector_test.cc", "dom/document_test.cc",
diff --git a/third_party/blink/renderer/core/DEPS b/third_party/blink/renderer/core/DEPS index 3fa0d9eb7..603085f 100644 --- a/third_party/blink/renderer/core/DEPS +++ b/third_party/blink/renderer/core/DEPS
@@ -90,7 +90,4 @@ "find_task_controller.cc" : [ "+third_party/blink/renderer/core/frame/web_local_frame_impl.h", ], - "display_lock_context_test.cc" : [ - "+base/run_loop.h" - ], }
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni index f2de8ad..994710a5 100644 --- a/third_party/blink/renderer/core/core_idl_files.gni +++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -102,7 +102,6 @@ "css/cssom/style_property_map.idl", "css/cssom/style_property_map_read_only.idl", "display_lock/display_lock_context.idl", - "display_lock/display_lock_suspended_handle.idl", "dom/abort_controller.idl", "dom/abort_signal.idl", "dom/attr.idl", @@ -611,6 +610,7 @@ "dom/events/event_init.idl", "dom/events/event_listener_options.idl", "dom/events/event_modifier_init.idl", + "display_lock/display_lock_options.idl", "events/animation_event_init.idl", "events/animation_playback_event_init.idl", "events/application_cache_error_event_init.idl",
diff --git a/third_party/blink/renderer/core/display_lock/BUILD.gn b/third_party/blink/renderer/core/display_lock/BUILD.gn index 7a6b0bc..73e6b23 100644 --- a/third_party/blink/renderer/core/display_lock/BUILD.gn +++ b/third_party/blink/renderer/core/display_lock/BUILD.gn
@@ -10,8 +10,6 @@ "display_lock_budget.h", "display_lock_context.cc", "display_lock_context.h", - "display_lock_suspended_handle.cc", - "display_lock_suspended_handle.h", "strict_yielding_display_lock_budget.cc", "strict_yielding_display_lock_budget.h", "unyielding_display_lock_budget.cc",
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc index b2032ff4..a7dd5a5 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
@@ -5,7 +5,6 @@ #include "third_party/blink/renderer/core/display_lock/display_lock_budget.h" #include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_display_lock_callback.h" #include "third_party/blink/renderer/core/display_lock/display_lock_context.h" #include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h" #include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h" @@ -33,29 +32,13 @@ base::Optional<RuntimeEnabledFeatures::Backup> features_backup_; }; -class BudgetTestEmptyFunction : public ScriptFunction { - public: - static v8::Local<v8::Function> Create(ScriptState* script_state) { - auto* callback = - MakeGarbageCollected<BudgetTestEmptyFunction>(script_state); - return callback->BindToV8Function(); - } - - BudgetTestEmptyFunction(ScriptState* script_state) - : ScriptFunction(script_state) {} - - ScriptValue Call(ScriptValue value) final { return value; } -}; - TEST_F(DisplayLockBudgetTest, UnyieldingBudget) { WeakPersistent<Element> element = GetDocument().CreateRawElement(html_names::kDivTag); { auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame()); ScriptState::Scope scope(script_state); - element->acquireDisplayLock( - script_state, V8DisplayLockCallback::Create( - BudgetTestEmptyFunction::Create(script_state))); + element->getDisplayLockForBindings()->acquire(script_state, nullptr); } ASSERT_TRUE(element->GetDisplayLockContext()); @@ -82,9 +65,7 @@ { auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame()); ScriptState::Scope scope(script_state); - element->acquireDisplayLock( - script_state, V8DisplayLockCallback::Create( - BudgetTestEmptyFunction::Create(script_state))); + element->getDisplayLockForBindings()->acquire(script_state, nullptr); } ASSERT_TRUE(element->GetDisplayLockContext());
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 4d0c542..5a1b52fd 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -4,8 +4,8 @@ #include "third_party/blink/renderer/core/display_lock/display_lock_context.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_display_lock_callback.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.h" +#include "base/memory/ptr_util.h" +#include "third_party/blink/renderer/core/display_lock/display_lock_options.h" #include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h" #include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -21,110 +21,110 @@ namespace blink { -DisplayLockContext::BudgetType DisplayLockContext::s_budget_type_ = - DisplayLockContext::BudgetType::kDefault; +namespace { +// The default timeout for the lock if a timeout is not specified. Defaults to 1 +// sec. +double kDefaultLockTimeoutMs = 1000.; + +// Helper function that resolves the given promise. Used to delay a resolution +// to be in a task queue. +void ResolvePromise(ScriptPromiseResolver* resolver) { + resolver->Resolve(); +} + +// Helper function that returns an immediately rejected promise. +ScriptPromise GetRejectedPromise(ScriptState* script_state) { + auto* resolver = ScriptPromiseResolver::Create(script_state); + auto promise = resolver->Promise(); + resolver->Reject(); + return promise; +} + +// Helper function that returns an immediately resolved promise. +ScriptPromise GetResolvedPromise(ScriptState* script_state) { + auto* resolver = ScriptPromiseResolver::Create(script_state); + auto promise = resolver->Promise(); + resolver->Resolve(); + return promise; +} + +} // namespace DisplayLockContext::DisplayLockContext(Element* element, ExecutionContext* context) : ContextLifecycleObserver(context), element_(element), - weak_element_handle_(element) { + weak_factory_(this) { DCHECK(element_->GetDocument().View()); element_->GetDocument().View()->RegisterForLifecycleNotifications(this); } DisplayLockContext::~DisplayLockContext() { - DCHECK(state_ == kResolved || state_ == kSuspended) << state_; - DCHECK(callbacks_.IsEmpty()); + DCHECK_EQ(state_, kUnlocked); } void DisplayLockContext::Trace(blink::Visitor* visitor) { - visitor->Trace(callbacks_); - visitor->Trace(resolver_); + visitor->Trace(update_resolver_); + visitor->Trace(commit_resolver_); visitor->Trace(element_); - visitor->Trace(weak_element_handle_); ScriptWrappable::Trace(visitor); ActiveScriptWrappable::Trace(visitor); ContextLifecycleObserver::Trace(visitor); } void DisplayLockContext::Dispose() { - // Note that if we have a resolver_ at dispose time, then it's too late to + // Note that if we have any resolvers at dispose time, then it's too late to // reject the promise, since we are not allowed to create new strong // references to objects already set for destruction (and rejecting would do // this since the rejection has to be deferred). We need to detach instead. // TODO(vmpstr): See if there is another earlier time we can detect that we're // going to be disposed. - if (resolver_) { - resolver_->Detach(); - resolver_ = nullptr; - state_ = kResolved; - } - RejectAndCleanUp(); + FinishUpdateResolver(kDetach); + FinishCommitResolver(kDetach); + state_ = kUnlocked; + if (element_ && element_->GetDocument().View()) element_->GetDocument().View()->UnregisterFromLifecycleNotifications(this); + weak_factory_.InvalidateWeakPtrs(); } void DisplayLockContext::ContextDestroyed(ExecutionContext*) { - RejectAndCleanUp(); + FinishUpdateResolver(kReject); + FinishCommitResolver(kReject); + state_ = kUnlocked; } bool DisplayLockContext::HasPendingActivity() const { - // If we haven't resolved it, we should stick around. - // Note that if the element we're locking is gone, then we can also be GCed. - return !IsResolved() && weak_element_handle_; + // If we're locked or doing any work and have an element, then we should stay + // alive. If the element is gone, then there is no reason for the context to + // remain. Also, if we're unlocked we're essentially "idle" so GC can clean us + // up. If the script needs the context, the element would create a new one. + return element_ && state_ != kUnlocked; } -void DisplayLockContext::ScheduleCallback(V8DisplayLockCallback* callback) { - callbacks_.push_back(callback); +ScriptPromise DisplayLockContext::acquire(ScriptState* script_state, + DisplayLockOptions* options) { + // TODO(vmpstr): We don't support locking connected elements for now. + if (element_->isConnected()) + return GetRejectedPromise(script_state); - // Suspended state supercedes any new lock requests. - if (state_ == kSuspended) - return; - state_ = kCallbacksPending; + double timeout_ms = (options && options->hasTimeout()) + ? options->timeout() + : kDefaultLockTimeoutMs; + // We always reschedule a timeout task even if we're not starting a new + // acquire. The reason for this is that the last acquire dictates the timeout + // interval. Note that the following call cancels any existing timeout tasks. + RescheduleTimeoutTask(timeout_ms); - ScheduleTaskIfNeeded(); -} + // We must already be locked if we're not unlocked. + if (state_ != kUnlocked) + return GetResolvedPromise(script_state); -void DisplayLockContext::RequestLock(V8DisplayLockCallback* callback, - ScriptState* script_state) { - if (!resolver_) { - DCHECK(script_state); - resolver_ = ScriptPromiseResolver::Create(script_state); - budget_.reset(); - } - ScheduleCallback(callback); -} - -void DisplayLockContext::schedule(V8DisplayLockCallback* callback) { - DCHECK(state_ == kSuspended || state_ == kCallbacksPending); - - ScheduleCallback(callback); -} - -DisplayLockSuspendedHandle* DisplayLockContext::suspend() { - ++suspended_count_; - state_ = kSuspended; - return MakeGarbageCollected<DisplayLockSuspendedHandle>(this); -} - -Element* DisplayLockContext::lockedElement() const { - return GetElement(); -} - -void DisplayLockContext::ProcessQueue() { - // It's important to clear this before running the tasks, since the tasks can - // call ScheduleCallback() which will re-schedule a PostTask() for us to - // continue the work. - process_queue_task_scheduled_ = false; - - // This is the first operation we do on a locked subtree, and a guaranteed - // operation before we try to use it, so save off the locked_frame_rect_ here - // if we don't have one yet. - // TODO(vmpstr): In mode 1, we should add an explicit states for lock pending - // and lock acquired. + // TODO(vmpstr): This will always currently result in an empty layout rect, + // but when we handle connected elements, this will capture the current frame + // rect. if (!locked_frame_rect_) { - auto* layout_object = GetElement()->GetLayoutObject(); + auto* layout_object = element_->GetLayoutObject(); if (layout_object && layout_object->IsBox()) { locked_frame_rect_ = ToLayoutBox(layout_object)->FrameRect(); } else { @@ -132,137 +132,110 @@ } } - // If we're not in callbacks pending, then we shouldn't run anything at the - // moment. - if (state_ != kCallbacksPending) + // Since we're not connected at this point, we can lock immediately. + state_ = kLocked; + update_budget_.reset(); + return GetResolvedPromise(script_state); +} + +ScriptPromise DisplayLockContext::update(ScriptState* script_state) { + // Reject if we're unlocked. + if (state_ == kUnlocked) + return GetRejectedPromise(script_state); + + // If we have a resolver, then we're at least updating already, just return + // the same promise. + if (update_resolver_) { + DCHECK(state_ == kUpdating || state_ == kCommitting) << state_; + return update_resolver_->Promise(); + } + + update_resolver_ = ScriptPromiseResolver::Create(script_state); + // We only need to kick off an Update if we're in a locked state, all other + // states are already updating. + if (state_ == kLocked) + StartUpdate(); + return update_resolver_->Promise(); +} + +ScriptPromise DisplayLockContext::commit(ScriptState* script_state) { + // Reject if we're unlocked. + if (state_ == kUnlocked) + return GetRejectedPromise(script_state); + + // If we have a resolver, we must be committing already, just return the same + // promise. + if (commit_resolver_) { + DCHECK(state_ == kCommitting) << state_; + return commit_resolver_->Promise(); + } + + // Now that we've explicitly been requested to commit, we have cancel the + // timeout task. + CancelTimeoutTask(); + + // Note that we don't resolve the update promise here, since it should still + // finish updating before resolution. That is, calling update() and commit() + // together will still wait until the lifecycle is clean before resolving any + // of the promises. + DCHECK_NE(state_, kCommitting); + commit_resolver_ = ScriptPromiseResolver::Create(script_state); + StartCommit(); + return commit_resolver_->Promise(); +} + +void DisplayLockContext::FinishUpdateResolver(ResolverState state) { + if (!update_resolver_) return; - - // Get a local copy of all the tasks we will run. - // TODO(vmpstr): This should possibly be subject to a budget instead. - HeapVector<Member<V8DisplayLockCallback>> callbacks; - callbacks.swap(callbacks_); - - for (auto& callback : callbacks) { - DCHECK(callback); - { - // A re-implementation of InvokeAndReportException, in order for us to - // be able to query |try_catch| to determine whether or not we need to - // reject our promise. - v8::TryCatch try_catch(callback->GetIsolate()); - try_catch.SetVerbose(true); - - auto result = callback->Invoke(nullptr, this); - ALLOW_UNUSED_LOCAL(result); - if (try_catch.HasCaught()) { - RejectAndCleanUp(); - // We should run the checkpoint here, since the rejection callback (for - // the promise rejected in RejectAndCleanUp()) may modify DOM which - // should happen here, as opposed to after a potential lifecycle update - // (or whenever the next microtask checkpoint is going to happen). - Microtask::PerformCheckpoint(callback->GetIsolate()); - return; - } - } + switch (state) { + case kResolve: + // In order to avoid script doing work as a part of the lifecycle update, + // we delay the resolution to be in a task. + GetExecutionContext() + ->GetTaskRunner(TaskType::kMiscPlatformAPI) + ->PostTask(FROM_HERE, + WTF::Bind(&ResolvePromise, + WrapPersistent(update_resolver_.Get()))); + break; + case kReject: + update_resolver_->Reject(); + break; + case kDetach: + update_resolver_->Detach(); } - - if (callbacks_.IsEmpty() && state_ != kSuspended) { - if (GetElement()->isConnected()) { - StartCommit(); - } else { - MarkAsDisconnected(); - } - } + update_resolver_ = nullptr; } -void DisplayLockContext::RejectAndCleanUp() { - if (resolver_) { - state_ = kResolved; - resolver_->Reject(); - resolver_ = nullptr; - budget_.reset(); - } - callbacks_.clear(); - locked_frame_rect_.reset(); - - // We may have a dirty subtree and have not propagated the dirty bit up the - // ancestor tree. Since we're now rejecting the promise and unlocking the - // element, ensure that we can reach the element in all of the phases. - if (weak_element_handle_) { - MarkAncestorsForStyleRecalcIfNeeded(); - MarkAncestorsForLayoutIfNeeded(); - MarkAncestorsForPaintInvalidationCheckIfNeeded(); - MarkPaintLayerNeedsRepaint(); - } -} - -void DisplayLockContext::Resume() { - DCHECK_GT(suspended_count_, 0u); - DCHECK_EQ(state_, kSuspended); - if (--suspended_count_ == 0) { - // When becoming unsuspended here are the possible transitions: - // - If there are callbacks to run, then pending callbacks - // - If we're not connected, then we're soft suspended, ie disconnected. - // - Otherwise, we can start committing. - if (!callbacks_.IsEmpty()) { - state_ = kCallbacksPending; - } else if (GetElement()->isConnected()) { - StartCommit(); - } else { - MarkAsDisconnected(); - } - } - ScheduleTaskIfNeeded(); -} - -void DisplayLockContext::NotifyWillNotResume() { - DCHECK_GT(suspended_count_, 0u); - // The promise will never reject or resolve since we're now indefinitely - // suspended. - // TODO(vmpstr): We should probably issue a console warning. - // We keep the state as suspended. - DCHECK_EQ(state_, kSuspended); - resolver_->Detach(); - resolver_ = nullptr; - element_ = nullptr; -} - -void DisplayLockContext::ScheduleTaskIfNeeded() { - if (state_ != kCallbacksPending || process_queue_task_scheduled_) +void DisplayLockContext::FinishCommitResolver(ResolverState state) { + if (!commit_resolver_) return; - - DCHECK(GetExecutionContext()); - DCHECK(GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI)); - GetExecutionContext() - ->GetTaskRunner(TaskType::kMiscPlatformAPI) - ->PostTask(FROM_HERE, WTF::Bind(&DisplayLockContext::ProcessQueue, - WrapWeakPersistent(this))); - process_queue_task_scheduled_ = true; -} - -void DisplayLockContext::NotifyConnectedMayHaveChanged() { - if (GetElement()->isConnected()) { - if (state_ == kDisconnected) - StartCommit(); - // Now that we're connected, we can hold a strong reference. See comment on - // |element_| in the header. - element_ = weak_element_handle_; - return; + switch (state) { + case kResolve: + // In order to avoid script doing work as a part of the lifecycle update, + // we delay the resolution to be in a task. + GetExecutionContext() + ->GetTaskRunner(TaskType::kMiscPlatformAPI) + ->PostTask(FROM_HERE, + WTF::Bind(&ResolvePromise, + WrapPersistent(commit_resolver_.Get()))); + break; + case kReject: + commit_resolver_->Reject(); + break; + case kDetach: + commit_resolver_->Detach(); } - // All other states should remain as they are. Specifically, if we're - // acquiring the lock then we should finish doing so; if we're resolving, then - // we should finish that as well. - if (state_ == kCommitting) - MarkAsDisconnected(); + commit_resolver_ = nullptr; } bool DisplayLockContext::ShouldStyle() const { - return update_forced_ || state_ > kCommitting || - (state_ == kCommitting && - budget_->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); + return update_forced_ || state_ > kUpdating || + (state_ == kUpdating && + update_budget_->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); } void DisplayLockContext::DidStyle() { - if (state_ != kCommitting && !update_forced_) + if (state_ != kCommitting && state_ != kUpdating && !update_forced_) return; // We must have contain: content for display locking. @@ -270,106 +243,104 @@ // this update to happen. Otherwise, proceeding with layout may cause // unexpected behavior. By rejecting the promise, the behavior can be detected // by script. - auto* style = GetElement()->GetComputedStyle(); + auto* style = element_->GetComputedStyle(); if (!style || !style->ContainsContent()) { - RejectAndCleanUp(); + FinishUpdateResolver(kReject); + FinishCommitResolver(kReject); + state_ = state_ == kUpdating ? kLocked : kUnlocked; return; } - if (state_ != kCommitting) - return; - - budget_->DidPerformPhase(DisplayLockBudget::Phase::kStyle); + if (state_ == kUpdating) + update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kStyle); } bool DisplayLockContext::ShouldLayout() const { - return update_forced_ || state_ > kCommitting || - (state_ == kCommitting && - budget_->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); + return update_forced_ || state_ > kUpdating || + (state_ == kUpdating && update_budget_->ShouldPerformPhase( + DisplayLockBudget::Phase::kLayout)); } void DisplayLockContext::DidLayout() { - if (state_ != kCommitting) - return; - - budget_->DidPerformPhase(DisplayLockBudget::Phase::kLayout); + if (state_ == kUpdating) + update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kLayout); } bool DisplayLockContext::ShouldPrePaint() const { - return update_forced_ || state_ > kCommitting || - (state_ == kCommitting && - budget_->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + return update_forced_ || state_ > kUpdating || + (state_ == kUpdating && update_budget_->ShouldPerformPhase( + DisplayLockBudget::Phase::kPrePaint)); } void DisplayLockContext::DidPrePaint() { - if (state_ != kCommitting) - return; + if (state_ == kUpdating) + update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - budget_->DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - - // Since we should be under containment, we should have a layer. If we don't, - // then paint might not happen and we'll never resolve. - DCHECK(GetElement()->GetLayoutObject()->HasLayer()); +#if DCHECK_IS_ON() + if (state_ == kUpdating || state_ == kCommitting) { + // Since we should be under containment, we should have a layer. If we + // don't, then paint might not happen and we'll never resolve. + DCHECK(element_->GetLayoutObject()->HasLayer()); + } +#endif } bool DisplayLockContext::ShouldPaint() const { // Note that forced updates should never require us to paint, so we don't // check |update_forced_| here. In other words, although |update_forced_| // could be true here, we still should not paint. - return state_ > kCommitting || - (state_ == kCommitting && - budget_->ShouldPerformPhase(DisplayLockBudget::Phase::kPaint)); + // TODO(vmpstr): I think that updating should not paint. + return state_ > kUpdating || + (state_ == kUpdating && + update_budget_->ShouldPerformPhase(DisplayLockBudget::Phase::kPaint)); } void DisplayLockContext::DidPaint() { - if (state_ != kCommitting) - return; - - budget_->DidPerformPhase(DisplayLockBudget::Phase::kPaint); - - DCHECK(resolver_); - state_ = kResolving; - resolver_->Resolve(); - resolver_ = nullptr; - budget_.reset(); - - // After the above resolution callback runs (in a microtask), we should - // finish resolving if the lock was not re-acquired. - Microtask::EnqueueMicrotask(WTF::Bind(&DisplayLockContext::FinishResolution, - WrapWeakPersistent(this))); + if (state_ == kUpdating) + update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kPaint); } void DisplayLockContext::DidAttachLayoutTree() { + if (state_ == kUnlocked) + return; // Note that although we checked at style recalc time that the element has // "contain: content", it might not actually apply the containment (e.g. see // ShouldApplyContentContainment()). This confirms that containment should // apply. - auto* layout_object = GetElement()->GetLayoutObject(); - if (!layout_object || !layout_object->ShouldApplyContentContainment()) - RejectAndCleanUp(); + auto* layout_object = element_->GetLayoutObject(); + if (!layout_object || !layout_object->ShouldApplyContentContainment()) { + FinishUpdateResolver(kReject); + FinishCommitResolver(kReject); + state_ = state_ == kUpdating ? kLocked : kUnlocked; + } } DisplayLockContext::ScopedPendingFrameRect DisplayLockContext::GetScopedPendingFrameRect() { - if (IsResolved()) + if (state_ >= kCommitting) return ScopedPendingFrameRect(nullptr); - DCHECK(GetElement()->GetLayoutObject() && GetElement()->GetLayoutBox()); - GetElement()->GetLayoutBox()->SetFrameRectForDisplayLock(pending_frame_rect_); + + DCHECK(element_->GetLayoutObject() && element_->GetLayoutBox()); + element_->GetLayoutBox()->SetFrameRectForDisplayLock(pending_frame_rect_); return ScopedPendingFrameRect(this); } void DisplayLockContext::NotifyPendingFrameRectScopeEnded() { - DCHECK(GetElement()->GetLayoutObject() && GetElement()->GetLayoutBox()); + DCHECK(element_->GetLayoutObject() && element_->GetLayoutBox()); DCHECK(locked_frame_rect_); - pending_frame_rect_ = GetElement()->GetLayoutBox()->FrameRect(); - GetElement()->GetLayoutBox()->SetFrameRectForDisplayLock(*locked_frame_rect_); + pending_frame_rect_ = element_->GetLayoutBox()->FrameRect(); + element_->GetLayoutBox()->SetFrameRectForDisplayLock(*locked_frame_rect_); } DisplayLockContext::ScopedForcedUpdate DisplayLockContext::GetScopedForcedUpdate() { + if (state_ >= kCommitting) + return ScopedForcedUpdate(nullptr); + DCHECK(!update_forced_); update_forced_ = true; + // Now that the update is forced, we should ensure that style layout, and // prepaint code can reach it via dirty bits. Note that paint isn't a part of // this, since |update_forced_| doesn't force paint to happen. See @@ -385,30 +356,33 @@ update_forced_ = false; } -void DisplayLockContext::FinishResolution() { - // If we're not resolving, then something in the promise resolution prevented - // us from proceeding (we could have been suspended or relocked). - if (state_ != kResolving) - return; - state_ = kResolved; - locked_frame_rect_.reset(); +void DisplayLockContext::StartCommit() { + DCHECK_LT(state_, kCommitting); + if (state_ != kUpdating) + ScheduleAnimation(); + state_ = kCommitting; + update_budget_.reset(); - // Update the pending frame rect if we still have a layout object. + // We're committing without a budget, so ensure we can reach style. + MarkAncestorsForStyleRecalcIfNeeded(); - // First, if the element is gone, then there's nothing to do. - if (!weak_element_handle_) + auto* layout_object = element_->GetLayoutObject(); + // We might commit without connecting, so there is no layout object yet. + if (!layout_object) return; - auto* layout_object = GetElement()->GetLayoutObject(); - // The resolution could have disconnected us, which would destroy the layout - // object. - if (!layout_object || !layout_object->IsBox()) - return; + + // Now that we know we have a layout object, we should ensure that we can + // reach the rest of the phases as well. + MarkAncestorsForLayoutIfNeeded(); + MarkAncestorsForPaintInvalidationCheckIfNeeded(); + MarkPaintLayerNeedsRepaint(); + + // We also need to commit the pending frame rect at this point. bool frame_rect_changed = ToLayoutBox(layout_object)->FrameRect() != pending_frame_rect_; + // If the frame rect hasn't actually changed then we don't need to do - // anything. - // TODO(vmpstr): Is this true? What about things like paint? This also needs - // to be updated if there are more "stashed" things. + // anything. Other than wait for commit to happen if (!frame_rect_changed) return; @@ -418,26 +392,41 @@ ToLayoutBox(layout_object)->SetFrameRect(pending_frame_rect_); layout_object->SetNeedsLayout( layout_invalidation_reason::kDisplayLockCommitting); +} + +void DisplayLockContext::StartUpdate() { + DCHECK_EQ(state_, kLocked); + state_ = kUpdating; + // We don't need to mark anything dirty since the budget will take care of + // that for us. + update_budget_ = CreateNewBudget(); ScheduleAnimation(); } -void DisplayLockContext::StartCommit() { - state_ = kCommitting; - ResetNewBudget(); - ScheduleAnimation(); +std::unique_ptr<DisplayLockBudget> DisplayLockContext::CreateNewBudget() { + switch (BudgetType::kDefault) { + case BudgetType::kDoNotYield: + return base::WrapUnique(new UnyieldingDisplayLockBudget(this)); + case BudgetType::kStrictYieldBetweenLifecyclePhases: + return base::WrapUnique(new StrictYieldingDisplayLockBudget(this)); + case BudgetType::kYieldBetweenLifecyclePhases: + NOTIMPLEMENTED(); + return nullptr; + } + NOTREACHED(); + return nullptr; } bool DisplayLockContext::MarkAncestorsForStyleRecalcIfNeeded() { - if (GetElement()->NeedsStyleRecalc() || - GetElement()->ChildNeedsStyleRecalc()) { - GetElement()->MarkAncestorsWithChildNeedsStyleRecalc(); + if (element_->NeedsStyleRecalc() || element_->ChildNeedsStyleRecalc()) { + element_->MarkAncestorsWithChildNeedsStyleRecalc(); return true; } return false; } bool DisplayLockContext::MarkAncestorsForLayoutIfNeeded() { - if (auto* layout_object = GetElement()->GetLayoutObject()) { + if (auto* layout_object = element_->GetLayoutObject()) { if (layout_object->NeedsLayout()) { layout_object->MarkContainerChainForLayout(); return true; @@ -447,7 +436,7 @@ } bool DisplayLockContext::MarkAncestorsForPaintInvalidationCheckIfNeeded() { - if (auto* layout_object = GetElement()->GetLayoutObject()) { + if (auto* layout_object = element_->GetLayoutObject()) { if (layout_object->Parent() && (layout_object->ShouldCheckForPaintInvalidation() || layout_object->SubtreeShouldCheckForPaintInvalidation())) { @@ -459,36 +448,16 @@ } bool DisplayLockContext::MarkPaintLayerNeedsRepaint() { - if (auto* layout_object = GetElement()->GetLayoutObject()) { + if (auto* layout_object = element_->GetLayoutObject()) { layout_object->PaintingLayer()->SetNeedsRepaint(); return true; } return false; } -void DisplayLockContext::MarkAsDisconnected() { - state_ = kDisconnected; - // Let go of the strong reference to the element, allowing it to be GCed. See - // the comment on |element_| in the header. - element_ = nullptr; -} - -void DisplayLockContext::ResetNewBudget() { - switch (s_budget_type_) { - case BudgetType::kDoNotYield: - budget_.reset(new UnyieldingDisplayLockBudget(this)); - return; - case BudgetType::kStrictYieldBetweenLifecyclePhases: - budget_.reset(new StrictYieldingDisplayLockBudget(this)); - return; - case BudgetType::kYieldBetweenLifecyclePhases: - NOTIMPLEMENTED(); - return; - } - NOTREACHED(); -} - void DisplayLockContext::DidMoveToNewDocument(Document& old_document) { + // Since we're observing the lifecycle updates, ensure that we listen to the + // right document's view. if (old_document.View()) old_document.View()->UnregisterFromLifecycleNotifications(this); if (element_ && element_->GetDocument().View()) @@ -496,32 +465,75 @@ } void DisplayLockContext::WillStartLifecycleUpdate() { - if (state_ != kCommitting) - return; - budget_->WillStartLifecycleUpdate(); + if (state_ == kUpdating) + update_budget_->WillStartLifecycleUpdate(); } void DisplayLockContext::DidFinishLifecycleUpdate() { - if (state_ != kCommitting) + if (state_ == kCommitting) { + FinishUpdateResolver(kResolve); + FinishCommitResolver(kResolve); + state_ = kUnlocked; return; - bool needs_animation = budget_->DidFinishLifecycleUpdate(); - if (needs_animation) { + } + + if (state_ != kUpdating) + return; + + bool needs_more_work = update_budget_->DidFinishLifecycleUpdate(); + if (needs_more_work) { // Note that we post a task to schedule an animation, since rAF requests can // be ignored if they happen from within a lifecycle update. GetExecutionContext() ->GetTaskRunner(TaskType::kMiscPlatformAPI) ->PostTask(FROM_HERE, WTF::Bind(&DisplayLockContext::ScheduleAnimation, WrapWeakPersistent(this))); + return; } + + FinishUpdateResolver(kResolve); + update_budget_.reset(); + state_ = kLocked; } void DisplayLockContext::ScheduleAnimation() { // Schedule an animation to perform the lifecycle phases. - GetElement()->GetDocument().GetPage()->Animator().ScheduleVisualUpdate( - GetElement()->GetDocument().GetFrame()); + element_->GetDocument().GetPage()->Animator().ScheduleVisualUpdate( + element_->GetDocument().GetFrame()); } -// Scoped objects implementation ----------------------------------------------- +void DisplayLockContext::RescheduleTimeoutTask(double delay) { + CancelTimeoutTask(); + + if (!std::isfinite(delay)) + return; + + // Make sure the delay is at least 1ms. + delay = std::max(delay, 1.); + GetExecutionContext() + ->GetTaskRunner(TaskType::kMiscPlatformAPI) + ->PostDelayedTask(FROM_HERE, + WTF::Bind(&DisplayLockContext::TriggerTimeout, + weak_factory_.GetWeakPtr()), + TimeDelta::FromMillisecondsD(delay)); + timeout_task_is_scheduled_ = true; +} + +void DisplayLockContext::CancelTimeoutTask() { + if (!timeout_task_is_scheduled_) + return; + weak_factory_.InvalidateWeakPtrs(); + timeout_task_is_scheduled_ = false; +} + +void DisplayLockContext::TriggerTimeout() { + if (element_ && state_ < kCommitting) + StartCommit(); + timeout_task_is_scheduled_ = false; +} + +// Scoped objects implementation +// ----------------------------------------------- DisplayLockContext::ScopedPendingFrameRect::ScopedPendingFrameRect( DisplayLockContext* context)
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h index 55511fd4..efd05c3 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h
@@ -17,7 +17,7 @@ class DisplayLockSuspendedHandle; class Element; -class V8DisplayLockCallback; +class DisplayLockOptions; class DisplayLockScopedLogger; class CORE_EXPORT DisplayLockContext final : public ScriptWrappable, @@ -45,19 +45,7 @@ kDoNotYield, kStrictYieldBetweenLifecyclePhases, kYieldBetweenLifecyclePhases, - kDefault = kStrictYieldBetweenLifecyclePhases - }; - - // Conceptually the states are private, but made public for testing. - // TODO(vmpstr): Make this private and update the tests. - enum State { - kUninitialized, - kSuspended, - kCallbacksPending, - kDisconnected, - kCommitting, - kResolving, - kResolved + kDefault = kDoNotYield }; // See GetScopedPendingFrameRect() for description. @@ -97,39 +85,15 @@ // ContextLifecycleObserver overrides. void ContextDestroyed(ExecutionContext*) override; - // ActiveScriptWrappable overrides. If there is an outstanding task scheduled - // to process the callback queue, then this return true. - // TODO(vmpstr): In the future this would also be true while we're doing - // co-operative work. + // ActiveScriptWrappable overrides. This keeps the context alive as long as we + // have an element and we're not unlocked. bool HasPendingActivity() const final; - // Notify that the lock was requested. Note that for a new context, this has - // to be called first. For an existing lock, this will either extend the - // lifetime of the current lock, or start acquiring a new lock (depending on - // whether this lock is active or passive). - void RequestLock(V8DisplayLockCallback*, ScriptState*); - - // Returns true if the promise associated with this context was already - // resolved (or rejected). - bool IsResolved() const { return state_ == kResolved; } - - // Returns a ScriptPromise associated with this context. - ScriptPromise Promise() const { - DCHECK(resolver_); - return resolver_->Promise(); - } - - // Called when the connected state may have changed. - void NotifyConnectedMayHaveChanged(); - - // Rejects the associated promise if one exists, and clears the current queue. - // This effectively makes the context finalized. - void RejectAndCleanUp(); - - // JavaScript interface implementation. - void schedule(V8DisplayLockCallback*); - DisplayLockSuspendedHandle* suspend(); - Element* lockedElement() const; + // JavaScript interface implementation. See display_lock_context.idl for + // description. + ScriptPromise acquire(ScriptState*, DisplayLockOptions*); + ScriptPromise update(ScriptState*); + ScriptPromise commit(ScriptState*); // Lifecycle observation / state functions. bool ShouldStyle() const; @@ -141,6 +105,8 @@ bool ShouldPaint() const; void DidPaint(); + // Called when the layout tree is attached. This is used to verify + // containment. void DidAttachLayoutTree(); // Returns a ScopedPendingFrameRect object which exposes the pending layout @@ -153,13 +119,13 @@ // Returns a ScopedForcedUpdate object which for the duration of its lifetime // will allow updates to happen on this element's subtree. For the element // itself, the frame rect will still be the same as at the time the lock was - // acquired. - // Only one ScopedForcedUpdate can be retrieved from the same context at a - // time. + // acquired. Only one ScopedForcedUpdate can be retrieved from the same + // context at a time. ScopedForcedUpdate GetScopedForcedUpdate(); // This is called when the element with which this context is associated is - // moved to a new document. + // moved to a new document. Used to listen to the lifecycle update from the + // right document's view. void DidMoveToNewDocument(Document& old_document); // LifecycleNotificationObserver overrides. @@ -171,48 +137,18 @@ friend class DisplayLockSuspendedHandle; friend class DisplayLockBudget; - // Sets a new budget type. Note that since this is static, all of the existing - // locks will be affected as well (unless they already have a budget). This is - // meant to be used to set the budget type once (such as in a test), but - // technically could be used outside of tests as well to force a certain - // budget type. Use with caution. Note that if a budget already exists on the - // lock, then it will continue to use the existing budget until a new budget - // is requested. - static void SetBudgetType(BudgetType type) { - if (s_budget_type_ == type) - return; - s_budget_type_ = type; - } - - // Schedules a new callback. If this is the first callback to be scheduled, - // then a valid ScriptState must be provided, which will be used to create a - // new ScriptPromiseResolver. In other cases, the ScriptState is ignored. - void ScheduleCallback(V8DisplayLockCallback*); - - // Processes the current queue of callbacks. - void ProcessQueue(); - - // Called by the suspended handle in order to resume context operations. - void Resume(); - - // Called by the suspended handle informing us that it was disposed without - // resuming, meaning it will never resume. - void NotifyWillNotResume(); - - // Schedule a task if one is required. Specifically, this would schedule a - // task if one was not already scheduled and if we need to either process - // callbacks or to resolve the associated promise. - void ScheduleTaskIfNeeded(); - - // A function that finishes resolving the promise by establishing a microtask - // checkpoint. Note that this should be scheduled after entering the - // kResolving state. If the state is still kResolving after the microtask - // checkpoint finishes (ie, the lock was not re-acquired), we enter the final - // kResolved state. - void FinishResolution(); + // The current state of the lock. Note that the order of these matters. + enum State { + kLocked, + kUpdating, + kCommitting, + kUnlocked, + }; // Initiate a commit. void StartCommit(); + // Initiate an update. + void StartUpdate(); // The following functions propagate dirty bits from the locked element up to // the ancestors in order to be reached. They return true if the element or @@ -222,18 +158,6 @@ bool MarkAncestorsForPaintInvalidationCheckIfNeeded(); bool MarkPaintLayerNeedsRepaint(); - // Marks the display lock as being disconnected. Note that this removes the - // strong reference to the element in case the element is deleted. Once we're - // disconnected, there are will be no calls to the context until we reconnect, - // so we should allow for the element to get GCed meanwhile. - void MarkAsDisconnected(); - - // Returns the element asserting that it exists. - ALWAYS_INLINE Element* GetElement() const { - DCHECK(weak_element_handle_); - return weak_element_handle_; - } - // When ScopedPendingFrameRect is destroyed, it calls this function. See // GetScopedPendingFrameRect() for more information. void NotifyPendingFrameRectScopeEnded(); @@ -242,52 +166,44 @@ // GetScopedForcedUpdate() for more information. void NotifyForcedUpdateScopeEnded(); - // This resets the existing budget (if any) and establishes a new budget - // starting "now". - void ResetNewBudget(); + // Creates a new update budget based on the BudgetType::kDefault enum. In + // other words, it will create a budget of that type. + // TODO(vmpstr): In tests, we will probably switch the value to test other + // budgets. As well, this makes it easier to change the budget right in the + // enum definitions. + std::unique_ptr<DisplayLockBudget> CreateNewBudget(); // Helper to schedule an animation to delay lifecycle updates for the next // frame. void ScheduleAnimation(); - static BudgetType s_budget_type_; - std::unique_ptr<DisplayLockBudget> budget_; + // Timeout implementation. When the lock is acquired, we kick off a timeout + // task that will trigger a commit (which can be canceled by other calls to + // schedule or by a call to commit). Note that calling RescheduleTimeoutTask() + // will cancel any previously scheduled task. + void RescheduleTimeoutTask(double delay); + void CancelTimeoutTask(); + void TriggerTimeout(); - HeapVector<Member<V8DisplayLockCallback>> callbacks_; - Member<ScriptPromiseResolver> resolver_; + // Helper functions to resolve the update/commit promises. + enum ResolverState { kResolve, kReject, kDetach }; + void FinishUpdateResolver(ResolverState); + void FinishCommitResolver(ResolverState); - // Note that we hold both a weak and a strong reference to the element. The - // strong reference is sometimes set to nullptr, meaning that we can GC it if - // nothing else is holding a strong reference. We use weak_element_handle_ to - // detect such a case so that we don't also keep the context alive needlessly. - // - // We need a strong reference, since the element can be accessed from script - // via this context. Specifically DisplayLockContext::lockedElement() returns - // the element to script. This means that callbacks pending in the context can - // actually append the element to the tree. This means a strong reference is - // needed to prevent GC from destroying the element. - // - // However, once we're in kDisconnected state, it means that we have no - // callbacks pending and we haven't been connected to the DOM tree. It's also - // possible that the script has lost the reference to the locked element. This - // means the element should be GCed, so we need to let go of the strong - // reference. If we don't, we can cause a leak of an element and a display - // lock context. - // - // In case the script did not lose the element handle and will connect it in - // the future, we do retain a weak handle. We also use the weak handle to - // check if the element was destroyed for the purposes of allowing this - // context to be GCed as well. - Member<Element> element_; - WeakMember<Element> weak_element_handle_; + std::unique_ptr<DisplayLockBudget> update_budget_; - unsigned suspended_count_ = 0; - State state_ = kUninitialized; + Member<ScriptPromiseResolver> commit_resolver_; + Member<ScriptPromiseResolver> update_resolver_; + WeakMember<Element> element_; + + State state_ = kUnlocked; LayoutRect pending_frame_rect_; base::Optional<LayoutRect> locked_frame_rect_; - bool process_queue_task_scheduled_ = false; bool update_forced_ = false; + bool timeout_task_is_scheduled_ = false; + + base::WeakPtrFactory<DisplayLockContext> weak_factory_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.idl b/third_party/blink/renderer/core/display_lock/display_lock_context.idl index 40cd8b5e..2e34af83b 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.idl +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.idl
@@ -2,20 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -[RuntimeEnabled=DisplayLocking] -callback DisplayLockCallback = void(DisplayLockContext context); - [RuntimeEnabled=DisplayLocking, ActiveScriptWrappable] interface DisplayLockContext { - // Schedule continuation work for this context. Multiple calls are allowed and - // will run in the order scheduled. - void schedule(DisplayLockCallback callback); + // Acquires a display lock (possibly asynchronously) with the given options. + // Returns a promise that resolves when the lock is acquired. + [CallWith=ScriptState] Promise<any> acquire(optional DisplayLockOptions options); - // Suspend the context, preventing the lock from being released. Multiple - // calls to suspend are allowed: in order to resume the context, resume() must - // be called on each of the returned DisplayLockSuspendedHandles. - DisplayLockSuspendedHandle suspend(); + // Causes co-operative updates to happen on the locked subtree. + // Returns a promise that resolves when the update is finished. + [CallWith=ScriptState] Promise<any> update(); - // Represents the element on which this locked has been acquired. - [SameObject, Affects=Nothing] readonly attribute Element lockedElement; + // Commits the locked subtree, which releases the lock and updates any + // necessary lifecycle phases. + // Returns a promise that resolves when the commit is finished. + [CallWith=ScriptState] Promise<any> commit(); };
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc deleted file mode 100644 index ac8385db..0000000 --- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc +++ /dev/null
@@ -1,98 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/display_lock/display_lock_context.h" - -#include "base/run_loop.h" -#include "third_party/blink/renderer/bindings/core/v8/script_function.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_display_lock_callback.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h" -#include "third_party/blink/renderer/core/html_names.h" -#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" - -namespace blink { - -class DisplayLockContextTest : public RenderingTest { - public: - void SetUp() override { - RenderingTest::SetUp(); - features_backup_.emplace(); - RuntimeEnabledFeatures::SetDisplayLockingEnabled(true); - } - - void TearDown() override { - if (features_backup_) { - features_backup_->Restore(); - features_backup_.reset(); - } - } - - static void RunPendingTasks() { - base::RunLoop run_loop; - Thread::Current()->GetTaskRunner()->PostTask( - FROM_HERE, run_loop.QuitWhenIdleClosure()); - run_loop.Run(); - } - - DisplayLockContext::State ContextState(DisplayLockContext* context) const { - return context->state_; - } - - private: - base::Optional<RuntimeEnabledFeatures::Backup> features_backup_; -}; - -class ContextTestEmptyFunction : public ScriptFunction { - public: - static v8::Local<v8::Function> Create(ScriptState* script_state) { - auto* callback = - MakeGarbageCollected<ContextTestEmptyFunction>(script_state); - return callback->BindToV8Function(); - } - - ContextTestEmptyFunction(ScriptState* script_state) - : ScriptFunction(script_state) {} - - ScriptValue Call(ScriptValue value) final { return value; } -}; - -TEST_F(DisplayLockContextTest, ContextCleanedUpWhenElementDestroyed) { - GetDocument().GetFrame()->GetSettings()->SetScriptEnabled(true); - - WeakPersistent<Element> element = - GetDocument().CreateRawElement(html_names::kDivTag); - - ScriptPromise script_promise; - { - auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame()); - ScriptState::Scope scope(script_state); - script_promise = element->acquireDisplayLock( - script_state, V8DisplayLockCallback::Create( - ContextTestEmptyFunction::Create(script_state))); - } - WeakPersistent<DisplayLockContext> context = element->GetDisplayLockContext(); - ASSERT_TRUE(context); - - // Ensure we get to the disconnected state. - RunPendingTasks(); - EXPECT_EQ(ContextState(context), DisplayLockContext::kDisconnected); - - // This should be able to clean up the element. - ThreadState::Current()->CollectAllGarbage(); - EXPECT_FALSE(element); - - // Now that the element is gone, HasPendingActivity should return false for - // the context. - EXPECT_FALSE(context->HasPendingActivity()); - - // That means the following garbage collection should be able to clean up the - // context. - V8GCController::CollectAllGarbageForTesting( - v8::Isolate::GetCurrent(), - v8::EmbedderHeapTracer::EmbedderStackState::kEmpty); - ThreadState::Current()->CollectAllGarbage(); - EXPECT_FALSE(context); -} -} // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.idl b/third_party/blink/renderer/core/display_lock/display_lock_options.idl similarity index 65% rename from third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.idl rename to third_party/blink/renderer/core/display_lock/display_lock_options.idl index 0b4dc90..0e5a818 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.idl +++ b/third_party/blink/renderer/core/display_lock/display_lock_options.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -[RuntimeEnabled=DisplayLocking] interface DisplayLockSuspendedHandle { - void resume(); +dictionary DisplayLockOptions { + unrestricted double timeout; };
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.cc b/third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.cc deleted file mode 100644 index 85a36b8..0000000 --- a/third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.cc +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_context.h" - -namespace blink { - -DisplayLockSuspendedHandle::DisplayLockSuspendedHandle( - DisplayLockContext* context) - : context_(context) {} - -DisplayLockSuspendedHandle::~DisplayLockSuspendedHandle() {} - -void DisplayLockSuspendedHandle::Trace(blink::Visitor* visitor) { - ScriptWrappable::Trace(visitor); - visitor->Trace(context_); -} - -void DisplayLockSuspendedHandle::Dispose() { - // If we're disposing the handle and we still have a valid reference to the - // context, it means that this handle was never resumed. In turn, this means - // that we will never resume the context. We should inform the context of - // this. - // TODO(vmpstr): It is possible that we want to resume the context on dispose, - // making gc observable from script. If that's the case, this should be - // changed to instead resume the context. - if (context_) - context_->NotifyWillNotResume(); - context_ = nullptr; -} - -void DisplayLockSuspendedHandle::resume() { - if (context_) - context_->Resume(); - context_ = nullptr; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.h b/third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.h deleted file mode 100644 index 9e96dab..0000000 --- a/third_party/blink/renderer/core/display_lock/display_lock_suspended_handle.h +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_SUSPENDED_HANDLE_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_SUSPENDED_HANDLE_H_ - -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" - -namespace blink { - -class DisplayLockContext; -class CORE_EXPORT DisplayLockSuspendedHandle final : public ScriptWrappable { - DEFINE_WRAPPERTYPEINFO(); - - public: - DisplayLockSuspendedHandle(DisplayLockContext* context); - ~DisplayLockSuspendedHandle() override; - - // GC functions. - void Trace(blink::Visitor*) override; - void Dispose(); - - // JavaScript interface implementation. - void resume(); - - private: - WeakMember<DisplayLockContext> context_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_SUSPENDED_HANDLE_H_
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 6b3f2274..340bcf15 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -687,7 +687,6 @@ has_viewport_units_(false), parser_sync_policy_(kAllowAsynchronousParsing), node_count_(0), - password_count_(0), logged_field_edit_(false), secure_context_state_(SecureContextState::kUnknown), ukm_source_id_(ukm::UkmRecorder::GetNewSourceID()), @@ -5168,30 +5167,6 @@ return *access_entry_from_url_; } -void Document::SendSensitiveInputVisibility() { - if (sensitive_input_visibility_task_.IsActive()) - return; - - sensitive_input_visibility_task_ = PostCancellableTask( - *GetTaskRunner(TaskType::kInternalLoading), FROM_HERE, - WTF::Bind(&Document::SendSensitiveInputVisibilityInternal, - WrapWeakPersistent(this))); -} - -void Document::SendSensitiveInputVisibilityInternal() { - if (!GetFrame()) - return; - - mojom::blink::InsecureInputServicePtr insecure_input_service_ptr; - GetFrame()->GetInterfaceProvider().GetInterface( - mojo::MakeRequest(&insecure_input_service_ptr)); - if (password_count_ > 0) { - insecure_input_service_ptr->PasswordFieldVisibleInInsecureContext(); - return; - } - insecure_input_service_ptr->AllPasswordFieldsInInsecureContextInvisible(); -} - void Document::SendDidEditFieldInInsecureContext() { if (!GetFrame()) return; @@ -7492,30 +7467,6 @@ return const_cast<Document*>(this)->GetPropertyRegistry(); } -void Document::IncrementPasswordCount() { - ++password_count_; - if (IsSecureContext() || password_count_ != 1) { - // The browser process only cares about passwords on pages where the - // top-level URL is not secure. Secure contexts must have a top-level - // URL that is secure, so there is no need to send notifications for - // password fields in secure contexts. - // - // Also, only send a message on the first visible password field; the - // browser process doesn't care about the presence of additional - // password fields beyond that. - return; - } - SendSensitiveInputVisibility(); -} - -void Document::DecrementPasswordCount() { - DCHECK_GT(password_count_, 0u); - --password_count_; - if (IsSecureContext() || password_count_ > 0) - return; - SendSensitiveInputVisibility(); -} - void Document::MaybeQueueSendDidEditFieldInInsecureContext() { if (logged_field_edit_ || sensitive_input_edited_task_.IsActive() || IsSecureContext()) {
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index 1e342c2..4504720 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -1372,11 +1372,6 @@ const PropertyRegistry* GetPropertyRegistry() const; PropertyRegistry* GetPropertyRegistry(); - // Document maintains a counter of visible non-secure password - // fields in the page. Used to notify the embedder when all visible - // non-secure password fields are no longer visible. - void IncrementPasswordCount(); - void DecrementPasswordCount(); // Used to notify the embedder when the user edits the value of a // text field in a non-secure context. void MaybeQueueSendDidEditFieldInInsecureContext(); @@ -1606,8 +1601,6 @@ const OriginAccessEntry& AccessEntryFromURL(); - void SendSensitiveInputVisibility(); - void SendSensitiveInputVisibilityInternal(); void SendDidEditFieldInInsecureContext(); bool HaveImportsLoaded() const; @@ -1876,12 +1869,8 @@ Member<PropertyRegistry> property_registry_; - unsigned password_count_; - bool logged_field_edit_; - TaskHandle sensitive_input_visibility_task_; - TaskHandle sensitive_input_edited_task_; SecureContextState secure_context_state_;
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 625286f6..51a3ac1 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -36,7 +36,7 @@ #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script_url.h" #include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_display_lock_callback.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_display_lock_options.h" #include "third_party/blink/renderer/core/accessibility/ax_context.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" #include "third_party/blink/renderer/core/animation/css/css_animations.h" @@ -1897,8 +1897,6 @@ if (LocalFrameView* frame_view = GetDocument().View()) frame_view->SetIntersectionObservationState(LocalFrameView::kRequired); } - if (rare_data->GetDisplayLockContext()) - rare_data->GetDisplayLockContext()->NotifyConnectedMayHaveChanged(); } if (isConnected()) { @@ -1938,8 +1936,6 @@ // pseudo elements. ElementRareData* rare_data = GetElementRareData(); rare_data->ClearPseudoElements(); - if (rare_data->GetDisplayLockContext()) - rare_data->GetDisplayLockContext()->NotifyConnectedMayHaveChanged(); } if (Fullscreen::IsFullscreenElement(*this)) { @@ -3567,21 +3563,9 @@ } } -ScriptPromise Element::acquireDisplayLock(ScriptState* script_state, - V8DisplayLockCallback* callback) { - auto* context = EnsureElementRareData().EnsureDisplayLockContext( +DisplayLockContext* Element::getDisplayLockForBindings() { + return EnsureElementRareData().EnsureDisplayLockContext( this, GetExecutionContext()); - context->RequestLock(callback, script_state); - auto lock_promise = context->Promise(); - - // Only support "mode 2" display locking, which requires that the lock is - // acquired before the element is connected. Note that we need to call this - // after actually getting the promise to avoid ScriptPromiseResolver asserts. - // TODO(vmpstr): Implement mode 1. - if (isConnected()) - context->RejectAndCleanUp(); - - return lock_promise; } DisplayLockContext* Element::GetDisplayLockContext() const {
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 430fd71..be766d6 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -87,7 +87,6 @@ class StylePropertyMapReadOnly; class USVStringOrTrustedURL; class V0CustomElementDefinition; -class V8DisplayLockCallback; enum SpellcheckAttributeState { kSpellcheckAttributeTrue, @@ -898,7 +897,7 @@ EnsureResizeObserverData(); void SetNeedsResizeObserverUpdate(); - ScriptPromise acquireDisplayLock(ScriptState*, V8DisplayLockCallback*); + DisplayLockContext* getDisplayLockForBindings(); DisplayLockContext* GetDisplayLockContext() const; bool StyleRecalcBlockedByDisplayLock() const;
diff --git a/third_party/blink/renderer/core/dom/element.idl b/third_party/blink/renderer/core/dom/element.idl index 8ef4a7e..91ad394 100644 --- a/third_party/blink/renderer/core/dom/element.idl +++ b/third_party/blink/renderer/core/dom/element.idl
@@ -140,8 +140,8 @@ attribute EventHandler onbeforepaste; attribute EventHandler onsearch; - // Display locking. - [RuntimeEnabled=DisplayLocking, CallWith=ScriptState] Promise<any> acquireDisplayLock(DisplayLockCallback callback); + // Display locking. Returns a display lock context. + [RuntimeEnabled=DisplayLocking, ImplementedAs=getDisplayLockForBindings] DisplayLockContext getDisplayLock(); }; Element implements ParentNode;
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h index 6856f2a3..8182031 100644 --- a/third_party/blink/renderer/core/dom/element_rare_data.h +++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -194,7 +194,7 @@ DisplayLockContext* EnsureDisplayLockContext(Element* element, ExecutionContext* context) { - if (!display_lock_context_ || display_lock_context_->IsResolved()) { + if (!display_lock_context_) { display_lock_context_ = MakeGarbageCollected<DisplayLockContext>(element, context); }
diff --git a/third_party/blink/renderer/core/events/wheel_event.cc b/third_party/blink/renderer/core/events/wheel_event.cc index c7cb037a..2fa4989a 100644 --- a/third_party/blink/renderer/core/events/wheel_event.cc +++ b/third_party/blink/renderer/core/events/wheel_event.cc
@@ -26,6 +26,7 @@ #include "third_party/blink/renderer/core/clipboard/data_transfer.h" #include "third_party/blink/renderer/core/dom/events/event_dispatcher.h" #include "third_party/blink/renderer/core/event_interface_names.h" +#include "third_party/blink/renderer/core/frame/intervention.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/use_counter.h" @@ -122,10 +123,22 @@ void WheelEvent::preventDefault() { MouseEvent::preventDefault(); + PassiveMode passive_mode = HandlingPassive(); + if (passive_mode == PassiveMode::kPassiveForcedDocumentLevel) { + String id = "PreventDefaultPassive"; + String message = + "Unable to preventDefault inside passive event listener due to " + "target being treated as passive. See " + "https://www.chromestatus.com/features/6662647093133312"; + if (view() && view()->IsLocalDOMWindow() && view()->GetFrame()) { + Intervention::GenerateReport(ToLocalDOMWindow(view())->GetFrame(), id, + message); + } + } + if (!currentTarget() || !currentTarget()->IsTopLevelNode()) return; - PassiveMode passive_mode = HandlingPassive(); if (passive_mode == PassiveMode::kPassiveForcedDocumentLevel || passive_mode == PassiveMode::kNotPassiveDefault) { if (ExecutionContext* context = currentTarget()->GetExecutionContext()) {
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index dda99e3b..f2263323 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -293,7 +293,7 @@ // Verify that the LocalFrameView has been cleared as part of detaching // the frame owner. DCHECK(!view_); - if (is_ad_subframe_) + if (IsAdSubframe()) InstanceCounters::DecrementCounter(InstanceCounters::kAdSubframeCounter); } @@ -1051,7 +1051,7 @@ if (has_user_gesture) framebust_params |= kUserGestureBit; - if (is_ad_subframe_) + if (IsAdSubframe()) framebust_params |= kAdBit; UseCounter::Count(this, WebFeature::kTopNavigationFromSubFrame); @@ -1277,8 +1277,10 @@ bool parent_is_ad = parent->IsLocalFrame() && ToLocalFrame(parent)->IsAdSubframe(); - if (parent_is_ad || ad_tracker_->IsAdScriptInStack()) - SetIsAdSubframe(); + if (parent_is_ad || ad_tracker_->IsAdScriptInStack()) { + SetIsAdSubframe(parent_is_ad ? blink::mojom::AdFrameType::kChildAd + : blink::mojom::AdFrameType::kRootAd); + } } service_manager::InterfaceProvider& LocalFrame::GetInterfaceProvider() { @@ -1483,6 +1485,25 @@ return computed_node_mapping_.at(ax_id); } +bool LocalFrame::IsAdSubframe() const { + return ad_frame_type_ != blink::mojom::AdFrameType::kNonAd; +} + +bool LocalFrame::IsAdRoot() const { + return ad_frame_type_ == blink::mojom::AdFrameType::kRootAd; +} + +void LocalFrame::SetIsAdSubframe(blink::mojom::AdFrameType ad_frame_type) { + DCHECK(!IsMainFrame()); + if (ad_frame_type == blink::mojom::AdFrameType::kNonAd) + return; + if (ad_frame_type_ != blink::mojom::AdFrameType::kNonAd) + return; + ad_frame_type_ = ad_frame_type; + frame_scheduler_->SetIsAdFrame(); + InstanceCounters::IncrementCounter(InstanceCounters::kAdSubframeCounter); +} + void LocalFrame::PauseSubresourceLoading( blink::mojom::blink::PauseSubresourceLoadingHandleRequest request) { auto handle = GetFrameScheduler()->GetPauseSubresourceLoadingHandle();
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h index 79bf183..736cf962 100644 --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -33,6 +33,7 @@ #include "base/macros.h" #include "mojo/public/cpp/bindings/strong_binding_set.h" +#include "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom-blink.h" #include "third_party/blink/public/mojom/loader/pause_subresource_loading_handle.mojom-blink.h" #include "third_party/blink/public/mojom/loader/previews_resource_loading_hints.mojom-blink.h" #include "third_party/blink/public/platform/reporting.mojom-blink.h" @@ -381,15 +382,9 @@ // Calculated in the constructor but LocalFrames created on behalf of OOPIF // aren't set until just before commit (ReadyToCommitNavigation time) by the // embedder. - bool IsAdSubframe() const { return is_ad_subframe_; } - void SetIsAdSubframe() { - DCHECK(!IsMainFrame()); - if (is_ad_subframe_) - return; - is_ad_subframe_ = true; - frame_scheduler_->SetIsAdFrame(); - InstanceCounters::IncrementCounter(InstanceCounters::kAdSubframeCounter); - } + bool IsAdSubframe() const; + bool IsAdRoot() const; + void SetIsAdSubframe(blink::mojom::AdFrameType ad_frame_type); // Binds |request| and prevents resource loading until either the frame is // navigated or the request pipe is closed. @@ -510,11 +505,11 @@ bool in_view_source_mode_; - // True if this frame is heuristically determined to have been created for - // advertising purposes. It's per-frame (as opposed to per-document) because - // when an iframe is created on behalf of ad script that same frame is not - // typically reused for non-ad purposes. - bool is_ad_subframe_ = false; + // Type of frame detected by heuristics checking if the frame was created + // for advertising purposes. It's per-frame (as opposed to per-document) + // because when an iframe is created on behalf of ad script that same frame is + // not typically reused for non-ad purposes. + blink::mojom::AdFrameType ad_frame_type_ = blink::mojom::AdFrameType::kNonAd; Member<CoreProbeSink> probe_sink_; scoped_refptr<InspectorTaskRunner> inspector_task_runner_;
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index ac58bf7..f9d1baf5 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -656,9 +656,10 @@ return GetFrame()->IsAdSubframe(); } -void WebLocalFrameImpl::SetIsAdSubframe() { +void WebLocalFrameImpl::SetIsAdSubframe( + blink::mojom::AdFrameType ad_frame_type) { DCHECK(GetFrame()); - GetFrame()->SetIsAdSubframe(); + GetFrame()->SetIsAdSubframe(ad_frame_type); } void WebLocalFrameImpl::DispatchUnloadEvent() {
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index 344e3801..ca6ec16 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -36,6 +36,7 @@ #include "base/single_thread_task_runner.h" +#include "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom-blink.h" #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom-blink.h" #include "third_party/blink/public/mojom/frame/find_in_page.mojom-blink.h" #include "third_party/blink/public/platform/web_file_system_type.h" @@ -100,7 +101,7 @@ WebDocument GetDocument() const override; WebPerformance Performance() const override; bool IsAdSubframe() const override; - void SetIsAdSubframe() override; + void SetIsAdSubframe(blink::mojom::AdFrameType ad_frame_type) override; void DispatchUnloadEvent() override; void ExecuteScript(const WebScriptSource&) override; void ExecuteScriptInIsolatedWorld(int world_id,
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc index ce3005f..373805c 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -889,9 +889,6 @@ } void HTMLInputElement::DetachLayoutTree(const AttachContext& context) { - if (GetLayoutObject()) { - input_type_->OnDetachWithLayoutObject(); - } TextControlElement::DetachLayoutTree(context); needs_to_update_view_value_ = true; input_type_view_->ClosePopupView();
diff --git a/third_party/blink/renderer/core/html/forms/input_type.cc b/third_party/blink/renderer/core/html/forms/input_type.cc index 73b56697..aa3ec18 100644 --- a/third_party/blink/renderer/core/html/forms/input_type.cc +++ b/third_party/blink/renderer/core/html/forms/input_type.cc
@@ -646,8 +646,6 @@ void InputType::OnAttachWithLayoutObject() {} -void InputType::OnDetachWithLayoutObject() {} - bool InputType::ShouldAppearIndeterminate() const { return false; }
diff --git a/third_party/blink/renderer/core/html/forms/input_type.h b/third_party/blink/renderer/core/html/forms/input_type.h index c97a6794..e7f61490 100644 --- a/third_party/blink/renderer/core/html/forms/input_type.h +++ b/third_party/blink/renderer/core/html/forms/input_type.h
@@ -195,7 +195,6 @@ virtual const QualifiedName& SubResourceAttributeName() const; virtual void CopyNonAttributeProperties(const HTMLInputElement&); virtual void OnAttachWithLayoutObject(); - virtual void OnDetachWithLayoutObject(); // Parses the specified string for the type, and return // the Decimal value for the parsing result if the parsing
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.cc b/third_party/blink/renderer/core/html/forms/password_input_type.cc index 5260d8f..0fb452d 100644 --- a/third_party/blink/renderer/core/html/forms/password_input_type.cc +++ b/third_party/blink/renderer/core/html/forms/password_input_type.cc
@@ -77,12 +77,4 @@ return false; } -void PasswordInputType::OnAttachWithLayoutObject() { - GetElement().GetDocument().IncrementPasswordCount(); -} - -void PasswordInputType::OnDetachWithLayoutObject() { - GetElement().GetDocument().DecrementPasswordCount(); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.h b/third_party/blink/renderer/core/html/forms/password_input_type.h index 3722b54..c113962 100644 --- a/third_party/blink/renderer/core/html/forms/password_input_type.h +++ b/third_party/blink/renderer/core/html/forms/password_input_type.h
@@ -49,8 +49,6 @@ FormControlState SaveFormControlState() const override; void RestoreFormControlState(const FormControlState&) override; bool ShouldRespectListAttribute() override; - void OnAttachWithLayoutObject() override; - void OnDetachWithLayoutObject() override; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type_test.cc b/third_party/blink/renderer/core/html/forms/password_input_type_test.cc index 75bf907..0c77d2ff 100644 --- a/third_party/blink/renderer/core/html/forms/password_input_type_test.cc +++ b/third_party/blink/renderer/core/html/forms/password_input_type_test.cc
@@ -11,7 +11,6 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/modules/insecure_input/insecure_input_service.mojom-blink.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/core/html/forms/html_input_element.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" @@ -37,301 +36,14 @@ unsigned DidEditFieldCalls() const { return num_did_edit_field_calls_; } - bool PasswordFieldVisibleCalled() const { - return password_field_visible_called_; - } - - unsigned NumPasswordFieldsInvisibleCalls() const { - return num_password_fields_invisible_calls_; - } - private: - // mojom::InsecureInputService - void PasswordFieldVisibleInInsecureContext() override { - password_field_visible_called_ = true; - } - - void AllPasswordFieldsInInsecureContextInvisible() override { - ++num_password_fields_invisible_calls_; - } - void DidEditFieldInInsecureContext() override { ++num_did_edit_field_calls_; } mojo::BindingSet<InsecureInputService> binding_set_; - bool password_field_visible_called_ = false; unsigned num_did_edit_field_calls_ = 0; - unsigned num_password_fields_invisible_calls_ = 0; }; -// Tests that a Mojo message is sent when a visible password field -// appears on the page. -TEST(PasswordInputTypeTest, PasswordVisibilityEvent) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='password'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled()); -} - -// Tests that a Mojo message is not sent when a visible password field -// appears in a secure context. -TEST(PasswordInputTypeTest, PasswordVisibilityEventInSecureContext) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().SetURL(KURL("https://example.test")); - page_holder->GetDocument().SetSecurityOrigin( - SecurityOrigin::Create(KURL("https://example.test"))); - page_holder->GetDocument().SetSecureContextStateForTesting( - SecureContextState::kSecure); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='password'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - // No message should have been sent from a secure context. - blink::test::RunPendingTasks(); - EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); -} - -// Tests that a Mojo message is sent when a previously invisible password field -// becomes visible. -TEST(PasswordInputTypeTest, InvisiblePasswordFieldBecomesVisible) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='password' style='display:none;'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - // The message should not be sent for a hidden password field. - EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); - - // Now make the input visible. - HTMLInputElement* input = - ToHTMLInputElement(page_holder->GetDocument().body()->firstChild()); - input->setAttribute("style", "", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled()); -} - -// Tests that a Mojo message is sent when a previously non-password field -// becomes a password. -TEST(PasswordInputTypeTest, NonPasswordFieldBecomesPassword) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='text'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - // The message should not be sent for a non-password field. - blink::test::RunPendingTasks(); - EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); - - // Now make the input a password field. - HTMLInputElement* input = - ToHTMLInputElement(page_holder->GetDocument().body()->firstChild()); - input->setType("password"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled()); -} - -// Tests that a Mojo message is *not* sent when a previously invisible password -// field becomes a visible non-password field. -TEST(PasswordInputTypeTest, - InvisiblePasswordFieldBecomesVisibleNonPasswordField) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='password' style='display:none;'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - // The message should not be sent for a hidden password field. - EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); - - // Now make the input a visible non-password field. - HTMLInputElement* input = - ToHTMLInputElement(page_holder->GetDocument().body()->firstChild()); - input->setType("text"); - input->setAttribute("style", "", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); -} - -// Tests that a Mojo message is sent when the only visible password -// field becomes invisible. -TEST(PasswordInputTypeTest, VisiblePasswordFieldBecomesInvisible) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='password'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled()); - EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); - - // Now make the input invisible. - HTMLInputElement* input = - ToHTMLInputElement(page_holder->GetDocument().body()->firstChild()); - input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); -} - -// Tests that a Mojo message is sent when all visible password fields -// become invisible. -TEST(PasswordInputTypeTest, AllVisiblePasswordFieldBecomeInvisible) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='password'><input type='password'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); - - // Make the first input invisible. There should be no message because - // there is still a visible input. - HTMLInputElement* input = - ToHTMLInputElement(page_holder->GetDocument().body()->firstChild()); - input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); - - // When all inputs are invisible, then a message should be sent. - input = ToHTMLInputElement(page_holder->GetDocument().body()->lastChild()); - input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); - - // If the count of visible inputs goes positive again and then back to - // zero, a message should be sent again. - input->setAttribute("style", "", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); - input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(2u, mock_service.NumPasswordFieldsInvisibleCalls()); -} - -// Tests that a Mojo message is sent when the containing element of a -// visible password field becomes invisible. -TEST(PasswordInputTypeTest, PasswordFieldContainerBecomesInvisible) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<div><input type='password'></div>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); - - // If the containing div becomes invisible, a message should be sent. - HTMLElement* div = - ToHTMLDivElement(page_holder->GetDocument().body()->firstChild()); - div->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); - - // If the containing div becomes visible and then invisible again, a message - // should be sent. - div->setAttribute("style", "", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); - div->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(2u, mock_service.NumPasswordFieldsInvisibleCalls()); -} - -// Tests that a Mojo message is sent when all visible password fields -// become non-password fields. -TEST(PasswordInputTypeTest, PasswordFieldsBecomeNonPasswordFields) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='password'><input type='password'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); - - // Make the first input a non-password input. There should be no - // message because there is still a visible password input. - HTMLInputElement* input = - ToHTMLInputElement(page_holder->GetDocument().body()->firstChild()); - input->setType("text"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); - - // When all inputs are no longer passwords, then a message should be sent. - input = ToHTMLInputElement(page_holder->GetDocument().body()->lastChild()); - input->setType("text"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); -} - -// Tests that only one Mojo message is sent for multiple password -// visibility events within the same task. -TEST(PasswordInputTypeTest, MultipleEventsInSameTask) { - std::unique_ptr<DummyPageHolder> page_holder = - DummyPageHolder::Create(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->SetInnerHTMLFromString( - "<input type='password'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - // Make the password field invisible in the same task. - HTMLInputElement* input = - ToHTMLInputElement(page_holder->GetDocument().body()->firstChild()); - input->setType("text"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhases( - DocumentLifecycle::LifecycleUpdateReason::kTest); - blink::test::RunPendingTasks(); - // Only a single Mojo message should have been sent, with the latest state of - // the page (which is that no password fields are visible). - EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); - EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); -} - // Tests that a Mojo message is sent when a password field is edited // on the page. TEST(PasswordInputTypeTest, DidEditFieldEvent) {
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 300a96c..15f2573 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2994,7 +2994,7 @@ bool already_needed_layout = bitfields_.SelfNeedsLayout(); SetSelfNeedsLayout(true); MarkContainerNeedsCollectInlines(); - if (!already_needed_layout && !LayoutBlockedByDisplayLock()) { + if (!already_needed_layout) { TRACE_EVENT_INSTANT1( TRACE_DISABLED_BY_DEFAULT("devtools.timeline.invalidationTracking"), "LayoutInvalidationTracking", TRACE_EVENT_SCOPE_THREAD, "data",
diff --git a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc index 59f5a4e9..d548b367 100644 --- a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc +++ b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
@@ -713,7 +713,7 @@ LayoutRect layer_bounds; ClipRect damage_rect, clip_rect_to_apply; if (layer->GetLayoutObject().FirstFragment().HasLocalBorderBoxProperties()) { - layer->Clipper(PaintLayer::kUseGeometryMapper) + layer->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects( ClipRectsContext(root_layer, &root_layer->GetLayoutObject().FirstFragment(), @@ -721,7 +721,7 @@ &layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, damage_rect, clip_rect_to_apply); } else { - layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + layer->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateRects( ClipRectsContext(root_layer, nullptr, kUncachedClipRects), nullptr, nullptr, layer_bounds, damage_rect, clip_rect_to_apply);
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc index 37dc1aa..562536a 100644 --- a/third_party/blink/renderer/core/paint/box_painter_base.cc +++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
@@ -28,8 +28,7 @@ const FillLayer& fill_layer, const LayoutRect& rect, BackgroundImageGeometry& geometry, - BackgroundBleedAvoidance bleed, - SkBlendMode op) { + BackgroundBleedAvoidance bleed) { FillLayerOcclusionOutputList reversed_paint_list; bool should_draw_background_in_separate_buffer = CalculateFillLayerOcclusionCulling(reversed_paint_list, fill_layer); @@ -43,7 +42,7 @@ for (auto it = reversed_paint_list.rbegin(); it != reversed_paint_list.rend(); ++it) { - PaintFillLayer(paint_info, c, **it, rect, bleed, geometry, op); + PaintFillLayer(paint_info, c, **it, rect, bleed, geometry); } if (should_draw_background_in_separate_buffer) @@ -599,7 +598,6 @@ const LayoutRect& rect, BackgroundBleedAvoidance bleed_avoidance, BackgroundImageGeometry& geometry, - SkBlendMode op, bool object_has_multiple_boxes, const LayoutSize flow_box_size) { GraphicsContext& context = paint_info.context;
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.h b/third_party/blink/renderer/core/paint/box_painter_base.h index fb43c43c..19558c4 100644 --- a/third_party/blink/renderer/core/paint/box_painter_base.h +++ b/third_party/blink/renderer/core/paint/box_painter_base.h
@@ -43,8 +43,7 @@ const FillLayer&, const LayoutRect&, BackgroundImageGeometry&, - BackgroundBleedAvoidance = kBackgroundBleedNone, - SkBlendMode = SkBlendMode::kSrcOver); + BackgroundBleedAvoidance = kBackgroundBleedNone); void PaintFillLayer(const PaintInfo&, const Color&, @@ -52,7 +51,6 @@ const LayoutRect&, BackgroundBleedAvoidance, BackgroundImageGeometry&, - SkBlendMode = SkBlendMode::kSrcOver, bool object_has_multiple_boxes = false, const LayoutSize flow_box_size = LayoutSize());
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 80d3cb9..a50392a 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
@@ -650,7 +650,8 @@ kIgnoreOverflowClip); ClipRect clip_rect; - owning_layer_.Clipper(PaintLayer::kDoNotUseGeometryMapper) + owning_layer_ + .Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect(clip_rects_context, clip_rect); if (clip_rect.Rect() == LayoutRect(LayoutRect::InfiniteIntRect())) return; @@ -1375,7 +1376,8 @@ kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClipAndScroll); ClipRect clip_rect; - owning_layer_.Clipper(PaintLayer::kDoNotUseGeometryMapper) + owning_layer_ + .Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect(clip_rects_context, clip_rect); // Scroll offset is not included in the clip rect returned above // (see kIgnoreOverflowClipAndScroll), so we need to add it in @@ -3050,7 +3052,8 @@ &ancestor_paint_info->paint_layer->GetLayoutObject().FirstFragment(), kUncachedClipRects); ClipRect parent_clip_rect; - paint_info.paint_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + paint_info.paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect(clip_rects_context, parent_clip_rect); // Convert from ancestor to local coordinates.
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc b/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc index 23841cd..53dcd18 100644 --- a/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc +++ b/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc
@@ -305,7 +305,7 @@ } ClipRect clip_rect; - layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + layer->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(root_layer_, &root_layer_->GetLayoutObject().FirstFragment(),
diff --git a/third_party/blink/renderer/core/paint/inline_box_painter_base.cc b/third_party/blink/renderer/core/paint/inline_box_painter_base.cc index 5842732..4483ed5 100644 --- a/third_party/blink/renderer/core/paint/inline_box_painter_base.cc +++ b/third_party/blink/renderer/core/paint/inline_box_painter_base.cc
@@ -66,16 +66,15 @@ const FillLayer& layer, const LayoutRect& rect, BackgroundImageGeometry& geometry, - bool object_has_multiple_boxes, - SkBlendMode op) { + bool object_has_multiple_boxes) { // FIXME: This should be a for loop or similar. It's a little non-trivial to // do so, however, since the layers need to be painted in reverse order. if (layer.Next()) { PaintFillLayers(box_painter, info, c, *layer.Next(), rect, geometry, - object_has_multiple_boxes, op); + object_has_multiple_boxes); } PaintFillLayer(box_painter, info, c, layer, rect, geometry, - object_has_multiple_boxes, op); + object_has_multiple_boxes); } void InlineBoxPainterBase::PaintFillLayer(BoxPainterBase& box_painter, @@ -84,15 +83,14 @@ const FillLayer& fill_layer, const LayoutRect& paint_rect, BackgroundImageGeometry& geometry, - bool object_has_multiple_boxes, - SkBlendMode op) { + bool object_has_multiple_boxes) { StyleImage* img = fill_layer.GetImage(); bool has_fill_image = img && img->CanRender(); if (!object_has_multiple_boxes || (!has_fill_image && !style_.HasBorderRadius())) { box_painter.PaintFillLayer(paint_info, c, fill_layer, paint_rect, - kBackgroundBleedNone, geometry, op, false); + kBackgroundBleedNone, geometry, false); return; } @@ -105,7 +103,7 @@ GraphicsContextStateSaver state_saver(paint_info.context); paint_info.context.Clip(PixelSnappedIntRect(paint_rect)); box_painter.PaintFillLayer(paint_info, c, fill_layer, rect, - kBackgroundBleedNone, geometry, op, multi_line, + kBackgroundBleedNone, geometry, multi_line, paint_rect.Size()); }
diff --git a/third_party/blink/renderer/core/paint/inline_box_painter_base.h b/third_party/blink/renderer/core/paint/inline_box_painter_base.h index 726ce1e..8452081 100644 --- a/third_party/blink/renderer/core/paint/inline_box_painter_base.h +++ b/third_party/blink/renderer/core/paint/inline_box_painter_base.h
@@ -54,16 +54,14 @@ const FillLayer&, const LayoutRect&, BackgroundImageGeometry& geometry, - bool object_has_multiple_boxes, - SkBlendMode op = SkBlendMode::kSrcOver); + bool object_has_multiple_boxes); void PaintFillLayer(BoxPainterBase&, const PaintInfo&, const Color&, const FillLayer&, const LayoutRect&, BackgroundImageGeometry& geometry, - bool object_has_multiple_boxes, - SkBlendMode op); + bool object_has_multiple_boxes); virtual void PaintNormalBoxShadow(const PaintInfo&, const ComputedStyle&, const LayoutRect& paint_rect) = 0;
diff --git a/third_party/blink/renderer/core/paint/inline_flow_box_painter.cc b/third_party/blink/renderer/core/paint/inline_flow_box_painter.cc index bd82f77..f1c8f2f 100644 --- a/third_party/blink/renderer/core/paint/inline_flow_box_painter.cc +++ b/third_party/blink/renderer/core/paint/inline_flow_box_painter.cc
@@ -169,8 +169,7 @@ // The simple case is where we either have no border image or we are the // only box for this object. In those cases only a single call to draw is // required. - if (!has_border_image || (!inline_flow_box_.PrevForSameLayoutObject() && - !inline_flow_box_.NextForSameLayoutObject())) + if (!has_border_image || !object_has_multiple_boxes) return kPaintBordersWithoutClip; // We have a border image that spans multiple lines. @@ -267,8 +266,7 @@ // The simple case is where we are the only box for this object. In those // cases only a single call to draw is required. - if (!inline_flow_box_.PrevForSameLayoutObject() && - !inline_flow_box_.NextForSameLayoutObject()) { + if (!object_has_multiple_boxes) { NinePieceImagePainter::Paint(paint_info.context, box_model, box_model.GetDocument(), GetNode(&box_model), paint_rect, box_model.StyleRef(),
diff --git a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h index 881e3144..1b4a60e 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h +++ b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h
@@ -8,9 +8,7 @@ #include "third_party/blink/renderer/core/layout/ng/geometry/ng_border_edges.h" #include "third_party/blink/renderer/core/paint/inline_box_painter_base.h" #include "third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h" - #include "third_party/blink/renderer/platform/wtf/allocator.h" -#include "third_party/skia/include/core/SkBlendMode.h" namespace blink {
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index 6ee2e8f8..05d12f2 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1377,7 +1377,7 @@ } void PaintLayer::ClearClipRects(ClipRectsCacheSlot cache_slot) { - Clipper(PaintLayer::kDoNotUseGeometryMapper) + Clipper(GeometryMapperOption::kDoNotUseGeometryMapper) .ClearClipRectsIncludingDescendants(cache_slot); } @@ -1636,7 +1636,7 @@ root_layer, &root_layer->GetLayoutObject().FirstFragment(), kUncachedClipRects, overlay_scrollbar_clip_behavior, respect_overflow_clip, sub_pixel_accumulation); - Clipper(kUseGeometryMapper) + Clipper(GeometryMapperOption::kUseGeometryMapper) .CalculateRects(clip_rects_context, &GetLayoutObject().FirstFragment(), cull_rect, fragment.layer_bounds, fragment.background_rect, fragment.foreground_rect, @@ -1734,7 +1734,7 @@ fragment_cull_rect.emplace(rect); } - Clipper(kUseGeometryMapper) + Clipper(GeometryMapperOption::kUseGeometryMapper) .CalculateRects( clip_rects_context, fragment_data, fragment_cull_rect ? &*fragment_cull_rect : nullptr, @@ -1945,6 +1945,9 @@ HitTestingTransformState* transform_state, double* z_offset) { const LayoutObject& layout_object = GetLayoutObject(); + if (layout_object.PaintBlockedByDisplayLock()) + return nullptr; + DCHECK_GE(layout_object.GetDocument().Lifecycle().GetState(), DocumentLifecycle::kCompositingClean); @@ -1978,7 +1981,7 @@ // Make sure the parent's clip rects have been calculated. if (Parent()) { ClipRect clip_rect; - Clipper(PaintLayer::kUseGeometryMapper) + Clipper(GeometryMapperOption::kUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext( root_layer, &root_layer->GetLayoutObject().FirstFragment(), @@ -2633,7 +2636,7 @@ // If there is a clip applied by an ancestor to this PaintLayer but below or // equal to |ancestorLayer|, apply that clip. - LayoutRect result = Clipper(PaintLayer::kDoNotUseGeometryMapper) + LayoutRect result = Clipper(GeometryMapperOption::kDoNotUseGeometryMapper) .LocalClipRect(composited_layer); result.Intersect(PhysicalBoundingBox(LayoutPoint())); @@ -3166,7 +3169,8 @@ PaintLayerClipper PaintLayer::Clipper( GeometryMapperOption geometry_mapper_option) const { - return PaintLayerClipper(*this, geometry_mapper_option == kUseGeometryMapper); + return PaintLayerClipper(*this, geometry_mapper_option == + GeometryMapperOption::kUseGeometryMapper); } bool PaintLayer::ScrollsOverflow() const {
diff --git a/third_party/blink/renderer/core/paint/paint_layer.h b/third_party/blink/renderer/core/paint/paint_layer.h index feed9f4..1bed4f06 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.h +++ b/third_party/blink/renderer/core/paint/paint_layer.h
@@ -669,7 +669,10 @@ return scrollable_area_.Get(); } - enum GeometryMapperOption { kUseGeometryMapper, kDoNotUseGeometryMapper }; + enum class GeometryMapperOption { + kUseGeometryMapper, + kDoNotUseGeometryMapper + }; PaintLayerClipper Clipper(GeometryMapperOption) const;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc b/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc index dc23092..b068340 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc
@@ -48,14 +48,16 @@ LayoutSize(FloatSize(0.25, 0.35))); ClipRect background_rect_gm; - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateBackgroundClipRect(context, background_rect_gm); EXPECT_EQ(LayoutRect(FloatRect(8.25, 8.34375, 300, 300)), background_rect_gm.Rect()); ClipRect background_rect_nogm; - target_paint_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect(context, background_rect_nogm); EXPECT_EQ(LayoutRect(FloatRect(8.25, 8.34375, 300, 300)), @@ -78,14 +80,16 @@ LayoutSize(FloatSize(0.25, 0.35))); ClipRect background_rect_gm; - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateBackgroundClipRect(context, background_rect_gm); EXPECT_GE(background_rect_gm.Rect().Size().Width().ToInt(), 33554422); EXPECT_GE(background_rect_gm.Rect().Size().Height().ToInt(), 33554422); ClipRect background_rect_nogm; - target_paint_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect(context, background_rect_nogm); EXPECT_GE(background_rect_nogm.Rect().Size().Width().ToInt(), 33554422); @@ -110,14 +114,16 @@ LayoutSize(FloatSize(0.25, 0.35))); ClipRect background_rect_gm; - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateBackgroundClipRect(context, background_rect_gm); EXPECT_GE(background_rect_gm.Rect().Size().Width().ToInt(), 33554422); EXPECT_GE(background_rect_gm.Rect().Size().Height().ToInt(), 33554422); ClipRect background_rect_nogm; - target_paint_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect(context, background_rect_nogm); EXPECT_GE(background_rect_nogm.Rect().Size().Width().ToInt(), 33554422); @@ -145,7 +151,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -175,7 +182,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -215,7 +223,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -256,7 +265,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - child_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + child_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &child_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -293,7 +303,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -326,7 +337,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -352,7 +364,7 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - layer->Clipper(PaintLayer::kUseGeometryMapper) + layer->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); EXPECT_GE(background_rect.Rect().Size().Width().ToInt(), 33554422); @@ -363,7 +375,7 @@ ClipRectsContext context_clip( layer, &layer->GetLayoutObject().FirstFragment(), kUncachedClipRects); - layer->Clipper(PaintLayer::kUseGeometryMapper) + layer->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context_clip, &layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); EXPECT_EQ(LayoutRect(0, 0, 200, 200), background_rect.Rect()); @@ -389,7 +401,7 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - layer->Clipper(PaintLayer::kUseGeometryMapper) + layer->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); EXPECT_EQ(LayoutRect(0, 0, 200, 400), background_rect.Rect()); @@ -400,7 +412,7 @@ layer->Parent(), &layer->Parent()->GetLayoutObject().FirstFragment(), kUncachedClipRects); - layer->Clipper(PaintLayer::kUseGeometryMapper) + layer->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context_clip, &layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); EXPECT_EQ(LayoutRect(0, 0, 200, 200), background_rect.Rect()); @@ -426,11 +438,12 @@ PaintLayer* fixed = ToLayoutBoxModelObject(GetLayoutObjectByElementId("fixed"))->Layer(); - EXPECT_EQ(LayoutRect(0, 0, 100, 100), - transformed->Clipper(PaintLayer::kUseGeometryMapper) - .LocalClipRect(*transformed)); + EXPECT_EQ( + LayoutRect(0, 0, 100, 100), + transformed->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) + .LocalClipRect(*transformed)); EXPECT_EQ(LayoutRect(0, 50, 100, 100), - fixed->Clipper(PaintLayer::kUseGeometryMapper) + fixed->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .LocalClipRect(*transformed)); } @@ -462,7 +475,7 @@ EXPECT_TRUE(parent->GetClipRectsCache()); EXPECT_TRUE(child->GetClipRectsCache()); - parent->Clipper(PaintLayer::kUseGeometryMapper) + parent->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .ClearClipRectsIncludingDescendants(); EXPECT_FALSE(parent->GetClipRectsCache()); @@ -497,7 +510,7 @@ EXPECT_TRUE(parent->GetClipRectsCache()); EXPECT_TRUE(child->GetClipRectsCache()); - child->Clipper(PaintLayer::kUseGeometryMapper) + child->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .ClearClipRectsIncludingDescendants(); EXPECT_TRUE(parent->GetClipRectsCache()); @@ -524,7 +537,7 @@ LayoutRect layer_bounds(infinite_rect); ClipRect background_rect(infinite_rect); ClipRect foreground_rect(infinite_rect); - target->Clipper(PaintLayer::kUseGeometryMapper) + target->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -554,7 +567,7 @@ LayoutRect layer_bounds(infinite_rect); ClipRect background_rect(infinite_rect); ClipRect foreground_rect(infinite_rect); - target->Clipper(PaintLayer::kUseGeometryMapper) + target->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -569,7 +582,7 @@ // Test without GeometryMapper. background_rect = infinite_rect; foreground_rect = infinite_rect; - target->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateRects(context, nullptr, nullptr, layer_bounds, background_rect, foreground_rect); // The non-GeometryMapper path applies the immediate filter effect in @@ -583,7 +596,7 @@ kUncachedClipRects); background_rect = infinite_rect; foreground_rect = infinite_rect; - target->Clipper(PaintLayer::kUseGeometryMapper) + target->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(root_context, &target->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); // This includes the filter effect because it's applied before mapping the @@ -594,7 +607,7 @@ // Test mapping to the root layer without GeometryMapper. background_rect = infinite_rect; foreground_rect = infinite_rect; - target->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateRects(root_context, nullptr, nullptr, layer_bounds, background_rect, foreground_rect); EXPECT_EQ(LayoutRect(38, 41, 204, 304), background_rect.Rect()); @@ -636,7 +649,7 @@ LayoutRect layer_bounds(infinite_rect); ClipRect background_rect(infinite_rect); ClipRect foreground_rect(infinite_rect); - target->Clipper(PaintLayer::kUseGeometryMapper) + target->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -672,7 +685,7 @@ LayoutRect layer_bounds(infinite_rect); ClipRect background_rect(infinite_rect); ClipRect foreground_rect(infinite_rect); - target->Clipper(PaintLayer::kUseGeometryMapper) + target->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -709,7 +722,7 @@ LayoutRect layer_bounds(infinite_rect); ClipRect background_rect(infinite_rect); ClipRect foreground_rect(infinite_rect); - target->Clipper(PaintLayer::kUseGeometryMapper) + target->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -747,7 +760,8 @@ .NextFragment() ->NextFragment()); - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &target_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -758,7 +772,8 @@ foreground_rect.Rect()); EXPECT_EQ(LayoutRect(FloatRect(0, 0, 100, 200)), layer_bounds); - target_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + target_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects( context, target_paint_layer->GetLayoutObject().FirstFragment().NextFragment(), @@ -798,7 +813,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - child_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + child_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &child_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -808,7 +824,8 @@ EXPECT_EQ(LayoutRect(0, 0, 193, 293), foreground_rect.Rect()); EXPECT_EQ(LayoutRect(0, 0, 500, 500), layer_bounds); - child_paint_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + child_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateRects(context, nullptr, nullptr, layer_bounds, background_rect, foreground_rect); @@ -842,7 +859,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - child_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + child_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &child_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -852,7 +870,8 @@ EXPECT_EQ(LayoutRect(8, 8, 193, 293), foreground_rect.Rect()); EXPECT_EQ(LayoutRect(8, 8, 500, 500), layer_bounds); - child_paint_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + child_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateRects(context, nullptr, nullptr, layer_bounds, background_rect, foreground_rect); @@ -884,7 +903,8 @@ LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; - parent_paint_layer->Clipper(PaintLayer::kUseGeometryMapper) + parent_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kUseGeometryMapper) .CalculateRects(context, &parent_paint_layer->GetLayoutObject().FirstFragment(), nullptr, layer_bounds, background_rect, foreground_rect); @@ -895,7 +915,8 @@ EXPECT_EQ(LayoutRect(0, 0, 193, 293), foreground_rect.Rect()); EXPECT_EQ(LayoutRect(0, 0, 200, 300), layer_bounds); - parent_paint_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + parent_paint_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateRects(context, nullptr, nullptr, layer_bounds, background_rect, foreground_rect); @@ -922,12 +943,13 @@ GetDocument() .GetLayoutView() ->Layer() - ->Clipper(PaintLayer::kDoNotUseGeometryMapper) + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .ClearClipRectsIncludingDescendants(); { ClipRect clip_rect; - target_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(GetDocument().GetLayoutView()->Layer(), &GetDocument().GetLayoutView()->FirstFragment(), @@ -942,7 +964,8 @@ { ClipRect clip_rect; - target_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(GetDocument().GetLayoutView()->Layer(), &GetDocument().GetLayoutView()->FirstFragment(), @@ -974,12 +997,13 @@ GetDocument() .GetLayoutView() ->Layer() - ->Clipper(PaintLayer::kDoNotUseGeometryMapper) + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .ClearClipRectsIncludingDescendants(); { ClipRect clip_rect; - target_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(GetDocument().GetLayoutView()->Layer(), &GetDocument().GetLayoutView()->FirstFragment(), @@ -994,7 +1018,8 @@ { ClipRect clip_rect; - target_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) + target_layer + ->Clipper(PaintLayer::GeometryMapperOption::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(GetDocument().GetLayoutView()->Layer(), &GetDocument().GetLayoutView()->FirstFragment(),
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc index e9146c4..3fb6fe8 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -832,7 +832,7 @@ LayoutRect scrollable_overflow(overflow_rect_); scrollable_overflow.Move(-GetLayoutBox()->BorderLeft(), -GetLayoutBox()->BorderTop()); - IntPoint new_origin(-scrollable_overflow.PixelSnappedLocation() + + IntPoint new_origin(FlooredIntPoint(-scrollable_overflow.Location()) + GetLayoutBox()->OriginAdjustmentForScrollbars()); if (new_origin != scroll_origin_) scroll_origin_changed_ = true;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc index bd0bbf9..2954f79c3 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
@@ -1117,4 +1117,46 @@ .VisualRect()); } +TEST_P(PaintLayerScrollableAreaTest, RtlScrollOriginSnapping) { + SetBodyInnerHTML(R"HTML( + <style> + #container { + direction: rtl; + display: flex; + } + #scroller { + width: 100%; + height: 100px; + overflow: hidden; + } + #scroller-content { + width: 200%; + height: 200px; + } + </style> + <div id="container"> + <div id="first-child" style="flex:1; display:none"></div> + <div style="flex:2.2"> + <div id="scroller"> + <div id ="scroller-content"></div> + </div> + </div> + </div> + )HTML"); + + // Test that scroll origin is snapped such that maximum scroll offset is + // always zero for an rtl block. + + GetFrame().View()->Resize(795, 600); + UpdateAllLifecyclePhasesForTest(); + LayoutBox* scroller = ToLayoutBox(GetLayoutObjectByElementId("scroller")); + PaintLayerScrollableArea* scrollable_area = scroller->GetScrollableArea(); + EXPECT_EQ(scrollable_area->MaximumScrollOffsetInt(), IntSize(0, 100)); + + Element* first_child = GetElementById("first-child"); + first_child->RemoveInlineStyleProperty(CSSPropertyDisplay); + UpdateAllLifecyclePhasesForTest(); + EXPECT_EQ(scrollable_area->MaximumScrollOffsetInt(), IntSize(0, 100)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/table_cell_painter.cc b/third_party/blink/renderer/core/paint/table_cell_painter.cc index e655bdb..9396b87d 100644 --- a/third_party/blink/renderer/core/paint/table_cell_painter.cc +++ b/third_party/blink/renderer/core/paint/table_cell_painter.cc
@@ -61,8 +61,7 @@ } BackgroundImageGeometry geometry(layout_table_cell_, &background_object); BoxModelObjectPainter(layout_table_cell_) - .PaintFillLayers(paint_info, c, bg_layer, paint_rect, geometry, - kBackgroundBleedNone, SkBlendMode::kSrcOver); + .PaintFillLayers(paint_info, c, bg_layer, paint_rect, geometry); } }
diff --git a/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc b/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc index 0b5f42a..1185ee2 100644 --- a/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc +++ b/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc
@@ -47,7 +47,6 @@ const String& sink_id) { SetSinkIdResolver* resolver = MakeGarbageCollected<SetSinkIdResolver>(script_state, element, sink_id); - resolver->PauseIfNeeded(); resolver->KeepAliveWhilePending(); return resolver; }
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_record.idl b/third_party/blink/renderer/modules/background_fetch/background_fetch_record.idl index bf81238..f902243 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_record.idl +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_record.idl
@@ -5,9 +5,9 @@ // https://wicg.github.io/background-fetch/#background-fetch-record [ - Exposed=(ServiceWorker), + Exposed=(Window,Worker), OriginTrialEnabled=BackgroundFetch ] interface BackgroundFetchRecord { readonly attribute Request request; [CallWith=ScriptState] readonly attribute Promise<Response> responseReady; -}; \ No newline at end of file +};
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc index 014c7608..bae4be2d 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
@@ -198,8 +198,8 @@ mojom::blink::QueryParamsPtr cache_query_params, ExceptionState& exception_state, bool match_all) { - // TODO(crbug.com/875201): Update this check once we support access to - // active fetches. + // TODO(crbug.com/875201): Update this check once we remove the feature flag + // for active fetches. if (result_ == mojom::BackgroundFetchResult::UNSET && !RuntimeEnabledFeatures::BackgroundFetchAccessActiveFetchesEnabled()) { return ScriptPromise::RejectWithDOMException(
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.idl b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.idl index 1fd3b46..6442de9 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.idl +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.idl
@@ -20,11 +20,8 @@ attribute EventHandler onprogress; [CallWith=ScriptState, MeasureAs=BackgroundFetchRegistrationAbort] Promise<boolean> abort(); - - // TODO(crbug.com/875201): Change to (Window,Worker) once we support - // match() and matchAll() for active fetches. - [CallWith=ScriptState, Exposed=ServiceWorker, RaisesException, MeasureAs=BackgroundFetchRegistrationMatch] Promise<BackgroundFetchRecord> match(RequestInfo request, optional CacheQueryOptions options); - [CallWith=ScriptState, Exposed=ServiceWorker, RaisesException, MeasureAs=BackgroundFetchRegistrationMatchAll] Promise<sequence<BackgroundFetchRecord>> matchAll(optional RequestInfo request, optional CacheQueryOptions options); + [CallWith=ScriptState, RaisesException, MeasureAs=BackgroundFetchRegistrationMatch] Promise<BackgroundFetchRecord> match(RequestInfo request, optional CacheQueryOptions options); + [CallWith=ScriptState, RaisesException, MeasureAs=BackgroundFetchRegistrationMatchAll] Promise<sequence<BackgroundFetchRecord>> matchAll(optional RequestInfo request, optional CacheQueryOptions options); }; enum BackgroundFetchResult { "", "success", "failure" };
diff --git a/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc b/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc index 421067b..5252b6d 100644 --- a/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc +++ b/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
@@ -66,7 +66,6 @@ static Resolver* Create(ScriptState* script_state, CryptoResultImpl* result) { DCHECK(script_state->ContextIsValid()); Resolver* resolver = MakeGarbageCollected<Resolver>(script_state, result); - resolver->PauseIfNeeded(); resolver->KeepAliveWhilePending(); return resolver; }
diff --git a/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc b/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc index 256e30b..5ff20d8d 100644 --- a/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc +++ b/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc
@@ -132,7 +132,6 @@ MediaKeys* media_keys) { SetMediaKeysHandler* handler = MakeGarbageCollected<SetMediaKeysHandler>( script_state, element, media_keys); - handler->PauseIfNeeded(); handler->KeepAliveWhilePending(); return handler->Promise(); }
diff --git a/third_party/blink/renderer/modules/webmidi/midi_access_initializer.h b/third_party/blink/renderer/modules/webmidi/midi_access_initializer.h index cf12df7..791ff00 100644 --- a/third_party/blink/renderer/modules/webmidi/midi_access_initializer.h +++ b/third_party/blink/renderer/modules/webmidi/midi_access_initializer.h
@@ -53,7 +53,6 @@ MIDIAccessInitializer* resolver = MakeGarbageCollected<MIDIAccessInitializer>(script_state, options); resolver->KeepAliveWhilePending(); - resolver->PauseIfNeeded(); return resolver->Start(); }
diff --git a/third_party/blink/renderer/modules/webmidi/midi_dispatcher.cc b/third_party/blink/renderer/modules/webmidi/midi_dispatcher.cc index 916406c..174e602 100644 --- a/third_party/blink/renderer/modules/webmidi/midi_dispatcher.cc +++ b/third_party/blink/renderer/modules/webmidi/midi_dispatcher.cc
@@ -47,14 +47,19 @@ } void MIDIDispatcher::RemoveAccessor(MIDIAccessor* accessor) { - DCHECK(accessors_.Contains(accessor) || - accessors_waiting_session_queue_.Contains(accessor)) + // |accessor| should either be in |accessors_| or + // |accessors_waiting_session_queue_|, but not both. + DCHECK_NE(accessors_.Contains(accessor), + accessors_waiting_session_queue_.Contains(accessor)) << "RemoveAccessor call was not balanced with AddAccessor call"; - accessors_.EraseAt(accessors_.Find(accessor)); - auto** it = std::find(accessors_waiting_session_queue_.begin(), - accessors_waiting_session_queue_.end(), accessor); - if (it != accessors_waiting_session_queue_.end()) - accessors_waiting_session_queue_.erase(it); + auto** it = std::find(accessors_.begin(), accessors_.end(), accessor); + if (it != accessors_.end()) { + accessors_.erase(it); + } else { + accessors_waiting_session_queue_.erase( + std::find(accessors_waiting_session_queue_.begin(), + accessors_waiting_session_queue_.end(), accessor)); + } if (accessors_.IsEmpty() && accessors_waiting_session_queue_.IsEmpty()) { session_result_ = midi::mojom::Result::NOT_INITIALIZED; inputs_.clear();
diff --git a/third_party/blink/renderer/platform/graphics/image_pattern.cc b/third_party/blink/renderer/platform/graphics/image_pattern.cc index 62a2e0e..7632a4e 100644 --- a/third_party/blink/renderer/platform/graphics/image_pattern.cc +++ b/third_party/blink/renderer/platform/graphics/image_pattern.cc
@@ -5,11 +5,8 @@ #include "third_party/blink/renderer/platform/graphics/image_pattern.h" #include "third_party/blink/renderer/platform/graphics/image.h" -#include "third_party/blink/renderer/platform/graphics/paint/paint_recorder.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_shader.h" -#include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h" #include "third_party/skia/include/core/SkImage.h" -#include "third_party/skia/include/core/SkSurface.h" namespace blink { @@ -20,13 +17,6 @@ ImagePattern::ImagePattern(scoped_refptr<Image> image, RepeatMode repeat_mode) : Pattern(repeat_mode), tile_image_(image->PaintImageForCurrentFrame()) { - previous_local_matrix_.setIdentity(); -} - -bool ImagePattern::IsLocalMatrixChanged(const SkMatrix& local_matrix) const { - if (IsRepeatXY()) - return Pattern::IsLocalMatrixChanged(local_matrix); - return local_matrix != previous_local_matrix_; } sk_sp<PaintShader> ImagePattern::CreateShader(const SkMatrix& local_matrix) { @@ -34,45 +24,11 @@ return PaintShader::MakeColor(SK_ColorTRANSPARENT); } - if (IsRepeatXY()) { - // Fast path: for repeatXY we just return a shader from the original image. - return PaintShader::MakeImage(tile_image_, SkShader::kRepeat_TileMode, - SkShader::kRepeat_TileMode, &local_matrix); - } - - // Skia does not have a "draw the tile only once" option. Clamp_TileMode - // repeats the last line of the image after drawing one tile. To avoid - // filling the space with arbitrary pixels, this workaround forces the - // image to have a line of transparent pixels on the "repeated" edge(s), - // thus causing extra space to be transparent filled. - SkShader::TileMode tile_mode_x = - IsRepeatX() ? SkShader::kRepeat_TileMode : SkShader::kClamp_TileMode; - SkShader::TileMode tile_mode_y = - IsRepeatY() ? SkShader::kRepeat_TileMode : SkShader::kClamp_TileMode; - int border_pixel_x = IsRepeatX() ? 0 : 1; - int border_pixel_y = IsRepeatY() ? 0 : 1; - - // Create a transparent image 2 pixels wider and/or taller than the - // original, then copy the orignal into the middle of it. - const SkRect tile_bounds = - SkRect::MakeWH(tile_image_.width() + 2 * border_pixel_x, - tile_image_.height() + 2 * border_pixel_y); - PaintRecorder recorder; - auto* canvas = recorder.beginRecording(tile_bounds); - - cc::PaintFlags paint; - paint.setBlendMode(SkBlendMode::kSrc); - canvas->drawImage(tile_image_, border_pixel_x, border_pixel_y, &paint); - - previous_local_matrix_ = local_matrix; - SkMatrix adjusted_matrix(local_matrix); - adjusted_matrix.postTranslate(-border_pixel_x, -border_pixel_y); - - // Note: we specify kFixedScale to lock-in the resolution (for 1px padding in - // particular). - return PaintShader::MakePaintRecord( - recorder.finishRecordingAsPicture(), tile_bounds, tile_mode_x, - tile_mode_y, &adjusted_matrix, PaintShader::ScalingBehavior::kFixedScale); + return PaintShader::MakeImage( + tile_image_, + IsRepeatX() ? SkShader::kRepeat_TileMode : SkShader::kDecal_TileMode, + IsRepeatY() ? SkShader::kRepeat_TileMode : SkShader::kDecal_TileMode, + &local_matrix); } bool ImagePattern::IsTextureBacked() const {
diff --git a/third_party/blink/renderer/platform/graphics/image_pattern.h b/third_party/blink/renderer/platform/graphics/image_pattern.h index db42125..cea1b6b3 100644 --- a/third_party/blink/renderer/platform/graphics/image_pattern.h +++ b/third_party/blink/renderer/platform/graphics/image_pattern.h
@@ -20,11 +20,9 @@ protected: sk_sp<PaintShader> CreateShader(const SkMatrix&) override; - bool IsLocalMatrixChanged(const SkMatrix&) const override; private: ImagePattern(scoped_refptr<Image>, RepeatMode); - SkMatrix previous_local_matrix_; PaintImage tile_image_; };
diff --git a/third_party/blink/renderer/platform/graphics/pattern.cc b/third_party/blink/renderer/platform/graphics/pattern.cc index 45512c2..f38adf2 100644 --- a/third_party/blink/renderer/platform/graphics/pattern.cc +++ b/third_party/blink/renderer/platform/graphics/pattern.cc
@@ -56,14 +56,10 @@ Pattern::~Pattern() = default; void Pattern::ApplyToFlags(PaintFlags& flags, const SkMatrix& local_matrix) { - if (!cached_shader_ || IsLocalMatrixChanged(local_matrix)) + if (!cached_shader_ || local_matrix != cached_shader_->GetLocalMatrix()) cached_shader_ = CreateShader(local_matrix); flags.setShader(cached_shader_); } -bool Pattern::IsLocalMatrixChanged(const SkMatrix& local_matrix) const { - return local_matrix != cached_shader_->GetLocalMatrix(); -} - } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/pattern.h b/third_party/blink/renderer/platform/graphics/pattern.h index 821b360..2f4968c 100644 --- a/third_party/blink/renderer/platform/graphics/pattern.h +++ b/third_party/blink/renderer/platform/graphics/pattern.h
@@ -71,7 +71,6 @@ protected: virtual sk_sp<PaintShader> CreateShader(const SkMatrix&) = 0; - virtual bool IsLocalMatrixChanged(const SkMatrix&) const; RepeatMode repeat_mode_;
diff --git a/third_party/blink/renderer/platform/heap/heap_compact.cc b/third_party/blink/renderer/platform/heap/heap_compact.cc index 661f655..551e005 100644 --- a/third_party/blink/renderer/platform/heap/heap_compact.cc +++ b/third_party/blink/renderer/platform/heap/heap_compact.cc
@@ -368,10 +368,14 @@ return force_compaction_gc_; } + // TODO(keishi): Should be enable after fixing the crashes. + if (marking_type == BlinkGC::kIncrementalMarking) + return false; + + // TODO(harukamt): Add kIncrementalIdleGC and kIncrementalV8FollowupGC when we + // enable heap compaction for incremental marking. if (reason != BlinkGC::GCReason::kIdleGC && reason != BlinkGC::GCReason::kPreciseGC && - reason != BlinkGC::GCReason::kIncrementalIdleGC && - reason != BlinkGC::GCReason::kIncrementalV8FollowupGC && reason != BlinkGC::GCReason::kForcedGC) return false;
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG index 0f08844..1ebcd03 100644 --- a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
@@ -320,8 +320,9 @@ crbug.com/591099 virtual/bidi-caret-affinity/editing/selection/word-granularity.html [ Crash ] crbug.com/916511 virtual/composite-after-paint/paint/background/scrolling-background-with-negative-z-child.html [ Failure ] crbug.com/591099 virtual/composite-after-paint/paint/invalidation/box/margin.html [ Failure Pass ] -crbug.com/591099 virtual/display-lock/display-lock/lock-before-append/measure-and-remove.html [ Failure ] +crbug.com/591099 virtual/display-lock/display-lock/lock-before-append/acquire-update-measure-remove.html [ Failure ] crbug.com/591099 virtual/display-lock/display-lock/lock-before-append/measure-forced-layout.html [ Failure ] +crbug.com/591099 virtual/display-lock/display-lock/lock-before-append/measure-updated-layout.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/ [ Skip ] crbug.com/591099 virtual/intersection-observer-v2/intersection-observer/v2/text-shadow.html [ Failure ] crbug.com/591099 virtual/layout_ng/ [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 03615dc9f..37ecb49 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -635,9 +635,9 @@ crbug.com/885175 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-004.html [ Failure ] crbug.com/855009 external/wpt/workers/semantics/structured-clone/dedicated.html [ Skip ] -crbug.com/855009 external/wpt/workers/semantics/structured-clone/shared.htm [ Skip ] +crbug.com/855009 external/wpt/workers/semantics/structured-clone/shared.html [ Skip ] crbug.com/855009 virtual/omt-worker-fetch/external/wpt/workers/semantics/structured-clone/dedicated.html [ Skip ] -crbug.com/855009 virtual/omt-worker-fetch/external/wpt/workers/semantics/structured-clone/shared.htm [ Skip ] +crbug.com/855009 virtual/omt-worker-fetch/external/wpt/workers/semantics/structured-clone/shared.html [ Skip ] # ====== Layout team owned tests to here ====== @@ -2253,6 +2253,9 @@ crbug.com/876732 [ Win Debug ] fast/dom/HTMLImageElement/image-srcset-w-onerror.html [ Failure Pass ] +# The test will pass once PassiveDocumentWheelEventListeners is enabled by default. +crbug.com/626196 external/wpt/dom/events/document-level-wheel-event-listener-passive-by-default-manual.html [ Failure ] + crbug.com/597221 fast/dom/Window/window-postmessage-clone-deep-array.html [ Failure ] crbug.com/597221 virtual/user-activation-v2/fast/dom/Window/window-postmessage-clone-deep-array.html [ Failure ] @@ -4611,6 +4614,14 @@ crbug.com/683800 [ Win7 Debug ] external/wpt/selection/ [ Failure Pass ] +# Arrow function name inferring +crbug.com/916975 http/tests/devtools/console/console-repeat-count.js [ Pass Failure ] +crbug.com/916975 http/tests/devtools/service-workers/lazy-addeventlisteners.js [ Pass Failure ] +crbug.com/916975 http/tests/devtools/sources/debugger-ui/call-stack-show-more.js [ Pass Failure ] +crbug.com/916975 http/tests/devtools/tracing/timeline-misc/timeline-event-causes.js [ Pass Failure ] +crbug.com/916975 inspector-protocol/css/media-query-listener-exception.js [ Pass Failure ] +crbug.com/916975 virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-event-causes.js [ Pass Failure ] + # Importing 'fetch' tests from WPT. crbug.com/705490 external/wpt/fetch/api/basic/error-after-response.html [ Timeout Pass ] crbug.com/705490 virtual/outofblink-cors/external/wpt/fetch/api/basic/error-after-response.html [ Timeout Pass ] @@ -5970,9 +5981,22 @@ crbug.com/v8/8381 http/tests/devtools/coverage/coverage-view-filter.js [ Pass Failure ] crbug.com/v8/8381 http/tests/devtools/coverage/coverage-view.js [ Pass Failure ] crbug.com/v8/8381 http/tests/devtools/coverage/multiple-instances-merge.js [ Pass Failure ] +crbug.com/v8/8381 http/tests/devtools/coverage/coverage-export.js [ Pass Failure ] # Sheriff 2018-12-20 crbug.com/916899 [ Win10 ] virtual/stable/webexposed/global-interface-listing-platform-specific.html [ Failure ] # TODO (michaelludwig): Todo after Skia roll and rebaseline crbug.com/915735 compositing/masks/mask-with-added-filters.html [ Pass Failure ] + +# ssauleau 2018-12-20 +crbug.com/v8/8319 external/wpt/wasm/jsapi/global/constructor.any.html [ Pass Failure ] +crbug.com/v8/8319 external/wpt/wasm/jsapi/global/constructor.any.worker.html [ Pass Failure ] +crbug.com/v8/8319 external/wpt/wasm/jsapi/global/value-get-set.any.html [ Pass Failure ] +crbug.com/v8/8319 external/wpt/wasm/jsapi/global/value-get-set.any.worker.html [ Pass Failure ] + +# ssauleau 2018-12-20 +crbug.com/v8/8319 external/wpt/wasm/jsapi/table/get-set.any.html [ Pass Failure ] +crbug.com/v8/8319 external/wpt/wasm/jsapi/table/get-set.any.worker.html [ Pass Failure ] +crbug.com/v8/8319 external/wpt/wasm/jsapi/table/grow.any.html [ Pass Failure ] +crbug.com/v8/8319 external/wpt/wasm/jsapi/table/grow.any.worker.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.txt b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.txt deleted file mode 100644 index 39735582..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.txt +++ /dev/null
@@ -1 +0,0 @@ -CONSOLE ERROR: line 23: Uncaught Expected Exception
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container-expected.html deleted file mode 100644 index a1a74ba..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container-expected.html +++ /dev/null
@@ -1,3 +0,0 @@ -<!doctype HTML> - -<div id="log">PASS</div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container-expected.txt b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container-expected.txt deleted file mode 100644 index 39735582..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container-expected.txt +++ /dev/null
@@ -1 +0,0 @@ -CONSOLE ERROR: line 23: Uncaught Expected Exception
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container.html deleted file mode 100644 index 5a90f59..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-removes-container.html +++ /dev/null
@@ -1,45 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, the callback throws. ---> - -<style> -#container { - contain: content; - width: 100px; - height: 100px; - background: lightblue; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function throwingFunction(context) { - throw "Expected Exception"; -} - -function finishTest(status_string, to_remove) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (to_remove) - to_remove.remove(); - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock(throwingFunction).then( - () => { finishTest("FAIL"); }, - () => { finishTest("PASS", container); }); - document.body.appendChild(container); -} - -window.onload = acquire; -</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws.html deleted file mode 100644 index e227724..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws.html +++ /dev/null
@@ -1,43 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, the callback throws. ---> - -<style> -#container { - contain: content; - width: 100px; - height: 100px; - background: lightblue; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function throwingFunction(context) { - throw "Expected Exception"; -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock(throwingFunction).then( - () => { finishTest("FAIL"); }, - () => { finishTest("PASS"); }); - document.body.appendChild(container); -} - -window.onload = acquire; -</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-commit-expected.html similarity index 100% rename from third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-expected.html rename to third_party/blink/web_tests/display-lock/lock-before-append/acquire-commit-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-commit.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-commit.html new file mode 100644 index 0000000..cf250d4 --- /dev/null +++ b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-commit.html
@@ -0,0 +1,52 @@ +<!doctype HTML> + +<!-- +Runs an acquire, appends a child, and calls commit. +--> + +<style> +#container { + contain: content; + width: 150px; + height: 150px; + background: lightblue; +} +#child { + width: 50px; + height: 50px; + background: lightgreen; +} +</style> + +<div id="log"></div> + +<script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. +if (window.testRunner) + window.testRunner.waitUntilDone(); + +function finishTest(status_string) { + if (document.getElementById("log").innerHTML === "") + document.getElementById("log").innerHTML = status_string; + if (window.testRunner) + window.testRunner.notifyDone(); +} + +function runTest() { + let container = document.createElement("div"); + container.getDisplayLock().acquire().then(() => { + let child = document.createElement("div"); + child.id = "child"; + container.appendChild(child); + + container.id = "container"; + document.body.appendChild(container); + + container.getDisplayLock().commit().then( + () => { finishTest("PASS"); }, + () => { finishTest("FAIL"); }); + }); +} + +window.onload = runTest; +</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock-expected.html deleted file mode 100644 index 358dfcb..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock-expected.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!doctype HTML> - -<style> -#container { - contain: paint; - width: 150px; - height: 150px; - background: lightblue; -} -#child { - width: 50px; - height: 50px; - background: lightgreen; -} -</style> - -<div id="log">PASS</div> -<div id="container"><div id="child"></div></div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-inline-fails-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-infinite-timeout-no-commit-expected.html similarity index 100% copy from third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-inline-fails-expected.html copy to third_party/blink/web_tests/display-lock/lock-before-append/acquire-infinite-timeout-no-commit-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-empty.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-infinite-timeout-no-commit.html similarity index 68% rename from third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-empty.html rename to third_party/blink/web_tests/display-lock/lock-before-append/acquire-infinite-timeout-no-commit.html index 32444df..78068c1 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-empty.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-infinite-timeout-no-commit.html
@@ -16,6 +16,7 @@ <div id="log"></div> <script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. if (window.testRunner) window.testRunner.waitUntilDone(); @@ -26,17 +27,16 @@ window.testRunner.notifyDone(); } -function acquire() { +function runTest() { let container = document.createElement("div"); container.id = "container"; - container.acquireDisplayLock((context) => { context.suspend(); }).then( - () => { finishTest("FAIL"); }, - () => { finishTest("FAIL"); }); - document.body.appendChild(container); - setTimeout(() => { finishTest("PASS"); }, 100); + container.getDisplayLock().acquire({ timeout: Infinity }).then(() => { + document.body.appendChild(container); + setTimeout(() => { finishTest("PASS"); }, 100); + }); } -window.onload = acquire; +window.onload = runTest; </script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-timeout-expected.html similarity index 75% copy from third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html copy to third_party/blink/web_tests/display-lock/lock-before-append/acquire-timeout-expected.html index cbb263b..09d5a52d4 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-timeout-expected.html
@@ -8,6 +8,6 @@ background: lightblue; } </style> -<div id="log">PASS</div> +<div id="log">PASS if container is visible</div> <div id="container"></div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-timeout.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-timeout.html new file mode 100644 index 0000000..69ef34e --- /dev/null +++ b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-timeout.html
@@ -0,0 +1,41 @@ +<!doctype HTML> + +<!-- +Runs an acquire(), which doesn't have a corresponding commit. +--> + +<style> +#container { + contain: content; + width: 100px; + height: 100px; + background: lightblue; +} +</style> + +<div id="log"></div> + +<script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. +if (window.testRunner) + window.testRunner.waitUntilDone(); + +function finishTest(status_string) { + if (document.getElementById("log").innerHTML === "") + document.getElementById("log").innerHTML = status_string; + if (window.testRunner) + window.testRunner.notifyDone(); +} + +function runTest() { + let container = document.createElement("div"); + container.id = "container"; + + container.getDisplayLock().acquire({ timeout: 100 }).then(() => { + document.body.appendChild(container); + setTimeout(() => { finishTest("PASS if container is visible"); }, 200); + }); +} + +window.onload = runTest; +</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-commit-expected.html similarity index 100% copy from third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-expected.html copy to third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-commit-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-commit.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-commit.html new file mode 100644 index 0000000..ae762308 --- /dev/null +++ b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-commit.html
@@ -0,0 +1,54 @@ +<!doctype HTML> + +<!-- +Runs an acquire, appends a child, and calls update, and then commit. +--> + +<style> +#container { + contain: content; + width: 150px; + height: 150px; + background: lightblue; +} +#child { + width: 50px; + height: 50px; + background: lightgreen; +} +</style> + +<div id="log"></div> + +<script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. +if (window.testRunner) + window.testRunner.waitUntilDone(); + +function finishTest(status_string) { + if (document.getElementById("log").innerHTML === "") + document.getElementById("log").innerHTML = status_string; + if (window.testRunner) + window.testRunner.notifyDone(); +} + +function runTest() { + let container = document.createElement("div"); + container.getDisplayLock().acquire({ timeout: Infinity }).then(() => { + let child = document.createElement("div"); + child.id = "child"; + container.appendChild(child); + + container.id = "container"; + document.body.appendChild(container); + + container.getDisplayLock().update().then(() => { + container.getDisplayLock().commit().then( + () => { finishTest("PASS"); }, + () => { finishTest("FAIL"); }); + }); + }); +} + +window.onload = runTest; +</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/measure-and-remove-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-measure-remove-expected.html similarity index 100% rename from third_party/blink/web_tests/display-lock/lock-before-append/measure-and-remove-expected.html rename to third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-measure-remove-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/measure-and-remove.html b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-measure-remove.html similarity index 68% rename from third_party/blink/web_tests/display-lock/lock-before-append/measure-and-remove.html rename to third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-measure-remove.html index ce482162..604eb696 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/measure-and-remove.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/acquire-update-measure-remove.html
@@ -1,8 +1,8 @@ <!doctype HTML> <!-- -Runs an acquireDisplayLock which constructs a subtree, and measures it in -the promise resolution. +Runs acquire, constructs a subtree, calls update and measures it in +the promise resolotion, which also removes the element from the DOM. --> <style> @@ -58,19 +58,22 @@ return child; } -function construct(context) { - context.lockedElement.appendChild(createChild("0")); - context.lockedElement.appendChild(createChild("1")); - context.lockedElement.appendChild(createChild("2")); +function construct(container) { + container.appendChild(createChild("0")); + container.appendChild(createChild("1")); + container.appendChild(createChild("2")); } -function acquire() { +function runTest() { let container = document.createElement("div"); container.id = "container"; - container.acquireDisplayLock(construct).then(measureAndRemove).then(finish); - document.getElementById("empty").appendChild(container); + container.getDisplayLock().acquire().then(() => { + construct(container); + document.getElementById("empty").appendChild(container); + container.getDisplayLock().update().then(measureAndRemove).then(finish); + }); } -window.onload = acquire; +window.onload = runTest; </script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-added-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-added-containment-expected.html similarity index 100% rename from third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-added-expected.html rename to third_party/blink/web_tests/display-lock/lock-before-append/commit-on-added-containment-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-added.html b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-added-containment.html similarity index 64% rename from third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-added.html rename to third_party/blink/web_tests/display-lock/lock-before-append/commit-on-added-containment.html index 10e70a9..c588863 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-added.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-added-containment.html
@@ -1,8 +1,8 @@ <!doctype HTML> <!-- -Runs an acquireDisplayLock on an element that doesn't have containment. -The callback adds containment. +Runs an acquire on a container with no containment, then adds +containment and commits. --> <style> @@ -16,13 +16,10 @@ <div id="log"></div> <script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. if (window.testRunner) window.testRunner.waitUntilDone(); -function addContainment(context) { - context.lockedElement.classList = "contained"; -} - function finishTest(status_string) { if (document.getElementById("log").innerHTML === "") document.getElementById("log").innerHTML = status_string; @@ -30,14 +27,18 @@ window.testRunner.notifyDone(); } -function acquire() { +async function runTest() { let container = document.createElement("div"); - container.acquireDisplayLock(addContainment).then( + await container.getDisplayLock().acquire(); + + container.classList = "contained"; + document.body.appendChild(container); + + container.getDisplayLock().commit().then( () => { finishTest("PASS"); }, () => { finishTest("FAIL"); }); - document.body.appendChild(container); } -window.onload = acquire; +window.onload = runTest; </script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-inline-fails-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-inline-fails-expected.html similarity index 100% rename from third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-inline-fails-expected.html rename to third_party/blink/web_tests/display-lock/lock-before-append/commit-on-inline-fails-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-inline-fails.html b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-inline-fails.html similarity index 68% rename from third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-inline-fails.html rename to third_party/blink/web_tests/display-lock/lock-before-append/commit-on-inline-fails.html index 7033b03..cc777c5 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-inline-fails.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-inline-fails.html
@@ -1,10 +1,8 @@ <!doctype HTML> <!-- -Runs an acquireDisplayLock on an element that doesn't has contain: paint, but -is an inline, which means we won't actually apply paint containment. - -This rejects the promise. +Runs an acquire on an inline with containment, commit fails +since the containment isn't actually applied. --> <style> @@ -16,6 +14,7 @@ <div id="log"></div> <script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. if (window.testRunner) window.testRunner.waitUntilDone(); @@ -26,13 +25,14 @@ window.testRunner.notifyDone(); } -function acquire() { +async function acquire() { let container = document.createElement("span"); container.id = "container"; - container.acquireDisplayLock((context) => {}).then( + await container.getDisplayLock().acquire(); + document.body.appendChild(container); + container.getDisplayLock().commit().then( () => { finishTest("FAIL"); }, () => { finishTest("PASS"); }); - document.body.appendChild(container); } window.onload = acquire;
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-fails-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-no-containment-fails-expected.html similarity index 100% rename from third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-fails-expected.html rename to third_party/blink/web_tests/display-lock/lock-before-append/commit-on-no-containment-fails-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-fails.html b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-no-containment-fails.html similarity index 70% rename from third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-fails.html rename to third_party/blink/web_tests/display-lock/lock-before-append/commit-on-no-containment-fails.html index 904775b..f61e972 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-on-no-containment-fails.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/commit-on-no-containment-fails.html
@@ -1,13 +1,14 @@ <!doctype HTML> <!-- -Runs an acquireDisplayLock on an element that doesn't have containment. +Runs acquire and commit on an element that doesn't have containment. This rejects the promise. --> <div id="log"></div> <script> +// TODO(vmpstr): This can be a testharness test. if (window.testRunner) window.testRunner.waitUntilDone(); @@ -18,12 +19,13 @@ window.testRunner.notifyDone(); } -function acquire() { +async function acquire() { let container = document.createElement("div"); - container.acquireDisplayLock((context) => {}).then( + await container.getDisplayLock().acquire(); + document.body.appendChild(container); + container.getDisplayLock().commit().then( () => { finishTest("FAIL"); }, () => { finishTest("PASS"); }); - document.body.appendChild(container); } window.onload = acquire;
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/commit-without-acquire-fails-expected.html similarity index 81% rename from third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html rename to third_party/blink/web_tests/display-lock/lock-before-append/commit-without-acquire-fails-expected.html index cbb263b..e9730df 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/commit-without-acquire-fails-expected.html
@@ -3,11 +3,11 @@ <style> #container { contain: content; - width: 100px; - height: 100px; + width: 150px; + height: 150px; background: lightblue; } </style> + <div id="log">PASS</div> <div id="container"></div> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock.html b/third_party/blink/web_tests/display-lock/lock-before-append/commit-without-acquire-fails.html similarity index 64% rename from third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock.html rename to third_party/blink/web_tests/display-lock/lock-before-append/commit-without-acquire-fails.html index b70f886..f1e3177a 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/commit-without-acquire-fails.html
@@ -1,7 +1,7 @@ <!doctype HTML> <!-- -Runs an acquireDisplayLock, which appends a child. +Calls commit without first acquiring, which fails. --> <style> @@ -21,15 +21,10 @@ <div id="log"></div> <script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. if (window.testRunner) window.testRunner.waitUntilDone(); -function modifyDom(context) { - let child = document.createElement("div"); - child.id = "child"; - context.lockedElement.appendChild(child); -} - function finishTest(status_string) { if (document.getElementById("log").innerHTML === "") document.getElementById("log").innerHTML = status_string; @@ -37,14 +32,14 @@ window.testRunner.notifyDone(); } -function acquire() { +function runTest() { let container = document.createElement("div"); container.id = "container"; - container.acquireDisplayLock(modifyDom).then( - () => { finishTest("PASS"); }, - () => { finishTest("FAIL"); }); + container.getDisplayLock().commit().then( + () => { finishTest("FAIL"); }, + () => { finishTest("PASS"); }); document.body.appendChild(container); } -window.onload = acquire; +window.onload = runTest; </script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-empty-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-empty-expected.html deleted file mode 100644 index a1a74ba..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-empty-expected.html +++ /dev/null
@@ -1,3 +0,0 @@ -<!doctype HTML> - -<div id="log">PASS</div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-expected.html deleted file mode 100644 index a1a74ba..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-expected.html +++ /dev/null
@@ -1,3 +0,0 @@ -<!doctype HTML> - -<div id="log">PASS</div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-no-schedules-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-no-schedules-expected.html deleted file mode 100644 index a1a74ba..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-no-schedules-expected.html +++ /dev/null
@@ -1,3 +0,0 @@ -<!doctype HTML> - -<div id="log">PASS</div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-no-schedules.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-no-schedules.html deleted file mode 100644 index cbb8bebd..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-no-schedules.html +++ /dev/null
@@ -1,57 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which changes DOM and suspends the context. -DOM changes should never be visible. ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child { - width: 50px; - height: 50px; - background: red; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function modifyDom(context) { - let child = document.createElement("div"); - child.id = "child"; - context.lockedElement.appendChild(child); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock( - (context) => { - modifyDom(context); - context.suspend(); - }).then( - () => { finishTest("FAIL"); }, - () => { finishTest("FAIL"); }); - document.body.appendChild(container); - setTimeout(() => { finishTest("PASS"); }, 100); -} - -window.onload = acquire; -</script> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-empty-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-empty-expected.html deleted file mode 100644 index 808c279..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-empty-expected.html +++ /dev/null
@@ -1,12 +0,0 @@ -<!doctype HTML> - -<style> -#container { - contain: content; - width: 100px; - height: 100px; -} -</style> - -<div id="log">PASS</div> -<div id="container"></div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-empty.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-empty.html deleted file mode 100644 index 657d653..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-empty.html +++ /dev/null
@@ -1,50 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which suspends the context. -The context is then resumed which is when the promise resolves. ---> - -<style> -#container { - contain: content; - width: 100px; - height: 100px; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let current_status = "FAIL"; - let resume_handle; - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock((context) => { - resume_handle = context.suspend(); - }).then( - () => { finishTest(current_status); }, - () => { finishTest("FAIL - rejected"); }); - document.body.appendChild(container); - setTimeout(() => { - current_status = "PASS"; - resume_handle.resume(); - }, 100); -} - -window.onload = acquire; -</script> - - -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume.html deleted file mode 100644 index de2e9801..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume.html +++ /dev/null
@@ -1,67 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which suspends the context and schedules -a continuation; later resumes the context. ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#pass_child { - width: 50px; - height: 50px; - background: lightgreen; -} -#fail_child { - width: 50px; - height: 50px; - background: red; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -var child_class = "fail_child"; -function modifyDom(context) { - let child = document.createElement("div"); - child.id = child_class; - context.lockedElement.appendChild(child); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let current_status = "FAIL"; - let resume_handle; - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock((context) => { - context.schedule(modifyDom); - resume_handle = context.suspend(); - }).then( - () => { finishTest(current_status); }, - () => { finishTest("FAIL - rejected"); }); - document.body.appendChild(container); - setTimeout(() => { - current_status = "PASS"; - child_class = "pass_child"; - resume_handle.resume(); - }, 100); -} - -window.onload = acquire; -</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend.html deleted file mode 100644 index 3bbece4..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend.html +++ /dev/null
@@ -1,58 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which suspends the context and schedules -a continuation, which should never run. ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child { - width: 50px; - height: 50px; - background: red; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function modifyDom(context) { - let child = document.createElement("div"); - child.id = "child"; - // Append to body directly so it's clear whether this runs or not. - document.body.appendChild(child); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock( - (context) => { - context.schedule(modifyDom); - context.suspend(); - }).then( - () => { finishTest("FAIL"); }, - () => { finishTest("FAIL"); }); - document.body.appendChild(container); - setTimeout(() => { finishTest("PASS"); }, 50); -} - -window.onload = acquire; -</script> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-two-suspend-resume-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-two-suspend-resume-expected.html deleted file mode 100644 index ad35377d..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-two-suspend-resume-expected.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!doctype HTML> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child { - width: 50px; - height: 50px; - background: lightgreen; -} -</style> - -<div id="log">PASS</div> -<div id="container"><div id="child"></div></div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-two-suspend-resume.html b/third_party/blink/web_tests/display-lock/lock-before-append/context-two-suspend-resume.html deleted file mode 100644 index 8dc73cb4..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/context-two-suspend-resume.html +++ /dev/null
@@ -1,73 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which suspends the context twice and schedules -a continuation; later resumes the context (twice). ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#pass_child { - width: 50px; - height: 50px; - background: lightgreen; -} -#fail_child { - width: 50px; - height: 50px; - background: red; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -var child_class = "fail_child"; -function modifyDom(context) { - let child = document.createElement("div"); - child.id = child_class; - context.lockedElement.appendChild(child); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let current_status = "FAIL"; - let resume_handle1; - let resume_handle2; - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock((context) => { - context.schedule(modifyDom); - resume_handle1 = context.suspend(); - resume_handle2 = context.suspend(); - }).then( - () => { finishTest(current_status); }, - () => { finishTest("FAIL - rejected"); }); - document.body.appendChild(container); - setTimeout(() => { - resume_handle1.resume(); - setTimeout(() => { - current_status = "PASS"; - child_class = "pass_child"; - resume_handle2.resume(); - }, 100); - }, 100); -} - -window.onload = acquire; -</script> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/element-retained-by-context-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/element-retained-by-context-expected.html deleted file mode 100644 index ad35377d..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/element-retained-by-context-expected.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!doctype HTML> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child { - width: 50px; - height: 50px; - background: lightgreen; -} -</style> - -<div id="log">PASS</div> -<div id="container"><div id="child"></div></div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/element-retained-by-context.html b/third_party/blink/web_tests/display-lock/lock-before-append/element-retained-by-context.html deleted file mode 100644 index 8cce7f6..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/element-retained-by-context.html +++ /dev/null
@@ -1,63 +0,0 @@ -<!doctype HTML> - -<!-- -Suspends a context with a continuation to append locked element. Before resuming, -calls gc to ensure that we still retain the locked element. ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child { - width: 50px; - height: 50px; - background: lightgreen; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function appendLockedToBody(context) { - document.body.appendChild(context.lockedElement); -} - -function scheduleAndSuspend(context) { - let child = document.createElement("div"); - child.id = "child"; - context.lockedElement.appendChild(child); - context.schedule(appendLockedToBody); - return context.suspend(); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - let resume_handle; - container.acquireDisplayLock((context) => { - resume_handle = scheduleAndSuspend(context); - }).then( - () => { finishTest("PASS"); }, - () => { finishTest("FAIL"); }); - setTimeout(() => { - gc(); - resume_handle.resume(); - }, 100); -} - -window.onload = acquire; -</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/measure-forced-layout.html b/third_party/blink/web_tests/display-lock/lock-before-append/measure-forced-layout.html index 5554624..c6df5c9 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/measure-forced-layout.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/measure-forced-layout.html
@@ -1,8 +1,9 @@ <!doctype HTML> <!-- -Runs an acquireDisplayLock which constructs and measures a subtree. -This should do a forced layout. +Runs an acquire, which constructs and measures a subtree. +This should do a forced layout. Commit also measures it to get +post-final-layout values. --> <style> @@ -39,46 +40,53 @@ return child; } - function measure(context) { - context.lockedElement.appendChild(createChild("0")); - context.lockedElement.appendChild(createChild("1")); - context.lockedElement.appendChild(createChild("2")); - + function measureForced() { t.step(() => { // Ensure children are laid out; this forces a layout. - assert_equals(document.getElementById("0").offsetTop, 0, "0 in measure"); - assert_equals(document.getElementById("1").offsetTop, 20, "1 in measure"); - assert_equals(document.getElementById("2").offsetTop, 40, "2 in measure"); + assert_equals(document.getElementById("0").offsetTop, 0, "0 forced"); + assert_equals(document.getElementById("1").offsetTop, 20, "1 forced"); + assert_equals(document.getElementById("2").offsetTop, 40, "2 forced"); // Both parent should be 0 height, since it's locked. Both parent and spacers // should have 8 offsetTop. - assert_equals(document.getElementById("parent").offsetTop, 8, "parent in measure"); - assert_equals(document.getElementById("spacer").offsetTop, 8, "spacer in measure"); + assert_equals(document.getElementById("parent").offsetTop, 8, "parent forced"); + assert_equals(document.getElementById("spacer").offsetTop, 8, "spacer forced"); }); } - function acquire() { + function measureInCommit() { + t.step(() => { + // Ensure children are still laid out. + assert_equals(document.getElementById("0").offsetTop, 0, "0 in commit"); + assert_equals(document.getElementById("1").offsetTop, 20, "1 in commit"); + assert_equals(document.getElementById("2").offsetTop, 40, "2 in commit"); + // Now the parent should encompass a container, so spacer is pushed down. + assert_equals(document.getElementById("parent").offsetTop, 8, "parent in commit"); + assert_equals(document.getElementById("spacer").offsetTop, 108, "spacer in commit"); + }); + } + + function construct(container) { + container.appendChild(createChild("0")); + container.appendChild(createChild("1")); + container.appendChild(createChild("2")); + } + + async function runTest() { let container = document.createElement("div"); container.id = "container"; - container.acquireDisplayLock(measure).then(() => { - // We have to do the final measurement on the next frame, since in the promise - // resolution we still can be relocked. - window.requestAnimationFrame(() => { - t.step(() => { - // Ensure children are still laid out. - assert_equals(document.getElementById("0").offsetTop, 0, "0 in completion"); - assert_equals(document.getElementById("1").offsetTop, 20, "1 in completion"); - assert_equals(document.getElementById("2").offsetTop, 40, "2 in completion"); - // Now the parent should encompass a container, so spacer is pushed down. - assert_equals(document.getElementById("parent").offsetTop, 8, "parent in completion"); - assert_equals(document.getElementById("spacer").offsetTop, 108, "spacer in completion"); - }); - t.done(); - }); - }); + await container.getDisplayLock().acquire(); + document.getElementById("parent").appendChild(container); + construct(container); + measureForced(); + + container.getDisplayLock().commit().then(() => { + measureInCommit(); + t.done(); + }); } - acquire(); + runTest(); }, "Measure Forced Layout"); </script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/measure-updated-layout.html b/third_party/blink/web_tests/display-lock/lock-before-append/measure-updated-layout.html new file mode 100644 index 0000000..67ad858 --- /dev/null +++ b/third_party/blink/web_tests/display-lock/lock-before-append/measure-updated-layout.html
@@ -0,0 +1,94 @@ +<!doctype HTML> + +<!-- +Runs an acquire, which constructs and measures a subtree. +This should do a forced layout. Commit also measures it to get +post-final-layout values. +--> + +<style> +#container { + contain: content; + width: 100px; + height: 100px; + background: lightgreen; +} +.child { + width: 20px; + height: 20%; + background: cyan; +} +#spacer { + width: 150px; + height: 150px; + background: green; +} +</style> + +<div id="parent"></div> +<div id="spacer"></div> + +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> + +<script> +async_test((t) => { + function createChild(id) { + let child = document.createElement("div"); + child.classList = "child"; + child.id = id; + return child; + } + + function construct(container) { + container.appendChild(createChild("0")); + container.appendChild(createChild("1")); + container.appendChild(createChild("2")); + } + + function measureInUpdate() { + t.step(() => { + // Ensure children are laid out; this forces a layout. + assert_equals(document.getElementById("0").offsetTop, 0, "0 in update"); + assert_equals(document.getElementById("1").offsetTop, 20, "1 in update"); + assert_equals(document.getElementById("2").offsetTop, 40, "2 in update"); + // Both parent should be 0 height, since it's locked. Both parent and spacers + // should have 8 offsetTop. + assert_equals(document.getElementById("parent").offsetTop, 8, "parent in update"); + assert_equals(document.getElementById("spacer").offsetTop, 8, "spacer in update"); + }); + } + + function measureInCommit() { + t.step(() => { + // Ensure children are still laid out. + assert_equals(document.getElementById("0").offsetTop, 0, "0 in commit"); + assert_equals(document.getElementById("1").offsetTop, 20, "1 in commit"); + assert_equals(document.getElementById("2").offsetTop, 40, "2 in commit"); + // Now the parent should encompass a container, so spacer is pushed down. + assert_equals(document.getElementById("parent").offsetTop, 8, "parent in commit"); + assert_equals(document.getElementById("spacer").offsetTop, 108, "spacer in commit"); + }); + } + + async function runTest() { + let container = document.createElement("div"); + container.id = "container"; + await container.getDisplayLock().acquire(); + + document.getElementById("parent").appendChild(container); + construct(container); + + container.getDisplayLock().update().then(() => { + measureInUpdate(); + container.getDisplayLock().commit().then(() => { + measureInCommit(); + t.done(); + }); + }); + } + + runTest(); +}, "Measure Updated Layout"); +</script> +
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/multiple-acquires-all-succeed-expected.html similarity index 100% copy from third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-expected.html copy to third_party/blink/web_tests/display-lock/lock-before-append/multiple-acquires-all-succeed-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-acquires-all-succeed.html b/third_party/blink/web_tests/display-lock/lock-before-append/multiple-acquires-all-succeed.html new file mode 100644 index 0000000..9d9444ed2 --- /dev/null +++ b/third_party/blink/web_tests/display-lock/lock-before-append/multiple-acquires-all-succeed.html
@@ -0,0 +1,64 @@ +<!doctype HTML> + +<!-- +Runs multiple acquires and updates. +--> + +<style> +#container { + contain: content; + width: 150px; + height: 150px; + background: lightblue; +} +#child { + width: 50px; + height: 50px; + background: lightgreen; +} +</style> + +<div id="log"></div> + +<script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. +if (window.testRunner) + window.testRunner.waitUntilDone(); + +function finishTest(status_string) { + if (document.getElementById("log").innerHTML === "") + document.getElementById("log").innerHTML = status_string; + if (window.testRunner) + window.testRunner.notifyDone(); +} + +function runTest() { + let container = document.createElement("div"); + Promise.all([ + container.getDisplayLock().acquire(), + container.getDisplayLock().acquire(), + container.getDisplayLock().acquire(), + container.getDisplayLock().acquire() + ]).then(() => { + let child = document.createElement("div"); + child.id = "child"; + container.appendChild(child); + + container.id = "container"; + document.body.appendChild(container); + + Promise.all([ + container.getDisplayLock().update(), + container.getDisplayLock().update(), + container.getDisplayLock().update(), + container.getDisplayLock().update() + ]).then(() => { + container.getDisplayLock().commit().then( + () => { finishTest("PASS"); }, + () => { finishTest("FAIL"); }); + }); + }); +} + +window.onload = runTest; +</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-expected.html deleted file mode 100644 index a642ca2d..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-expected.html +++ /dev/null
@@ -1,32 +0,0 @@ -<!doctype HTML> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child1 { - width: 20px; - height: 20px; - background: lightgreen; -} -#child2 { - width: 20px; - height: 20px; - background: lightyellow; -} -#child3 { - width: 20px; - height: 20px; - background: lightpink; -} -</style> - -<div id="log">PASS</div> -<div id="container"> - <div id="child1"></div> - <div id="child2"></div> - <div id="child3"></div> -</div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-recursive-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-recursive-expected.html deleted file mode 100644 index e19ce30..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-recursive-expected.html +++ /dev/null
@@ -1,27 +0,0 @@ -<!doctype HTML> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -.child { - width: 20px; - height: 20px; - background: lightgreen; -} -</style> - -<div id="log">PASS</div> -<div id="container"> - <div class="child">1</div> - <div class="child">2</div> - <div class="child">3</div> - <div class="child">4</div> - <div class="child">5</div> - <div class="child">6</div> - <div class="child">7</div> -</div> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-recursive.html b/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-recursive.html deleted file mode 100644 index ab977bc..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules-recursive.html +++ /dev/null
@@ -1,63 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which appends the first child and schedules two -continuations. The continuations append second and third children as well -as scheduling two more continuations each, for a total of 7 children. ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -.child { - width: 20px; - height: 20px; - background: lightgreen; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function createChild(id) { - let child = document.createElement("div"); - child.classList = "child"; - child.innerHTML = "" + id; - return child; -} - -function addChild(id, context) { - context.lockedElement.appendChild(createChild(id)); - if (id > 3) - return; - context.schedule((context) => { addChild(id * 2, context); }); - context.schedule((context) => { addChild(id * 2 + 1, context); }); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock( - (context) => { addChild(1, context) }).then( - () => { finishTest("PASS"); }, - () => { finishTest("FAIL"); }); - document.body.appendChild(container); -} - -window.onload = acquire; -</script> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules.html b/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules.html deleted file mode 100644 index a9c4f79..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/multiple-schedules.html +++ /dev/null
@@ -1,76 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which appends the first child and schedules two -continuations, which append the second and the third children. ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child1 { - width: 20px; - height: 20px; - background: lightgreen; -} -#child2 { - width: 20px; - height: 20px; - background: lightyellow; -} -#child3 { - width: 20px; - height: 20px; - background: lightpink; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function createChild(id) { - let child = document.createElement("div"); - child.id = id; - return child; -} - -function addChild3(context) { - context.lockedElement.appendChild(createChild("child3")); -} - -function addChild2(context) { - context.lockedElement.appendChild(createChild("child2")); -} - -function addChild1(context) { - context.lockedElement.appendChild(createChild("child1")); - context.schedule(addChild2); - context.schedule(addChild3); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock(addChild1).then( - () => { finishTest("PASS"); }, - () => { finishTest("FAIL"); }); - document.body.appendChild(container); -} - -window.onload = acquire; -</script> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-1-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-1-expected.html deleted file mode 100644 index 290e473..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-1-expected.html +++ /dev/null
@@ -1,26 +0,0 @@ -<!doctype HTML> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child1 { - width: 50px; - height: 50px; - background: lightgreen; -} -#child2 { - width: 50px; - height: 50px; - background: lightyellow; -} -</style> - -<div id="log">PASS</div> -<div id="container"> - <div id="child1"></div> - <div id="child2"></div> -</div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-1.html b/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-1.html deleted file mode 100644 index 4ad698fa..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-1.html +++ /dev/null
@@ -1,66 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which appends the first child and schedules a -continuation, which in turn appends the second child. ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child1 { - width: 50px; - height: 50px; - background: lightgreen; -} -#child2 { - width: 50px; - height: 50px; - background: lightyellow; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function createChild(id) { - let child = document.createElement("div"); - child.id = id; - return child; -} - -function addChild2(context) { - context.lockedElement.appendChild(createChild("child2")); -} - -function addChild1(context) { - context.lockedElement.appendChild(createChild("child1")); - context.schedule(addChild2); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock(addChild1).then( - () => { finishTest("PASS"); }, - () => { finishTest("FAIL"); }); - document.body.appendChild(container); -} - -window.onload = acquire; -</script> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-2-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-2-expected.html deleted file mode 100644 index 290e473..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-2-expected.html +++ /dev/null
@@ -1,26 +0,0 @@ -<!doctype HTML> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child1 { - width: 50px; - height: 50px; - background: lightgreen; -} -#child2 { - width: 50px; - height: 50px; - background: lightyellow; -} -</style> - -<div id="log">PASS</div> -<div id="container"> - <div id="child1"></div> - <div id="child2"></div> -</div>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-2.html b/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-2.html deleted file mode 100644 index 9602446..0000000 --- a/third_party/blink/web_tests/display-lock/lock-before-append/simple-schedule-2.html +++ /dev/null
@@ -1,66 +0,0 @@ -<!doctype HTML> - -<!-- -Runs an acquireDisplayLock, which first schedules a continuation and then -appends the first child. The continuation appends the second child. ---> - -<style> -#container { - contain: content; - width: 150px; - height: 150px; - background: lightblue; -} -#child1 { - width: 50px; - height: 50px; - background: lightgreen; -} -#child2 { - width: 50px; - height: 50px; - background: lightyellow; -} -</style> - -<div id="log"></div> - -<script> -if (window.testRunner) - window.testRunner.waitUntilDone(); - -function createChild(id) { - let child = document.createElement("div"); - child.id = id; - return child; -} - -function addChild2(context) { - context.lockedElement.appendChild(createChild("child2")); -} - -function addChild1(context) { - context.schedule(addChild2); - context.lockedElement.appendChild(createChild("child1")); -} - -function finishTest(status_string) { - if (document.getElementById("log").innerHTML === "") - document.getElementById("log").innerHTML = status_string; - if (window.testRunner) - window.testRunner.notifyDone(); -} - -function acquire() { - let container = document.createElement("div"); - container.id = "container"; - container.acquireDisplayLock(addChild1).then( - () => { finishTest("PASS"); }, - () => { finishTest("FAIL"); }); - document.body.appendChild(container); -} - -window.onload = acquire; -</script> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/update-together-with-commit-both-succeed-expected.html similarity index 100% copy from third_party/blink/web_tests/display-lock/lock-before-append/context-suspend-resume-expected.html copy to third_party/blink/web_tests/display-lock/lock-before-append/update-together-with-commit-both-succeed-expected.html
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/update-together-with-commit-both-succeed.html b/third_party/blink/web_tests/display-lock/lock-before-append/update-together-with-commit-both-succeed.html new file mode 100644 index 0000000..f2dcef7c --- /dev/null +++ b/third_party/blink/web_tests/display-lock/lock-before-append/update-together-with-commit-both-succeed.html
@@ -0,0 +1,54 @@ +<!doctype HTML> + +<!-- +Runs an acquire, then update and commit synchronously, both should succeed. +--> + +<style> +#container { + contain: content; + width: 150px; + height: 150px; + background: lightblue; +} +#child { + width: 50px; + height: 50px; + background: lightgreen; +} +</style> + +<div id="log"></div> + +<script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. +if (window.testRunner) + window.testRunner.waitUntilDone(); + +function finishTest(status_string) { + if (document.getElementById("log").innerHTML === "") + document.getElementById("log").innerHTML = status_string; + if (window.testRunner) + window.testRunner.notifyDone(); +} + +function runTest() { + let container = document.createElement("div"); + container.getDisplayLock().acquire().then(() => { + let child = document.createElement("div"); + child.id = "child"; + container.appendChild(child); + + container.id = "container"; + document.body.appendChild(container); + + Promise.all([ + container.getDisplayLock().update(), + container.getDisplayLock().commit() + ]).then(() => { finishTest("PASS"); }, + () => { finishTest("FAIL"); }); + }); +} + +window.onload = runTest; +</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html b/third_party/blink/web_tests/display-lock/lock-before-append/update-without-acquire-fails-expected.html similarity index 81% copy from third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html copy to third_party/blink/web_tests/display-lock/lock-before-append/update-without-acquire-fails-expected.html index cbb263b..e9730df 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-callback-throws-expected.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/update-without-acquire-fails-expected.html
@@ -3,11 +3,11 @@ <style> #container { contain: content; - width: 100px; - height: 100px; + width: 150px; + height: 150px; background: lightblue; } </style> + <div id="log">PASS</div> <div id="container"></div> -
diff --git a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock.html b/third_party/blink/web_tests/display-lock/lock-before-append/update-without-acquire-fails.html similarity index 64% copy from third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock.html copy to third_party/blink/web_tests/display-lock/lock-before-append/update-without-acquire-fails.html index b70f886..ce6ad74 100644 --- a/third_party/blink/web_tests/display-lock/lock-before-append/acquire-display-lock.html +++ b/third_party/blink/web_tests/display-lock/lock-before-append/update-without-acquire-fails.html
@@ -1,7 +1,7 @@ <!doctype HTML> <!-- -Runs an acquireDisplayLock, which appends a child. +Calls update without first calling acquire, which fails. --> <style> @@ -21,15 +21,10 @@ <div id="log"></div> <script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. if (window.testRunner) window.testRunner.waitUntilDone(); -function modifyDom(context) { - let child = document.createElement("div"); - child.id = "child"; - context.lockedElement.appendChild(child); -} - function finishTest(status_string) { if (document.getElementById("log").innerHTML === "") document.getElementById("log").innerHTML = status_string; @@ -37,14 +32,14 @@ window.testRunner.notifyDone(); } -function acquire() { +function runTest() { let container = document.createElement("div"); container.id = "container"; - container.acquireDisplayLock(modifyDom).then( - () => { finishTest("PASS"); }, - () => { finishTest("FAIL"); }); + container.getDisplayLock().update().then( + () => { finishTest("FAIL"); }, + () => { finishTest("PASS"); }); document.body.appendChild(container); } -window.onload = acquire; +window.onload = runTest; </script>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json index dc84a50..07edf2a 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
@@ -280116,6 +280116,12 @@ {} ] ], + "webrtc/protocol/missing-fields.html": [ + [ + "/webrtc/protocol/missing-fields.html", + {} + ] + ], "webrtc/protocol/msid-parse.html": [ [ "/webrtc/protocol/msid-parse.html", @@ -446060,7 +446066,7 @@ "support" ], "webauthn/createcredential-badargs-challenge.https.html": [ - "0ad67f2a444bd6e52e928d93dfd6e61d9077b909", + "f4d187e634d299f392fd7c64fc19b07779ff3a23", "testharness" ], "webauthn/createcredential-badargs-rp.https-expected.txt": [ @@ -447487,6 +447493,10 @@ "88bdfcfc2867335ca53c30f5637b38b3d12c64ca", "testharness" ], + "webrtc/protocol/missing-fields.html": [ + "d5aafd230e11f56457b93ccaaf480beabb8a737b", + "testharness" + ], "webrtc/protocol/msid-parse-expected.txt": [ "e6f3f372122735b12d75a4f108cc38fe766fe718", "support"
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/scroll/2d.scrollPathIntoView.verticalRL-expected.txt b/third_party/blink/web_tests/external/wpt/2dcontext/scroll/2d.scrollPathIntoView.verticalRL-expected.txt index df06e476..d136249 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/scroll/2d.scrollPathIntoView.verticalRL-expected.txt +++ b/third_party/blink/web_tests/external/wpt/2dcontext/scroll/2d.scrollPathIntoView.verticalRL-expected.txt
@@ -1,4 +1,4 @@ This is a testharness.js-based test. -FAIL scrollPathIntoView() works in vertical-rl writing mode assert_equals: Math.round(rect.right) === viewportWidth + (canvasWidth - 4 - 16) (got 585[number], expected 865[number]) expected 865 but got 585 +FAIL scrollPathIntoView() works in vertical-rl writing mode assert_equals: Math.round(rect.right) === viewportWidth + (canvasWidth - 4 - 16) (got 584[number], expected 865[number]) expected 865 but got 584 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/background-fetch/fetch.https.window-expected.txt index 6b56605..1b82cd24 100644 --- a/third_party/blink/web_tests/external/wpt/background-fetch/fetch.https.window-expected.txt +++ b/third_party/blink/web_tests/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -16,5 +16,6 @@ PASS Matching to a non-existing request should work PASS Matching multiple times on the same request works as expected. PASS Responses failing CORS checks are not leaked +PASS Access to active fetches is supported. Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/background-fetch/fetch.https.window.js b/third_party/blink/web_tests/external/wpt/background-fetch/fetch.https.window.js index a806414..a057a2fb 100644 --- a/third_party/blink/web_tests/external/wpt/background-fetch/fetch.https.window.js +++ b/third_party/blink/web_tests/external/wpt/background-fetch/fetch.https.window.js
@@ -1,6 +1,7 @@ // META: script=/common/get-host-info.sub.js // META: script=/service-workers/service-worker/resources/test-helpers.sub.js // META: script=resources/utils.js + 'use strict'; // Covers basic functionality provided by BackgroundFetchManager.fetch(). @@ -340,3 +341,29 @@ assert_equals(eventRegistration.id, registration.id); assert_equals(eventRegistration.downloaded, 0); }, 'Responses failing CORS checks are not leaked'); + +backgroundFetchTest(async (test, backgroundFetch) => { + const registration = await backgroundFetch.fetch( + uniqueId(), + ['resources/feature-name.txt', '/serviceworker/resources/slow-response.php']); + + const record = await registration.match('resources/feature-name.txt'); + + await new Promise(resolve => { + const expectedResultText = 'Background Fetch'; + + registration.onprogress = async event => { + if (event.target.downloaded < expectedResultText.length) + return; + + const response = await record.responseReady; + + assert_true(response.url.includes('resources/feature-name.txt')); + const completedResponseText = await response.text(); + assert_equals(completedResponseText, expectedResultText); + + resolve(); + }; + }); + +}, 'Access to active fetches is supported.');
diff --git a/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any-expected.txt deleted file mode 100644 index 6a56348..0000000 --- a/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any-expected.txt +++ /dev/null
@@ -1,47 +0,0 @@ -This is a testharness.js-based test. -PASS idl_test setup -PASS Partial interface ServiceWorkerGlobalScope: original interface defined -PASS Partial interface ServiceWorkerRegistration: original interface defined -PASS BackgroundFetchManager interface: existence and properties of interface object -PASS BackgroundFetchManager interface object length -PASS BackgroundFetchManager interface object name -PASS BackgroundFetchManager interface: existence and properties of interface prototype object -PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchManager interface: existence and properties of interface prototype object's @@unscopables property -PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) -PASS BackgroundFetchManager interface: operation get(DOMString) -PASS BackgroundFetchManager interface: operation getIds() -PASS BackgroundFetchRegistration interface: existence and properties of interface object -PASS BackgroundFetchRegistration interface object length -PASS BackgroundFetchRegistration interface object name -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's @@unscopables property -PASS BackgroundFetchRegistration interface: attribute id -PASS BackgroundFetchRegistration interface: attribute uploadTotal -PASS BackgroundFetchRegistration interface: attribute uploaded -PASS BackgroundFetchRegistration interface: attribute downloadTotal -PASS BackgroundFetchRegistration interface: attribute downloaded -PASS BackgroundFetchRegistration interface: attribute result -PASS BackgroundFetchRegistration interface: attribute failureReason -PASS BackgroundFetchRegistration interface: attribute recordsAvailable -PASS BackgroundFetchRegistration interface: attribute onprogress -PASS BackgroundFetchRegistration interface: operation abort() -FAIL BackgroundFetchRegistration interface: operation match(RequestInfo, CacheQueryOptions) assert_own_property: interface prototype object missing non-static operation expected property "match" missing -FAIL BackgroundFetchRegistration interface: operation matchAll(RequestInfo, CacheQueryOptions) assert_own_property: interface prototype object missing non-static operation expected property "matchAll" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface object length assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface object name assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: attribute request assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: attribute responseReady assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -PASS BackgroundFetchEvent interface: existence and properties of interface object -PASS BackgroundFetchUpdateUIEvent interface: existence and properties of interface object -PASS ServiceWorkerRegistration interface: attribute backgroundFetch -PASS ServiceWorkerGlobalScope interface: existence and properties of interface object -PASS ExtendableEvent interface: existence and properties of interface object -PASS WorkerGlobalScope interface: existence and properties of interface object -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any.sharedworker-expected.txt deleted file mode 100644 index d08a6881..0000000 --- a/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any.sharedworker-expected.txt +++ /dev/null
@@ -1,46 +0,0 @@ -This is a testharness.js-based test. -PASS idl_test setup -PASS Partial interface ServiceWorkerGlobalScope: original interface defined -PASS Partial interface ServiceWorkerRegistration: original interface defined -PASS BackgroundFetchManager interface: existence and properties of interface object -PASS BackgroundFetchManager interface object length -PASS BackgroundFetchManager interface object name -PASS BackgroundFetchManager interface: existence and properties of interface prototype object -PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchManager interface: existence and properties of interface prototype object's @@unscopables property -PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) -PASS BackgroundFetchManager interface: operation get(DOMString) -PASS BackgroundFetchManager interface: operation getIds() -PASS BackgroundFetchRegistration interface: existence and properties of interface object -PASS BackgroundFetchRegistration interface object length -PASS BackgroundFetchRegistration interface object name -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's @@unscopables property -PASS BackgroundFetchRegistration interface: attribute id -PASS BackgroundFetchRegistration interface: attribute uploadTotal -PASS BackgroundFetchRegistration interface: attribute uploaded -PASS BackgroundFetchRegistration interface: attribute downloadTotal -PASS BackgroundFetchRegistration interface: attribute downloaded -PASS BackgroundFetchRegistration interface: attribute result -PASS BackgroundFetchRegistration interface: attribute failureReason -PASS BackgroundFetchRegistration interface: attribute recordsAvailable -PASS BackgroundFetchRegistration interface: attribute onprogress -PASS BackgroundFetchRegistration interface: operation abort() -FAIL BackgroundFetchRegistration interface: operation match(RequestInfo, CacheQueryOptions) assert_own_property: interface prototype object missing non-static operation expected property "match" missing -FAIL BackgroundFetchRegistration interface: operation matchAll(RequestInfo, CacheQueryOptions) assert_own_property: interface prototype object missing non-static operation expected property "matchAll" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface object length assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface object name assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: attribute request assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: attribute responseReady assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -PASS BackgroundFetchEvent interface: existence and properties of interface object -PASS BackgroundFetchUpdateUIEvent interface: existence and properties of interface object -PASS ServiceWorkerRegistration interface: attribute backgroundFetch -PASS ServiceWorkerGlobalScope interface: existence and properties of interface object -PASS ExtendableEvent interface: existence and properties of interface object -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any.worker-expected.txt deleted file mode 100644 index d08a6881..0000000 --- a/third_party/blink/web_tests/external/wpt/background-fetch/idlharness.https.any.worker-expected.txt +++ /dev/null
@@ -1,46 +0,0 @@ -This is a testharness.js-based test. -PASS idl_test setup -PASS Partial interface ServiceWorkerGlobalScope: original interface defined -PASS Partial interface ServiceWorkerRegistration: original interface defined -PASS BackgroundFetchManager interface: existence and properties of interface object -PASS BackgroundFetchManager interface object length -PASS BackgroundFetchManager interface object name -PASS BackgroundFetchManager interface: existence and properties of interface prototype object -PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchManager interface: existence and properties of interface prototype object's @@unscopables property -PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) -PASS BackgroundFetchManager interface: operation get(DOMString) -PASS BackgroundFetchManager interface: operation getIds() -PASS BackgroundFetchRegistration interface: existence and properties of interface object -PASS BackgroundFetchRegistration interface object length -PASS BackgroundFetchRegistration interface object name -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's @@unscopables property -PASS BackgroundFetchRegistration interface: attribute id -PASS BackgroundFetchRegistration interface: attribute uploadTotal -PASS BackgroundFetchRegistration interface: attribute uploaded -PASS BackgroundFetchRegistration interface: attribute downloadTotal -PASS BackgroundFetchRegistration interface: attribute downloaded -PASS BackgroundFetchRegistration interface: attribute result -PASS BackgroundFetchRegistration interface: attribute failureReason -PASS BackgroundFetchRegistration interface: attribute recordsAvailable -PASS BackgroundFetchRegistration interface: attribute onprogress -PASS BackgroundFetchRegistration interface: operation abort() -FAIL BackgroundFetchRegistration interface: operation match(RequestInfo, CacheQueryOptions) assert_own_property: interface prototype object missing non-static operation expected property "match" missing -FAIL BackgroundFetchRegistration interface: operation matchAll(RequestInfo, CacheQueryOptions) assert_own_property: interface prototype object missing non-static operation expected property "matchAll" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface object length assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface object name assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: attribute request assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -FAIL BackgroundFetchRecord interface: attribute responseReady assert_own_property: self does not have own property "BackgroundFetchRecord" expected property "BackgroundFetchRecord" missing -PASS BackgroundFetchEvent interface: existence and properties of interface object -PASS BackgroundFetchUpdateUIEvent interface: existence and properties of interface object -PASS ServiceWorkerRegistration interface: attribute backgroundFetch -PASS ServiceWorkerGlobalScope interface: existence and properties of interface object -PASS ExtendableEvent interface: existence and properties of interface object -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/document-level-wheel-event-listener-passive-by-default-manual.html b/third_party/blink/web_tests/external/wpt/dom/events/document-level-wheel-event-listener-passive-by-default-manual.html new file mode 100644 index 0000000..c94d5b00 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/dom/events/document-level-wheel-event-listener-passive-by-default-manual.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<title>Default passive document level wheel event listener manual test</title> +<link rel="help" href="https://github.com/WICG/interventions/issues/64"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div>This is a manual test since there is no way to synthesize wheel events. +Scroll by wheel in the middle of the page to run the test.</div> +<script> +function testWheelCancelable(test) { + document.addEventListener("wheel", test.step_func(event => { + assert_false(event.cancelable, "Wheel event must be non-cancelable."); + test.done(); + })); +} +async_test(t => { testWheelCancelable(t); }, "Wheel events are " + + "non-cancelable since the event listener is treated as passive"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/webauthn/createcredential-badargs-challenge.https.html b/third_party/blink/web_tests/external/wpt/webauthn/createcredential-badargs-challenge.https.html index 0ad67f2..f4d187e 100644 --- a/third_party/blink/web_tests/external/wpt/webauthn/createcredential-badargs-challenge.https.html +++ b/third_party/blink/web_tests/external/wpt/webauthn/createcredential-badargs-challenge.https.html
@@ -17,7 +17,6 @@ new CreateCredentialsTest("options.publicKey.challenge", null).runTest("Bad challenge: challenge is null", new TypeError()); new CreateCredentialsTest("options.publicKey.challenge", {}).runTest("Bad challenge: challenge is empty object", new TypeError()); new CreateCredentialsTest("options.publicKey.challenge", new Array()).runTest("Bad challenge: challenge is empty Array", new TypeError()); - new CreateCredentialsTest("options.publicKey.challenge", new ArrayBuffer(0)).runTest("Bad challenge: challenge is empty ArrayBuffer", new TypeError()); }); /* JSHINT */
diff --git a/third_party/blink/web_tests/external/wpt_automation/dom/events/document-level-wheel-event-listener-passive-by-default-manual-automation.js b/third_party/blink/web_tests/external/wpt_automation/dom/events/document-level-wheel-event-listener-passive-by-default-manual-automation.js new file mode 100644 index 0000000..ab3f79f0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt_automation/dom/events/document-level-wheel-event-listener-passive-by-default-manual-automation.js
@@ -0,0 +1,26 @@ +function wheelScroll(direction, start_x, start_y) { + return new Promise(function(resolve, reject) { + if (window.chrome && chrome.gpuBenchmarking) { + chrome.gpuBenchmarking.smoothScrollBy(100 /* pixels to scroll */, + resolve, + start_x, + start_y, + 2 /* wheel scroll source */, + direction); + } else { + reject(); + } + }); +} + +{ + var input_injection = async_test("Input Injection Automation"); + // Returns a promise that gets resolved when input injection is finished. + inject_input().then(function() { + input_injection.done(); + }); +} + +function inject_input() { + return wheelScroll('down', window.innerWidth / 2, window.innerHeight / 2); +}
diff --git a/third_party/blink/web_tests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png index 04be25950..4d6c827 100644 --- a/third_party/blink/web_tests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ b/third_party/blink/web_tests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/backgroundfetch-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/backgroundfetch-origin-trial-interfaces.html index af7691b..987beb5 100644 --- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/backgroundfetch-origin-trial-interfaces.html +++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/backgroundfetch-origin-trial-interfaces.html
@@ -20,7 +20,7 @@ 'BackgroundFetchRegistration': ['id', 'uploadTotal', 'uploaded', 'downloadTotal', 'downloaded', 'result', 'failureReason', 'recordsAvailable', - 'onprogress'], + 'onprogress', 'match', 'matchAll'], 'ServiceWorkerRegistration': ['backgroundFetch'], }); }, 'Background Fetch API interfaces and properties in Origin-Trial enabled document.');
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/resources/backgroundfetch-origin-trial-interfaces-serviceworker-enabled.php b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/resources/backgroundfetch-origin-trial-interfaces-serviceworker-enabled.php index fe5ea0a..13edec37 100644 --- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/resources/backgroundfetch-origin-trial-interfaces-serviceworker-enabled.php +++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/resources/backgroundfetch-origin-trial-interfaces-serviceworker-enabled.php
@@ -18,8 +18,7 @@ 'BackgroundFetchRegistration': ['id', 'uploadTotal', 'uploaded', 'downloadTotal', 'downloaded', 'result', 'failureReason', 'recordsAvailable', - 'onprogress', 'abort', 'match', - 'matchAll'], + 'onprogress', 'abort', 'match', 'matchAll'], }); });
diff --git a/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index da9ddec5..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index da9ddec5..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index da9ddec5..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index da9ddec5..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index da9ddec5..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dom/rtl-scroll-to-leftmost-and-resize-expected.png b/third_party/blink/web_tests/platform/mac/fast/dom/rtl-scroll-to-leftmost-and-resize-expected.png index 707ec87de..c4bf06bb 100644 --- a/third_party/blink/web_tests/platform/mac/fast/dom/rtl-scroll-to-leftmost-and-resize-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/dom/rtl-scroll-to-leftmost-and-resize-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index da9ddec5..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/win/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index da9ddec5..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/win7/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index da9ddec5..0000000 --- a/third_party/blink/web_tests/platform/win7/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/resources/testharnessreport.js b/third_party/blink/web_tests/resources/testharnessreport.js index eceebae4..bb862b4 100644 --- a/third_party/blink/web_tests/resources/testharnessreport.js +++ b/third_party/blink/web_tests/resources/testharnessreport.js
@@ -123,6 +123,7 @@ pathAndBase.startsWith('/css/selectors/') || pathAndBase.startsWith('/css/cssom-view/') || pathAndBase.startsWith('/css/css-scroll-snap/') || + pathAndBase.startsWith('/dom/events/') || pathAndBase.startsWith('/feature-policy/experimental-features/')) { // Per-test automation scripts. src = automationPath + pathAndBase + '-automation.js';
diff --git a/third_party/blink/web_tests/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png index da9ddec5..d91a5e11 100644 --- a/third_party/blink/web_tests/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ b/third_party/blink/web_tests/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt index b2eb3983..8ce01926 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -25,6 +25,11 @@ [Worker] method fetch [Worker] method get [Worker] method getIds +[Worker] interface BackgroundFetchRecord +[Worker] attribute @@toStringTag +[Worker] getter request +[Worker] getter responseReady +[Worker] method constructor [Worker] interface BackgroundFetchRegistration : EventTarget [Worker] attribute @@toStringTag [Worker] getter downloadTotal @@ -38,6 +43,8 @@ [Worker] getter uploaded [Worker] method abort [Worker] method constructor +[Worker] method match +[Worker] method matchAll [Worker] setter onprogress [Worker] interface BarcodeDetector [Worker] attribute @@toStringTag
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index 18f905991..5c38b3d 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -430,6 +430,11 @@ method fetch method get method getIds +interface BackgroundFetchRecord + attribute @@toStringTag + getter request + getter responseReady + method constructor interface BackgroundFetchRegistration : EventTarget attribute @@toStringTag getter downloadTotal @@ -443,6 +448,8 @@ getter uploaded method abort method constructor + method match + method matchAll setter onprogress interface Badge static method clear
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt index f682fae..2ab14ea1 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -25,6 +25,11 @@ [Worker] method fetch [Worker] method get [Worker] method getIds +[Worker] interface BackgroundFetchRecord +[Worker] attribute @@toStringTag +[Worker] getter request +[Worker] getter responseReady +[Worker] method constructor [Worker] interface BackgroundFetchRegistration : EventTarget [Worker] attribute @@toStringTag [Worker] getter downloadTotal @@ -38,6 +43,8 @@ [Worker] getter uploaded [Worker] method abort [Worker] method constructor +[Worker] method match +[Worker] method matchAll [Worker] setter onprogress [Worker] interface BarcodeDetector [Worker] attribute @@toStringTag
diff --git a/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x64/gaia_credential_provider_i.h b/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x64/gaia_credential_provider_i.h index 9e1bf0f..72efcf4 100644 --- a/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x64/gaia_credential_provider_i.h +++ b/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x64/gaia_credential_provider_i.h
@@ -415,11 +415,13 @@ IReauthCredential : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetUserInfo( - /* [in] */ BSTR sid, - /* [in] */ BSTR username, + virtual HRESULT STDMETHODCALLTYPE SetEmailForReauth( /* [in] */ BSTR email) = 0; + virtual HRESULT STDMETHODCALLTYPE SetOSUserInfo( + /* [in] */ BSTR sid, + /* [in] */ BSTR username) = 0; + }; @@ -441,11 +443,14 @@ ULONG ( STDMETHODCALLTYPE *Release )( IReauthCredential * This); - HRESULT ( STDMETHODCALLTYPE *SetUserInfo )( + HRESULT ( STDMETHODCALLTYPE *SetEmailForReauth )( + IReauthCredential * This, + /* [in] */ BSTR email); + + HRESULT ( STDMETHODCALLTYPE *SetOSUserInfo )( IReauthCredential * This, /* [in] */ BSTR sid, - /* [in] */ BSTR username, - /* [in] */ BSTR email); + /* [in] */ BSTR username); END_INTERFACE } IReauthCredentialVtbl; @@ -470,8 +475,11 @@ ( (This)->lpVtbl -> Release(This) ) -#define IReauthCredential_SetUserInfo(This,sid,username,email) \ - ( (This)->lpVtbl -> SetUserInfo(This,sid,username,email) ) +#define IReauthCredential_SetEmailForReauth(This,email) \ + ( (This)->lpVtbl -> SetEmailForReauth(This,email) ) + +#define IReauthCredential_SetOSUserInfo(This,sid,username) \ + ( (This)->lpVtbl -> SetOSUserInfo(This,sid,username) ) #endif /* COBJMACROS */
diff --git a/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x64/gaia_credential_provider_p.c b/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x64/gaia_credential_provider_p.c index 2d9ee19..8740442 100644 --- a/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x64/gaia_credential_provider_p.c +++ b/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x64/gaia_credential_provider_p.c
@@ -47,7 +47,7 @@ #include "gaia_credential_provider_i.h" #define TYPE_FORMAT_STRING_SIZE 93 -#define PROC_FORMAT_STRING_SIZE 315 +#define PROC_FORMAT_STRING_SIZE 347 #define EXPR_FORMAT_STRING_SIZE 1 #define TRANSMIT_AS_TABLE_SIZE 0 #define WIRE_MARSHAL_TABLE_SIZE 1 @@ -351,17 +351,17 @@ /* 262 */ 0x8, /* FC_LONG */ 0x0, /* 0 */ - /* Procedure SetUserInfo */ + /* Procedure SetEmailForReauth */ /* 264 */ 0x33, /* FC_AUTO_HANDLE */ 0x6c, /* Old Flags: object, Oi2 */ /* 266 */ NdrFcLong( 0x0 ), /* 0 */ /* 270 */ NdrFcShort( 0x3 ), /* 3 */ -/* 272 */ NdrFcShort( 0x28 ), /* X64 Stack size/offset = 40 */ +/* 272 */ NdrFcShort( 0x18 ), /* X64 Stack size/offset = 24 */ /* 274 */ NdrFcShort( 0x0 ), /* 0 */ /* 276 */ NdrFcShort( 0x8 ), /* 8 */ /* 278 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ - 0x4, /* 4 */ + 0x2, /* 2 */ /* 280 */ 0xa, /* 10 */ 0x5, /* Ext Flags: new corr desc, srv corr check, */ /* 282 */ NdrFcShort( 0x0 ), /* 0 */ @@ -369,29 +369,54 @@ /* 286 */ NdrFcShort( 0x0 ), /* 0 */ /* 288 */ NdrFcShort( 0x0 ), /* 0 */ - /* Parameter sid */ + /* Parameter email */ /* 290 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ /* 292 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */ /* 294 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ + /* Return value */ + +/* 296 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 298 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */ +/* 300 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetOSUserInfo */ + +/* 302 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 304 */ NdrFcLong( 0x0 ), /* 0 */ +/* 308 */ NdrFcShort( 0x4 ), /* 4 */ +/* 310 */ NdrFcShort( 0x20 ), /* X64 Stack size/offset = 32 */ +/* 312 */ NdrFcShort( 0x0 ), /* 0 */ +/* 314 */ NdrFcShort( 0x8 ), /* 8 */ +/* 316 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 318 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 320 */ NdrFcShort( 0x0 ), /* 0 */ +/* 322 */ NdrFcShort( 0x1 ), /* 1 */ +/* 324 */ NdrFcShort( 0x0 ), /* 0 */ +/* 326 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter sid */ + +/* 328 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 330 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */ +/* 332 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ + /* Parameter username */ -/* 296 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ -/* 298 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */ -/* 300 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ - - /* Parameter email */ - -/* 302 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ -/* 304 */ NdrFcShort( 0x18 ), /* X64 Stack size/offset = 24 */ -/* 306 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ +/* 334 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 336 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */ +/* 338 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ /* Return value */ -/* 308 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ -/* 310 */ NdrFcShort( 0x20 ), /* X64 Stack size/offset = 32 */ -/* 312 */ 0x8, /* FC_LONG */ +/* 340 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 342 */ NdrFcShort( 0x18 ), /* X64 Stack size/offset = 24 */ +/* 344 */ 0x8, /* FC_LONG */ 0x0, /* 0 */ 0x0 @@ -662,7 +687,8 @@ #pragma code_seg(".orpc") static const unsigned short IReauthCredential_FormatStringOffsetTable[] = { - 264 + 264, + 302 }; static const MIDL_STUBLESS_PROXY_INFO IReauthCredential_ProxyInfo = @@ -686,21 +712,22 @@ 0, 0, 0}; -CINTERFACE_PROXY_VTABLE(4) _IReauthCredentialProxyVtbl = +CINTERFACE_PROXY_VTABLE(5) _IReauthCredentialProxyVtbl = { &IReauthCredential_ProxyInfo, &IID_IReauthCredential, IUnknown_QueryInterface_Proxy, IUnknown_AddRef_Proxy, IUnknown_Release_Proxy , - (void *) (INT_PTR) -1 /* IReauthCredential::SetUserInfo */ + (void *) (INT_PTR) -1 /* IReauthCredential::SetEmailForReauth */ , + (void *) (INT_PTR) -1 /* IReauthCredential::SetOSUserInfo */ }; const CInterfaceStubVtbl _IReauthCredentialStubVtbl = { &IID_IReauthCredential, &IReauthCredential_ServerInfo, - 4, + 5, 0, /* pure interpreted */ CStdStubBuffer_METHODS };
diff --git a/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x86/gaia_credential_provider_i.h b/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x86/gaia_credential_provider_i.h index b28b74c..c698911 100644 --- a/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x86/gaia_credential_provider_i.h +++ b/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x86/gaia_credential_provider_i.h
@@ -415,11 +415,13 @@ IReauthCredential : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetUserInfo( - /* [in] */ BSTR sid, - /* [in] */ BSTR username, + virtual HRESULT STDMETHODCALLTYPE SetEmailForReauth( /* [in] */ BSTR email) = 0; + virtual HRESULT STDMETHODCALLTYPE SetOSUserInfo( + /* [in] */ BSTR sid, + /* [in] */ BSTR username) = 0; + }; @@ -441,11 +443,14 @@ ULONG ( STDMETHODCALLTYPE *Release )( IReauthCredential * This); - HRESULT ( STDMETHODCALLTYPE *SetUserInfo )( + HRESULT ( STDMETHODCALLTYPE *SetEmailForReauth )( + IReauthCredential * This, + /* [in] */ BSTR email); + + HRESULT ( STDMETHODCALLTYPE *SetOSUserInfo )( IReauthCredential * This, /* [in] */ BSTR sid, - /* [in] */ BSTR username, - /* [in] */ BSTR email); + /* [in] */ BSTR username); END_INTERFACE } IReauthCredentialVtbl; @@ -470,8 +475,11 @@ ( (This)->lpVtbl -> Release(This) ) -#define IReauthCredential_SetUserInfo(This,sid,username,email) \ - ( (This)->lpVtbl -> SetUserInfo(This,sid,username,email) ) +#define IReauthCredential_SetEmailForReauth(This,email) \ + ( (This)->lpVtbl -> SetEmailForReauth(This,email) ) + +#define IReauthCredential_SetOSUserInfo(This,sid,username) \ + ( (This)->lpVtbl -> SetOSUserInfo(This,sid,username) ) #endif /* COBJMACROS */
diff --git a/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x86/gaia_credential_provider_p.c b/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x86/gaia_credential_provider_p.c index 8558c59..c55d942 100644 --- a/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x86/gaia_credential_provider_p.c +++ b/third_party/win_build_output/midl/chrome/credential_provider/gaiacp/x86/gaia_credential_provider_p.c
@@ -50,7 +50,7 @@ #include "gaia_credential_provider_i.h" #define TYPE_FORMAT_STRING_SIZE 93 -#define PROC_FORMAT_STRING_SIZE 301 +#define PROC_FORMAT_STRING_SIZE 331 #define EXPR_FORMAT_STRING_SIZE 1 #define TRANSMIT_AS_TABLE_SIZE 0 #define WIRE_MARSHAL_TABLE_SIZE 1 @@ -356,46 +356,70 @@ /* 250 */ 0x8, /* FC_LONG */ 0x0, /* 0 */ - /* Procedure SetUserInfo */ + /* Procedure SetEmailForReauth */ /* 252 */ 0x33, /* FC_AUTO_HANDLE */ 0x6c, /* Old Flags: object, Oi2 */ /* 254 */ NdrFcLong( 0x0 ), /* 0 */ /* 258 */ NdrFcShort( 0x3 ), /* 3 */ -/* 260 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */ +/* 260 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ /* 262 */ NdrFcShort( 0x0 ), /* 0 */ /* 264 */ NdrFcShort( 0x8 ), /* 8 */ /* 266 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ - 0x4, /* 4 */ + 0x2, /* 2 */ /* 268 */ 0x8, /* 8 */ 0x5, /* Ext Flags: new corr desc, srv corr check, */ /* 270 */ NdrFcShort( 0x0 ), /* 0 */ /* 272 */ NdrFcShort( 0x1 ), /* 1 */ /* 274 */ NdrFcShort( 0x0 ), /* 0 */ - /* Parameter sid */ + /* Parameter email */ /* 276 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ /* 278 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ /* 280 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ + /* Return value */ + +/* 282 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 284 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 286 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetOSUserInfo */ + +/* 288 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 290 */ NdrFcLong( 0x0 ), /* 0 */ +/* 294 */ NdrFcShort( 0x4 ), /* 4 */ +/* 296 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */ +/* 298 */ NdrFcShort( 0x0 ), /* 0 */ +/* 300 */ NdrFcShort( 0x8 ), /* 8 */ +/* 302 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 304 */ 0x8, /* 8 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 306 */ NdrFcShort( 0x0 ), /* 0 */ +/* 308 */ NdrFcShort( 0x1 ), /* 1 */ +/* 310 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter sid */ + +/* 312 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 314 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 316 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ + /* Parameter username */ -/* 282 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ -/* 284 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ -/* 286 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ - - /* Parameter email */ - -/* 288 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ -/* 290 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ -/* 292 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ +/* 318 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 320 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 322 */ NdrFcShort( 0x2e ), /* Type Offset=46 */ /* Return value */ -/* 294 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ -/* 296 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */ -/* 298 */ 0x8, /* FC_LONG */ +/* 324 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 326 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 328 */ 0x8, /* FC_LONG */ 0x0, /* 0 */ 0x0 @@ -666,7 +690,8 @@ #pragma code_seg(".orpc") static const unsigned short IReauthCredential_FormatStringOffsetTable[] = { - 252 + 252, + 288 }; static const MIDL_STUBLESS_PROXY_INFO IReauthCredential_ProxyInfo = @@ -690,21 +715,22 @@ 0, 0, 0}; -CINTERFACE_PROXY_VTABLE(4) _IReauthCredentialProxyVtbl = +CINTERFACE_PROXY_VTABLE(5) _IReauthCredentialProxyVtbl = { &IReauthCredential_ProxyInfo, &IID_IReauthCredential, IUnknown_QueryInterface_Proxy, IUnknown_AddRef_Proxy, IUnknown_Release_Proxy , - (void *) (INT_PTR) -1 /* IReauthCredential::SetUserInfo */ + (void *) (INT_PTR) -1 /* IReauthCredential::SetEmailForReauth */ , + (void *) (INT_PTR) -1 /* IReauthCredential::SetOSUserInfo */ }; const CInterfaceStubVtbl _IReauthCredentialStubVtbl = { &IID_IReauthCredential, &IReauthCredential_ServerInfo, - 4, + 5, 0, /* pure interpreted */ CStdStubBuffer_METHODS };
diff --git a/third_party/zlib/google/compression_utils.cc b/third_party/zlib/google/compression_utils.cc index 53b280a..9aa4f700 100644 --- a/third_party/zlib/google/compression_utils.cc +++ b/third_party/zlib/google/compression_utils.cc
@@ -160,6 +160,9 @@ bool GzipUncompress(const std::string& input, std::string* output) { std::string uncompressed_output; uLongf uncompressed_size = static_cast<uLongf>(GetUncompressedSize(input)); + if (uncompressed_size > uncompressed_output.max_size()) + return false; + uncompressed_output.resize(uncompressed_size); if (GzipUncompressHelper(bit_cast<Bytef*>(uncompressed_output.data()), &uncompressed_size,
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index 8b762dc..99a6987 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -27,7 +27,7 @@ # Do NOT CHANGE this if you don't know what you're doing -- see # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md # Reverting problematic clang rolls is safe, though. -CLANG_REVISION = '346388' +CLANG_REVISION = '349417' use_head_revision = bool(os.environ.get('LLVM_FORCE_HEAD_REVISION', '0') in ('1', 'YES')) @@ -35,7 +35,7 @@ CLANG_REVISION = 'HEAD' # This is incremented when pushing a new build of Clang at the same revision. -CLANG_SUB_REVISION=5 +CLANG_SUB_REVISION=1 PACKAGE_VERSION = "%s-%s" % (CLANG_REVISION, CLANG_SUB_REVISION)
diff --git a/tools/determinism/deterministic_build_whitelist.pyl b/tools/determinism/deterministic_build_whitelist.pyl index 5bc38775..0cdcf78 100644 --- a/tools/determinism/deterministic_build_whitelist.pyl +++ b/tools/determinism/deterministic_build_whitelist.pyl
@@ -23,6 +23,7 @@ 'fontconfig_caches/df1acc8c-39d5-4a8b-8507-b1a7396ac3ac-le64.cache-7', # nacl stuff, https://crbug.com/429358 + 'nacl_helper_bootstrap', 'nacl_helper_nonsfi', 'nacl_helper_nonsfi_unittests_main', 'nacl_test_data/nonsfi/irt_exception_test_pnacl_newlib_x32_nonsfi.nexe',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b74e3bf..b3b95e0 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -32397,11 +32397,13 @@ <int value="2014629801" label="view-passwords:disabled"/> <int value="2015335629" label="shelf-hover-previews"/> <int value="2015547864" label="NetworkServiceInProcess:enabled"/> + <int value="2018386804" label="IPH_ReopenTab:disabled"/> <int value="2020107447" label="AndroidPayIntegrationV1:enabled"/> <int value="2032558514" label="RemoveUsageOfDeprecatedGaiaSigninEndpoint:enabled"/> <int value="2034198538" label="TabHoverCards:enabled"/> <int value="2037756154" label="enable-impl-side-painting"/> + <int value="2040316611" label="IPH_ReopenTab:enabled"/> <int value="2043321329" label="OfflinePagesPrefetchingUI:disabled"/> <int value="2056572020" label="EnableUsernameCorrection:disabled"/> <int value="2058283872" label="CCTModuleCache:disabled"/> @@ -54512,6 +54514,58 @@ <int value="1" label="Error"/> </enum> +<enum name="WebRtcLoggingUploadFailureReason"> + <summary> + Failure reason can be either a response code (except 200 OK) for the upload + HTTP request, or another reason prior to uploading (values less than 100). + HTTP response codes copied from enum "HttpResponseCode". + </summary> + <int value="0" label="Invalid state"/> + <int value="1" label="Stored log not found"/> + <int value="100" label="100: Continue"/> + <int value="101" label="101: Switching Protocols"/> + <int value="102" label="102: Processing"/> + <int value="103" label="103: Early Hints"/> + <int value="201" label="201: Created"/> + <int value="202" label="202: Accepted"/> + <int value="203" label="203: Non-Authoritative Information"/> + <int value="204" label="204: No Content"/> + <int value="205" label="205: Reset Content"/> + <int value="206" label="206: Partial Content"/> + <int value="300" label="300: Multiple Choices"/> + <int value="301" label="301: Moved Permanently"/> + <int value="302" label="302: Found"/> + <int value="303" label="303: See Other"/> + <int value="304" label="304: Not Modified"/> + <int value="305" label="305: Use Proxy"/> + <int value="306" label="306: (Unused)"/> + <int value="307" label="307: Temporary Redirect"/> + <int value="400" label="400: Bad Request"/> + <int value="401" label="401: Unauthorized"/> + <int value="402" label="402: Payment Required"/> + <int value="403" label="403: Forbidden"/> + <int value="404" label="404: Not Found"/> + <int value="405" label="405: Method Not Allowed"/> + <int value="406" label="406: Not Acceptable"/> + <int value="407" label="407: Proxy Authentication Required"/> + <int value="408" label="408: Request Timeout"/> + <int value="409" label="409: Conflict"/> + <int value="410" label="410: Gone"/> + <int value="411" label="411: Length Required"/> + <int value="412" label="412: Precondition Failed"/> + <int value="413" label="413: Request Entity Too Large"/> + <int value="414" label="414: Request-URI Too Long"/> + <int value="415" label="415: Unsupported Media Type"/> + <int value="416" label="416: Requested Range Not Satisfiable"/> + <int value="417" label="417: Expectation Failed"/> + <int value="500" label="500: Internal Server Error"/> + <int value="501" label="501: Not Implemented"/> + <int value="502" label="502: Bad Gateway"/> + <int value="503" label="503: Service Unavailable"/> + <int value="504" label="504: Gateway Timeout"/> + <int value="505" label="505: HTTP Version Not Supported"/> +</enum> + <enum name="WebRtcLoggingWebAppIdHash"> <int value="-100222544" label="Hangouts"/> <int value="0" label="Undefined"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index f791073..e4597824 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -4041,6 +4041,15 @@ </summary> </histogram> +<histogram name="Arc.CupsPrinting.PageCount" expires_after="2019-06-20"> + <owner>skau@google.com</owner> + <owner>vkuzkokov@google.com</owner> + <summary> + The number of pages sent to a native printer by ARC. Reported for every + print job originating in ARC container and sent to a CUPS printer. + </summary> +</histogram> + <histogram name="Arc.EngagementTime.Background" units="ms"> <owner>maajid@google.com</owner> <owner>shaochuan@google.com</owner> @@ -99953,6 +99962,10 @@ <histogram name="Security.HTTPBad.NavigationStartedAfterUserWarnedAboutSensitiveInput" units="ms"> + <obsolete> + Deprecated 2018-12 after HTTPBad was rolled out for all HTTP pages. This + metric was recorded only after sensitive input events, which were removed. + </obsolete> <owner>estark@chromium.org</owner> <summary> Records the time from when a page was put into a warning state because of a @@ -99981,6 +99994,10 @@ <histogram name="Security.HTTPBad.UserWarnedAboutSensitiveInput.CreditCard" enum="BooleanShown"> + <obsolete> + Deprecated 2018-12 after HTTPBad was rolled out for all HTTP pages, and + discrete credit card / password tracking was removed. + </obsolete> <owner>elawrence@chromium.org</owner> <owner>estark@chromium.org</owner> <summary> @@ -99992,6 +100009,10 @@ <histogram name="Security.HTTPBad.UserWarnedAboutSensitiveInput.Password" enum="BooleanShown"> + <obsolete> + Deprecated 2018-12 after HTTPBad was rolled out for all HTTP pages, and + discrete credit card / password tracking was removed. + </obsolete> <owner>elawrence@chromium.org</owner> <owner>estark@chromium.org</owner> <summary> @@ -100004,6 +100025,10 @@ <histogram name="Security.HTTPBad.WebContentsDestroyedAfterUserWarnedAboutSensitiveInput" units="ms"> + <obsolete> + Deprecated 2018-12 after HTTPBad was rolled out for all HTTP pages. This + metric was recorded only after sensitive input events, which were removed. + </obsolete> <owner>estark@chromium.org</owner> <summary> Records the time delta between when a page was put into a warning state @@ -127324,7 +127349,7 @@ </histogram> <histogram base="true" name="WebRtcTextLogging" - enum="WebRtcLoggingWebAppIdHash"> + enum="WebRtcLoggingWebAppIdHash" expires_after="2019-07-01"> <owner>grunell@chromium.org</owner> <summary> Counts the number of WebRTC text log events per web application. Suffixed by @@ -127332,6 +127357,15 @@ </summary> </histogram> +<histogram name="WebRtcTextLogging.UploadFailureReason" + enum="WebRtcLoggingUploadFailureReason" expires_after="2019-07-01"> + <owner>grunell@chromium.org</owner> + <summary> + Counts upload failures for WebRTC text log. Recorded when an upload attempt + fails. + </summary> +</histogram> + <histogram name="WebShare.ApiCount" enum="WebShareMethod"> <owner>mgiuca@chromium.org</owner> <summary>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index 709dbe0..2d06d36 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -167,7 +167,7 @@ ANDROID_GO_WEBVIEW = PerfPlatform( 'android-go_webview-perf', 'Android OPM1.171019.021', is_fyi=True, - num_shards=25) + num_shards=25, benchmarks_names_to_run=_ANDROID_GO_BENCHMARK_NAMES) ANDROID_NEXUS5X_PERF_FYI = PerfPlatform( 'android-nexus5x-perf-fyi', 'Android MMB29Q', is_fyi=True,
diff --git a/tools/perf/core/shard_maps/android-go_webview-perf_map.json b/tools/perf/core/shard_maps/android-go_webview-perf_map.json index c2cff9c..af8735fb 100644 --- a/tools/perf/core/shard_maps/android-go_webview-perf_map.json +++ b/tools/perf/core/shard_maps/android-go_webview-perf_map.json
@@ -1,295 +1,240 @@ { "0": { "benchmarks": { - "blink_perf.accessibility": {}, - "blink_perf.bindings": {}, - "blink_perf.canvas": {}, - "blink_perf.css": {}, - "blink_perf.dom": {}, - "blink_perf.events": {}, - "blink_perf.image_decoder": {}, - "blink_perf.layout": {}, - "blink_perf.owp_storage": {}, - "blink_perf.paint": {}, - "blink_perf.parser": {}, - "blink_perf.shadow_dom": {}, - "blink_perf.svg": {}, - "dromaeo": {}, - "dummy_benchmark.noisy_benchmark_1": {}, - "dummy_benchmark.stable_benchmark_1": {}, - "jetstream": {}, - "kraken": {}, - "loading.desktop": { - "end": 23 + "memory.top_10_mobile": { + "end": 9 } } }, "1": { "benchmarks": { - "loading.desktop": { - "begin": 23 - }, - "loading.mobile": { - "end": 19 + "memory.top_10_mobile": { + "begin": 9, + "end": 15 } } }, "2": { "benchmarks": { - "loading.mobile": { - "begin": 19, - "end": 33 + "memory.top_10_mobile": { + "begin": 15 + }, + "power.typical_10_mobile": { + "end": 3 } } }, "3": { "benchmarks": { - "loading.mobile": { - "begin": 33, - "end": 49 + "power.typical_10_mobile": { + "begin": 3 + }, + "speedometer": {}, + "speedometer2": {}, + "startup.mobile": {}, + "system_health.common_mobile": { + "end": 6 } } }, "4": { "benchmarks": { - "loading.mobile": { - "begin": 49, - "end": 64 + "system_health.common_mobile": { + "begin": 6, + "end": 16 } } }, "5": { "benchmarks": { - "loading.mobile": { - "begin": 64, - "end": 89 + "system_health.common_mobile": { + "begin": 16, + "end": 23 } } }, "6": { "benchmarks": { - "loading.mobile": { - "begin": 89 - }, - "media.desktop": {}, - "media.mobile": {}, - "memory.desktop": {}, - "memory.long_running_idle_gmail_background_tbmv2": {}, - "memory.long_running_idle_gmail_tbmv2": {}, - "memory.top_10_mobile": { - "end": 11 + "system_health.common_mobile": { + "begin": 23, + "end": 45 } } }, "7": { "benchmarks": { - "memory.top_10_mobile": { - "begin": 11 - }, - "octane": {}, - "oortonline_tbmv2": {}, - "power.desktop": {}, - "power.typical_10_mobile": {}, - "rasterize_and_record_micro.partial_invalidation": {}, - "rasterize_and_record_micro.top_25": { - "end": 9 + "system_health.common_mobile": { + "begin": 45, + "end": 73 } } }, "8": { "benchmarks": { - "rasterize_and_record_micro.top_25": { - "begin": 9 + "system_health.common_mobile": { + "begin": 73 }, - "rendering.desktop": {}, - "rendering.mobile": { - "end": 49 + "system_health.memory_mobile": { + "end": 5 } } }, "9": { "benchmarks": { - "rendering.mobile": { - "begin": 49, - "end": 119 + "system_health.memory_mobile": { + "begin": 5, + "end": 12 } } }, "10": { "benchmarks": { - "rendering.mobile": { - "begin": 119, - "end": 191 + "system_health.memory_mobile": { + "begin": 12, + "end": 17 } } }, "11": { "benchmarks": { - "rendering.mobile": { - "begin": 191, - "end": 268 + "system_health.memory_mobile": { + "begin": 17, + "end": 22 } } }, "12": { "benchmarks": { - "rendering.mobile": { - "begin": 268, - "end": 366 + "system_health.memory_mobile": { + "begin": 22, + "end": 26 } } }, "13": { "benchmarks": { - "rendering.mobile": { - "begin": 366 - }, - "smoothness.gpu_rasterization.tough_pinch_zoom_cases": { - "end": 4 + "system_health.memory_mobile": { + "begin": 26, + "end": 36 } } }, "14": { "benchmarks": { - "smoothness.gpu_rasterization.tough_pinch_zoom_cases": { - "begin": 4 - }, - "smoothness.tough_pinch_zoom_cases": {}, - "speedometer": {}, - "speedometer-future": {}, - "speedometer2": {}, - "speedometer2-future": {}, - "startup.mobile": {}, - "system_health.common_desktop": {}, - "system_health.common_mobile": { - "end": 14 + "system_health.memory_mobile": { + "begin": 36, + "end": 46 } } }, "15": { "benchmarks": { - "system_health.common_mobile": { - "begin": 14, - "end": 59 + "system_health.memory_mobile": { + "begin": 46, + "end": 55 } } }, "16": { "benchmarks": { - "system_health.common_mobile": { - "begin": 59 - }, - "system_health.memory_desktop": {}, "system_health.memory_mobile": { - "end": 9 + "begin": 55, + "end": 64 } } }, "17": { "benchmarks": { "system_health.memory_mobile": { - "begin": 9, - "end": 24 + "begin": 64, + "end": 73 } } }, "18": { "benchmarks": { "system_health.memory_mobile": { - "begin": 24, - "end": 47 + "begin": 73, + "end": 78 } } }, "19": { "benchmarks": { "system_health.memory_mobile": { - "begin": 47, - "end": 72 - } + "begin": 78 + }, + "system_health.webview_startup": {} } }, "20": { "benchmarks": { - "system_health.memory_mobile": { - "begin": 72 - }, - "system_health.webview_startup": {}, - "tab_switching.typical_25": {}, - "tracing.tracing_with_background_memory_infra": {}, - "v8.browsing_desktop": {}, - "v8.browsing_desktop-future": {}, "v8.browsing_mobile": { - "end": 2 + "end": 7 } } }, "21": { "benchmarks": { "v8.browsing_mobile": { - "begin": 2, - "end": 14 + "begin": 7, + "end": 13 } } }, "22": { "benchmarks": { "v8.browsing_mobile": { - "begin": 14 - }, - "v8.browsing_mobile-future": { - "end": 7 + "begin": 13, + "end": 14 } } }, "23": { "benchmarks": { - "v8.browsing_mobile-future": { - "begin": 7, - "end": 15 + "v8.browsing_mobile": { + "begin": 14, + "end": 20 } } }, "24": { "benchmarks": { - "v8.browsing_mobile-future": { - "begin": 15 - }, - "v8.runtime_stats.top_25": {}, - "wasm": {}, - "webrtc": {} + "v8.browsing_mobile": { + "begin": 20 + } } }, "extra_infos": { - "num_stories": 2063, - "predicted_min_shard_time": 3708.0, - "predicted_min_shard_index": 1, - "predicted_max_shard_time": 4318.0, - "predicted_max_shard_index": 22, - "shard #0": 3996.0, - "shard #1": 3708.0, - "shard #2": 4228.0, - "shard #3": 4036.0, - "shard #4": 4044.0, - "shard #5": 3860.0, - "shard #6": 4030.0, - "shard #7": 4096.0, - "shard #8": 3962.0, - "shard #9": 3990.0, - "shard #10": 4024.0, - "shard #11": 3992.0, - "shard #12": 3980.0, - "shard #13": 4024.0, - "shard #14": 3934.0, - "shard #15": 4034.0, - "shard #16": 4124.0, - "shard #17": 4098.0, - "shard #18": 3822.0, - "shard #19": 3918.0, - "shard #20": 4142.0, - "shard #21": 3790.0, - "shard #22": 4318.0, - "shard #23": 3766.0, - "shard #24": 4008.0 + "num_stories": 223, + "predicted_min_shard_time": 1262.0, + "predicted_min_shard_index": 22, + "predicted_max_shard_time": 1656.0, + "predicted_max_shard_index": 24, + "shard #0": 1510.0, + "shard #1": 1410.0, + "shard #2": 1560.0, + "shard #3": 1396.0, + "shard #4": 1448.0, + "shard #5": 1588.0, + "shard #6": 1404.0, + "shard #7": 1518.0, + "shard #8": 1440.0, + "shard #9": 1422.0, + "shard #10": 1512.0, + "shard #11": 1632.0, + "shard #12": 1356.0, + "shard #13": 1530.0, + "shard #14": 1512.0, + "shard #15": 1386.0, + "shard #16": 1518.0, + "shard #17": 1518.0, + "shard #18": 1374.0, + "shard #19": 1544.0, + "shard #20": 1516.0, + "shard #21": 1524.0, + "shard #22": 1262.0, + "shard #23": 1398.0, + "shard #24": 1656.0 } } \ No newline at end of file
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index 86f3967..0d437fa 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -328,7 +328,8 @@ crbug.com/883731 [ Win ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ] # Benchmark: tracing.tracing_with_background_memory_infra -crbug.com/914092 [ Win_10 ] tracing.tracing_with_background_memory_infra/http://www.bing.com/ [ Skip ] +crbug.com/914092 [ Win ] tracing.tracing_with_background_memory_infra/http://www.bing.com/ [ Skip ] +crbug.com/914092 [ Win ] tracing.tracing_with_background_memory_infra/http://www.amazon.com [ Skip ] # Benchmark: v8.browsing_desktop crbug.com/773084 [ Mac ] v8.browsing_desktop/browse:tools:maps [ Skip ]
diff --git a/ui/accessibility/ax_tree_serializer.h b/ui/accessibility/ax_tree_serializer.h index 64b0553..21f8e6f 100644 --- a/ui/accessibility/ax_tree_serializer.h +++ b/ui/accessibility/ax_tree_serializer.h
@@ -169,9 +169,6 @@ AXSourceNode node, AXTreeUpdateBase<AXNodeData, AXTreeData>* out_update); - // Visit all of the descendants of |node| once. - void WalkAllDescendants(AXSourceNode node); - // Delete the entire client subtree but don't set the did_reset_ flag // like when Reset() is called. void InternalReset(); @@ -413,12 +410,6 @@ if (!tree_->IsValid(lca)) lca = tree_->GetRoot(); - // Work around flaky source trees where nodes don't figure out their - // correct parent/child relationships until you walk the whole tree once. - // Covered by this test in the content_browsertests suite: - // DumpAccessibilityTreeTest.AccessibilityAriaOwns. - WalkAllDescendants(lca); - if (!SerializeChangedNodes(lca, out_update)) return false; @@ -615,15 +606,6 @@ return true; } -template <typename AXSourceNode, typename AXNodeData, typename AXTreeData> -void AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::WalkAllDescendants( - AXSourceNode node) { - std::vector<AXSourceNode> children; - tree_->GetChildren(node, &children); - for (size_t i = 0; i < children.size(); ++i) - WalkAllDescendants(children[i]); -} - } // namespace ui #endif // UI_ACCESSIBILITY_AX_TREE_SERIALIZER_H_
diff --git a/ui/base/idle/idle.cc b/ui/base/idle/idle.cc index 67432e0..0333fbc 100644 --- a/ui/base/idle/idle.cc +++ b/ui/base/idle/idle.cc
@@ -4,31 +4,16 @@ #include "ui/base/idle/idle.h" -#include "base/bind.h" - namespace ui { -namespace { -void CalculateIdleStateCallback(int idle_threshold, - IdleCallback notify, - int idle_time) { - if (idle_time >= idle_threshold) - notify.Run(IDLE_STATE_IDLE); - else - notify.Run(IDLE_STATE_ACTIVE); -} +IdleState CalculateIdleState(int idle_threshold) { + if (CheckIdleStateIsLocked()) + return IDLE_STATE_LOCKED; -} // namespace + if (CalculateIdleTime() >= idle_threshold) + return IDLE_STATE_IDLE; -void CalculateIdleState(int idle_threshold, IdleCallback notify) { - if (CheckIdleStateIsLocked()) { - notify.Run(IDLE_STATE_LOCKED); - return; - } - - CalculateIdleTime(base::Bind(&CalculateIdleStateCallback, - idle_threshold, - notify)); + return IDLE_STATE_ACTIVE; } } // namespace ui
diff --git a/ui/base/idle/idle.h b/ui/base/idle/idle.h index 9ea9f43..269ca44 100644 --- a/ui/base/idle/idle.h +++ b/ui/base/idle/idle.h
@@ -5,7 +5,6 @@ #ifndef UI_BASE_IDLE_IDLE_H_ #define UI_BASE_IDLE_IDLE_H_ -#include "base/callback.h" #include "build/build_config.h" #include "ui/base/ui_base_export.h" @@ -24,16 +23,12 @@ UI_BASE_EXPORT void InitIdleMonitor(); #endif -typedef base::Callback<void(IdleState)> IdleCallback; -typedef base::Callback<void(int)> IdleTimeCallback; +// Calculate the Idle state. |idle_threshold| is the amount of time (in seconds) +// before the user is considered idle. +UI_BASE_EXPORT IdleState CalculateIdleState(int idle_threshold); -// Calculate the Idle state and notify the callback. |idle_threshold| is the -// amount of time (in seconds) before considered idle. |notify| is -// asynchronously called on some platforms. -UI_BASE_EXPORT void CalculateIdleState(int idle_threshold, IdleCallback notify); - -// Calculate Idle time in seconds and notify the callback -UI_BASE_EXPORT void CalculateIdleTime(IdleTimeCallback notify); +// Calculate Idle time in seconds. +UI_BASE_EXPORT int CalculateIdleTime(); // Checks synchronously if Idle state is IDLE_STATE_LOCKED. UI_BASE_EXPORT bool CheckIdleStateIsLocked();
diff --git a/ui/base/idle/idle_chromeos.cc b/ui/base/idle/idle_chromeos.cc index 0a38284..55b96ea 100644 --- a/ui/base/idle/idle_chromeos.cc +++ b/ui/base/idle/idle_chromeos.cc
@@ -11,10 +11,10 @@ namespace ui { -void CalculateIdleTime(IdleTimeCallback notify) { +int CalculateIdleTime() { base::TimeDelta idle_time = base::TimeTicks::Now() - ui::UserActivityDetector::Get()->last_activity_time(); - notify.Run(static_cast<int>(idle_time.InSeconds())); + return static_cast<int>(idle_time.InSeconds()); } bool CheckIdleStateIsLocked() {
diff --git a/ui/base/idle/idle_fuchsia.cc b/ui/base/idle/idle_fuchsia.cc index ed21be8..47c26ff 100644 --- a/ui/base/idle/idle_fuchsia.cc +++ b/ui/base/idle/idle_fuchsia.cc
@@ -8,10 +8,10 @@ namespace ui { -void CalculateIdleTime(IdleTimeCallback notify) { +int CalculateIdleTime() { // TODO(fuchsia): https://crbug.com/743296. NOTIMPLEMENTED(); - notify.Run(0); + return 0; } bool CheckIdleStateIsLocked() {
diff --git a/ui/base/idle/idle_linux.cc b/ui/base/idle/idle_linux.cc index a35aca7..7058b87 100644 --- a/ui/base/idle/idle_linux.cc +++ b/ui/base/idle/idle_linux.cc
@@ -4,7 +4,6 @@ #include "ui/base/idle/idle.h" - #if defined(USE_X11) #include "ui/base/idle/idle_query_x11.h" #include "ui/base/idle/screensaver_window_finder_x11.h" @@ -12,10 +11,12 @@ namespace ui { -void CalculateIdleTime(IdleTimeCallback notify) { +int CalculateIdleTime() { #if defined(USE_X11) IdleQueryX11 idle_query; - notify.Run(idle_query.IdleTime()); + return idle_query.IdleTime(); +#else + return 0; #endif }
diff --git a/ui/base/idle/idle_mac.mm b/ui/base/idle/idle_mac.mm index 65d7a1ce..dc35550 100644 --- a/ui/base/idle/idle_mac.mm +++ b/ui/base/idle/idle_mac.mm
@@ -84,11 +84,11 @@ g_screenMonitor = [[MacScreenMonitor alloc] init]; } -void CalculateIdleTime(IdleTimeCallback notify) { +int CalculateIdleTime() { CFTimeInterval idle_time = CGEventSourceSecondsSinceLastEventType( kCGEventSourceStateCombinedSessionState, kCGAnyInputEventType); - notify.Run(static_cast<int>(idle_time)); + return static_cast<int>(idle_time); } bool CheckIdleStateIsLocked() {
diff --git a/ui/base/idle/idle_win.cc b/ui/base/idle/idle_win.cc index f151537..4946406 100644 --- a/ui/base/idle/idle_win.cc +++ b/ui/base/idle/idle_win.cc
@@ -46,8 +46,8 @@ } // namespace -void CalculateIdleTime(IdleTimeCallback notify) { - notify.Run(static_cast<int>(CalculateIdleTimeInternal())); +int CalculateIdleTime() { + return static_cast<int>(CalculateIdleTimeInternal()); } bool CheckIdleStateIsLocked() {
diff --git a/ui/keyboard/BUILD.gn b/ui/keyboard/BUILD.gn index a1c52d46..69136111 100644 --- a/ui/keyboard/BUILD.gn +++ b/ui/keyboard/BUILD.gn
@@ -35,6 +35,8 @@ "keyboard_layout_manager.h", "keyboard_ui.cc", "keyboard_ui.h", + "keyboard_ui_factory.cc", + "keyboard_ui_factory.h", "keyboard_ukm_recorder.cc", "keyboard_ukm_recorder.h", "keyboard_util.cc",
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc index b0fe241..3e2d19d 100644 --- a/ui/keyboard/keyboard_controller.cc +++ b/ui/keyboard/keyboard_controller.cc
@@ -1092,6 +1092,14 @@ return false; } +void KeyboardController::KeyboardContentsLoaded( + const base::UnguessableToken& token, + const gfx::Size& size) { + if (!IsEnabled()) + return; + ui_->KeyboardContentsLoaded(token, size); +} + ui::TextInputClient* KeyboardController::GetTextInputClient() { return ui_->GetInputMethod()->GetTextInputClient(); }
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h index c7b5f048..b158d84 100644 --- a/ui/keyboard/keyboard_controller.h +++ b/ui/keyboard/keyboard_controller.h
@@ -240,6 +240,11 @@ bool IsKeyboardVisible(); + // When the window service is running, this will be called with |token| for + // embedding the window and the initial window size. + void KeyboardContentsLoaded(const base::UnguessableToken& token, + const gfx::Size& size); + aura::Window* parent_container() { return parent_container_; } ui::InputMethodKeyboardController* input_method_keyboard_controller() {
diff --git a/ui/keyboard/keyboard_ui.cc b/ui/keyboard/keyboard_ui.cc index 207f9c0c..cda9bfd 100644 --- a/ui/keyboard/keyboard_ui.cc +++ b/ui/keyboard/keyboard_ui.cc
@@ -5,10 +5,12 @@ #include "ui/keyboard/keyboard_ui.h" #include "base/command_line.h" +#include "base/unguessable_token.h" #include "ui/aura/window.h" #include "ui/base/ime/input_method.h" #include "ui/base/ime/text_input_client.h" #include "ui/base/ui_base_switches.h" +#include "ui/gfx/geometry/size.h" #include "ui/keyboard/keyboard_controller.h" namespace keyboard { @@ -33,6 +35,12 @@ window->Hide(); } +void KeyboardUI::KeyboardContentsLoaded(const base::UnguessableToken& token, + const gfx::Size& size) { + NOTREACHED() << "Unexpected call to KeyboardContentsLoaded. Token: " << token + << " Size: " << size.ToString(); +} + void KeyboardUI::SetController(KeyboardController* controller) { keyboard_controller_ = controller; }
diff --git a/ui/keyboard/keyboard_ui.h b/ui/keyboard/keyboard_ui.h index 2fe04db..bb5b648 100644 --- a/ui/keyboard/keyboard_ui.h +++ b/ui/keyboard/keyboard_ui.h
@@ -13,6 +13,12 @@ namespace aura { class Window; } +namespace base { +class UnguessableToken; +} +namespace gfx { +class Size; +} namespace ui { class InputMethod; } @@ -67,6 +73,11 @@ // TODO(https://crbug.com/845780): Change this to accept a callback. virtual void ReloadKeyboardIfNeeded() = 0; + // When the window service is running, this will be called with |token| for + // embedding the window and the initial window size. + virtual void KeyboardContentsLoaded(const base::UnguessableToken& token, + const gfx::Size& size); + // |controller| may be null when KeyboardController is being destroyed. void SetController(KeyboardController* controller);
diff --git a/ui/keyboard/keyboard_ui_factory.cc b/ui/keyboard/keyboard_ui_factory.cc new file mode 100644 index 0000000..4de381b --- /dev/null +++ b/ui/keyboard/keyboard_ui_factory.cc
@@ -0,0 +1,12 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/keyboard/keyboard_ui_factory.h" + +namespace keyboard { + +KeyboardUIFactory::KeyboardUIFactory() = default; +KeyboardUIFactory::~KeyboardUIFactory() = default; + +} // namespace keyboard
diff --git a/ui/keyboard/keyboard_ui_factory.h b/ui/keyboard/keyboard_ui_factory.h new file mode 100644 index 0000000..489be5b0 --- /dev/null +++ b/ui/keyboard/keyboard_ui_factory.h
@@ -0,0 +1,32 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_KEYBOARD_KEYBOARD_UI_FACTORY_H_ +#define UI_KEYBOARD_KEYBOARD_UI_FACTORY_H_ + +#include <memory> + +#include "base/macros.h" +#include "ui/keyboard/keyboard_export.h" + +namespace keyboard { + +class KeyboardUI; + +// KeyboardUIFactory is the factory of platform-dependent KeyboardUI. +class KEYBOARD_EXPORT KeyboardUIFactory { + public: + KeyboardUIFactory(); + virtual ~KeyboardUIFactory(); + + // Creates a new instance of KeyboardUI. + virtual std::unique_ptr<KeyboardUI> CreateKeyboardUI() = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(KeyboardUIFactory); +}; + +} // namespace keyboard + +#endif // UI_KEYBOARD_KEYBOARD_UI_FACTORY_H_
diff --git a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc index 62d42fc..8c662b9 100644 --- a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc +++ b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
@@ -37,7 +37,7 @@ bool GbmPixmapWayland::InitializeBuffer(gfx::Size size, gfx::BufferFormat format, gfx::BufferUsage usage) { - TRACE_EVENT1("Wayland", "GbmPixmapWayland::InitializeBuffer", "size", + TRACE_EVENT1("wayland", "GbmPixmapWayland::InitializeBuffer", "size", size.ToString()); uint32_t flags = 0; switch (usage) {
diff --git a/ui/ozone/platform/wayland/wayland_buffer_manager.cc b/ui/ozone/platform/wayland/wayland_buffer_manager.cc index 393336d..91b1a1e 100644 --- a/ui/ozone/platform/wayland/wayland_buffer_manager.cc +++ b/ui/ozone/platform/wayland/wayland_buffer_manager.cc
@@ -77,7 +77,7 @@ const std::vector<uint64_t>& modifiers, uint32_t planes_count, uint32_t buffer_id) { - TRACE_EVENT2("Wayland", "WaylandBufferManager::CreateZwpLinuxDmabuf", + TRACE_EVENT2("wayland", "WaylandBufferManager::CreateZwpLinuxDmabuf", "Format", format, "Buffer id", buffer_id); static const struct zwp_linux_buffer_params_v1_listener params_listener = { @@ -121,7 +121,7 @@ uint32_t buffer_id, const gfx::Rect& damage_region, wl::BufferSwapCallback callback) { - TRACE_EVENT1("Wayland", "WaylandBufferManager::ScheduleSwapBuffer", + TRACE_EVENT1("wayland", "WaylandBufferManager::ScheduleSwapBuffer", "Buffer id", buffer_id); if (!ValidateDataFromGpu(widget, buffer_id)) @@ -152,7 +152,7 @@ } bool WaylandBufferManager::DestroyBuffer(uint32_t buffer_id) { - TRACE_EVENT1("Wayland", "WaylandBufferManager::DestroyZwpLinuxDmabuf", + TRACE_EVENT1("wayland", "WaylandBufferManager::DestroyZwpLinuxDmabuf", "Buffer id", buffer_id); auto it = buffers_.find(buffer_id); @@ -181,7 +181,7 @@ // TODO(msisov): handle buffer swap failure or success. bool WaylandBufferManager::SwapBuffer(Buffer* buffer) { - TRACE_EVENT1("Wayland", "WaylandBufferManager::SwapBuffer", "Buffer id", + TRACE_EVENT1("wayland", "WaylandBufferManager::SwapBuffer", "Buffer id", buffer->buffer_id); WaylandWindow* window = connection_->GetWindow(buffer->widget);
diff --git a/ui/views/animation/ink_drop_host_view.cc b/ui/views/animation/ink_drop_host_view.cc index 9b81815..8bfe245 100644 --- a/ui/views/animation/ink_drop_host_view.cc +++ b/ui/views/animation/ink_drop_host_view.cc
@@ -162,13 +162,23 @@ std::unique_ptr<InkDropHighlight> InkDropHostView::CreateInkDropHighlight() const { + std::unique_ptr<InkDropHighlight> highlight; + if (GetProperty(kHighlightPathKey)) { - return std::make_unique<views::InkDropHighlight>( + highlight = std::make_unique<views::InkDropHighlight>( size(), 0, gfx::RectF(GetMirroredRect(GetLocalBounds())).CenterPoint(), GetInkDropBaseColor()); + } else { + highlight = CreateDefaultInkDropHighlight( + gfx::RectF(GetMirroredRect(GetContentsBounds())).CenterPoint()); } - return CreateDefaultInkDropHighlight( - gfx::RectF(GetMirroredRect(GetContentsBounds())).CenterPoint()); + // TODO(pbos): Once |ink_drop_highlight_opacity_| is either always set or + // callers are using the default InkDropHighlight value then make this a + // constructor argument to InkDropHighlight. + if (ink_drop_highlight_opacity_) + highlight->set_visible_opacity(*ink_drop_highlight_opacity_); + + return highlight; } std::unique_ptr<views::InkDropMask> InkDropHostView::CreateInkDropMask() const {
diff --git a/ui/views/animation/ink_drop_host_view.h b/ui/views/animation/ink_drop_host_view.h index f374839b..81cd507 100644 --- a/ui/views/animation/ink_drop_host_view.h +++ b/ui/views/animation/ink_drop_host_view.h
@@ -95,6 +95,10 @@ } float ink_drop_visible_opacity() const { return ink_drop_visible_opacity_; } + void set_ink_drop_highlight_opacity(base::Optional<float> opacity) { + ink_drop_highlight_opacity_ = opacity; + } + void set_ink_drop_corner_radii(int small_radius, int large_radius) { ink_drop_small_corner_radius_ = small_radius; ink_drop_large_corner_radius_ = large_radius; @@ -191,6 +195,10 @@ float ink_drop_visible_opacity_ = 0.175f; + // TODO(pbos): Audit call sites to make sure highlight opacity is either + // always set or using the default value. Then make this a non-optional float. + base::Optional<float> ink_drop_highlight_opacity_; + // Radii used for the SquareInkDropRipple. int ink_drop_small_corner_radius_ = 2; int ink_drop_large_corner_radius_ = 4; @@ -208,4 +216,4 @@ } // namespace views -#endif // UI_VIEWS_ANIMATION_INK_DROP_HOST_VIEW_H_ \ No newline at end of file +#endif // UI_VIEWS_ANIMATION_INK_DROP_HOST_VIEW_H_