diff --git a/BUILD.gn b/BUILD.gn index 30dd5e3..f83d903 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -593,8 +593,7 @@ # TODO(thakis): Enable this in cross builds, https://crbug.com/799827 if (!(is_component_build && is_debug && target_cpu == "x86") && host_os == "win") { - deps += - [ "//chrome/installer/mini_installer:next_version_mini_installer" ] + deps += [ "//chrome/test/mini_installer:mini_installer_tests" ] } } else if (!is_android && !is_ios && !is_fuchsia) { deps += [ "//third_party/breakpad:symupload($host_toolchain)" ]
diff --git a/DEPS b/DEPS index 089a2ff..f8d75c9 100644 --- a/DEPS +++ b/DEPS
@@ -79,11 +79,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'e65a5cd3fc34ab90743056ace2ef0a3a01bf6346', + 'skia_revision': '4d4b3aaa20e1978390c572a49dfcd59a0975c32f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'b2c284af96714cb677f37ca0ccb435497b598ca0', + 'v8_revision': '8943d0bd7bce064fb8c518e2ff52fbfae552fd95', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -91,7 +91,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': '115b2c4a2fc647de747814b26a840e25742f81d6', + 'angle_revision': '3395c8b9633348e5d8d83ffc77a69c3dfd698086', # 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. @@ -103,7 +103,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'a17ac192c043a6bce51e16cf7cd076087c78d9a9', + 'pdfium_revision': '19a33e4ece99c4bb438d870c52fbc5ed5e80c897', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -320,7 +320,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '6ea47f17c992f586b1ca0ae632d11b2fef15d48c', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '1d37d531d5362ebc471d3fc6a531e8d4b5b1857f', 'condition': 'checkout_linux', }, @@ -345,7 +345,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'ba51bb3c1274f5e8f7fef0ff6706d0e46e33864f', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'b3065fb6a19f946287d64e234c761ee223ab13f5', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index e6c28f9..264624f 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -556,9 +556,10 @@ # Bypass the AUTHORS check for these accounts. _KNOWN_ROBOTS = set( - '%s-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com' % s - for s in ('afdo', 'angle', 'catapult', 'chromite', 'depot-tools', - 'fuchsia-sdk', 'nacl', 'pdfium', 'skia', 'src-internal', 'webrtc')) + '%s-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com' % s + for s in ('afdo', 'angle', 'catapult', 'chromite', 'depot-tools', + 'fuchsia-sdk', 'nacl', 'pdfium', 'skia', 'src-internal', 'webrtc') + ) | set('%s@appspot.gserviceaccount.com' % s for s in ('findit-for-me',)) def _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, output_api):
diff --git a/android_webview/browser/aw_render_thread_context_provider.cc b/android_webview/browser/aw_render_thread_context_provider.cc index 076a06f2..a860024 100644 --- a/android_webview/browser/aw_render_thread_context_provider.cc +++ b/android_webview/browser/aw_render_thread_context_provider.cc
@@ -140,8 +140,8 @@ if (gr_context_) return gr_context_.get(); - sk_sp<GrGLInterface> interface(skia_bindings::CreateGLES2InterfaceBindings( - ContextGL(), ContextSupport())); + sk_sp<GrGLInterface> interface( + skia_bindings::CreateGLES2InterfaceBindings(ContextGL())); gr_context_ = GrContext::MakeGL(std::move(interface)); cache_controller_->SetGrContext(gr_context_.get()); return gr_context_.get(); @@ -152,6 +152,13 @@ return cache_controller_.get(); } +void AwRenderThreadContextProvider::InvalidateGrContext(uint32_t state) { + DCHECK(main_thread_checker_.CalledOnValidThread()); + + if (gr_context_) + gr_context_->resetContext(state); +} + base::Lock* AwRenderThreadContextProvider::GetLock() { // This context provider is not used on multiple threads. NOTREACHED();
diff --git a/android_webview/browser/aw_render_thread_context_provider.h b/android_webview/browser/aw_render_thread_context_provider.h index ac544255..58a32e4 100644 --- a/android_webview/browser/aw_render_thread_context_provider.h +++ b/android_webview/browser/aw_render_thread_context_provider.h
@@ -52,6 +52,7 @@ gpu::ContextSupport* ContextSupport() override; class GrContext* GrContext() override; viz::ContextCacheController* CacheController() override; + void InvalidateGrContext(uint32_t state) override; base::Lock* GetLock() override; void AddObserver(viz::ContextLostObserver* obs) override; void RemoveObserver(viz::ContextLostObserver* obs) override;
diff --git a/ash/app_list/app_list_presenter_delegate.cc b/ash/app_list/app_list_presenter_delegate.cc index e167c53..ef34bb55 100644 --- a/ash/app_list/app_list_presenter_delegate.cc +++ b/ash/app_list/app_list_presenter_delegate.cc
@@ -20,7 +20,6 @@ #include "ash/wm/window_state.h" #include "base/command_line.h" #include "ui/app_list/app_list_constants.h" -#include "ui/app_list/app_list_features.h" #include "ui/app_list/app_list_switches.h" #include "ui/app_list/views/app_list_view.h" #include "ui/aura/window.h" @@ -54,10 +53,7 @@ AppListPresenterDelegate::AppListPresenterDelegate( app_list::AppListPresenterImpl* presenter, app_list::AppListViewDelegateFactory* view_delegate_factory) - : is_fullscreen_app_list_enabled_( - app_list::features::IsFullscreenAppListEnabled()), - presenter_(presenter), - view_delegate_factory_(view_delegate_factory) { + : presenter_(presenter), view_delegate_factory_(view_delegate_factory) { Shell::Get()->AddShellObserver(this); Shell::Get()->tablet_mode_controller()->AddObserver(this); } @@ -124,40 +120,22 @@ // App list needs to know the new shelf layout in order to calculate its // UI layout when AppListView visibility changes. - if (is_fullscreen_app_list_enabled_) { - int app_list_y = view_->GetBoundsInScreen().y(); - return gfx::Vector2d(0, IsSideShelf(root_window) - ? 0 - : shelf->GetIdealBounds().y() - app_list_y); - } - - shelf->UpdateAutoHideState(); - switch (shelf->alignment()) { - case SHELF_ALIGNMENT_BOTTOM: - case SHELF_ALIGNMENT_BOTTOM_LOCKED: - return gfx::Vector2d(0, kAnimationOffset); - case SHELF_ALIGNMENT_LEFT: - return gfx::Vector2d(-kAnimationOffset, 0); - case SHELF_ALIGNMENT_RIGHT: - return gfx::Vector2d(kAnimationOffset, 0); - } - NOTREACHED(); - return gfx::Vector2d(); + int app_list_y = view_->GetBoundsInScreen().y(); + return gfx::Vector2d(0, IsSideShelf(root_window) + ? 0 + : shelf->GetIdealBounds().y() - app_list_y); } base::TimeDelta AppListPresenterDelegate::GetVisibilityAnimationDuration( aura::Window* root_window, bool is_visible) { - if (is_fullscreen_app_list_enabled_) { - // If the view is below the shelf, just hide immediately. - if (view_->GetBoundsInScreen().y() > - Shelf::ForWindow(root_window)->GetIdealBounds().y()) - return base::TimeDelta::FromMilliseconds(0); - return GetAnimationDurationFullscreen(IsSideShelf(root_window), - view_->is_fullscreen()); + // If the view is below the shelf, just hide immediately. + if (view_->GetBoundsInScreen().y() > + Shelf::ForWindow(root_window)->GetIdealBounds().y()) { + return base::TimeDelta::FromMilliseconds(0); } - return is_visible ? base::TimeDelta::FromMilliseconds(0) - : animation_duration(); + return GetAnimationDurationFullscreen(IsSideShelf(root_window), + view_->is_fullscreen()); } //////////////////////////////////////////////////////////////////////////////// @@ -226,16 +204,10 @@ } void AppListPresenterDelegate::OnTabletModeStarted() { - if (!is_fullscreen_app_list_enabled_) - return; - view_->OnTabletModeChanged(true); } void AppListPresenterDelegate::OnTabletModeEnded() { - if (!is_fullscreen_app_list_enabled_) - return; - view_->OnTabletModeChanged(false); }
diff --git a/ash/app_list/app_list_presenter_delegate.h b/ash/app_list/app_list_presenter_delegate.h index d22c977..2ce4394 100644 --- a/ash/app_list/app_list_presenter_delegate.h +++ b/ash/app_list/app_list_presenter_delegate.h
@@ -72,9 +72,6 @@ // Whether the app list is visible (or in the process of being shown). bool is_visible_ = false; - // Whether the fullscreen app list feature is enabled. - const bool is_fullscreen_app_list_enabled_; - // Not owned. Pointer is guaranteed to be valid while this object is alive. app_list::AppListPresenterImpl* presenter_;
diff --git a/ash/app_list/presenter/BUILD.gn b/ash/app_list/presenter/BUILD.gn index 911e7e5..4cc1d56 100644 --- a/ash/app_list/presenter/BUILD.gn +++ b/ash/app_list/presenter/BUILD.gn
@@ -39,8 +39,6 @@ sources = [ "test/app_list_presenter_impl_test_api.cc", "test/app_list_presenter_impl_test_api.h", - "test/test_app_list_view_delegate_factory.cc", - "test/test_app_list_view_delegate_factory.h", # Temporary dependency to fix compile flake in http://crbug.com/611898. # TODO(tapted): Remove once http://crbug.com/612382 is fixed.
diff --git a/ash/app_list/presenter/app_list_presenter_impl_unittest.cc b/ash/app_list/presenter/app_list_presenter_impl_unittest.cc index 0f3b397..be95a65 100644 --- a/ash/app_list/presenter/app_list_presenter_impl_unittest.cc +++ b/ash/app_list/presenter/app_list_presenter_impl_unittest.cc
@@ -9,7 +9,6 @@ #include "ash/app_list/presenter/app_list_presenter_delegate_factory.h" #include "ash/app_list/presenter/test/app_list_presenter_impl_test_api.h" #include "base/memory/ptr_util.h" -#include "ui/app_list/app_list_features.h" #include "ui/app_list/test/app_list_test_view_delegate.h" #include "ui/app_list/views/app_list_view.h" #include "ui/aura/client/focus_client.h" @@ -148,12 +147,9 @@ // not app list window's sibling and that appropriate delegate callbacks are // executed when the app launcher is shown and then when the app launcher is // dismissed. -TEST_F(AppListPresenterImplTest, HideOnFocusOut) { +TEST_F(AppListPresenterImplTest, DISABLED_HideOnFocusOut) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - aura::client::FocusClient* focus_client = aura::client::GetFocusClient(root_window()); presenter()->Show(GetDisplayId(), base::TimeTicks()); @@ -174,12 +170,9 @@ // Tests that app launcher remains visible when focus moves to a window which // is app list window's sibling and that appropriate delegate callbacks are // executed when the app launcher is shown. -TEST_F(AppListPresenterImplTest, RemainVisibleWhenFocusingToSibling) { +TEST_F(AppListPresenterImplTest, DISABLED_RemainVisibleWhenFocusingToSibling) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - aura::client::FocusClient* focus_client = aura::client::GetFocusClient(root_window()); presenter()->Show(GetDisplayId(), base::TimeTicks()); @@ -200,12 +193,9 @@ // Tests that the app list is dismissed and the delegate is destroyed when the // app list's widget is destroyed. -TEST_F(AppListPresenterImplTest, WidgetDestroyed) { +TEST_F(AppListPresenterImplTest, DISABLED_WidgetDestroyed) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - presenter()->Show(GetDisplayId(), base::TimeTicks()); EXPECT_TRUE(presenter()->GetTargetVisibility()); presenter()->GetView()->GetWidget()->CloseNow();
diff --git a/ash/app_list/presenter/test/test_app_list_view_delegate_factory.cc b/ash/app_list/presenter/test/test_app_list_view_delegate_factory.cc deleted file mode 100644 index 21dfc69..0000000 --- a/ash/app_list/presenter/test/test_app_list_view_delegate_factory.cc +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/app_list/presenter/test/test_app_list_view_delegate_factory.h" - -namespace app_list { -namespace test { - -TestAppListViewDelegateFactory::TestAppListViewDelegateFactory() {} - -TestAppListViewDelegateFactory::~TestAppListViewDelegateFactory() {} - -AppListViewDelegate* TestAppListViewDelegateFactory::GetDelegate() { - return &delegate_; -} - -} // namespace test -} // namespace app_list
diff --git a/ash/app_list/presenter/test/test_app_list_view_delegate_factory.h b/ash/app_list/presenter/test/test_app_list_view_delegate_factory.h deleted file mode 100644 index 7efbd01e..0000000 --- a/ash/app_list/presenter/test/test_app_list_view_delegate_factory.h +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_APP_LIST_PRESENTER_TEST_TEST_APP_LIST_VIEW_DELEGATE_FACTORY_H_ -#define ASH_APP_LIST_PRESENTER_TEST_TEST_APP_LIST_VIEW_DELEGATE_FACTORY_H_ - -#include "ash/app_list/presenter/app_list_view_delegate_factory.h" -#include "base/macros.h" -#include "ui/app_list/test/app_list_test_view_delegate.h" - -namespace app_list { -namespace test { - -// A concrete AppListViewDelegateFactory for unit tests. -class TestAppListViewDelegateFactory : public AppListViewDelegateFactory { - public: - TestAppListViewDelegateFactory(); - ~TestAppListViewDelegateFactory() override; - - AppListViewDelegate* GetDelegate() override; - - private: - AppListTestViewDelegate delegate_; - - DISALLOW_COPY_AND_ASSIGN(TestAppListViewDelegateFactory); -}; - -} // namespace test -} // namespace app_list - -#endif // ASH_APP_LIST_PRESENTER_TEST_TEST_APP_LIST_VIEW_DELEGATE_FACTORY_H_
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index ada50fd7..db7eaa2 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -183,6 +183,9 @@ <message name="IDS_ASH_ADD_USER_BUTTON" desc="Text shown on an add user button on login/locker screen"> Add Person </message> + <message name="IDS_ASH_SHOW_WEBUI_LOGIN_BUTTON" desc="Button on login/lock screen which reverts to the previous implementation."> + (TEMP) Show webui login; if used file bug (crbug.com) or feedback (alt+shift+i) + </message> <message name="IDS_ASH_KEYBOARD_OVERLAY_TITLE" desc="The title of the keyboard overlay."> Keyboard overlay
diff --git a/ash/components/shortcut_viewer/views/bubble_view.cc b/ash/components/shortcut_viewer/views/bubble_view.cc index 0731bc3..d56a9f6 100644 --- a/ash/components/shortcut_viewer/views/bubble_view.cc +++ b/ash/components/shortcut_viewer/views/bubble_view.cc
@@ -60,7 +60,7 @@ AddChildViewAt(icon_, 0); } - constexpr int kIconSize = 12; + constexpr int kIconSize = 16; constexpr SkColor kIconColor = SkColorSetARGBMacro(0xFF, 0x5C, 0x5D, 0x60); icon_->SetImage(gfx::CreateVectorIcon(icon, kIconColor)); icon_->SetImageSize(gfx::Size(kIconSize, kIconSize)); @@ -94,7 +94,7 @@ preferred_size.Enlarge(GetInsets().width(), GetInsets().height()); // To avoid text and icon bubbles have different heights in a row. - constexpr int kMinimumHeight = 24; + constexpr int kMinimumHeight = 32; preferred_size.SetToMax(gfx::Size(kMinimumHeight, kMinimumHeight)); // Make the width to be at lease as large as the height. preferred_size.set_width( @@ -106,7 +106,7 @@ views::View::OnPaint(canvas); constexpr SkColor kBackgroundColor = - SkColorSetARGBMacro(0xFF, 0xE8, 0xEA, 0xED); + SkColorSetARGBMacro(0xFF, 0xF1, 0xF3, 0xF4); constexpr int kCornerRadius = 22; // Draw a round rect with background color and shadow. cc::PaintFlags flags;
diff --git a/ash/components/strings/ash_components_strings_bn.xtb b/ash/components/strings/ash_components_strings_bn.xtb index 89083dc..b606f6f 100644 --- a/ash/components/strings/ash_components_strings_bn.xtb +++ b/ash/components/strings/ash_components_strings_bn.xtb
@@ -138,7 +138,7 @@ <translation id="8388247778047144397">ট্যাব বারের ফাঁকা অঞ্চলে একটি লিঙ্ক টেনে আনুন</translation> <translation id="8389638407792712197">নতুন উইন্ডো খুলুন</translation> <translation id="8429696719963529183">F কীগুলি ব্যবহার করুন (F1 থেকে F12)</translation> -<translation id="8537650670971624753">সার্চ মোডটি ছেড়ে যান</translation> +<translation id="8537650670971624753">সার্চ মোড থেকে বেরিয়ে আসুন</translation> <translation id="85690795166292698">একটি নতুন ট্যাবে লিঙ্কটি খুলুন</translation> <translation id="8609384513243082612">নতুন ট্যাব খুলুন</translation> <translation id="8644639153978066712">ফাইল অ্যাপে লুকিয়ে থাকা ফাইলগুলি ডিসপ্লে করুন</translation>
diff --git a/ash/components/strings/ash_components_strings_cs.xtb b/ash/components/strings/ash_components_strings_cs.xtb index 8b59cb1..2f8bdbc7 100644 --- a/ash/components/strings/ash_components_strings_cs.xtb +++ b/ash/components/strings/ash_components_strings_cs.xtb
@@ -144,7 +144,16 @@ <translation id="8644639153978066712">Zobrazit v aplikaci Soubory skryté soubory</translation> <translation id="8717459106217102612">Vybrat předchozí slovo nebo písmeno.</translation> <translation id="8727232706774971183">Zobrazit oznámení</translation> +<translation id="8855885154700222542">Tlačítko celé obrazovky</translation> <translation id="88986195241502842">O stránku dolů</translation> <translation id="8903921497873541725">Přiblížit</translation> +<translation id="8924883688469390268">Přepnout na předchozího uživatele</translation> +<translation id="8977648847395357314">Vybrat obsah adresního řádku</translation> +<translation id="8990356943438003669"><ph name="ALT" /><ph name="SEPARATOR" /> 1 až 8</translation> +<translation id="9041599225465145264">Vložit obsah ze schránky</translation> +<translation id="9052808072970550123">Přepnout na dalšího uživatele</translation> <translation id="9179672198516322668">Oblíbené klávesové zkratky</translation> +<translation id="93603345341560814">Stiskněte <ph name="SHIFT" /> a klikněte na odkaz</translation> +<translation id="945383118875625837">Přetáhněte odkaz na lištu záložek</translation> +<translation id="98120814841227350">Přejít na konec dokumentu</translation> </translationbundle> \ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_en-GB.xtb b/ash/components/strings/ash_components_strings_en-GB.xtb index e99709b..858f068 100644 --- a/ash/components/strings/ash_components_strings_en-GB.xtb +++ b/ash/components/strings/ash_components_strings_en-GB.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="en-GB"> <translation id="104962181688258143">Open the Files app</translation> <translation id="1126871238933253947">Switch to the previous keyboard language that you were using.</translation> +<translation id="1134347825771908369">Mute volume</translation> <translation id="1195667586424773550">Drag the link to the tab's address bar</translation> <translation id="1204450209689312104">Open a new window in incognito mode</translation> <translation id="1293699935367580298">Esc</translation> @@ -55,6 +56,7 @@ <translation id="353037708190149633">Save all open pages in your current window as bookmarks in a new folder</translation> <translation id="355103131818127604">Open the link in a new tab in the background</translation> <translation id="3649256019230929621">Minimise window</translation> +<translation id="3655154169297074232">Tabs & Windows</translation> <translation id="3668361878347172356">Redo your last action</translation> <translation id="3720939646656082033">Open the link in a new tab and switch to the new tab</translation> <translation id="3725795051337497754">Close the current tab</translation> @@ -70,6 +72,8 @@ <translation id="4123108089450197101">Save the link as a bookmark</translation> <translation id="4141203561740478845">Highlight the row with the address bar</translation> <translation id="4148761611071495477"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="G" /> or <ph name="ENTER" /></translation> +<translation id="4240486403425279990">Overview mode</translation> +<translation id="4472417192667361414">System & Display Settings</translation> <translation id="4556221320735744018">See Keyboard Shortcut Helper</translation> <translation id="4628718545549558538">Open the status area (where your account picture appears)</translation> <translation id="4642092649622328492">Take partial screenshot</translation> @@ -134,6 +138,7 @@ <translation id="8130528849632411619">Go to beginning of document</translation> <translation id="8147954207400281792"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="K" /> or <ph name="E" /></translation> <translation id="8234414138295101081">Rotate screen 90 degrees</translation> +<translation id="826184564253127735">Keyboard Shortcut Viewer</translation> <translation id="836869401750819675">Open the Downloads page</translation> <translation id="8388247778047144397">Drag the link to a blank area on the tab strip</translation> <translation id="8389638407792712197">Open new window</translation> @@ -144,7 +149,17 @@ <translation id="8644639153978066712">Display hidden files in the Files app</translation> <translation id="8717459106217102612">Select previous word or letter</translation> <translation id="8727232706774971183">See your notifications</translation> +<translation id="8855885154700222542">Full-screen key</translation> <translation id="88986195241502842">Page down</translation> <translation id="8903921497873541725">Zoom in</translation> +<translation id="8924883688469390268">Switch to the previous user</translation> +<translation id="8977648847395357314">Select the content in the address bar</translation> +<translation id="8990356943438003669"><ph name="ALT" /><ph name="SEPARATOR" /> 1 to 8</translation> +<translation id="9041599225465145264">Paste content from the clipboard</translation> +<translation id="9052808072970550123">Switch to the next user</translation> +<translation id="9106898733795143799">Page & Web Browser</translation> <translation id="9179672198516322668">Popular Shortcuts</translation> +<translation id="93603345341560814">Press <ph name="SHIFT" /> and click a link</translation> +<translation id="945383118875625837">Drag link to bookmarks bar</translation> +<translation id="98120814841227350">Go to end of document</translation> </translationbundle> \ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_mr.xtb b/ash/components/strings/ash_components_strings_mr.xtb index a4a05bc..3d8b932 100644 --- a/ash/components/strings/ash_components_strings_mr.xtb +++ b/ash/components/strings/ash_components_strings_mr.xtb
@@ -62,7 +62,7 @@ <translation id="379295446891231126"><ph name="CTRL" /><ph name="SEPARATOR" /> एक ते आठ</translation> <translation id="3837047332182291558">कीबोर्ड उजळ करा (फक्त बॅकलिट कीबोर्डसाठी)</translation> <translation id="3976863468609830880">तुमच्या शेल्फवरील शेवटच्या आयकनवर क्लिक करा</translation> -<translation id="4026843240379844265">डिस्प्ले दरम्यान सक्रिय विंडो हलवा</translation> +<translation id="4026843240379844265">डिस्प्ले दरम्यान अॅक्टिव्ह विंडो हलवा</translation> <translation id="4035482366624727273">पेजवरील प्रत्येक गोष्ट निवडा</translation> <translation id="4060703249685950734">तुम्ही याआधी बंद केलेला टॅब किंवा विंडो पुन्हा उघडा</translation> <translation id="4090342722461256974"><ph name="ALT" /><ph name="SEPARATOR" /><ph name="SHIFT" /> दाबा आणि धरून ठेवा, तुम्हाला उघडायची असलेल्या विंडोवर तुम्ही पोहोचेपर्यंत <ph name="TAB" /> वर टॅप करत राहा, मग सोडा.</translation>
diff --git a/ash/components/strings/ash_components_strings_vi.xtb b/ash/components/strings/ash_components_strings_vi.xtb index 7deb7a3..9343f91 100644 --- a/ash/components/strings/ash_components_strings_vi.xtb +++ b/ash/components/strings/ash_components_strings_vi.xtb
@@ -138,7 +138,7 @@ <translation id="8388247778047144397">Kéo liên kết vào một vùng trống trên thanh tab</translation> <translation id="8389638407792712197">Mở cửa sổ mới</translation> <translation id="8429696719963529183">Sử dụng các phím F (F1 tới F12)</translation> -<translation id="8537650670971624753">Thoát chế độ tìm kiếm</translation> +<translation id="8537650670971624753">Thoát khỏi chế độ tìm kiếm</translation> <translation id="85690795166292698">Mở liên kết trong một tab mới</translation> <translation id="8609384513243082612">Mở tab mới</translation> <translation id="8644639153978066712">Hiển thị các tệp bị ẩn trong ứng dụng Tệp</translation>
diff --git a/ash/content/display/screen_orientation_controller_chromeos_unittest.cc b/ash/content/display/screen_orientation_controller_chromeos_unittest.cc index 08c0e089..bbe9081 100644 --- a/ash/content/display/screen_orientation_controller_chromeos_unittest.cc +++ b/ash/content/display/screen_orientation_controller_chromeos_unittest.cc
@@ -191,6 +191,8 @@ // Tests that a content::WebContents can lock rotation. TEST_F(ScreenOrientationControllerTest, LockOrientation) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content(CreateWebContents()); std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); ASSERT_NE(nullptr, content->GetNativeView()); @@ -205,6 +207,8 @@ // Tests that a content::WebContents can unlock rotation. TEST_F(ScreenOrientationControllerTest, Unlock) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content(CreateWebContents()); std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); ASSERT_NE(nullptr, content->GetNativeView()); @@ -223,6 +227,8 @@ // Tests that a content::WebContents is able to change the orientation of the // display after having locked rotation. TEST_F(ScreenOrientationControllerTest, OrientationChanges) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content(CreateWebContents()); std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); ASSERT_NE(nullptr, content->GetNativeView()); @@ -241,6 +247,8 @@ // Tests that orientation can only be set by the first content::WebContents that // has set a rotation lock. TEST_F(ScreenOrientationControllerTest, SecondContentCannotChangeOrientation) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content1(CreateWebContents()); std::unique_ptr<content::WebContents> content2(CreateSecondaryWebContents()); std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); @@ -257,6 +265,8 @@ // Tests that only the content::WebContents that set a rotation lock can perform // an unlock. TEST_F(ScreenOrientationControllerTest, SecondContentCannotUnlock) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content1(CreateWebContents()); std::unique_ptr<content::WebContents> content2(CreateSecondaryWebContents()); std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); @@ -273,6 +283,8 @@ // Tests that a rotation lock is applied only while the content::WebContents are // a part of the active window. TEST_F(ScreenOrientationControllerTest, ActiveWindowChangesUpdateLock) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content(CreateWebContents()); std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); std::unique_ptr<aura::Window> focus_window2(CreateAppWindowInShellWithId(1)); @@ -292,6 +304,8 @@ // Tests that switching between windows with different orientation locks change // the orientation. TEST_F(ScreenOrientationControllerTest, ActiveWindowChangesUpdateOrientation) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content1(CreateWebContents()); std::unique_ptr<content::WebContents> content2(CreateSecondaryWebContents()); std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); @@ -316,6 +330,8 @@ // Tests that a rotation lock is removed when the setting window is hidden, and // that it is reapplied when the window becomes visible. TEST_F(ScreenOrientationControllerTest, VisibilityChangesLock) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content(CreateWebContents()); std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); AttachAndActivateWebContents(content.get(), focus_window.get()); @@ -333,6 +349,8 @@ // Tests that when a window is destroyed that its rotation lock is removed, and // window activations no longer change the lock TEST_F(ScreenOrientationControllerTest, WindowDestructionRemovesLock) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content(CreateWebContents()); std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); std::unique_ptr<aura::Window> focus_window2(CreateAppWindowInShellWithId(1)); @@ -357,6 +375,7 @@ // rotation of the internal display. TEST_F(ScreenOrientationControllerTest, DisplayRotation) { EnableTabletMode(true); + // Now test rotating in all directions. TriggerLidUpdate(gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f)); EXPECT_EQ(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); @@ -372,6 +391,7 @@ // is almost laying flat). TEST_F(ScreenOrientationControllerTest, RotationIgnoresLowAngles) { EnableTabletMode(true); + TriggerLidUpdate(gfx::Vector3dF(0.0f, -kMeanGravity, -kMeanGravity)); EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); TriggerLidUpdate(gfx::Vector3dF(-2.0f, 0.0f, -kMeanGravity)); @@ -388,6 +408,7 @@ // halfway point, preventing frequent updates back and forth. TEST_F(ScreenOrientationControllerTest, RotationSticky) { EnableTabletMode(true); + gfx::Vector3dF gravity(0.0f, -kMeanGravity, 0.0f); TriggerLidUpdate(gravity); EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); @@ -698,6 +719,8 @@ } TEST_F(ScreenOrientationControllerTest, UserRotationLock) { + EnableTabletMode(true); + std::unique_ptr<content::WebContents> content1(CreateWebContents()); std::unique_ptr<content::WebContents> content2(CreateSecondaryWebContents()); std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0));
diff --git a/ash/content/screen_orientation_delegate_chromeos.cc b/ash/content/screen_orientation_delegate_chromeos.cc index bc6e39d4..073992e 100644 --- a/ash/content/screen_orientation_delegate_chromeos.cc +++ b/ash/content/screen_orientation_delegate_chromeos.cc
@@ -54,8 +54,8 @@ content::WebContents* web_contents, blink::WebScreenOrientationLockType orientation_lock) { Shell::Get()->screen_orientation_controller()->LockOrientationForWindow( - web_contents->GetNativeView(), ToAshOrientationLockType(orientation_lock), - ScreenOrientationController::LockCompletionBehavior::None); + web_contents->GetNativeView(), + ToAshOrientationLockType(orientation_lock)); } bool ScreenOrientationDelegateChromeos::ScreenOrientationProviderSupported() {
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 8c6ee9c7..f8c0346 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc
@@ -1301,7 +1301,7 @@ float zoom_factor_1 = 2.0f; display_manager()->UpdateZoomFactor(info_1.id(), zoom_factor_1); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_EQ(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factor_1); // With the zoom factor set for the display. The effective zoom factor @@ -1314,7 +1314,7 @@ float zoom_factor_2 = 1.5f; display_manager()->UpdateZoomFactor(info_1.id(), zoom_factor_2); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_EQ(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factor_2); // Change the display mode of the device. @@ -1336,7 +1336,7 @@ // Set the zoom factor back to |zoom_factor_2| for first display. display_manager()->UpdateZoomFactor(info_1.id(), zoom_factor_2); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_EQ(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factor_2); EXPECT_EQ( display_manager()->GetDisplayForId(info_1.id()).device_scale_factor(), @@ -1346,7 +1346,7 @@ float zoom_factor_3 = 1.5f; const display::ManagedDisplayInfo& info_2 = GetDisplayInfoAt(1); display_manager()->UpdateZoomFactor(info_2.id(), zoom_factor_3); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(info_2.id()), + EXPECT_EQ(display_manager()->GetDisplayInfo(info_2.id()).zoom_factor(), zoom_factor_3); EXPECT_EQ( display_manager()->GetDisplayForId(info_2.id()).device_scale_factor(), @@ -1354,13 +1354,13 @@ // Modifying zoom factor for a display should not effect zoom factors of // other displays. - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_EQ(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factor_2); // Update the zoom factor for display to see if it gets reflected. display_manager()->UpdateZoomFactor(info_1.id(), zoom_factor_3); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_EQ(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factor_3); display::test::SetDisplayResolution(display_manager(), info_1.id(), modes[0].size()); @@ -1407,17 +1407,17 @@ zoom_factors_1[zoom_factor_idx_1]); // Make sure the chage was successful. - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factors_1[zoom_factor_idx_1], 0.001f); // Zoom out the display. This should have no effect, since the display is // already at the minimum zoom level. display_manager()->ZoomDisplay(info_1.id(), true /* up */); - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factors_1[zoom_factor_idx_1], 0.001f); // Ensure that this call did not modify the zoom value for the other display. - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_2.id()), 1.f, + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_2.id()).zoom_factor(), 1.f, 0.001f); // Zoom in the display. @@ -1425,14 +1425,14 @@ // The zoom factor for the display should be set to the next zoom factor in // list. - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factors_1[zoom_factor_idx_1 + 1], 0.001f); // Zoom out the display. display_manager()->ZoomDisplay(info_1.id(), true /* up */); // The zoom level should decrease from the previous level. - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factors_1[zoom_factor_idx_1], 0.001f); // Enumerate the zoom factors for display. @@ -1446,37 +1446,37 @@ zoom_factors_2[zoom_factor_idx_2]); // Make sure the chage was successful. - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_2.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_2.id()).zoom_factor(), zoom_factors_2[zoom_factor_idx_2], 0.001f); // Zoom in the display. This should have no effect since we are already at // maximum zoom. display_manager()->ZoomDisplay(info_2.id(), false /* up */); - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_2.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_2.id()).zoom_factor(), zoom_factors_2[zoom_factor_idx_2], 0.001f); // Zoom out the display display_manager()->ZoomDisplay(info_2.id(), true /* up */); - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_2.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_2.id()).zoom_factor(), zoom_factors_2[zoom_factor_idx_2 - 1], 0.001f); // Ensure that this call did not modify the zoom value for the other display. - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_1.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), zoom_factors_1[zoom_factor_idx_1], 0.001f); // Reset the zoom value for displays. display_manager()->ResetDisplayZoom(info_1.id()); - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_1.id()), 1.f, + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), 1.f, 0.001f); // Resetting the zoom level of one display should not effect the other display - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_2.id()), + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_2.id()).zoom_factor(), zoom_factors_2[zoom_factor_idx_2 - 1], 0.001f); // Now reset the zoom value for other display. display_manager()->ResetDisplayZoom(info_2.id()); - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_2.id()), 1.f, + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_2.id()).zoom_factor(), 1.f, 0.001f); - EXPECT_NEAR(display_manager()->GetZoomFactorForDisplay(info_1.id()), 1.f, + EXPECT_NEAR(display_manager()->GetDisplayInfo(info_1.id()).zoom_factor(), 1.f, 0.001f); } @@ -3733,6 +3733,8 @@ 0.f, 0.f); portrait_secondary->Set(chromeos::ACCELEROMETER_SOURCE_SCREEN, kMeanGravity, 0.f, 0.f); + landscape_primary->Set(chromeos::ACCELEROMETER_SOURCE_SCREEN, 0, + -kMeanGravity, 0.f); } protected: @@ -3740,6 +3742,8 @@ new chromeos::AccelerometerUpdate(); scoped_refptr<chromeos::AccelerometerUpdate> portrait_secondary = new chromeos::AccelerometerUpdate(); + scoped_refptr<chromeos::AccelerometerUpdate> landscape_primary = + new chromeos::AccelerometerUpdate(); private: DISALLOW_COPY_AND_ASSIGN(DisplayManagerOrientationTest); @@ -3780,25 +3784,22 @@ { window_a->SetProperty(aura::client::kAppType, static_cast<int>(AppType::CHROME_APP)); - orientation_controller->LockOrientationForWindow( - window_a, OrientationLockType::kAny, - ScreenOrientationController::LockCompletionBehavior::None); + orientation_controller->LockOrientationForWindow(window_a, + OrientationLockType::kAny); } aura::Window* window_p = CreateTestWindowInShellWithId(0); { window_p->SetProperty(aura::client::kAppType, static_cast<int>(AppType::CHROME_APP)); orientation_controller->LockOrientationForWindow( - window_p, OrientationLockType::kPortrait, - ScreenOrientationController::LockCompletionBehavior::None); + window_p, OrientationLockType::kPortrait); } aura::Window* window_l = CreateTestWindowInShellWithId(0); { window_l->SetProperty(aura::client::kAppType, static_cast<int>(AppType::CHROME_APP)); orientation_controller->LockOrientationForWindow( - window_l, OrientationLockType::kLandscape, - ScreenOrientationController::LockCompletionBehavior::None); + window_l, OrientationLockType::kLandscape); } DisplayConfigurationController* configuration_controller = @@ -3911,8 +3912,7 @@ Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager(true); orientation_controller->LockOrientationForWindow( - window, OrientationLockType::kPortrait, - ScreenOrientationController::LockCompletionBehavior::None); + window, OrientationLockType::kPortrait); EXPECT_EQ(display::Display::ROTATE_270, screen->GetPrimaryDisplay().rotation()); @@ -3950,9 +3950,8 @@ { window_a->SetProperty(aura::client::kAppType, static_cast<int>(AppType::CHROME_APP)); - orientation_controller->LockOrientationForWindow( - window_a, OrientationLockType::kAny, - ScreenOrientationController::LockCompletionBehavior::None); + orientation_controller->LockOrientationForWindow(window_a, + OrientationLockType::kAny); } wm::ActivateWindow(window_a); Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager(true); @@ -3964,15 +3963,24 @@ orientation_controller->OnAccelerometerUpdated(portrait_secondary); - aura::Window* window_ps = CreateTestWindowInShellWithId(1); - { - window_ps->SetProperty(aura::client::kAppType, - static_cast<int>(AppType::CHROME_APP)); - orientation_controller->LockOrientationForWindow( - window_ps, OrientationLockType::kPortrait, - ScreenOrientationController::LockCompletionBehavior::DisableSensor); - wm::ActivateWindow(window_ps); - } + aura::Window* window_lsc = CreateTestWindowInShellWithId(1); + window_lsc->SetProperty(aura::client::kAppType, + static_cast<int>(AppType::CHROME_APP)); + + aura::Window* window_psc = CreateTestWindowInShellWithId(1); + window_psc->SetProperty(aura::client::kAppType, + static_cast<int>(AppType::CHROME_APP)); + + orientation_controller->LockOrientationForWindow( + window_psc, OrientationLockType::kPortraitSecondary); + orientation_controller->LockOrientationForWindow( + window_psc, OrientationLockType::kCurrent); + wm::ActivateWindow(window_psc); + + orientation_controller->LockOrientationForWindow( + window_lsc, OrientationLockType::kLandscapeSecondary); + orientation_controller->LockOrientationForWindow( + window_lsc, OrientationLockType::kCurrent); EXPECT_EQ(OrientationLockType::kPortraitSecondary, test_api.GetCurrentOrientation()); @@ -3981,6 +3989,15 @@ orientation_controller->OnAccelerometerUpdated(portrait_primary); EXPECT_EQ(OrientationLockType::kPortraitSecondary, test_api.GetCurrentOrientation()); + wm::ActivateWindow(window_lsc); + + EXPECT_EQ(OrientationLockType::kLandscapeSecondary, + test_api.GetCurrentOrientation()); + + // The orientation should stay landscape secondary. + orientation_controller->OnAccelerometerUpdated(landscape_primary); + EXPECT_EQ(OrientationLockType::kLandscapeSecondary, + test_api.GetCurrentOrientation()); wm::ActivateWindow(window_a); orientation_controller->OnAccelerometerUpdated(portrait_primary); @@ -3991,7 +4008,7 @@ // The orientation has alraedy been locked to secondary once, so // it should swtich back to the portrait secondary. - wm::ActivateWindow(window_ps); + wm::ActivateWindow(window_psc); EXPECT_EQ(OrientationLockType::kPortraitSecondary, test_api.GetCurrentOrientation()); }
diff --git a/ash/display/screen_orientation_controller_chromeos.cc b/ash/display/screen_orientation_controller_chromeos.cc index bff56e2..88fb67a 100644 --- a/ash/display/screen_orientation_controller_chromeos.cc +++ b/ash/display/screen_orientation_controller_chromeos.cc
@@ -157,6 +157,39 @@ type == OrientationLockType::kPortraitSecondary; } +std::ostream& operator<<(std::ostream& out, const OrientationLockType& lock) { + switch (lock) { + case OrientationLockType::kAny: + out << "any"; + break; + case OrientationLockType::kNatural: + out << "natural"; + break; + case OrientationLockType::kCurrent: + out << "current"; + break; + case OrientationLockType::kPortrait: + out << "portrait"; + break; + case OrientationLockType::kLandscape: + out << "landscape"; + break; + case OrientationLockType::kPortraitPrimary: + out << "portrait-primary"; + break; + case OrientationLockType::kPortraitSecondary: + out << "portrait-secondary"; + break; + case OrientationLockType::kLandscapePrimary: + out << "landscape-primary"; + break; + case OrientationLockType::kLandscapeSecondary: + out << "landscape-secondary"; + break; + } + return out; +} + ScreenOrientationController::ScreenOrientationController() : natural_orientation_(GetDisplayNaturalOrientation()), ignore_display_configuration_updates_(false), @@ -186,15 +219,23 @@ void ScreenOrientationController::LockOrientationForWindow( aura::Window* requesting_window, - OrientationLockType lock_orientation, - LockCompletionBehavior lock_completion_behavior) { - if (lock_info_map_.empty()) - Shell::Get()->activation_client()->AddObserver(this); - + OrientationLockType orientation_lock) { if (!requesting_window->HasObserver(this)) requesting_window->AddObserver(this); - lock_info_map_[requesting_window] = - LockInfo(lock_orientation, lock_completion_behavior); + auto iter = lock_info_map_.find(requesting_window); + if (iter != lock_info_map_.end()) { + if (orientation_lock == OrientationLockType::kCurrent) { + // If the app previously requested an orientation, + // disable the sensor when that orientation is locked. + iter->second.lock_completion_behavior = + LockCompletionBehavior::DisableSensor; + } else { + iter->second.orientation_lock = orientation_lock; + iter->second.lock_completion_behavior = LockCompletionBehavior::None; + } + } else { + lock_info_map_.emplace(requesting_window, LockInfo(orientation_lock)); + } ApplyLockForActiveWindow(); } @@ -202,17 +243,11 @@ void ScreenOrientationController::UnlockOrientationForWindow( aura::Window* window) { lock_info_map_.erase(window); - if (lock_info_map_.empty()) - Shell::Get()->activation_client()->RemoveObserver(this); window->RemoveObserver(this); ApplyLockForActiveWindow(); } void ScreenOrientationController::UnlockAll() { - for (auto pair : lock_info_map_) - pair.first->RemoveObserver(this); - lock_info_map_.clear(); - Shell::Get()->activation_client()->RemoveObserver(this); SetRotationLockedInternal(false); if (user_rotation_ != current_rotation_) { SetDisplayRotation(user_rotation_, @@ -333,6 +368,7 @@ LoadDisplayRotationProperties(); chromeos::AccelerometerReader::GetInstance()->AddObserver(this); shell->window_tree_host_manager()->AddObserver(this); + Shell::Get()->activation_client()->AddObserver(this); if (!display::Display::HasInternalDisplay()) return; @@ -344,6 +380,7 @@ void ScreenOrientationController::OnTabletModeEnding() { chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this); Shell::Get()->window_tree_host_manager()->RemoveObserver(this); + Shell::Get()->activation_client()->RemoveObserver(this); if (!display::Display::HasInternalDisplay()) return; @@ -357,6 +394,10 @@ observer.OnUserRotationLockChanged(); } +void ScreenOrientationController::OnTabletModeEnded() { + UnlockAll(); +} + void ScreenOrientationController::SetDisplayRotation( display::Display::Rotation rotation, display::Display::RotationSource source, @@ -527,6 +568,9 @@ } void ScreenOrientationController::ApplyLockForActiveWindow() { + if (!ScreenOrientationProviderSupported()) + return; + MruWindowTracker::WindowList mru_windows( Shell::Get()->mru_window_tracker()->BuildMruWindowList()); @@ -535,14 +579,21 @@ continue; for (auto& pair : lock_info_map_) { if (pair.first->TargetVisibility() && window->Contains(pair.first)) { - LockRotationToOrientation(ResolveOrientationLock( - pair.second.orientation, user_locked_orientation_)); - if (pair.second.lock_completion_behavior == - LockCompletionBehavior::DisableSensor) { - pair.second.orientation = + if (pair.second.orientation_lock == OrientationLockType::kCurrent) { + // If the app requested "current" without previously + // specifying an orientation, use the current rotation. + pair.second.orientation_lock = RotationToOrientation(natural_orientation_, current_rotation_); - pair.second.lock_completion_behavior = LockCompletionBehavior::None; - LockRotationToOrientation(pair.second.orientation); + LockRotationToOrientation(pair.second.orientation_lock); + } else { + const auto orientation_lock = ResolveOrientationLock( + pair.second.orientation_lock, user_locked_orientation_); + LockRotationToOrientation(orientation_lock); + if (pair.second.lock_completion_behavior == + LockCompletionBehavior::DisableSensor) { + pair.second.lock_completion_behavior = LockCompletionBehavior::None; + pair.second.orientation_lock = orientation_lock; + } } return; }
diff --git a/ash/display/screen_orientation_controller_chromeos.h b/ash/display/screen_orientation_controller_chromeos.h index c9380a5fb..1233dc2 100644 --- a/ash/display/screen_orientation_controller_chromeos.h +++ b/ash/display/screen_orientation_controller_chromeos.h
@@ -37,10 +37,14 @@ kLandscapeSecondary }; +// Test if the orientation lock type is primary/landscape/portrait. bool IsPrimaryOrientation(OrientationLockType type); bool IsLandscapeOrientation(OrientationLockType type); bool IsPortraitOrientation(OrientationLockType type); +ASH_EXPORT std::ostream& operator<<(std::ostream& out, + const OrientationLockType& lock); + // Implements ChromeOS specific functionality for ScreenOrientationProvider. class ASH_EXPORT ScreenOrientationController : public ::wm::ActivationChangeObserver, @@ -84,10 +88,9 @@ void RemoveObserver(Observer* observer); // Allows/unallows a window to lock the screen orientation. - void LockOrientationForWindow( - aura::Window* requesting_window, - OrientationLockType lock_orientation, - LockCompletionBehavior lock_completion_behavior); + void LockOrientationForWindow(aura::Window* requesting_window, + OrientationLockType orientation_lock); + void UnlockOrientationForWindow(aura::Window* window); // Unlock all and set the rotation back to the user specified rotation. @@ -144,18 +147,15 @@ // TabletModeObserver: void OnTabletModeStarted() override; void OnTabletModeEnding() override; + void OnTabletModeEnded() override; private: friend class ScreenOrientationControllerTestApi; struct LockInfo { LockInfo() {} - LockInfo(OrientationLockType orientation, - LockCompletionBehavior lock_completion_behavior) - : orientation(orientation), - lock_completion_behavior(lock_completion_behavior) {} - - OrientationLockType orientation = OrientationLockType::kAny; + LockInfo(OrientationLockType lock) : orientation_lock(lock) {} + OrientationLockType orientation_lock = OrientationLockType::kAny; LockCompletionBehavior lock_completion_behavior = LockCompletionBehavior::None; }; @@ -202,8 +202,8 @@ // window, and applies it. If there is none, rotation lock will be removed. void ApplyLockForActiveWindow(); - // Both |OrientationLockLandscape| and - // |OrientationLockPortrait| allow for rotation between the + // Both |OrientationLockType::kLandscape| and + // |OrientationLock::kPortrait| allow for rotation between the // two angles of the same screen orientation // (http://www.w3.org/TR/screen-orientation/). Returns true if |rotation| is // supported for the current |rotation_locked_orientation_|.
diff --git a/ash/frame/caption_buttons/frame_size_button.cc b/ash/frame/caption_buttons/frame_size_button.cc index 677dfe6a..3d4dae82 100644 --- a/ash/frame/caption_buttons/frame_size_button.cc +++ b/ash/frame/caption_buttons/frame_size_button.cc
@@ -62,7 +62,8 @@ // is enabled. Do not enable snapping if the minimize button is not visible. // The close button is always visible. if (IsTriggerableEvent(event) && !in_snap_mode_ && - delegate_->IsMinimizeButtonVisible()) { + delegate_->IsMinimizeButtonVisible() && + wm::GetWindowState(frame_->GetNativeWindow())->CanSnap()) { StartSetButtonsToSnapModeTimer(event); } FrameCaptionButton::OnMousePressed(event); @@ -100,8 +101,8 @@ SetButtonsToNormalMode(FrameSizeButtonDelegate::ANIMATE_YES); return; } - - if (event->type() == ui::ET_GESTURE_TAP_DOWN) { + if (event->type() == ui::ET_GESTURE_TAP_DOWN && + wm::GetWindowState(frame_->GetNativeWindow())->CanSnap()) { StartSetButtonsToSnapModeTimer(*event); // Go through FrameCaptionButton's handling so that the button gets pressed. FrameCaptionButton::OnGestureEvent(event);
diff --git a/ash/frame/caption_buttons/frame_size_button_unittest.cc b/ash/frame/caption_buttons/frame_size_button_unittest.cc index 37412c1..be6eb6c 100644 --- a/ash/frame/caption_buttons/frame_size_button_unittest.cc +++ b/ash/frame/caption_buttons/frame_size_button_unittest.cc
@@ -26,11 +26,11 @@ class TestWidgetDelegate : public views::WidgetDelegateView { public: - TestWidgetDelegate() = default; + explicit TestWidgetDelegate(bool resizable) : resizable_(resizable) {} ~TestWidgetDelegate() override = default; // Overridden from views::WidgetDelegate: - bool CanResize() const override { return true; } + bool CanResize() const override { return resizable_; } bool CanMaximize() const override { return true; } bool CanMinimize() const override { return true; } @@ -71,15 +71,15 @@ // Not owned. ash::FrameCaptionButtonContainerView* caption_button_container_; + bool resizable_; DISALLOW_COPY_AND_ASSIGN(TestWidgetDelegate); }; -} // namespace - class FrameSizeButtonTest : public AshTestBase { public: FrameSizeButtonTest() = default; + explicit FrameSizeButtonTest(bool resizable) : resizable_(resizable) {} ~FrameSizeButtonTest() override = default; // Returns the center point of |view| in screen coordinates. @@ -117,7 +117,7 @@ void SetUp() override { AshTestBase::SetUp(); - TestWidgetDelegate* delegate = new TestWidgetDelegate(); + TestWidgetDelegate* delegate = new TestWidgetDelegate(resizable_); window_state_ = ash::wm::GetWindowState(CreateWidget(delegate)->GetNativeWindow()); @@ -144,10 +144,13 @@ FrameCaptionButton* minimize_button_; FrameCaptionButton* size_button_; FrameCaptionButton* close_button_; + bool resizable_ = true; DISALLOW_COPY_AND_ASSIGN(FrameSizeButtonTest); }; +} // namespace + // Tests that pressing the left mouse button or tapping down on the size button // puts the button into the pressed state. TEST_F(FrameSizeButtonTest, PressedState) { @@ -457,4 +460,35 @@ EXPECT_EQ(CAPTION_BUTTON_ICON_CLOSE, close_button()->icon()); } +namespace { + +class FrameSizeButtonNonResizableTest : public FrameSizeButtonTest { + public: + FrameSizeButtonNonResizableTest() : FrameSizeButtonTest(false) {} + ~FrameSizeButtonNonResizableTest() override {} + + private: + DISALLOW_COPY_AND_ASSIGN(FrameSizeButtonNonResizableTest); +}; + +} // namespace + +TEST_F(FrameSizeButtonNonResizableTest, NoSnap) { + EXPECT_EQ(CAPTION_BUTTON_ICON_MINIMIZE, minimize_button()->icon()); + EXPECT_EQ(CAPTION_BUTTON_ICON_CLOSE, close_button()->icon()); + EXPECT_TRUE(AllButtonsInNormalState()); + + // Pressing the size button should result in the size button being pressed and + // the minimize and close button icons changing. + ui::test::EventGenerator& generator = GetEventGenerator(); + generator.MoveMouseTo(CenterPointInScreen(size_button())); + generator.PressLeftButton(); + EXPECT_EQ(views::Button::STATE_NORMAL, minimize_button()->state()); + EXPECT_EQ(views::Button::STATE_PRESSED, size_button()->state()); + EXPECT_EQ(views::Button::STATE_NORMAL, close_button()->state()); + + EXPECT_EQ(CAPTION_BUTTON_ICON_MINIMIZE, minimize_button()->icon()); + EXPECT_EQ(CAPTION_BUTTON_ICON_CLOSE, close_button()->icon()); +} + } // namespace ash
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc index 1f4f88c..8bdb35fd 100644 --- a/ash/login/login_screen_controller.cc +++ b/ash/login/login_screen_controller.cc
@@ -96,6 +96,9 @@ // Login screen can only be used during login. if (Shell::Get()->session_controller()->GetSessionState() != session_manager::SessionState::LOGIN_PRIMARY) { + LOG(ERROR) << "Not showing login screen since session state is " + << static_cast<int>( + Shell::Get()->session_controller()->GetSessionState()); std::move(on_shown).Run(false); return; }
diff --git a/ash/message_center/message_center_button_bar.cc b/ash/message_center/message_center_button_bar.cc index d16480d..1148f23 100644 --- a/ash/message_center/message_center_button_bar.cc +++ b/ash/message_center/message_center_button_bar.cc
@@ -9,6 +9,7 @@ #include "ash/public/cpp/ash_features.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/strings/grit/ash_strings.h" +#include "ash/system/tray/tray_constants.h" #include "ash/system/tray/tray_popup_utils.h" #include "base/macros.h" #include "build/build_config.h" @@ -138,14 +139,12 @@ close_all_button_ = new MessageCenterButton(this); close_all_button_->SetImage( views::Button::STATE_NORMAL, - gfx::CreateVectorIcon(kNotificationCenterClearAllIcon, - message_center_style::kActionIconSize, - message_center_style::kActiveButtonColor)); + gfx::CreateVectorIcon(kNotificationCenterClearAllIcon, kMenuIconSize, + kMenuIconColor)); close_all_button_->SetImage( views::Button::STATE_DISABLED, - gfx::CreateVectorIcon(kNotificationCenterClearAllIcon, - message_center_style::kActionIconSize, - message_center_style::kInactiveButtonColor)); + gfx::CreateVectorIcon(kNotificationCenterClearAllIcon, kMenuIconSize, + kMenuIconColorDisabled)); close_all_button_->SetTooltipText(l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_TOOLTIP)); button_container_->AddChildView(close_all_button_); @@ -156,12 +155,9 @@ quiet_mode_button_->SetImage( views::Button::STATE_NORMAL, gfx::CreateVectorIcon(kNotificationCenterDoNotDisturbOffIcon, - message_center_style::kActionIconSize, - message_center_style::kInactiveButtonColor)); - gfx::ImageSkia quiet_mode_toggle_icon = - gfx::CreateVectorIcon(kNotificationCenterDoNotDisturbOnIcon, - message_center_style::kActionIconSize, - message_center_style::kActiveButtonColor); + kMenuIconSize, kMenuIconColorDisabled)); + gfx::ImageSkia quiet_mode_toggle_icon = gfx::CreateVectorIcon( + kNotificationCenterDoNotDisturbOnIcon, kMenuIconSize, kMenuIconColor); quiet_mode_button_->SetToggledImage(views::Button::STATE_NORMAL, &quiet_mode_toggle_icon); quiet_mode_button_->SetTooltipText(l10n_util::GetStringUTF16( @@ -174,9 +170,8 @@ settings_button_ = new MessageCenterButton(this); settings_button_->SetImage( views::Button::STATE_NORMAL, - gfx::CreateVectorIcon(kNotificationCenterSettingsIcon, - message_center_style::kActionIconSize, - message_center_style::kActiveButtonColor)); + gfx::CreateVectorIcon(kNotificationCenterSettingsIcon, kMenuIconSize, + kMenuIconColor)); settings_button_->SetTooltipText(l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_SETTINGS_BUTTON_TOOLTIP)); button_container_->AddChildView(settings_button_); @@ -188,9 +183,8 @@ collapse_button_->SetPaintToLayer(); collapse_button_->SetImage( views::Button::STATE_NORMAL, - gfx::CreateVectorIcon(kNotificationCenterCollapseIcon, - message_center_style::kActionIconSize, - message_center_style::kActiveButtonColor)); + gfx::CreateVectorIcon(kNotificationCenterCollapseIcon, kMenuIconSize, + kMenuIconColor)); collapse_button_->SetTooltipText(l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_COLLAPSE_BUTTON_TOOLTIP)); AddChildView(collapse_button_);
diff --git a/ash/message_center/message_center_style.h b/ash/message_center/message_center_style.h index d82d510..63e03885 100644 --- a/ash/message_center/message_center_style.h +++ b/ash/message_center/message_center_style.h
@@ -13,13 +13,10 @@ namespace message_center_style { -constexpr SkColor kBackgroundColor = SkColorSetRGB(0xFF, 0xFF, 0xFF); +constexpr SkColor kBackgroundColor = SK_ColorWHITE; constexpr SkColor kEmptyViewColor = SkColorSetARGB(0x8A, 0x0, 0x0, 0x0); constexpr SkColor kScrollShadowColor = SkColorSetARGB(0x24, 0x0, 0x0, 0x0); -constexpr SkColor kActiveButtonColor = SkColorSetARGB(0xFF, 0x5A, 0x5A, 0x5A); -constexpr SkColor kInactiveButtonColor = SkColorSetARGB(0x8A, 0x5A, 0x5A, 0x5A); -constexpr int kActionIconSize = 20; constexpr int kEmptyIconSize = 24; constexpr gfx::Insets kActionIconPadding(14); constexpr gfx::Insets kEmptyIconPadding(0, 0, 4, 0);
diff --git a/ash/message_center/notifier_settings_view.cc b/ash/message_center/notifier_settings_view.cc index 3ca13eb..e8837097 100644 --- a/ash/message_center/notifier_settings_view.cc +++ b/ash/message_center/notifier_settings_view.cc
@@ -16,6 +16,7 @@ #include "ash/resources/vector_icons/vector_icons.h" #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" +#include "ash/system/tray/tray_constants.h" #include "base/macros.h" #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" @@ -490,15 +491,12 @@ void NotifierSettingsView::SetQuietModeState(bool is_quiet_mode) { quiet_mode_toggle_->SetIsOn(is_quiet_mode, false /* animate */); if (is_quiet_mode) { - quiet_mode_icon_->SetImage( - gfx::CreateVectorIcon(kNotificationCenterDoNotDisturbOnIcon, - message_center_style::kActionIconSize, - message_center_style::kActiveButtonColor)); + quiet_mode_icon_->SetImage(gfx::CreateVectorIcon( + kNotificationCenterDoNotDisturbOnIcon, kMenuIconSize, kMenuIconColor)); } else { quiet_mode_icon_->SetImage( gfx::CreateVectorIcon(kNotificationCenterDoNotDisturbOffIcon, - message_center_style::kActionIconSize, - message_center_style::kInactiveButtonColor)); + kMenuIconSize, kMenuIconColorDisabled)); } }
diff --git a/ash/public/cpp/ash_switches.cc b/ash/public/cpp/ash_switches.cc index eff323e..ad454868d 100644 --- a/ash/public/cpp/ash_switches.cc +++ b/ash/public/cpp/ash_switches.cc
@@ -122,14 +122,16 @@ // option "Show taps". const char kShowTaps[] = "show-taps"; -// If true, the views login screen will be shown. This will become the default -// in the future. +// Forces the views login implementation. const char kShowViewsLogin[] = "show-views-login"; // If true, the webui lock screen wil be shown. This is deprecated and will be // removed in the future. const char kShowWebUiLock[] = "show-webui-lock"; +// Forces the webui login implementation. +const char kShowWebUiLogin[] = "show-webui-login"; + // Chromebases' touchscreens can be used to wake from suspend, unlike the // touchscreens on other Chrome OS devices. If set, the touchscreen is kept // enabled while the screen is off so that it can be used to turn the screen @@ -156,7 +158,10 @@ } bool IsUsingViewsLogin() { - return base::CommandLine::ForCurrentProcess()->HasSwitch(kShowViewsLogin); + // Only show views login if it is forced. If both switches are present use + // webui. + base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); + return !cl->HasSwitch(kShowWebUiLogin) && cl->HasSwitch(kShowViewsLogin); } bool IsUsingViewsLock() {
diff --git a/ash/public/cpp/ash_switches.h b/ash/public/cpp/ash_switches.h index 8fc8eec..69acf6d 100644 --- a/ash/public/cpp/ash_switches.h +++ b/ash/public/cpp/ash_switches.h
@@ -57,6 +57,7 @@ ASH_PUBLIC_EXPORT extern const char kShowTaps[]; ASH_PUBLIC_EXPORT extern const char kShowViewsLogin[]; ASH_PUBLIC_EXPORT extern const char kShowWebUiLock[]; +ASH_PUBLIC_EXPORT extern const char kShowWebUiLogin[]; ASH_PUBLIC_EXPORT extern const char kSuppressMessageCenterPopups[]; ASH_PUBLIC_EXPORT extern const char kTouchscreenUsableWhileScreenOff[]; ASH_PUBLIC_EXPORT extern const char kUseIMEService[];
diff --git a/ash/shelf/login_shelf_view.cc b/ash/shelf/login_shelf_view.cc index 41b0964..b017165 100644 --- a/ash/shelf/login_shelf_view.cc +++ b/ash/shelf/login_shelf_view.cc
@@ -156,6 +156,8 @@ add_button(kBrowseAsGuest, IDS_ASH_BROWSE_AS_GUEST_BUTTON, kShelfBrowseAsGuestButtonIcon); add_button(kAddUser, IDS_ASH_ADD_USER_BUTTON, kShelfAddPersonButtonIcon); + add_button(kShowWebUiLogin, IDS_ASH_SHOW_WEBUI_LOGIN_BUTTON, + kShelfSignOutButtonIcon); // Adds observers for states that affect the visiblity of different buttons. tray_action_observer_.Add(Shell::Get()->tray_action()); @@ -215,6 +217,9 @@ void LoginShelfView::ButtonPressed(views::Button* sender, const ui::Event& event) { + // Intentional crash. session_manager will add --show-webui-login. + CHECK(sender->id() != kShowWebUiLogin); + UserMetricsRecorder::RecordUserClickOnShelfButton( GetUserClickTarget(sender->id())); switch (sender->id()) {
diff --git a/ash/shelf/login_shelf_view.h b/ash/shelf/login_shelf_view.h index 7a968b6..ce23f113 100644 --- a/ash/shelf/login_shelf_view.h +++ b/ash/shelf/login_shelf_view.h
@@ -43,6 +43,7 @@ kCancel, // Cancel multiple user sign-in. kBrowseAsGuest, // Use in guest mode. kAddUser, // Add a new user. + kShowWebUiLogin // Show webui login. }; explicit LoginShelfView(
diff --git a/ash/shelf/shelf_widget_unittest.cc b/ash/shelf/shelf_widget_unittest.cc index 436763cf..37dde22 100644 --- a/ash/shelf/shelf_widget_unittest.cc +++ b/ash/shelf/shelf_widget_unittest.cc
@@ -459,7 +459,9 @@ }; TEST_F(ShelfWidgetViewsVisibilityTest, LoginWebUiLockViews) { - // Web UI login enabled by default. Views lock enabled by default. + // Enable web UI login. + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kShowWebUiLogin); ASSERT_NO_FATAL_FAILURE(InitShelfVariables()); // Both shelf views are hidden when session state hasn't been initialized. @@ -499,9 +501,10 @@ } TEST_F(ShelfWidgetViewsVisibilityTest, LoginWebUiLockWebUi) { - // Enable web UI lock. Web UI login enabled by default. - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kShowWebUiLock); + // Enable web UI lock and login. + base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); + cl->AppendSwitch(switches::kShowWebUiLogin); + cl->AppendSwitch(switches::kShowWebUiLock); ASSERT_NO_FATAL_FAILURE(InitShelfVariables()); // Views based shelf is never visible.
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 9f7dc643..29463802 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -25,7 +25,7 @@ <translation id="1525508553941733066">খারিজ করুন</translation> <translation id="15373452373711364">বড় মাউস কার্সার</translation> <translation id="1550523713251050646">আরও বিকল্পের জন্য ক্লিক করুন</translation> -<translation id="1567387640189251553">আপনি যখন শেষবার পাসওয়ার্ডটি লিখেছিলেন তার পরে অন্য একটি কীবোর্ডে কানেক্ট করা হয়েছিল। পাসওয়ার্ড চুরি করার চেষ্টা করতে পারে।</translation> +<translation id="1567387640189251553">আপনি যখন শেষবার পাসওয়ার্ডটি লিখেছিলেন তার পরে অন্য একটি কীবোর্ডে কানেক্ট করা হয়েছিল। এটি আপনার পাসওয়ার্ড চুরি করার চেষ্টা করতে পারে।</translation> <translation id="1608626060424371292">এই ব্যবহারকারীকে সরান</translation> <translation id="1621499497873603021">ব্যাটারি শেষ হতে <ph name="TIME_LEFT" /> সময় বাকি আছে</translation> <translation id="1658406695958299976">দুঃখিত, আপনার পাসওয়ার্ড এখনও পর্যন্ত যাচাই করা যায়নি। দ্রষ্টব্য: আপনি যদি সম্প্রতি আপনার পাসওয়ার্ড পরিবর্তন করে থাকেন, তাহলে আপনি সাইন-আউট করার পর আপনার নতুন পাসওয়ার্ড প্রয়োগ করা হবে, অনুগ্রহ করে এখানে পুরানো পাসওয়ার্ড ব্যবহার করুন।</translation> @@ -54,7 +54,7 @@ <translation id="2122028596993374965"><ph name="TAB_NAME" /> কে <ph name="RECEIVER_NAME" /> এ কাস্ট করা বন্ধ করুন</translation> <translation id="2127372758936585790">নিম্ন শক্তির চার্জার</translation> <translation id="2144487987174258011">Adobe ফ্ল্যাশ প্লেয়ার আপডেট করার জন্য বন্ধ করে আবার চালু করুন</translation> -<translation id="2191905770366256395">আলাদা করা যায় এমন কীবোর্ডের একটি জরুরী আপডেট প্রয়োজন</translation> +<translation id="2191905770366256395">আলাদা করা যায় এমন কীবোর্ডের একটি জরুরি আপডেট প্রয়োজন</translation> <translation id="2208323208084708176">একীভূত ডেস্কটপ মোড</translation> <translation id="2220572644011485463">PIN বা পাসওয়ার্ড</translation> <translation id="225680501294068881">ডিভাইসগুলির জন্য স্ক্যান করা হচ্ছে...</translation> @@ -326,7 +326,7 @@ <translation id="8652175077544655965">সেটিংস বন্ধ করুন</translation> <translation id="8673028979667498656">২৭০°</translation> <translation id="8676770494376880701">নিম্ন শক্তির চার্জার সংযুক্ত করা হয়েছে</translation> -<translation id="8734991477317290293">পাসওয়ার্ড চুরি করার চেষ্টা করতে পারে</translation> +<translation id="8734991477317290293">এটি আপনার পাসওয়ার্ড চুরি করার চেষ্টা করতে পারে</translation> <translation id="8814190375133053267">ওয়াই-ফাই</translation> <translation id="8814715559352963456">অন্য ডেস্কটপে উইন্ডোগুলি সরানো হলে অপ্রত্যাশিত আচরণ সৃষ্টি হতে পারে।
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 534d4226..ddfe6f7e 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -23,6 +23,7 @@ <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1510238584712386396">Launcher</translation> <translation id="1525508553941733066">DISMISS</translation> +<translation id="1537254971476575106">Full-screen magnifier</translation> <translation id="15373452373711364">Large mouse cursor</translation> <translation id="1550523713251050646">Click for more options</translation> <translation id="1567387640189251553">A different keyboard has been connected since you last entered your password. It may be attempting to steal your keystrokes.</translation> @@ -51,8 +52,10 @@ <translation id="2049639323467105390">This device is managed by <ph name="DOMAIN" />.</translation> <translation id="2050339315714019657">Portrait</translation> <translation id="2067602449040652523">Keyboard brightness</translation> +<translation id="2081529251031312395">$1 can still sign in later.</translation> <translation id="2122028596993374965">Stop casting <ph name="TAB_NAME" /> to <ph name="RECEIVER_NAME" /></translation> <translation id="2127372758936585790">Low-power charger</translation> +<translation id="2135456203358955318">Docked magnifier</translation> <translation id="2144487987174258011">Restart to update Adobe Flash Player</translation> <translation id="2191905770366256395">Your detachable keybaord needs a critical update</translation> <translation id="2208323208084708176">Unified desktop mode</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index ec2fde3..0913266 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -25,7 +25,7 @@ <translation id="1525508553941733066">डिसमिस करा</translation> <translation id="15373452373711364">मोठा माउस कर्सर</translation> <translation id="1550523713251050646">अधिक पर्यायांसाठी क्लिक करा</translation> -<translation id="1567387640189251553">तुम्ही शेवटचा पासवर्ड टाकल्या नंतर वेगर्ड कीबोर्ड कनेक्ट करण्यात आला आहे. तो कदाचित तुमचे कीस्ट्रोक चोरण्याचा प्रयत्न करत असेल.</translation> +<translation id="1567387640189251553">तुम्ही शेवटचा पासवर्ड टाकल्या नंतर वेगळा कीबोर्ड कनेक्ट करण्यात आला आहे. तो कदाचित तुमचे कीस्ट्रोक चोरण्याचा प्रयत्न करत असेल.</translation> <translation id="1608626060424371292">हा वापरकर्ता काढा</translation> <translation id="1621499497873603021">बॅटरी रिक्त होईपर्यंत शिल्लक वेळ, <ph name="TIME_LEFT" /></translation> <translation id="1658406695958299976">सॉरी, तुमच्या पासवर्डची पडताळणी अजूनही झालेली नाही. टीप: तुम्ही तुमचा पासवर्ड अलीकडेच बदलला असल्यास, तुम्ही साइन आउट केल्यानंतर तुमचा नवीन पासवर्ड लागू केला जाईल, कृपया येथे जुना पासवर्ड वापरा.</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 10d47fff..74ff0364 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -25,7 +25,7 @@ <translation id="1525508553941733066">AVVIS</translation> <translation id="15373452373711364">Stor markør</translation> <translation id="1550523713251050646">Klikk for å se flere alternativer</translation> -<translation id="1567387640189251553">Et annet tastatur er koblet til etter at du sist skrev inn passordet ditt. Det prøver kanskje å stjele tastetrykkene dine.</translation> +<translation id="1567387640189251553">Et annet tastatur er koblet til etter at du sist skrev inn passordet ditt. Det brukes kanskje til å stjele tastetrykkene dine.</translation> <translation id="1608626060424371292">Fjern denne brukeren</translation> <translation id="1621499497873603021">Gjenværende tid til batteriet er tomt – <ph name="TIME_LEFT" /></translation> <translation id="1658406695958299976">Beklager, men passordet ditt kunne fremdeles ikke bekreftes. Merk: Hvis du endret passordet ditt nylig, trer det nye passordet ditt i kraft så snart du logger av. Bruk det gamle passordet ditt her.</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index d571423..e70948f 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -25,7 +25,7 @@ <translation id="1525508553941733066">LOẠI BỎ</translation> <translation id="15373452373711364">Con trỏ chuột lớn</translation> <translation id="1550523713251050646">Nhấp để xem các tùy chọn khác</translation> -<translation id="1567387640189251553">Bạn đã kết nối bàn phím khác kể từ lần nhập mật khẩu gần đây nhất. Tổ hợp phím bạn đã dùng có thể không còn.</translation> +<translation id="1567387640189251553">Một bàn phím khác đã được kết nối kể từ lần gần đây nhất bạn nhập mật khẩu của mình. Bàn phím này có thể đang cố gắng đánh cắp thao tác nhấn phím của bạn.</translation> <translation id="1608626060424371292">Xóa người dùng này</translation> <translation id="1621499497873603021">Thời gian còn lại cho đến khi pin hết, <ph name="TIME_LEFT" /></translation> <translation id="1658406695958299976">Rất tiếc, chúng tôi vẫn không thể xác minh được mật khẩu của bạn. Lưu ý: nếu gần đây bạn đã đổi mật khẩu thì mật khẩu mới của bạn sẽ được áp dụng sau khi bạn đăng xuất. Vui lòng sử dụng mật khẩu cũ của bạn tại đây.</translation> @@ -326,7 +326,7 @@ <translation id="8652175077544655965">Đóng cài đặt</translation> <translation id="8673028979667498656">270°</translation> <translation id="8676770494376880701">Đã kết nối bộ sạc công suất thấp</translation> -<translation id="8734991477317290293">Tổ hợp phím bạn đã dùng có thể không còn</translation> +<translation id="8734991477317290293">Bàn phím này có thể đang cố gắng đánh cắp thao tác nhấn phím của bạn</translation> <translation id="8814190375133053267">Wi-Fi</translation> <translation id="8814715559352963456">Di chuyển cửa sổ sang màn hình khác có thể gây ra hoạt động không mong muốn.
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc index 8b51be8..ba13215 100644 --- a/ash/wm/splitview/split_view_controller.cc +++ b/ash/wm/splitview/split_view_controller.cc
@@ -131,6 +131,13 @@ return minimum_width; }; +// Returns true if |window| is currently snapped. +bool IsSnapped(aura::Window* window) { + if (!window) + return false; + return wm::GetWindowState(window)->IsSnapped(); +} + } // namespace SplitViewController::SplitViewController() { @@ -215,7 +222,6 @@ splitview_start_time_ = base::Time::Now(); } - State previous_state = state_; if (snap_position == LEFT) { if (left_window_ != window) { StopObserving(left_window_); @@ -229,38 +235,32 @@ } left_window_ = (window == left_window_) ? nullptr : left_window_; } - - if (left_window_ && right_window_) - state_ = BOTH_SNAPPED; - else if (left_window_) - state_ = LEFT_SNAPPED; - else if (right_window_) - state_ = RIGHT_SNAPPED; + StartObserving(window); // Update the divider position and window bounds before snapping a new window. // Since the minimum size of |window| maybe larger than currently bounds in // |snap_position|. - MoveDividerToClosestFixedPosition(); - UpdateSnappedWindowsAndDividerBounds(); - - StartObserving(window); + if (state_ != NO_SNAP) { + MoveDividerToClosestFixedPosition(); + UpdateSnappedWindowsAndDividerBounds(); + } if (wm::GetWindowState(window)->GetStateType() == GetStateTypeFromSnapPostion(snap_position)) { // If the window has already been snapped, just activate it. Restore its - // transform if applicable. + // transform if applicable. Also update the split view state and notify the + // observers about the change. + UpdateSplitViewStateAndNotifyObservers(); RestoreAndActivateSnappedWindow(window); } else { - // Otherwise, try to snap it. It will be activated later after the window is - // snapped. + // Otherwise, try to snap it first. It will be activated later after the + // window is snapped. The split view state will also be updated after the + // window is snapped. const wm::WMEvent event((snap_position == LEFT) ? wm::WM_EVENT_SNAP_LEFT : wm::WM_EVENT_SNAP_RIGHT); wm::GetWindowState(window)->OnWMEvent(&event); } - if (previous_state == NO_SNAP && previous_state != state_) - Shell::Get()->NotifySplitViewModeStarted(); - NotifySplitViewStateChanged(previous_state, state_); base::RecordAction(base::UserMetricsAction("SplitView_SnapWindow")); } @@ -475,11 +475,7 @@ default_snap_position_ = NONE; divider_position_ = -1; - State previous_state = state_; - state_ = NO_SNAP; - NotifySplitViewStateChanged(previous_state, state_); - - Shell::Get()->NotifySplitViewModeEnded(); + UpdateSplitViewStateAndNotifyObservers(); base::RecordAction(base::UserMetricsAction("SplitView_EndSplitView")); UMA_HISTOGRAM_LONG_TIMES("Ash.SplitView.TimeInSplitView", base::Time::Now() - splitview_start_time_); @@ -510,9 +506,8 @@ void SplitViewController::OnPostWindowStateTypeChange( ash::wm::WindowState* window_state, ash::mojom::WindowStateType old_type) { - DCHECK(IsSplitViewModeActive()); - if (window_state->IsSnapped()) { + UpdateSplitViewStateAndNotifyObservers(); RestoreAndActivateSnappedWindow(window_state->window()); } else if (window_state->IsFullscreen() || window_state->IsMaximized()) { // End split view mode if one of the snapped windows gets maximized / @@ -696,6 +691,29 @@ } } +void SplitViewController::UpdateSplitViewStateAndNotifyObservers() { + State previous_state = state_; + if (IsSnapped(left_window_) && IsSnapped(right_window_)) + state_ = BOTH_SNAPPED; + else if (IsSnapped(left_window_)) + state_ = LEFT_SNAPPED; + else if (IsSnapped(right_window_)) + state_ = RIGHT_SNAPPED; + else + state_ = NO_SNAP; + + // We still notify observers even if |state_| doesn't change as it's possible + // to snap a window to a position that already has a snapped window. + NotifySplitViewStateChanged(previous_state, state_); + + if (previous_state == state_) + return; + if (previous_state == NO_SNAP) + Shell::Get()->NotifySplitViewModeStarted(); + else if (state_ == NO_SNAP) + Shell::Get()->NotifySplitViewModeEnded(); +} + void SplitViewController::NotifySplitViewStateChanged(State previous_state, State state) { // It's possible that |previous_state| equals to |state| (e.g., snap a window @@ -703,10 +721,9 @@ // should notify its observers. for (Observer& observer : observers_) observer.OnSplitViewStateChanged(previous_state, state); - mojo_observers_.ForAllPtrs( - [previous_state, state](mojom::SplitViewObserver* observer) { - observer->OnSplitViewStateChanged(ToMojomSplitViewState(state)); - }); + mojo_observers_.ForAllPtrs([state](mojom::SplitViewObserver* observer) { + observer->OnSplitViewStateChanged(ToMojomSplitViewState(state)); + }); } void SplitViewController::NotifyDividerPositionChanged() { @@ -772,11 +789,11 @@ DCHECK(IsSplitViewModeActive()); // Update the snapped windows' bounds. - if (left_window_ && wm::GetWindowState(left_window_)->IsSnapped()) { + if (IsSnapped(left_window_)) { const wm::WMEvent left_window_event(wm::WM_EVENT_SNAP_LEFT); wm::GetWindowState(left_window_)->OnWMEvent(&left_window_event); } - if (right_window_ && wm::GetWindowState(right_window_)->IsSnapped()) { + if (IsSnapped(right_window_)) { const wm::WMEvent right_window_event(wm::WM_EVENT_SNAP_RIGHT); wm::GetWindowState(right_window_)->OnWMEvent(&right_window_event); }
diff --git a/ash/wm/splitview/split_view_controller.h b/ash/wm/splitview/split_view_controller.h index 0fbdde1..2ccd636e 100644 --- a/ash/wm/splitview/split_view_controller.h +++ b/ash/wm/splitview/split_view_controller.h
@@ -177,6 +177,9 @@ void StartObserving(aura::Window* window); void StopObserving(aura::Window* window); + // Update split view state and notify its observer about the change. + void UpdateSplitViewStateAndNotifyObservers(); + // Notifies observers that the split view state has been changed. void NotifySplitViewStateChanged(State previous_state, State state);
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc index c1ffb89..77e0ab1 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -904,6 +904,33 @@ EXPECT_TRUE(window_state->IsMinimized()); } +// Tests that pre-minimized window show state is persistent after entering and +// leaving tablet mode, that is not cleared in tablet mode. +TEST_F(TabletModeWindowManagerTest, PersistPreMinimizedShowState) { + gfx::Rect rect(10, 10, 100, 100); + std::unique_ptr<aura::Window> window( + CreateWindow(aura::client::WINDOW_TYPE_NORMAL, rect)); + wm::WindowState* window_state = wm::GetWindowState(window.get()); + window_state->Maximize(); + window_state->Minimize(); + EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, + window->GetProperty(aura::client::kPreMinimizedShowStateKey)); + + Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager(true); + window_state->Unminimize(); + // Check that pre-minimized window show state is not cleared due to + // unminimizing in tablet mode. + EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, + window->GetProperty(aura::client::kPreMinimizedShowStateKey)); + window_state->Minimize(); + EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, + window->GetProperty(aura::client::kPreMinimizedShowStateKey)); + + Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager(false); + window_state->Unminimize(); + EXPECT_TRUE(window_state->IsMaximized()); +} + // Check that a full screen window remains full screen upon entering maximize // mode. Furthermore, checks that this window is not full screen upon exiting // tablet mode if it was un-full-screened while in tablet mode.
diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc index 62e62cc..2f1f889 100644 --- a/ash/wm/window_state.cc +++ b/ash/wm/window_state.cc
@@ -14,6 +14,7 @@ #include "ash/screen_util.h" #include "ash/shell.h" #include "ash/wm/default_state.h" +#include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "ash/wm/window_animations.h" #include "ash/wm/window_positioning_utils.h" #include "ash/wm/window_properties.h" @@ -39,6 +40,12 @@ namespace wm { namespace { +bool IsTabletModeEnabled() { + return Shell::Get() + ->tablet_mode_controller() + ->IsTabletModeWindowManagerEnabled(); +} + // A tentative class to set the bounds on the window. // TODO(oshima): Once all logic is cleaned up, move this to the real layout // manager with proper friendship. @@ -533,6 +540,12 @@ void WindowState::UpdateWindowPropertiesFromStateType() { ui::WindowShowState new_window_state = ToWindowShowState(current_state_->GetType()); + // Clear |kPreMinimizedShowStateKey| property only when the window is actually + // Unminimized and not in tablet mode. + if (new_window_state != ui::SHOW_STATE_MINIMIZED && IsMinimized() && + !IsTabletModeEnabled()) { + window()->ClearProperty(aura::client::kPreMinimizedShowStateKey); + } if (new_window_state != GetShowState()) { base::AutoReset<bool> resetter(&ignore_property_change_, true); window_->SetProperty(aura::client::kShowStateKey, new_window_state);
diff --git a/base/threading/platform_thread_android.cc b/base/threading/platform_thread_android.cc index d4c9a048..fd90d35 100644 --- a/base/threading/platform_thread_android.cc +++ b/base/threading/platform_thread_android.cc
@@ -60,7 +60,7 @@ } // namespace internal void PlatformThread::SetName(const std::string& name) { - ThreadIdNameManager::GetInstance()->SetName(CurrentId(), name); + ThreadIdNameManager::GetInstance()->SetName(name); // Like linux, on android we can get the thread names to show up in the // debugger by setting the process name for the LWP.
diff --git a/base/threading/platform_thread_fuchsia.cc b/base/threading/platform_thread_fuchsia.cc index 1939f82..eb06795c 100644 --- a/base/threading/platform_thread_fuchsia.cc +++ b/base/threading/platform_thread_fuchsia.cc
@@ -27,8 +27,7 @@ name.data(), name.size()); DCHECK_EQ(status, ZX_OK); - ThreadIdNameManager::GetInstance()->SetName(PlatformThread::CurrentId(), - name); + ThreadIdNameManager::GetInstance()->SetName(name); } // static
diff --git a/base/threading/platform_thread_linux.cc b/base/threading/platform_thread_linux.cc index 9917a7b..190aced 100644 --- a/base/threading/platform_thread_linux.cc +++ b/base/threading/platform_thread_linux.cc
@@ -126,7 +126,7 @@ // static void PlatformThread::SetName(const std::string& name) { - ThreadIdNameManager::GetInstance()->SetName(CurrentId(), name); + ThreadIdNameManager::GetInstance()->SetName(name); #if !defined(OS_NACL) && !defined(OS_AIX) // On linux we can get the thread names to show up in the debugger by setting
diff --git a/base/threading/platform_thread_mac.mm b/base/threading/platform_thread_mac.mm index ea18061..39d979d 100644 --- a/base/threading/platform_thread_mac.mm +++ b/base/threading/platform_thread_mac.mm
@@ -49,7 +49,7 @@ // static void PlatformThread::SetName(const std::string& name) { - ThreadIdNameManager::GetInstance()->SetName(CurrentId(), name); + ThreadIdNameManager::GetInstance()->SetName(name); // Mac OS X does not expose the length limit of the name, so // hardcode it.
diff --git a/base/threading/platform_thread_win.cc b/base/threading/platform_thread_win.cc index c53d24e..2c7fe5e 100644 --- a/base/threading/platform_thread_win.cc +++ b/base/threading/platform_thread_win.cc
@@ -175,7 +175,7 @@ // static void PlatformThread::SetName(const std::string& name) { - ThreadIdNameManager::GetInstance()->SetName(CurrentId(), name); + ThreadIdNameManager::GetInstance()->SetName(name); // The SetThreadDescription API works even if no debugger is attached. auto set_thread_description_func =
diff --git a/base/threading/thread_id_name_manager.cc b/base/threading/thread_id_name_manager.cc index ebcc3ce..ca1979d 100644 --- a/base/threading/thread_id_name_manager.cc +++ b/base/threading/thread_id_name_manager.cc
@@ -9,7 +9,9 @@ #include "base/logging.h" #include "base/memory/singleton.h" +#include "base/no_destructor.h" #include "base/strings/string_util.h" +#include "base/threading/thread_local.h" #include "base/trace_event/heap_profiler_allocation_context_tracker.h" namespace base { @@ -18,6 +20,10 @@ static const char kDefaultName[] = ""; static std::string* g_default_name; +ThreadLocalStorage::Slot& GetThreadNameTLS() { + static base::NoDestructor<base::ThreadLocalStorage::Slot> thread_name_tls; + return *thread_name_tls; +} } ThreadIdNameManager::ThreadIdNameManager() @@ -52,8 +58,8 @@ set_name_callback_ = std::move(callback); } -void ThreadIdNameManager::SetName(PlatformThreadId id, - const std::string& name) { +void ThreadIdNameManager::SetName(const std::string& name) { + PlatformThreadId id = PlatformThread::CurrentId(); std::string* leaked_str = nullptr; { AutoLock locked(lock_); @@ -68,6 +74,7 @@ ThreadIdToHandleMap::iterator id_to_handle_iter = thread_id_to_handle_.find(id); + GetThreadNameTLS().Set(const_cast<char*>(leaked_str->c_str())); if (set_name_callback_) { set_name_callback_.Run(leaked_str->c_str()); } @@ -107,6 +114,11 @@ return handle_to_name_iter->second->c_str(); } +const char* ThreadIdNameManager::GetNameForCurrentThread() { + const char* name = reinterpret_cast<const char*>(GetThreadNameTLS().Get()); + return name ? name : kDefaultName; +} + void ThreadIdNameManager::RemoveName(PlatformThreadHandle::Handle handle, PlatformThreadId id) { AutoLock locked(lock_);
diff --git a/base/threading/thread_id_name_manager.h b/base/threading/thread_id_name_manager.h index d0717b09..f17dc1a4 100644 --- a/base/threading/thread_id_name_manager.h +++ b/base/threading/thread_id_name_manager.h
@@ -34,12 +34,15 @@ using SetNameCallback = base::RepeatingCallback<void(const char* name)>; void InstallSetNameCallback(SetNameCallback callback); - // Set the name for the given id. - void SetName(PlatformThreadId id, const std::string& name); + // Set the name for the current thread. + void SetName(const std::string& name); // Get the name for the given id. const char* GetName(PlatformThreadId id); + // Unlike |GetName|, this method using TLS and avoids touching |lock_|. + const char* GetNameForCurrentThread(); + // Remove the name for the given id. void RemoveName(PlatformThreadHandle::Handle handle, PlatformThreadId id);
diff --git a/build/fuchsia/update_sdk.py b/build/fuchsia/update_sdk.py index cdee484..eef823b 100755 --- a/build/fuchsia/update_sdk.py +++ b/build/fuchsia/update_sdk.py
@@ -13,7 +13,7 @@ import tarfile import tempfile -SDK_HASH = '62b7da622853d3517d79ff76607522f7092989a6' +SDK_HASH = '32a56ad54471732034ba802cbfc3c9ff277b9d1c' REPOSITORY_ROOT = os.path.abspath(os.path.join( os.path.dirname(__file__), '..', '..'))
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh index 32b61b82..fd67f1d 100755 --- a/build/install-build-deps.sh +++ b/build/install-build-deps.sh
@@ -365,6 +365,9 @@ # 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf lib32_list="linux-libc-dev:i386 libpci3:i386" +# 32-bit libraries needed for a 32-bit build +lib32_list="$lib32_list libx11-xcb1:i386" + # arm cross toolchain packages needed to build chrome on armhf EM_REPO="deb http://emdebian.org/tools/debian/ jessie main" EM_SOURCE=$(cat <<EOF @@ -569,9 +572,9 @@ fi if test "$do_inst_lib32" = "1" ; then - echo "Including 32-bit libraries for ARM/Android." + echo "Including 32-bit libraries." else - echo "Skipping 32-bit libraries for ARM/Android." + echo "Skipping 32-bit libraries." lib32_list= fi
diff --git a/build/toolchain/clang_static_analyzer_wrapper.py b/build/toolchain/clang_static_analyzer_wrapper.py index 0ae62dab..1c54d72 100755 --- a/build/toolchain/clang_static_analyzer_wrapper.py +++ b/build/toolchain/clang_static_analyzer_wrapper.py
@@ -61,11 +61,6 @@ returncode, stderr = wrapper_utils.CaptureCommandStderr( wrapper_utils.CommandToRun(cmd)) sys.stderr.write(stderr) - if returncode != 0: - sys.stderr.write( - """WARNING! The Clang static analyzer exited with error code %d. - Please share the error details in crbug.com/695243 if this looks like - a new regression.\n""" % (returncode)) returncode, stderr = wrapper_utils.CaptureCommandStderr( wrapper_utils.CommandToRun(parsed_args.args))
diff --git a/cc/base/math_util.cc b/cc/base/math_util.cc index ede2ef1..7ac7fb42 100644 --- a/cc/base/math_util.cc +++ b/cc/base/math_util.cc
@@ -270,6 +270,22 @@ return ComputeEnclosingClippedRect(h1, h2, h3, h4); } +gfx::QuadF MathUtil::InverseMapQuadToLocalSpace( + const gfx::Transform& device_transform, + const gfx::QuadF& device_quad) { + gfx::Transform inverse_device_transform(gfx::Transform::kSkipInitialization); + DCHECK(device_transform.IsInvertible()); + bool did_invert = device_transform.GetInverse(&inverse_device_transform); + DCHECK(did_invert); + bool clipped = false; + gfx::QuadF local_quad = + MathUtil::MapQuad(inverse_device_transform, device_quad, &clipped); + // We should not DCHECK(!clipped) here, because anti-aliasing inflation may + // cause device_quad to become clipped. To our knowledge this scenario does + // not need to be handled differently than the unclipped case. + return local_quad; +} + gfx::Rect MathUtil::MapEnclosedRectWith2dAxisAlignedTransform( const gfx::Transform& transform, const gfx::Rect& rect) {
diff --git a/cc/base/math_util.h b/cc/base/math_util.h index 240f164..fd9855f 100644 --- a/cc/base/math_util.h +++ b/cc/base/math_util.h
@@ -159,6 +159,13 @@ static gfx::RectF ProjectClippedRect(const gfx::Transform& transform, const gfx::RectF& rect); + // Map device space quad to local space. Device_transform has no 3d + // component since it was flattened, so we don't need to project. We should + // have already checked that the transform was invertible before this call. + static gfx::QuadF InverseMapQuadToLocalSpace( + const gfx::Transform& device_transform, + const gfx::QuadF& device_quad); + // This function is only valid when the transform preserves 2d axis // alignment and the resulting rect will not be clipped. static gfx::Rect MapEnclosedRectWith2dAxisAlignedTransform(
diff --git a/cc/blink/test/cc_blink_test_suite.cc b/cc/blink/test/cc_blink_test_suite.cc index 84119a3..0e0850f 100644 --- a/cc/blink/test/cc_blink_test_suite.cc +++ b/cc/blink/test/cc_blink_test_suite.cc
@@ -19,9 +19,7 @@ message_loop_.reset(new base::MessageLoop); - base::ThreadIdNameManager::GetInstance()->SetName( - base::PlatformThread::CurrentId(), - "Main"); + base::ThreadIdNameManager::GetInstance()->SetName("Main"); } void CCBlinkTestSuite::Shutdown() {
diff --git a/cc/input/scroll_snap_data.cc b/cc/input/scroll_snap_data.cc index c919cdb..8c1948d 100644 --- a/cc/input/scroll_snap_data.cc +++ b/cc/input/scroll_snap_data.cc
@@ -46,12 +46,14 @@ const gfx::ScrollOffset& current_position, const gfx::ScrollOffset& target_position, const gfx::RectF& target_region, + const gfx::ScrollOffset& proximity_range, const SnapAreaList& list) { if (list.empty()) return base::nullopt; base::Optional<SnapAreaData> closest_area; - float smallest_distance = std::numeric_limits<float>::max(); + float smallest_distance = + search_axis == SearchAxis::kX ? proximity_range.x() : proximity_range.y(); for (const SnapAreaData& area : list) { if (!SnappableOnAxis(area, search_axis)) continue; @@ -78,19 +80,27 @@ } // namespace -SnapContainerData::SnapContainerData() = default; +SnapContainerData::SnapContainerData() + : proximity_range_(gfx::ScrollOffset(std::numeric_limits<float>::max(), + std::numeric_limits<float>::max())) {} SnapContainerData::SnapContainerData(ScrollSnapType type) - : scroll_snap_type_(type) {} + : scroll_snap_type_(type), + proximity_range_(gfx::ScrollOffset(std::numeric_limits<float>::max(), + std::numeric_limits<float>::max())) {} SnapContainerData::SnapContainerData(ScrollSnapType type, gfx::ScrollOffset max) - : scroll_snap_type_(type), max_position_(max) {} + : scroll_snap_type_(type), + max_position_(max), + proximity_range_(gfx::ScrollOffset(std::numeric_limits<float>::max(), + std::numeric_limits<float>::max())) {} SnapContainerData::SnapContainerData(const SnapContainerData& other) = default; SnapContainerData::SnapContainerData(SnapContainerData&& other) : scroll_snap_type_(other.scroll_snap_type_), max_position_(other.max_position_), + proximity_range_(other.proximity_range_), snap_area_list_(std::move(other.snap_area_list_)) {} SnapContainerData::~SnapContainerData() = default; @@ -101,6 +111,7 @@ SnapContainerData& SnapContainerData::operator=(SnapContainerData&& other) { scroll_snap_type_ = other.scroll_snap_type_; max_position_ = other.max_position_; + proximity_range_ = other.proximity_range_; snap_area_list_ = std::move(other.snap_area_list_); return *this; } @@ -125,14 +136,14 @@ // A region that includes every reachable scroll position. gfx::RectF scrollable_region(0, 0, max_position_.x(), max_position_.y()); if (should_snap_on_x) { - closest_x = - FindClosestValidArea(SearchAxis::kX, current_position, current_position, - scrollable_region, snap_area_list_); + closest_x = FindClosestValidArea(SearchAxis::kX, current_position, + current_position, scrollable_region, + proximity_range_, snap_area_list_); } if (should_snap_on_y) { - closest_y = - FindClosestValidArea(SearchAxis::kY, current_position, current_position, - scrollable_region, snap_area_list_); + closest_y = FindClosestValidArea(SearchAxis::kY, current_position, + current_position, scrollable_region, + proximity_range_, snap_area_list_); } // If snapping in one axis pushes off-screen the other snap area, this snap @@ -149,13 +160,13 @@ current_position.y()); closest_y = FindClosestValidArea( SearchAxis::kY, current_position, snapped, - closest_x.value().visible_region, snap_area_list_); + closest_x.value().visible_region, proximity_range_, snap_area_list_); } else { gfx::ScrollOffset snapped(current_position.x(), closest_y.value().snap_position.y()); closest_x = FindClosestValidArea( SearchAxis::kX, current_position, snapped, - closest_y.value().visible_region, snap_area_list_); + closest_y.value().visible_region, proximity_range_, snap_area_list_); } } if (closest_x.has_value())
diff --git a/cc/input/scroll_snap_data.h b/cc/input/scroll_snap_data.h index 871ad242..7eb3580 100644 --- a/cc/input/scroll_snap_data.h +++ b/cc/input/scroll_snap_data.h
@@ -159,6 +159,7 @@ bool operator==(const SnapContainerData& other) const { return (other.scroll_snap_type_ == scroll_snap_type_) && (other.max_position_ == max_position_) && + (other.proximity_range_ == proximity_range_) && (other.snap_area_list_ == snap_area_list_); } @@ -182,6 +183,11 @@ } gfx::ScrollOffset max_position() const { return max_position_; } + void set_proximity_range(const gfx::ScrollOffset& range) { + proximity_range_ = range; + } + gfx::ScrollOffset proximity_range() const { return proximity_range_; } + private: // Specifies whether a scroll container is a scroll snap container, how // strictly it snaps, and which axes are considered. @@ -192,6 +198,10 @@ // with blink's scroll position. gfx::ScrollOffset max_position_; + // A valid snap position should be within the |proximity_range_| of the + // current offset on the snapping axis. + gfx::ScrollOffset proximity_range_; + // The SnapAreaData for the snap areas in this snap container. When a scroll // happens, we iterate through the snap_area_list to find the best snap // position.
diff --git a/cc/input/scroll_snap_data_unittest.cc b/cc/input/scroll_snap_data_unittest.cc index aff0c42..0551446 100644 --- a/cc/input/scroll_snap_data_unittest.cc +++ b/cc/input/scroll_snap_data_unittest.cc
@@ -120,4 +120,24 @@ EXPECT_EQ(60, snap_position.y()); } +TEST_F(ScrollSnapDataTest, DoesNotSnapToPositionsOutsideProximityRange) { + SnapContainerData data( + ScrollSnapType(false, SnapAxis::kBoth, SnapStrictness::kMandatory), + gfx::ScrollOffset(360, 380)); + data.set_proximity_range(gfx::ScrollOffset(50, 50)); + + gfx::ScrollOffset current_position(100, 100); + SnapAreaData area(SnapAxis::kBoth, gfx::ScrollOffset(80, 160), + gfx::RectF(50, 50, 200, 200), false); + data.AddSnapAreaData(area); + gfx::ScrollOffset snap_position = + data.FindSnapPosition(current_position, true, true); + + // The snap position on x, 80, is within the proximity range of [50, 150]. + // However, the snap position on y, 160, is outside the proximity range of + // [50, 150], so we should only snap on x. + EXPECT_EQ(80, snap_position.x()); + EXPECT_EQ(100, snap_position.y()); +} + } // namespace cc
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc index 50102b2..8f2a21e 100644 --- a/cc/layers/heads_up_display_layer_impl.cc +++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -278,8 +278,7 @@ LayerTreeResourceProvider::ScopedSkSurface scoped_surface( context_provider->GrContext(), backing->texture_id, backing->texture_target, pool_resource.size(), pool_resource.format(), - false /* use_distance_field_text */, false /* can_use_lcd_text */, - 0 /* msaa_sample_count */); + false /* can_use_lcd_text */, 0 /* msaa_sample_count */); SkSurface* surface = scoped_surface.surface(); if (!surface) { pool_->ReleaseResource(std::move(pool_resource));
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index 4009b462..12cdb5f 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -82,7 +82,6 @@ SkColor background_color = SK_ColorBLACK; int msaa_sample_count = 0; bool use_lcd_text = false; - bool use_distance_field_text = false; SkColorType color_type = kRGBA_8888_SkColorType; gfx::Size resource_size; gfx::Size content_size; @@ -133,8 +132,7 @@ if (options.preclear) { raster_implementation->BeginRasterCHROMIUM( raster_texture_id, options.preclear_color, options.msaa_sample_count, - options.use_lcd_text, options.use_distance_field_text, - options.color_type, color_space); + options.use_lcd_text, options.color_type, color_space); raster_implementation->EndRasterCHROMIUM(); } @@ -142,8 +140,7 @@ raster_implementation->BeginRasterCHROMIUM( raster_texture_id, options.background_color, options.msaa_sample_count, - options.use_lcd_text, options.use_distance_field_text, - options.color_type, color_space); + options.use_lcd_text, options.color_type, color_space); raster_implementation->RasterCHROMIUM( display_item_list.get(), &image_provider, options.content_size, options.full_raster_rect, options.playback_rect, options.post_translate, @@ -237,9 +234,7 @@ settings.use_lcd_text = options.use_lcd_text; settings.image_provider = &image_provider; - uint32_t flags = options.use_distance_field_text - ? SkSurfaceProps::kUseDistanceFieldFonts_Flag - : 0; + uint32_t flags = 0; SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); if (options.use_lcd_text) { surface_props =
diff --git a/cc/paint/paint_filter.h b/cc/paint/paint_filter.h index 57897f5..cab890ed 100644 --- a/cc/paint/paint_filter.h +++ b/cc/paint/paint_filter.h
@@ -24,6 +24,7 @@ namespace viz { class GLRenderer; +class SkiaRenderer; class SoftwareRenderer; } // namespace viz @@ -155,6 +156,7 @@ // raster. friend class PaintFlags; friend class viz::GLRenderer; + friend class viz::SkiaRenderer; friend class viz::SoftwareRenderer; const Type type_;
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc index e5ca5c1..ba18221 100644 --- a/cc/paint/paint_op_buffer.cc +++ b/cc/paint/paint_op_buffer.cc
@@ -1236,6 +1236,8 @@ SkCanvas* canvas, const PlaybackParams& params) { // Don't use drawPicture here, as it adds an implicit clip. + // TODO(enne): Temporary CHECK debugging for http://crbug.com/823835 + CHECK(op->record); op->record->Playback(canvas, params); }
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc index b5e8271e..1c88e9a 100644 --- a/cc/raster/gpu_raster_buffer_provider.cc +++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -48,7 +48,6 @@ const gfx::Size& max_tile_size, GLuint texture_id, const gfx::Size& texture_size, - bool use_distance_field_text, bool can_use_lcd_text, int msaa_sample_count) : context_provider_(context_provider), @@ -75,7 +74,7 @@ intermediate_size.width(), intermediate_size.height()); SkSurfaceProps surface_props = LayerTreeResourceProvider::ScopedSkSurface::ComputeSurfaceProps( - use_distance_field_text, can_use_lcd_text); + can_use_lcd_text); surface_ = SkSurface::MakeRenderTarget( context_provider->GrContext(), SkBudgeted::kNo, n32Info, msaa_sample_count, kTopLeft_GrSurfaceOrigin, &surface_props); @@ -121,7 +120,6 @@ const gfx::AxisTransform2d& transform, const RasterSource::PlaybackSettings& playback_settings, viz::RasterContextProvider* context_provider, - bool use_distance_field_text, int msaa_sample_count) { gpu::raster::RasterInterface* ri = context_provider->RasterInterface(); GLuint texture_id = ri->CreateAndConsumeTexture( @@ -139,7 +137,7 @@ // use GL_TEXTURE_2D. ri->BeginRasterCHROMIUM( texture_id, raster_source->background_color(), msaa_sample_count, - playback_settings.use_lcd_text, use_distance_field_text, + playback_settings.use_lcd_text, viz::ResourceFormatToClosestSkColorType(resource_format), playback_settings.raster_color_space); float recording_to_raster_scale = @@ -161,6 +159,27 @@ ri->DeleteTextures(1, &texture_id); } +// The following class is needed to correctly reset GL state when rendering to +// SkCanvases with a GrContext on a RasterInterface enabled context. +class ScopedGrContextAccess { + public: + explicit ScopedGrContextAccess(viz::RasterContextProvider* context_provider) + : context_provider_(context_provider) { + gpu::raster::RasterInterface* ri = context_provider_->RasterInterface(); + ri->BeginGpuRaster(); + + class GrContext* gr_context = context_provider_->GrContext(); + gr_context->resetContext(); + } + ~ScopedGrContextAccess() { + gpu::raster::RasterInterface* ri = context_provider_->RasterInterface(); + ri->EndGpuRaster(); + } + + private: + viz::RasterContextProvider* context_provider_; +}; + static void RasterizeSource( const RasterSource* raster_source, bool resource_has_previous_content, @@ -176,7 +195,6 @@ const gfx::AxisTransform2d& transform, const RasterSource::PlaybackSettings& playback_settings, viz::RasterContextProvider* context_provider, - bool use_distance_field_text, int msaa_sample_count, bool unpremultiply_and_dither, const gfx::Size& max_tile_size) { @@ -193,6 +211,7 @@ } { + ScopedGrContextAccess gr_context_access(context_provider); base::Optional<LayerTreeResourceProvider::ScopedSkSurface> scoped_surface; base::Optional<ScopedSkSurfaceForUnpremultiplyAndDither> scoped_dither_surface; @@ -200,14 +219,13 @@ if (!unpremultiply_and_dither) { scoped_surface.emplace(context_provider->GrContext(), texture_id, texture_target, resource_size, resource_format, - use_distance_field_text, playback_settings.use_lcd_text, msaa_sample_count); surface = scoped_surface->surface(); } else { scoped_dither_surface.emplace( context_provider, playback_rect, raster_full_rect, max_tile_size, - texture_id, resource_size, use_distance_field_text, - playback_settings.use_lcd_text, msaa_sample_count); + texture_id, resource_size, playback_settings.use_lcd_text, + msaa_sample_count); surface = scoped_dither_surface->surface(); } @@ -333,7 +351,6 @@ viz::ContextProvider* compositor_context_provider, viz::RasterContextProvider* worker_context_provider, LayerTreeResourceProvider* resource_provider, - bool use_distance_field_text, bool use_gpu_memory_buffer_resources, int gpu_rasterization_msaa_sample_count, viz::ResourceFormat preferred_tile_format, @@ -342,7 +359,6 @@ : compositor_context_provider_(compositor_context_provider), worker_context_provider_(worker_context_provider), resource_provider_(resource_provider), - use_distance_field_text_(use_distance_field_text), use_gpu_memory_buffer_resources_(use_gpu_memory_buffer_resources), msaa_sample_count_(gpu_rasterization_msaa_sample_count), preferred_tile_format_(preferred_tile_format), @@ -520,19 +536,19 @@ } if (enable_oop_rasterization_) { - RasterizeSourceOOP( - raster_source, resource_has_previous_content, mailbox, texture_target, - texture_is_overlay_candidate, texture_storage_allocated, resource_size, - resource_format, color_space, raster_full_rect, playback_rect, - transform, playback_settings, worker_context_provider_, - use_distance_field_text_, msaa_sample_count_); + RasterizeSourceOOP(raster_source, resource_has_previous_content, mailbox, + texture_target, texture_is_overlay_candidate, + texture_storage_allocated, resource_size, + resource_format, color_space, raster_full_rect, + playback_rect, transform, playback_settings, + worker_context_provider_, msaa_sample_count_); } else { RasterizeSource( raster_source, resource_has_previous_content, mailbox, texture_target, texture_is_overlay_candidate, texture_storage_allocated, resource_size, resource_format, color_space, raster_full_rect, playback_rect, transform, playback_settings, worker_context_provider_, - use_distance_field_text_, msaa_sample_count_, + msaa_sample_count_, ShouldUnpremultiplyAndDitherResource(resource_format), max_tile_size_); }
diff --git a/cc/raster/gpu_raster_buffer_provider.h b/cc/raster/gpu_raster_buffer_provider.h index f5ec7f2..790ed870 100644 --- a/cc/raster/gpu_raster_buffer_provider.h +++ b/cc/raster/gpu_raster_buffer_provider.h
@@ -24,7 +24,6 @@ GpuRasterBufferProvider(viz::ContextProvider* compositor_context_provider, viz::RasterContextProvider* worker_context_provider, LayerTreeResourceProvider* resource_provider, - bool use_distance_field_text, bool use_gpu_memory_buffer_resources, int gpu_rasterization_msaa_sample_count, viz::ResourceFormat preferred_tile_format, @@ -114,7 +113,6 @@ viz::ContextProvider* const compositor_context_provider_; viz::RasterContextProvider* const worker_context_provider_; LayerTreeResourceProvider* const resource_provider_; - const bool use_distance_field_text_; const bool use_gpu_memory_buffer_resources_; const int msaa_sample_count_; const viz::ResourceFormat preferred_tile_format_;
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc index 7499113..f8f1bfa0 100644 --- a/cc/raster/raster_buffer_provider_perftest.cc +++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -122,6 +122,9 @@ viz::ContextCacheController* CacheController() override { return &cache_controller_; } + void InvalidateGrContext(uint32_t state) override { + test_context_provider_->GrContext()->resetContext(state); + } base::Lock* GetLock() override { return &context_lock_; } void AddObserver(viz::ContextLostObserver* obs) override {} void RemoveObserver(viz::ContextLostObserver* obs) override {} @@ -376,7 +379,7 @@ Create3dResourceProvider(); raster_buffer_provider_ = std::make_unique<GpuRasterBufferProvider>( compositor_context_provider_.get(), worker_context_provider_.get(), - resource_provider_.get(), false, false, 0, + resource_provider_.get(), false, 0, viz::PlatformColor::BestTextureFormat(), gfx::Size(), false); resource_pool_ = std::make_unique<ResourcePool>( resource_provider_.get(), task_runner_,
diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc index 1881694..6ebe570 100644 --- a/cc/raster/raster_buffer_provider_unittest.cc +++ b/cc/raster/raster_buffer_provider_unittest.cc
@@ -181,7 +181,7 @@ Create3dResourceProvider(); raster_buffer_provider_ = std::make_unique<GpuRasterBufferProvider>( context_provider_.get(), worker_context_provider_.get(), - resource_provider_.get(), false, false, 0, + resource_provider_.get(), false, 0, viz::PlatformColor::BestTextureFormat(), gfx::Size(), false); pool_ = std::make_unique<ResourcePool>( resource_provider_.get(), base::ThreadTaskRunnerHandle::Get(),
diff --git a/cc/raster/raster_source.cc b/cc/raster/raster_source.cc index 61d356f0..be224fe6 100644 --- a/cc/raster/raster_source.cc +++ b/cc/raster/raster_source.cc
@@ -162,7 +162,8 @@ void RasterSource::PlaybackToCanvas(SkCanvas* raster_canvas, ImageProvider* image_provider) const { - DCHECK(display_list_.get()); + // TODO(enne): Temporary CHECK debugging for http://crbug.com/823835 + CHECK(display_list_.get()); int repeat_count = std::max(1, slow_down_raster_scale_factor_for_debug_); for (int i = 0; i < repeat_count; ++i) display_list_->Raster(raster_canvas, image_provider);
diff --git a/cc/raster/scoped_gpu_raster.cc b/cc/raster/scoped_gpu_raster.cc index 85bfd8fc..9c0752c 100644 --- a/cc/raster/scoped_gpu_raster.cc +++ b/cc/raster/scoped_gpu_raster.cc
@@ -29,6 +29,9 @@ // Using push/pop functions directly incurs cost to evaluate function // arguments even when tracing is disabled. gl->TraceBeginCHROMIUM("ScopedGpuRaster", "GpuRasterization"); + + class GrContext* gr_context = context_provider_->GrContext(); + gr_context->resetContext(); } void ScopedGpuRaster::EndGpuRaster() {
diff --git a/cc/resources/layer_tree_resource_provider.cc b/cc/resources/layer_tree_resource_provider.cc index 3adf492..44720a3 100644 --- a/cc/resources/layer_tree_resource_provider.cc +++ b/cc/resources/layer_tree_resource_provider.cc
@@ -988,7 +988,6 @@ GLenum texture_target, const gfx::Size& size, viz::ResourceFormat format, - bool use_distance_field_text, bool can_use_lcd_text, int msaa_sample_count) { GrGLTextureInfo texture_info; @@ -997,8 +996,7 @@ texture_info.fFormat = TextureStorageFormat(format); GrBackendTexture backend_texture(size.width(), size.height(), GrMipMapped::kNo, texture_info); - SkSurfaceProps surface_props = - ComputeSurfaceProps(use_distance_field_text, can_use_lcd_text); + SkSurfaceProps surface_props = ComputeSurfaceProps(can_use_lcd_text); surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( gr_context, backend_texture, kTopLeft_GrSurfaceOrigin, msaa_sample_count, ResourceFormatToClosestSkColorType(format), nullptr, &surface_props); @@ -1010,10 +1008,8 @@ } SkSurfaceProps LayerTreeResourceProvider::ScopedSkSurface::ComputeSurfaceProps( - bool use_distance_field_text, bool can_use_lcd_text) { - uint32_t flags = - use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0; + uint32_t flags = 0; // Use unknown pixel geometry to disable LCD text. SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); if (can_use_lcd_text) {
diff --git a/cc/resources/layer_tree_resource_provider.h b/cc/resources/layer_tree_resource_provider.h index 6d81451..07a85f5 100644 --- a/cc/resources/layer_tree_resource_provider.h +++ b/cc/resources/layer_tree_resource_provider.h
@@ -287,15 +287,13 @@ GLenum texture_target, const gfx::Size& size, viz::ResourceFormat format, - bool use_distance_field_text, bool can_use_lcd_text, int msaa_sample_count); ~ScopedSkSurface(); SkSurface* surface() const { return surface_.get(); } - static SkSurfaceProps ComputeSurfaceProps(bool use_distance_field_text, - bool can_use_lcd_text); + static SkSurfaceProps ComputeSurfaceProps(bool can_use_lcd_text); private: sk_sp<SkSurface> surface_;
diff --git a/cc/test/cc_test_suite.cc b/cc/test/cc_test_suite.cc index 648c16e..d29c84b6d 100644 --- a/cc/test/cc_test_suite.cc +++ b/cc/test/cc_test_suite.cc
@@ -22,9 +22,7 @@ gl::GLSurfaceTestSupport::InitializeOneOff(); viz::Paths::RegisterPathProvider(); - base::ThreadIdNameManager::GetInstance()->SetName( - base::PlatformThread::CurrentId(), - "Main"); + base::ThreadIdNameManager::GetInstance()->SetName("Main"); base::DiscardableMemoryAllocator::SetInstance(&discardable_memory_allocator_); }
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc index 2a5c16b..8055a6af8 100644 --- a/cc/test/layer_tree_pixel_resource_test.cc +++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -70,8 +70,8 @@ return std::make_unique<GpuRasterBufferProvider>( compositor_context_provider, worker_context_provider, - resource_provider, false, false, 0, - viz::PlatformColor::BestTextureFormat(), gfx::Size(), false); + resource_provider, false, 0, viz::PlatformColor::BestTextureFormat(), + gfx::Size(), false); case ZERO_COPY: EXPECT_TRUE(compositor_context_provider); EXPECT_TRUE(gpu_memory_buffer_manager);
diff --git a/cc/test/test_in_process_context_provider.cc b/cc/test/test_in_process_context_provider.cc index 30744898..145c765 100644 --- a/cc/test/test_in_process_context_provider.cc +++ b/cc/test/test_in_process_context_provider.cc
@@ -113,8 +113,8 @@ skia_bindings::GrContextForGLES2Interface::DefaultCacheLimitsForTests( &max_resource_cache_bytes, &max_glyph_cache_texture_bytes); gr_context_.reset(new skia_bindings::GrContextForGLES2Interface( - ContextGL(), ContextSupport(), ContextCapabilities(), - max_resource_cache_bytes, max_glyph_cache_texture_bytes)); + ContextGL(), ContextCapabilities(), max_resource_cache_bytes, + max_glyph_cache_texture_bytes)); cache_controller_->SetGrContext(gr_context_->get()); return gr_context_->get(); } @@ -123,6 +123,11 @@ return cache_controller_.get(); } +void TestInProcessContextProvider::InvalidateGrContext(uint32_t state) { + if (gr_context_) + gr_context_->ResetContext(state); +} + base::Lock* TestInProcessContextProvider::GetLock() { return &context_lock_; }
diff --git a/cc/test/test_in_process_context_provider.h b/cc/test/test_in_process_context_provider.h index 825c6e4..cb684bf 100644 --- a/cc/test/test_in_process_context_provider.h +++ b/cc/test/test_in_process_context_provider.h
@@ -54,6 +54,7 @@ gpu::ContextSupport* ContextSupport() override; class GrContext* GrContext() override; viz::ContextCacheController* CacheController() override; + void InvalidateGrContext(uint32_t state) override; base::Lock* GetLock() override; const gpu::Capabilities& ContextCapabilities() const override; const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override;
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc index 3f105cc..0354cfcc 100644 --- a/cc/tiles/gpu_image_decode_cache.cc +++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -1579,6 +1579,11 @@ context_->ContextGL()->UnlockDiscardableTextureCHROMIUM( GlIdFromSkImage(image)); } + if (images_pending_unlock_.size() > 0) { + // When we unlock images, we remove any outstanding texture bindings. We + // need to inform Skia so it will re-generate these bindings if needed. + context_->GrContext()->resetContext(kTextureBinding_GrGLBackendState); + } images_pending_unlock_.clear(); for (auto id : ids_pending_unlock_) {
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 7d6ab52e..2922dc6 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -2080,9 +2080,6 @@ if (!*gpu_rasterization_enabled && !settings_.gpu_rasterization_forced) return; - if (!context_provider->ContextSupport()->HasGrContextSupport()) - return; - // Do not check GrContext above. It is lazy-created, and we only want to // create it if it might be used. GrContext* gr_context = context_provider->GrContext(); @@ -2647,7 +2644,7 @@ return std::make_unique<GpuRasterBufferProvider>( compositor_context_provider, worker_context_provider, - resource_provider_.get(), settings_.use_distance_field_text, + resource_provider_.get(), settings_.resource_settings.use_gpu_memory_buffer_resources, msaa_sample_count, settings_.preferred_tile_format, settings_.max_gpu_raster_tile_size, oop_raster_enabled);
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h index 189d7d7..f85f1dd 100644 --- a/cc/trees/layer_tree_settings.h +++ b/cc/trees/layer_tree_settings.h
@@ -42,7 +42,6 @@ int damaged_frame_limit = 3; bool enable_latency_recovery = true; bool can_use_lcd_text = true; - bool use_distance_field_text = false; bool gpu_rasterization_forced = false; int gpu_rasterization_msaa_sample_count = 0; float gpu_rasterization_skewport_target_time_in_seconds = 0.2f;
diff --git a/chrome/android/feed/core/DEPS b/chrome/android/feed/core/DEPS index 81bc45f..3bfdb5b 100644 --- a/chrome/android/feed/core/DEPS +++ b/chrome/android/feed/core/DEPS
@@ -1,4 +1,5 @@ include_rules = [ "+components/feed", + "+content/public/android/java/src/org/chromium/content_public", "+third_party/feed" ]
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java index 6e89112..098766c 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
@@ -12,12 +12,17 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.NativePageHost; import org.chromium.chrome.browser.UrlConstants; +import org.chromium.chrome.browser.feed.action.FeedActionHandler; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegateImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelector; /** * Provides a new tab page that displays an interest feed rendered list of content suggestions. */ public class FeedNewTabPage extends BasicNativePage { + private final FeedActionHandler mActionHandler; + private View mRootView; private String mTitle; @@ -30,6 +35,14 @@ public FeedNewTabPage(ChromeActivity activity, NativePageHost nativePageHost, TabModelSelector tabModelSelector) { super(activity, nativePageHost); + + // Initialize Action Handler + Profile profile = nativePageHost.getActiveTab().getProfile(); + SuggestionsNavigationDelegateImpl navigationDelegate = + new SuggestionsNavigationDelegateImpl( + activity, profile, nativePageHost, tabModelSelector); + mActionHandler = new FeedActionHandler(navigationDelegate); + // TODO(huayinz): Pass the action handler into Stream. } @Override
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java new file mode 100644 index 0000000..7f35c08 --- /dev/null +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java
@@ -0,0 +1,94 @@ +// 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.chrome.browser.feed.action; + +import android.support.annotation.NonNull; + +import com.google.android.libraries.feed.host.action.ActionApi; + +import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate; +import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.ui.base.PageTransition; +import org.chromium.ui.mojom.WindowOpenDisposition; + +/** + * Handles the actions user can trigger on the feed. + */ +public class FeedActionHandler implements ActionApi { + private final SuggestionsNavigationDelegate mDelegate; + + /** + * @param delegate The {@link SuggestionsNavigationDelegate} that this handler calls when + * handling some of the actions. + */ + public FeedActionHandler(@NonNull SuggestionsNavigationDelegate delegate) { + mDelegate = delegate; + } + + @Override + public void openUrl(String url) { + mDelegate.openUrl(WindowOpenDisposition.CURRENT_TAB, createLoadUrlParams(url)); + } + + @Override + public boolean canOpenUrl() { + return true; + } + + @Override + public void openUrlInIncognitoMode(String url) { + mDelegate.openUrl(WindowOpenDisposition.OFF_THE_RECORD, createLoadUrlParams(url)); + } + + @Override + public boolean canOpenUrlInIncognitoMode() { + return mDelegate.isOpenInIncognitoEnabled(); + } + + @Override + public void openUrlInNewTab(String url) { + mDelegate.openUrl(WindowOpenDisposition.NEW_BACKGROUND_TAB, createLoadUrlParams(url)); + } + + @Override + public boolean canOpenUrlInNewTab() { + return true; + } + + @Override + public void openUrlInNewWindow(String url) { + mDelegate.openUrl(WindowOpenDisposition.NEW_WINDOW, createLoadUrlParams(url)); + } + + @Override + public boolean canOpenUrlInNewWindow() { + return mDelegate.isOpenInNewWindowEnabled(); + } + + @Override + public void downloadUrl(String url) { + mDelegate.openUrl(WindowOpenDisposition.SAVE_TO_DISK, createLoadUrlParams(url)); + } + + @Override + public boolean canDownloadUrl() { + // TODO(huayinz): Change to the desired behavior. + return false; + } + + @Override + public void learnMore() { + mDelegate.navigateToHelpPage(); + } + + @Override + public boolean canLearnMore() { + return true; + } + + private LoadUrlParams createLoadUrlParams(String url) { + return new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK); + } +} \ No newline at end of file
diff --git a/chrome/android/feed/feed_java_sources.gni b/chrome/android/feed/feed_java_sources.gni index 2168fd8..35d2a44 100644 --- a/chrome/android/feed/feed_java_sources.gni +++ b/chrome/android/feed/feed_java_sources.gni
@@ -8,7 +8,10 @@ # TODO(twellington): Add a dependency on //components/feed when an appropriate target is defined. feed_deps = [ "//third_party/feed:feed_java" ] - feed_java_sources = [ "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java" ] + feed_java_sources = [ + "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java", + "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java", + ] } else { feed_deps = []
diff --git a/chrome/android/java/proguard.flags b/chrome/android/java/proguard.flags index 9e169d00..26de45b4 100644 --- a/chrome/android/java/proguard.flags +++ b/chrome/android/java/proguard.flags
@@ -26,3 +26,9 @@ -keepclassmembers class android.support.design.internal.BottomNavigationMenuView { boolean mShiftingMode; } + +# There is stack-walking code in our IME that breaks with obfuscation. +# https://crbug.com/824048. +-keepnames class org.chromium.content.browser.input.* { + *; +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java index af9f976d..23e4277 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java
@@ -12,6 +12,7 @@ import android.content.Intent; import android.content.ServiceConnection; import android.os.Build; +import android.os.Handler; import android.os.IBinder; import com.google.ipc.invalidation.util.Preconditions; @@ -49,12 +50,24 @@ } private static final String TAG = "DownloadFg"; + // Delay to ensure start/stop foreground doesn't happen too quickly (b/74236718). + private static final int WAIT_TIME_MS = 100; - @VisibleForTesting - final Map<Integer, DownloadUpdate> mDownloadUpdateQueue = new HashMap<>(); // Used to track existing notifications for UMA stats. private final List<Integer> mExistingNotifications = new ArrayList<>(); + // Variables used to ensure start/stop foreground doesn't happen too quickly (b/74236718). + private final Handler mHandler = new Handler(); + private final Runnable mMaybeStopServiceRunnable = new Runnable() { + @Override + public void run() { + mStopServiceDelayed = false; + processDownloadUpdateQueue(false /* not isProcessingPending */); + mHandler.removeCallbacks(mMaybeStopServiceRunnable); + } + }; + private boolean mStopServiceDelayed = false; + private int mPinnedNotificationId = INVALID_NOTIFICATION_ID; // This is true when context.bindService has been called and before context.unbindService. @@ -62,6 +75,9 @@ // This is non-null when onServiceConnected has been called (aka service is active). private DownloadForegroundService mBoundService; + @VisibleForTesting + final Map<Integer, DownloadUpdate> mDownloadUpdateQueue = new HashMap<>(); + public DownloadForegroundServiceManager() {} public void updateDownloadStatus(Context context, DownloadStatus downloadStatus, @@ -115,14 +131,20 @@ if (isProcessingPending) { startOrUpdateForegroundService( downloadUpdate.mNotificationId, downloadUpdate.mNotification); + + // Post a delayed task to eventually check to see if service needs to be stopped. + postMaybeStopServiceRunnable(); } // If the selected downloadUpdate is not active, there are no active downloads left. // Stop the foreground service. // In the pending case, this will stop the foreground immediately after it was started. if (!isActive(downloadUpdate.mDownloadStatus)) { - stopAndUnbindService(downloadUpdate.mDownloadStatus); - cleanDownloadUpdateQueue(); + // Only stop the service if not waiting for delay (ie. WAIT_TIME_MS has transpired). + if (!mStopServiceDelayed) { + stopAndUnbindService(downloadUpdate.mDownloadStatus); + cleanDownloadUpdateQueue(); + } return; } @@ -286,4 +308,12 @@ void setBoundService(DownloadForegroundService service) { mBoundService = service; } + + // Allow testing methods to skip posting the delayed runnable. + @VisibleForTesting + void postMaybeStopServiceRunnable() { + mHandler.removeCallbacks(mMaybeStopServiceRunnable); + mHandler.postDelayed(mMaybeStopServiceRunnable, WAIT_TIME_MS); + mStopServiceDelayed = true; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 2d8ebf2..519c458 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -48,6 +48,7 @@ import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; @@ -239,6 +240,7 @@ private boolean mOmniboxVoiceSearchAlwaysVisible; protected float mUrlFocusChangePercent; + protected LinearLayout mUrlActionContainer; private static abstract class DeferredOnSelectionRunnable implements Runnable { protected final OmniboxSuggestion mSuggestion; @@ -683,6 +685,7 @@ super(context, attrs); LayoutInflater.from(context).inflate(layoutId, this, true); + mNavigationButton = (ImageView) findViewById(R.id.navigation_button); assert mNavigationButton != null : "Missing navigation type view."; @@ -715,6 +718,8 @@ mSuggestionListAdapter = new OmniboxResultsAdapter(getContext(), this, mSuggestionItems); mMicButton = (TintedImageButton) findViewById(R.id.mic_button); + + mUrlActionContainer = (LinearLayout) findViewById(R.id.url_action_container); } @Override @@ -1504,18 +1509,12 @@ int urlContainerMarginEnd = 0; if (addMarginForActionsContainer) { - int urlContainerChildIndex = indexOfChild(mUrlBar); - assert urlContainerChildIndex != -1; - - for (int i = urlContainerChildIndex + 1; i < getChildCount(); i++) { - View childView = getChildAt(i); - if (childView.getVisibility() != GONE) { - LayoutParams childLayoutParams = (LayoutParams) childView.getLayoutParams(); - urlContainerMarginEnd = Math.max(urlContainerMarginEnd, - childLayoutParams.width - + ApiCompatibilityUtils.getMarginStart(childLayoutParams) - + ApiCompatibilityUtils.getMarginEnd(childLayoutParams)); - } + for (View childView : getUrlContainerViewsForMargin()) { + ViewGroup.MarginLayoutParams childLayoutParams = + (ViewGroup.MarginLayoutParams) childView.getLayoutParams(); + urlContainerMarginEnd += childLayoutParams.width + + ApiCompatibilityUtils.getMarginStart(childLayoutParams) + + ApiCompatibilityUtils.getMarginEnd(childLayoutParams); } } return urlContainerMarginEnd; @@ -1572,6 +1571,24 @@ } /** + * Gets the list of views that need to be taken into account for adding margin to the end of the + * URL bar. + * + * @return A {@link List} of the views to be taken into account for URL bar margin to avoid + * overlapping text and buttons. + */ + protected List<View> getUrlContainerViewsForMargin() { + List<View> outList = new ArrayList<View>(); + if (mUrlActionContainer == null) return outList; + + for (int i = 0; i < mUrlActionContainer.getChildCount(); i++) { + View childView = mUrlActionContainer.getChildAt(i); + if (childView.getVisibility() != GONE) outList.add(childView); + } + return outList; + } + + /** * @return Whether the delete button should be shown. */ protected boolean shouldShowDeleteButton() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java index fdbf282..4535def 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java
@@ -16,7 +16,6 @@ import android.view.WindowManager; import android.view.animation.Interpolator; import android.widget.FrameLayout; -import android.widget.LinearLayout; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; @@ -45,22 +44,18 @@ private @Nullable View mIncognitoBadge; private View mGoogleGContainer; private View mGoogleG; - private View mUrlActionsContainer; private int mIncognitoBadgePadding; private int mGoogleGWidth; private int mGoogleGMargin; private Runnable mKeyboardResizeModeTask; private ObjectAnimator mOmniboxBackgroundAnimator; - private LinearLayout mUrlActionContainer; /** * Constructor used to inflate from XML. */ public LocationBarPhone(Context context, AttributeSet attrs) { super(context, attrs); - - mUrlActionContainer = (LinearLayout) findViewById(R.id.url_action_container); } @Override @@ -77,12 +72,11 @@ mGoogleGWidth = getResources().getDimensionPixelSize(R.dimen.location_bar_google_g_width); mGoogleGMargin = getResources().getDimensionPixelSize(R.dimen.location_bar_google_g_margin); - mUrlActionsContainer = findViewById(R.id.url_action_container); Rect delegateArea = new Rect(); - mUrlActionsContainer.getHitRect(delegateArea); + mUrlActionContainer.getHitRect(delegateArea); delegateArea.left -= ACTION_BUTTON_TOUCH_OVERFLOW_LEFT; - TouchDelegate touchDelegate = new TouchDelegate(delegateArea, mUrlActionsContainer); - assert mUrlActionsContainer.getParent() == this; + TouchDelegate touchDelegate = new TouchDelegate(delegateArea, mUrlActionContainer); + assert mUrlActionContainer.getParent() == this; setTouchDelegate(touchDelegate); } @@ -101,12 +95,12 @@ mUrlFocusChangePercent = percent; if (percent > 0f) { - mUrlActionsContainer.setVisibility(VISIBLE); + mUrlActionContainer.setVisibility(VISIBLE); } else if (percent == 0f && !isUrlFocusChangeInProgress()) { // If a URL focus change is in progress, then it will handle setting the visibility // correctly after it completes. If done here, it would cause the URL to jump due // to a badly timed layout call. - mUrlActionsContainer.setVisibility(GONE); + mUrlActionContainer.setVisibility(GONE); } updateButtonVisibility(); @@ -131,17 +125,17 @@ @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { boolean needsCanvasRestore = false; - if (child == mUrlBar && mUrlActionsContainer.getVisibility() == VISIBLE) { + if (child == mUrlBar && mUrlActionContainer.getVisibility() == VISIBLE) { canvas.save(); // Clip the URL bar contents to ensure they do not draw under the URL actions during // focus animations. Based on the RTL state of the location bar, the url actions // container can be on the left or right side, so clip accordingly. - if (mUrlBar.getLeft() < mUrlActionsContainer.getLeft()) { - canvas.clipRect(0, 0, (int) mUrlActionsContainer.getX(), getBottom()); + if (mUrlBar.getLeft() < mUrlActionContainer.getLeft()) { + canvas.clipRect(0, 0, (int) mUrlActionContainer.getX(), getBottom()); } else { - canvas.clipRect(mUrlActionsContainer.getX() + mUrlActionsContainer.getWidth(), - 0, getWidth(), getBottom()); + canvas.clipRect(mUrlActionContainer.getX() + mUrlActionContainer.getWidth(), 0, + getWidth(), getBottom()); } needsCanvasRestore = true; } @@ -176,7 +170,7 @@ if (mBottomSheet == null) { setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE, true); } - mUrlActionsContainer.setVisibility(GONE); + mUrlActionContainer.setVisibility(GONE); } else { // If Chrome Home is enabled, it will handle its own mode changes. if (mBottomSheet == null) { @@ -378,27 +372,4 @@ mIncognitoBadge = null; } } - - @Override - protected int getUrlContainerMarginEnd() { - assert mUrlActionContainer != null; - boolean addMarginForActionsContainer = - (mBottomSheet == null || !mUrlFocusChangeInProgress || isUrlBarFocused()) - && mUrlActionContainer.getVisibility() != GONE; - int urlContainerMarginEnd = 0; - - if (addMarginForActionsContainer) { - for (int i = 0; i < mUrlActionContainer.getChildCount(); i++) { - View button = mUrlActionContainer.getChildAt(i); - LinearLayout.LayoutParams buttonLayoutParams = - (LinearLayout.LayoutParams) button.getLayoutParams(); - if (button.getVisibility() != GONE) { - urlContainerMarginEnd += buttonLayoutParams.width - + ApiCompatibilityUtils.getMarginStart(buttonLayoutParams) - + ApiCompatibilityUtils.getMarginEnd(buttonLayoutParams); - } - } - } - return urlContainerMarginEnd; - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java index 4bf46df..fde5b8e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
@@ -15,6 +15,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; +import android.widget.FrameLayout; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; @@ -587,4 +588,30 @@ return isVoiceSearchEnabled() && mNativeInitialized && (mUrlBar.hasFocus() || mUrlFocusChangeInProgress); } + + @Override + protected List<View> getUrlContainerViewsForMargin() { + List<View> outList = new ArrayList<View>(1); + int urlContainerChildIndex = indexOfChild(mUrlBar); + assert urlContainerChildIndex != -1; + + // For tablets, we have FrameLayouts next to the URL bar and we only want to calculate + // the URL bar margin based on the largest one, so we return a list containing only that. + int largestChildWidth = 0; + View largestChildView = null; + for (int i = urlContainerChildIndex + 1; i < getChildCount(); i++) { + View childView = getChildAt(i); + FrameLayout.LayoutParams childLayoutParams = + (FrameLayout.LayoutParams) childView.getLayoutParams(); + int width = childLayoutParams.width + + ApiCompatibilityUtils.getMarginStart(childLayoutParams) + + ApiCompatibilityUtils.getMarginEnd(childLayoutParams); + if (width > largestChildWidth) { + largestChildWidth = width; + largestChildView = childView; + } + } + if (largestChildView != null) outList.add(largestChildView); + return outList; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConsentTextTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConsentTextTracker.java index 5ce5c50..466d5ef1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConsentTextTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConsentTextTracker.java
@@ -103,9 +103,13 @@ * @param text The text to be assigned. */ public void setTextNonRecordable(TextView view, CharSequence text) { - view.setText(text); + // TODO(crbug.com/821908): The selected account name, which is assigned to its |view| using + // this method, can be null in rare circumstances. + CharSequence textSanitized = text != null ? text : ""; + + view.setText(textSanitized); mTextViewToMetadataMap.put( - view, new TextViewMetadata(text.toString(), 0 /* no resource id */)); + view, new TextViewMetadata(textSanitized.toString(), 0 /* no resource id */)); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index dbd3fa0..c4fec6d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -447,8 +447,13 @@ private void onScrollingStateChanged() { FullscreenManager fullscreenManager = getFullscreenManager(); if (fullscreenManager == null) return; - fullscreenManager.onContentViewScrollingStateChanged( - getContentViewCore() != null && getContentViewCore().isScrollInProgress()); + fullscreenManager.onContentViewScrollingStateChanged(isScrollInProgress()); + } + + private boolean isScrollInProgress() { + WebContents webContents = getWebContents(); + if (webContents == null) return false; + return GestureListenerManager.fromWebContents(webContents).isScrollInProgress(); } }; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java index 95d0aeb..8082df2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
@@ -82,6 +82,21 @@ void navigateBack(); /** + * Asks VrShell to reload the current page. + */ + void reloadTab(); + + /** + * Asks VrShell to open a new tab. + */ + void openNewTab(boolean incognito); + + /** + * Asks VrShell to close all incognito tabs. + */ + void closeAllIncognitoTabs(); + + /** * Simulates a user accepting the currently visible DOFF prompt. */ void acceptDoffPromptForTesting();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java index d8b4957f..49ccf46c5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
@@ -897,6 +897,7 @@ @VisibleForTesting @Override + @CalledByNative public void navigateForward() { if (!mCanGoForward) return; mActivity.getToolbarManager().forward(); @@ -918,6 +919,24 @@ updateHistoryButtonsVisibility(); } + @Override + @CalledByNative + public void reloadTab() { + mTab.reload(); + } + + @Override + @CalledByNative + public void openNewTab(boolean incognito) { + mActivity.getTabCreator(incognito).launchNTP(); + } + + @Override + @CalledByNative + public void closeAllIncognitoTabs() { + mTabModelSelector.getModel(true).closeAllTabs(); + } + private void updateHistoryButtonsVisibility() { if (mNativeVrShell == 0) return; if (mTab == null) { @@ -996,6 +1015,11 @@ return mPresentationView; } + @VisibleForTesting + public boolean isDisplayingDialogView() { + return mVrUiViewContainer.getChildCount() > 0; + } + @Override public void showSoftInput(boolean show) { assert mNativeVrShell != 0;
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 5a06598..5eb21dc 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">ውጤት <ph name="RESULT_NUMBER" /> ከ<ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">በGoogle የሚጠቆም ግላዊነት የተላበሰ ይዘትን ለማግኘት በመለያ ወደ Chrome ይግቡ።</translation> <translation id="2091887806945687916">ድምፅ</translation> -<translation id="209354263896846928">በእርስዎ የማያ ገጽ ግርጌ ላይ ያለውን የአድራሻ አሞሌ ይድረሱበት</translation> <translation id="2095887075102408547">ይህ ባህሪ ሲበራ Chrome የጎበኟቸውን ገጾች ከማውረዱ በፊት ለማመቅ የGoogle አገልጋዮችን ይጠቀማል። ግላዊ ግንኙነቶችን (ኤችቲቲፒኤስ) ወይም ማንነት የማያሳውቁ ትሮችን በመጠቀም የተደረሰባቸው ገጾች አይተቡም ወይም በGoogle አይታይም።</translation> <translation id="2100273922101894616">በራስ-ግባ</translation> <translation id="2111511281910874386">ወደዚህ ገጽ ይሂዱ</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">ይህ ሁሉንም <ph name="SIZE_IN_KB" /> የድር ጣቢያ ማከማቻ ያጸዳል።</translation> <translation id="3029613699374795922"><ph name="KBS" /> ኪባ ወርዷል</translation> <translation id="3029704984691124060">የይለፍ ሐረጎቹ አይዛመዱም</translation> -<translation id="3030708446010914655">የአድራሻ አሞሌውን እዚህ ይድረሱበት</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />እገዛ ያግኙ<ph name="END_LINK" /></translation> <translation id="305593374596241526">አካባቢ ጠፍቷል፤ በ<ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ያብሩት።</translation> <translation id="307908932405420782">ተጨማሪ ጽሑፎች በቅርቡ ይታያሉ። የእርስዎን ጥዋት ይዝናኑበት!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">ውሂብ ቆጣቢ ዳግም ይጀመር?</translation> <translation id="3714981814255182093">የአግኝ አሞሌን ክፈት</translation> <translation id="3716182511346448902">ይህ ገጽ በጣም ብዙ ማህደረ ትውስታን ይጠቀማል፣ ስለዚህ Chrome ባለበት አቁሞታል።</translation> -<translation id="3734660163659757482">ዕልባቶችን እና ተጨማሪ ነገሮችን ለመመልከት ወደ ላይ ይጎትቱ</translation> <translation id="3738139272394829648">ለመፈለግ ይንኩ</translation> <translation id="3739899004075612870">በ<ph name="PRODUCT_NAME" /> ውስጥ ዕልባት ተቀምጦለታል</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> ሜባ ሌሎች መተግበሪያዎች</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 751dbfc6..7a330ac 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">النتيجة <ph name="RESULT_NUMBER" /> من <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">للحصول على محتوى مخصص اقترحته Google، سجِّلْ الدخول إلى Chrome.</translation> <translation id="2091887806945687916">الصوت</translation> -<translation id="209354263896846928">الوصول إلى شريط العناوين في أسفل الشاشة</translation> <translation id="2095887075102408547">عند تشغيل هذه الميزة، سيستخدم Chrome خوادم Google لضغط الصفحات التي تزورها قبل تنزيلها. ولن يتم تحسين الصفحات التي يتم الوصول إليها باستخدام الاتصالات الخاصة (HTTPS) أو من خلال علامات تبويب التصفح المتخفي أو لن يكتشفها متصفح Google.</translation> <translation id="2100273922101894616">تسجيل الدخول التلقائي</translation> <translation id="2111511281910874386">الانتقال إلى الصفحة</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">سيؤدي هذا إلى مسح السعة التي تبلغ <ph name="SIZE_IN_KB" /> بأكملها من سعة تخزين موقع الويب.</translation> <translation id="3029613699374795922">تم التنزيل بحجم <ph name="KBS" /> كيلوبايت</translation> <translation id="3029704984691124060">عبارات المرور غير متطابقة</translation> -<translation id="3030708446010914655">الوصول إلى شريط العناوين هنا</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />الحصول على مساعدة<ph name="END_LINK" /></translation> <translation id="305593374596241526">تحديد الموقع الجغرافي متوقف، يمكنك تفعيله من <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">ستظهر المزيد من المقالات قريبًا. استمتع بصباحك!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">أترغب في إعادة ضبط توفير البيانات؟</translation> <translation id="3714981814255182093">فتح شريط البحث</translation> <translation id="3716182511346448902">تستهلك هذه الصفحة مساحة كبيرة من الذاكرة، لذلك أوقفها Chrome مؤقتًا.</translation> -<translation id="3734660163659757482">اسحب لأعلى للاطّلاع على الإشارات المرجعية والمزيد</translation> <translation id="3738139272394829648">المس للبحث</translation> <translation id="3739899004075612870">تمت إضافة إشارة مرجعية في <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534">تطبيقات أخرى بحجم <ph name="MEGABYTES" /> ميغابايت</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 5dc67d5..3c79b87 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Резултат <ph name="RESULT_NUMBER" /> от <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">За да получавате персонализирано съдържание, предлагано от Google, влезте в Chrome.</translation> <translation id="2091887806945687916">Звук</translation> -<translation id="209354263896846928">Осъществявайте достъп до адресната лента от долната част на екрана</translation> <translation id="2095887075102408547">Когато тази функция е включена, Chrome ще използва сървърите на Google, за да компресира посещаваните от вас страници преди изтеглянето им. Няма да оптимизираме, нито ще виждаме страниците, отваряни през частни връзки (HTTPS) или в раздели в режим „инкогнито“.</translation> <translation id="2100273922101894616">Автоматичен вход</translation> <translation id="2111511281910874386">Към страницата</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Така ще се изчистят всички съхранявани данни от уебсайтове (<ph name="SIZE_IN_KB" />).</translation> <translation id="3029613699374795922">Изтеглено: <ph name="KBS" /> КБ</translation> <translation id="3029704984691124060">Пропуските не са идентични</translation> -<translation id="3030708446010914655">Осъществявайте достъп до адресната лента оттук</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Получете помощ<ph name="END_LINK" /></translation> <translation id="305593374596241526">Местоположението е изключено. Включете го от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Скоро ще се покажат още статии. Приятна сутрин!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Да се нулира ли статистиката от Икономия на данни?</translation> <translation id="3714981814255182093">Отваряне на лентата за търсене</translation> <translation id="3716182511346448902">Тази страница използва твърде много памет, така че Chrome я постави на пауза.</translation> -<translation id="3734660163659757482">Дръпнете нагоре, за да видите отметките и още много други неща</translation> <translation id="3738139272394829648">Търсене чрез докосване</translation> <translation id="3739899004075612870">Отметката бе запазена в/ъв <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534">Други приложения: <ph name="MEGABYTES" /> МБ</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 197a4fd..17062a4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Inicia la sessió a Chrome perquè Google et suggereixi contingut personalitzat</translation> <translation id="2091887806945687916">So</translation> -<translation id="209354263896846928">Accedeix a la barra d'adreces que hi ha a la part inferior de la pantalla</translation> <translation id="2095887075102408547">Quan aquesta funció estigui activada, Chrome farà servir els servidors de Google per comprimir les pàgines que visiteu abans de baixar-les. Google no optimitzarà ni veurà les pàgines a les quals accediu mitjançant connexions privades (HTTPS) o pestanyes d'incògnit.</translation> <translation id="2100273922101894616">Inici de sessió automàtic</translation> <translation id="2111511281910874386">Ves a la pàgina</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Amb aquesta acció se suprimiran <ph name="SIZE_IN_KB" /> d'emmagatzematge del lloc web.</translation> <translation id="3029613699374795922">S'han baixat <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Les frases de contrasenya no coincideixen</translation> -<translation id="3030708446010914655">Accedeix a la barra d'adreces des d'aquí</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obteniu ajuda<ph name="END_LINK" /></translation> <translation id="305593374596241526">La ubicació està desactivada; activa-la a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Aviat es mostraran més articles. Que tinguis un bon matí.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Vols restablir l'extensió Economitzador de dades?</translation> <translation id="3714981814255182093">Obre la Barra de cerca</translation> <translation id="3716182511346448902">Com que aquesta pàgina fa servir massa memòria, Chrome l'ha posat en pausa.</translation> -<translation id="3734660163659757482">Llisca cap amunt per veure les adreces d'interès i més</translation> <translation id="3738139272394829648">Toca per cercar</translation> <translation id="3739899004075612870">Afegit a les adreces de: <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB en altres aplicacions</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 cad0747b..191daaf 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Výsledek <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Chcete-li od Googlu získat personalizované návrhy obsahu, přihlaste se do Chromu.</translation> <translation id="2091887806945687916">Zvuk</translation> -<translation id="209354263896846928">Adresní řádek najdete v dolní části obrazovky</translation> <translation id="2095887075102408547">Je-li tato funkce zapnutá, Chrome navštívené stránky před stažením zkomprimuje pomocí serverů Google. Stránky zobrazené prostřednictvím soukromého připojení (HTTPS) nebo v anonymním režimu nebudou pro Google viditelné a nebudou optimalizovány.</translation> <translation id="2100273922101894616">Přihlásit se automaticky</translation> <translation id="2111511281910874386">Přejít na stránku</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Tímto vymažete celé úložiště webů (<ph name="SIZE_IN_KB" />).</translation> <translation id="3029613699374795922">Staženo: <ph name="KBS" /> kB</translation> <translation id="3029704984691124060">Heslové fráze se neshodují</translation> -<translation id="3030708446010914655">Adresní řádek najdete zde</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Zobrazit nápovědu<ph name="END_LINK" /></translation> <translation id="305593374596241526">Určování polohy je vypnuté, zapnete jej v <ph name="BEGIN_LINK" />nastavení zařízení Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Brzy se zobrazí další články. Užijte si ráno.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Resetovat Spořič dat?</translation> <translation id="3714981814255182093">Otevřít lištu Najít</translation> <translation id="3716182511346448902">Tato stránka využívá příliš mnoho paměti, proto ji Chrome pozastavil.</translation> -<translation id="3734660163659757482">Vytažením nahoru zobrazíte záložky a další obsah</translation> <translation id="3738139272394829648">Vyhledání klepnutím</translation> <translation id="3739899004075612870">Přidáno do záložek (<ph name="PRODUCT_NAME" />)</translation> <translation id="3744111309925758534">Ostatní aplikace: <ph name="MEGABYTES" /> MB</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 56371a4..f97108a43 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> af <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Log ind på Chrome for at hente brugertilpasset indhold, som er foreslået af Chrome.</translation> <translation id="2091887806945687916">Lyd</translation> -<translation id="209354263896846928">Du finder adresselinjen nederst på din skærm</translation> <translation id="2095887075102408547">Når denne funktion er aktiveret, anvender Chrome Googles servere til at komprimere de sider, du besøger, før de downloades. Google optimerer og ser ikke sider, der besøges via private forbindelser (HTTPS) eller inkognitofaner.</translation> <translation id="2100273922101894616">Automatisk login</translation> <translation id="2111511281910874386">Gå til side</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Dette rydder alle <ph name="SIZE_IN_KB" /> i websitelagerpladsen.</translation> <translation id="3029613699374795922">Der er downloadet <ph name="KBS" /> kB</translation> <translation id="3029704984691124060">Adgangssætningerne stemmer ikke overens</translation> -<translation id="3030708446010914655">Du finder adresselinjen her</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjælp<ph name="END_LINK" /></translation> <translation id="305593374596241526">Placering er slået fra. Du kan aktivere den i <ph name="BEGIN_LINK" />Android-indstillingerne<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Der vises snart flere artikler. Hav en god formiddag!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Vil du nulstille Datasparefunktion?</translation> <translation id="3714981814255182093">Åbn søgefeltet</translation> <translation id="3716182511346448902">Denne side anvender for meget hukommelse, så Chrome har sat den på pause.</translation> -<translation id="3734660163659757482">Træk opad for at se bogmærker m.m.</translation> <translation id="3738139272394829648">Tryk for at søge</translation> <translation id="3739899004075612870">Tilføjet som bogmærke i <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB af andre apps</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 5c5357d4..9375ebb 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Ergebnis <ph name="RESULT_NUMBER" /> von <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Melden Sie sich in Chrome an, um personalisierte, von Google vorgeschlagene Inhalte zu erhalten.</translation> <translation id="2091887806945687916">Ton</translation> -<translation id="209354263896846928">Die Adressleiste befindet sich am unteren Bildschirmrand</translation> <translation id="2095887075102408547">Wenn diese Funktion aktiviert ist, nutzt Chrome Google-Server, um besuchte Seiten vor dem Download zu komprimieren. Über private Verbindungen (HTTPS) oder in Inkognito-Tabs aufgerufene Seiten werden von Google nicht optimiert oder protokolliert.</translation> <translation id="2100273922101894616">Automatisch anmelden</translation> <translation id="2111511281910874386">Seite aufrufen</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Alle <ph name="SIZE_IN_KB" /> des Websitespeichers werden gelöscht.</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB heruntergeladen</translation> <translation id="3029704984691124060">Passphrasen stimmen nicht überein.</translation> -<translation id="3030708446010914655">Hier können Sie auf die Adressleiste zugreifen</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Hilfe aufrufen<ph name="END_LINK" /></translation> <translation id="305593374596241526">Die Standortermittlung ist deaktiviert. Sie können sie in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren.</translation> <translation id="307908932405420782">Weitere Artikel werden in Kürze erscheinen. Schönen Tag noch!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Datensparmodus zurücksetzen?</translation> <translation id="3714981814255182093">Suchleiste öffnen</translation> <translation id="3716182511346448902">Diese Seite benötigt zu viel Arbeitsspeicher und wurde daher von Chrome angehalten.</translation> -<translation id="3734660163659757482">Nach oben ziehen, um Lesezeichen und weitere Inhalte anzuzeigen</translation> <translation id="3738139272394829648">Zum Suchen tippen</translation> <translation id="3739899004075612870">Als Lesezeichen in <ph name="PRODUCT_NAME" /> gespeichert</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB sonstiger Apps</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 b7f904e..befb087c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Αποτέλεσμα <ph name="RESULT_NUMBER" /> από <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Για να λάβετε εξατομικευμένο περιεχόμενο που προτείνεται από την Google, συνδεθείτε στο Chrome.</translation> <translation id="2091887806945687916">Ήχος</translation> -<translation id="209354263896846928">Χρησιμοποιήστε τη γραμμή διευθύνσεων στο κάτω μέρος της οθόνης σας</translation> <translation id="2095887075102408547">Όταν είναι ενεργοποιημένη αυτή η λειτουργία, το Chrome θα χρησιμοποιεί τους διακομιστές της Google για τη συμπίεση των σελίδων που επισκέπτεστε πριν από τη λήψη τους. Οι σελίδες τις οποίες επισκεφτήκατε μέσω ασφαλών συνδέσεων (HTTPS) ή σε καρτέλες ανώνυμης περιήγησης δεν θα βελτιστοποιηθούν ή δεν θα είναι ορατές από την Google.</translation> <translation id="2100273922101894616">Αυτόματη σύνδεση</translation> <translation id="2111511281910874386">Μετάβαση στη σελίδα</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Αυτό θα διαγράψει και τα <ph name="SIZE_IN_KB" /> του αποθηκευτικού χώρου ιστοτόπων.</translation> <translation id="3029613699374795922">Έγινε λήψη <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Οι φράσεις πρόσβασης δεν συμφωνούν</translation> -<translation id="3030708446010914655">Χρησιμοποιήστε τη γραμμή διευθύνσεων εδώ</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Λάβετε βοήθεια<ph name="END_LINK" /></translation> <translation id="305593374596241526">Η Τοποθεσία είναι απενεργοποιημένη. Ενεργοποιήστε την στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Περισσότερα άρθρα θα εμφανιστούν σύντομα. Απολαύστε το πρωινό σας!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Επαναφορά δεδομένων Εξοικονόμησης δεδομένων;</translation> <translation id="3714981814255182093">Άνοιγμα της γραμμής εύρεσης</translation> <translation id="3716182511346448902">Αυτή η σελίδα χρησιμοποιεί πάρα πολλή μνήμη. Για αυτόν τον λόγο, το Chrome την έθεσε σε παύση.</translation> -<translation id="3734660163659757482">Τραβήξτε προς τα επάνω, για να δείτε τους σελιδοδείκτες και περισσότερα</translation> <translation id="3738139272394829648">Αγγίξτε για αναζήτηση</translation> <translation id="3739899004075612870">Ο σελιδοδείκτης προστέθηκε στο <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB από άλλες εφαρμογές</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 05a68076..ee17164 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
@@ -87,6 +87,7 @@ <translation id="1709438864123551175">Data Saver</translation> <translation id="1718835860248848330">Last hour</translation> <translation id="1729516292547892356">To view virtual reality content, update Google VR Services</translation> +<translation id="1733116627827457509"><ph name="FILE_SIZE" /> – Updated <ph name="TIME_SINCE_UPDATE" /></translation> <translation id="1749561566933687563">Sync your bookmarks</translation> <translation id="17513872634828108">Open tabs</translation> <translation id="1756600373018374892">Tap this button for quick access to your tabs.</translation> @@ -125,7 +126,6 @@ <translation id="2082238445998314030">Result <ph name="RESULT_NUMBER" /> of <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">To get personalised content suggested by Google, sign in to Chrome.</translation> <translation id="2091887806945687916">Sound</translation> -<translation id="209354263896846928">Access the address bar at the bottom of your screen</translation> <translation id="2095887075102408547">When this feature is turned on, Chrome will use Google servers to compress pages that you visit before downloading them. Pages accessed using private connections (HTTPS) or in Incognito tabs will not be optimised or seen by Google.</translation> <translation id="2100273922101894616">Auto Sign-in</translation> <translation id="2111511281910874386">Go to page</translation> @@ -224,7 +224,6 @@ <translation id="300526633675317032">This will clear all <ph name="SIZE_IN_KB" /> of website storage.</translation> <translation id="3029613699374795922">Downloaded <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Passphrases do not match</translation> -<translation id="3030708446010914655">Access the address bar here</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Get help<ph name="END_LINK" /></translation> <translation id="305593374596241526">Location is off; turn it on in <ph name="BEGIN_LINK" />Android Settings<ph name="END_LINK" />.</translation> <translation id="307908932405420782">More articles will appear soon. Enjoy your morning!</translation> @@ -295,7 +294,6 @@ <translation id="3712575778697986964">Reset Data Saver?</translation> <translation id="3714981814255182093">Open the Find Bar</translation> <translation id="3716182511346448902">This page uses too much memory, so Chrome paused it.</translation> -<translation id="3734660163659757482">Pull up to see bookmarks and more</translation> <translation id="3738139272394829648">Touch to Search</translation> <translation id="3739899004075612870">Bookmarked in <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB other apps</translation> @@ -789,6 +787,7 @@ <translation id="8200772114523450471">Resume</translation> <translation id="8209050860603202033">Open image</translation> <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB downloaded</translation> +<translation id="8249310407154411074">Move to top</translation> <translation id="8250920743982581267">Documents</translation> <translation id="8260126382462817229">Try signing in again</translation> <translation id="8261506727792406068">Delete</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 d4151fa..af4aec5 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
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Para obtener contenido personalizado y sugerido por Google, accede a tu cuenta en Chrome.</translation> <translation id="2091887806945687916">Sonido</translation> -<translation id="209354263896846928">Accede a la barra de direcciones en la parte inferior de la pantalla</translation> <translation id="2095887075102408547">Cuando se active esta función, Chrome usará los servidores de Google para comprimir las páginas que visitas antes de descargarlas. Google no optimizará ni verá las páginas a las que accediste a través de conexiones privadas (HTTPS) o pestañas de incógnito.</translation> <translation id="2100273922101894616">Acceso automático</translation> <translation id="2111511281910874386">Ir a la página</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Esta acción borrará todos los <ph name="SIZE_IN_KB" /> del almacenamiento del sitio web.</translation> <translation id="3029613699374795922">Se descargaron <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Las frases de contraseña no coinciden.</translation> -<translation id="3030708446010914655">Accede a la barra de direcciones aquí</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /></translation> <translation id="305593374596241526">La ubicación está desactivada; actívala en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Pronto se mostrarán más artículos. Disfruta tu mañana.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">¿Deseas restablecer Ahorro de datos?</translation> <translation id="3714981814255182093">Abrir la barra de búsqueda</translation> <translation id="3716182511346448902">Chrome pausó esta página porque usa demasiada memoria.</translation> -<translation id="3734660163659757482">Desliza hacia arriba para ver tus favoritos y más contenido</translation> <translation id="3738139272394829648">Tocar para buscar</translation> <translation id="3739899004075612870">Agregado a favoritos en <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534">Otras apps: <ph name="MEGABYTES" /> megabytes</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 2b4fe2c..46d5fe4c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Para obtener contenido personalizado sugerido por Google, inicia sesión en Chrome.</translation> <translation id="2091887806945687916">Sonido</translation> -<translation id="209354263896846928">Accede a la barra de direcciones en la parte inferior de la pantalla</translation> <translation id="2095887075102408547">Si se activa esta función, Chrome utilizará los servidores de Google para comprimir las páginas que visites antes de descargarlas. Google no optimizará ni verá las páginas a las que accedas mediante conexiones privadas (HTTPS) o pestañas de incógnito.</translation> <translation id="2100273922101894616">Iniciar sesión automáticamente</translation> <translation id="2111511281910874386">Ir a la página</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Se borrarán los <ph name="SIZE_IN_KB" /> de almacenamiento del sitio web.</translation> <translation id="3029613699374795922">kB descargados: <ph name="KBS" /></translation> <translation id="3029704984691124060">Las frases de contraseña no coinciden</translation> -<translation id="3030708446010914655">Accede a la barra de direcciones aquí</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /></translation> <translation id="305593374596241526">La ubicación está desactivada. Actívala en los <ph name="BEGIN_LINK" />Ajustes de Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Próximamente se mostrarán más artículos. Disfruta de la mañana.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">¿Quieres vaciar el historial de ahorro de datos?</translation> <translation id="3714981814255182093">Abre la barra de búsqueda</translation> <translation id="3716182511346448902">Esta página utiliza demasiada memoria y Chrome la ha pausado.</translation> -<translation id="3734660163659757482">Desliza hacia arriba para ver marcadores y más</translation> <translation id="3738139272394829648">Tocar para Buscar</translation> <translation id="3739899004075612870">Marcador añadido a <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB de otras aplicaciones</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 e2530f68..26b6bfa 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> نتیجه از <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">برای دریافت محتوای شخصیسازیشده پیشنهادی Google، به Chrome وارد شوید.</translation> <translation id="2091887806945687916">صدا</translation> -<translation id="209354263896846928">در پایین صفحهنمایش به نوار نشانی دسترسی پیدا کنید</translation> <translation id="2095887075102408547">وقتی این قابلیت روشن است، Chrome از سرورهای Google استفاده میکند تا صفحاتی را که بازدید میکنید قبل از بارگیری آنها فشرده کند. Google صفحههایی را که از طریق اتصالات خصوصی (HTTPS) یا برگههای حالت ناشناس به آنها میروید بهینهسازی یا مشاهده نمیکند.</translation> <translation id="2100273922101894616">ورود به سیستم خودکار</translation> <translation id="2111511281910874386">رفتن به صفحه</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">این کار کل <ph name="SIZE_IN_KB" /> فضای ذخیرهسازی وبسایت را پاک میکند.</translation> <translation id="3029613699374795922"><ph name="KBS" /> کیلوبایت بارگیری شد</translation> <translation id="3029704984691124060">عبارتهای عبور مطابقت ندارند</translation> -<translation id="3030708446010914655">از اینجا به نوار نشانی دسترسی پیدا کنید</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />دریافت راهنمایی<ph name="END_LINK" /></translation> <translation id="305593374596241526">مکان خاموش است، آن را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> روشن کنید.</translation> <translation id="307908932405420782">مقالههای بیشتر بهزودی نشان داده میشوند. از صبحتان لذت ببرید!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">صرفهجویی داده بازنشانی شود؟</translation> <translation id="3714981814255182093">باز کردن «نوار پیدا کردن»</translation> <translation id="3716182511346448902">این صفحه از حافظه بسیار زیادی استفاده میکند، بنابراین Chrome موقتاً آن را متوقف کرد.</translation> -<translation id="3734660163659757482">برای دیدن نشانکها و موارد بیشتر، به بالا بکشید</translation> <translation id="3738139272394829648">لمس کردن برای جستجو</translation> <translation id="3739899004075612870">در <ph name="PRODUCT_NAME" /> نشانکگذاری شد</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> مگابایت توسط برنامههای دیگر</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 81809ae..a7bc0bd 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Tulos <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Kirjaudu Chromeen, niin voit lisätä Googlen suosittelemaa sisältöä.</translation> <translation id="2091887806945687916">Ääni</translation> -<translation id="209354263896846928">Osoitepalkki on näytön alareunassa.</translation> <translation id="2095887075102408547">Kun tämä toiminto on käytössä, Chrome pakkaa lukemasi sivut Googlen palvelimilla ennen niiden lataamista. Suojattuja yhteyksiä (HTTPS) käyttäviä tai incognito-välilehdillä avattuja sivuja ei optimoida eikä Google näe niitä.</translation> <translation id="2100273922101894616">Automaattinen kirjautuminen</translation> <translation id="2111511281910874386">Siirry sivulle</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Tämä tyhjentää yhteensä <ph name="SIZE_IN_KB" /> tallennettuja sivustotietoja.</translation> <translation id="3029613699374795922">Ladattu: <ph name="KBS" /> kt</translation> <translation id="3029704984691124060">Tunnuslauseet eivät vastaa toisiaan.</translation> -<translation id="3030708446010914655">Osoitepalkki on tässä.</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Tutustu ohjeisiin<ph name="END_LINK" /></translation> <translation id="305593374596241526">Sijainti on pois käytöstä. Voit ottaa sen käyttöön <ph name="BEGIN_LINK" />Android-asetuksista<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Muita artikkeleita ilmestyy pian. Nauti aamustasi!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Nollataanko Data Saver?</translation> <translation id="3714981814255182093">Avaa hakupalkki</translation> <translation id="3716182511346448902">Tämä sivu käyttää liikaa muistia, joten Chrome keskeytti sen.</translation> -<translation id="3734660163659757482">Vedä ylös, niin näet esimerkiksi kirjanmerkit</translation> <translation id="3738139272394829648">Koskettamalla hakeminen</translation> <translation id="3739899004075612870">Lisätty kirjanmerkkeihin: <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> Mt muita sovelluksia</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 205858e..7002133 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resulta <ph name="RESULT_NUMBER" /> sa <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Upang makakuha ng naka-personalize na content na iminumungkahi ng Google, mag-sign in sa Chrome.</translation> <translation id="2091887806945687916">Tunog</translation> -<translation id="209354263896846928">I-access ang address bar sa ibaba ng iyong screen</translation> <translation id="2095887075102408547">Kapag naka-on ang feature na ito, gagamitin ng Chrome ang mga server ng Google upang i-compress ang mga page na bibisitahin mo bago i-download ang mga ito. Ang mga page na ina-access gamit ang mga pribadong koneksyon (HTTPS) o sa mga tab na Incognito ay hindi mao-optimize o makikita ng Google.</translation> <translation id="2100273922101894616">Awtomatikong Mag-sign in</translation> <translation id="2111511281910874386">Pumunta sa page</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Iki-clear nito ang lahat ng <ph name="SIZE_IN_KB" /> ng storage ng website.</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB ang na-download</translation> <translation id="3029704984691124060">Hindi nagtutugma ang mga passphrase</translation> -<translation id="3030708446010914655">I-access ang address bar dito</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Humingi ng tulong<ph name="END_LINK" /></translation> <translation id="305593374596241526">Naka-off ang lokasyon; i-on ito sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Marami pang artikulo ang malapit nang lumabas. I-enjoy ang iyong umaga!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">I-reset ang Data Saver?</translation> <translation id="3714981814255182093">Buksan ang Bar sa Paghahanap</translation> <translation id="3716182511346448902">Masyadong malaki ang ginagamit na memory ng page na ito kaya na-pause ito ng Chrome.</translation> -<translation id="3734660163659757482">Hilahin pataas upang makita ang mga bookmark at higit pa</translation> <translation id="3738139272394829648">Pindutin upang Hanapin</translation> <translation id="3739899004075612870">Naka-bookmark sa <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB na iba pang mga app</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 8d5b94f..8d25daf46 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Résultat <ph name="RESULT_NUMBER" /> sur <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Pour obtenir une recommandation de contenu personnalisé de la part de Google, connectez-vous à Chrome.</translation> <translation id="2091887806945687916">Son</translation> -<translation id="209354263896846928">Accédez à la barre d'adresse en bas de l'écran</translation> <translation id="2095887075102408547">Lorsque cette fonctionnalité est activée, les pages consultées dans Chrome sont d'abord compressées via les serveurs Google avant d'être téléchargées. Les pages consultées via des connexions privées (HTTPS) ou en mode navigation privée ne sont pas optimisées ni détectées par Google.</translation> <translation id="2100273922101894616">Connexion automatique</translation> <translation id="2111511281910874386">Accéder à la page</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Cette action aura pour effet de libérer l'espace de stockage utilisé pour les données de site (<ph name="SIZE_IN_KB" />).</translation> <translation id="3029613699374795922"><ph name="KBS" /> Ko téléchargé(s)</translation> <translation id="3029704984691124060">Les phrases secrètes ne correspondent pas.</translation> -<translation id="3030708446010914655">Accédez à la barre d'adresse ici</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obtenir de l'aide<ph name="END_LINK" /></translation> <translation id="305593374596241526">La localisation est désactivée. Activez-la dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">D'autres articles vous seront bientôt proposés. Bonne matinée !</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Réinitialiser l'économiseur de données ?</translation> <translation id="3714981814255182093">Ouvrir la barre de recherche</translation> <translation id="3716182511346448902">Cette page utilise trop de mémoire, Chrome a donc interrompu son chargement.</translation> -<translation id="3734660163659757482">Tirez vers le haut pour afficher les favoris, etc.</translation> <translation id="3738139272394829648">Appuyer pour rechercher</translation> <translation id="3739899004075612870">Favori ajouté dans <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> Mo par d'autres applis</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 7868ae0..4ef0e8a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> में से <ph name="RESULT_NUMBER" /> परिणाम</translation> <translation id="2086652334978798447">Google द्वारा सुझाई गई वैयक्तिकृत सामग्री प्राप्त करने के लिए, Chrome में प्रवेश करें.</translation> <translation id="2091887806945687916">ध्वनि</translation> -<translation id="209354263896846928">अपनी स्क्रीन के नीचे दिया गया पता बार एक्सेस करें</translation> <translation id="2095887075102408547">इस सुविधा के चालू होने पर, Chrome आपके द्वारा देखे जाने वाले पृष्ठों को डाउनलोड करने से पहले संपीड़ित करने के लिए Google सर्वर का उपयोग करेगा. निजी कनेक्शन (HTTPS) या गुप्त टैब का उपयोग करके एक्सेस किए गए पृष्ठों को Google द्वारा ऑप्टिमाइज़ या देखा नहीं जाएगा.</translation> <translation id="2100273922101894616">स्वतः प्रवेश करें</translation> <translation id="2111511281910874386">पेज पर जाएं</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">इससे वेबसाइट की सभी <ph name="SIZE_IN_KB" /> जगह साफ़ हो जाएगी.</translation> <translation id="3029613699374795922"><ph name="KBS" /> केबी डाउनलोड किया गया</translation> <translation id="3029704984691124060">पासफ़्रेज़ मिलान नहीं करते</translation> -<translation id="3030708446010914655">पता बार यहां एक्सेस करें</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />सहायता प्राप्त करें<ph name="END_LINK" /></translation> <translation id="305593374596241526">स्थान सेवा बंद है, उसे <ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में चालू करें.</translation> <translation id="307908932405420782">जल्द ही और लेख दिखाई देंगे. अपनी सुबह का आनंद लें!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">डेटा बचाने का साधन रीसेट करें?</translation> <translation id="3714981814255182093">ढूंढें बार खोलें</translation> <translation id="3716182511346448902">यह पेज बहुत ज़्यादा मेमोरी का इस्तेमाल करता है, इसलिए Chrome ने इसे रोक दिया है.</translation> -<translation id="3734660163659757482">बुकमार्क आदि देखने के लिए ऊपर खींचें</translation> <translation id="3738139272394829648">खोजने के लिए स्पर्श करें</translation> <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> में बुकमार्क किया गया</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB अन्य ऐप्लिकेशन</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 1469b44..77a7392 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> od <ph name="TOTAL_RESULTS" /> rezultata</translation> <translation id="2086652334978798447">Prijavite se u Chrome ako želite da vam Google predlaže sadržaje.</translation> <translation id="2091887806945687916">Zvuk</translation> -<translation id="209354263896846928">Pristupite adresnoj traci u dnu zaslona</translation> <translation id="2095887075102408547">Kada je ta značajka uključena, Chrome će upotrebljavati Googleove poslužitelje kako bi komprimirao posjećene stranice prije preuzimanja. Google neće optimizirati niti vidjeti stranice kojima se pristupa privatnim vezama (HTTPS) ili na anonimnim karticama.</translation> <translation id="2100273922101894616">Automatska prijava</translation> <translation id="2111511281910874386">Idi na stranicu</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Time će se izbrisati cijela pohrana web-lokacije veličine <ph name="SIZE_IN_KB" />.</translation> <translation id="3029613699374795922">Preuzeto <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Zaporke se ne podudaraju</translation> -<translation id="3030708446010914655">Pristupite adresnoj traci ovdje</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Potražite pomoć<ph name="END_LINK" /></translation> <translation id="305593374596241526">Lokacija je isključena. Uključite je u <ph name="BEGIN_LINK" />postavkama Androida<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Uskoro će se prikazati više članaka. Želimo vam ugodno prijepodne!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Želite li vratiti Uštedu podataka na zadano?</translation> <translation id="3714981814255182093">Otvaranje Trake za traženje</translation> <translation id="3716182511346448902">Ova stranica upotrebljava previše memorije, pa ju je Chrome pauzirao.</translation> -<translation id="3734660163659757482">Povucite prema gore da biste vidjeli oznake i još mnogo toga</translation> <translation id="3738139272394829648">Dodirnite za pretraživanje</translation> <translation id="3739899004075612870">Označeno u pregledniku <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB ostale aplikacije</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 b9ff2cf8..6fc9515 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Eredmény: <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">A Google által javasolt, személyre szabott tartalmak fogadásához jelentkezzen be a Chrome-ba.</translation> <translation id="2091887806945687916">Hang</translation> -<translation id="209354263896846928">Nyissa meg a képernyő alján található címsávot</translation> <translation id="2095887075102408547">Amikor ezt a funkciót bekapcsolja, a Chrome a Google-szerverek segítségével tömöríti az Ön által felkeresett oldalakat, mielőtt letöltené azokat. A privát kapcsolat (HTTPS) használatával, illetve az inkognitómódban megtekintett oldalakat a Google nem látja és nem optimalizálja.</translation> <translation id="2100273922101894616">Automatikus bejelentkezés</translation> <translation id="2111511281910874386">Ugrás az oldalhoz</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Ezzel törli a webhely teljes tárhelyét: <ph name="SIZE_IN_KB" />.</translation> <translation id="3029613699374795922"><ph name="KBS" /> kB letöltve</translation> <translation id="3029704984691124060">Az összetett jelszavak nem egyeznek</translation> -<translation id="3030708446010914655">Nyissa meg itt a címsávot</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Kérjen segítséget<ph name="END_LINK" /></translation> <translation id="305593374596241526">A Helyadatok szolgáltatás ki van kapcsolva; bekapcsolhatja az <ph name="BEGIN_LINK" />Android-beállításokban<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Hamarosan további cikkek jelennek meg. Kellemes délelőttöt kívánunk!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Alaphelyzetbe állítja az Adatforgalom-csökkentőt?</translation> <translation id="3714981814255182093">A keresősáv megnyitása</translation> <translation id="3716182511346448902">Ez az oldal túl sok memóriát használ, ezért a Chrome szünetelteti.</translation> -<translation id="3734660163659757482">Húzza fel a könyvjelzők és egyéb tartalmak megtekintéséhez</translation> <translation id="3738139272394829648">Érintéssel keresés</translation> <translation id="3739899004075612870">Felvéve a(z) <ph name="PRODUCT_NAME" /> könyvjelzői közé</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB más alkalmazások által</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 6e7c7ae6..eac3725 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Hasil <ph name="RESULT_NUMBER" /> dari <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Untuk mendapatkan konten hasil personalisasi yang disarankan oleh Google, masuk ke Chrome.</translation> <translation id="2091887806945687916">Suara</translation> -<translation id="209354263896846928">Akses kolom URL di bagian bawah halaman</translation> <translation id="2095887075102408547">Saat fitur ini diaktifkan, Chrome akan menggunakan server Google untuk mengompresi halaman yang Anda kunjungi sebelum mendownloadnya. Halaman yang diakses menggunakan sambungan pribadi (HTTPS) atau tab Penyamaran tidak akan dioptimalkan maupun dilihat oleh Google.</translation> <translation id="2100273922101894616">Masuk Otomatis</translation> <translation id="2111511281910874386">Buka halaman</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Tindakan ini akan menghapus <ph name="SIZE_IN_KB" /> seluruhnya dari penyimpanan situs web.</translation> <translation id="3029613699374795922">Terdownload <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Frasa sandi tidak cocok</translation> -<translation id="3030708446010914655">Akses kolom URL di sini</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Dapatkan bantuan<ph name="END_LINK" /></translation> <translation id="305593374596241526">Lokasi nonaktif, aktifkan di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Artikel lainnya akan segera muncul. Selamat beraktivitas pagi!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Setel ulang Penghemat Kuota Internet?</translation> <translation id="3714981814255182093">Membuka Bilah Cari</translation> <translation id="3716182511346448902">Halaman ini menggunakan terlalu banyak memori, sehingga Chrome menjedanya.</translation> -<translation id="3734660163659757482">Tarik ke atas untuk melihat bookmark dan lainnya</translation> <translation id="3738139272394829648">Sentuh untuk Menelusuri</translation> <translation id="3739899004075612870">Dibookmark di <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB aplikasi lain</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 82ddce2d..d9ec937c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Risultato <ph name="RESULT_NUMBER" /> di <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Per ricevere contenuti suggeriti appositamente per te da Google, accedi a Chrome.</translation> <translation id="2091887806945687916">Audio</translation> -<translation id="209354263896846928">Accedi alla barra degli indirizzi nella parte inferiore dello schermo</translation> <translation id="2095887075102408547">Quando questa funzione è attiva, Chrome utilizza i server di Google per comprimere le pagine che visiti prima di scaricarle. Le pagine visitate utilizzando connessioni private (HTTPS) o in schede di navigazione in incognito non vengono ottimizzate o viste da Google.</translation> <translation id="2100273922101894616">Accesso automatico</translation> <translation id="2111511281910874386">Vai alla pagina</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Verranno cancellati tutti i <ph name="SIZE_IN_KB" /> di memoria utilizzata dai siti web.</translation> <translation id="3029613699374795922">Sono stati scricati <ph name="KBS" /> kB</translation> <translation id="3029704984691124060">Le passphrase non corrispondono</translation> -<translation id="3030708446010914655">Accedi qui alla barra degli indirizzi</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Richiedi assistenza<ph name="END_LINK" /></translation> <translation id="305593374596241526">La geolocalizzazione non è attiva; attivala nelle <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">A breve verranno visualizzati altri articoli. Buona giornata.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Vuoi reimpostare il Risparmio dati?</translation> <translation id="3714981814255182093">Apri la barra Trova</translation> <translation id="3716182511346448902">Questa pagina è stata messa in pausa da Chromium perché utilizza troppa memoria.</translation> -<translation id="3734660163659757482">Trascina verso l'alto per visualizzare i preferiti e non solo</translation> <translation id="3738139272394829648">Tocca per cercare</translation> <translation id="3739899004075612870">Aggiunto ai preferiti di <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB per altre app</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 f3675c33..3fa1496d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">תוצאה <ph name="RESULT_NUMBER" /> מתוך <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">כדי לקבל מ-Google הצעות לתוכן מותאם אישית, היכנס אל Chrome.</translation> <translation id="2091887806945687916">צליל</translation> -<translation id="209354263896846928">סרגל הכתובות נמצא בחלק התחתון של המסך</translation> <translation id="2095887075102408547">כשהתכונה הזו פועלת, Chrome ישתמש בשרתי Google כדי לדחוס דפים שבהם אתה מבקר לפני הורדתם. Google לא תראה דפים שהגישה אליהם בוצעה בחיבור פרטי (HTTPS) או בכרטיסיות גלישה בסתר', וגם לא תבצע אופטימיזציה שלהם.</translation> <translation id="2100273922101894616">כניסה אוטומטית</translation> <translation id="2111511281910874386">מעבר לדף</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">פעולה זו תמחק את כל נתוני האתר המאוחסנים (<ph name="SIZE_IN_KB" />).</translation> <translation id="3029613699374795922">בוצעה הורדה של KB <ph name="KBS" /></translation> <translation id="3029704984691124060">ביטויי הסיסמה אינם תואמים</translation> -<translation id="3030708446010914655">סרגל הכתובות נמצא כאן</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />קבל עזרה<ph name="END_LINK" /></translation> <translation id="305593374596241526">הגישה למיקום כבויה. יש להפעיל אותה ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">בקרוב יופיעו מאמרים נוספים. שיהיה לך בוקר נפלא!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">לאפס את חוסך הנתונים (Data Saver)?</translation> <translation id="3714981814255182093">פתח את סרגל החיפוש</translation> <translation id="3716182511346448902">הדף הזה מנצל יותר מדי זיכרון, כך שהוא הושהה על-ידי Chrome.</translation> -<translation id="3734660163659757482">משוך למעלה כדי להציג סימניות ותוכן נוסף</translation> <translation id="3738139272394829648">גע כדי לחפש</translation> <translation id="3739899004075612870">נוסף לסימניות ב-<ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB ליישומים אחרים</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 845fdf5..3086e973 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">結果 <ph name="TOTAL_RESULTS" /> 件中 <ph name="RESULT_NUMBER" /> 件目</translation> <translation id="2086652334978798447">ユーザーに合わせた Google からのおすすめコンテンツを表示するには、Chrome にログインします。</translation> <translation id="2091887806945687916">音声</translation> -<translation id="209354263896846928">アドレスバーは画面下部にあります</translation> <translation id="2095887075102408547">この機能が有効になっている場合、アクセスしたページはダウンロード前に Google サーバーで圧縮されます。プライベート接続(HTTPS)やシークレット タブでアクセスしたページには、Google による最適化や確認は行われません。</translation> <translation id="2100273922101894616">自動ログイン</translation> <translation id="2111511281910874386">ページを開く</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">ウェブサイトのストレージ <ph name="SIZE_IN_KB" /> をすべて消去します。</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB をダウンロード済み</translation> <translation id="3029704984691124060">パスフレーズが一致しません</translation> -<translation id="3030708446010914655">アドレスバーはこちらです</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />ヘルプ<ph name="END_LINK" /></translation> <translation id="305593374596241526">位置情報が OFF になっています。<ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />で ON にしてください。</translation> <translation id="307908932405420782">記事は随時更新されます。また後でご覧ください。</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">データセーバーをリセットしますか?</translation> <translation id="3714981814255182093">検索バーを開く</translation> <translation id="3716182511346448902">このページは大量のメモリを使用しているため、Chrome により一時停止されました。</translation> -<translation id="3734660163659757482">上にスワイプしてブックマークなどを表示</translation> <translation id="3738139272394829648">タップして検索</translation> <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> にブックマークしました</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB を他のアプリで使用中</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 3191ba8..5bb9e052 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">전체 결과 <ph name="TOTAL_RESULTS" />개 중 <ph name="RESULT_NUMBER" />개</translation> <translation id="2086652334978798447">Google에서 추천한 맞춤설정 콘텐츠를 받으려면 Chrome에 로그인합니다.</translation> <translation id="2091887806945687916">소리</translation> -<translation id="209354263896846928">화면 하단에서 검색주소창에 액세스하세요</translation> <translation id="2095887075102408547">이 기능을 사용 설정하면 Chrome은 Google 서버를 이용해 방문한 페이지를 압축한 후 다운로드합니다. 비공개 연결(HTTPS)이나 시크릿 탭을 통해 액세스한 페이지는 Google에서 최적화하거나 볼 수 없습니다.</translation> <translation id="2100273922101894616">자동 로그인</translation> <translation id="2111511281910874386">페이지로 이동</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">웹사이트 저장공간 <ph name="SIZE_IN_KB" />가 모두 삭제됩니다.</translation> <translation id="3029613699374795922"><ph name="KBS" />KB 다운로드됨</translation> <translation id="3029704984691124060">암호가 일치하지 않습니다.</translation> -<translation id="3030708446010914655">여기에서 검색주소창에 액세스하세요</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />도움 받기<ph name="END_LINK" /></translation> <translation id="305593374596241526">위치가 사용 중지되었습니다. <ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 사용 설정하세요.</translation> <translation id="307908932405420782">더 많은 콘텐츠가 표시될 예정이니 기대해 주세요. 즐거운 아침 시간 보내세요.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">데이터 절약 모드를 초기화하시겠습니까?</translation> <translation id="3714981814255182093">찾기 창 열기</translation> <translation id="3716182511346448902">페이지에서 너무 많은 메모리를 사용하므로 Chrome에서 페이지를 일시중지했습니다.</translation> -<translation id="3734660163659757482">북마크 등을 보려면 위로 당기세요</translation> <translation id="3738139272394829648">터치하여 검색</translation> <translation id="3739899004075612870"><ph name="PRODUCT_NAME" />에 북마크됨</translation> <translation id="3744111309925758534">기타 앱 <ph name="MEGABYTES" />MB</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 c4700d8b..27aa146 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Rezultatų: <ph name="RESULT_NUMBER" /> iš <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Jei norite gauti „Google“ siūlomo suasmeninto turinio, prisijunkite prie „Chrome“.</translation> <translation id="2091887806945687916">Garsas</translation> -<translation id="209354263896846928">Pasiekite adreso juostą, esančią ekrano apačioje</translation> <translation id="2095887075102408547">Kai ši funkcija įjungta, „Chrome“ naudoja „Google“ serverius, kad glaudintų puslapius, kuriuose lankotės, prieš juos atsisiųsdama. Puslapių, kurie buvo pasiekti naudojant privačius ryšius (HTTPS) ar inkognito skirtukų lapus, „Google“ neoptimizuos ir nematys.</translation> <translation id="2100273922101894616">Automatinis prisijungimas</translation> <translation id="2111511281910874386">Eiti į puslapį</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Bus išvalyta visa <ph name="SIZE_IN_KB" /> svetainės saugykla.</translation> <translation id="3029613699374795922">Atsisiųsta <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Slaptafrazės neatitinka</translation> -<translation id="3030708446010914655">Pasiekite adreso juostą čia</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Gaukite pagalbos<ph name="END_LINK" /></translation> <translation id="305593374596241526">Vieta išjungta; įjunkite <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Netrukus bus rodoma daugiau straipsnių. Gero ryto!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Iš naujo nustatyti Duomenų taupymo priemonę?</translation> <translation id="3714981814255182093">Atidaryti radimo juostą</translation> <translation id="3716182511346448902">Šis puslapis naudoja per daug atminties, todėl „Chrome“ jį pristabdė.</translation> -<translation id="3734660163659757482">Patraukite aukštyn, kad būtų rodomos žymės ir daugiau</translation> <translation id="3738139272394829648">Paieška palietus</translation> <translation id="3739899004075612870">Pažymėta naršyklėje „<ph name="PRODUCT_NAME" />“</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB užima kitos programos</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 fc30557..28d622f2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultāts no <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Lai saņemtu Google ieteikto personalizēto saturu, pierakstieties pārlūkā Chrome.</translation> <translation id="2091887806945687916">Signāls</translation> -<translation id="209354263896846928">Piekļūstiet adreses joslai ekrāna apakšdaļā</translation> <translation id="2095887075102408547">Ja šī funkcija ir ieslēgta, Chrome izmanto Google serverus, lai saspiestu jūsu apmeklētās lapas pirms to lejupielādes. Ja lapu atvēršanai tiek izmantots privāts savienojums (HTTPS) vai inkognito režīms, tās netiek optimizētas un Google tās nevar skatīt.</translation> <translation id="2100273922101894616">Automātiski pierakstīties</translation> <translation id="2111511281910874386">Doties uz lapu</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Tādējādi tiks notīrīti visi vietnes krātuves dati (<ph name="SIZE_IN_KB" />).</translation> <translation id="3029613699374795922">Lejupielādēts: <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Ieejas frāzes neatbilst.</translation> -<translation id="3030708446010914655">Piekļūstiet adreses joslai šeit.</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Saņemt palīdzību<ph name="END_LINK" /></translation> <translation id="305593374596241526">Atrašanās vietu noteikšana ir izslēgta. Ieslēdziet to <ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Drīzumā būs pieejami citi raksti. Jauku rītu!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Vai atiestatīt datu lietojuma samazinātāju?</translation> <translation id="3714981814255182093">Atvērt atrašanas joslu</translation> <translation id="3716182511346448902">Šī lapa izmanto pārāk daudz atmiņas, tādēļ Chrome to apturēja.</translation> -<translation id="3734660163659757482">Velciet augšup, lai skatītu grāmatzīmes un citu saturu</translation> <translation id="3738139272394829648">Meklēšana pieskaroties</translation> <translation id="3739899004075612870">Pievienota grāmatzīme pārlūkā <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534">Citas lietotnes: <ph name="MEGABYTES" /> MB</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 a5fe762f..046414c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultaat <ph name="RESULT_NUMBER" /> van <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Log in bij Chrome om suggesties met gepersonaliseerde content van Google te ontvangen.</translation> <translation id="2091887806945687916">Geluid</translation> -<translation id="209354263896846928">Je hebt onderaan je scherm toegang tot de adresbalk</translation> <translation id="2095887075102408547">Als deze functie is ingeschakeld, gebruikt Chrome Google-servers om pagina's die je bezoekt, te comprimeren voordat ze worden gedownload. Pagina's die worden geopend via privéverbindingen (HTTPS) of op incognitotabbladen, worden niet geoptimaliseerd of gezien door Google.</translation> <translation id="2100273922101894616">Automatisch inloggen</translation> <translation id="2111511281910874386">Ga naar pagina</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Hiermee wordt de volledige <ph name="SIZE_IN_KB" /> aan site-opslag gewist.</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB gedownload</translation> <translation id="3029704984691124060">Wachtwoordzinnen komen niet overeen</translation> -<translation id="3030708446010914655">Hier heb je toegang tot de adresbalk</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Hulp krijgen<ph name="END_LINK" /></translation> <translation id="305593374596241526">Locatie is uitgeschakeld. Je kunt dit inschakelen in de <ph name="BEGIN_LINK" />instellingen van Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Er worden binnenkort meer artikelen weergegeven. Geniet van je ochtend.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Databesparing resetten?</translation> <translation id="3714981814255182093">De zoekbalk openen</translation> <translation id="3716182511346448902">Omdat deze pagina te veel geheugen gebruikt, heeft Chrome de pagina onderbroken.</translation> -<translation id="3734660163659757482">Trek omhoog om bladwijzers en meer te bekijken</translation> <translation id="3738139272394829648">Tikken om te zoeken</translation> <translation id="3739899004075612870">Bladwijzer toegevoegd in <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB voor andere apps</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 3988469..b1a635a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">For å få forslag om personlig tilpasset innhold fra Google, logg på Chrome.</translation> <translation id="2091887806945687916">Lyd</translation> -<translation id="209354263896846928">Du finner adressefeltet nederst på skjermen</translation> <translation id="2095887075102408547">Når denne funksjonen er slått på, blir sidene du besøker, komprimert på Googles tjenere før de lastes ned til Chrome. Google verken ser eller optimaliserer sider som åpnes med private tilkoblinger (HTTPS) eller i inkognitofaner.</translation> <translation id="2100273922101894616">Automatisk pålogging</translation> <translation id="2111511281910874386">Gå til side</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Dette sletter alle dataene (<ph name="SIZE_IN_KB" />) fra nettstedslagringen.</translation> <translation id="3029613699374795922"><ph name="KBS" /> kB er lastet ned</translation> <translation id="3029704984691124060">Passordfrasene stemmer ikke overens</translation> -<translation id="3030708446010914655">Du finner adressefeltet her</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjelp<ph name="END_LINK" /></translation> <translation id="305593374596241526">Posisjon er slått av. Slå den på i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Flere artikler kommer snart. Ha en fin morgen.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Vil du tilbakestille Datasparing?</translation> <translation id="3714981814255182093">Åpne søkeraden</translation> <translation id="3716182511346448902">Denne siden bruker for mye minne, så Chrome har satt den på pause.</translation> -<translation id="3734660163659757482">Dra oppover for å se bokmerker og andre ting</translation> <translation id="3738139272394829648">Trykk for å søke</translation> <translation id="3739899004075612870">Satt som bokmerke i <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB andre apper</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 2e7111c..dd21c14f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Wynik <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Aby uzyskać dostęp do spersonalizowanej treści proponowanej przez Google, zaloguj się w Chrome.</translation> <translation id="2091887806945687916">Dźwięk</translation> -<translation id="209354263896846928">Użyj paska adresu u dołu ekranu</translation> <translation id="2095887075102408547">Kiedy ta funkcja jest włączona, Chrome korzysta z serwerów Google, by kompresować strony przed ich pobraniem. Google nie optymalizuje ani nie widzi stron, z którymi łączysz się przez HTTPS lub które przeglądasz na kartach incognito.</translation> <translation id="2100273922101894616">Autologowanie</translation> <translation id="2111511281910874386">Przejdź do strony</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Spowoduje to usunięcie <ph name="SIZE_IN_KB" /> danych witryn.</translation> <translation id="3029613699374795922">Pobrano <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Hasła nie pasują do siebie</translation> -<translation id="3030708446010914655">Użyj paska adresu tutaj</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Poproś o pomoc<ph name="END_LINK" /></translation> <translation id="305593374596241526">Lokalizacja jest wyłączona. Włącz ją w <ph name="BEGIN_LINK" />Ustawieniach Androida<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Wkrótce pojawi się więcej artykułów. Życzymy miłego poranka.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Zresetować Oszczędzanie danych?</translation> <translation id="3714981814255182093">Otwórz pasek wyszukiwania</translation> <translation id="3716182511346448902">Ta strona używa zbyt dużo pamięci, dlatego została wstrzymana w Chrome.</translation> -<translation id="3734660163659757482">Przeciągnij w górę, by zobaczyć zakładki i inne elementy</translation> <translation id="3738139272394829648">Dotknij, by wyszukać</translation> <translation id="3739899004075612870">Utworzono zakładkę w: <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB innych aplikacji</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 0a166cc..f497fe1 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
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Para receber conteúdo personalizado sugerido pelo Google, faça login no Chrome.</translation> <translation id="2091887806945687916">Som</translation> -<translation id="209354263896846928">Acesse a barra de endereço na parte inferior da tela</translation> <translation id="2095887075102408547">Este recurso funciona assim: usamos os servidores do Google para compactar as páginas que você visita antes de fazer o download delas. O Google então lê e otimiza esses dados. (não funciona em páginas HTTPS e nem em guias anônimas)</translation> <translation id="2100273922101894616">Login automático</translation> <translation id="2111511281910874386">Ir para a página</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Essa ação limpará todos <ph name="SIZE_IN_KB" /> de dados de armazenamento de website.</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB transferido(s) por download</translation> <translation id="3029704984691124060">As senhas não correspondem</translation> -<translation id="3030708446010914655">Acesse a barra de endereço aqui</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Receber ajuda<ph name="END_LINK" /></translation> <translation id="305593374596241526">A Localização está desativada. Ative-a nas <ph name="BEGIN_LINK" />configurações do Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Mais artigos serão exibidos em breve. Aproveite a manhã.</translation> @@ -294,7 +292,6 @@ <translation id="3712575778697986964">Redefinir a Economia de dados?</translation> <translation id="3714981814255182093">Abrir a barra Localizar</translation> <translation id="3716182511346448902">Como esta página usa muita memória, o Chrome a pausou.</translation> -<translation id="3734660163659757482">Deslize para cima para ver favoritos e mais</translation> <translation id="3738139272394829648">Tocar para pesquisar</translation> <translation id="3739899004075612870">Adicionado aos favoritos no <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB de outros apps</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 ef8a575..bb185e8 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
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Para obter conteúdo personalizado sugerido pelo Google, inicie sessão no Chrome.</translation> <translation id="2091887806945687916">Som</translation> -<translation id="209354263896846928">Aceda à barra de endereço na parte inferior do ecrã.</translation> <translation id="2095887075102408547">Quando esta funcionalidade está ativada, o Chrome utiliza os servidores da Google para comprimir as páginas visitadas antes de as transferir. As páginas acedidas através de ligações privadas (HTTPS) ou em separadores de navegação anónima não são otimizadas ou vistas pela Google.</translation> <translation id="2100273922101894616">Início de sessão automático</translation> <translation id="2111511281910874386">Ir para a página</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Esta ação elimina os <ph name="SIZE_IN_KB" /> de armazenamento do Website.</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB transferido(s)</translation> <translation id="3029704984691124060">As frases de acesso não coincidem</translation> -<translation id="3030708446010914655">Aceda à barra de endereço aqui.</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obter ajuda<ph name="END_LINK" /></translation> <translation id="305593374596241526">A localização está desativada. Ative-a nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Serão apresentados mais artigos em breve. Desfrute da sua manhã!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Pretende repor a Poupança de dados?</translation> <translation id="3714981814255182093">Abrir a barra Localizar</translation> <translation id="3716182511346448902">Esta página utiliza demasiada memória, pelo que o Chrome a colocou em pausa.</translation> -<translation id="3734660163659757482">Puxe para cima para ver marcadores e muito mais.</translation> <translation id="3738139272394829648">Tocar para pesquisar</translation> <translation id="3739899004075612870">Adicionado aos marcadores no <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB de outras aplicações</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 cd96beb3..1986648 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Rezultatul <ph name="RESULT_NUMBER" /> din <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Pentru a obține sugestii de conținut personalizat de la Google, conectează-te la Chrome.</translation> <translation id="2091887806945687916">Sunet</translation> -<translation id="209354263896846928">Accesează bara de adrese din partea de jos a ecranului</translation> <translation id="2095887075102408547">Când această funcție este activată, Chrome va folosi serverele Google pentru a comprima paginile pe care le accesezi înainte de a le descărca. Paginile accesate folosind conexiuni private (HTTPS) sau în file incognito nu vor fi optimizate sau detectate de Google.</translation> <translation id="2100273922101894616">Conectare automată</translation> <translation id="2111511281910874386">Accesează pagina</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Astfel, se vor șterge <ph name="SIZE_IN_KB" /> din stocarea site-urilor.</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB descărcați</translation> <translation id="3029704984691124060">Expresiile de acces nu corespund</translation> -<translation id="3030708446010914655">Accesează bara de adrese aici</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obține ajutor<ph name="END_LINK" /></translation> <translation id="305593374596241526">Locația este dezactivată; activeaz-o în <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">În curând vor apărea mai multe articole. O dimineață plăcută!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Resetezi Economizorul de date?</translation> <translation id="3714981814255182093">Deschide Bara de căutare</translation> <translation id="3716182511346448902">Această pagină folosește prea multă memorie, prin urmare Chrome a întrerupt-o.</translation> -<translation id="3734660163659757482">Trage în sus ca să vezi marcajele și altele</translation> <translation id="3738139272394829648">Atinge pentru a căuta</translation> <translation id="3739899004075612870">Marcat în <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB pentru alte aplicații</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 0f5adf5..2b5d91e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" />, всего <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Чтобы мы могли рекомендовать вам интересный контент, войдите в свой аккаунт в Chrome.</translation> <translation id="2091887806945687916">Звук</translation> -<translation id="209354263896846928">Адресная строка расположена в нижней части экрана.</translation> <translation id="2095887075102408547">Если вы включите эту функцию, серверы Google начнут сжимать данные перед показом веб-страниц в Chrome. Это не касается данных, полученных по протоколу HTTPS и в режиме инкогнито.</translation> <translation id="2100273922101894616">Автоматический вход</translation> <translation id="2111511281910874386">Перейти на страницу</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Будут удалены все данные сайтов (<ph name="SIZE_IN_KB" />).</translation> <translation id="3029613699374795922">Скачано <ph name="KBS" /> КБ</translation> <translation id="3029704984691124060">Кодовые фразы не совпадают</translation> -<translation id="3030708446010914655">Как найти адресную строку</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Справка<ph name="END_LINK" /></translation> <translation id="305593374596241526">Определение местоположения отключено. Включите его в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Другие статьи скоро появятся. Хорошего утра!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Сбросить статистику?</translation> <translation id="3714981814255182093">Открыть панель поиска</translation> <translation id="3716182511346448902">Эта страница расходовала слишком много памяти, поэтому работа ее скриптов была приостановлена.</translation> -<translation id="3734660163659757482">Потяните вверх, чтобы увидеть закладки и другие данные</translation> <translation id="3738139272394829648">Быстрый поиск</translation> <translation id="3739899004075612870"><ph name="PRODUCT_NAME" />: добавлена закладка</translation> <translation id="3744111309925758534">Другие приложения: <ph name="MEGABYTES" /> МБ</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 a31231e..82bd1ab2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Výsledok <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Ak chcete získavať prispôsobený obsah navrhnutý Googlom, prihláste sa do Chromu.</translation> <translation id="2091887806945687916">Zvuk</translation> -<translation id="209354263896846928">Prejdite na panel s adresou v dolnej časti obrazovky</translation> <translation id="2095887075102408547">Keď je táto funkcia zapnutá, Chrome navštívené stránky pred stiahnutím komprimuje pomocou serverov Google. Stránky navštívené pomocou súkromných pripojení (HTTPS) alebo v rámci kariet inkognito nebudú optimalizované ani viditeľné pre Google.</translation> <translation id="2100273922101894616">Automatické prihlasovanie</translation> <translation id="2111511281910874386">Prejdite na stránku</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Táto akcia vymaže dáta z úložiska webu (celkovo: <ph name="SIZE_IN_KB" />).</translation> <translation id="3029613699374795922">Stiahnuté: <ph name="KBS" /> kB</translation> <translation id="3029704984691124060">Prístupové frázy sa nezhodujú</translation> -<translation id="3030708446010914655">Tu prejdite na panel s adresou</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Získať pomoc<ph name="END_LINK" /></translation> <translation id="305593374596241526">Poloha je vypnutá. Zapnite ju v <ph name="BEGIN_LINK" />Nastaveniach Androidu<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Čoskoro sa zobrazia ďalšie články. Dobré ráno!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Resetovať Šetrič dát?</translation> <translation id="3714981814255182093">Otvorenie Panela vyhľadávania</translation> <translation id="3716182511346448902">Táto stránka využíva príliš veľa pamäte, a preto ju Chrome pozastavil.</translation> -<translation id="3734660163659757482">Potiahnite nahor a uvidíte záložky a ďalší obsah</translation> <translation id="3738139272394829648">Vyhľadávanie klepnutím</translation> <translation id="3739899004075612870">Pridané do záložiek <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534">Ďalšie aplikácie: <ph name="MEGABYTES" /> MB</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 45a09148..4ea53f0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultat od <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Če želite prejemati prilagojeno vsebino, ki jo predlaga Google, se prijavite v Chrome.</translation> <translation id="2091887806945687916">Zvok</translation> -<translation id="209354263896846928">Naslovna vrstica je dostopna na dnu zaslona</translation> <translation id="2095887075102408547">Ko je ta funkcija vklopljena, Chrome strani, ki jih obiščete, pred prenosom stisne z uporabo Googlovih strežnikov. Strani, do katerih dostopate prek zasebnih povezav (HTTPS) ali jih odprete na zavihkih brez beleženja zgodovina, Google ne vidi in jih ne optimizira.</translation> <translation id="2100273922101894616">Samodejna prijava</translation> <translation id="2111511281910874386">Pojdi na stran</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">S tem bo izbrisanih vseh toliko shranjenih podatkov spletnega mesta: <ph name="SIZE_IN_KB" />.</translation> <translation id="3029613699374795922">Preneseno <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Gesli se ne ujemata</translation> -<translation id="3030708446010914655">Naslovna vrstica je dostopna tukaj</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Poiščite pomoč<ph name="END_LINK" /></translation> <translation id="305593374596241526">Lokacija je izklopljena. Vklopite jo lahko v <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Kmalu bo prikazanih več člankov. Prijetno jutro.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Želite ponastaviti varčevanje s podatki?</translation> <translation id="3714981814255182093">Odpiranje vrstice za iskanje</translation> <translation id="3716182511346448902">Ta stran uporablja preveč pomnilnika, zato jo je Chrome zaustavil.</translation> -<translation id="3734660163659757482">Povlecite navzgor, če si želite ogledati zaznamke in drugo</translation> <translation id="3738139272394829648">Dotaknite se za iskanje</translation> <translation id="3739899004075612870">Dodano med zaznamke v izdelku <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB drugih aplikacij</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 6a1875d..14f236d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. од <ph name="TOTAL_RESULTS" /> резултата</translation> <translation id="2086652334978798447">Да бисте добијали персонализовани садржај који предлаже Google, пријавите се у Chrome.</translation> <translation id="2091887806945687916">Звук</translation> -<translation id="209354263896846928">Приступајте траци за адресу у дну екрана</translation> <translation id="2095887075102408547">Када укључите ову функцију, Chrome користи Google сервере да би компримовао странице које посећујете пре него што их преузме. Google неће оптимизовати нити видети странице којима приступате помоћу приватних веза (HTTPS) или на картицама Без архивирања.</translation> <translation id="2100273922101894616">Аутоматско пријављивање</translation> <translation id="2111511281910874386">Иди на страницу</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Овим ћете обрисати цео меморијски простор веб-сајта од <ph name="SIZE_IN_KB" />.</translation> <translation id="3029613699374795922">Преузели сте <ph name="KBS" /> kB</translation> <translation id="3029704984691124060">Приступне фразе се не подударају</translation> -<translation id="3030708446010914655">Приступајте траци за адресу овде</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Потражите помоћ<ph name="END_LINK" /></translation> <translation id="305593374596241526">Локација је искључена; укључите је у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Још чланака ће се појавити ускоро. Желимо вам пријатно јутро!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Желите ли да ресетујете Уштеду података?</translation> <translation id="3714981814255182093">Отварање траке за тражење</translation> <translation id="3716182511346448902">Ова страница користи превише меморије, па ју је Chrome паузирао.</translation> -<translation id="3734660163659757482">Повуците нагоре за обележиваче и још опција</translation> <translation id="3738139272394829648">Додирни за претрагу</translation> <translation id="3739899004075612870">Обележено у <ph name="PRODUCT_NAME" />-у</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB – друге апликације</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 2fb977e0..7311ceec 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Logga in i Chrome om du vill få förslag på anpassat innehåll från Google.</translation> <translation id="2091887806945687916">Ljud</translation> -<translation id="209354263896846928">Adressfältet finns längst ned på skärmen</translation> <translation id="2095887075102408547">När den här funktionen är aktiverad komprimerar Chrome sidor som du besöker med hjälp av Googles servrar innan de laddas ned. Sidor som öppnas via privata anslutningar (HTTPS) eller i inkognitoflikar varken optimeras eller visas av Google.</translation> <translation id="2100273922101894616">Automatisk inloggning</translation> <translation id="2111511281910874386">Öppna sida</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Det här alternativet tar bort alla <ph name="SIZE_IN_KB" /> webbplatslagring.</translation> <translation id="3029613699374795922"><ph name="KBS" /> kB har laddats ned</translation> <translation id="3029704984691124060">Lösenfraserna matchar inte</translation> -<translation id="3030708446010914655">Här finns adressfältet</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjälp<ph name="END_LINK" /></translation> <translation id="305593374596241526">Plats har inaktiverats. Aktivera det i <ph name="BEGIN_LINK" />Android-inställningarna<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Fler artiklar visas snart. Ha en bra förmiddag!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Vill du återställa Databesparing?</translation> <translation id="3714981814255182093">Öppna sökfältet</translation> <translation id="3716182511346448902">Den här sidan har pausats i Chrome eftersom den använder för mycket minne.</translation> -<translation id="3734660163659757482">Bokmärken med mera visas om du drar uppåt</translation> <translation id="3738139272394829648">Tryck för att söka</translation> <translation id="3739899004075612870">Bokmärket har lagts till i <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB används av övriga appar</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 53a1415..45f8e75 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Tokeo <ph name="RESULT_NUMBER" /> kati ya <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Ili Google ikupendekezee maudhui yanayokufaa, ingia katika Chrome.</translation> <translation id="2091887806945687916">Sauti</translation> -<translation id="209354263896846928">Fikia sehemu ya anwani kwenye sehemu ya chini ya skrini yako</translation> <translation id="2095887075102408547">Kipengele hiki kikiwashwa, Chrome itatumia seva za Google kushindilia kurasa unazotembelea kabla ya kuzipakua. Kurasa zinazofikiwa kwa kutumia miunganisho ya faragha (HTTPS) au vichupo vya Hali Fiche hazitaboreshwa wala kuonekana na Google.</translation> <translation id="2100273922101894616">Ingia katika Akaunti Kiotomatiki</translation> <translation id="2111511281910874386">Nenda kwenye ukurasa</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Hatua hii itafuta <ph name="SIZE_IN_KB" /> yote ya hifadhi ya tovuti.</translation> <translation id="3029613699374795922">Umepakua KB <ph name="KBS" /></translation> <translation id="3029704984691124060">Kaulisiri hazilingani</translation> -<translation id="3030708446010914655">Fikia sehemu ya anwani hapa</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Pata usaidizi<ph name="END_LINK" /></translation> <translation id="305593374596241526">Kipengele cha mahali kimezimwa; kiwashe katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Makala zaidi yataonekana hivi karibuni. Asubuhi njema!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Ungependa kuweka upya takwimu za Kiokoa Data?</translation> <translation id="3714981814255182093">Fungua Upau wa Kutafuta</translation> <translation id="3716182511346448902">Ukurasa huu unatumia hifadhi kubwa zaidi, kwa hivyo Chrome imeusitisha.</translation> -<translation id="3734660163659757482">Telezesha kwenda juu uone alamisho na mengineyo</translation> <translation id="3738139272394829648">Gusa ili Utafute</translation> <translation id="3739899004075612870">Imealamishwa katika <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534">Programu nyingine za MB <ph name="MEGABYTES" /></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 e0ab067c..4d67eea9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">ผลลัพธ์ <ph name="RESULT_NUMBER" /> จาก <ph name="TOTAL_RESULTS" /> รายการ</translation> <translation id="2086652334978798447">หากต้องการรับคำแนะนำเนื้อหาที่เหมาะสำหรับคุณจาก Google ให้ลงชื่อเข้าใช้ Chrome</translation> <translation id="2091887806945687916">เสียง</translation> -<translation id="209354263896846928">ไปที่แถบที่อยู่เว็บที่ด้านล่างของหน้าจอ</translation> <translation id="2095887075102408547">เมื่อเปิดฟีเจอร์นี้ Chrome จะใช้เซิร์ฟเวอร์ของ Google ในการบีบอัดหน้าเว็บที่คุณเข้าชมก่อนที่จะดาวน์โหลดหน้าเหล่านั้น Google จะมองไม่เห็นและไม่เพิ่มประสิทธิภาพหน้าที่เข้าถึงโดยใช้การเชื่อมต่อส่วนตัว (HTTPS) หรือแท็บไม่ระบุตัวตน</translation> <translation id="2100273922101894616">ลงชื่อเข้าใช้อัตโนมัติ</translation> <translation id="2111511281910874386">ไปที่หน้า</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">การดำเนินการนี้จะล้างพื้นที่เก็บข้อมูลเว็บไซต์ทั้ง <ph name="SIZE_IN_KB" /></translation> <translation id="3029613699374795922">ดาวน์โหลดแล้ว <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">รหัสผ่านไม่ตรงกัน</translation> -<translation id="3030708446010914655">ไปที่แถบที่อยู่เว็บตรงนี้</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />ขอความช่วยเหลือ<ph name="END_LINK" /></translation> <translation id="305593374596241526">ตอนนี้ตำแหน่งปิดอยู่ เปิดตำแหน่งได้ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation> <translation id="307908932405420782">บทความอื่นๆ จะปรากฏขึ้นในอีกไม่ช้า ขอให้เพลิดเพลินกับยามเช้า</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">รีเซ็ตโปรแกรมประหยัดอินเทอร์เน็ตไหม</translation> <translation id="3714981814255182093">เปิดแถบค้นหา</translation> <translation id="3716182511346448902">หน้านี้ใช้หน่วยความจำมากเกินไป Chrome จึงหยุดหน้าชั่วคราว</translation> -<translation id="3734660163659757482">เลื่อนขึ้นเพื่อดูบุ๊กมาร์กและอื่นๆ</translation> <translation id="3738139272394829648">แตะเพื่อค้นหา</translation> <translation id="3739899004075612870">บุ๊กมาร์กไว้ใน <ph name="PRODUCT_NAME" /> แล้ว</translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB จากแอปอื่นๆ</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 8908aa3..cca1b29 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> sonuçtan <ph name="RESULT_NUMBER" /> numaralı sonuç</translation> <translation id="2086652334978798447">Google tarafından önerilen kişiselleştirilmiş içeriği almak için Chrome'da oturum açın.</translation> <translation id="2091887806945687916">Ses</translation> -<translation id="209354263896846928">Adres çubuğuna ekranınızın alt tarafından erişin</translation> <translation id="2095887075102408547">Bu özellik açık olduğunda, Chrome, ziyaret ettiğiniz sayfaları indirmeden önce sıkıştırmak için Google sunucularını kullanır. Gizli bağlantılar (HTTPS) veya Gizli sekmeler kullanarak erişilen sayfalar Google tarafından optimize edilmez veya görülmez.</translation> <translation id="2100273922101894616">Otomatik Oturum Aç</translation> <translation id="2111511281910874386">Sayfaya gidin</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Bu işlem <ph name="SIZE_IN_KB" /> olan web sitesi depolama alanının tamamını temizleyecek.</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB indirildi</translation> <translation id="3029704984691124060">Parolalar eşleşmiyor</translation> -<translation id="3030708446010914655">Adres çubuğuna buradan erişin</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Yardım alın<ph name="END_LINK" /></translation> <translation id="305593374596241526">Konum özelliği kapalı. <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'ndan açın.</translation> <translation id="307908932405420782">Yakında daha fazla seçenek gösterilecek. Güzel bir sabah geçirmenizi dileriz.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Veri Tasarrufu sıfırlansın mı?</translation> <translation id="3714981814255182093">Bulma Çubuğu'nu açar</translation> <translation id="3716182511346448902">Bu sayfa, bellekte çok fazla yer kapladığından Chrome tarafından duraklatıldı.</translation> -<translation id="3734660163659757482">Yer işaretlerini ve diğer öğeleri görmek için yukarı çekin</translation> <translation id="3738139272394829648">Dokun ve Ara</translation> <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> üzerinde yer işareti koyuldu</translation> <translation id="3744111309925758534">Diğer uygulamalar <ph name="MEGABYTES" /> MB</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 ca55afa..1644953 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" /> з <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Щоб отримувати персоналізовані пропозиції від Google, увійдіть в обліковий запис Chrome.</translation> <translation id="2091887806945687916">Сигнал</translation> -<translation id="209354263896846928">Перейдіть до адресного рядка внизу екрана</translation> <translation id="2095887075102408547">Якщо ввімкнути цю функцію, Chrome використовуватиме сервери Google, щоб стискати сторінки перед завантаженням. Однак це не стосується сторінок, відкритих під час конфіденційного з’єднання (HTTPS) або в режимі анонімного перегляду.</translation> <translation id="2100273922101894616">Автоматичний вхід</translation> <translation id="2111511281910874386">Перейти на сторінку</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Буде видалено всі дані сайтів (<ph name="SIZE_IN_KB" />).</translation> <translation id="3029613699374795922">Завантажено <ph name="KBS" /> КБ</translation> <translation id="3029704984691124060">Парольні фрази не збігаються</translation> -<translation id="3030708446010914655">Перейдіть до адресного рядка тут</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Довідка<ph name="END_LINK" /></translation> <translation id="305593374596241526">Геодані вимкнено. Увімкніть їх у <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Згодом тут з’являться інші статті. Гарного ранку.</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Скинути дані Заощадження трафіку?</translation> <translation id="3714981814255182093">Відкрити рядок пошуку</translation> <translation id="3716182511346448902">Ця сторінка займає велику кількість пам’яті, тому Chrome призупинив її роботу.</translation> -<translation id="3734660163659757482">Потягніть угору, щоб побачити закладки тощо</translation> <translation id="3738139272394829648">Пошук дотиком</translation> <translation id="3739899004075612870">Створено закладку в продукті <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> МБ використовується іншими додатками</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 ad274e39a..1bac3069 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">Kết quả <ph name="RESULT_NUMBER" /> trong tổng số <ph name="TOTAL_RESULTS" /></translation> <translation id="2086652334978798447">Để nhận nội dung được cá nhân hóa do Google đề xuất, hãy đăng nhập vào Chrome.</translation> <translation id="2091887806945687916">Âm thanh</translation> -<translation id="209354263896846928">Truy cập vào thanh địa chỉ ở cuối màn hình của bạn</translation> <translation id="2095887075102408547">Khi bạn bật tính năng này, Chrome sẽ sử dụng máy chủ Google để nén các trang mà bạn truy cập trước khi tải trang xuống. Google sẽ không tối ưu hóa hoặc thấy các trang được truy cập bằng kết nối riêng tư (HTTPS) hoặc trong tab ẩn danh.</translation> <translation id="2100273922101894616">Tự động đăng nhập</translation> <translation id="2111511281910874386">Chuyển đến trang</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">Thao tác này sẽ xóa tất cả <ph name="SIZE_IN_KB" /> bộ nhớ trang web.</translation> <translation id="3029613699374795922">Đã tải xuống <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Cụm mật khẩu không khớp</translation> -<translation id="3030708446010914655">Truy cập vào thanh địa chỉ ở đây</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Nhận trợ giúp<ph name="END_LINK" /></translation> <translation id="305593374596241526">Đã tắt vị trí; hãy bật vị trí trong mục <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation> <translation id="307908932405420782">Các bài viết khác sẽ sớm xuất hiện. Chúc bạn buổi sáng vui vẻ!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">Đặt lại Trình tiết kiệm dữ liệu?</translation> <translation id="3714981814255182093">Mở thanh Tìm kiếm</translation> <translation id="3716182511346448902">Chrome đã tạm dừng trang này vì trang dùng quá nhiều bộ nhớ.</translation> -<translation id="3734660163659757482">Kéo lên để xem dấu trang và nội dung khác</translation> <translation id="3738139272394829648">Chạm để tìm kiếm</translation> <translation id="3739899004075612870">Đã đánh dấu trang trong <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534">Các ứng dụng khác chiếm <ph name="MEGABYTES" /> MB</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 d515724d..6e4a402 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
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 条结果,共 <ph name="TOTAL_RESULTS" /> 条</translation> <translation id="2086652334978798447">要获取 Google 推荐的个性化内容,请登录 Chrome。</translation> <translation id="2091887806945687916">声音</translation> -<translation id="209354263896846928">前往屏幕底部的地址栏</translation> <translation id="2095887075102408547">当此功能处于开启状态时,Chrome 会先使用 Google 服务器压缩您所访问的网页,然后再下载它们。Google 既不会优化也不会看到您通过私密连接 (HTTPS) 或在隐身标签页中访问的网页。</translation> <translation id="2100273922101894616">自动登录</translation> <translation id="2111511281910874386">转至相关网页</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">这会清除全部的网站存储数据 (<ph name="SIZE_IN_KB" />)。</translation> <translation id="3029613699374795922">已下载 <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">密码不匹配</translation> -<translation id="3030708446010914655">前往此处的地址栏</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />获取帮助<ph name="END_LINK" /></translation> <translation id="305593374596241526">位置信息功能现处于关闭状态;请在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中开启此项功能。</translation> <translation id="307908932405420782">我们很快将会为您奉上更多文章,伴您度过美好的晨间时光!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">重置流量节省程序?</translation> <translation id="3714981814255182093">打开查找栏</translation> <translation id="3716182511346448902">此网页占用的内存过多,因此 Chrome 已将其暂停。</translation> -<translation id="3734660163659757482">上拉即可查看书签及更多内容</translation> <translation id="3738139272394829648">触摸搜索</translation> <translation id="3739899004075612870">已在 <ph name="PRODUCT_NAME" /> 中添加书签</translation> <translation id="3744111309925758534">其他应用已占用的空间:<ph name="MEGABYTES" /> MB</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 f818571d..f2bfc1ca 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
@@ -125,7 +125,6 @@ <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 個結果,共 <ph name="TOTAL_RESULTS" /> 個</translation> <translation id="2086652334978798447">如要取得個人化的 Google 推薦內容,請登入 Chrome。</translation> <translation id="2091887806945687916">音訊</translation> -<translation id="209354263896846928">在畫面底部存取網址列</translation> <translation id="2095887075102408547">啟用這項功能後,Chrome 會先使用 Google 伺服器壓縮您要造訪的網頁資料,然後再下載這些網頁。使用私人連線 (HTTPS) 或無痕式分頁存取網頁時,Google 不會對這些網頁進行最佳化處理,也不會偵測到這些網頁。</translation> <translation id="2100273922101894616">自動登入</translation> <translation id="2111511281910874386">前往指定頁面</translation> @@ -224,7 +223,6 @@ <translation id="300526633675317032">這會將網站儲存的 <ph name="SIZE_IN_KB" /> 的資料全部清除。</translation> <translation id="3029613699374795922">已下載 <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">通關密語不符</translation> -<translation id="3030708446010914655">在這裡存取網址列</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />取得說明<ph name="END_LINK" /></translation> <translation id="305593374596241526">定位功能已關閉,請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中開啟這項功能。</translation> <translation id="307908932405420782">系統即將顯示更多文章供你閱覽,陪你度過美好的早晨!</translation> @@ -295,7 +293,6 @@ <translation id="3712575778697986964">確定要重設 Data Saver 嗎?</translation> <translation id="3714981814255182093">開啟搜尋列</translation> <translation id="3716182511346448902">這個網頁使用了過多記憶體,因此遭到 Chrome 暫停。</translation> -<translation id="3734660163659757482">往上拉即可查看書籤和其他內容</translation> <translation id="3738139272394829648">輕觸搜尋</translation> <translation id="3739899004075612870">已加入 <ph name="PRODUCT_NAME" /> 書籤</translation> <translation id="3744111309925758534">其他應用程式佔 <ph name="MEGABYTES" /> MB</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManagerTest.java index 6dce8f4..3149e90 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManagerTest.java
@@ -13,6 +13,7 @@ import android.app.Notification; import android.content.Context; +import android.os.Looper; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; @@ -84,6 +85,10 @@ super.startOrUpdateForegroundService(notificationId, notification); } + // Skip waiting for delayed runnable in tests. + @Override + void postMaybeStopServiceRunnable() {} + /** * Call for testing that mimics the onServiceConnected call in mConnection that ensures the * mBoundService is non-null and the pending queue is processed. @@ -107,6 +112,8 @@ @Before public void setUp() throws Exception { + Looper.prepare(); + mContext = new AdvancedMockContext(InstrumentationRegistry.getTargetContext()); mDownloadServiceManager = new MockDownloadForegroundServiceManager();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java index 728de49b..d6e445fc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java
@@ -49,6 +49,7 @@ import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.DOMUtils; +import org.chromium.content.browser.test.util.JavaScriptUtils; import java.lang.ref.WeakReference; import java.util.List; @@ -457,4 +458,35 @@ } }); } + + /** + * Tests that exiting VR while a permission prompt or JavaScript dialog is being displayed + * does not cause a browser crash. Regression test for https://crbug.com/821443. + */ + @Test + @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM) + @LargeTest + @CommandLineFlags.Add("enable-features=VrBrowsingNativeAndroidUi") + public void testExitVrWithPromptDisplayed() throws InterruptedException, TimeoutException { + mVrTestFramework.loadUrlAndAwaitInitialization( + VrTestFramework.getHtmlTestFile("test_navigation_2d_page"), PAGE_LOAD_TIMEOUT_S); + + // Test JavaScript dialogs. + Assert.assertTrue(TransitionUtils.forceEnterVr()); + TransitionUtils.waitForVrEntry(POLL_TIMEOUT_LONG_MS); + // Alerts block JavaScript execution until they're closed, so we can't use the normal + // runJavaScriptOrFail, as that will time out. + JavaScriptUtils.executeJavaScript(mVrTestFramework.getFirstTabWebContents(), + "alert('Please no crash')"); + TransitionUtils.waitForNativeUiPrompt(POLL_TIMEOUT_LONG_MS); + TransitionUtils.forceExitVr(); + + // Test permission prompts. + Assert.assertTrue(TransitionUtils.forceEnterVr()); + TransitionUtils.waitForVrEntry(POLL_TIMEOUT_LONG_MS); + VrTestFramework.runJavaScriptOrFail("navigator.getUserMedia({video: true}, ()=>{}, ()=>{})", + POLL_TIMEOUT_SHORT_MS, mVrTestFramework.getFirstTabWebContents()); + TransitionUtils.waitForNativeUiPrompt(POLL_TIMEOUT_LONG_MS); + TransitionUtils.forceExitVr(); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/util/TransitionUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/util/TransitionUtils.java index 7fa3974..1127ea5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/util/TransitionUtils.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/util/TransitionUtils.java
@@ -23,6 +23,7 @@ import org.chromium.chrome.browser.vr_shell.VrDaydreamApi; import org.chromium.chrome.browser.vr_shell.VrIntentUtils; import org.chromium.chrome.browser.vr_shell.VrShellDelegate; +import org.chromium.chrome.browser.vr_shell.VrShellImpl; import org.chromium.chrome.browser.vr_shell.VrTestFramework; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; @@ -222,4 +223,18 @@ } }); } + + /** + * Waits until either a JavaScript dialog or permission prompt is being displayed using the + * Android native UI in the VR browser. + */ + public static void waitForNativeUiPrompt(final int timeout) { + CriteriaHelper.pollInstrumentationThread(new Criteria() { + @Override + public boolean isSatisfied() { + VrShellImpl vrShell = (VrShellImpl) TestVrShellDelegate.getVrShellForTesting(); + return vrShell.isDisplayingDialogView(); + } + }, timeout, POLL_CHECK_INTERVAL_SHORT_MS); + } }
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index 163ddc3..d60c47f 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -4,6 +4,7 @@ <translation id="1065672644894730302">Nelze číst vaše nastavení. Některé funkce možná nebudou k dispozici a změny nastavení se neuloží.</translation> +<translation id="1104942323762546749">Chromium chce exportovat vaše hesla. Tato akce vyžaduje zadání hesla systému Windows.</translation> <translation id="1115445892567829615">Prohlížeč Chromium vaše data nemohl synchronizovat. Aktualizujte prosím heslovou frázi pro synchronizaci.</translation> <translation id="113122355610423240">Chromium je vaším výchozím prohlížečem</translation> <translation id="1170115874949214249">Nainstalujte si Chromium do telefonu. Zašleme vám SMS na telefonní číslo pro obnovení účtu.</translation> @@ -63,6 +64,7 @@ <translation id="3155163173539279776">Restartovat Chromium</translation> <translation id="3179665906251668410">Otevřít odkaz v &anonymním okně prohlížeče Chromium</translation> <translation id="3190315855212034486">Ouha! Prohlížeč Chromium spadl. Chcete jej znovu spustit?</translation> +<translation id="3229526316128325841">Chromium chce exportovat vaše hesla.</translation> <translation id="3256316712990552818">Zkopírováno do prohlížeče Chromium</translation> <translation id="3258596308407688501">Chromium nemůže číst ani zapisovat do svého datového adresáře: @@ -97,7 +99,8 @@ <translation id="4271805377592243930">Pomoc s prohlížečem Chromium</translation> <translation id="4285930937574705105">Došlo k nespecifikované chybě, instalace se nezdařila. Pokud je prohlížeč Chromium právě spuštěný, zavřete jej prosím a zkuste to znovu.</translation> <translation id="4330585738697551178">O tomto modulu je známo, že u něj dochází ke konfliktu s prohlížečem Chromium.</translation> -<translation id="4407044323746248786">Přesto ukončit Chromium?</translation> +<translation id="4407044323746248786">Přesto Chromium ukončit?</translation> +<translation id="4415566066719264597">Nechat Chromium běžet na pozadí</translation> <translation id="4421155425831608516">Přihlášení do prohlížeče Chromium je administrátorem tohoto zařízení zakázáno.</translation> <translation id="4423735387467980091">Přizpůsobit a ovládat Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium se za hodinu restartuje}few{Chromium se za # hodiny restartuje}many{Chromium se za # hodiny restartuje}other{Chromium se za # hodin restartuje}}</translation> @@ -111,7 +114,7 @@ <translation id="469338717132742108">Pomoc se systémem Chromium OS</translation> <translation id="4708774505295300557">Prohlížeč Chromium v tomto počítači je již přihlášen k účtu <ph name="ACCOUNT_EMAIL_LAST" />. Chcete-li své informace uchovat odděleně, vytvořte nového uživatele prohlížeče Chromium.</translation> <translation id="4714956846925717402">Mějte Chromium při ruce</translation> -<translation id="4746050847053251315">Přesto zavřít Chromium?</translation> +<translation id="4746050847053251315">Přesto Chromium ukončit?</translation> <translation id="4888717733111232871">Pravidlo příchozího provozu pro prohlížeč Chromium, které povolí provoz mDNS.</translation> <translation id="4943838377383847465">Chromium je v režimu na pozadí.</translation> <translation id="4987820182225656817">Hosté mohou Chromium používat, aniž by po nich zůstaly jakékoliv stopy.</translation> @@ -160,6 +163,7 @@ <translation id="6394232988457703198">Nyní byste Chromium měli restartovat.</translation> <translation id="6400072781405947421">Prohlížeč Chromium nemusí fungovat správně, protože v systémech Mac OS X 10.9 již není podporován.</translation> <translation id="6403826409255603130">Chromium je webový prohlížeč, který spouští webové stránky a aplikace rychlostí blesku. Je rychlý a snadno se používá. Prohlížejte web bezpečněji díky ochraně proti malwaru a phishingu integrované v prohlížeči Chromium.</translation> +<translation id="6457450909262716557">{SECONDS,plural, =1{Chromium se za 1 sekundu restartuje}few{Chromium se za # sekundy restartuje}many{Chromium se za # sekundy restartuje}other{Chromium se za # sekund restartuje}}</translation> <translation id="6475912303565314141">Také řídí, která stránka se zobrazí při spuštění prohlížeče Chromium.</translation> <translation id="6485906693002546646">Synchronizujete obsah a nastavení prohlížeče Chromium s účtem <ph name="PROFILE_EMAIL" />. Chcete-li možnosti synchronizace upravit nebo Chromium používat bez účtu Google, navštivte <ph name="SETTINGS_LINK" />.</translation> <translation id="6510925080656968729">Odinstalovat Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index 643cc1d..f3788894 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -109,7 +109,7 @@ <translation id="469338717132742108">Få hjælp til Chromium OS</translation> <translation id="4708774505295300557">Nogen har tidligere logget ind på Chromium på denne computer som <ph name="ACCOUNT_EMAIL_LAST" />. Opret en ny Chromium-bruger for at holde dine oplysninger adskilt.</translation> <translation id="4714956846925717402">Kom hurtigere til Chromium</translation> -<translation id="4746050847053251315">Vil du lukke Chromium alligevel?</translation> +<translation id="4746050847053251315">Vil du slutte Chromium alligevel?</translation> <translation id="4888717733111232871">Indgående regel for Chromium om at tillade mDNS-trafik.</translation> <translation id="4943838377383847465">Chromium kører i baggrunden.</translation> <translation id="4987820182225656817">Gæster kan bruge Chromium uden at efterlade noget.</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index e332479..270d7d3 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -4,6 +4,7 @@ <translation id="1065672644894730302">Your preferences cannot be read. Some features may be unavailable and changes to preferences won't be saved.</translation> +<translation id="1104942323762546749">Chromium wants to export your passwords. Type your Windows password to allow this.</translation> <translation id="1115445892567829615">Chromium could not sync your data. Please update your Sync passphrase.</translation> <translation id="113122355610423240">Chromium is your default browser</translation> <translation id="1170115874949214249">Install Chromium on your phone. We’ll send an SMS to your account recovery phone number.</translation> @@ -19,6 +20,8 @@ <translation id="1668054258064581266">After removing your account from Chromium, you may need to reload your open tabs to take effect.</translation> <translation id="1688750314291223739">Set up Sync to save your personalised browser features to the web and access them from Chromium on any computer.</translation> <translation id="1708666629004767631">There's a new, safer version of Chromium available.</translation> +<translation id="1716051742506968">{0,plural, =0{A Chromium update is available}=1{A Chromium update is available}other{A Chromium update has been available for # days}}</translation> +<translation id="1766096484055239003">Your administrator requires that you relaunch Chromium to apply an update</translation> <translation id="1774152462503052664">Let Chromium run in the background</translation> <translation id="1779356040007214683">To make Chromium safer, we disabled some extensions that aren't listed in the <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> and may have been added without your knowledge.</translation> <translation id="1808667845054772817">Reinstall Chromium</translation> @@ -29,6 +32,7 @@ <translation id="1967743265616885482">A module with the same name has been known to conflict with Google Chrome.</translation> <translation id="2008474315282236005">This will delete 1 item from this device. To retrieve your data later, sign in to Chromium as <ph name="USER_EMAIL" />.</translation> <translation id="2077129598763517140">Use hardware acceleration when available</translation> +<translation id="2117378023188580026">Your administrator asks that you relaunch Chromium to apply this update</translation> <translation id="2119636228670142020">About &Chromium OS</translation> <translation id="2158734852934720349">Chromium OS open source licences</translation> <translation id="2241627712206172106">If you share a computer, friends and family can browse separately and set up Chromium just the way they want.</translation> @@ -63,6 +67,7 @@ <translation id="3155163173539279776">Relaunch Chromium</translation> <translation id="3179665906251668410">Open Link in Chromium Inco&gnito Window</translation> <translation id="3190315855212034486">Whoa! Chromium has crashed. Relaunch now?</translation> +<translation id="3229526316128325841">Chromium wants to export your passwords.</translation> <translation id="3256316712990552818">Copied to Chromium</translation> <translation id="3258596308407688501">Chromium cannot read and write to its data directory: @@ -98,6 +103,7 @@ <translation id="4285930937574705105">Installation failed due to unspecified error. If Google Chrome is currently running, please close it and try again.</translation> <translation id="4330585738697551178">This module is known to conflict with Chromium.</translation> <translation id="4407044323746248786">Exit Chromium anyway?</translation> +<translation id="4415566066719264597">Let Chromium Run in the Background</translation> <translation id="4421155425831608516">Sign in to Chromium is disabled by the administrator of this device.</translation> <translation id="4423735387467980091">Customise and control Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium will relaunch in an hour}other{Chromium will relaunch in # hours}}</translation> @@ -106,6 +112,7 @@ <translation id="4488554488975128561">You can help make Chromium safer and easier to use by automatically sending some system information and page content to Google to help detect dangerous apps and sites.</translation> <translation id="4567424176335768812">You're signed in as <ph name="USER_EMAIL_ADDRESS" />. Now you can access your bookmarks, history and other settings on all your signed in devices.</translation> <translation id="459535195905078186">Chromium Apps</translation> +<translation id="4604377857208775795">{0,plural, =1{Chromium will relaunch in 1 minute}other{Chromium will relaunch in # minutes}}</translation> <translation id="4621240073146040695">Nearly up to date! Relaunch Chromium to finish updating.</translation> <translation id="4677944499843243528">The profile appears to be in use by another Chromium process (<ph name="PROCESS_ID" />) on another computer (<ph name="HOST_NAME" />). Chromium has locked the profile so that it doesn't get corrupted. If you are sure that no other processes are using this profile, you can unlock the profile and relaunch Chromium.</translation> <translation id="469338717132742108">Get help with Chromium OS</translation> @@ -160,10 +167,12 @@ <translation id="6394232988457703198">You should restart Chromium now.</translation> <translation id="6400072781405947421">Chromium may not function correctly because it is no longer supported on Mac OS X 10.9.</translation> <translation id="6403826409255603130">Chromium is a web browser that runs webpages and applications with lightning speed. It's fast, stable, and easy to use. Browse the web more safely with malware and phishing protection built into Chromium.</translation> +<translation id="6457450909262716557">{SECONDS,plural, =1{Chromium will restart in 1 second}other{Chromium will restart in # seconds}}</translation> <translation id="6475912303565314141">It also controls what page is shown when you start Chromium.</translation> <translation id="6485906693002546646">You're using <ph name="PROFILE_EMAIL" /> to sync your Chromium stuff. To update your sync preference or to use Chromium without a Google account, visit <ph name="SETTINGS_LINK" />.</translation> <translation id="6510925080656968729">Uninstall Chromium</translation> <translation id="6598877126913850652">Go to Chromium notification settings</translation> +<translation id="6664239887951090350">{0,plural, =0{Chromium will relaunch now}=1{Chromium will relaunch in 1 second}other{Chromium will relaunch in # seconds}}</translation> <translation id="6676384891291319759">Access the Internet</translation> <translation id="6717134281241384636">Your profile can not be used because it is from a newer version of Chromium. @@ -207,6 +216,7 @@ <translation id="761356813943268536">Chromium is using your camera and microphone.</translation> <translation id="7617377681829253106">Chromium just got better</translation> <translation id="7686590090926151193">Chromium isn't your default browser</translation> +<translation id="7689606757190482937">Sync and personalise Chromium across your devices</translation> <translation id="7729447699958282447">Chromium could not sync your data because Sync is not available for your domain.</translation> <translation id="7745317241717453663">This will delete your browsing data from this device. To retrieve your data later, sign in to Chromium as <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">The installer couldn't create a temporary directory. Please check for free disk space and permission to install software.</translation> @@ -225,6 +235,7 @@ <translation id="8222496066431494154">Install Chromium on your phone. We’ll send an SMS to your account recovery phone number: <ph name="PHONE_NUMBER" /></translation> <translation id="8269379391216269538">Help make Chromium better</translation> <translation id="8290862415967981663">This file may be dangerous, so Chromium has blocked it.</translation> +<translation id="8330519371938183845">Sign in to sync and personalise Chromium across your devices</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> was previously using Chromium</translation> <translation id="8453117565092476964">The installer archive is corrupted or invalid. Please download Chromium again.</translation> <translation id="8493179195440786826">Chromium is Out of Date</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index 15f7e71..0e714f6 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -92,7 +92,7 @@ <translation id="4222580632002216401">आपण आता Chromium वर साइन इन केले आहे! आपल्या प्रशासकाद्वारे संकालन अक्षम केले गेले आहे.</translation> <translation id="4224199872375172890">Chromium अद्ययावत आहे.</translation> <translation id="4230135487732243613">या खात्यावर आपल्या Chromium डेटा चा दुवा साधायचा?</translation> -<translation id="4260985389288095068">तुमच्या काँप्युटरवर धोकादायक सॉफ्टवेअर आढळले आहे. Chromium ते काढून टाकू शकते आणि तुमचा ब्राउझर पुन्हा नीट चालावा यासाठी तुमच्या सेटिंग्ज रीस्टोअर करू शकते.</translation> +<translation id="4260985389288095068">तुमच्या काँप्युटरवर धोकादायक सॉफ्टवेअर आढळले आहे. Chromium ते काढून टाकू शकते आणि तुमचा ब्राउझर पुन्हा नीट चालावा यासाठी तुमच्या सेटिंग्ज रिस्टोअर करू शकते.</translation> <translation id="4271805377592243930">Chromium सह मदत मिळवा</translation> <translation id="4285930937574705105">अनिर्दिष्ट त्रुटीमुळे स्थापना अयशस्वी झाली. सध्या Chromium चालत असल्यास, कृपया त्यास बंद करा आणि पुन्हा प्रयत्न करा.</translation> <translation id="4330585738697551178">हे मॉड्यूल Chromium बरोबर विरोधाकरिता ओळखले जाते.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index ade5567..915302f 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -97,6 +97,7 @@ <translation id="4271805377592243930">Pomoc s prehliadačom Chromium</translation> <translation id="4285930937574705105">Inštalácia zlyhala kvôli neurčenej chybe. Ak je prehliadač Chromium momentálne spustený, zatvorte ho a skúste znova.</translation> <translation id="4330585738697551178">Tento modul zvykne spôsobovať konflikt s prehliadačom Chromium.</translation> +<translation id="4407044323746248786">Napriek tomu ukončiť Chromium?</translation> <translation id="4421155425831608516">Prihlásenie do prehliadača Chromium je zakázané správcom tohto zariadenia.</translation> <translation id="4423735387467980091">Prispôsobiť a spravovať Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium sa znova spustí do jednej hodiny}few{Chromium sa znova spustí do # hodín}many{Chromium sa znova spustí do # hodiny}other{Chromium sa znova spustí do # hodín}}</translation> @@ -110,6 +111,7 @@ <translation id="469338717132742108">Pomoc so systémom Chromium OS</translation> <translation id="4708774505295300557">Do prehliadača Chromium sa už na tomto počítači niekto prihlásil pomocou účtu <ph name="ACCOUNT_EMAIL_LAST" />. Ak chcete ponechať svoje informácie oddelené, vytvorte v prehliadači Chromium nového používateľa.</translation> <translation id="4714956846925717402">Prechádzajte do prehliadača Chromium rýchlejšie</translation> +<translation id="4746050847053251315">Napriek tomu zavrieť Chromium?</translation> <translation id="4888717733111232871">Pravidlo pre prichádzajúce prenosy pre prehliadač Chromium, ktoré povoľuje prenos dát mDNS.</translation> <translation id="4943838377383847465">Chromium je v režime na pozadí.</translation> <translation id="4987820182225656817">Hostia môžu používať prehliadač Chromium bez toho, aby po sebe zanechali akékoľvek informácie.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index af923de..443200b 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -98,7 +98,7 @@ <translation id="4271805377592243930">Pomoč za Chromium</translation> <translation id="4285930937574705105">Namestitev ni bila izvedena zaradi nedoločene napake. Če se Chromium trenutno izvaja, ga zaprite in poskusite znova.</translation> <translation id="4330585738697551178">Za ta modul je znano, da je v sporu s Chromiumom.</translation> -<translation id="4407044323746248786">Želite vseeno zapustiti Chromium?</translation> +<translation id="4407044323746248786">Želite vseeno zapreti Chromium?</translation> <translation id="4421155425831608516">Prijavo v Chromium je onemogočil skrbnik te naprave.</translation> <translation id="4423735387467980091">Prilagajanje in nadziranje Chromiuma</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium se bo znova zagnal čez eno uro}one{Chromium se bo znova zagnal čez # uro}two{Chromium se bo znova zagnal čez # uri}few{Chromium se bo znova zagnal čez # ure}other{Chromium se bo znova zagnal čez # ur}}</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index 844a2e4..6107315 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -93,6 +93,7 @@ <translation id="4271805377592243930">Chromium'la ilgili yardım alın</translation> <translation id="4285930937574705105">Belirlenemeyen bir hata nedeniyle yükleme başarısız oldu. Chromium şu anda çalışır durumdaysa kapatıp yeniden deneyin.</translation> <translation id="4330585738697551178">Bu modülün Chromium'la çakıştığı biliniyor.</translation> +<translation id="4407044323746248786">Yine de Chromium'dan çıkılsın mı?</translation> <translation id="4421155425831608516">Chromium'da oturum açma işlevi, bu cihazın yöneticisi tarafından devre dışı bırakılmıştır.</translation> <translation id="4423735387467980091">Chromium'u özelleştirin ve kontrol edin</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium bir saat içinde yeniden başlatılacak}other{Chromium # saat içinde yeniden başlatılacak}}</translation> @@ -106,6 +107,7 @@ <translation id="469338717132742108">Chromium OS ile ilgili yardım alın</translation> <translation id="4708774505295300557">Birisi daha önce bu bilgisayarda <ph name="ACCOUNT_EMAIL_LAST" /> olarak Chromium oturumu açmış. Bilgilerinizi ayrı tutmak için yeni bir Chromium kullanıcısı oluşturun.</translation> <translation id="4714956846925717402">Chromium'a daha hızlı ulaşın</translation> +<translation id="4746050847053251315">Yine de Chromium'dan çıkılsın mı?</translation> <translation id="4888717733111232871">Chromium'un mDNS trafiğine izin vermeyi sağlayan gelen trafik kuralı.</translation> <translation id="4943838377383847465">Chromium arka plan modunda.</translation> <translation id="4987820182225656817">Misafirler Chromium'u geride hiçbir şey bırakmadan kullanabilir.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 7b9c970..0f5bda68 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">የGoogle Play መደብር መለያ</translation> <translation id="2509495747794740764">የልኬት መጠኑ በ10 እና 200 መካከል የሆነ ቁጥር መሆን አለበት።</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">የራስ-ሙላ ቅጾች</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">ቃኝ</translation> <translation id="2518024842978892609">የደንበኛ እውቅና ማረጋገጫዎችዎን ይጠቀማል</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">ኤስኪውላይት ማህደረ ትውስታ</translation> <translation id="6641138807883536517">በዘፈቀደ የመነጨው ደህንነቱ የተጠበቀ ሞዱል ይለፍ ቃል አይገኝም። ይሄ ከአንድ Powerwash በኋላ የሚከሰት የተለመደ ነገር ነው።</translation> <translation id="6643016212128521049">አጽዳ</translation> +<translation id="6644512095122093795">የይለፍ ቀላትን ለማስቀመጥ ጠይቅ</translation> <translation id="6644846457769259194">የእርስዎን መሣሪያ በማዘመን ላይ (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">የNetscape ዕውቅና ማረጋገጫ ስልጣን መሻሪያ ዩአርኤል</translation> <translation id="6647838571840953560">በአሁኑ ጊዜ በ<ph name="CHANNEL_NAME" /> ላይ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 214411ee..d95d52b 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -971,6 +971,7 @@ <translation id="2508428939232952663">حساب متجر Google Play</translation> <translation id="2509495747794740764">يجب أن تمثل قيمة التدرج رقمًا يتراوح بين 10 و200.</translation> <translation id="2509566264613697683">8 أضعاف</translation> +<translation id="2512222046227390255">الملء التلقائي للنماذج</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">فحص</translation> <translation id="2518024842978892609">استخدام شهادات العملاء لديك</translation> @@ -3602,6 +3603,7 @@ <translation id="6639554308659482635">ذاكرة SQLite</translation> <translation id="6641138807883536517">كلمة مرور الوحدة الآمنة التي تم إنشاؤها عشوائيًا غير متاحة. ويعد ذلك أمرًا عاديًا بعد إجراء Powerwash.</translation> <translation id="6643016212128521049">محو</translation> +<translation id="6644512095122093795">اقتراح حفظ كلمات المرور</translation> <translation id="6644846457769259194">جارٍ تحديث جهازك (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">عنوان URL لإبطال المرجع المصدق لـ Netscape</translation> <translation id="6647838571840953560">حاليًا على قناة <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 731c673c..9fd1b182 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">Профил за Google Play Магазин</translation> <translation id="2509495747794740764">Коефициентът на мащабиране трябва да е число между 10 и 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Авт. попълване на формуляри</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Сканиране</translation> <translation id="2518024842978892609">Използване на клиентските сертификати</translation> @@ -3604,6 +3605,7 @@ <translation id="6639554308659482635">Памет за SQLite</translation> <translation id="6641138807883536517">Произволно генерираната чрез модула за сигурност парола не е налице. Това е нормално след извършване на Powerwash.</translation> <translation id="6643016212128521049">Изчистване</translation> +<translation id="6644512095122093795">Показване на предложение за запазване на паролите</translation> <translation id="6644846457769259194">Устройството ви се актуализира (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL адрес за анулиране от сертифициращ орган на Netscape</translation> <translation id="6647838571840953560">Текущ канал: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 9b7e9804..3e90777 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -119,7 +119,7 @@ <translation id="1173894706177603556">পুনঃনামকরণ</translation> <translation id="1175364870820465910">&প্রিন্ট...</translation> <translation id="117624967391683467"><ph name="FILE_NAME" /> অনুলিপি করা হচ্ছে...</translation> -<translation id="1177138678118607465">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাগুলি ব্যক্তিগতকরণের জন্য Google আপনার ব্রাউজিং ইতিহাস ব্যবহার করতে পারে। আপনি এটি যেকোনও সময়ে myaccount.google.com/activitycontrols/search থেকে পরিবর্তন করতে পারেন</translation> +<translation id="1177138678118607465">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাগুলি আপনার মতো করে সাজানোর জন্য Google আপনার ব্রাউজিং ইতিহাস ব্যবহার করতে পারে। আপনি এটি যেকোনও সময়ে myaccount.google.com/activitycontrols/search থেকে পরিবর্তন করতে পারেন</translation> <translation id="1177863135347784049">কাস্টম</translation> <translation id="1178581264944972037">বিরতি</translation> <translation id="1181037720776840403">সরান</translation> @@ -378,7 +378,7 @@ <translation id="155865706765934889">টাচপ্যাড</translation> <translation id="1559235587769913376">ইউনিকোড অক্ষর ইনপুট করুন</translation> <translation id="1566049601598938765">ওয়েবসাইট</translation> -<translation id="1567387640189251553">আপনি যখন শেষবার পাসওয়ার্ডটি লিখেছিলেন তার পরে অন্য একটি কীবোর্ডে কানেক্ট করা হয়েছিল। পাসওয়ার্ড চুরি করার চেষ্টা করতে পারে।</translation> +<translation id="1567387640189251553">আপনি যখন শেষবার পাসওয়ার্ডটি লিখেছিলেন তার পরে অন্য একটি কীবোর্ডে কানেক্ট করা হয়েছিল। এটি আপনার পাসওয়ার্ড চুরি করার চেষ্টা করতে পারে।</translation> <translation id="1567993339577891801">JavaScript কনসোল</translation> <translation id="1568067597247500137">সাইটটি মিউট করুন</translation> <translation id="1568323446248056064">প্রদর্শন ডিভাইস সেটিংস খুলুন</translation> @@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play স্টোর অ্যাকাউন্ট</translation> <translation id="2509495747794740764">স্কেলের মাপকে অবশ্যই ১০ থেকে ১০০ এর মধ্যের একটি সংখ্যা হতে হবে।</translation> <translation id="2509566264613697683">৮x</translation> +<translation id="2512222046227390255">স্বতঃপূর্ণ ফর্মগুলি</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">স্ক্যান করুন</translation> <translation id="2518024842978892609">আপনার ক্লায়েন্ট শংসাপত্র ব্যবহার করুন</translation> @@ -3602,6 +3603,7 @@ <translation id="6639554308659482635">SQLite স্মৃতি</translation> <translation id="6641138807883536517">র্যান্ডম ভাবে জেনারেট করা নিরাপদ মডিউল পাসওয়ার্ডটি পাওয়া যাচ্ছে না। পাওয়ারওয়াশের পরে এরকম হয়ে থাকে।</translation> <translation id="6643016212128521049">সাফ করুন</translation> +<translation id="6644512095122093795">পাসওয়ার্ড সংরক্ষণের প্রস্তাব</translation> <translation id="6644846457769259194">আপনার ডিভাইস আপডেট করা হচ্ছে (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape শংসাপত্র কর্তৃপক্ষ নাকচের URL</translation> <translation id="6647838571840953560">বর্তমানে <ph name="CHANNEL_NAME" /> এ</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index b6abb463..3320f2ef 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Compte de Google Play Store</translation> <translation id="2509495747794740764">El valor de l'escala ha d'oscil·lar entre 10 i 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Emplenament automàtic de formularis</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Cerca</translation> <translation id="2518024842978892609">Utilitzar els certificats de client</translation> @@ -2451,7 +2452,7 @@ <translation id="4850669014075537160">Desplaçament</translation> <translation id="4850886885716139402">Mostra</translation> <translation id="4853020600495124913">Obre en una &finestra nova</translation> -<translation id="4856478137399998590">El servei de dades mòbil està activat i a punt per fer servir</translation> +<translation id="4856478137399998590">El servei de dades mòbils està activat i a punt per fer servir</translation> <translation id="4857506433977877623">{COUNT,plural, =0{Obre-les totes en una &finestra d'incògnit}=1{Obre en una &finestra d'incògnit}other{Obre-les totes (#) en una &finestra d'incògnit}}</translation> <translation id="4858913220355269194">Pilota</translation> <translation id="4862050643946421924">S'està afegint el dispositiu...</translation> @@ -2868,7 +2869,7 @@ <translation id="5485080380723335835"><ph name="DEVICE_TYPE" /> està bloquejat per seguretat. Introdueix la contrasenya manualment per continuar.</translation> <translation id="5485102783864353244">Afegeix l'aplicació</translation> <translation id="5485754497697573575">Restaura totes les pestanyes</translation> -<translation id="5486261815000869482">Confirmeu la contrasenya</translation> +<translation id="5486261815000869482">Confirma la contrasenya</translation> <translation id="5486275809415469523"><ph name="APP_NAME" /> comparteix la vostra pantalla amb <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simula el reinici del navegador</translation> <translation id="5487521232677179737">Esborra les dades</translation> @@ -3605,6 +3606,7 @@ <translation id="6639554308659482635">Memòria SQLite</translation> <translation id="6641138807883536517">La contrasenya del mòdul de seguretat generada aleatòriament no està disponible. Això és normal després d'executar la funció Powerwash.</translation> <translation id="6643016212128521049">Esborra</translation> +<translation id="6644512095122093795">Ofereix desar contrasenyes</translation> <translation id="6644846457769259194">S'està actualitzant el dispositiu (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL de revocació de l'entitat emissora de certificats de Netscape</translation> <translation id="6647838571840953560">Actualment a <ph name="CHANNEL_NAME" /></translation> @@ -4026,7 +4028,7 @@ <translation id="7339785458027436441">Comprova l'ortografia mentre escric</translation> <translation id="7339898014177206373">Finestra nova</translation> <translation id="7340431621085453413">Ara <ph name="FULLSCREEN_ORIGIN" /> a pantalla completa.</translation> -<translation id="7345706641791090287">Confirmeu la contrasenya</translation> +<translation id="7345706641791090287">Confirma la contrasenya</translation> <translation id="7346909386216857016">D'acord</translation> <translation id="7347751611463936647">Per utilitzar aquesta extensió, escriviu "<ph name="EXTENSION_KEYWORD" />", premeu la tecla de tabulació i indiqueu l'ordre o la cerca.</translation> <translation id="7348093485538360975">Teclat en pantalla</translation> @@ -4557,7 +4559,7 @@ <translation id="8162857629993139764">Crea una nota</translation> <translation id="8165383685500900731">Gestioneu la configuració del micròfon…</translation> <translation id="8168435359814927499">Contingut</translation> -<translation id="8174047975335711832">Informació dels dispositius</translation> +<translation id="8174047975335711832">Informació del dispositiu</translation> <translation id="8177196903785554304">Informació sobre la xarxa</translation> <translation id="8179976553408161302">Retorn</translation> <translation id="8180239481735238521">pàgina</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index ecb0a03f..9f3746c 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -971,6 +971,7 @@ <translation id="2508428939232952663">Účet Obchodu Google Play</translation> <translation id="2509495747794740764">Hodnota měřítka musí být v intervalu 10 až 200.</translation> <translation id="2509566264613697683">8×</translation> +<translation id="2512222046227390255">Automatické vyplňování formulářů</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Vyhledat</translation> <translation id="2518024842978892609">Používat vaše klientské certifikáty</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">Paměť SQLite</translation> <translation id="6641138807883536517">Náhodně generované heslo modulu zabezpečení není k dispozici. Po použití funkce Powerwash je to normální.</translation> <translation id="6643016212128521049">Vymazat</translation> +<translation id="6644512095122093795">Nabídnout uložení hesel</translation> <translation id="6644846457769259194">Aktualizace zařízení (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Adresa URL pro odvolání certifikační autority Netscape</translation> <translation id="6647838571840953560">Aktuální kanál: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index f12f633..44b2185 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">Google Play Butik-konto</translation> <translation id="2509495747794740764">Skaleringsværdien skal være et tal mellem 10 og 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Udfyld formularer automatisk</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scan</translation> <translation id="2518024842978892609">Brug dine klientcertifikater</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">SQLite-hukommelse</translation> <translation id="6641138807883536517">Den tilfældigt genererede adgangskode til sikkerhedsmodulet er ikke tilgængelig. Dette er normalt efter en Powerwash.</translation> <translation id="6643016212128521049">Ryd</translation> +<translation id="6644512095122093795">Få tilbudt at gemme adgangskoder</translation> <translation id="6644846457769259194">Opdaterer din enhed (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Webadresse for tilbagekaldelse af Netscape-certifikatautoritet</translation> <translation id="6647838571840953560">I øjeblikket på <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index f78fba1..ae0cc32a 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">Google Play Store-Konto</translation> <translation id="2509495747794740764">Der Wert für die Skalierung muss zwischen 10 und 200 liegen.</translation> <translation id="2509566264613697683">8-fach</translation> +<translation id="2512222046227390255">AutoFill-Formulare</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Suchen</translation> <translation id="2518024842978892609">Clientzertifikate verwenden</translation> @@ -3602,6 +3603,7 @@ <translation id="6639554308659482635">SQLite-Speicher</translation> <translation id="6641138807883536517">Das zufällig generierte Passwort für das Sicherheitsmodul ist nicht verfügbar. Dies ist nach einem Powerwash normal.</translation> <translation id="6643016212128521049">Löschen</translation> +<translation id="6644512095122093795">Speichern von Passwörtern anbieten</translation> <translation id="6644846457769259194">Gerät wird aktualisiert (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL zum Zurückrufen der Zertifizierungsstelle von Netscape-Zertifikaten</translation> <translation id="6647838571840953560">Derzeit auf <ph name="CHANNEL_NAME" /></translation> @@ -4161,7 +4163,7 @@ <translation id="7547317915858803630">Warnung: Ihre <ph name="PRODUCT_NAME" />-Einstellungen werden auf einem Netzlaufwerk gespeichert. Dies kann zu einer Verlangsamung, zu Abstürzen oder sogar zu Datenverlust führen.</translation> <translation id="7547483330017600937">Sie haben die Möglichkeit, auf Ihrem <ph name="DEVICE_TYPE" /> zu entwickeln. Sie können Ihre bevorzugten systemeigenen Apps und Befehlszeilentools nahtlos und sicher nutzen. -Bei der Installation von "<ph name="APP_NAME" />" werden <ph name="DOWNLOAD_SIZE" /> heruntergeladen.</translation> +Bei der Installation von "<ph name="APP_NAME" />" werden <ph name="DOWNLOAD_SIZE" /> an Daten heruntergeladen.</translation> <translation id="7548856833046333824">Cocktail</translation> <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Fehler beim Download von <ph name="FILE_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 676efbd6..9e2c063 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -971,6 +971,7 @@ <translation id="2508428939232952663">Λογαριασμός Google Play Store</translation> <translation id="2509495747794740764">Η κλίμακα πρέπει να είναι αριθμός μεταξύ του 10 και του 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Αυτόματη συμπλήρωση φορμών</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Σάρωση</translation> <translation id="2518024842978892609">Χρήση των πιστοποιητικών πελάτη σας</translation> @@ -3608,6 +3609,7 @@ <translation id="6639554308659482635">Μνήμη SQLite</translation> <translation id="6641138807883536517">Ο κωδικός πρόσβασης ασφαλούς λειτουργικής μονάδας που δημιουργήθηκε τυχαία δεν είναι διαθέσιμος. Αυτό είναι φυσιολογικό μετά το Powerwash.</translation> <translation id="6643016212128521049">Διαγραφή</translation> +<translation id="6644512095122093795">Να προτείνεται αποθήκευση των κωδικών πρόσβασης</translation> <translation id="6644846457769259194">Ενημέρωση της συσκευής σας (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL ανάκλησης Αρχής πιστοποίησης του Netscape</translation> <translation id="6647838571840953560">Αυτήν τη στιγμή στο κανάλι <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index c28dfd63..7dd5dcd0 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -630,6 +630,7 @@ <translation id="1944921356641260203">Update found</translation> <translation id="1951615167417147110">Scroll up one page</translation> <translation id="1956050014111002555">The file contained multiple certificates, none of which were imported:</translation> +<translation id="1956390763342388273">This will upload all files from '<ph name="FOLDER_PATH" />'. Only do this if you trust the site.</translation> <translation id="1962233722219655970">This page uses a Native Client app that doesn't work on your computer.</translation> <translation id="1962969542251276847">Lock Screen</translation> <translation id="1963227389609234879">Remove All</translation> @@ -842,6 +843,7 @@ <translation id="2294358108254308676">Do you want to install <ph name="PRODUCT_NAME" />?</translation> <translation id="2296019197782308739">EAP method:</translation> <translation id="2297705863329999812">Search printers</translation> +<translation id="2300383962156589922">Customise and control <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">Extension root directory is invalid.</translation> <translation id="2302685579236571180">Go incognito</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" has requested additional permissions.</translation> @@ -971,6 +973,7 @@ <translation id="2508428939232952663">Google Play Store Account</translation> <translation id="2509495747794740764">Scale amount must be a number between 10 and 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Auto-fill forms</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scan</translation> <translation id="2518024842978892609">Use your client certificates</translation> @@ -1329,6 +1332,7 @@ <translation id="3012917896646559015">Please contact your hardware manufacturer immediately to send your computer to a repair facility.</translation> <translation id="3013291976881901233">MIDI devices</translation> <translation id="3014095112974898292">Waiting for other requests to complete...</translation> +<translation id="3015639418649705390">Relaunch now</translation> <translation id="3015992588037997514">Does this code appear on your Chromebox screen?</translation> <translation id="3016641847947582299">Component updated</translation> <translation id="3016780570757425217">Know your location</translation> @@ -2205,6 +2209,7 @@ <translation id="4430369329743628066">Bookmark added</translation> <translation id="443454694385851356">Legacy (insecure)</translation> <translation id="443464694732789311">Continue</translation> +<translation id="443475966875174318">Update or remove incompatible applications</translation> <translation id="4439318412377770121">Do you wish to register <ph name="DEVICE_NAME" /> to Google Cloud Devices?</translation> <translation id="4441124369922430666">Do you want to automatically start this app when the machine turns on?</translation> <translation id="444134486829715816">Expand...</translation> @@ -2387,6 +2392,7 @@ <translation id="473775607612524610">Update</translation> <translation id="474217410105706308">Mute Tab</translation> <translation id="4742746985488890273">Pin to Shelf</translation> +<translation id="4743260470722568160"><ph name="BEGIN_LINK" />Find out how to update applications<ph name="END_LINK" /></translation> <translation id="4744574733485822359">Your download has completed</translation> <translation id="4746971725921104503">Looks like you're already managing a user by that name. Did you want to <ph name="LINK_START" />import <ph name="USER_DISPLAY_NAME" /> to this device<ph name="LINK_END" />?</translation> <translation id="4748762018725435655">Requires extension from the Chrome Web Store</translation> @@ -3198,6 +3204,7 @@ <ph name="BEGIN_PARAGRAPH2" />You can turn this on or off at any time in the Android apps Settings. This doesn’t affect your device’s ability to send the information it needs to receive essential services such as system updates and security.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990386583461751448">Translated</translation> <translation id="5991049340509704927">Magnify</translation> +<translation id="599131315899248751">{NUM_APPLICATIONS,plural, =1{To ensure that you can keep browsing the web, ask your administrator to remove this application.}other{To ensure that you can keep browsing the web, ask your administrator to remove these applications.}}</translation> <translation id="5993332328670040093">Your data use will no longer be measured.</translation> <translation id="600424552813877586">Invalid application.</translation> <translation id="6005695835120147974">Media Router</translation> @@ -3606,6 +3613,7 @@ <translation id="6639554308659482635">SQLite memory</translation> <translation id="6641138807883536517">The randomly generated secure module password is not available. This is normal after a Powerwash.</translation> <translation id="6643016212128521049">Clear</translation> +<translation id="6644512095122093795">Offer to save passwords</translation> <translation id="6644846457769259194">Updating your device (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape Certification Authority Revocation URL</translation> <translation id="6647838571840953560">Currently on <ph name="CHANNEL_NAME" /></translation> @@ -3852,6 +3860,7 @@ <translation id="7040138676081995583">Open with...</translation> <translation id="7040230719604914234">Operator</translation> <translation id="7042418530779813870">Pa&ste and search</translation> +<translation id="7043108582968290193">Finished! No incompatible applications found.</translation> <translation id="7049293980323620022">Keep file?</translation> <translation id="7051943809462976355">Searching for mouse...</translation> <translation id="7052237160939977163">Send performance trace data</translation> @@ -4023,6 +4032,7 @@ <translation id="7328867076235380839">Invalid combination</translation> <translation id="7329154610228416156">Sign-in failed because it was configured to use a non-secure URL (<ph name="BLOCKED_URL" />). Please contact your administrator.</translation> <translation id="7334190995941642545">Smart Lock is currently unavailable. Please try again later.</translation> +<translation id="7334274148831027933">Enable docked magnifier</translation> <translation id="7339763383339757376">PKCS #7, single certificate</translation> <translation id="7339785458027436441">Check Spelling While Typing</translation> <translation id="7339898014177206373">New window</translation> @@ -4396,6 +4406,7 @@ <translation id="7912080627461681647">Your password has been changed on the server. Please sign out then sign in again.</translation> <translation id="7912883689016444961">Configure mobile network</translation> <translation id="7915471803647590281">Please tell us what is happening before sending the feedback.</translation> +<translation id="792514962475806987">Docked zoom level:</translation> <translation id="7925247922861151263">AAA check failed</translation> <translation id="7925285046818567682">Waiting for <ph name="HOST_NAME" />...</translation> <translation id="7925686952655276919">Do not use mobile data for sync</translation> @@ -4777,6 +4788,7 @@ <translation id="8546541260734613940">[*.]sample.co.uk</translation> <translation id="854655314928502177">Web Proxy Auto Discovery URL:</translation> <translation id="8546930481464505581">Customise Touch Bar</translation> +<translation id="8547013269961688403">Enable full-screen magnifier</translation> <translation id="85486688517848470">Hold the Search key to switch the behaviour of the top-row keys</translation> <translation id="855081842937141170">Pin tab</translation> <translation id="8551388862522347954">Licences</translation> @@ -4831,6 +4843,7 @@ <translation id="8642947597466641025">Make Text Larger</translation> <translation id="8647834505253004544">Not a valid web address</translation> <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> or <ph name="RE_SCAN_LINK" /></translation> +<translation id="8650543407998814195">Although you can no longer access your old profile, you can still remove it.</translation> <translation id="8651585100578802546">Force Reload This Page</translation> <translation id="8652400352452647993">Pack extension error</translation> <translation id="8652487083013326477">page range radio button</translation> @@ -4907,7 +4920,9 @@ <translation id="8737685506611670901">Open <ph name="PROTOCOL" /> links instead of <ph name="REPLACED_HANDLER_TITLE" /></translation> <translation id="8737709691285775803">Shill</translation> <translation id="8741316211671074806">Picture-in-picture</translation> +<translation id="8743390665131937741">Full-screen zoom level:</translation> <translation id="8743864605301774756">Updated 1hr ago</translation> +<translation id="874689135111202667">{0,plural, =1{Upload one file to this site?}other{Upload # files to this site?}}</translation> <translation id="8749863574775030885">Access USB devices from an unknown vendor</translation> <translation id="8754200782896249056"><p>When running <ph name="PRODUCT_NAME" /> under a supported desktop environment, the system proxy settings will be used. However, either your system is not supported or there was a problem launching your system configuration.</p> @@ -5212,6 +5227,7 @@ <translation id="960719561871045870">Operator code</translation> <translation id="960987915827980018">About 1 hour left</translation> <translation id="962802172452141067">Bookmark folder tree</translation> +<translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Application}other{Applications}}</translation> <translation id="968000525894980488">Turn on Google Play services.</translation> <translation id="968174221497644223">Application cache</translation> <translation id="969096075394517431">Change languages</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index f9663bc..9f59247 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">Cuenta de Google Play Store</translation> <translation id="2509495747794740764">El valor de la escala debe ser un número entre 10 y 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Autocompletar formularios</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Buscar</translation> <translation id="2518024842978892609">Usar los certificados de cliente</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">Memoria SQLite</translation> <translation id="6641138807883536517">La contraseña del módulo de seguridad generada de manera aleatoria no está disponible. Esto es normal después de un Powerwash.</translation> <translation id="6643016212128521049">Borrar</translation> +<translation id="6644512095122093795">Sugerir que se guarden las contraseñas</translation> <translation id="6644846457769259194">Actualizando tu dispositivo (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL de revocación de entidad de certificación de Netscape</translation> <translation id="6647838571840953560">Actualmente estás en el canal <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 934f67e..9b6ff93 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Cuenta de Google Play Store</translation> <translation id="2509495747794740764">El valor de la escala debe ser un número entre 10 y 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Autocompletar formularios</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Buscar</translation> <translation id="2518024842978892609">Utilizar tus certificados de cliente</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">Memoria de SQLite</translation> <translation id="6641138807883536517">La contraseña del modulo de seguridad generada de forma aleatoria no está disponible (suele ocurrir después de un Powerwash).</translation> <translation id="6643016212128521049">Eliminar</translation> +<translation id="6644512095122093795">Preguntar si quiero guardar contraseñas</translation> <translation id="6644846457769259194">Actualizando el dispositivo (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL de revocación de la entidad emisora de certificados de Netscape</translation> <translation id="6647838571840953560">Actualmente en <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 98631c07..2654d77 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play poe konto</translation> <translation id="2509495747794740764">Skaleerimise määr peab olema arv vahemikus 10–200.</translation> <translation id="2509566264613697683">8-kordne</translation> +<translation id="2512222046227390255">Automaatse täitmise vormid</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Kontrolli</translation> <translation id="2518024842978892609">Kasutage oma kliendisertifikaate</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">SQLite'i mälu</translation> <translation id="6641138807883536517">Juhuslikult loodud turvamooduli parool pole saadaval. See on pärast Powerwashi tavapärane.</translation> <translation id="6643016212128521049">Tühjenda</translation> +<translation id="6644512095122093795">Paku paroolide salvestamist</translation> <translation id="6644846457769259194">Seadme värskendamine (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape'i sertifitseerimisorgani tühistus-URL</translation> <translation id="6647838571840953560">Praegu kanalil <ph name="CHANNEL_NAME" /></translation> @@ -4160,7 +4162,7 @@ <translation id="7544853251252956727">Esita juhuslikus järjekorras</translation> <translation id="7545415673537747415"><ph name="BEGIN_LINK" />Google'i kontotegevuste haldus<ph name="END_LINK" /> võimaldab juhtida seda, kuidas Google kasutab teie sirvimisajalugu otsingu, reklaamide ja muude Google'i teenuste isikupärastamiseks.</translation> <translation id="7547317915858803630">Hoiatus: teie rakenduse <ph name="PRODUCT_NAME" /> seaded on talletatud võrgukettal. See võib põhjustada seadme töö aeglustumist, krahhe ja isegi andmete kadumist.</translation> -<translation id="7547483330017600937">Arendage seadmes <ph name="DEVICE_TYPE" />. Teil on võimalik oma lemmikomarakendusi ja käsurea tööriistu sujuvalt ning turvaliselt käitada. +<translation id="7547483330017600937">Arendage seadmes <ph name="DEVICE_TYPE" /> tarkvara. Teil on võimalik oma lemmikomarakendusi ja käsurea tööriistu sujuvalt ning turvaliselt käitada. Rakenduse <ph name="APP_NAME" /> installimisel laaditakse alla <ph name="DOWNLOAD_SIZE" /> andmeid.</translation> <translation id="7548856833046333824">Limonaad</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index b8cea1b..acc88792 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">حساب فروشگاه Google Play</translation> <translation id="2509495747794740764">مقیاس باید عددی بین ۱۰ تا ۲۰۰ باشد.</translation> <translation id="2509566264613697683">۸ برابر</translation> +<translation id="2512222046227390255">تکمیل خودکار فرمها</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">اسکن</translation> <translation id="2518024842978892609">استفاده از گواهیهای کلاینت شما</translation> @@ -3602,6 +3603,7 @@ <translation id="6639554308659482635">حافظه SQLite</translation> <translation id="6641138807883536517">گذرواژه بهصورت تصادفی ایجادشده مدول امن دردسترس نیست. این حالت بعد از Powerwash عادی است.</translation> <translation id="6643016212128521049">پاک کردن</translation> +<translation id="6644512095122093795">پیشنهاد برای ذخیره رمزهای ورود</translation> <translation id="6644846457769259194">درحال بهروزرسانی دستگاه شما (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">نشانی وب ابطال ارائه دهنده مجوز Netscape</translation> <translation id="6647838571840953560">درحالحاضر در کانال <ph name="CHANNEL_NAME" /> است</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 54170d12..77cf297 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -420,7 +420,7 @@ <translation id="1624026626836496796">Tämä tehdään vain kerran, eikä kirjautumistietoja tallenneta.</translation> <translation id="1627276047960621195">Tiedostokuvaajat</translation> <translation id="1627408615528139100">Ladattu aiemmin</translation> -<translation id="1632803087685957583">Voit muuttaa näppäinten toistumistiheyttä, sanojen ennakointia ja muuta.</translation> +<translation id="1632803087685957583">Voit muuttaa näppäinten toistoprosenttia, sanojen ennakointia ja muuta.</translation> <translation id="1632840525091989276">Tämä laite lähettää tällä hetkellä diagnostiikka- ja käyttötietoja Googlelle. Omistaja vaatii tämän asetuksen käyttöä. <ph name="BEGIN_LINK1" />Lisätietoja<ph name="END_LINK1" /></translation> <translation id="1635033183663317347">Valvojasi asentama</translation> <translation id="1637224376458524414">Käytä tätä kirjanmerkkiä iPhonessa</translation> @@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play Kauppa ‑tili</translation> <translation id="2509495747794740764">Asteikon on oltava numero välillä 10–200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Lomakkeiden automaattinen täyttö</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Etsi</translation> <translation id="2518024842978892609">Käyttää käyttöoikeusvarmenteita.</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">SQLiten käyttämä muisti</translation> <translation id="6641138807883536517">Sattumanvarainen suojausmoduulin salasana ei ole saatavilla. Tämä on normaalia Powerwashin jälkeen.</translation> <translation id="6643016212128521049">Tyhjennä</translation> +<translation id="6644512095122093795">Tarjoa salasanojen tallentamista</translation> <translation id="6644846457769259194">Päivitetään laitetta (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape-varmenteen myöntäjän kumoamis-URL</translation> <translation id="6647838571840953560">Käytössä: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 20ab2e6..5bbb51c 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play Store Account</translation> <translation id="2509495747794740764">Dapat ay numero sa pagitan ng 10 at 200 ang halaga ng scale.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">I-autofill ang mga form</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">I-scan</translation> <translation id="2518024842978892609">Gamitin ang iyong mga client certificate</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">Memorya sa SQLite</translation> <translation id="6641138807883536517">Hindi available ang random na ginawang password ng secure na module. Normal lang ito pagkatapos ng Powerwash.</translation> <translation id="6643016212128521049">I-clear</translation> +<translation id="6644512095122093795">Mag-alok na mag-save ng mga password</translation> <translation id="6644846457769259194">Ina-update ang iyong device (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape Certification Authority Revocation URL</translation> <translation id="6647838571840953560">Kasalukuyang nasa <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 6f2015b..112a42e 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Compte Google Play Store</translation> <translation id="2509495747794740764">La valeur d'échelle doit être un nombre compris entre 10 et 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Saisie auto des formulaires</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Rechercher</translation> <translation id="2518024842978892609">Utiliser vos certificats client</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">Mémoire SQLite</translation> <translation id="6641138807883536517">Le mot de passe du module sécurisé généré de façon aléatoire n'est pas disponible, ce qui est normal après un Powerwash.</translation> <translation id="6643016212128521049">Effacer</translation> +<translation id="6644512095122093795">Proposer d'enregistrer les mots de passe</translation> <translation id="6644846457769259194">Mise à jour de votre appareil (<ph name="PROGRESS_PERCENT" />)…</translation> <translation id="6647228709620733774">URL de révocation de l'autorité de certification Netscape</translation> <translation id="6647838571840953560">Version actuelle : <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index c0b874b..33034d4 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -966,6 +966,7 @@ <translation id="2508428939232952663">Google Play સ્ટોર એકાઉન્ટ</translation> <translation id="2509495747794740764">સ્કેલ પ્રમાણ, 10 અને 200 ની વચ્ચેની કોઈ સંખ્યા હોવી આવશ્યક છે.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">સ્વતઃભરો ફોર્મ</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">સ્કૅન કરો</translation> <translation id="2518024842978892609">તમારા ક્લાઇન્ટ પ્રમાણપત્રોનો ઉપયોગ કરો</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">SQLite મેમરી</translation> <translation id="6641138807883536517">રૅન્ડમલી બનાવવામાં આવેલો સુરક્ષિત મોડ્યુલ પાસવર્ડ ઉપલબ્ધ નથી. પાવરવૉશ પછી આમ થવું સામાન્ય છે.</translation> <translation id="6643016212128521049">સાફ કરો</translation> +<translation id="6644512095122093795">પાસવર્ડ્સ સાચવવા માટે પ્રદાન કરો</translation> <translation id="6644846457769259194">તમારું ઉપકરણ અપડેટ થઈ રહ્યું છે (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">નેટસ્કેપ પ્રમાણન અધિકારી રિવોકેશન URL</translation> <translation id="6647838571840953560">હાલમાં <ph name="CHANNEL_NAME" /> પર છે</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index d14c0d1..d8b3474 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play स्टोर खाता</translation> <translation id="2509495747794740764">स्केल राशि की संख्या 10 और 200 के बीच होनी चाहिए.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">स्वत: भरण फ़ॉर्म</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">स्कैन करें</translation> <translation id="2518024842978892609">अपने क्लाइंट प्रमाणपत्रों का उपयोग करें</translation> @@ -3605,6 +3606,7 @@ <translation id="6639554308659482635">SQLite मेमोरी</translation> <translation id="6641138807883536517">बिना किसी क्रम से जेनरेट किया गया सुरक्षित मॉड्यूल पासवर्ड उपलब्ध नहीं है. Powerwash के बाद आमतौर पर ऐसा होता है.</translation> <translation id="6643016212128521049">साफ़ करें</translation> +<translation id="6644512095122093795">पासवर्ड सहेजने की पेशकश करें</translation> <translation id="6644846457769259194">आपका डिवाइस अपडेट हो रहा है (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape प्रमाणन प्राधिकरण खण्डन URL</translation> <translation id="6647838571840953560">वर्तमान में <ph name="CHANNEL_NAME" /> पर</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index d2d8993..f7c3ab5 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Račun Trgovine Google Play</translation> <translation id="2509495747794740764">Iznos skaliranja mora biti broj od 10 do 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Automatsko popunjavanje obrazaca</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Traži</translation> <translation id="2518024842978892609">Upotreba vaših korisničkih certifikata</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">SQLite memorija</translation> <translation id="6641138807883536517">Nasumično generirana zaporka sigurnog modula nije dostupna. To je uobičajeno nakon primjene funkcije Powerwash.</translation> <translation id="6643016212128521049">Izbriši</translation> +<translation id="6644512095122093795">Ponudi spremanje zaporki</translation> <translation id="6644846457769259194">Ažuriranje uređaja (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL za opoziv tijela za izdavanje Netscape certifikata</translation> <translation id="6647838571840953560">Trenutačni kanal: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 973d742..f092d75 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play Áruház-fiók</translation> <translation id="2509495747794740764">Az átméretezési értéknek 10 és 200 közötti számnak kell lennie.</translation> <translation id="2509566264613697683">8×</translation> +<translation id="2512222046227390255">Űrlapok automatikus kitöltése</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Keresés</translation> <translation id="2518024842978892609">Klienstanúsítványok használata</translation> @@ -3608,6 +3609,7 @@ <translation id="6639554308659482635">SQLite memória</translation> <translation id="6641138807883536517">A véletlenszerűen generált biztonságimodul-jelszó nem áll rendelkezésre. Powerwash művelet után ez normális.</translation> <translation id="6643016212128521049">Törlés</translation> +<translation id="6644512095122093795">Jelszavak mentésének felajánlása</translation> <translation id="6644846457769259194">Eszköz frissítése (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape tanúsítványkibocsátó -- visszavonási URL</translation> <translation id="6647838571840953560">Jelenleg a(z) <ph name="CHANNEL_NAME" /> csatornán</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 00c0448..813d393 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -553,7 +553,7 @@ <translation id="1818007989243628752">Hapus sandi untuk <ph name="USERNAME" /></translation> <translation id="1819721979226826163">Tap Notifikasi aplikasi > Layanan Google Play.</translation> <translation id="1826516787628120939">Memeriksa</translation> -<translation id="1828149253358786390"><ph name="SITE" /> ingin mengirimi Anda pemberitahuan.</translation> +<translation id="1828149253358786390"><ph name="SITE" /> ingin mengirimi Anda notifikasi.</translation> <translation id="1828378091493947763">Plugin tidak didukung di perangkat ini</translation> <translation id="1828901632669367785">Cetak Menggunakan Dialog Sistem...</translation> <translation id="1829192082282182671">Per&kecil</translation> @@ -970,6 +970,7 @@ <translation id="2508428939232952663">Akun Google Play Store</translation> <translation id="2509495747794740764">Jumlah skala harus berupa angka antara 10 dan 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Formulir Isi-Otomatis</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Pindai</translation> <translation id="2518024842978892609">Gunakan sertifikat klien Anda</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">Memori SQLite</translation> <translation id="6641138807883536517">Sandi modul aman yang dibuat secara acak tidak tersedia. Hal ini normal setelah menjalankan Powerwash.</translation> <translation id="6643016212128521049">Hapus</translation> +<translation id="6644512095122093795">Tawarkan untuk menyimpan sandi</translation> <translation id="6644846457769259194">Memperbarui perangkat (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL Kebijakan Otoritas Sertifikasi Netscape</translation> <translation id="6647838571840953560">Saat ini di <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index bb90e0c..485c1cd 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Account Google Play Store</translation> <translation id="2509495747794740764">Il valore Scala deve essere un numero compreso tra 10 e 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Compilazione automatica dei moduli</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scansiona</translation> <translation id="2518024842978892609">Utilizza certificati client</translation> @@ -3602,6 +3603,7 @@ <translation id="6639554308659482635">Memoria SQLite</translation> <translation id="6641138807883536517">La password del modulo per la sicurezza generata in modo casuale non è disponibile, ma è normale dopo un Powerwash.</translation> <translation id="6643016212128521049">Cancella</translation> +<translation id="6644512095122093795">Chiedi di salvare le password</translation> <translation id="6644846457769259194">Aggiornamento del dispositivo in corso (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL di revoca dell'autorità di certificazione Netscape</translation> <translation id="6647838571840953560">Attualmente su <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index bf279f2..bccb9b5 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">חשבון בחנות Google Play</translation> <translation id="2509495747794740764">שיעור קנה המידה חייב להיות מספר בין 10 ל-200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">מילוי אוטומטי של טפסים</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">סריקה</translation> <translation id="2518024842978892609">שימוש באישורי הלקוח</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">זיכרון SQLite </translation> <translation id="6641138807883536517">סיסמת המודול המאובטח הנוצרת באופן אקראי אינה זמינה. זהו מצב רגיל לאחר ביצוע Powerwash.</translation> <translation id="6643016212128521049">נקה</translation> +<translation id="6644512095122093795">הצע לשמור סיסמאות</translation> <translation id="6644846457769259194">מעדכן את המכשיר שלך (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">כתובת אתר לביטול של רשות אישורי Netscape</translation> <translation id="6647838571840953560">עכשיו בערוץ <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 9a4de9f..63fa203 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -971,6 +971,7 @@ <translation id="2508428939232952663">Google Play ストア アカウント</translation> <translation id="2509495747794740764">倍率は 10~200 の数値で指定してください。</translation> <translation id="2509566264613697683">8 倍</translation> +<translation id="2512222046227390255">フォームへの自動入力</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">スキャン</translation> <translation id="2518024842978892609">ユーザーのクライアント証明書の使用</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">SQLite メモリ</translation> <translation id="6641138807883536517">ランダム生成のセキュア モジュール パスワードが使用できなくなっています。これは Powerwash の実行後に通常起こることです。</translation> <translation id="6643016212128521049">クリア</translation> +<translation id="6644512095122093795">パスワードを保存できるようにする</translation> <translation id="6644846457769259194">端末を更新しています(<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape 認証局取り消し URL</translation> <translation id="6647838571840953560">現在のチャンネルは <ph name="CHANNEL_NAME" /> です</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 8737df4..a3abc75 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">Google Play ಸ್ಟೋರ್ ಖಾತೆ</translation> <translation id="2509495747794740764">ಸ್ಕೇಲ್ ಪ್ರಮಾಣವು 10 ಮತ್ತು 200 ನಡುವಿನ ಸಂಖ್ಯೆಯಾಗಿರಬೇಕು.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">ಸ್ವಯಂತುಂಬುವಿಕೆ ಫಾರ್ಮ್ಗಳು</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">ಸ್ಕ್ಯಾನ್</translation> <translation id="2518024842978892609">ನಿಮ್ಮ ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಬಳಸಿ</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">SQLite ಮೆಮೊರಿ</translation> <translation id="6641138807883536517">ರ್ಯಾಂಡಮ್ ಆಗಿ ರಚಿಸಲಾದ, ಸುಭದ್ರ ಮಾಡ್ಯೂಲ್ ಪಾಸ್ವರ್ಡ್ ಲಭ್ಯವಿಲ್ಲ. Powerwash ಬಳಿಕ ಹೀಗಾಗುವುದು ಸಾಮಾನ್ಯವಾಗಿದೆ.</translation> <translation id="6643016212128521049">ತೆರವುಗೊಳಿಸಿ</translation> +<translation id="6644512095122093795">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಲು ಸೂಚಿಸು</translation> <translation id="6644846457769259194">ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape ಪ್ರಮಾಣಪತ್ರ ಪ್ರಾಧಿಕಾರ ಹಿಂತೆಗೆದುಕೊಳ್ಳುವಿಕೆ URL</translation> <translation id="6647838571840953560">ಪ್ರಸ್ತುತ <ph name="CHANNEL_NAME" /> ನಲ್ಲಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 89acda2e..47809ad 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -971,6 +971,7 @@ <translation id="2508428939232952663">Google Play 스토어 계정</translation> <translation id="2509495747794740764">배율 값은 10에서 200 사이의 숫자여야 합니다.</translation> <translation id="2509566264613697683">8배</translation> +<translation id="2512222046227390255">양식 자동완성</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">검색</translation> <translation id="2518024842978892609">클라이언트 인증서 사용</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">SQLite 메모리</translation> <translation id="6641138807883536517">임의로 생성된 보안 모듈 비밀번호는 사용할 수 없습니다. 이는 파워워시 후에는 정상적으로 나타나는 현상입니다.</translation> <translation id="6643016212128521049">삭제</translation> +<translation id="6644512095122093795">비밀번호 저장 여부 확인</translation> <translation id="6644846457769259194">기기 업데이트 중(<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape 인증 기관 취소 URL</translation> <translation id="6647838571840953560">현재 <ph name="CHANNEL_NAME" /> 사용 중</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index ea143900..5d28713b 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">„Google Play“ parduotuvės paskyra</translation> <translation id="2509495747794740764">Mastelio verčių suma turi būti skaičius nuo 10 iki 200.</translation> <translation id="2509566264613697683">8 k.</translation> +<translation id="2512222046227390255">Automatinis formų pildymas</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Nuskaityti</translation> <translation id="2518024842978892609">Naudoti klientų sertifikatus</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">„SQLite“ atmintis</translation> <translation id="6641138807883536517">Šis atsitiktinai sugeneruotas saugaus modulio slaptažodis nepasiekiamas. Tai įprasta po „Powerwash“ vykdymo.</translation> <translation id="6643016212128521049">Išvalyti</translation> +<translation id="6644512095122093795">Siūlyti išsaugoti slaptažodžius</translation> <translation id="6644846457769259194">Atnaujinamas įrenginys (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">„Netscape“ sertifikavimo institucijos panaikinimo URL</translation> <translation id="6647838571840953560">Dabar naudojama: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 5a105ff..a87f7a6 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play veikala konts</translation> <translation id="2509495747794740764">Mērogošanas apjomam ir jābūt skaitlim no 10 līdz 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Veidlapu automātiskā aizpilde</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Meklēt</translation> <translation id="2518024842978892609">Izmantot jūsu klientu sertifikātus</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">SQLite atmiņa</translation> <translation id="6641138807883536517">Pēc nejaušības principa ģenerētā drošības moduļa parole nav pieejama. Tā nereti notiek pēc funkcijas Powerwash izmantošanas.</translation> <translation id="6643016212128521049">Notīrīt</translation> +<translation id="6644512095122093795">Piedāvāt saglabāt paroles</translation> <translation id="6644846457769259194">Notiek ierīces atjaunināšana (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape sertifikāta izdevējiestādes atsaukšanas URL</translation> <translation id="6647838571840953560">Pašreizējā versija: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index d4c689f..9e6bfaf 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -968,6 +968,7 @@ <translation id="2508428939232952663">Google Play സ്റ്റോർ അക്കൗണ്ട്</translation> <translation id="2509495747794740764">സ്കെയിൽ തുക 10-നും 200-നും ഇടയിലുള്ള സംഖ്യ ആയിരിക്കണം.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">ഓട്ടോഫിൽ ഫോമുകൾ</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">സ്കാൻ ചെയ്യുക</translation> <translation id="2518024842978892609">നിങ്ങളുടെ ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകൾ ഉപയോഗിക്കുക</translation> @@ -3604,6 +3605,7 @@ <translation id="6639554308659482635">SQLite മെമ്മറി</translation> <translation id="6641138807883536517">ക്രമരഹിതമായി ജനറേറ്റുചെയ്ത സുരക്ഷിത മൊഡ്യൂൾ പാസ്വേഡ് ലഭ്യമല്ല. 'പവർവാഷി'ന് ശേഷം ഇങ്ങനെ സംഭവിക്കുന്നത് സ്വാഭാവികമാണ്.</translation> <translation id="6643016212128521049">മായ്ക്കുക</translation> +<translation id="6644512095122093795">പാസ്വേഡുകള് സംരക്ഷിക്കുന്നതിനുള്ള നിര്ദ്ദേശം</translation> <translation id="6644846457769259194">നിങ്ങളുടെ ഉപകരണം അപ്ഡേറ്റുചെയ്യുന്നു, (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">നെറ്റ്സ്കേപ്പ് സര്ട്ടിഫിക്കേഷന് അതോറിറ്റി അസാധുവാക്കല് URL</translation> <translation id="6647838571840953560">നിലവിൽ <ph name="CHANNEL_NAME" /> ചാനലിലാണ്</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index ca52ba98..39eb0fe 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -377,7 +377,7 @@ <translation id="155865706765934889">Touchpad</translation> <translation id="1559235587769913376">युनिकोड वर्ण इनपुट करा</translation> <translation id="1566049601598938765">वेबसाइट</translation> -<translation id="1567387640189251553">तुम्ही शेवटचा पासवर्ड टाकल्या नंतर वेगर्ड कीबोर्ड कनेक्ट करण्यात आला आहे. तो कदाचित तुमचे कीस्ट्रोक चोरण्याचा प्रयत्न करत असेल.</translation> +<translation id="1567387640189251553">तुम्ही शेवटचा पासवर्ड टाकल्या नंतर वेगळा कीबोर्ड कनेक्ट करण्यात आला आहे. तो कदाचित तुमचे कीस्ट्रोक चोरण्याचा प्रयत्न करत असेल.</translation> <translation id="1567993339577891801">JavaScript कन्सोल</translation> <translation id="1568067597247500137">साइट निःशब्द करा</translation> <translation id="1568323446248056064">प्रदर्शन डीव्हाइस सेटिंग्ज उघडा</translation> @@ -969,6 +969,7 @@ <translation id="2508428939232952663">Google Play स्टोअर खाते</translation> <translation id="2509495747794740764">स्केल मूल्य 10 आणि 200 दरम्यानचा नंबर असणे आवश्यक आहे.</translation> <translation id="2509566264613697683">८x</translation> +<translation id="2512222046227390255">स्वयं-भरण फॉर्म</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">स्कॅन करा</translation> <translation id="2518024842978892609">आपली क्लायंट प्रमाणपत्रे वापरा</translation> @@ -3490,7 +3491,7 @@ <translation id="645705751491738698">JavaScript अवरोधित करणे सुरू ठेवा</translation> <translation id="6458308652667395253">JavaScript अवरोधित करणे व्यवस्थापित करा...</translation> <translation id="6459488832681039634">शोधण्यासाठी निवड वापरा</translation> -<translation id="6459799433792303855">सक्रिय विंडो दुसऱ्या डिस्प्लेवर हलवली आहे.</translation> +<translation id="6459799433792303855">अॅक्टिव्ह विंडो दुसऱ्या डिस्प्लेवर हलवली आहे.</translation> <translation id="6460601847208524483">पुढील शोधा</translation> <translation id="6462082050341971451">आपण अद्याप तिथे आहात?</translation> <translation id="6463795194797719782">&संपादन</translation> @@ -3602,6 +3603,7 @@ <translation id="6639554308659482635">SQLite मेमरी</translation> <translation id="6641138807883536517">यादृच्छिकपणे तयार केलेला सुरक्षित मॉड्यूल पासवर्ड उपलब्ध नाही. पॉवरवॉशनंतर असे होणे स्वाभाविक आहे.</translation> <translation id="6643016212128521049">साफ करा</translation> +<translation id="6644512095122093795">पासवर्ड जतन करण्यासाठी विचारा</translation> <translation id="6644846457769259194">आपले डिव्हाइस अपडेट करीत आहे (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape प्रमाणन अधिकृतता निरस्तीकरण URL</translation> <translation id="6647838571840953560">सध्या <ph name="CHANNEL_NAME" /> वर</translation> @@ -4156,7 +4158,7 @@ <translation id="7544853251252956727">शफल करा</translation> <translation id="7545415673537747415"><ph name="BEGIN_LINK" />Google क्रियाकलाप नियंत्रणे<ph name="END_LINK" /> मधून शोध, जाहिरात आणि इतर Google सेवा वैयक्तीकृत करण्यासाठी Google आपला ब्राउझिंग इतिहास कसा वापरते ते नियंत्रित करा.</translation> <translation id="7547317915858803630">चेतावणी: आपली <ph name="PRODUCT_NAME" /> सेटिंग्ज एका नेटवर्क ड्राइव्हवर संचयित करण्यात आली आहेत. यामुळे वेग मंदावणे, क्रॅश किंवा डेटा गमावणे हे परिणाम देखील होऊ शकतात.</translation> -<translation id="7547483330017600937">तुमच्या <ph name="DEVICE_TYPE" /> वर विकसित करा. तुमची स्थानिक अॅप्स आणि कमांड लाइन साधने अखंड आणि सुरक्षितपणे चालवू शकता. +<translation id="7547483330017600937">तुमच्या <ph name="DEVICE_TYPE" /> वर डेव्हलप करा. तुमची स्थानिक अॅप्स आणि कमांड लाइन साधने अखंड आणि सुरक्षितपणे चालवू शकता. <ph name="APP_NAME" /> इंस्टॉल केल्याने <ph name="DOWNLOAD_SIZE" /> डेटा डाउनलोड होईल</translation> <translation id="7548856833046333824">लेमोनेड</translation> <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> @@ -4890,7 +4892,7 @@ <translation id="8725178340343806893">मनपसंत/बुकमार्क</translation> <translation id="8726206820263995930">सर्व्हरवरून धोरण सेटिंग्ज आणताना एरर: <ph name="CLIENT_ERROR" />.</translation> <translation id="8727142376512517020">हे पुन्हा दर्शवू नका</translation> -<translation id="8727344521467137076">Chrome ला तुमच्या काँप्युटरवर धोकादायक सॉफ्टवेअर आढळले आहे. Chrome ते काढून टाकेल आणि तुमचा ब्राउझर पुन्हा नीट चालावा यासाठी तुमच्या सेटिंग्ज रीस्टोअर करेल.</translation> +<translation id="8727344521467137076">Chrome ला तुमच्या काँप्युटरवर धोकादायक सॉफ्टवेअर आढळले आहे. Chrome ते काढून टाकेल आणि तुमचा ब्राउझर पुन्हा नीट चालावा यासाठी तुमच्या सेटिंग्ज रिस्टोअर करेल.</translation> <translation id="8730621377337864115">पूर्ण झाले</translation> <translation id="8732030010853991079">या चिन्हावर क्लिक करुन हा विस्तार वापरा.</translation> <translation id="8732212173949624846">आपल्या सर्व साइन इन केलेल्या डिव्हाइसेसवर आपला ब्राउझिंग इतिहास वाचा आणि बदला</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index a0d9ad1d..8cba10a8 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Akaun Gedung Google Play</translation> <translation id="2509495747794740764">Amaun skala mestilah nombor antara 10 dan 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Auto isi borang</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Imbas</translation> <translation id="2518024842978892609">Gunakan sijil pelanggan anda</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">Memori SQLite</translation> <translation id="6641138807883536517">Kata laluan modul selamat yang dijana secara rawak tidak tersedia. Perkara ini biasa berlaku selepas Powerwash.</translation> <translation id="6643016212128521049">Kosongkan</translation> +<translation id="6644512095122093795">Tawarkan untuk menyimpan kata laluan</translation> <translation id="6644846457769259194">Mengemas kini peranti anda (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL Pembatalan Pihak Berkuasa Pensijilan Netscape</translation> <translation id="6647838571840953560">Pada masa ini di <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 475e87a..24c7840c 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play Store-account</translation> <translation id="2509495747794740764">De waarde voor de schaal moet een getal tussen de 10 en 200 zijn.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Formulieren automatisch invullen</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scannen</translation> <translation id="2518024842978892609">Je clientcertificaten gebruiken</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">SQLite-geheugen</translation> <translation id="6641138807883536517">Het willekeurig gegenereerde wachtwoord voor de beveiligde module is niet beschikbaar. Dit is normaal nadat de Powerwash-functie is uitgevoerd.</translation> <translation id="6643016212128521049">Wissen</translation> +<translation id="6644512095122093795">Aanbieden wachtwoorden op te slaan</translation> <translation id="6644846457769259194">Je apparaat updaten (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL voor intrekken van certificeringsinstantie voor Netscape-certificaat</translation> <translation id="6647838571840953560">Momenteel op <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index e86c5501..c6dcef5 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -374,7 +374,7 @@ <translation id="155865706765934889">Styreflate</translation> <translation id="1559235587769913376">Angi Unicode-tegn</translation> <translation id="1566049601598938765">Nettsted</translation> -<translation id="1567387640189251553">Et annet tastatur er koblet til etter at du sist skrev inn passordet ditt. Det prøver kanskje å stjele tastetrykkene dine.</translation> +<translation id="1567387640189251553">Et annet tastatur er koblet til etter at du sist skrev inn passordet ditt. Det brukes kanskje til å stjele tastetrykkene dine.</translation> <translation id="1567993339577891801">JavaScript-konsoll</translation> <translation id="1568067597247500137">Kutt lyden for nettsted</translation> <translation id="1568323446248056064">Åpne skjerminnstillingene på enheten</translation> @@ -967,6 +967,7 @@ <translation id="2508428939232952663">Google Play Butikk-konto</translation> <translation id="2509495747794740764">Skaleringsverdien må være et tall mellom 10 og 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Fyll ut skjemaer automatisk</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Skann</translation> <translation id="2518024842978892609">Bruk klientsertifikatene dine</translation> @@ -3597,6 +3598,7 @@ <translation id="6639554308659482635">SQLite-minne</translation> <translation id="6641138807883536517">Det tilfeldig genererte sikker modul-passordet er ikke tilgjengelig. Dette er vanlig etter en Powerwash.</translation> <translation id="6643016212128521049">Tøm</translation> +<translation id="6644512095122093795">Tilbud om å lagre passord</translation> <translation id="6644846457769259194">Oppdaterer enheten din (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Nettadresse for tilbakekalling av Netscape-autoritetssertifikat</translation> <translation id="6647838571840953560">Nå på <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index f5285e1..8b5c3a2 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Konto w Sklepie Google Play</translation> <translation id="2509495747794740764">Współczynnik skalowania musi wynosić od 10 do 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Autouzupełnianie formularzy</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Skanuj</translation> <translation id="2518024842978892609">Używanie certyfikatów klienta</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">Pamięć SQLite</translation> <translation id="6641138807883536517">Losowo generowane hasło modułu zabezpieczeń jest niedostępne. Ta sytuacja jest normalna po użyciu funkcji Powerwash.</translation> <translation id="6643016212128521049">Wyczyść</translation> +<translation id="6644512095122093795">Proponuj zapisywanie haseł</translation> <translation id="6644846457769259194">Aktualizuję Twoje urządzenie (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Adres URL odwołania urzędu certyfikacji firmy Netscape</translation> <translation id="6647838571840953560">Obecny kanał: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index f13726fb..efa2701f 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -553,7 +553,7 @@ <translation id="1818007989243628752">Excluir a senha de <ph name="USERNAME" /></translation> <translation id="1819721979226826163">Toque em Notificações de apps > Google Play Services.</translation> <translation id="1826516787628120939">Em verificação</translation> -<translation id="1828149253358786390"><ph name="SITE" /> deseja enviar notificações a você.</translation> +<translation id="1828149253358786390"><ph name="SITE" /> quer enviar notificações a você.</translation> <translation id="1828378091493947763">Este plug-in não é compatível com este dispositivo</translation> <translation id="1828901632669367785">Imprimir utilizando caixa de diálogo de sistema...</translation> <translation id="1829192082282182671">Diminuir &zoom</translation> @@ -970,6 +970,7 @@ <translation id="2508428939232952663">Conta da Google Play Store</translation> <translation id="2509495747794740764">O valor do dimensionamento precisa ser um número entre 10 e 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Preenchimento automático de formulários</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Verificar</translation> <translation id="2518024842978892609">Usar certificados de clientes</translation> @@ -3608,6 +3609,7 @@ <translation id="6639554308659482635">Memória SQLite</translation> <translation id="6641138807883536517">A senha do módulo de segurança gerada aleatoriamente não está disponível. Isso é normal após um Powerwash.</translation> <translation id="6643016212128521049">Limpar</translation> +<translation id="6644512095122093795">Oferecer salvar senhas</translation> <translation id="6644846457769259194">Atualizando seu dispositivo (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL da revogação da Autoridade de certificação do Netscape</translation> <translation id="6647838571840953560">No momento, no <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 5e6cf6f..f991c3fe 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -971,6 +971,7 @@ <translation id="2508428939232952663">Conta da Google Play Store</translation> <translation id="2509495747794740764">O valor de dimensionamento tem de ser um número entre 10 e 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Preenchimento autom. formulários</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Analisar</translation> <translation id="2518024842978892609">Utilizar os certificados de cliente</translation> @@ -3609,6 +3610,7 @@ <translation id="6639554308659482635">Memória SQLite</translation> <translation id="6641138807883536517">A palavra-passe do módulo seguro, gerada aleatoriamente, não está disponível. Esta situação é normal após um Powerwash.</translation> <translation id="6643016212128521049">Limpar</translation> +<translation id="6644512095122093795">Propor guardar palavras-passe</translation> <translation id="6644846457769259194">A atualizar o dispositivo (<ph name="PROGRESS_PERCENT" />)…</translation> <translation id="6647228709620733774">URL de revogação da autoridade de certificação Netscape</translation> <translation id="6647838571840953560">Atualmente no canal <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index a3eae1e8..01b64f2 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Contul Magazin Google Play</translation> <translation id="2509495747794740764">Valoarea redimensionării trebuie să fie un număr între 10 și 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Completare automată de formulare</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scanează</translation> <translation id="2518024842978892609">Folosește certificatele tale de client</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">Memorie SQLite</translation> <translation id="6641138807883536517">Parola generată aleatoriu pentru modulul securizat nu este disponibilă. Acest lucru este normal după utilizarea Powerwash.</translation> <translation id="6643016212128521049">Ștergeți</translation> +<translation id="6644512095122093795">Oferă-te să salvezi parolele</translation> <translation id="6644846457769259194">Se actualizează dispozitivul (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Adresă URL de revocare a autorității de certificare Netscape</translation> <translation id="6647838571840953560">În prezent, pe <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index e0c09aa..50ee6e8 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -969,6 +969,7 @@ <translation id="2508428939232952663">Аккаунт Google Play</translation> <translation id="2509495747794740764">Укажите значение от 10 до 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Автозаполнение форм</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Искать</translation> <translation id="2518024842978892609">Используйте сертификат клиента</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">Память SQLite</translation> <translation id="6641138807883536517">Случайно сгенерированный пароль безопасного модуля недоступен после выполнения функции Powerwash.</translation> <translation id="6643016212128521049">Очистить</translation> +<translation id="6644512095122093795">Предлагать сохранение паролей</translation> <translation id="6644846457769259194">Обновление устройства (<ph name="PROGRESS_PERCENT" />)…</translation> <translation id="6647228709620733774">URL отзыва ЦС Netscape</translation> <translation id="6647838571840953560">Сейчас на канале "<ph name="CHANNEL_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 6b531c3..f3a373b 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -971,6 +971,7 @@ <translation id="2508428939232952663">Účet Obchodu Google Play</translation> <translation id="2509495747794740764">Hodnota mierky musí byť v rozsahu od 10 do 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Automatické dopĺňanie formulárov</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Vyhľadať</translation> <translation id="2518024842978892609">Použiť certifikáty klienta</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">Pamäť nástroja SQLite</translation> <translation id="6641138807883536517">Náhodne generované heslo bezpečnostného modulu nie je k dispozícii. Po použití funkcie Powerwash je to normálne.</translation> <translation id="6643016212128521049">Vymazať</translation> +<translation id="6644512095122093795">Ponúknuť uloženie hesiel</translation> <translation id="6644846457769259194">Zariadenie sa aktualizuje (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Webová adresa pre odvolanie certifikačnej autority služby Netscape</translation> <translation id="6647838571840953560">Momentálne v kanáli <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index fd298ba..b10933a 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -971,6 +971,7 @@ <translation id="2508428939232952663">Račun za Trgovino Google Play</translation> <translation id="2509495747794740764">Vrednost za prilagajanje velikosti mora biti število med 10 in 200.</translation> <translation id="2509566264613697683">8 x</translation> +<translation id="2512222046227390255">Obrazci s samodejnim izpolnjevanjem</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Išči</translation> <translation id="2518024842978892609">Uporaba potrdil odjemalca</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">Pomnilnik SQLite</translation> <translation id="6641138807883536517">Naključno ustvarjeno geslo za varni modul ni na voljo. To je običajno po izvedbi funkcije Powerwash.</translation> <translation id="6643016212128521049">Počisti</translation> +<translation id="6644512095122093795">Ponudi shranjevanje gesel</translation> <translation id="6644846457769259194">Posodabljanje naprave (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Spletni naslov preklica overitelja Netscapeovega potrdila</translation> <translation id="6647838571840953560">Trenutno uporablja kanal: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index d90efdcc..fd2af79 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">Налог Google Play продавнице</translation> <translation id="2509495747794740764">Износ промене величине мора да буде број између 10 и 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Аутоматско попуњавање образаца</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Скенирај</translation> <translation id="2518024842978892609">Користи сертификате клијента</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">SQLite меморија</translation> <translation id="6641138807883536517">Насумично генерисана лозинка за безбедносни модул није доступна. То је нормално после Powerwash-а.</translation> <translation id="6643016212128521049">Обриши</translation> +<translation id="6644512095122093795">Понуди да сачуваш лозинке</translation> <translation id="6644846457769259194">Ажурирање уређаја (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL адреса за опозив ауторитета за издавање Netscape сертификата</translation> <translation id="6647838571840953560">Тренутно на <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index f0625c8..2e87209 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -969,6 +969,7 @@ <translation id="2508428939232952663">Konto i Google Play Butik</translation> <translation id="2509495747794740764">Förstoringsgraden måste vara ett tal mellan 10 och 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Fyll i formulär automatiskt</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Sök</translation> <translation id="2518024842978892609">Använda dina klientcertifikat</translation> @@ -3605,6 +3606,7 @@ <translation id="6639554308659482635">SQLite-minne</translation> <translation id="6641138807883536517">Det slumpmässigt genererade lösenordet för den säkra modulen är inte tillgängligt. Det här är normalt efter en powerwash.</translation> <translation id="6643016212128521049">Rensa</translation> +<translation id="6644512095122093795">Erbjud att spara lösenord</translation> <translation id="6644846457769259194">Enheten uppdateras(<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Webbadress till Netscapes spärrlista för certifikatutfärdare</translation> <translation id="6647838571840953560">För närvarande på <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index f3ac06b..a354556 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -968,6 +968,7 @@ <translation id="2508428939232952663">Akaunti ya Duka la Google Play</translation> <translation id="2509495747794740764">Lazima kiwango kiwe nambari kati ya 10 na 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Jaza fomu kiotomatiki</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Tafuta</translation> <translation id="2518024842978892609">Tumia vyeti vya seva teja yako</translation> @@ -3598,6 +3599,7 @@ <translation id="6639554308659482635">Kumbukumbu ya SQLite</translation> <translation id="6641138807883536517">Nenosiri la sehemu lililozalishwa bila mpangilio halipatikani. Hii ni kawadia baada ya Powerwash.</translation> <translation id="6643016212128521049">Futa</translation> +<translation id="6644512095122093795">Uliza kama manenosiri yahifadhiwe</translation> <translation id="6644846457769259194">Inasasisha kifaa chako <ph name="PROGRESS_PERCENT" /></translation> <translation id="6647228709620733774">URL ya Kupinga Mamlaka ya Uidhinishaji wa Netscape</translation> <translation id="6647838571840953560">Hivi sasa kwenye <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 985e2b45..7cb7c9f4 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play ஸ்டோர் கணக்கு</translation> <translation id="2509495747794740764">அளவீட்டின் மதிப்பானது 10 முதல் 200க்கு இடையில் இருக்க வேண்டும்.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">படிவங்களுக்கான தன்னிரப்பி</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">ஸ்கேன் செய்</translation> <translation id="2518024842978892609">க்ளையன்ட் சான்றிதழ்களைப் பயன்படுத்தவும்</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">SQLite நினைவகம்</translation> <translation id="6641138807883536517">பாதுகாப்பு மாட்யூலின் கடவுச்சொல் (தற்போக்காக உருவாக்கியது) இல்லை. பவர்வாஷிற்குப் பிறகு இப்படி நடப்பது இயல்பு.</translation> <translation id="6643016212128521049">அழி</translation> +<translation id="6644512095122093795">கடவுச்சொற்களைச் சேமிப்பதற்கான சலுகை</translation> <translation id="6644846457769259194">சாதனத்தைப் புதுப்பிக்கிறது (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape சான்றளிக்கும் மைய தளர்த்தல் URL</translation> <translation id="6647838571840953560">தற்போதைய சேனல்: <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index e3b2ac4a2..643b8dee 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play స్టోర్ ఖాతా</translation> <translation id="2509495747794740764">స్కేల్ ప్రమాణం తప్పనిసరిగా 10 మరియు 200 మధ్య ఉండే సంఖ్య అయ్యి ఉండాలి.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">స్వీయపూర్తి ఫారమ్లు</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">స్కాన్ చేయి</translation> <translation id="2518024842978892609">మీ క్లయింట్ ప్రమాణపత్రాలను ఉపయోగించడానికి అనుమతి</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">SQLite మెమరీ</translation> <translation id="6641138807883536517">యాదృచ్ఛికంగా రూపొందించబడిన సురక్షిత మాడ్యూల్ పాస్వర్డ్ అందుబాటులో లేదు. పవర్వాష్ తర్వాత ఇలా జరగడం సాధారణం.</translation> <translation id="6643016212128521049">క్లియర్ చేయి</translation> +<translation id="6644512095122093795">పాస్వర్డ్లను సేవ్ చెయ్యడానికి ప్రతిపాదన</translation> <translation id="6644846457769259194">మీ పరికరం నవీకరించబడుతోంది (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape ప్రమాణపత్రం అధికార రద్దు URL</translation> <translation id="6647838571840953560">ప్రస్తుతం <ph name="CHANNEL_NAME" />లో ఉన్నారు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index e75080721..d64da388 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">บัญชี Google Play Store</translation> <translation id="2509495747794740764">จำนวนขนาดต้องเป็นตัวเลขระหว่าง 10 และ 200</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">ป้อนฟอร์มอัตโนมัติ</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">สแกน</translation> <translation id="2518024842978892609">ใช้ใบรับรองไคลเอ็นต์</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">หน่วยความจำ SQLite</translation> <translation id="6641138807883536517">รหัสผ่านโมดูลที่สร้างแบบสุ่มไม่พร้อมใช้งาน เหตุการณ์นี้เป็นเรื่องปกติหลังจากการ Powerwash</translation> <translation id="6643016212128521049">ล้าง</translation> +<translation id="6644512095122093795">เสนอให้บันทึกรหัสผ่าน</translation> <translation id="6644846457769259194">กำลังอัปเดตอุปกรณ์ (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL การเพิกถอนผู้ออกใบรับรองของ Netscape</translation> <translation id="6647838571840953560">ขณะนี้อยู่ที่ช่อง <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 7837788..e94b58d 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play Store Hesabı</translation> <translation id="2509495747794740764">Ölçek değeri, 10 - 200 arasında bir sayı olmalı.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Formları otomatik doldurma</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Tara</translation> <translation id="2518024842978892609">İstemci sertifikalarınızı kullanma</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">SQLite belleği</translation> <translation id="6641138807883536517">Rastgele oluşturulmuş güvenli modül şifresi kullanılamıyor. Powerwash sonrasında bu normaldir.</translation> <translation id="6643016212128521049">Temizle</translation> +<translation id="6644512095122093795">Şifreleri kaydetmeyi öner</translation> <translation id="6644846457769259194">Cihazınız güncelleniyor (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape Sertifika Yetki İptali URL'si</translation> <translation id="6647838571840953560">Şu anda <ph name="CHANNEL_NAME" /> kanalında</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 1be21d3..fc4386dd 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Обліковий запис Google Play</translation> <translation id="2509495747794740764">Розмір масштабування має бути числом від 10 до 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Автозаповнення форм</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Сканувати</translation> <translation id="2518024842978892609">Використовувати сертифікати клієнта</translation> @@ -3606,6 +3607,7 @@ <translation id="6639554308659482635">Пам'ять SQLite</translation> <translation id="6641138807883536517">Немає навмання згенерованого пароля для модуля безпеки. Це нормально після використання функції Powerwash.</translation> <translation id="6643016212128521049">Очистити</translation> +<translation id="6644512095122093795">Пропонувати зберігати паролі</translation> <translation id="6644846457769259194">Пристрій оновлюється (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL-адреса відкликання Центру сертифікації Netscape</translation> <translation id="6647838571840953560">Зараз на каналі <ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 78666b13..d4f3fa5 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -378,7 +378,7 @@ <translation id="155865706765934889">Ô di chuột</translation> <translation id="1559235587769913376">Nhập các ký tự Unicode</translation> <translation id="1566049601598938765">Trang web</translation> -<translation id="1567387640189251553">Bạn đã kết nối bàn phím khác kể từ lần nhập mật khẩu gần đây nhất. Tổ hợp phím bạn đã dùng có thể không còn.</translation> +<translation id="1567387640189251553">Một bàn phím khác đã được kết nối kể từ lần gần đây nhất bạn nhập mật khẩu của mình. Bàn phím này có thể đang cố gắng đánh cắp thao tác nhấn phím của bạn.</translation> <translation id="1567993339577891801">Bảng điều khiển JavaScript</translation> <translation id="1568067597247500137">Tắt tiếng trang web</translation> <translation id="1568323446248056064">Mở cài đặt thiết bị hiển thị</translation> @@ -971,6 +971,7 @@ <translation id="2508428939232952663">Tài khoản Cửa hàng Google Play</translation> <translation id="2509495747794740764">Số tỷ lệ phải là một số giữa 10 và 200.</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">Tự động điền biểu mẫu</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Quét</translation> <translation id="2518024842978892609">Sử dụng chứng chỉ ứng dụng</translation> @@ -3607,6 +3608,7 @@ <translation id="6639554308659482635">Bộ nhớ SQLite</translation> <translation id="6641138807883536517">Không có mật khẩu mô-đun an toàn được tạo ngẫu nhiên. Đây là hiện tượng bình thường sau khi tiến hành Powerwash.</translation> <translation id="6643016212128521049">Xóa</translation> +<translation id="6644512095122093795">Đề nghị lưu mật khẩu</translation> <translation id="6644846457769259194">Đang cập nhật thiết bị của bạn (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">URL thu hồi của tổ chức phát hành chứng chỉ Netscape</translation> <translation id="6647838571840953560">Hiện ở trên <ph name="CHANNEL_NAME" /></translation> @@ -4163,7 +4165,7 @@ <translation id="7547317915858803630">Cảnh báo: cài đặt <ph name="PRODUCT_NAME" /> của bạn được lưu trữ trên ổ đĩa mạng. Điều này có thể dẫn đến giảm tốc độ, trục trặc hoặc thậm chí là mất dữ liệu.</translation> <translation id="7547483330017600937">Phát triển trên <ph name="DEVICE_TYPE" /> của bạn. Bạn có thể chạy các công cụ dòng lệnh và ứng dụng gốc yêu thích của mình một cách liền mạch và an toàn. -Thao tác cài đặt <ph name="APP_NAME" /> sẽ tải xuống <ph name="DOWNLOAD_SIZE" /> dữ liệu.</translation> +Việc cài đặt <ph name="APP_NAME" /> sẽ tải xuống <ph name="DOWNLOAD_SIZE" /> dữ liệu.</translation> <translation id="7548856833046333824">Nước chanh</translation> <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Tải xuống <ph name="FILE_NAME" /> không thành công</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 8f86ff5..d54bfa46 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -967,6 +967,7 @@ <translation id="2508428939232952663">Google Play 商店帐号</translation> <translation id="2509495747794740764">缩放值必须是一个介于 10 到 200 之间的数字。</translation> <translation id="2509566264613697683">8 倍</translation> +<translation id="2512222046227390255">自动填充表单</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">扫描</translation> <translation id="2518024842978892609">使用您的客户端证书</translation> @@ -3592,6 +3593,7 @@ <translation id="6639554308659482635">SQLite 使用的内存</translation> <translation id="6641138807883536517">无法提供随机生成的安全模块密码。这是执行 Powerwash 之后的正常现象。</translation> <translation id="6643016212128521049">清除</translation> +<translation id="6644512095122093795">提示保存密码</translation> <translation id="6644846457769259194">正在更新您的设备 (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape 证书授权中心吊销网址</translation> <translation id="6647838571840953560">目前使用的是<ph name="CHANNEL_NAME" />版本</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 346659f..2a621b9 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -970,6 +970,7 @@ <translation id="2508428939232952663">Google Play 商店帳戶</translation> <translation id="2509495747794740764">縮放比例必須為介於 10 和 200 之間的數字。</translation> <translation id="2509566264613697683">8x</translation> +<translation id="2512222046227390255">自動填入表單</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">掃描</translation> <translation id="2518024842978892609">使用您的用戶端憑證</translation> @@ -3603,6 +3604,7 @@ <translation id="6639554308659482635">SQLite 記憶體使用量</translation> <translation id="6641138807883536517">無法使用隨機產生的安全模組密碼。在執行 Powerwash 之後,這是正常情況。</translation> <translation id="6643016212128521049">清除</translation> +<translation id="6644512095122093795">儲存密碼</translation> <translation id="6644846457769259194">正在更新你的裝置 (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">Netscape 憑證授權撤銷網址</translation> <translation id="6647838571840953560">目前使用<ph name="CHANNEL_NAME" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 7f0ada9..7e9af0d4 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -47,7 +47,7 @@ <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 ইনস্টল করুন। আমরা আপনার অ্যাকাউন্ট পুনরুদ্ধারের ফোন নম্বরে একটি এসএমএস পাঠাব।</translation> -<translation id="2246246234298806438">বিল্ট-ইন PDF viewer অনুপস্থিত থাকার সময়ে Google Chrome প্রিন্টের পূর্বরুপ দেখাতে পারে না৷</translation> +<translation id="2246246234298806438">অন্তর্ভুক্ত PDF viewer অনুপস্থিত থাকার সময়ে Google Chrome প্রিন্টের পূর্বরুপ দেখাতে পারে না৷</translation> <translation id="2252923619938421629">বর্তমান সেটিংস প্রতিবেদন করে Google Chrome আরও উত্তম করে তুলতে সাহায্য করুন</translation> <translation id="2286950485307333924">আপনি এখন Chrome এ প্রবেশ করেছেন</translation> <translation id="2290014774651636340">Google API কীগুলি অনুপস্থিত৷ Google Chrome এর কিছু বৈশিষ্ট্য নিষ্ক্রিয় হয়ে যাবে৷</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index b06af0b..3c066a5 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -45,7 +45,7 @@ <translation id="2063848847527508675">Aktualizace se použije po restartování systému Chrome OS.</translation> <translation id="2077129598763517140">V případě dostupnosti použít hardwarovou akceleraci</translation> <translation id="2084710999043359739">Přidat do prohlížeče Chrome</translation> -<translation id="2094919256425865063">Přesto zavřít Chrome?</translation> +<translation id="2094919256425865063">Přesto Chrome ukončit?</translation> <translation id="2120620239521071941">Ze zařízení bude smazán následující počet položek: <ph name="ITEMS_COUNT" />. Budete-li chtít své údaje později načíst, přihlaste se do Chromu jako <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">Pomozte s vylepšováním prohlížeče Chrome tím, že nahlásíte <ph name="BEGIN_LINK" />aktuální nastavení<ph name="END_LINK" /></translation> <translation id="216054706567564023">Nainstalujte si Chrome do telefonu. Zašleme vám SMS na telefonní číslo pro obnovení účtu.</translation> @@ -63,6 +63,7 @@ <translation id="2397416548179033562">Zobrazit nabídku Chrome</translation> <translation id="2429317896000329049">Google Chrome nemohl synchronizovat vaše data, protože Synchronizace ve vaší doméně není k dispozici.</translation> <translation id="2446511512801740068">Prohlížeč Chrome není aktuální, protože nějakou dobu nebyl restartován. Je k dispozici aktualizace, která bude použita po restartování.</translation> +<translation id="2467438592969358367">Google Chrome chce exportovat vaše hesla. Tato akce vyžaduje zadání hesla systému Windows.</translation> <translation id="2485422356828889247">Odinstalovat</translation> <translation id="2534507159460261402">Google Pay (zkopírováno do Chromu)</translation> <translation id="2580411288591421699">Nelze nainstalovat verzi aplikace Google Chrome, která je právě spuštěná. Ukončete aplikaci Google Chrome a opakujte akci.</translation> @@ -133,6 +134,7 @@ <translation id="4480040274068703980">Chrome OS vaše data nemohl synchronizovat z důvodu chyby při přihlášení.</translation> <translation id="4561051373932531560">Google Chrome umožňuje kliknout na telefonní číslo na webu a volat na něj prostřednictvím aplikace Skype.</translation> <translation id="4567424176335768812">Jste přihlášeni pomocí účtu <ph name="USER_EMAIL_ADDRESS" />. Nyní můžete přistupovat ke všem svým záložkám, historii a dalším nastavením ve všech přihlášených zařízeních.</translation> +<translation id="4571503333518166079">Přejít na nastavení oznámení prohlížeče Chrome</translation> <translation id="4600710005438004015">Chrome nebylo možné aktualizovat na nejnovější verzi. Nemáte proto k dispozici nové funkce a opravy zabezpečení.</translation> <translation id="4631713731678262610">Skrýt v nabídce Chrome</translation> <translation id="4633000520311261472">Aby byl Chrome bezpečnější, deaktivovali jsme některá rozšíření, která nejsou uvedena na webu <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> a mohla být přidána bez vašeho vědomí.</translation> @@ -172,6 +174,7 @@ <translation id="556024056938947818">Google Chrome se pokouší zobrazit hesla.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598">Soubor <ph name="FILE_NAME" /> může být nebezpečný, proto jej Chrome zablokoval.</translation> +<translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome se za 1 sekundu restartuje}few{Google Chrome se za # sekundy restartuje}many{Google Chrome se za # sekundy restartuje}other{Google Chrome se za # sekund restartuje}}</translation> <translation id="573759479754913123">O operačním systému Chrome OS</translation> <translation id="5774845247549698882">Chrome OS se zobrazuje v tomto jazyce</translation> <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation> @@ -200,7 +203,8 @@ <translation id="6600954340915313787">Zkopírováno do Chromu</translation> <translation id="6634887557811630702">Google Chrome je aktuální.</translation> <translation id="6676384891291319759">Přístup k internetu</translation> -<translation id="677276454032249905">Přesto ukončit Chrome?</translation> +<translation id="6679975945624592337">Nechat Google Chrome běžet na pozadí</translation> +<translation id="677276454032249905">Přesto Chrome ukončit?</translation> <translation id="683440813066116847">Pravidlo příchozího provozu pro aplikaci Google Chrome Canary, které povolí provoz mDNS.</translation> <translation id="686561893457936865">Vezměte si Chrome všude s sebou</translation> <translation id="6885412569789873916">Chrome Beta – aplikace</translation> @@ -253,6 +257,7 @@ <translation id="8286862437124483331">Aplikace Google Chrome se pokouší zobrazit hesla. Tato akce vyžaduje zadání hesla systému Windows.</translation> <translation id="8290100596633877290">Ouha! Prohlížeč Google Chrome spadl. Restartovat?</translation> <translation id="8342675569599923794">Tento soubor je nebezpečný, proto jej Chrome zablokoval.</translation> +<translation id="840084489713044809">Google Chrome chce exportovat vaše hesla.</translation> <translation id="8406086379114794905">Pomozte nám Chrome zlepšit</translation> <translation id="8439301513305169426">Chrome heslo uloží pomocí funkce <ph name="SAVED_PASSWORD_LINK" />. Heslo si tak nebudete muset pamatovat.</translation> <translation id="8455999171311319804">Volitelné: Pomozte zlepšit operační systém Chrome OS tím, že budete společnosti Google automaticky zasílat diagnostické údaje a údaje o využití.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index e281a2e..c29d455 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -41,7 +41,7 @@ <translation id="2063848847527508675">Chrome OS skal genstartes, før opdateringen kan anvendes.</translation> <translation id="2077129598763517140">Brug hardwareacceleration, når det er muligt</translation> <translation id="2084710999043359739">Føj til Chrome</translation> -<translation id="2094919256425865063">Vil du lukke Chrome alligevel?</translation> +<translation id="2094919256425865063">Vil du slutte Chrome alligevel?</translation> <translation id="2120620239521071941">Denne handling sletter <ph name="ITEMS_COUNT" /> elementer på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chrome som <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">Hjælp med at gøre Chrome bedre ved at rapportere de <ph name="BEGIN_LINK" />aktuelle indstillinger<ph name="END_LINK" />.</translation> <translation id="216054706567564023">Installer Chrome på din telefon. Vi sender en sms til telefonnummeret til gendannelse for din konto.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index ad108d48..ef2ab98 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -42,10 +42,12 @@ <translation id="1873233029667955273">Google Chrome isn't your default browser</translation> <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation> <translation id="1877026089748256423">Chrome is out of date</translation> +<translation id="2007150628464581396">{0,plural, =1{Chrome will relaunch in 1 minute}other{Chrome will relaunch in # minutes}}</translation> <translation id="2063848847527508675">Chrome OS needs to be restarted to apply the update.</translation> <translation id="2077129598763517140">Use hardware acceleration when available</translation> <translation id="2084710999043359739">Add to Chrome</translation> <translation id="2094919256425865063">Quit Chrome anyway?</translation> +<translation id="210890598424854131">{0,plural, =0{Chrome will relaunch now}=1{Chrome will relaunch in 1 second}other{Chrome will relaunch in # seconds}}</translation> <translation id="2120620239521071941">This will delete <ph name="ITEMS_COUNT" /> items from this device. To retrieve your data later, sign in to Chrome as <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">Help make Chrome better by reporting the <ph name="BEGIN_LINK" />current settings<ph name="END_LINK" /></translation> <translation id="216054706567564023">Install Chrome on your phone. We’ll send an SMS to your account recovery phone number.</translation> @@ -63,8 +65,10 @@ <translation id="2397416548179033562">Show Chrome menu</translation> <translation id="2429317896000329049">Google Chrome could not sync your data because Sync is not available for your domain.</translation> <translation id="2446511512801740068">Chrome is out of date because it hasn't been relaunched for a while. An update is available and will be applied as soon as you relaunch.</translation> +<translation id="2467438592969358367">Google Chrome wants to export your passwords. Type your Windows password to allow this.</translation> <translation id="2485422356828889247">Uninstall</translation> <translation id="2534507159460261402">Google Pay (copied to Chrome)</translation> +<translation id="2535429035253759792">Your administrator asks that you relaunch Chrome to apply this update</translation> <translation id="2580411288591421699">Cannot install the same Google Chrome version that is currently running. Please close Google Chrome and try again.</translation> <translation id="2586406160782125153">This will delete your browsing data from this device. To retrieve your data later, sign in to Chrome as <ph name="USER_EMAIL" />.</translation> <translation id="2588322182880276190">Chrome logo</translation> @@ -101,6 +105,7 @@ <translation id="345171907106878721">Add yourself to Chrome</translation> <translation id="3479552764303398839">Not now</translation> <translation id="3503306920980160878">Chrome needs access to your location to share your location with this site</translation> +<translation id="3582972582564653026">Sync and personalise Chrome across your devices</translation> <translation id="3612333635265770873">A module with the same name has been known to conflict with Google Chrome.</translation> <translation id="3622797965165704966">Now it's easier to use Chrome with your Google Account and on shared computers.</translation> <translation id="3637702109597584617">Google Chrome OS <ph name="TERMS_OF_SERVICE_LINK" />Terms of Service<ph name="END_TERMS_OF_SERVICE_LINK" /></translation> @@ -123,6 +128,7 @@ <translation id="4149882025268051530">The installer failed to uncompress archive. Please download Google Chrome again.</translation> <translation id="4251615635259297716">Link my Chrome data to this account</translation> <translation id="4251625577313994583">get Chrome on your iPhone</translation> +<translation id="4293420128516039005">Sign in to sync and personalise Chrome across your devices</translation> <translation id="4309555186815777032">(requires Chrome <ph name="BEGIN_BUTTON" />restart<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> @@ -133,6 +139,7 @@ <translation id="4480040274068703980">Chrome OS could not sync your data due to an error signing in.</translation> <translation id="4561051373932531560">Google Chrome lets you click a phone number on the web and call it with Skype!</translation> <translation id="4567424176335768812">You're signed in as <ph name="USER_EMAIL_ADDRESS" />. Now you can access your bookmarks, history and other settings on all your signed in devices.</translation> +<translation id="4571503333518166079">Go to Chrome notification settings</translation> <translation id="4600710005438004015">Chrome couldn't update to the latest version, so you're missing out on new features and security fixes.</translation> <translation id="4631713731678262610">Hide in Chrome menu</translation> <translation id="4633000520311261472">To make Chrome safer, we disabled some extensions that aren't listed in the <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> and may have been added without your knowledge.</translation> @@ -172,6 +179,7 @@ <translation id="556024056938947818">Google Chrome is trying to show passwords.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> may be dangerous, so Chrome has blocked it.</translation> +<translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome will restart in 1 second}other{Google Chrome will restart in # seconds}}</translation> <translation id="573759479754913123">About Chrome OS</translation> <translation id="5774845247549698882">Chrome OS is displayed in this language</translation> <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation> @@ -200,6 +208,7 @@ <translation id="6600954340915313787">Copied to Chrome</translation> <translation id="6634887557811630702">Google Chrome is up to date.</translation> <translation id="6676384891291319759">Access the Internet</translation> +<translation id="6679975945624592337">Let Google Chrome Run in the Background</translation> <translation id="677276454032249905">Exit Chrome anyway?</translation> <translation id="683440813066116847">Inbound rule for Google Chrome Canary to allow mDNS traffic.</translation> <translation id="686561893457936865">Take Chrome everywhere</translation> @@ -253,6 +262,7 @@ <translation id="8286862437124483331">Google Chrome is trying to show passwords. Type your Windows password to allow this.</translation> <translation id="8290100596633877290">Whoa! Google Chrome has crashed. Relaunch now?</translation> <translation id="8342675569599923794">This file is dangerous, so Chrome has blocked it.</translation> +<translation id="840084489713044809">Google Chrome wants to export your passwords.</translation> <translation id="8406086379114794905">Help make Chrome better</translation> <translation id="8439301513305169426">Chrome will save this password with <ph name="SAVED_PASSWORD_LINK" />. You don’t have to remember it.</translation> <translation id="8455999171311319804">Optional: Help make Chrome OS better by automatically sending diagnostic and usage data to Google.</translation> @@ -262,6 +272,7 @@ <translation id="8547799825197623713">Chrome App Launcher Canary</translation> <translation id="8556340503434111824">There's a new version of Google Chrome available and it's faster than ever.</translation> <translation id="8568392309447938879">You need to be signed in to Chrome to use apps. This allows Chrome to sync your apps, bookmarks, history, passwords and other settings across devices.</translation> +<translation id="859960207076826247">{0,plural, =0{A Chrome update is available}=1{A Chrome update is available}other{A Chrome update has been available for # days}}</translation> <translation id="8606668294522778825">Google Chrome may use web services to improve your browsing experience. You may optionally disable these services. <ph name="BEGIN_LINK" />Learn more<ph name="END_LINK" /></translation> <translation id="8614913330719544658">Google Chrome is unresponsive. Relaunch now?</translation> <translation id="8667808506758191620">Your <ph name="DEVICE_TYPE" /> is up to date.</translation> @@ -269,6 +280,7 @@ <translation id="8679801911857917785">It also controls what page is shown when you start Chrome.</translation> <translation id="870251953148363156">Update &Google Chrome</translation> <translation id="873133009373065397">Google Chrome cannot determine or set the default browser</translation> +<translation id="8736674169840206667">Your administrator requires that you relaunch Chrome to apply an update</translation> <translation id="8796108026289707191">You should restart Google Chrome now.</translation> <translation id="8823341990149967727">Chrome is Out of Date</translation> <translation id="884296878221830158">It also controls what page is shown when you start Chrome or click the Home button.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index ac7e1da..c714574 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -43,6 +43,7 @@ <translation id="2063848847527508675">Ak chcete uplatniť aktualizáciu, musíte reštartovať systém Chrome OS.</translation> <translation id="2077129598763517140">Používať hardvérovú akceleráciu (keď je dostupná)</translation> <translation id="2084710999043359739">Pridať do prehliadača Chrome</translation> +<translation id="2094919256425865063">Napriek tomu zavrieť Chrome?</translation> <translation id="2120620239521071941">Táto akcia odstráni zo zariadenia niekoľko položiek (počet: <ph name="ITEMS_COUNT" />). Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do Chromu ako používateľ <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">Nahlásiť <ph name="BEGIN_LINK" />aktuálne nastavenia<ph name="END_LINK" /> a pomôcť tak zlepšiť Chrome</translation> <translation id="216054706567564023">Nainštalujte si Chrome do telefónu. Pošleme vám správu SMS na telefónne číslo na obnovenie účtu.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index addc559..2d30ce6 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -41,6 +41,7 @@ <translation id="2063848847527508675">Güncellemenin uygulanması için Chrome OS yeniden başlatılmalıdır.</translation> <translation id="2077129598763517140">Kullanılabilir olduğunda donanım hızlandırmayı kullan</translation> <translation id="2084710999043359739">Chrome'a ekle</translation> +<translation id="2094919256425865063">Yine de Chrome'dan çıkılsın mı?</translation> <translation id="2120620239521071941">Bu işlem, <ph name="ITEMS_COUNT" /> öğeyi bu cihazdan silecektir. Verilerinizi daha sonra geri almak için Chrome'da <ph name="USER_EMAIL" /> hesabıyla oturum açın.</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />Mevcut ayarlarınızı<ph name="END_LINK" /> bildirerek Chrome'u daha iyi hale getirmemize yardımcı olun</translation> <translation id="216054706567564023">Chrome'u telefonunuza yükleyin. Hesap kurtarma telefon numaranıza SMS göndereceğiz.</translation>
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn index 2860b1e..9a82af2 100644 --- a/chrome/app/vector_icons/BUILD.gn +++ b/chrome/app/vector_icons/BUILD.gn
@@ -106,7 +106,7 @@ "tab_audio_rounded.icon", "tab_bluetooth_connected.icon", "tab_close_button_touch.icon", - "tab_close_button_touch_incognito.icon", + "tab_close_button_touch_hovered_pressed.icon", "tab_close_button_touch_incognito_hovered_pressed.icon", "tab_close_hovered_pressed.1x.icon", "tab_close_hovered_pressed.icon",
diff --git a/chrome/app/vector_icons/tab_close_button_touch.icon b/chrome/app/vector_icons/tab_close_button_touch.icon index 661ec4e..42461c0f7 100644 --- a/chrome/app/vector_icons/tab_close_button_touch.icon +++ b/chrome/app/vector_icons/tab_close_button_touch.icon
@@ -3,9 +3,6 @@ // found in the LICENSE file. CANVAS_DIMENSIONS, 24, -CIRCLE, 12, 12, 9, -NEW_PATH, -PATH_COLOR_ARGB, 0xFF, 0xFD, 0xFE, 0xFF, MOVE_TO, 16.83f, 8.35f, LINE_TO, 15.65f, 7.17f, LINE_TO, 12, 10.82f,
diff --git a/chrome/app/vector_icons/tab_close_button_touch_incognito.icon b/chrome/app/vector_icons/tab_close_button_touch_hovered_pressed.icon similarity index 92% rename from chrome/app/vector_icons/tab_close_button_touch_incognito.icon rename to chrome/app/vector_icons/tab_close_button_touch_hovered_pressed.icon index 7e9299c..661ec4e 100644 --- a/chrome/app/vector_icons/tab_close_button_touch_incognito.icon +++ b/chrome/app/vector_icons/tab_close_button_touch_hovered_pressed.icon
@@ -5,7 +5,7 @@ CANVAS_DIMENSIONS, 24, CIRCLE, 12, 12, 9, NEW_PATH, -PATH_COLOR_ARGB, 0xFF, 0x32, 0x36, 0x39, +PATH_COLOR_ARGB, 0xFF, 0xFD, 0xFE, 0xFF, MOVE_TO, 16.83f, 8.35f, LINE_TO, 15.65f, 7.17f, LINE_TO, 12, 10.82f,
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 9e541eb..5361985d 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -161,6 +161,7 @@ #if defined(OS_WIN) #include "base/win/windows_version.h" +#include "chrome/browser/win/titlebar_config.h" #endif // OS_WIN using flags_ui::FeatureEntry; @@ -1937,10 +1938,6 @@ {"disable-threaded-scrolling", flag_descriptions::kThreadedScrollingName, flag_descriptions::kThreadedScrollingDescription, kOsAll, SINGLE_DISABLE_VALUE_TYPE(switches::kDisableThreadedScrolling)}, - {"distance-field-text", flag_descriptions::kDistanceFieldTextName, - flag_descriptions::kDistanceFieldTextDescription, kOsAll, - ENABLE_DISABLE_VALUE_TYPE(switches::kEnableDistanceFieldText, - switches::kDisableDistanceFieldText)}, {"extension-content-verification", flag_descriptions::kExtensionContentVerificationName, flag_descriptions::kExtensionContentVerificationDescription, kOsDesktop, @@ -2948,7 +2945,7 @@ {"windows10-custom-titlebar", flag_descriptions::kWindows10CustomTitlebarName, flag_descriptions::kWindows10CustomTitlebarDescription, kOsWin, - SINGLE_VALUE_TYPE(switches::kWindows10CustomTitlebar)}, + FEATURE_VALUE_TYPE(kWindows10CustomTitlebar)}, #endif // OS_WIN #if defined(OS_ANDROID)
diff --git a/chrome/browser/android/vr/vr_gl_thread.cc b/chrome/browser/android/vr/vr_gl_thread.cc index 2899455..dda310a 100644 --- a/chrome/browser/android/vr/vr_gl_thread.cc +++ b/chrome/browser/android/vr/vr_gl_thread.cc
@@ -222,6 +222,32 @@ FROM_HERE, base::BindOnce(&VrShell::NavigateBack, weak_vr_shell_)); } +void VrGLThread::NavigateForward() { + DCHECK(OnGlThread()); + main_thread_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&VrShell::NavigateForward, weak_vr_shell_)); +} + +void VrGLThread::ReloadTab() { + DCHECK(OnGlThread()); + main_thread_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&VrShell::ReloadTab, weak_vr_shell_)); +} + +void VrGLThread::OpenNewTab(bool incognito) { + DCHECK(OnGlThread()); + main_thread_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&VrShell::OpenNewTab, weak_vr_shell_, incognito)); +} + +void VrGLThread::CloseAllIncognitoTabs() { + DCHECK(OnGlThread()); + main_thread_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&VrShell::CloseAllIncognitoTabs, weak_vr_shell_)); +} + void VrGLThread::ExitCct() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( @@ -431,6 +457,13 @@ weak_browser_ui_)); } +void VrGLThread::SetIncognitoTabsOpen(bool open) { + DCHECK(OnMainThread()); + task_runner()->PostTask( + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetIncognitoTabsOpen, + weak_browser_ui_, open)); +} + void VrGLThread::ShowSoftInput(bool show) { DCHECK(OnMainThread()); task_runner()->PostTask(FROM_HERE,
diff --git a/chrome/browser/android/vr/vr_gl_thread.h b/chrome/browser/android/vr/vr_gl_thread.h index f3b0a63f..013ea6a 100644 --- a/chrome/browser/android/vr/vr_gl_thread.h +++ b/chrome/browser/android/vr/vr_gl_thread.h
@@ -81,6 +81,10 @@ void ExitFullscreen() override; void Navigate(GURL gurl, NavigationMethod method) override; void NavigateBack() override; + void NavigateForward() override; + void ReloadTab() override; + void OpenNewTab(bool incognito) override; + void CloseAllIncognitoTabs() override; void ExitCct() override; void CloseHostedDialog() override; void OnUnsupportedMode(UiUnsupportedMode mode) override; @@ -115,6 +119,7 @@ std::unique_ptr<Assets> assets, const base::Version& component_version) override; void OnAssetsUnavailable() override; + void SetIncognitoTabsOpen(bool open) override; void ShowSoftInput(bool show) override; void UpdateWebInputIndices(int selection_start, int selection_end,
diff --git a/chrome/browser/android/vr/vr_shell.cc b/chrome/browser/android/vr/vr_shell.cc index cc0690b1..d109cd2 100644 --- a/chrome/browser/android/vr/vr_shell.cc +++ b/chrome/browser/android/vr/vr_shell.cc
@@ -353,6 +353,26 @@ Java_VrShellImpl_navigateBack(env, j_vr_shell_); } +void VrShell::NavigateForward() { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_VrShellImpl_navigateForward(env, j_vr_shell_); +} + +void VrShell::ReloadTab() { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_VrShellImpl_reloadTab(env, j_vr_shell_); +} + +void VrShell::OpenNewTab(bool incognito) { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_VrShellImpl_openNewTab(env, j_vr_shell_, incognito); +} + +void VrShell::CloseAllIncognitoTabs() { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_VrShellImpl_closeAllIncognitoTabs(env, j_vr_shell_); +} + void VrShell::ExitCct() { JNIEnv* env = base::android::AttachCurrentThread(); Java_VrShellImpl_exitCct(env, j_vr_shell_); @@ -514,18 +534,15 @@ const JavaParamRef<jobject>& obj, jobjectArray tabs, jobjectArray incognito_tabs) { - ProcessTabArray(env, tabs, false); - ProcessTabArray(env, incognito_tabs, true); - ui_->FlushTabList(); -} - -void VrShell::ProcessTabArray(JNIEnv* env, jobjectArray tabs, bool incognito) { - size_t len = env->GetArrayLength(tabs); + incognito_tab_ids_.clear(); + size_t len = env->GetArrayLength(incognito_tabs); for (size_t i = 0; i < len; ++i) { - ScopedJavaLocalRef<jobject> j_tab(env, env->GetObjectArrayElement(tabs, i)); + ScopedJavaLocalRef<jobject> j_tab( + env, env->GetObjectArrayElement(incognito_tabs, i)); TabAndroid* tab = TabAndroid::GetNativeTab(env, j_tab); - ui_->AppendToTabList(incognito, tab->GetAndroidId(), tab->GetTitle()); + incognito_tab_ids_.insert(tab->GetAndroidId()); } + ui_->SetIncognitoTabsOpen(!incognito_tab_ids_.empty()); } void VrShell::OnTabUpdated(JNIEnv* env, @@ -533,16 +550,16 @@ jboolean incognito, jint id, jstring jtitle) { - std::string title; - base::android::ConvertJavaStringToUTF8(env, jtitle, &title); - ui_->UpdateTab(incognito, id, title); + incognito_tab_ids_.insert(id); + ui_->SetIncognitoTabsOpen(!incognito_tab_ids_.empty()); } void VrShell::OnTabRemoved(JNIEnv* env, const JavaParamRef<jobject>& obj, jboolean incognito, jint id) { - ui_->RemoveTab(incognito, id); + incognito_tab_ids_.erase(id); + ui_->SetIncognitoTabsOpen(!incognito_tab_ids_.empty()); } void VrShell::SetAlertDialog(JNIEnv* env,
diff --git a/chrome/browser/android/vr/vr_shell.h b/chrome/browser/android/vr/vr_shell.h index 99c6fc5..c416af3 100644 --- a/chrome/browser/android/vr/vr_shell.h +++ b/chrome/browser/android/vr/vr_shell.h
@@ -125,6 +125,10 @@ void OnContentPaused(bool paused); void Navigate(GURL url, NavigationMethod method); void NavigateBack(); + void NavigateForward(); + void ReloadTab(); + void OpenNewTab(bool incognito); + void CloseAllIncognitoTabs(); void ExitCct(); void CloseHostedDialog(); void ToggleCardboardGamepad(bool enabled); @@ -237,8 +241,6 @@ void PostToGlThread(const base::Location& from_here, base::OnceClosure task); void SetUiState(); - void ProcessTabArray(JNIEnv* env, jobjectArray tabs, bool incognito); - void PollMediaAccessFlag(); bool HasDaydreamSupport(JNIEnv* env); @@ -317,6 +319,8 @@ base::Timer waiting_for_assets_component_timer_; + std::set<int> incognito_tab_ids_; + base::WeakPtrFactory<VrShell> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(VrShell);
diff --git a/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc b/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc index 1387383..1abad77 100644 --- a/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc +++ b/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc
@@ -270,6 +270,7 @@ } IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, RecentTabWindowDeletion) { + // Create a new browser with three tabs and close it. AddBrowser(browser(), {url_a_}); Browser* new_browser = BrowserList::GetInstance()->GetLastActive(); AddTab(new_browser, {url_b_, url_c_}); @@ -285,7 +286,7 @@ tab_service->entries().front().get()); EXPECT_EQ(3U, window->tabs.size()); - // Delete b and d. + // Delete b and d. The last opened tab should be removed. browsing_data::RemoveNavigationEntries( browser()->profile(), history::DeletionTimeRange::Invalid(), {history::URLResult(url_b_, base::Time()), @@ -298,7 +299,7 @@ tab_service->entries().front().get()); EXPECT_EQ(2U, window->tabs.size()); EXPECT_EQ(2U, window->tabs.size()); - EXPECT_EQ(0, window->selected_tab_index); + EXPECT_EQ(1, window->selected_tab_index); EXPECT_EQ(0, window->tabs[0]->tabstrip_index); EXPECT_EQ(1, window->tabs[1]->tabstrip_index); EXPECT_EQ(url_a_, window->tabs[0]->navigations.front().virtual_url());
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 7392684..2cc6e5c1 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -995,7 +995,7 @@ // The common case is that this function is called early in Chrome startup // before any threads are created or registered. When there are no threads, // we can just set the string without worrying about threadsafety. - if (!BrowserThread::IsThreadInitialized(BrowserThread::UI)) { + if (!BrowserThread::IsThreadInitialized(BrowserThread::IO)) { g_io_thread_application_locale.Get() = locale; return; }
diff --git a/chrome/browser/chromeos/display/display_prefs.cc b/chrome/browser/chromeos/display/display_prefs.cc index 6a3d5b7..8af9595 100644 --- a/chrome/browser/chromeos/display/display_prefs.cc +++ b/chrome/browser/chromeos/display/display_prefs.cc
@@ -504,8 +504,8 @@ } // Store the display zoom as a percentage. - int display_zoom_percentage = - display_manager->GetZoomFactorForDisplay(id) * 100; + int display_zoom_percentage = std::round(info.zoom_factor() * 100.f); + property_value->SetInteger(kDisplayZoom, display_zoom_percentage); pref_data->Set(base::Int64ToString(id), std::move(property_value));
diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc index 3231279..78a4a219 100644 --- a/chrome/browser/chromeos/login/chrome_restart_request.cc +++ b/chrome/browser/chromeos/login/chrome_restart_request.cc
@@ -89,7 +89,6 @@ ::switches::kDisableAcceleratedVideoEncode, ::switches::kDisableBlinkFeatures, ::switches::kDisableCastStreamingHWEncoding, - ::switches::kDisableDistanceFieldText, ::switches::kDisableGpu, ::switches::kDisableGpuMemoryBufferVideoFrames, ::switches::kDisableGpuShaderDiskCache, @@ -107,7 +106,6 @@ ::switches::kDisableZeroCopy, ::switches::kEnableBlinkFeatures, ::switches::kDisableGpuSandbox, - ::switches::kEnableDistanceFieldText, ::switches::kEnableGpuMemoryBufferVideoFrames, ::switches::kEnableGpuRasterization, ::switches::kEnableLogging, @@ -178,6 +176,7 @@ ash::switches::kShowTaps, ash::switches::kShowViewsLogin, ash::switches::kShowWebUiLock, + ash::switches::kShowWebUiLogin, chromeos::switches::kDefaultWallpaperLarge, chromeos::switches::kDefaultWallpaperSmall, chromeos::switches::kGuestWallpaperLarge,
diff --git a/chrome/browser/chromeos/login/login_manager_test.cc b/chrome/browser/chromeos/login/login_manager_test.cc index cfb289bb..56de7f92a 100644 --- a/chrome/browser/chromeos/login/login_manager_test.cc +++ b/chrome/browser/chromeos/login/login_manager_test.cc
@@ -6,6 +6,7 @@ #include <string> +#include "ash/public/cpp/ash_switches.h" #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" @@ -103,6 +104,7 @@ } void LoginManagerTest::SetUpCommandLine(base::CommandLine* command_line) { + command_line->AppendSwitch(ash::switches::kShowWebUiLogin); command_line->AppendSwitch(chromeos::switches::kLoginManager); command_line->AppendSwitch(chromeos::switches::kForceLoginManagerInTests);
diff --git a/chrome/browser/chromeos/login/signin_partition_manager_unittest.cc b/chrome/browser/chromeos/login/signin_partition_manager_unittest.cc index 7ee3293..27b0a00 100644 --- a/chrome/browser/chromeos/login/signin_partition_manager_unittest.cc +++ b/chrome/browser/chromeos/login/signin_partition_manager_unittest.cc
@@ -18,7 +18,6 @@ #include "content/public/browser/site_instance.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" -#include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/web_contents_tester.h" #include "net/cookies/cookie_store.h" #include "net/url_request/url_request_context.h" @@ -104,6 +103,11 @@ signin_browser_context_.reset(); + // ChromeRenderViewHostTestHarness::TearDown() simulates shutdown and + // ~URLRequestContextGetter() assumes BrowserThreads are still up so this + // must happen first. + system_request_context_getter_ = nullptr; + ChromeRenderViewHostTestHarness::TearDown(); }
diff --git a/chrome/browser/chromeos/login/test/oobe_base_test.cc b/chrome/browser/chromeos/login/test/oobe_base_test.cc index 933c107..e77883b 100644 --- a/chrome/browser/chromeos/login/test/oobe_base_test.cc +++ b/chrome/browser/chromeos/login/test/oobe_base_test.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/chromeos/login/test/oobe_base_test.h" +#include "ash/public/cpp/ash_switches.h" #include "base/command_line.h" #include "base/location.h" #include "base/path_service.h" @@ -138,6 +139,7 @@ void OobeBaseTest::SetUpCommandLine(base::CommandLine* command_line) { ExtensionApiTest::SetUpCommandLine(command_line); + command_line->AppendSwitch(ash::switches::kShowWebUiLogin); command_line->AppendSwitch(chromeos::switches::kLoginManager); command_line->AppendSwitch(chromeos::switches::kForceLoginManagerInTests); if (!needs_background_networking_)
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc index d451706..06744c6b 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -177,6 +177,7 @@ connector->IsEnterpriseManaged()); } +// Returns true if signin (not oobe) should be displayed. bool ShouldShowSigninScreen(chromeos::OobeScreen first_screen) { return (first_screen == chromeos::OobeScreen::SCREEN_UNKNOWN && IsOobeComplete()) || @@ -1186,9 +1187,10 @@ base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kNaturalScrollDefault)); - session_manager::SessionManager::Get()->SetSessionState( - IsOobeComplete() ? session_manager::SessionState::LOGIN_PRIMARY - : session_manager::SessionState::OOBE); + auto session_state = session_manager::SessionState::OOBE; + if (IsOobeComplete() || first_screen == OobeScreen::SCREEN_SPECIAL_LOGIN) + session_state = session_manager::SessionState::LOGIN_PRIMARY; + session_manager::SessionManager::Get()->SetSessionState(session_state); bool show_app_launch_splash_screen = (first_screen == OobeScreen::SCREEN_APP_LAUNCH_SPLASH);
diff --git a/chrome/browser/chromeos/login/ui/login_display_views.cc b/chrome/browser/chromeos/login/ui/login_display_views.cc index 63a5e8c..ed27a44 100644 --- a/chrome/browser/chromeos/login/ui/login_display_views.cc +++ b/chrome/browser/chromeos/login/ui/login_display_views.cc
@@ -10,6 +10,8 @@ #include "chrome/browser/chromeos/login/user_selection_screen_proxy.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/ui/ash/login_screen_client.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/session_manager_client.h" #include "components/user_manager/known_user.h" namespace chromeos { @@ -42,8 +44,16 @@ // Load the login screen. auto* client = LoginScreenClient::Get(); client->SetDelegate(host_); - client->login_screen()->ShowLoginScreen( - base::BindOnce([](bool did_show) { CHECK(did_show); })); + client->login_screen()->ShowLoginScreen(base::BindOnce([](bool did_show) { + CHECK(did_show); + + // Some auto-tests depend on login-prompt-visible, like + // login_SameSessionTwice. + VLOG(1) << "Emitting login-prompt-visible"; + chromeos::DBusThreadManager::Get() + ->GetSessionManagerClient() + ->EmitLoginPromptVisible(); + })); user_selection_screen_->Init(filtered_users); client->login_screen()->LoadUsers(
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 5867c27..b0bdb04 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -590,8 +590,9 @@ #if defined(GOOGLE_CHROME_BUILD) const user_manager::UserManager* user_manager = user_manager::UserManager::Get(); - // Skip for non-regular users. - if (user_manager->IsLoggedInAsPublicAccount() || + // Skip for non-regular users and for users without Gaia account. + if (!user_manager->IsLoggedInAsUserWithGaiaAccount() || + user_manager->IsLoggedInAsPublicAccount() || (user_manager->IsCurrentUserNonCryptohomeDataEphemeral() && user_manager->GetActiveUser()->GetType() != user_manager::USER_TYPE_REGULAR)) {
diff --git a/chrome/browser/chromeos/preferences_chromeos_browsertest.cc b/chrome/browser/chromeos/preferences_chromeos_browsertest.cc index 458c2a4..5e2fb1b7e8 100644 --- a/chrome/browser/chromeos/preferences_chromeos_browsertest.cc +++ b/chrome/browser/chromeos/preferences_chromeos_browsertest.cc
@@ -5,6 +5,7 @@ #include <stddef.h> #include <sys/types.h> +#include "ash/public/cpp/ash_switches.h" #include "base/command_line.h" #include "base/macros.h" #include "chrome/browser/browser_process.h" @@ -124,13 +125,28 @@ DISALLOW_COPY_AND_ASSIGN(PreferencesTest); }; -IN_PROC_BROWSER_TEST_F(PreferencesTest, PRE_MultiProfiles) { +class PreferencesTestForceWebUiLogin : public PreferencesTest { + public: + PreferencesTestForceWebUiLogin() = default; + ~PreferencesTestForceWebUiLogin() override = default; + + // PreferencesTest: + void SetUpCommandLine(base::CommandLine* command_line) override { + PreferencesTest::SetUpCommandLine(command_line); + command_line->AppendSwitch(ash::switches::kShowWebUiLogin); + } + + private: + DISALLOW_COPY_AND_ASSIGN(PreferencesTestForceWebUiLogin); +}; + +IN_PROC_BROWSER_TEST_F(PreferencesTestForceWebUiLogin, PRE_MultiProfiles) { RegisterUser(test_users_[0]); RegisterUser(test_users_[1]); chromeos::StartupUtils::MarkOobeCompleted(); } -IN_PROC_BROWSER_TEST_F(PreferencesTest, MultiProfiles) { +IN_PROC_BROWSER_TEST_F(PreferencesTestForceWebUiLogin, MultiProfiles) { user_manager::UserManager* user_manager = user_manager::UserManager::Get(); // Add first user and init its preferences. Check that corresponding
diff --git a/chrome/browser/chromeos/upgrade_detector_chromeos.cc b/chrome/browser/chromeos/upgrade_detector_chromeos.cc index acf75615..6f9552e 100644 --- a/chrome/browser/chromeos/upgrade_detector_chromeos.cc +++ b/chrome/browser/chromeos/upgrade_detector_chromeos.cc
@@ -173,3 +173,8 @@ UpgradeDetector* UpgradeDetector::GetInstance() { return UpgradeDetectorChromeos::GetInstance(); } + +// static +base::TimeDelta UpgradeDetector::GetDefaultHighAnnoyanceThreshold() { + return base::TimeDelta::FromDays(kHighDaysThreshold); +}
diff --git a/chrome/browser/component_updater/subresource_filter_component_installer_unittest.cc b/chrome/browser/component_updater/subresource_filter_component_installer_unittest.cc index 6502a9a..35a6c4e9 100644 --- a/chrome/browser/component_updater/subresource_filter_component_installer_unittest.cc +++ b/chrome/browser/component_updater/subresource_filter_component_installer_unittest.cc
@@ -18,7 +18,6 @@ #include "base/run_loop.h" #include "base/sequenced_task_runner.h" #include "base/strings/string_util.h" -#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "base/version.h" #include "chrome/test/base/testing_browser_process.h" @@ -29,6 +28,7 @@ #include "components/subresource_filter/core/browser/subresource_filter_constants.h" #include "components/subresource_filter/core/browser/subresource_filter_features.h" #include "components/subresource_filter/core/browser/subresource_filter_features_test_support.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" @@ -122,7 +122,7 @@ void TearDown() override { TestingBrowserProcess::GetGlobal()->SetRulesetService(nullptr); - scoped_task_environment_.RunUntilIdle(); + thread_bundle_.RunUntilIdle(); PlatformTest::TearDown(); } @@ -171,13 +171,9 @@ } protected: - void RunUntilIdle() { - scoped_task_environment_.RunUntilIdle(); - base::RunLoop().RunUntilIdle(); - } + content::TestBrowserThreadBundle thread_bundle_; private: - base::test::ScopedTaskEnvironment scoped_task_environment_; base::ScopedTempDir component_install_dir_; base::ScopedTempDir ruleset_service_dir_; @@ -198,7 +194,7 @@ component_updater(new SubresourceFilterMockComponentUpdateService()); EXPECT_CALL(*component_updater, RegisterComponent(testing::_)).Times(0); RegisterSubresourceFilterComponent(component_updater.get()); - RunUntilIdle(); + thread_bundle_.RunUntilIdle(); } TEST_F(SubresourceFilterComponentInstallerTest, @@ -211,7 +207,7 @@ .Times(1) .WillOnce(testing::Return(true)); RegisterSubresourceFilterComponent(component_updater.get()); - RunUntilIdle(); + thread_bundle_.RunUntilIdle(); } TEST_F(SubresourceFilterComponentInstallerTest, LoadEmptyRuleset) {
diff --git a/chrome/browser/component_updater/sw_reporter_installer_win.cc b/chrome/browser/component_updater/sw_reporter_installer_win.cc index ae1e9f9..7ffbb64e 100644 --- a/chrome/browser/component_updater/sw_reporter_installer_win.cc +++ b/chrome/browser/component_updater/sw_reporter_installer_win.cc
@@ -53,7 +53,6 @@ namespace { -using safe_browsing::OnReporterSequenceDone; using safe_browsing::SwReporterInvocation; using safe_browsing::SwReporterInvocationSequence; @@ -77,9 +76,6 @@ const base::FilePath::CharType kSwReporterExeName[] = FILE_PATH_LITERAL("software_reporter_tool.exe"); -constexpr base::Feature kComponentTagFeature{kComponentTagFeatureName, - base::FEATURE_DISABLED_BY_DEFAULT}; - void SRTHasCompleted(SRTCompleted value) { UMA_HISTOGRAM_ENUMERATION("SoftwareReporter.Cleaner.HasCompleted", value, SRT_COMPLETED_MAX); @@ -406,18 +402,20 @@ update_client::InstallerAttributes SwReporterInstallerPolicy::GetInstallerAttributes() const { update_client::InstallerAttributes attributes; - if (base::FeatureList::IsEnabled(kComponentTagFeature)) { - // Pass the "tag" parameter to the installer; it will be used to choose - // which binary is downloaded. - constexpr char kTagParam[] = "tag"; + if (base::FeatureList::IsEnabled( + safe_browsing::kChromeCleanupDistributionFeature)) { + // Pass the tag parameter to the installer as the "tag" attribute; it will + // be used to choose which binary is downloaded. + constexpr char kTagParamName[] = "reporter_omaha_tag"; const std::string tag = variations::GetVariationParamValueByFeature( - kComponentTagFeature, kTagParam); + safe_browsing::kChromeCleanupDistributionFeature, kTagParamName); // If the tag is not a valid attribute (see the regexp in // ComponentInstallerPolicy::InstallerAttributes), set it to a valid but // unrecognized value so that nothing will be downloaded. constexpr size_t kMaxAttributeLength = 256; constexpr char kExtraAttributeChars[] = "-.,;+_="; + constexpr char kTagParam[] = "tag"; if (tag.empty() || !ValidateString(tag, kExtraAttributeChars, kMaxAttributeLength)) { ReportExperimentError(SW_REPORTER_EXPERIMENT_ERROR_BAD_TAG);
diff --git a/chrome/browser/component_updater/sw_reporter_installer_win.h b/chrome/browser/component_updater/sw_reporter_installer_win.h index fc181e8..b72a5d7 100644 --- a/chrome/browser/component_updater/sw_reporter_installer_win.h +++ b/chrome/browser/component_updater/sw_reporter_installer_win.h
@@ -32,12 +32,6 @@ class ComponentUpdateService; -// Expose the feature name so it can be referenced in tests. -// TODO(crbug.com/786964): This feature will continue to exist as part of a -// permanent variations study to control which version of the reporter gets -// downloaded. Rename it to something that makes sense long-term. -constexpr char kComponentTagFeatureName[] = "ExperimentalSwReporterEngine"; - constexpr char kSwReporterComponentId[] = "gkmgaooipdjhmangpemjhigmamcehddo"; // These MUST match the values for SoftwareReporterExperimentError in
diff --git a/chrome/browser/component_updater/sw_reporter_installer_win_unittest.cc b/chrome/browser/component_updater/sw_reporter_installer_win_unittest.cc index 41f6399..c49f1dab 100644 --- a/chrome/browser/component_updater/sw_reporter_installer_win_unittest.cc +++ b/chrome/browser/component_updater/sw_reporter_installer_win_unittest.cc
@@ -23,6 +23,7 @@ #include "base/values.h" #include "base/version.h" #include "chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_win.h" +#include "chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h" #include "components/chrome_cleaner/public/constants/constants.h" #include "components/component_updater/mock_component_updater_service.h" #include "components/variations/variations_params_manager.h" @@ -72,7 +73,7 @@ } void CreateFeatureWithTag(const std::string& tag) { - std::map<std::string, std::string> params{{"tag", tag}}; + std::map<std::string, std::string> params{{"reporter_omaha_tag", tag}}; CreateFeatureWithParams(params); } @@ -83,9 +84,10 @@ // create a FieldTrial for this group and associate the params with the // feature. For the test just re-use the feature name as the trial name. variations_ = std::make_unique<variations::testing::VariationParamsManager>( - /*trial_name=*/kComponentTagFeatureName, params, + "SwReporterInstallerTestTrialName", params, /*associated_features=*/ - std::set<std::string>{kComponentTagFeatureName}); + std::set<std::string>{ + safe_browsing::kChromeCleanupDistributionFeature.name}); } void ExpectAttributesWithTag(const SwReporterInstallerPolicy& policy,
diff --git a/chrome/browser/devtools/devtools_embedder_message_dispatcher.h b/chrome/browser/devtools/devtools_embedder_message_dispatcher.h index a23ba54..7c1a20bb 100644 --- a/chrome/browser/devtools/devtools_embedder_message_dispatcher.h +++ b/chrome/browser/devtools/devtools_embedder_message_dispatcher.h
@@ -53,7 +53,8 @@ virtual void UpgradeDraggedFileSystemPermissions( const std::string& file_system_url) = 0; virtual void IndexPath(int index_request_id, - const std::string& file_system_path) = 0; + const std::string& file_system_path, + const std::string& excluded_folders) = 0; virtual void StopIndexing(int index_request_id) = 0; virtual void LoadNetworkResource(const DispatchCallback& callback, const std::string& url,
diff --git a/chrome/browser/devtools/devtools_file_system_indexer.cc b/chrome/browser/devtools/devtools_file_system_indexer.cc index 4c7ad3ce..db6f287 100644 --- a/chrome/browser/devtools/devtools_file_system_indexer.cc +++ b/chrome/browser/devtools/devtools_file_system_indexer.cc
@@ -267,10 +267,12 @@ DevToolsFileSystemIndexer::FileSystemIndexingJob::FileSystemIndexingJob( const FilePath& file_system_path, + const std::vector<base::FilePath>& excluded_folders, const TotalWorkCallback& total_work_callback, const WorkedCallback& worked_callback, const DoneCallback& done_callback) : file_system_path_(file_system_path), + excluded_folders_(excluded_folders), total_work_callback_(total_work_callback), worked_callback_(worked_callback), done_callback_(done_callback), @@ -278,6 +280,7 @@ stopped_(false) { current_trigrams_set_.resize(kTrigramCount); current_trigrams_.reserve(kTrigramCount); + pending_folders_.push_back(file_system_path); } DevToolsFileSystemIndexer::FileSystemIndexingJob::~FileSystemIndexingJob() {} @@ -303,10 +306,22 @@ if (stopped_) return; if (!file_enumerator_) { - file_enumerator_.reset( - new FileEnumerator(file_system_path_, true, FileEnumerator::FILES)); + file_enumerator_.reset(new FileEnumerator( + pending_folders_.back(), false, + FileEnumerator::FILES | FileEnumerator::DIRECTORIES)); + pending_folders_.pop_back(); } FilePath file_path = file_enumerator_->Next(); + if (file_path.empty() && !pending_folders_.empty()) { + file_enumerator_.reset(new FileEnumerator( + pending_folders_.back(), false, + FileEnumerator::FILES | FileEnumerator::DIRECTORIES)); + pending_folders_.pop_back(); + impl_task_runner()->PostTask( + FROM_HERE, BindOnce(&FileSystemIndexingJob::CollectFilesToIndex, this)); + return; + } + if (file_path.empty()) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, @@ -315,6 +330,20 @@ IndexFiles(); return; } + if (file_enumerator_->GetInfo().IsDirectory()) { + bool excluded = false; + for (const FilePath& excluded_folder : excluded_folders_) { + excluded = excluded_folder.IsParent(file_path); + if (excluded) + break; + } + if (!excluded) + pending_folders_.push_back(file_path); + impl_task_runner()->PostTask( + FROM_HERE, BindOnce(&FileSystemIndexingJob::CollectFilesToIndex, this)); + return; + } + Time saved_last_modified_time = g_trigram_index.Get().LastModifiedTimeForFile(file_path); FileEnumerator::FileInfo file_info = file_enumerator_->GetInfo(); @@ -433,29 +462,33 @@ static int g_instance_count = 0; DevToolsFileSystemIndexer::DevToolsFileSystemIndexer() { - ++g_instance_count; + impl_task_runner()->PostTask(FROM_HERE, + base::BindOnce([]() { ++g_instance_count; })); } DevToolsFileSystemIndexer::~DevToolsFileSystemIndexer() { - --g_instance_count; - if (!g_instance_count) { - impl_task_runner()->PostTask( - FROM_HERE, base::BindOnce([]() { g_trigram_index.Get().Reset(); })); - } + impl_task_runner()->PostTask(FROM_HERE, base::BindOnce([]() { + --g_instance_count; + if (!g_instance_count) + g_trigram_index.Get().Reset(); + })); } scoped_refptr<DevToolsFileSystemIndexer::FileSystemIndexingJob> DevToolsFileSystemIndexer::IndexPath( const string& file_system_path, + const vector<string>& excluded_folders, const TotalWorkCallback& total_work_callback, const WorkedCallback& worked_callback, const DoneCallback& done_callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - scoped_refptr<FileSystemIndexingJob> indexing_job = - new FileSystemIndexingJob(FilePath::FromUTF8Unsafe(file_system_path), - total_work_callback, - worked_callback, - done_callback); + vector<base::FilePath> paths; + for (const string& path : excluded_folders) { + paths.push_back(FilePath::FromUTF8Unsafe(path)); + } + scoped_refptr<FileSystemIndexingJob> indexing_job = new FileSystemIndexingJob( + FilePath::FromUTF8Unsafe(file_system_path), paths, total_work_callback, + worked_callback, done_callback); indexing_job->Start(); return indexing_job; }
diff --git a/chrome/browser/devtools/devtools_file_system_indexer.h b/chrome/browser/devtools/devtools_file_system_indexer.h index 367dda5..97ce997c 100644 --- a/chrome/browser/devtools/devtools_file_system_indexer.h +++ b/chrome/browser/devtools/devtools_file_system_indexer.h
@@ -41,6 +41,7 @@ friend class base::RefCountedThreadSafe<FileSystemIndexingJob>; friend class DevToolsFileSystemIndexer; FileSystemIndexingJob(const base::FilePath& file_system_path, + const std::vector<base::FilePath>& excluded_folders, const TotalWorkCallback& total_work_callback, const WorkedCallback& worked_callback, const DoneCallback& done_callback); @@ -59,6 +60,9 @@ void ReportWorked(); base::FilePath file_system_path_; + std::vector<base::FilePath> excluded_folders_; + + std::vector<base::FilePath> pending_folders_; TotalWorkCallback total_work_callback_; WorkedCallback worked_callback_; DoneCallback done_callback_; @@ -83,6 +87,7 @@ // progress callbacks. scoped_refptr<FileSystemIndexingJob> IndexPath( const std::string& file_system_path, + const std::vector<std::string>& excluded_folders, const TotalWorkCallback& total_work_callback, const WorkedCallback& worked_callback, const DoneCallback& done_callback);
diff --git a/chrome/browser/devtools/devtools_file_system_indexer_unittest.cc b/chrome/browser/devtools/devtools_file_system_indexer_unittest.cc index eddbc3a..f071144 100644 --- a/chrome/browser/devtools/devtools_file_system_indexer_unittest.cc +++ b/chrome/browser/devtools/devtools_file_system_indexer_unittest.cc
@@ -49,9 +49,10 @@ base_test_path.Append(FILE_PATH_LITERAL("devtools")) .Append(FILE_PATH_LITERAL("indexer")); + std::vector<std::string> excluded_folders; scoped_refptr<DevToolsFileSystemIndexer::FileSystemIndexingJob> job = - indexer_->IndexPath(index_path.AsUTF8Unsafe(), base::DoNothing(), - base::DoNothing(), + indexer_->IndexPath(index_path.AsUTF8Unsafe(), excluded_folders, + base::DoNothing(), base::DoNothing(), base::Bind(&DevToolsFileSystemIndexerTest::SetDone, base::Unretained(this)));
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc index ce35257..286e3cfc 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.cc +++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -755,8 +755,10 @@ weak_factory_.GetWeakPtr())); } -void DevToolsUIBindings::IndexPath(int index_request_id, - const std::string& file_system_path) { +void DevToolsUIBindings::IndexPath( + int index_request_id, + const std::string& file_system_path, + const std::string& excluded_folders_message) { DCHECK_CURRENTLY_ON(BrowserThread::UI); CHECK(IsValidFrontendURL(web_contents_->GetURL()) && frontend_host_); if (!file_helper_->IsFileSystemAdded(file_system_path)) { @@ -765,21 +767,30 @@ } if (indexing_jobs_.count(index_request_id) != 0) return; + std::vector<std::string> excluded_folders; + std::unique_ptr<base::Value> parsed_excluded_folders = + base::JSONReader::Read(excluded_folders_message); + if (parsed_excluded_folders && parsed_excluded_folders->is_list()) { + const std::vector<base::Value>& folder_paths = + parsed_excluded_folders->GetList(); + for (const base::Value& folder_path : folder_paths) { + if (folder_path.is_string()) + excluded_folders.push_back(folder_path.GetString()); + } + } + indexing_jobs_[index_request_id] = scoped_refptr<DevToolsFileSystemIndexer::FileSystemIndexingJob>( file_system_indexer_->IndexPath( - file_system_path, + file_system_path, excluded_folders, Bind(&DevToolsUIBindings::IndexingTotalWorkCalculated, - weak_factory_.GetWeakPtr(), - index_request_id, + weak_factory_.GetWeakPtr(), index_request_id, file_system_path), Bind(&DevToolsUIBindings::IndexingWorked, - weak_factory_.GetWeakPtr(), - index_request_id, + weak_factory_.GetWeakPtr(), index_request_id, file_system_path), Bind(&DevToolsUIBindings::IndexingDone, - weak_factory_.GetWeakPtr(), - index_request_id, + weak_factory_.GetWeakPtr(), index_request_id, file_system_path))); }
diff --git a/chrome/browser/devtools/devtools_ui_bindings.h b/chrome/browser/devtools/devtools_ui_bindings.h index 35e58b6..578d655 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.h +++ b/chrome/browser/devtools/devtools_ui_bindings.h
@@ -122,7 +122,8 @@ void UpgradeDraggedFileSystemPermissions( const std::string& file_system_url) override; void IndexPath(int index_request_id, - const std::string& file_system_path) override; + const std::string& file_system_path, + const std::string& excluded_folders) override; void StopIndexing(int index_request_id) override; void SearchInPath(int search_request_id, const std::string& file_system_path,
diff --git a/chrome/browser/extensions/display_info_provider_chromeos.cc b/chrome/browser/extensions/display_info_provider_chromeos.cc index 01d994b..151a4dd 100644 --- a/chrome/browser/extensions/display_info_provider_chromeos.cc +++ b/chrome/browser/extensions/display_info_provider_chromeos.cc
@@ -799,15 +799,14 @@ } } - unit->display_zoom_factor = - display_manager->GetZoomFactorForDisplay(display.id()); + unit->display_zoom_factor = display_info.zoom_factor(); + display::ManagedDisplayMode active_mode; if (display_manager->GetActiveModeForDisplayId(display.id(), &active_mode)) { unit->available_display_zoom_factors = display::GetDisplayZoomFactors(active_mode); } else { - unit->available_display_zoom_factors.push_back( - display_manager->GetZoomFactorForDisplay(display.id())); + unit->available_display_zoom_factors.push_back(display_info.zoom_factor()); } const float device_dpi = display_info.device_dpi();
diff --git a/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc b/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc index fcf662b..8e5a300 100644 --- a/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc +++ b/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc
@@ -79,6 +79,10 @@ tablet_mode_client_->FlushForTesting(); } + float GetDisplayZoom(int64_t display_id) { + return display_manager()->GetDisplayInfo(display_id).zoom_factor(); + } + protected: void CallSetDisplayUnitInfo( const std::string& display_id, @@ -1656,10 +1660,8 @@ display_manager()->UpdateZoomFactor(display_id_list[0], zoom_factor_2); display_manager()->UpdateZoomFactor(display_id_list[1], zoom_factor_1); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(display_id_list[0]), - zoom_factor_2); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(display_id_list[1]), - zoom_factor_1); + EXPECT_EQ(GetDisplayZoom(display_id_list[0]), zoom_factor_2); + EXPECT_EQ(GetDisplayZoom(display_id_list[1]), zoom_factor_1); // After update, display 1 should have |final_zoom_factor_1| as its zoom // factor and display 2 should have |final_zoom_factor_2| as its zoom factor. @@ -1675,12 +1677,10 @@ &success, &error); ASSERT_TRUE(success); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(display_id_list[0]), - final_zoom_factor_1); + EXPECT_EQ(GetDisplayZoom(display_id_list[0]), final_zoom_factor_1); // Display 2 has not been updated yet, so it will still have the old zoom // factor. - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(display_id_list[1]), - zoom_factor_1); + EXPECT_EQ(GetDisplayZoom(display_id_list[1]), zoom_factor_1); info.display_zoom_factor = std::make_unique<double>(zoom_factor_2); CallSetDisplayUnitInfo(base::Int64ToString(display_id_list[1]), info, @@ -1688,10 +1688,8 @@ ASSERT_TRUE(success); // Both displays should now have the correct zoom factor set. - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(display_id_list[0]), - final_zoom_factor_1); - EXPECT_EQ(display_manager()->GetZoomFactorForDisplay(display_id_list[1]), - final_zoom_factor_2); + EXPECT_EQ(GetDisplayZoom(display_id_list[0]), final_zoom_factor_1); + EXPECT_EQ(GetDisplayZoom(display_id_list[1]), final_zoom_factor_2); std::string expected_err = "Zoom value is out of range for display with id: " +
diff --git a/chrome/browser/feedback/system_logs/log_sources/DEPS b/chrome/browser/feedback/system_logs/log_sources/DEPS new file mode 100644 index 0000000..2abf6fa --- /dev/null +++ b/chrome/browser/feedback/system_logs/log_sources/DEPS
@@ -0,0 +1,6 @@ +specific_include_rules = { + # TODO(mash): Remove: http://crbug.com/678705 + "chrome_internal_log_source.cc" : [ + "+ash/shell.h" + ] +}
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc index e3a222a..af2362c 100644 --- a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc +++ b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
@@ -29,10 +29,15 @@ #include "extensions/common/extension_set.h" #if defined(OS_CHROMEOS) +#include "ash/shell.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/metrics/chromeos_metrics_provider.h" +#include "chrome/browser/ui/ash/ash_util.h" #include "chromeos/system/statistics_provider.h" #include "chromeos/system/version_loader.h" +#include "ui/display/manager/display_manager.h" +#include "ui/display/manager/managed_display_info.h" +#include "ui/display/types/display_constants.h" #endif #if defined(OS_WIN) @@ -56,6 +61,7 @@ constexpr char kSettingsKey[] = "settings"; constexpr char kLocalStateSettingsResponseKey[] = "Local State: settings"; constexpr char kArcStatusKey[] = "CHROMEOS_ARC_STATUS"; +constexpr char kMonitorInfoKey[] = "monitor_info"; #else constexpr char kOsVersionTag[] = "OS VERSION"; #endif @@ -143,6 +149,7 @@ #if defined(OS_CHROMEOS) PopulateLocalStateSettings(response.get()); + PopulateMonitorInfo(response.get()); // Store ARC enabled status. response->emplace(kArcStatusKey, arc::IsArcPlayStoreEnabledForProfile( @@ -277,6 +284,42 @@ response->emplace(kLocalStateSettingsResponseKey, serialized_settings); } + +void ChromeInternalLogSource::PopulateMonitorInfo( + SystemLogsResponse* response) { + // TODO(https://crbug.com/682402): Mash support. + if (ash_util::IsRunningInMash()) + return; + + const display::DisplayManager* display_manager = + ash::Shell::Get()->display_manager(); + + std::string entry; + for (const int64_t display_id : display_manager->GetCurrentDisplayIdList()) { + const display::ManagedDisplayInfo& display_info = + display_manager->GetDisplayInfo(display_id); + + if (!entry.empty()) + base::StringAppendF(&entry, "\n"); + if (!display_info.name().empty()) + base::StringAppendF(&entry, "%s : ", display_info.name().c_str()); + if (!display_info.manufacturer_id().empty()) { + base::StringAppendF(&entry, "Manufacturer: %s - ", + display_info.manufacturer_id().c_str()); + } + if (!display_info.product_id().empty()) { + base::StringAppendF(&entry, "Product ID: %s - ", + display_info.product_id().c_str()); + } + if (display_info.year_of_manufacture() != + display::kInvalidYearOfManufacture) { + base::StringAppendF(&entry, "Year of Manufacture: %d", + display_info.year_of_manufacture()); + } + } + response->emplace(kMonitorInfoKey, entry); +} + #endif // defined(OS_CHROMEOS) #if defined(OS_WIN)
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h index 44758a280..523a8142 100644 --- a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h +++ b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h
@@ -28,6 +28,7 @@ #if defined(OS_CHROMEOS) void PopulateLocalStateSettings(SystemLogsResponse* response); + void PopulateMonitorInfo(SystemLogsResponse* response); #endif // defined(OS_CHROMEOS) #if defined(OS_WIN)
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 3db68c5..387e8cc 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -232,11 +232,6 @@ "Disallows fetches for third-party parser-blocking scripts inserted into " "the main frame via document.write."; -const char kDistanceFieldTextName[] = "Distance field text"; -const char kDistanceFieldTextDescription[] = - "Text is rendered with signed distance fields rather than bitmap alpha " - "masks."; - const char kDriveSearchInChromeLauncherName[] = "Drive Search in Chrome App Launcher"; const char kDriveSearchInChromeLauncherDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 6fe7b6c4..e52b82c 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -179,9 +179,6 @@ extern const char kDisplayList2dCanvasName[]; extern const char kDisplayList2dCanvasDescription[]; -extern const char kDistanceFieldTextName[]; -extern const char kDistanceFieldTextDescription[]; - extern const char kDriveSearchInChromeLauncherName[]; extern const char kDriveSearchInChromeLauncherDescription[];
diff --git a/chrome/browser/media/router/discovery/dial/dial_url_fetcher.cc b/chrome/browser/media/router/discovery/dial/dial_url_fetcher.cc index 8b792ac..37fb055 100644 --- a/chrome/browser/media/router/discovery/dial/dial_url_fetcher.cc +++ b/chrome/browser/media/router/discovery/dial/dial_url_fetcher.cc
@@ -140,10 +140,16 @@ // Currently this is the only way to guarantee a live URLLoaderFactory. // TOOD(mmenke): Figure out a way to do this transparently on IO thread. network::mojom::URLLoaderFactoryPtr loader_factory; - content::BrowserThread::PostTask( - content::BrowserThread::UI, FROM_HERE, - base::BindOnce(&BindURLLoaderFactoryRequestOnUIThread, - mojo::MakeRequest(&loader_factory))); + + // TODO(https://crbug.com/823869): Fix DeviceDescriptionServiceTest and remove + // this conditional. + auto mojo_request = mojo::MakeRequest(&loader_factory); + if (content::BrowserThread::IsThreadInitialized(content::BrowserThread::UI)) { + content::BrowserThread::PostTask( + content::BrowserThread::UI, FROM_HERE, + base::BindOnce(&BindURLLoaderFactoryRequestOnUIThread, + std::move(mojo_request))); + } loader_->DownloadToString( loader_factory.get(),
diff --git a/chrome/browser/notifications/notification_launch_id.h b/chrome/browser/notifications/notification_launch_id.h index 2a40e64..ee04f67 100644 --- a/chrome/browser/notifications/notification_launch_id.h +++ b/chrome/browser/notifications/notification_launch_id.h
@@ -90,7 +90,7 @@ // The profile id this launch ID is associated with. The string is UTF8. std::string profile_id_; - // A flat indicating if the notification associated with this launch ID is in + // A flag indicating if the notification associated with this launch ID is in // incognito mode or not. bool incognito_ = false;
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc index 8b2a2d8..5d2a85fd 100644 --- a/chrome/browser/password_manager/password_manager_browsertest.cc +++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -3038,17 +3038,10 @@ "mypassword"); } - -// Flaky on Linux. http://crbug.com/804398 -#if defined(OS_LINUX) -#define MAYBE_InternalsPage_Renderer DISABLED_InternalsPage_Renderer -#else -#define MAYBE_InternalsPage_Renderer InternalsPage_Renderer -#endif - +// TODO(crbug.com/804398): Flaky. // Check that the internals page contains logs from the renderer. IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, - MAYBE_InternalsPage_Renderer) { + DISABLED_InternalsPage_Renderer) { // Open the internals page. ui_test_utils::NavigateToURLWithDisposition( browser(), GURL("chrome://password-manager-internals"),
diff --git a/chrome/browser/plugins/plugin_info_host_impl_unittest.cc b/chrome/browser/plugins/plugin_info_host_impl_unittest.cc index 49e95744..53cb4ee 100644 --- a/chrome/browser/plugins/plugin_info_host_impl_unittest.cc +++ b/chrome/browser/plugins/plugin_info_host_impl_unittest.cc
@@ -310,6 +310,23 @@ EXPECT_THAT(status, Eq(chrome::mojom::PluginStatus::kAllowed)); } +TEST_F(PluginInfoHostImplTest, PluginsAllowedInWhitelistedSchemes) { + VerifyPluginContentSetting(GURL("http://example.com"), "foo", + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, true, + false); + VerifyPluginContentSetting(GURL("https://example.com"), "foo", + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, true, + false); + VerifyPluginContentSetting(GURL("file://foobar/"), "foo", + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, true, + false); + VerifyPluginContentSetting(GURL("chrome-extension://extension-id"), "foo", + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, true, + false); + VerifyPluginContentSetting(GURL("unknown-scheme://foobar"), "foo", + CONTENT_SETTING_BLOCK, true, false); +} + TEST_F(PluginInfoHostImplTest, GetPluginContentSetting) { HostContentSettingsMap* map = HostContentSettingsMapFactory::GetForProfile(profile());
diff --git a/chrome/browser/plugins/plugin_utils.cc b/chrome/browser/plugins/plugin_utils.cc index 4c3c124..8b04209 100644 --- a/chrome/browser/plugins/plugin_utils.cc +++ b/chrome/browser/plugins/plugin_utils.cc
@@ -86,11 +86,12 @@ *setting = CONTENT_SETTING_DETECT_IMPORTANT_CONTENT; // Unless the setting is explicitly ALLOW, return BLOCK for any scheme that - // is not HTTP, HTTPS, or FILE. + // is not HTTP, HTTPS, FILE, or chrome-extension. if (*setting != CONTENT_SETTING_ALLOW && PluginUtils::ShouldPreferHtmlOverPlugins(host_content_settings_map) && !main_frame_url.SchemeIsHTTPOrHTTPS() && - !main_frame_url.SchemeIsFile()) { + !main_frame_url.SchemeIsFile() && + !main_frame_url.SchemeIs(extensions::kExtensionScheme)) { *setting = CONTENT_SETTING_BLOCK; } }
diff --git a/chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc b/chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc index 1a5341ed..98f8c3ee 100644 --- a/chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc +++ b/chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc
@@ -12,7 +12,6 @@ #include "base/task_runner_util.h" #include "base/task_scheduler/post_task.h" #include "base/test/scoped_path_override.h" -#include "base/test/scoped_task_environment.h" #include "base/test/test_shortcut_win.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_attributes_entry.h" @@ -28,6 +27,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" @@ -57,7 +57,7 @@ } void TearDown() override { - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); // Delete all profiles and ensure their shortcuts got removed. const size_t num_profiles = @@ -68,7 +68,7 @@ const base::FilePath profile_path = entry->GetPath(); base::string16 profile_name = entry->GetName(); profile_attributes_storage_->RemoveProfile(profile_path); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); ASSERT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_name)); // The icon file is not deleted until the profile directory is deleted. const base::FilePath icon_path = @@ -95,7 +95,7 @@ // Also create a non-badged shortcut for Chrome, which is conveniently done // by |CreateProfileShortcut()| since there is only one profile. profile_shortcut_manager_->CreateProfileShortcut(profile_1_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); // Verify that there's now a shortcut with no profile information. ValidateNonProfileShortcut(location); } @@ -128,7 +128,7 @@ base::CreateCOMSTATaskRunnerWithTraits({})->PostTask( location, base::Bind(&base::win::ValidateShortcut, shortcut_path, expected_properties)); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); } // Calls base::win::ValidateShortcut() with expected properties for the @@ -192,7 +192,7 @@ std::string(), base::string16(), 0, std::string()); profile_shortcut_manager_->CreateProfileShortcut(profile_path); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); ValidateProfileShortcut(location, profile_name, profile_path); } @@ -207,7 +207,7 @@ ShellUtil::SHORTCUT_LOCATION_DESKTOP, GetDistribution(), properties, ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS), base::Bind([](bool succeeded) { EXPECT_TRUE(succeeded); })); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); } // Creates a regular (non-profile) desktop shortcut with the given name and @@ -252,7 +252,7 @@ GetProfileAttributesWithPath(profile_path, &entry)); ASSERT_NE(entry->GetName(), new_profile_name); entry->SetName(new_profile_name); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); } BrowserDistribution* GetDistribution() { @@ -283,7 +283,7 @@ return system_shortcuts_directory; } - void RunTasksUntilIdle() { scoped_task_environment_.RunUntilIdle(); } + content::TestBrowserThreadBundle thread_bundle_; std::unique_ptr<TestingProfileManager> profile_manager_; std::unique_ptr<ProfileShortcutManager> profile_shortcut_manager_; @@ -296,9 +296,6 @@ base::FilePath profile_2_path_; base::string16 profile_3_name_; base::FilePath profile_3_path_; - - private: - base::test::ScopedTaskEnvironment scoped_task_environment_; }; TEST_F(ProfileShortcutManagerTest, ShortcutFilename) { @@ -376,7 +373,7 @@ profile_attributes_storage_->AddProfile(profile_2_path_, profile_2_name_, std::string(), base::string16(), 0, std::string()); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); // Ensure that the second profile doesn't have a shortcut and that the first // profile's shortcut got renamed and badged. @@ -390,7 +387,7 @@ // Delete one shortcut. profile_attributes_storage_->RemoveProfile(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); // Verify that the profile name has been removed from the remaining shortcut. @@ -415,7 +412,7 @@ // Delete the profile that doesn't have a shortcut. profile_attributes_storage_->RemoveProfile(profile_1_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); // Verify that the remaining shortcut does not have a profile name. ValidateNonProfileShortcut(FROM_HERE); @@ -439,7 +436,7 @@ // Delete the profile that has a shortcut. profile_attributes_storage_->RemoveProfile(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); // Verify that the remaining shortcut does not have a profile name. ValidateNonProfileShortcut(FROM_HERE); @@ -474,7 +471,7 @@ // Delete the third profile and check that its shortcut is gone and no // shortcuts have been re-created. profile_attributes_storage_->RemoveProfile(profile_3_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); ASSERT_FALSE(base::PathExists(profile_1_shortcut_path)); ASSERT_FALSE(base::PathExists(profile_2_shortcut_path)); ASSERT_FALSE(base::PathExists(profile_3_shortcut_path)); @@ -486,7 +483,7 @@ // Delete one shortcut. profile_attributes_storage_->RemoveProfile(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); // Verify that a default shortcut exists (no profile name/avatar). ValidateNonProfileShortcut(FROM_HERE); @@ -515,7 +512,7 @@ // Ensure that a new shortcut does not get made if the old one was renamed. profile_shortcut_manager_->CreateProfileShortcut(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_2, profile_2_path_); @@ -524,7 +521,7 @@ ASSERT_TRUE(base::DeleteFile(profile_2_shortcut_path_2, false)); EXPECT_FALSE(base::PathExists(profile_2_shortcut_path_2)); profile_shortcut_manager_->CreateProfileShortcut(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); ValidateProfileShortcut(FROM_HERE, profile_2_name_, profile_2_path_); } @@ -553,7 +550,7 @@ // Delete the profile and ensure both shortcuts were also deleted. profile_attributes_storage_->RemoveProfile(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(base::PathExists(profile_2_shortcut_path_1)); EXPECT_FALSE(base::PathExists(profile_2_shortcut_path_2)); ValidateNonProfileShortcutAtPath(FROM_HERE, @@ -651,7 +648,7 @@ // Delete shortcuts for profile 1 and ensure that they got deleted while the // shortcuts for profile 2 were kept. profile_shortcut_manager_->RemoveProfileShortcuts(profile_1_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(base::PathExists(profile_1_shortcut_path_1)); EXPECT_FALSE(base::PathExists(profile_1_shortcut_path_2)); ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_1, @@ -674,7 +671,7 @@ // Profile 2 should have a shortcut initially. profile_shortcut_manager_->HasProfileShortcuts(profile_2_path_, callback); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_TRUE(result.has_shortcuts); // Delete the shortcut and check that the function returns false. @@ -683,7 +680,7 @@ ASSERT_TRUE(base::DeleteFile(profile_2_shortcut_path, false)); EXPECT_FALSE(base::PathExists(profile_2_shortcut_path)); profile_shortcut_manager_->HasProfileShortcuts(profile_2_path_, callback); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(result.has_shortcuts); } @@ -695,7 +692,7 @@ profile_attributes_storage_->AddProfile(profile_1_path_, profile_1_name_, std::string(), base::string16(), 0, std::string()); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); ASSERT_EQ(1u, profile_attributes_storage_->GetNumberOfProfiles()); // Ensure system-level continues to exist and user-level was not created. @@ -714,7 +711,7 @@ profile_attributes_storage_->AddProfile(profile_3_path_, profile_3_name_, std::string(), base::string16(), 0, std::string()); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_3_name_)); // Ensure that changing the avatar icon and the name does not result in a @@ -723,12 +720,12 @@ ASSERT_TRUE(profile_attributes_storage_-> GetProfileAttributesWithPath(profile_3_path_, &entry_3)); entry_3->SetAvatarIconIndex(3u); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_3_name_)); const base::string16 new_profile_3_name = L"New Name 3"; entry_3->SetName(new_profile_3_name); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_3_name_)); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(new_profile_3_name)); @@ -738,7 +735,7 @@ ASSERT_TRUE(profile_attributes_storage_-> GetProfileAttributesWithPath(profile_2_path_, &entry_2)); entry_2->SetName(new_profile_2_name); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); ValidateProfileShortcut(FROM_HERE, new_profile_2_name, profile_2_path_); } @@ -753,7 +750,7 @@ // Delete a profile and verify that only the system-level shortcut still // exists. profile_attributes_storage_->RemoveProfile(profile_1_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_TRUE(base::PathExists(system_level_shortcut_path)); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(base::string16())); @@ -782,7 +779,7 @@ // shortcut creation path in |DeleteDesktopShortcuts()|, which is // not covered by the |DeleteSecondToLastProfileWithSystemLevelShortcut| test. profile_attributes_storage_->RemoveProfile(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); // Verify that only the system-level shortcut still exists. EXPECT_TRUE(base::PathExists(system_level_shortcut_path)); @@ -803,7 +800,7 @@ EXPECT_FALSE(base::PathExists(icon_path)); profile_shortcut_manager_->CreateOrUpdateProfileIcon(profile_1_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_TRUE(base::PathExists(icon_path)); } @@ -834,7 +831,7 @@ // Deleting the default profile will unbadge the new profile's icon and should // result in an icon that is identical to the unbadged default profile icon. profile_attributes_storage_->RemoveProfile(profile_1_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); std::string unbadged_icon_2; EXPECT_TRUE(base::ReadFileToString(icon_path_2, &unbadged_icon_2)); @@ -861,7 +858,7 @@ ASSERT_TRUE(profile_attributes_storage_-> GetProfileAttributesWithPath(profile_1_path_, &entry_1)); entry_1->SetAvatarIconIndex(1u); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); std::string new_badged_icon_1; EXPECT_TRUE(base::ReadFileToString(icon_path_1, &new_badged_icon_1)); @@ -869,7 +866,7 @@ // Ensure the new icon is not the unbadged icon. profile_attributes_storage_->RemoveProfile(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); std::string unbadged_icon_1; EXPECT_TRUE(base::ReadFileToString(icon_path_1, &unbadged_icon_1)); @@ -877,7 +874,7 @@ // Ensure the icon doesn't change on avatar change without 2 profiles. entry_1->SetAvatarIconIndex(1u); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); std::string unbadged_icon_1_a; EXPECT_TRUE(base::ReadFileToString(icon_path_1, &unbadged_icon_1_a)); @@ -1023,7 +1020,7 @@ // Delete profile1. profile_attributes_storage_->RemoveProfile(profile_1_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(new_profile_1_name)); // Check that nothing is changed for profile2 and profile3. ValidateProfileShortcut(FROM_HERE, profile_2_name_, profile_2_path_); @@ -1036,7 +1033,7 @@ GetDefaultShortcutPathForProfile(profile_2_name_))); EXPECT_TRUE(base::PathExists(profile_3_shortcut_path)); profile_attributes_storage_->RemoveProfile(profile_2_path_); - RunTasksUntilIdle(); + thread_bundle_.RunUntilIdle(); EXPECT_FALSE(base::PathExists( GetDefaultShortcutPathForProfile(profile_2_name_))); // Only profile3 exists. There should be non-profile shortcut only.
diff --git a/chrome/browser/profiling_host/profiling_test_driver.cc b/chrome/browser/profiling_host/profiling_test_driver.cc index bcf1965..9180d01 100644 --- a/chrome/browser/profiling_host/profiling_test_driver.cc +++ b/chrome/browser/profiling_host/profiling_test_driver.cc
@@ -838,7 +838,7 @@ base::Value* process_mmaps = FindArgDump(base::Process::Current().Pid(), dump_json, "process_mmaps"); - if (!ValidateProcessMmaps(process_mmaps, !HasPseudoFrames())) { + if (!ValidateProcessMmaps(process_mmaps, HasNativeFrames())) { LOG(ERROR) << "Failed to validate browser process mmaps."; return false; } @@ -864,7 +864,7 @@ base::Value* process_mmaps = FindArgDump(renderer_pid, dump_json, "process_mmaps"); - if (!ValidateProcessMmaps(process_mmaps, !HasPseudoFrames())) { + if (!ValidateProcessMmaps(process_mmaps, HasNativeFrames())) { LOG(ERROR) << "Failed to validate renderer process mmaps."; return false; } @@ -916,6 +916,12 @@ options_.stack_mode == mojom::StackMode::MIXED; } +bool ProfilingTestDriver::HasNativeFrames() { + return options_.stack_mode == mojom::StackMode::NATIVE_WITH_THREAD_NAMES || + options_.stack_mode == mojom::StackMode::NATIVE_WITHOUT_THREAD_NAMES || + options_.stack_mode == mojom::StackMode::MIXED; +} + bool ProfilingTestDriver::IsRecordingAllAllocations() { return !options_.should_sample || options_.sample_everything; }
diff --git a/chrome/browser/profiling_host/profiling_test_driver.h b/chrome/browser/profiling_host/profiling_test_driver.h index c9f96337..2f3dcbb4 100644 --- a/chrome/browser/profiling_host/profiling_test_driver.h +++ b/chrome/browser/profiling_host/profiling_test_driver.h
@@ -102,6 +102,7 @@ bool ShouldProfileRenderer(); bool ShouldIncludeNativeThreadNames(); bool HasPseudoFrames(); + bool HasNativeFrames(); bool IsRecordingAllAllocations(); void WaitForProfilingToStartForAllRenderersUIThread();
diff --git a/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.cc b/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.cc index a3aa787..0fcd3fa 100644 --- a/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.cc +++ b/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.cc
@@ -25,6 +25,10 @@ OnReload(); } +void DiscardMetricsLifecycleUnitObserver::OnLifecycleUnitVisibilityChanged( + LifecycleUnit* lifecycle_unit, + content::Visibility visibility) {} + void DiscardMetricsLifecycleUnitObserver::OnLifecycleUnitDestroyed( LifecycleUnit* lifecycle_unit) { // If the browser is not shutting down and the tab is in a LOADED state after
diff --git a/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h b/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h index a8d5a6cb..e38997f6 100644 --- a/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h +++ b/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h
@@ -20,6 +20,9 @@ // LifecycleUnitObserver: void OnLifecycleUnitStateChanged(LifecycleUnit* lifecycle_unit) override; + void OnLifecycleUnitVisibilityChanged( + LifecycleUnit* lifecycle_unit, + content::Visibility visibility) override; void OnLifecycleUnitDestroyed(LifecycleUnit* lifecycle_unit) override; private:
diff --git a/chrome/browser/resource_coordinator/lifecycle_unit_base.cc b/chrome/browser/resource_coordinator/lifecycle_unit_base.cc index 33f7c03..196e598 100644 --- a/chrome/browser/resource_coordinator/lifecycle_unit_base.cc +++ b/chrome/browser/resource_coordinator/lifecycle_unit_base.cc
@@ -36,6 +36,12 @@ observer.OnLifecycleUnitStateChanged(this); } +void LifecycleUnitBase::OnLifecycleUnitVisibilityChanged( + content::Visibility visibility) { + for (auto& observer : observers_) + observer.OnLifecycleUnitVisibilityChanged(this, visibility); +} + void LifecycleUnitBase::OnLifecycleUnitDestroyed() { for (auto& observer : observers_) observer.OnLifecycleUnitDestroyed(this);
diff --git a/chrome/browser/resource_coordinator/lifecycle_unit_base.h b/chrome/browser/resource_coordinator/lifecycle_unit_base.h index 1269368..d8cf388 100644 --- a/chrome/browser/resource_coordinator/lifecycle_unit_base.h +++ b/chrome/browser/resource_coordinator/lifecycle_unit_base.h
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "base/observer_list.h" #include "chrome/browser/resource_coordinator/lifecycle_unit.h" +#include "content/public/browser/visibility.h" namespace resource_coordinator { @@ -27,6 +28,9 @@ // Sets the state of this LifecycleUnit to |state| and notifies observers. void SetState(State state); + // Notifies observers that the visibility of the LifecycleUnit has changed. + void OnLifecycleUnitVisibilityChanged(content::Visibility visibility); + // Notifies observers that the LifecycleUnit is being destroyed. This is // invoked by derived classes rather than by the base class to avoid notifying // observers when the LifecycleUnit has been partially destroyed.
diff --git a/chrome/browser/resource_coordinator/lifecycle_unit_base_unittest.cc b/chrome/browser/resource_coordinator/lifecycle_unit_base_unittest.cc index 7bec0a2c..46e1ad1 100644 --- a/chrome/browser/resource_coordinator/lifecycle_unit_base_unittest.cc +++ b/chrome/browser/resource_coordinator/lifecycle_unit_base_unittest.cc
@@ -6,6 +6,7 @@ #include "base/macros.h" #include "chrome/browser/resource_coordinator/lifecycle_unit_observer.h" +#include "content/public/browser/visibility.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -18,6 +19,8 @@ MockLifecycleUnitObserver() = default; MOCK_METHOD1(OnLifecycleUnitStateChanged, void(LifecycleUnit*)); + MOCK_METHOD2(OnLifecycleUnitVisibilityChanged, + void(LifecycleUnit*, content::Visibility)); MOCK_METHOD1(OnLifecycleUnitDestroyed, void(LifecycleUnit*)); private: @@ -27,6 +30,7 @@ class DummyLifecycleUnit : public LifecycleUnitBase { public: using LifecycleUnitBase::SetState; + using LifecycleUnitBase::OnLifecycleUnitVisibilityChanged; DummyLifecycleUnit() = default; ~DummyLifecycleUnit() override { OnLifecycleUnitDestroyed(); } @@ -94,4 +98,30 @@ testing::Mock::VerifyAndClear(&observer); } +// Verify that observers are notified when the visibility of the LifecyleUnit +// changes. +TEST(LifecycleUnitBaseTest, ChangeVisibilityNotifiesObservers) { + testing::StrictMock<MockLifecycleUnitObserver> observer; + DummyLifecycleUnit lifecycle_unit; + lifecycle_unit.AddObserver(&observer); + + // Observer is notified when the visibility changes. + EXPECT_CALL(observer, OnLifecycleUnitVisibilityChanged( + &lifecycle_unit, content::Visibility::HIDDEN)); + lifecycle_unit.OnLifecycleUnitVisibilityChanged(content::Visibility::HIDDEN); + testing::Mock::VerifyAndClear(&observer); + + EXPECT_CALL(observer, OnLifecycleUnitVisibilityChanged( + &lifecycle_unit, content::Visibility::OCCLUDED)); + lifecycle_unit.OnLifecycleUnitVisibilityChanged( + content::Visibility::OCCLUDED); + testing::Mock::VerifyAndClear(&observer); + + EXPECT_CALL(observer, OnLifecycleUnitVisibilityChanged( + &lifecycle_unit, content::Visibility::VISIBLE)); + lifecycle_unit.OnLifecycleUnitVisibilityChanged(content::Visibility::VISIBLE); + testing::Mock::VerifyAndClear(&observer); + + lifecycle_unit.RemoveObserver(&observer); +} } // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/lifecycle_unit_observer.h b/chrome/browser/resource_coordinator/lifecycle_unit_observer.h index 8cad678a..756c420e 100644 --- a/chrome/browser/resource_coordinator/lifecycle_unit_observer.h +++ b/chrome/browser/resource_coordinator/lifecycle_unit_observer.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_RESOURCE_COORDINATOR_LIFECYCLE_UNIT_OBSERVER_H_ #define CHROME_BROWSER_RESOURCE_COORDINATOR_LIFECYCLE_UNIT_OBSERVER_H_ +#include "content/public/browser/visibility.h" + namespace resource_coordinator { class LifecycleUnit; @@ -17,8 +19,13 @@ // Invoked when the state of the observed LifecycleUnit changes. virtual void OnLifecycleUnitStateChanged(LifecycleUnit* lifecycle_unit) = 0; + // Invoked when the visibility of the observed LifecyleUnit changes. + virtual void OnLifecycleUnitVisibilityChanged( + LifecycleUnit* lifecycle_unit, + content::Visibility visibility) = 0; + // Invoked before the observed LifecycleUnit starts being destroyed (i.e. - // |lifecycle_unit| is still valid when this is inovked). + // |lifecycle_unit| is still valid when this is invoked). virtual void OnLifecycleUnitDestroyed(LifecycleUnit* lifecycle_unit) = 0; };
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc index fe8e17e..ba2a047 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
@@ -319,4 +319,9 @@ } } +void TabLifecycleUnitSource::TabLifecycleUnit::OnVisibilityChanged( + content::Visibility visibility) { + OnLifecycleUnitVisibilityChanged(visibility); +} + } // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit.h b/chrome/browser/resource_coordinator/tab_lifecycle_unit.h index 3cfaa4f..6a056c6 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit.h +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit.h
@@ -12,6 +12,7 @@ #include "chrome/browser/resource_coordinator/tab_lifecycle_unit_external.h" #include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h" #include "chrome/browser/resource_coordinator/time.h" +#include "content/public/browser/visibility.h" #include "content/public/browser/web_contents_observer.h" class TabStripModel; @@ -96,6 +97,7 @@ // content::WebContentsObserver: void DidStartLoading() override; + void OnVisibilityChanged(content::Visibility visibility) override; // List of observers to notify when the discarded state or the auto- // discardable state of this tab changes.
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc index a5c3539..ab8d12b6 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc
@@ -10,6 +10,7 @@ #include "base/observer_list.h" #include "base/test/simple_test_tick_clock.h" #include "build/build_config.h" +#include "chrome/browser/resource_coordinator/lifecycle_unit_observer.h" #include "chrome/browser/resource_coordinator/tab_lifecycle_observer.h" #include "chrome/browser/resource_coordinator/tab_lifecycle_unit_external.h" #include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h" @@ -47,6 +48,19 @@ } // namespace +class MockLifecycleUnitObserver : public LifecycleUnitObserver { + public: + MockLifecycleUnitObserver() = default; + + MOCK_METHOD1(OnLifecycleUnitStateChanged, void(LifecycleUnit*)); + MOCK_METHOD1(OnLifecycleUnitDestroyed, void(LifecycleUnit*)); + MOCK_METHOD2(OnLifecycleUnitVisibilityChanged, + void(LifecycleUnit*, content::Visibility)); + + private: + DISALLOW_COPY_AND_ASSIGN(MockLifecycleUnitObserver); +}; + class TabLifecycleUnitTest : public ChromeRenderViewHostTestHarness { protected: using TabLifecycleUnit = TabLifecycleUnitSource::TabLifecycleUnit; @@ -318,4 +332,35 @@ EXPECT_FALSE(tab_lifecycle_unit.CanDiscard(DiscardReason::kUrgent)); } +TEST_F(TabLifecycleUnitTest, NotifiedOfWebContentsVisibilityChanges) { + TabLifecycleUnit tab_lifecycle_unit(&observers_, web_contents_.get(), + tab_strip_model_.get()); + + testing::StrictMock<MockLifecycleUnitObserver> observer; + tab_lifecycle_unit.AddObserver(&observer); + + EXPECT_CALL(observer, OnLifecycleUnitVisibilityChanged( + &tab_lifecycle_unit, content::Visibility::VISIBLE)); + web_contents_->WasShown(); + testing::Mock::VerifyAndClear(&observer); + + EXPECT_CALL(observer, OnLifecycleUnitVisibilityChanged( + &tab_lifecycle_unit, content::Visibility::HIDDEN)); + web_contents_->WasHidden(); + testing::Mock::VerifyAndClear(&observer); + + EXPECT_CALL(observer, OnLifecycleUnitVisibilityChanged( + &tab_lifecycle_unit, content::Visibility::VISIBLE)); + web_contents_->WasShown(); + testing::Mock::VerifyAndClear(&observer); + + EXPECT_CALL(observer, + OnLifecycleUnitVisibilityChanged(&tab_lifecycle_unit, + content::Visibility::OCCLUDED)); + web_contents_->WasOccluded(); + testing::Mock::VerifyAndClear(&observer); + + tab_lifecycle_unit.RemoveObserver(&observer); +} + } // namespace resource_coordinator
diff --git a/chrome/browser/resources/md_extensions/detail_view.html b/chrome/browser/resources/md_extensions/detail_view.html index c94743558..07cb5f81 100644 --- a/chrome/browser/resources/md_extensions/detail_view.html +++ b/chrome/browser/resources/md_extensions/detail_view.html
@@ -159,10 +159,6 @@ margin: 0; } - button[is='cr-link-row'] { - width: 100%; - } - #options-section .control-line:first-child { border-top: var(--cr-separator-line); } @@ -380,20 +376,20 @@ </template> </div> </template> - <button class="hr" is="cr-link-row" id="extensions-options" + <cr-link-row class="hr" is="" id="extensions-options" disabled="[[!isEnabled_(data.state)]]" hidden="[[!shouldShowOptionsLink_(data.*)]]" icon-class="icon-external" label="$i18n{itemOptions}" on-click="onExtensionOptionsTap_"> - </button> - <button class="hr" hidden="[[!data.manifestHomePageUrl.length]]" - is="cr-link-row" icon-class="icon-external" id="extensionWebsite" + </cr-link-row> + <cr-link-row class="hr" hidden="[[!data.manifestHomePageUrl.length]]" + icon-class="icon-external" id="extensionWebsite" label="$i18n{extensionWebsite}" on-click="onExtensionWebSiteTap_"> - </button> - <button class="hr" hidden="[[!data.webStoreUrl.length]]" - is="cr-link-row" icon-class="icon-external" id="viewInStore" + </cr-link-row> + <cr-link-row class="hr" hidden="[[!data.webStoreUrl.length]]" + icon-class="icon-external" id="viewInStore" label="$i18n{viewInStore}" on-click="onViewInStoreTap_"> - </button> + </cr-link-row> <div class="section block"> <div class="section-title">$i18n{itemSource}</div> <div id="source" class="section-content"> @@ -407,11 +403,11 @@ </a> </div> </div> - <button class="hr" is="cr-link-row" + <cr-link-row class="hr" hidden="[[isControlled_(data.controlledInfo)]]" icon-class="subpage-arrow" id="remove-extension" label="$i18n{itemRemoveExtension}" on-click="onRemoveTap_"> - </button> + </cr-link-row> </div> </div> </template>
diff --git a/chrome/browser/resources/print_preview/data/document_info.js b/chrome/browser/resources/print_preview/data/document_info.js index 8881596..caea2b5 100644 --- a/chrome/browser/resources/print_preview/data/document_info.js +++ b/chrome/browser/resources/print_preview/data/document_info.js
@@ -183,6 +183,16 @@ } /** + * Updates the fit to page scaling. Does not dispatch a CHANGE event, since + * this is only called in tests and in the new print preview UI, which uses + * data bindings to notify UI elements of the change. + * @param {number} scaleFactor The fit to page scale factor. + */ + updateFitToPageScaling(scaleFactor) { + this.fitToPageScaling_ = scaleFactor; + } + + /** * Updates information about each page and dispatches a CHANGE event. * @param {!print_preview.PrintableArea} printableArea Printable area of the * document in points.
diff --git a/chrome/browser/resources/print_preview/new/preview_area.js b/chrome/browser/resources/print_preview/new/preview_area.js index 5738b4f..40147603b 100644 --- a/chrome/browser/resources/print_preview/new/preview_area.js +++ b/chrome/browser/resources/print_preview/new/preview_area.js
@@ -361,7 +361,7 @@ if (this.inFlightRequestId_ != previewResponseId) return; this.documentInfo.updatePageCount(pageCount); - this.documentInfo.fitToPageScaling_ = fitToPageScaling; + this.documentInfo.updateFitToPageScaling(fitToPageScaling); this.notifyPath('documentInfo.pageCount'); this.notifyPath('documentInfo.fitToPageScaling'); },
diff --git a/chrome/browser/resources/print_preview/new/scaling_settings.js b/chrome/browser/resources/print_preview/new/scaling_settings.js index 4588514..977389d 100644 --- a/chrome/browser/resources/print_preview/new/scaling_settings.js +++ b/chrome/browser/resources/print_preview/new/scaling_settings.js
@@ -47,7 +47,7 @@ // is valid, 1 call will occur due to the change to |currentValue_|. If // not, 2 calls will occur, since |inputValid_| will also change. this.fitToPageFlag_ = this.inputValid_ ? 1 : 2; - this.currentValue_ = this.documentInfo.fitToPageScaling; + this.currentValue_ = this.documentInfo.fitToPageScaling.toString(); } },
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.html b/chrome/browser/resources/settings/a11y_page/a11y_page.html index ce39f5f..3d78f07 100644 --- a/chrome/browser/resources/settings/a11y_page/a11y_page.html +++ b/chrome/browser/resources/settings/a11y_page/a11y_page.html
@@ -59,8 +59,8 @@ $i18n{a11yWebStore} </div> </div> - <paper-icon-button-light class="icon-external"> - <button actionable aria-label="$i18n{moreFeaturesLink}" + <paper-icon-button-light actionable class="icon-external"> + <button aria-label="$i18n{moreFeaturesLink}" aria-describedby="moreFeaturesSecondary"></button> </paper-icon-button-light> </a>
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.html b/chrome/browser/resources/settings/appearance_page/appearance_page.html index 558fc37..0a71ec5 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_page.html +++ b/chrome/browser/resources/settings/appearance_page/appearance_page.html
@@ -56,8 +56,7 @@ focus-config="[[focusConfig_]]"> <neon-animatable route-path="default"> <if expr="chromeos"> - <button icon-class="icon-external" id="wallpaperButton" - is="cr-link-row" + <cr-link-row icon-class="icon-external" id="wallpaperButton" hidden="[[!pageVisibility.setWallpaper]]" on-click="openWallpaperManager_" label="$i18n{setWallpaper}" sub-label="$i18n{openWallpaperApp}" @@ -67,15 +66,15 @@ indicator-type="devicePolicy"> </cr-policy-indicator> </template> - </button> + </cr-link-row> <div class="hr"></div> </if> <div class="settings-row continuation" id="themeRow" hidden="[[!pageVisibility.setTheme]]"> - <button class="first" icon-class="icon-external" is="cr-link-row" + <cr-link-row class="first" icon-class="icon-external" hidden="[[!pageVisibility.setTheme]]" label="$i18n{themes}" sub-label="[[themeSublabel_]]" - on-click="openThemeUrl_"></button> + on-click="openThemeUrl_"></cr-link-row> <if expr="not is_linux or chromeos"> <template is="dom-if" if="[[prefs.extensions.theme.id.value]]"> <div class="separator"></div> @@ -165,10 +164,10 @@ menu-options="[[fontSizeOptions_]]"> </settings-dropdown-menu> </div> - <button class="hr" is="cr-link-row" + <cr-link-row class="hr" icon-class="subpage-arrow" id="customize-fonts-subpage-trigger" label="$i18n{customizeFonts}" on-click="onCustomizeFontsTap_"> - </button> + </cr-link-row> <div class="settings-box" hidden="[[!pageVisibility.pageZoom]]"> <div id="pageZoom" class="start">$i18n{pageZoom}</div> <div class="md-select-wrapper">
diff --git a/chrome/browser/resources/settings/device_page/display.html b/chrome/browser/resources/settings/device_page/display.html index 09e9e53..58b9a664a 100644 --- a/chrome/browser/resources/settings/device_page/display.html +++ b/chrome/browser/resources/settings/device_page/display.html
@@ -209,11 +209,11 @@ </div> </template> - <button is="cr-link-row" icon-class="subpage-arrow" class="indented hr" + <cr-link-row icon-class="subpage-arrow" class="indented hr" id="overscan" label="$i18n{displayOverscanPageTitle}" sub-label="$i18n{displayOverscanPageText}" on-click="onOverscanTap_" hidden$="[[!showOverscanSetting_(selectedDisplay)]]"> - </button> + </cr-link-row> <settings-display-overscan-dialog id="displayOverscan" display-id="{{overscanDisplayId}}"
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/autofill_section.html b/chrome/browser/resources/settings/passwords_and_forms_page/autofill_section.html index f454436..4f489c5 100644 --- a/chrome/browser/resources/settings/passwords_and_forms_page/autofill_section.html +++ b/chrome/browser/resources/settings/passwords_and_forms_page/autofill_section.html
@@ -114,8 +114,8 @@ </paper-icon-button-light> </template> <template is="dom-if" if="[[!item.metadata.isLocal]]"> - <paper-icon-button-light class="icon-external"> - <button on-click="onRemoteEditAddressTap_" actionable></button> + <paper-icon-button-light actionable class="icon-external"> + <button on-click="onRemoteEditAddressTap_"></button> </paper-icon-button-light> </template> </div> @@ -180,9 +180,9 @@ </paper-icon-button-light> </template> <template is="dom-if" if="[[!showDots_(item.metadata)]]"> - <paper-icon-button-light class="icon-external"> + <paper-icon-button-light actionable class="icon-external"> <button id="remoteCreditCardLink" - on-click="onRemoteEditCreditCardTap_" actionable> + on-click="onRemoteEditCreditCardTap_"> </button> </paper-icon-button-light> </template>
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html index 5b33d2e..8a2376f9 100644 --- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html +++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html
@@ -23,10 +23,10 @@ <settings-animated-pages id="pages" section="passwordsAndForms" focus-config="[[focusConfig_]]"> <neon-animatable route-path="default"> - <button is="cr-link-row" icon-class="subpage-arrow" + <cr-link-row icon-class="subpage-arrow" id="autofillManagerButton" label="$i18n{autofill}" sub-label="$i18n{autofillDetail}" on-click="onAutofillTap_"> - </button> + </cr-link-row> <div class="settings-box two-line"> <div class="start two-line" on-click="onPasswordsTap_" actionable id="passwordManagerButton">
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html index 5bdf20e..06b6aab 100644 --- a/chrome/browser/resources/settings/people_page/sync_page.html +++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -286,8 +286,8 @@ $i18n{personalizeGoogleServicesText} </div> </div> - <paper-icon-button-light class="icon-external"> - <button actionable aria-label="$i18n{personalizeGoogleServicesTitle}" + <paper-icon-button-light actionable class="icon-external"> + <button aria-label="$i18n{personalizeGoogleServicesTitle}" aria-describedby="activityControlsSecondary"></button> </paper-icon-button-light> </a> @@ -297,8 +297,8 @@ <div class="start"> $i18n{manageSyncedDataTitle} </div> - <paper-icon-button-light class="icon-external"> - <button actionable aria-label="$i18n{manageSyncedDataTitle}"></button> + <paper-icon-button-light actionable class="icon-external"> + <button aria-label="$i18n{manageSyncedDataTitle}"></button> </paper-icon-button-light> </a>
diff --git a/chrome/browser/resources/settings/printing_page/cloud_printers.html b/chrome/browser/resources/settings/printing_page/cloud_printers.html index 29f0c1a..803741b 100644 --- a/chrome/browser/resources/settings/printing_page/cloud_printers.html +++ b/chrome/browser/resources/settings/printing_page/cloud_printers.html
@@ -24,8 +24,8 @@ <div class="start"> $i18n{printingManageCloudPrintDevices} </div> - <paper-icon-button-light class="icon-external"> - <button actionable aria-label="$i18n{printingManageCloudPrintDevices}"> + <paper-icon-button-light actionable class="icon-external"> + <button aria-label="$i18n{printingManageCloudPrintDevices}"> </button> </paper-icon-button-light> </a>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html index a4b853a..ec6446f 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -411,8 +411,8 @@ target="_blank" href="https://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager07.html"> <div class="start">$i18n{adobeFlashStorage}</div> - <paper-icon-button-light class="icon-external"> - <button actionable aria-label="$i18n{adobeFlashStorage}"></button> + <paper-icon-button-light actionable class="icon-external"> + <button aria-label="$i18n{adobeFlashStorage}"></button> </paper-icon-button-light> </a> </if>
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.cc index cf9896a..ecdd14d 100644 --- a/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.cc +++ b/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.cc
@@ -15,23 +15,19 @@ namespace { // Field trial strings. -const char kSRTCanaryGroup[] = "SRTCanary"; const char kSRTPromptOffGroup[] = "Off"; const char kSRTPromptSeedParam[] = "Seed"; const char kSRTElevationTrial[] = "SRTElevation"; const char kSRTElevationAsNeededGroup[] = "AsNeeded"; +// The download links of the Software Removal Tool. const char kDownloadRootPath[] = "https://dl.google.com/dl/softwareremovaltool/win/"; -// The download links of the Software Removal Tool. -const char kMainSRTDownloadURL[] = +const char kLegacySRTDownloadURL[] = "https://dl.google.com/dl" "/softwareremovaltool/win/chrome_cleanup_tool.exe"; -const char kCanarySRTDownloadURL[] = - "https://dl.google.com/dl" - "/softwareremovaltool/win/c/chrome_cleanup_tool.exe"; } // namespace @@ -45,10 +41,8 @@ const base::Feature kUserInitiatedChromeCleanupsFeature{ "UserInitiatedChromeCleanups", base::FEATURE_ENABLED_BY_DEFAULT}; -// TODO(b/786964): Rename this to remove ByBitness from the feature name once -// all test scripts have been updated. -const base::Feature kCleanerDownloadFeature{"DownloadCleanupToolByBitness", - base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kChromeCleanupDistributionFeature{ + "ChromeCleanupDistribution", base::FEATURE_DISABLED_BY_DEFAULT}; bool IsInSRTPromptFieldTrialGroups() { return !base::StartsWith(base::FieldTrialList::FindFullName(kSRTPromptTrial), @@ -66,17 +60,13 @@ } GURL GetLegacyDownloadURL() { - if (base::StartsWith(base::FieldTrialList::FindFullName(kSRTPromptTrial), - kSRTCanaryGroup, base::CompareCase::SENSITIVE)) { - return GURL(kCanarySRTDownloadURL); - } - return GURL(kMainSRTDownloadURL); + return GURL(kLegacySRTDownloadURL); } GURL GetSRTDownloadURL() { - constexpr char kDownloadGroupParam[] = "download_group"; + constexpr char kCleanerDownloadGroupParam[] = "cleaner_download_group"; const std::string download_group = base::GetFieldTrialParamValueByFeature( - kCleanerDownloadFeature, kDownloadGroupParam); + kChromeCleanupDistributionFeature, kCleanerDownloadGroupParam); if (download_group.empty()) return GetLegacyDownloadURL();
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h b/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h index 9f8226e..acc33ee8 100644 --- a/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h +++ b/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h
@@ -59,6 +59,10 @@ // When enabled, users can initiate cleanups from the Settings page. extern const base::Feature kUserInitiatedChromeCleanupsFeature; +// Feature, parameters of which control which software reporter and cleanup tool +// versions will be downloaded. When not enabled, default versions will be used. +extern const base::Feature kChromeCleanupDistributionFeature; + extern const char kSRTPromptTrial[]; // Returns true if this Chrome is in a field trial group which shows the SRT
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win_unittest.cc b/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win_unittest.cc index a2b1cb53..6d3800e 100644 --- a/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win_unittest.cc +++ b/chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win_unittest.cc
@@ -22,9 +22,9 @@ } void CreateDownloadFeature(const std::string& download_group_name) { - constexpr char kFeatureName[] = "DownloadCleanupToolByBitness"; + constexpr char kFeatureName[] = "ChromeCleanupDistribution"; std::map<std::string, std::string> params; - params["download_group"] = download_group_name; + params["cleaner_download_group"] = download_group_name; variations_.SetVariationParamsWithFeatureAssociations( "A trial name", params, {kFeatureName}); } @@ -39,12 +39,6 @@ GetSRTDownloadURL().path()); } -TEST_F(SRTDownloadURLTest, Canary) { - CreatePromptTrial("SRTCanary"); - EXPECT_EQ("/dl/softwareremovaltool/win/c/chrome_cleanup_tool.exe", - GetSRTDownloadURL().path()); -} - TEST_F(SRTDownloadURLTest, Experiment) { CreateDownloadFeature("experiment"); std::string expected_path;
diff --git a/chrome/browser/ssl/ssl_error_handler_unittest.cc b/chrome/browser/ssl/ssl_error_handler_unittest.cc index 3318548..010164b7 100644 --- a/chrome/browser/ssl/ssl_error_handler_unittest.cc +++ b/chrome/browser/ssl/ssl_error_handler_unittest.cc
@@ -645,6 +645,13 @@ error_handler_.reset(nullptr); } SSLErrorHandler::ResetConfigForTesting(); + + // ChromeRenderViewHostTestHarness::TearDown() simulates shutdown and as + // such destroys parts of the task environment required in these + // destructors. + test_server_.reset(); + tracker_.reset(); + ChromeRenderViewHostTestHarness::TearDown(); }
diff --git a/chrome/browser/themes/theme_properties.cc b/chrome/browser/themes/theme_properties.cc index d3a51a7..29c1a3ce 100644 --- a/chrome/browser/themes/theme_properties.cc +++ b/chrome/browser/themes/theme_properties.cc
@@ -185,12 +185,12 @@ case ThemeProperties::COLOR_TAB_TEXT: case ThemeProperties::COLOR_BOOKMARK_TEXT: - case ThemeProperties::COLOR_TAB_CLOSE_BUTTON_BACKGROUND_ACTIVE: + case ThemeProperties::COLOR_TAB_CLOSE_BUTTON_ACTIVE: case ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON: return incognito ? gfx::kGoogleGrey100 : gfx::kGoogleGrey800; case ThemeProperties::COLOR_BACKGROUND_TAB_TEXT: - case ThemeProperties::COLOR_TAB_CLOSE_BUTTON_BACKGROUND_INACTIVE: + case ThemeProperties::COLOR_TAB_CLOSE_BUTTON_INACTIVE: case ThemeProperties::COLOR_TAB_ALERT_AUDIO: return incognito ? gfx::kGoogleGrey400 : gfx::kGoogleGrey700;
diff --git a/chrome/browser/themes/theme_properties.h b/chrome/browser/themes/theme_properties.h index e6f0311..13e75c0b 100644 --- a/chrome/browser/themes/theme_properties.h +++ b/chrome/browser/themes/theme_properties.h
@@ -121,8 +121,8 @@ COLOR_TAB_THROBBER_WAITING, // Colors for the tab close button inons. - COLOR_TAB_CLOSE_BUTTON_BACKGROUND_ACTIVE, - COLOR_TAB_CLOSE_BUTTON_BACKGROUND_INACTIVE, + COLOR_TAB_CLOSE_BUTTON_ACTIVE, + COLOR_TAB_CLOSE_BUTTON_INACTIVE, COLOR_TAB_CLOSE_BUTTON_BACKGROUND_HOVER, COLOR_TAB_CLOSE_BUTTON_BACKGROUND_PRESSED,
diff --git a/chrome/browser/ui/app_list/app_list_service.h b/chrome/browser/ui/app_list/app_list_service.h index be417455..fc5cca59 100644 --- a/chrome/browser/ui/app_list/app_list_service.h +++ b/chrome/browser/ui/app_list/app_list_service.h
@@ -5,11 +5,10 @@ #ifndef CHROME_BROWSER_UI_APP_LIST_APP_LIST_SERVICE_H_ #define CHROME_BROWSER_UI_APP_LIST_APP_LIST_SERVICE_H_ -#include <string> - #include "base/macros.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/app_list/app_list_controller_delegate.h" + +class Profile; +class AppListControllerDelegate; class AppListService { public:
diff --git a/chrome/browser/ui/app_list/app_list_service_impl.cc b/chrome/browser/ui/app_list/app_list_service_impl.cc index 8ecc0f0..4641b05d 100644 --- a/chrome/browser/ui/app_list/app_list_service_impl.cc +++ b/chrome/browser/ui/app_list/app_list_service_impl.cc
@@ -13,31 +13,15 @@ #include "ash/app_list/model/search/search_model.h" #include "ash/shell.h" #include "base/bind.h" -#include "base/command_line.h" -#include "base/files/file_path.h" -#include "base/location.h" #include "base/memory/singleton.h" -#include "base/metrics/histogram_macros.h" -#include "base/single_thread_task_runner.h" #include "base/strings/string16.h" -#include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" -#include "build/build_config.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/browser_shutdown.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/app_list_client_impl.h" #include "chrome/browser/ui/app_list/app_list_view_delegate.h" #include "chrome/browser/ui/ash/ash_util.h" #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" #include "chrome/browser/ui/ash/session_util.h" -#include "chrome/common/chrome_constants.h" -#include "chrome/common/pref_names.h" -#include "components/prefs/pref_service.h" -#include "ui/app_list/app_list_features.h" -#include "ui/app_list/app_list_switches.h" -#include "ui/display/display.h" -#include "ui/display/screen.h" // static AppListServiceImpl* AppListServiceImpl::GetInstance() { @@ -46,15 +30,7 @@ } AppListServiceImpl::AppListServiceImpl() - : command_line_(*base::CommandLine::ForCurrentProcess()), - local_state_(g_browser_process->local_state()), - weak_factory_(this) {} - -AppListServiceImpl::AppListServiceImpl(const base::CommandLine& command_line, - PrefService* local_state) - : command_line_(command_line), - local_state_(local_state), - weak_factory_(this) {} + : local_state_(g_browser_process->local_state()), weak_factory_(this) {} AppListServiceImpl::~AppListServiceImpl() = default;
diff --git a/chrome/browser/ui/app_list/app_list_service_impl.h b/chrome/browser/ui/app_list/app_list_service_impl.h index 7f72d58..f93794d 100644 --- a/chrome/browser/ui/app_list/app_list_service_impl.h +++ b/chrome/browser/ui/app_list/app_list_service_impl.h
@@ -9,8 +9,6 @@ #include <string> #include "ash/public/interfaces/app_list.mojom.h" -#include "base/command_line.h" -#include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/profiles/profile.h" @@ -30,10 +28,6 @@ struct DefaultSingletonTraits; } -namespace test { -class AppListServiceImplTestApi; -} - // An implementation of AppListService. class AppListServiceImpl : public AppListService { public: @@ -41,12 +35,6 @@ static AppListServiceImpl* GetInstance(); - // Constructor used for testing. - AppListServiceImpl(const base::CommandLine& command_line, - PrefService* local_state); - - // Lazily create the Chrome AppListViewDelegate and set it to the current user - // profile. AppListViewDelegate* GetViewDelegate(); void RecordAppListLaunch(); @@ -84,22 +72,12 @@ // it directly in non-mus+ash mode. app_list::SearchModel* GetSearchModelFromAsh(); - protected: - AppListServiceImpl(); - - // Perform startup checks shared between desktop implementations of the app - // list. Currently this checks command line flags to enable or disable the app - // list, and records UMA stats delayed from a previous Chrome process. - void PerformStartupChecks(); - private: - friend class test::AppListServiceImplTestApi; friend struct base::DefaultSingletonTraits<AppListServiceImpl>; - static void SendAppListStats(); + AppListServiceImpl(); std::string GetProfileName(); - base::CommandLine command_line_; PrefService* local_state_; std::unique_ptr<AppListViewDelegate> view_delegate_;
diff --git a/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc index 955856a8..68c7184 100644 --- a/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc +++ b/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc
@@ -10,7 +10,6 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/app_list/app_list_model_updater.h" #include "chrome/browser/ui/app_list/app_list_service.h" -#include "chrome/browser/ui/app_list/app_list_view_delegate.h" #include "chrome/browser/ui/app_list/chrome_app_list_item.h" #include "chrome/browser/ui/app_list/test/chrome_app_list_test_support.h" #include "chrome/browser/ui/browser.h" @@ -20,49 +19,8 @@ #include "extensions/common/constants.h" #include "ui/base/models/menu_model.h" -namespace test { - -// Test API to access private members of AppListServiceImpl. -class AppListServiceImplTestApi { - public: - explicit AppListServiceImplTestApi(AppListServiceImpl* impl) : impl_(impl) {} - - AppListViewDelegate* view_delegate() { return impl_->view_delegate_.get(); } - - private: - AppListServiceImpl* impl_; - - DISALLOW_COPY_AND_ASSIGN(AppListServiceImplTestApi); -}; - -} // namespace test - -// Browser Test for AppListServiceImpl that runs on all platforms supporting -// app_list. -class AppListServiceImplBrowserTest : public InProcessBrowserTest { - public: - AppListServiceImplBrowserTest() {} - - // Overridden from InProcessBrowserTest: - void SetUpOnMainThread() override { - service_ = test::GetAppListServiceImpl(); - test_api_.reset(new test::AppListServiceImplTestApi(service_)); - } - - protected: - AppListServiceImpl* service_; - std::unique_ptr<test::AppListServiceImplTestApi> test_api_; - - private: - DISALLOW_COPY_AND_ASSIGN(AppListServiceImplBrowserTest); -}; - -// Tests that the AppListViewDelegate is created lazily. -IN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest, CreatedLazily) { - EXPECT_FALSE(test_api_->view_delegate()); - service_->GetViewDelegate(); - EXPECT_TRUE(test_api_->view_delegate()); -} +// Browser Test for AppListServiceImpl. +using AppListServiceImplBrowserTest = InProcessBrowserTest; // Test that all the items in the context menu for a hosted app have valid // labels. @@ -71,7 +29,7 @@ EXPECT_TRUE(service); // Show the app list to ensure it has loaded a profile. - service_->Show(); + service->Show(); AppListModelUpdater* model_updater = test::GetModelUpdater(service); EXPECT_TRUE(model_updater);
diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h index d7b7174..babb4b4 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h +++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h
@@ -484,7 +484,6 @@ bool default_apps_ready_ = false; ArcDefaultAppList default_apps_; base::Closure default_apps_ready_callback_; - int current_batch_installation_revision_ = 0; // TODO (b/70566216): Remove this once fixed. base::OnceClosure app_list_refreshed_callback_;
diff --git a/chrome/browser/ui/app_list/search/mixer.cc b/chrome/browser/ui/app_list/search/mixer.cc index e439f3b..b1297c6e 100644 --- a/chrome/browser/ui/app_list/search/mixer.cc +++ b/chrome/browser/ui/app_list/search/mixer.cc
@@ -16,7 +16,6 @@ #include "base/memory/ptr_util.h" #include "chrome/browser/ui/app_list/app_list_model_updater.h" #include "chrome/browser/ui/app_list/search/search_provider.h" -#include "ui/app_list/app_list_features.h" namespace app_list { @@ -42,11 +41,7 @@ class Mixer::Group { public: Group(size_t max_results, double multiplier, double boost) - : max_results_(max_results), - multiplier_(multiplier), - boost_(boost), - is_fullscreen_app_list_enabled_( - features::IsFullscreenAppListEnabled()) {} + : max_results_(max_results), multiplier_(multiplier), boost_(boost) {} ~Group() {} void AddProvider(SearchProvider* provider) { @@ -65,39 +60,6 @@ const double relevance = std::min(std::max(result->relevance(), 0.0), 1.0); double boost = boost_; - - if (!is_fullscreen_app_list_enabled_) { - // Recommendations should not be affected by query-to-launch - // correlation from KnownResults as it causes recommendations to - // become dominated by previously clicked results. This happens - // because the recommendation query is the empty string and the - // clicked results get forever boosted. - if (result->display_type() != - ash::SearchResultDisplayType::kRecommendation) { - KnownResults::const_iterator known_it = - known_results.find(result->id()); - if (known_it != known_results.end()) { - switch (known_it->second) { - case PERFECT_PRIMARY: - boost = 4.0; - break; - case PREFIX_PRIMARY: - boost = 3.75; - break; - case PERFECT_SECONDARY: - boost = 3.25; - break; - case PREFIX_SECONDARY: - boost = 3.0; - break; - case UNKNOWN_RESULT: - NOTREACHED() << "Unknown result in KnownResults?"; - break; - } - } - } - } - results_.emplace_back(result.get(), relevance * multiplier_ + boost); } } @@ -115,8 +77,6 @@ const double multiplier_; const double boost_; - const bool is_fullscreen_app_list_enabled_; - Providers providers_; // Not owned. SortedResults results_;
diff --git a/chrome/browser/ui/app_list/search/tests/mixer_unittest.cc b/chrome/browser/ui/app_list/search/tests/mixer_unittest.cc index 39313dd..4e94edf97 100644 --- a/chrome/browser/ui/app_list/search/tests/mixer_unittest.cc +++ b/chrome/browser/ui/app_list/search/tests/mixer_unittest.cc
@@ -255,30 +255,6 @@ EXPECT_EQ("dup0,dup1,dup2", GetResults()); } -// Tests that "known results" have priority over others. -TEST_F(MixerTest, KnownResultsPriority) { - // TODO(newcomer): this test needs to be reevaluated for the fullscreen app - // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - - // This gives omnibox 0 -- 5. - omnibox_provider()->set_count(6); - - // omnibox 1 -- 4 are "known results". - AddKnownResult("omnibox1", PREFIX_SECONDARY); - AddKnownResult("omnibox2", PERFECT_SECONDARY); - AddKnownResult("omnibox3", PREFIX_PRIMARY); - AddKnownResult("omnibox4", PERFECT_PRIMARY); - - RunQuery(); - - // omnibox 1 -- 4 should be prioritised over the others. They should be - // ordered 4, 3, 2, 1 (in order of match quality). - EXPECT_EQ("omnibox4,omnibox3,omnibox2,omnibox1,omnibox0,omnibox5", - GetResults()); -} - // Tests that "known results" are not considered for recommendation results. TEST_F(MixerTest, KnownResultsIgnoredForRecommendations) { // This gives omnibox 0 -- 5. @@ -299,22 +275,5 @@ GetResults()); } -TEST_F(MixerTest, VoiceQuery) { - // TODO(newcomer): this test needs to be reevaluated for the fullscreen app - // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - - omnibox_provider()->set_count(3); - RunQuery(); - EXPECT_EQ("omnibox0,omnibox1,omnibox2", GetResults()); - - // Set "omnibox1" as a voice result. Do not expect any changes (as this is not - // a voice query). - omnibox_provider()->set_as_voice_result(1); - RunQuery(); - EXPECT_EQ("omnibox0,omnibox1,omnibox2", GetResults()); -} - } // namespace test } // namespace app_list
diff --git a/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc b/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc index ab823bfe..dc65d86 100644 --- a/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc +++ b/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc
@@ -35,7 +35,6 @@ #include "components/arc/arc_util.h" #include "components/arc/test/fake_app_instance.h" #include "content/public/test/browser_test_utils.h" -#include "ui/app_list/app_list_features.h" #include "ui/display/types/display_constants.h" #include "ui/events/event_constants.h" #include "ui/events/test/event_generator.h" @@ -75,8 +74,6 @@ constexpr char kTestShortcutName[] = "Test Shortcut"; constexpr char kTestShortcutName2[] = "Test Shortcut 2"; constexpr char kTestAppPackage[] = "test.arc.app.package"; -constexpr char kTestAppPackage2[] = "test.arc.app.package2"; -constexpr char kTestAppPackage3[] = "test.arc.app.package3"; constexpr char kTestAppActivity[] = "test.arc.app.package.activity"; constexpr char kTestAppActivity2[] = "test.arc.gitapp.package.activity2"; constexpr char kTestShelfGroup[] = "shelf_group"; @@ -487,52 +484,6 @@ EXPECT_FALSE(controller->GetItem(shelf_id2)); } -// This test validates that app list is shown on new package and not shown -// on package update. -IN_PROC_BROWSER_TEST_F(ArcAppLauncherBrowserTest, AppListShown) { - // TODO(newcomer): this test needs to be reevaluated for the fullscreen app - // list (http://crbug.com/759779). - if (app_list::features::IsFullscreenAppListEnabled()) - return; - - StartInstance(); - AppListService* app_list_service = AppListService::Get(); - ASSERT_TRUE(app_list_service); - - EXPECT_FALSE(app_list_service->IsAppListVisible()); - - SendInstallationStarted(kTestAppPackage); - SendInstallationStarted(kTestAppPackage2); - - // New package is available. Show app list. - SendInstallationFinished(kTestAppPackage, true); - InstallTestApps(kTestAppPackage, false); - SendPackageAdded(kTestAppPackage, true); - EXPECT_TRUE(app_list_service->IsAppListVisible()); - - app_list_service->DismissAppList(); - EXPECT_FALSE(app_list_service->IsAppListVisible()); - - // Send package update event. App list is not shown. - SendPackageAdded(kTestAppPackage, true); - EXPECT_FALSE(app_list_service->IsAppListVisible()); - - // Install next package from batch. Next new package is available. - // Don't show app list. - SendInstallationFinished(kTestAppPackage2, true); - InstallTestApps(kTestAppPackage2, false); - SendPackageAdded(kTestAppPackage2, true); - EXPECT_FALSE(app_list_service->IsAppListVisible()); - - // Run next installation batch. App list should be shown again. - SendInstallationStarted(kTestAppPackage3); - SendInstallationFinished(kTestAppPackage3, true); - InstallTestApps(kTestAppPackage3, false); - SendPackageAdded(kTestAppPackage3, true); - EXPECT_TRUE(app_list_service->IsAppListVisible()); - app_list_service->DismissAppList(); -} - // Test AppListControllerDelegate::IsAppOpen for ARC apps. IN_PROC_BROWSER_TEST_F(ArcAppLauncherBrowserTest, IsAppOpen) { StartInstance();
diff --git a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc index 33988ec..aab649a3 100644 --- a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc +++ b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc
@@ -19,13 +19,11 @@ #include "chrome/browser/ui/ash/launcher/arc_app_window_launcher_item_controller.h" #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" -#include "chrome/browser/ui/ash/tablet_mode_client.h" #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_util.h" #include "components/exo/shell_surface.h" #include "components/signin/core/account_id/account_id.h" #include "components/user_manager/user_manager.h" -#include "third_party/WebKit/public/platform/modules/screen_orientation/WebScreenOrientationLockType.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/env.h" #include "ui/base/base_window.h" @@ -37,11 +35,13 @@ constexpr size_t kMaxIconPngSize = 64 * 1024; // 64 kb -ash::OrientationLockType OrientationLockFromMojom( +ash::OrientationLockType OrientationLockTypeFromMojo( arc::mojom::OrientationLock orientation_lock) { - DCHECK_NE(arc::mojom::OrientationLock::CURRENT, orientation_lock); - switch (orientation_lock) { + case arc::mojom::OrientationLock::NONE: + return ash::OrientationLockType::kAny; + case arc::mojom::OrientationLock::CURRENT: + return ash::OrientationLockType::kCurrent; case arc::mojom::OrientationLock::PORTRAIT: return ash::OrientationLockType::kPortrait; case arc::mojom::OrientationLock::LANDSCAPE: @@ -54,9 +54,9 @@ return ash::OrientationLockType::kPortraitPrimary; case arc::mojom::OrientationLock::PORTRAIT_SECONDARY: return ash::OrientationLockType::kPortraitSecondary; - default: - return ash::OrientationLockType::kAny; } + NOTREACHED(); + return ash::OrientationLockType::kAny; } } // namespace @@ -106,16 +106,6 @@ return requested_orientation_lock_; } - void set_lock_completion_behavior( - ScreenOrientationController::LockCompletionBehavior lock_behavior) { - lock_completion_behavior_ = lock_behavior; - } - - ScreenOrientationController::LockCompletionBehavior lock_completion_behavior() - const { - return lock_completion_behavior_; - } - ArcAppWindow* app_window() { return app_window_.get(); } const std::string& launch_intent() { return launch_intent_; } @@ -129,13 +119,6 @@ const std::string launch_intent_; bool has_requested_orientation_lock_ = false; - // If true, the orientation should be locked to the specific - // orientation after the requested_orientation_lock is applied. - // This is meaningful only if the orientation is one of ::NONE, - // ::PORTRAIT or ::LANDSCAPE. - ScreenOrientationController::LockCompletionBehavior - lock_completion_behavior_ = - ScreenOrientationController::LockCompletionBehavior::None; arc::mojom::OrientationLock requested_orientation_lock_ = arc::mojom::OrientationLock::NONE; // Keeps overridden window title. @@ -149,7 +132,7 @@ ArcAppWindowLauncherController::ArcAppWindowLauncherController( ChromeLauncherController* owner) - : AppWindowLauncherController(owner), tablet_observer_(this) { + : AppWindowLauncherController(owner) { if (arc::IsArcAllowedForProfile(owner->profile())) { observed_profile_ = owner->profile(); StartObserving(observed_profile_); @@ -161,7 +144,6 @@ ArcAppWindowLauncherController::~ArcAppWindowLauncherController() { if (observed_profile_) StopObserving(observed_profile_); - tablet_observer_.RemoveAll(); if (arc::ArcSessionManager::Get()) arc::ArcSessionManager::Get()->RemoveObserver(this); } @@ -277,11 +259,6 @@ if (task_id <= 0) return; - TabletModeClient* tablet_mode_client = TabletModeClient::Get(); - - if (tablet_mode_client && !tablet_observer_.IsObserving(tablet_mode_client)) - tablet_observer_.Add(tablet_mode_client); - // Check if we have controller for this task. if (GetAppWindowForTask(task_id)) return; @@ -309,8 +286,7 @@ DCHECK(info->app_window()->controller()); const ash::ShelfID shelf_id(info->app_window()->shelf_id()); window->SetProperty(ash::kShelfIDKey, new std::string(shelf_id.Serialize())); - if (tablet_mode_client && tablet_mode_client->tablet_mode_enabled()) - SetOrientationLockForAppWindow(info->app_window()); + SetOrientationLockForAppWindow(info->app_window()); } void ArcAppWindowLauncherController::OnAppReadyChanged( @@ -410,24 +386,10 @@ if (!info) return; - if (orientation_lock == arc::mojom::OrientationLock::CURRENT) { - info->set_lock_completion_behavior( - ScreenOrientationController::LockCompletionBehavior::DisableSensor); - if (!info->has_requested_orientation_lock()) { - info->set_requested_orientation_lock(arc::mojom::OrientationLock::NONE); - } - } else { - info->set_requested_orientation_lock(orientation_lock); - info->set_lock_completion_behavior( - ScreenOrientationController::LockCompletionBehavior::None); - } - - TabletModeClient* tablet_mode_client = TabletModeClient::Get(); - if (tablet_mode_client && tablet_mode_client->tablet_mode_enabled()) { - ArcAppWindow* app_window = info->app_window(); - if (app_window) - SetOrientationLockForAppWindow(app_window); - } + info->set_requested_orientation_lock(orientation_lock); + ArcAppWindow* app_window = info->app_window(); + if (app_window) + SetOrientationLockForAppWindow(app_window); } void ArcAppWindowLauncherController::OnTaskSetActive(int32_t task_id) { @@ -526,21 +488,6 @@ OnTaskSetActive(active_task_id_); } -void ArcAppWindowLauncherController::OnTabletModeToggled(bool enabled) { - if (enabled) { - for (auto& it : task_id_to_app_window_info_) { - ArcAppWindow* app_window = it.second->app_window(); - if (app_window) - SetOrientationLockForAppWindow(app_window); - } - } else { - ash::ScreenOrientationController* orientation_controller = - ash::Shell::Get()->screen_orientation_controller(); - // Don't unlock one by one because it'll switch to next rotation. - orientation_controller->UnlockAll(); - } -} - void ArcAppWindowLauncherController::StartObserving(Profile* profile) { aura::Env* env = aura::Env::GetInstanceDontCreate(); if (env) @@ -637,31 +584,20 @@ if (!window) return; AppWindowInfo* info = GetAppWindowInfoForTask(app_window->task_id()); - arc::mojom::OrientationLock orientation_lock; - - ScreenOrientationController::LockCompletionBehavior lock_completion_behavior = - ScreenOrientationController::LockCompletionBehavior::None; + ash::Shell* shell = ash::Shell::Get(); if (info->has_requested_orientation_lock()) { - orientation_lock = info->requested_orientation_lock(); - lock_completion_behavior = info->lock_completion_behavior(); + shell->screen_orientation_controller()->LockOrientationForWindow( + window, + OrientationLockTypeFromMojo(info->requested_orientation_lock())); } else { ArcAppListPrefs* prefs = ArcAppListPrefs::Get(observed_profile_); std::unique_ptr<ArcAppListPrefs::AppInfo> app_info = prefs->GetApp(info->app_shelf_id().app_id()); if (!app_info) return; - orientation_lock = app_info->orientation_lock; - if (orientation_lock == arc::mojom::OrientationLock::CURRENT) { - orientation_lock = arc::mojom::OrientationLock::NONE; - lock_completion_behavior = - ScreenOrientationController::LockCompletionBehavior::DisableSensor; - } + shell->screen_orientation_controller()->LockOrientationForWindow( + window, OrientationLockTypeFromMojo(app_info->orientation_lock)); } - - ash::Shell* shell = ash::Shell::Get(); - shell->screen_orientation_controller()->LockOrientationForWindow( - window, OrientationLockFromMojom(orientation_lock), - lock_completion_behavior); } // static
diff --git a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h index 4faba73..ce204e5 100644 --- a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h +++ b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h
@@ -16,8 +16,6 @@ #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h" #include "chrome/browser/ui/ash/launcher/arc_app_shelf_id.h" -#include "chrome/browser/ui/ash/tablet_mode_client.h" -#include "chrome/browser/ui/ash/tablet_mode_client_observer.h" #include "mojo/public/cpp/bindings/binding.h" #include "ui/aura/env_observer.h" #include "ui/aura/window_observer.h" @@ -35,7 +33,6 @@ class ArcAppWindowLauncherController : public AppWindowLauncherController, public aura::EnvObserver, public aura::WindowObserver, - public TabletModeClientObserver, public ArcAppListPrefs::Observer, public arc::ArcSessionManager::Observer { public: @@ -61,9 +58,6 @@ aura::Window* gained_active, aura::Window* lost_active) override; - // TabletModeClient: - void OnTabletModeToggled(bool enabled) override; - // ArcAppListPrefs::Observer: void OnAppReadyChanged(const std::string& app_id, bool ready) override; void OnAppRemoved(const std::string& app_id) override; @@ -126,7 +120,6 @@ ShelfGroupToAppControllerMap app_shelf_group_to_controller_map_; std::vector<aura::Window*> observed_windows_; Profile* observed_profile_ = nullptr; - ScopedObserver<TabletModeClient, TabletModeClientObserver> tablet_observer_; // The time when the ARC OptIn management check was started. This happens // right after user agrees the ToS or in some cases for managed user when ARC
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc index 2a193c98..ddd9694 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -50,7 +50,6 @@ #include "chrome/browser/ui/app_list/arc/arc_default_app_list.h" #include "chrome/browser/ui/apps/chrome_app_delegate.h" #include "chrome/browser/ui/ash/chrome_launcher_prefs.h" -#include "chrome/browser/ui/ash/fake_tablet_mode_controller.h" #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h" #include "chrome/browser/ui/ash/launcher/arc_app_deferred_launcher_controller.h" #include "chrome/browser/ui/ash/launcher/arc_app_window.h" @@ -63,7 +62,6 @@ #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h" #include "chrome/browser/ui/ash/session_controller_client.h" -#include "chrome/browser/ui/ash/tablet_mode_client.h" #include "chrome/browser/ui/ash/test_wallpaper_controller.h" #include "chrome/browser/ui/ash/wallpaper_controller_client.h" #include "chrome/browser/ui/browser.h" @@ -388,10 +386,6 @@ model_ = std::make_unique<ash::ShelfModel>(); model_->AddObserver(model_observer_.get()); - tablet_mode_client_ = std::make_unique<TabletModeClient>(); - tablet_mode_client_->InitForTesting( - fake_tablet_mode_controller_.CreateInterfacePtr()); - base::DictionaryValue manifest; manifest.SetString(extensions::manifest_keys::kName, "launcher controller test extension"); @@ -916,7 +910,10 @@ } void EnableTabletMode(bool enable) { - TabletModeClient::Get()->OnTabletModeToggled(enable); + // TODO(oshima|xutan): Remove this once orientation code is moved to + // exo. https://crbug.com/823634. + ash::Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager( + enable); } void ValidateArcState(bool arc_enabled, @@ -1005,9 +1002,6 @@ std::unique_ptr<TestShelfModelObserver> model_observer_; std::unique_ptr<ash::ShelfModel> model_; - FakeTabletModeController fake_tablet_mode_controller_; - std::unique_ptr<TabletModeClient> tablet_mode_client_; - // |item_delegate_manager_| owns |test_controller_|. ash::ShelfItemDelegate* test_controller_ = nullptr;
diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc index e9f33ea1..88a0bcf 100644 --- a/chrome/browser/ui/browser_ui_prefs.cc +++ b/chrome/browser/ui/browser_ui_prefs.cc
@@ -4,9 +4,11 @@ #include "chrome/browser/ui/browser_ui_prefs.h" +#include "base/numerics/safe_conversions.h" #include "build/build_config.h" #include "chrome/browser/first_run/first_run.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/upgrade_detector.h" #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_registry_simple.h" @@ -40,8 +42,11 @@ #if !defined(OS_CHROMEOS) registry->RegisterIntegerPref(prefs::kRelaunchNotification, 0); #endif // !defined(OS_CHROMEOS) - registry->RegisterIntegerPref(prefs::kRelaunchNotificationPeriod, - 7 * 24 * 60 * 60 * 1000); // 1 week. + registry->RegisterIntegerPref( + prefs::kRelaunchNotificationPeriod, + base::saturated_cast<int>( + UpgradeDetector::GetDefaultHighAnnoyanceThreshold() + .InMilliseconds())); #endif // !defined(OS_ANDROID) }
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc index 0e1bec5..7443df08 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -672,7 +672,8 @@ GURL url = web_contents->GetURL(); std::unique_ptr<base::Value> value = map->GetWebsiteSetting(url, url, content_type(), std::string(), &info); - ContentSetting setting = content_settings::ValueToContentSetting(value.get()); + ContentSetting setting = PluginUtils::GetFlashPluginContentSetting( + map, url::Origin::Create(url), url, nullptr); // If the setting is not managed by the user, hide the "Manage" button. if (info.source != SETTING_SOURCE_USER)
diff --git a/chrome/browser/ui/omnibox/omnibox_theme.cc b/chrome/browser/ui/omnibox/omnibox_theme.cc index b8f4d05..fef75ec 100644 --- a/chrome/browser/ui/omnibox/omnibox_theme.cc +++ b/chrome/browser/ui/omnibox/omnibox_theme.cc
@@ -30,6 +30,7 @@ T selected, T hovered_and_selected) { const T args[] = {normal, hovered, selected, hovered_and_selected}; + DCHECK_LT(static_cast<size_t>(state), arraysize(args)); return args[static_cast<size_t>(state)]; } @@ -40,45 +41,65 @@ T selected) { // Use selected if state is HOVERED_AND_SELECTED. const T args[] = {normal, hovered, selected, selected}; + DCHECK_LT(static_cast<size_t>(state), arraysize(args)); return args[static_cast<size_t>(state)]; } -ui::NativeTheme::ColorId GetLegacyColorId(OmniboxPart part, +ui::NativeTheme::ColorId GetLegacyColorId(ui::NativeTheme* native_theme, + OmniboxPart part, OmniboxPartState state) { using NativeId = ui::NativeTheme::ColorId; switch (part) { + case OmniboxPart::LOCATION_BAR_BACKGROUND: + return NativeId::kColorId_TextfieldDefaultBackground; + case OmniboxPart::LOCATION_BAR_CLEAR_ALL: + return NativeId::kColorId_TextfieldDefaultColor; + case OmniboxPart::LOCATION_BAR_IME_AUTOCOMPLETE_BACKGROUND: + return NativeId::kColorId_TextfieldSelectionBackgroundFocused; + case OmniboxPart::LOCATION_BAR_IME_AUTOCOMPLETE_TEXT: + return NativeId::kColorId_TextfieldSelectionColor; + case OmniboxPart::LOCATION_BAR_SELECTED_KEYWORD: + return color_utils::IsDark(native_theme->GetSystemColor( + NativeId::kColorId_TextfieldDefaultBackground)) + ? NativeId::kColorId_TextfieldDefaultColor + : NativeId::kColorId_LinkEnabled; + case OmniboxPart::LOCATION_BAR_TEXT_DEFAULT: + return NativeId::kColorId_TextfieldDefaultColor; case OmniboxPart::RESULTS_BACKGROUND: return NormalHoveredSelected( state, NativeId::kColorId_ResultsTableNormalBackground, NativeId::kColorId_ResultsTableHoveredBackground, NativeId::kColorId_ResultsTableSelectedBackground); - case OmniboxPart::TEXT_DEFAULT: + case OmniboxPart::RESULTS_TEXT_DEFAULT: return NormalHoveredSelected(state, NativeId::kColorId_ResultsTableNormalText, NativeId::kColorId_ResultsTableHoveredText, NativeId::kColorId_ResultsTableSelectedText); - case OmniboxPart::TEXT_DIMMED: + case OmniboxPart::RESULTS_TEXT_DIMMED: return NormalHoveredSelected( state, NativeId::kColorId_ResultsTableNormalDimmedText, NativeId::kColorId_ResultsTableHoveredDimmedText, NativeId::kColorId_ResultsTableSelectedDimmedText); - case OmniboxPart::TEXT_NEGATIVE: + case OmniboxPart::RESULTS_TEXT_NEGATIVE: return NormalHoveredSelected( state, NativeId::kColorId_ResultsTableNegativeText, NativeId::kColorId_ResultsTableNegativeHoveredText, NativeId::kColorId_ResultsTableNegativeSelectedText); - case OmniboxPart::TEXT_POSITIVE: + case OmniboxPart::RESULTS_TEXT_POSITIVE: return NormalHoveredSelected( state, NativeId::kColorId_ResultsTablePositiveText, NativeId::kColorId_ResultsTablePositiveHoveredText, NativeId::kColorId_ResultsTablePositiveSelectedText); - case OmniboxPart::TEXT_URL: + case OmniboxPart::RESULTS_TEXT_URL: return NormalHoveredSelected(state, NativeId::kColorId_ResultsTableNormalUrl, NativeId::kColorId_ResultsTableHoveredUrl, NativeId::kColorId_ResultsTableSelectedUrl); - case OmniboxPart::TEXT_INVISIBLE: + case OmniboxPart::LOCATION_BAR_SECURITY_CHIP: + case OmniboxPart::LOCATION_BAR_TEXT_DIMMED: + case OmniboxPart::RESULTS_ICON: + case OmniboxPart::RESULTS_TEXT_INVISIBLE: case OmniboxPart::RESULTS_SEPARATOR: NOTREACHED(); break; @@ -88,9 +109,68 @@ SkColor GetLegacyColor(OmniboxPart part, OmniboxTint tint, + OmniboxPartState state); + +SkColor GetLegacySecurityChipColor(OmniboxTint tint, OmniboxPartState state) { + SkColor background_color = + GetLegacyColor(OmniboxPart::LOCATION_BAR_BACKGROUND, tint, state); + const bool is_dark = color_utils::IsDark(background_color); + + SkColor chip_color = gfx::kPlaceholderColor; + switch (state) { + case OmniboxPartState::CHIP_DEFAULT: + chip_color = color_utils::DeriveDefaultIconColor( + GetLegacyColor(OmniboxPart::LOCATION_BAR_TEXT_DEFAULT, tint, state)); + break; + case OmniboxPartState::CHIP_SECURE: + chip_color = is_dark ? SK_ColorWHITE : gfx::kGoogleGreen700; + break; + case OmniboxPartState::CHIP_DANGEROUS: + chip_color = is_dark ? SK_ColorWHITE : gfx::kGoogleRed700; + break; + default: + NOTREACHED(); + } + + return color_utils::GetReadableColor(chip_color, background_color); +} + +SkColor GetLegacyResultsIconColor(OmniboxTint tint, OmniboxPartState state) { + SkColor color = + GetLegacyColor(OmniboxPart::RESULTS_TEXT_DEFAULT, tint, state); + + // Selected rows have the same icon color as text color. + switch (state) { + case OmniboxPartState::NORMAL: + case OmniboxPartState::HOVERED: + return color_utils::DeriveDefaultIconColor(color); + case OmniboxPartState::SELECTED: + case OmniboxPartState::HOVERED_AND_SELECTED: + return color; + default: + NOTREACHED(); + } + return gfx::kPlaceholderColor; +} + +SkColor GetLegacyColor(OmniboxPart part, + OmniboxTint tint, OmniboxPartState state) { - if (part == OmniboxPart::TEXT_INVISIBLE) - return SK_ColorTRANSPARENT; + switch (part) { + case OmniboxPart::LOCATION_BAR_SECURITY_CHIP: + return GetLegacySecurityChipColor(tint, state); + case OmniboxPart::LOCATION_BAR_TEXT_DIMMED: + return color_utils::AlphaBlend( + GetLegacyColor(OmniboxPart::LOCATION_BAR_TEXT_DEFAULT, tint, state), + GetLegacyColor(OmniboxPart::LOCATION_BAR_BACKGROUND, tint, state), + 128); + case OmniboxPart::RESULTS_ICON: + return GetLegacyResultsIconColor(tint, state); + case OmniboxPart::RESULTS_TEXT_INVISIBLE: + return SK_ColorTRANSPARENT; + default: + break; + } ui::NativeTheme* native_theme = nullptr; #if defined(USE_AURA) @@ -105,7 +185,9 @@ if (!native_theme) native_theme = ui::NativeTheme::GetInstanceForNativeUi(); - ui::NativeTheme::ColorId color_id = GetLegacyColorId(part, state); + ui::NativeTheme::ColorId color_id = + GetLegacyColorId(native_theme, part, state); + return color_id == kInvalidColorId ? gfx::kPlaceholderColor : native_theme->GetSystemColor(color_id); } @@ -136,12 +218,21 @@ : SkColorSetA(gfx::kGoogleGrey900, 0x24); // 14% alpha. // TODO(tapted): Add these. - case OmniboxPart::TEXT_DEFAULT: - case OmniboxPart::TEXT_DIMMED: - case OmniboxPart::TEXT_INVISIBLE: - case OmniboxPart::TEXT_NEGATIVE: - case OmniboxPart::TEXT_POSITIVE: - case OmniboxPart::TEXT_URL: + case OmniboxPart::LOCATION_BAR_BACKGROUND: + case OmniboxPart::LOCATION_BAR_CLEAR_ALL: + case OmniboxPart::LOCATION_BAR_IME_AUTOCOMPLETE_BACKGROUND: + case OmniboxPart::LOCATION_BAR_IME_AUTOCOMPLETE_TEXT: + case OmniboxPart::LOCATION_BAR_SECURITY_CHIP: + case OmniboxPart::LOCATION_BAR_SELECTED_KEYWORD: + case OmniboxPart::LOCATION_BAR_TEXT_DEFAULT: + case OmniboxPart::LOCATION_BAR_TEXT_DIMMED: + case OmniboxPart::RESULTS_ICON: + case OmniboxPart::RESULTS_TEXT_DEFAULT: + case OmniboxPart::RESULTS_TEXT_DIMMED: + case OmniboxPart::RESULTS_TEXT_INVISIBLE: + case OmniboxPart::RESULTS_TEXT_NEGATIVE: + case OmniboxPart::RESULTS_TEXT_POSITIVE: + case OmniboxPart::RESULTS_TEXT_URL: return GetLegacyColor(part, tint, state); } return gfx::kPlaceholderColor;
diff --git a/chrome/browser/ui/omnibox/omnibox_theme.h b/chrome/browser/ui/omnibox/omnibox_theme.h index 8d18e96..1c1682d9 100644 --- a/chrome/browser/ui/omnibox/omnibox_theme.h +++ b/chrome/browser/ui/omnibox/omnibox_theme.h
@@ -9,16 +9,24 @@ // A part of the omnibox (location bar, location bar decoration, or dropdown). enum class OmniboxPart { - RESULTS_BACKGROUND, // Background of the results dropdown. - RESULTS_SEPARATOR, // Separator between the input row and the results rows. + LOCATION_BAR_BACKGROUND, + LOCATION_BAR_CLEAR_ALL, + LOCATION_BAR_IME_AUTOCOMPLETE_BACKGROUND, + LOCATION_BAR_IME_AUTOCOMPLETE_TEXT, + LOCATION_BAR_SECURITY_CHIP, + LOCATION_BAR_SELECTED_KEYWORD, + LOCATION_BAR_TEXT_DEFAULT, + LOCATION_BAR_TEXT_DIMMED, - // Text styles. - TEXT_DEFAULT, - TEXT_DIMMED, - TEXT_INVISIBLE, - TEXT_NEGATIVE, - TEXT_POSITIVE, - TEXT_URL, + RESULTS_BACKGROUND, // Background of the results dropdown. + RESULTS_ICON, + RESULTS_SEPARATOR, // Separator between the input row and the results rows. + RESULTS_TEXT_DEFAULT, + RESULTS_TEXT_DIMMED, + RESULTS_TEXT_INVISIBLE, + RESULTS_TEXT_NEGATIVE, + RESULTS_TEXT_POSITIVE, + RESULTS_TEXT_URL, }; // The tint of the omnibox theme. E.g. Incognito may use a DARK tint. NATIVE is @@ -26,7 +34,17 @@ enum class OmniboxTint { DARK, LIGHT, NATIVE }; // An optional state for a given |OmniboxPart|. -enum class OmniboxPartState { NORMAL, HOVERED, SELECTED, HOVERED_AND_SELECTED }; +enum class OmniboxPartState { + NORMAL, + HOVERED, + SELECTED, + HOVERED_AND_SELECTED, + + // Applicable to LOCATION_BAR_SECURITY_CHIP only. + CHIP_DEFAULT, + CHIP_DANGEROUS, + CHIP_SECURE +}; // Returns the color for the given |part| and |tint|. An optional |state| can be // provided for OmniboxParts that support stateful colors.
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index ebafb10..5734f1c8 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -86,15 +86,12 @@ #include "ui/events/event.h" #include "ui/gfx/animation/slide_animation.h" #include "ui/gfx/canvas.h" -#include "ui/gfx/color_palette.h" -#include "ui/gfx/color_utils.h" #include "ui/gfx/image/image.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/scoped_canvas.h" #include "ui/gfx/skia_util.h" #include "ui/gfx/text_utils.h" -#include "ui/native_theme/native_theme.h" #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/button_drag_utils.h" @@ -142,16 +139,6 @@ return OmniboxTint::LIGHT; } -// Returns the color of the security chip if the security level is secure. -SkColor SecurityChipSecureColor(bool in_dark_mode) { - return in_dark_mode ? SK_ColorWHITE : gfx::kGoogleGreen700; -} - -// Returns the color of the security chip if the security level is dangerous. -SkColor SecurityChipDangerousColor(bool in_dark_mode) { - return in_dark_mode ? SK_ColorWHITE : gfx::kGoogleRed700; -} - } // namespace // LocationBarView ----------------------------------------------------------- @@ -219,7 +206,8 @@ GetLayoutConstant(LOCATION_BAR_BUBBLE_FONT_VERTICAL_PADDING); const int bubble_height = location_height - (bubble_padding * 2); - const SkColor background_color = GetColor(BACKGROUND); + const SkColor background_color = + GetColor(OmniboxPart::LOCATION_BAR_BACKGROUND); location_icon_view_ = new LocationIconView(font_list, this); location_icon_view_->set_drag_controller(this); AddChildView(location_icon_view_); @@ -237,23 +225,21 @@ new views::Label(base::string16(), {font_list}); ime_inline_autocomplete_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); ime_inline_autocomplete_view_->SetAutoColorReadabilityEnabled(false); - ime_inline_autocomplete_view_->SetBackground( - views::CreateSolidBackground(GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused))); + ime_inline_autocomplete_view_->SetBackground(views::CreateSolidBackground( + GetColor(OmniboxPart::LOCATION_BAR_IME_AUTOCOMPLETE_BACKGROUND))); ime_inline_autocomplete_view_->SetEnabledColor( - GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_TextfieldSelectionColor)); + GetColor(OmniboxPart::LOCATION_BAR_IME_AUTOCOMPLETE_TEXT)); ime_inline_autocomplete_view_->SetVisible(false); AddChildView(ime_inline_autocomplete_view_); - selected_keyword_view_ = new SelectedKeywordView(font_list, profile()); + selected_keyword_view_ = new SelectedKeywordView(this, font_list, profile()); AddChildView(selected_keyword_view_); gfx::FontList bubble_font_list = font_list.DeriveWithHeightUpperBound(bubble_height); keyword_hint_view_ = new KeywordHintView( this, profile(), font_list, bubble_font_list, - GetColor(LocationBarView::DEEMPHASIZED_TEXT), background_color); + GetColor(OmniboxPart::LOCATION_BAR_TEXT_DIMMED), background_color); AddChildView(keyword_hint_view_); std::vector<std::unique_ptr<ContentSettingImageModel>> models = @@ -316,30 +302,8 @@ return omnibox_view_ != nullptr; } -SkColor LocationBarView::GetColor( - ColorKind kind) const { - const ui::NativeTheme* native_theme = GetNativeTheme(); - switch (kind) { - case BACKGROUND: - return native_theme->GetSystemColor( - ui::NativeTheme::kColorId_TextfieldDefaultBackground); - - case TEXT: - return native_theme->GetSystemColor( - ui::NativeTheme::kColorId_TextfieldDefaultColor); - - case SELECTED_TEXT: - return native_theme->GetSystemColor( - ui::NativeTheme::kColorId_TextfieldSelectionColor); - - case DEEMPHASIZED_TEXT: - return color_utils::AlphaBlend(GetColor(TEXT), GetColor(BACKGROUND), 128); - - case SECURITY_CHIP_TEXT: - return GetSecurityChipColor(GetToolbarModel()->GetSecurityLevel(false)); - } - NOTREACHED(); - return gfx::kPlaceholderColor; +SkColor LocationBarView::GetColor(OmniboxPart part) const { + return GetOmniboxColor(part, tint()); } SkColor LocationBarView::GetOpaqueBorderColor(bool incognito) const { @@ -352,18 +316,18 @@ security_state::SecurityLevel security_level) const { // Only used in ChromeOS. if (security_level == security_state::SECURE_WITH_POLICY_INSTALLED_CERT) - return GetColor(DEEMPHASIZED_TEXT); + return GetColor(OmniboxPart::LOCATION_BAR_TEXT_DIMMED); - SkColor chip_color = color_utils::DeriveDefaultIconColor(GetColor(TEXT)); - bool is_dark = color_utils::IsDark(GetColor(BACKGROUND)); + OmniboxPartState state = OmniboxPartState::CHIP_DEFAULT; if (security_level == security_state::EV_SECURE || security_level == security_state::SECURE) { - chip_color = SecurityChipSecureColor(is_dark); + state = OmniboxPartState::CHIP_SECURE; } else if (security_level == security_state::DANGEROUS) { - chip_color = SecurityChipDangerousColor(is_dark); + state = OmniboxPartState::CHIP_DANGEROUS; } - return color_utils::GetReadableColor(chip_color, GetColor(BACKGROUND)); + return GetOmniboxColor(OmniboxPart::LOCATION_BAR_SECURITY_CHIP, tint(), + state); } void LocationBarView::ZoomChangedForActiveTab(bool can_show_bubble) { @@ -657,12 +621,13 @@ RefreshLocationIcon(); RefreshClearAllButtonIcon(); if (is_popup_mode_) { - SetBackground(views::CreateSolidBackground(GetColor(BACKGROUND))); + SetBackground(views::CreateSolidBackground( + GetColor(OmniboxPart::LOCATION_BAR_BACKGROUND))); } else { // This border color will be blended on top of the toolbar (which may use an // image in the case of themes). SetBackground(std::make_unique<BackgroundWith1PxBorder>( - GetColor(BACKGROUND), GetBorderColor())); + GetColor(OmniboxPart::LOCATION_BAR_BACKGROUND), GetBorderColor())); } SchedulePaint(); } @@ -878,8 +843,7 @@ const gfx::VectorIcon& icon = InTouchableMode() ? omnibox::kTouchableClearIcon : kTabCloseNormalIcon; SetImageFromVectorIcon(clear_all_button_, icon, - GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_TextfieldDefaultColor)); + GetColor(OmniboxPart::LOCATION_BAR_CLEAR_ALL)); } base::string16 LocationBarView::GetLocationIconText() const {
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.h b/chrome/browser/ui/views/location_bar/location_bar_view.h index 7d8a0e2..c8726fa4 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.h +++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -40,6 +40,7 @@ class KeywordHintView; class LocationIconView; class ManagePasswordsIconViews; +enum class OmniboxPart; enum class OmniboxTint; class Profile; class SelectedKeywordView; @@ -92,14 +93,6 @@ virtual ~Delegate() {} }; - enum ColorKind { - BACKGROUND = 0, - TEXT, - SELECTED_TEXT, - DEEMPHASIZED_TEXT, - SECURITY_CHIP_TEXT, - }; - // The location bar view's class name. static const char kViewClassName[]; @@ -118,9 +111,8 @@ // be called when the receiving instance is attached to a view container. bool IsInitialized() const; - // Returns the appropriate color for the desired kind, based on the user's - // system theme. - SkColor GetColor(ColorKind kind) const; + // Helper to get the color for |part| using the current tint(). + SkColor GetColor(OmniboxPart part) const; // Returns the location bar border color blended with the toolbar color. // It's guaranteed to be opaque.
diff --git a/chrome/browser/ui/views/location_bar/location_icon_view.cc b/chrome/browser/ui/views/location_bar/location_icon_view.cc index 0e9451c..f63f17d 100644 --- a/chrome/browser/ui/views/location_bar/location_icon_view.cc +++ b/chrome/browser/ui/views/location_bar/location_icon_view.cc
@@ -67,7 +67,8 @@ } SkColor LocationIconView::GetTextColor() const { - return location_bar_->GetColor(LocationBarView::SECURITY_CHIP_TEXT); + return location_bar_->GetSecurityChipColor( + location_bar_->GetToolbarModel()->GetSecurityLevel(false)); } bool LocationIconView::ShowBubble(const ui::Event& event) {
diff --git a/chrome/browser/ui/views/location_bar/selected_keyword_view.cc b/chrome/browser/ui/views/location_bar/selected_keyword_view.cc index f8972670..218c860 100644 --- a/chrome/browser/ui/views/location_bar/selected_keyword_view.cc +++ b/chrome/browser/ui/views/location_bar/selected_keyword_view.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/layout_constants.h" +#include "chrome/browser/ui/omnibox/omnibox_theme.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "chrome/grit/generated_resources.h" #include "components/search_engines/template_url_service.h" @@ -17,11 +18,13 @@ #include "ui/gfx/color_palette.h" #include "ui/gfx/color_utils.h" #include "ui/gfx/paint_vector_icon.h" -#include "ui/native_theme/native_theme.h" -SelectedKeywordView::SelectedKeywordView(const gfx::FontList& font_list, +SelectedKeywordView::SelectedKeywordView(LocationBarView* location_bar, + const gfx::FontList& font_list, Profile* profile) - : IconLabelBubbleView(font_list), profile_(profile) { + : IconLabelBubbleView(font_list), + location_bar_(location_bar), + profile_(profile) { full_label_.SetFontList(font_list); full_label_.SetVisible(false); partial_label_.SetFontList(font_list); @@ -39,10 +42,7 @@ } SkColor SelectedKeywordView::GetTextColor() const { - return GetNativeTheme()->GetSystemColor( - color_utils::IsDark(GetParentBackgroundColor()) - ? ui::NativeTheme::kColorId_TextfieldDefaultColor - : ui::NativeTheme::kColorId_LinkEnabled); + return location_bar_->GetColor(OmniboxPart::LOCATION_BAR_SELECTED_KEYWORD); } gfx::Size SelectedKeywordView::CalculatePreferredSize() const {
diff --git a/chrome/browser/ui/views/location_bar/selected_keyword_view.h b/chrome/browser/ui/views/location_bar/selected_keyword_view.h index 4cf52ab9..776aedd 100644 --- a/chrome/browser/ui/views/location_bar/selected_keyword_view.h +++ b/chrome/browser/ui/views/location_bar/selected_keyword_view.h
@@ -12,6 +12,7 @@ #include "chrome/browser/ui/views/location_bar/icon_label_bubble_view.h" #include "ui/views/controls/label.h" +class LocationBarView; class Profile; namespace gfx { class FontList; @@ -21,7 +22,8 @@ // SelectedKeywordView displays the tab-to-search UI in the location bar view. class SelectedKeywordView : public IconLabelBubbleView { public: - SelectedKeywordView(const gfx::FontList& font_list, + SelectedKeywordView(LocationBarView* location_bar, + const gfx::FontList& font_list, Profile* profile); ~SelectedKeywordView() override; @@ -47,6 +49,8 @@ // IconLabelBubbleView: const char* GetClassName() const override; + LocationBarView* location_bar_; + // The keyword we're showing. If empty, no keyword is selected. // NOTE: we don't cache the TemplateURL as it is possible for it to get // deleted out from under us.
diff --git a/chrome/browser/ui/views/media_router/app_menu_test_api.h b/chrome/browser/ui/views/media_router/app_menu_test_api.h new file mode 100644 index 0000000..f3bf14f7 --- /dev/null +++ b/chrome/browser/ui/views/media_router/app_menu_test_api.h
@@ -0,0 +1,38 @@ +// 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_VIEWS_MEDIA_ROUTER_APP_MENU_TEST_API_H_ +#define CHROME_BROWSER_UI_VIEWS_MEDIA_ROUTER_APP_MENU_TEST_API_H_ + +#include <memory> + +#include "build/build_config.h" + +class Browser; + +namespace test { + +class AppMenuTestApi { + public: + static std::unique_ptr<AppMenuTestApi> Create(Browser* browser); + +#if defined(OS_MACOSX) + static std::unique_ptr<AppMenuTestApi> CreateCocoa(Browser* browser); +#endif + + AppMenuTestApi() = default; + virtual ~AppMenuTestApi() = default; + + // Note: This is not a general-purpose API for testing the app menu; + // ShowMenu() and IsMenuShowing() may not *actually* show the menu or return + // its true status. ExecuteCommand() may not dispatch commands the same way + // the real menu would. + virtual bool IsMenuShowing() = 0; + virtual void ShowMenu() = 0; + virtual void ExecuteCommand(int command) = 0; +}; + +} // namespace test + +#endif // CHROME_BROWSER_UI_VIEWS_MEDIA_ROUTER_APP_MENU_TEST_API_H_
diff --git a/chrome/browser/ui/views/media_router/app_menu_test_api_cocoa.mm b/chrome/browser/ui/views/media_router/app_menu_test_api_cocoa.mm new file mode 100644 index 0000000..0f03c08 --- /dev/null +++ b/chrome/browser/ui/views/media_router/app_menu_test_api_cocoa.mm
@@ -0,0 +1,97 @@ +// 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/views/media_router/app_menu_test_api.h" + +#import <Cocoa/Cocoa.h> + +#include "base/macros.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_window.h" +#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h" +#import "chrome/browser/ui/cocoa/browser_window_controller.h" +#include "chrome/browser/ui/cocoa/test/run_loop_testing.h" +#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" +#include "ui/base/ui_features.h" + +namespace { + +class AppMenuTestApiCocoa : public test::AppMenuTestApi { + public: + explicit AppMenuTestApiCocoa(Browser* browser); + ~AppMenuTestApiCocoa() override; + + // AppMenuTestApi: + bool IsMenuShowing() override; + void ShowMenu() override; + void ExecuteCommand(int command) override; + + private: + AppMenuController* GetAppMenuController(); + NSButton* GetAppMenuButton(); + ToolbarController* GetToolbarController(); + + bool menu_showing_ = false; + Browser* browser_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(AppMenuTestApiCocoa); +}; + +AppMenuTestApiCocoa::AppMenuTestApiCocoa(Browser* browser) + : browser_(browser) {} +AppMenuTestApiCocoa::~AppMenuTestApiCocoa() {} + +bool AppMenuTestApiCocoa::IsMenuShowing() { + return menu_showing_; +} + +// Note: this class fakes the state of the app menu. In principle, the body +// should be something like this: +// return [GetAppMenuButton() performClick:nil]; +// but doing that starts a nested run loop for the menu, which hangs the rest of +// the test. Instead, keep track of whether the menu is supposed to be showing +// or not. This class can't *actually* show the real menu because of +// https://crbug.com/823495. +// TODO(ellyjones): Use the real menu here. +void AppMenuTestApiCocoa::ShowMenu() { + menu_showing_ = true; +} + +void AppMenuTestApiCocoa::ExecuteCommand(int command) { + menu_showing_ = false; + base::scoped_nsobject<NSButton> button([[NSButton alloc] init]); + [button setTag:command]; + [GetAppMenuController() dispatchAppMenuCommand:button.get()]; + chrome::testing::NSRunLoopRunAllPending(); +} + +AppMenuController* AppMenuTestApiCocoa::GetAppMenuController() { + return [GetToolbarController() appMenuController]; +} + +NSButton* AppMenuTestApiCocoa::GetAppMenuButton() { + return [GetToolbarController() appMenuButton]; +} + +ToolbarController* AppMenuTestApiCocoa::GetToolbarController() { + NSWindow* window = browser_->window()->GetNativeWindow(); + BrowserWindowController* bwc = + [BrowserWindowController browserWindowControllerForWindow:window]; + return [bwc toolbarController]; +} + +} // namespace + +namespace test { + +std::unique_ptr<AppMenuTestApi> AppMenuTestApi::CreateCocoa(Browser* browser) { + return std::make_unique<AppMenuTestApiCocoa>(browser); +} + +#if !BUILDFLAG(MAC_VIEWS_BROWSER) +std::unique_ptr<AppMenuTestApi> AppMenuTestApi::Create(Browser* browser) { + return std::make_unique<AppMenuTestApiCocoa>(browser); +} +#endif // !MAC_VIEWS_BROWSER +}
diff --git a/chrome/browser/ui/views/media_router/app_menu_test_api_views.cc b/chrome/browser/ui/views/media_router/app_menu_test_api_views.cc new file mode 100644 index 0000000..3ea16dd --- /dev/null +++ b/chrome/browser/ui/views/media_router/app_menu_test_api_views.cc
@@ -0,0 +1,76 @@ +// 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/views/media_router/app_menu_test_api.h" + +#include "base/macros.h" +#include "build/build_config.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/toolbar/app_menu.h" +#include "chrome/browser/ui/views/toolbar/app_menu_button.h" +#include "chrome/browser/ui/views/toolbar/toolbar_view.h" +#include "chrome/browser/ui/views_mode_controller.h" + +namespace { + +class AppMenuTestApiViews : public test::AppMenuTestApi { + public: + explicit AppMenuTestApiViews(Browser* browser); + ~AppMenuTestApiViews() override; + + // AppMenuTestApi: + bool IsMenuShowing() override; + void ShowMenu() override; + void ExecuteCommand(int command) override; + + private: + AppMenuButton* GetAppMenuButton(); + AppMenu* GetAppMenu(); + + Browser* browser_; + + DISALLOW_COPY_AND_ASSIGN(AppMenuTestApiViews); +}; + +AppMenuTestApiViews::AppMenuTestApiViews(Browser* browser) + : browser_(browser) {} +AppMenuTestApiViews::~AppMenuTestApiViews() {} + +bool AppMenuTestApiViews::IsMenuShowing() { + return GetAppMenuButton()->IsMenuShowing(); +} + +void AppMenuTestApiViews::ShowMenu() { + GetAppMenuButton()->ShowMenu(false); +} + +void AppMenuTestApiViews::ExecuteCommand(int command) { + // TODO(ellyjones): This doesn't behave properly for nested menus. + GetAppMenu()->ExecuteCommand(command, 0); +} + +AppMenuButton* AppMenuTestApiViews::GetAppMenuButton() { + return BrowserView::GetBrowserViewForBrowser(browser_) + ->toolbar() + ->app_menu_button(); +} + +AppMenu* AppMenuTestApiViews::GetAppMenu() { + return GetAppMenuButton()->app_menu_for_testing(); +} + +} // namespace + +namespace test { + +std::unique_ptr<AppMenuTestApi> AppMenuTestApi::Create(Browser* browser) { +#if defined(OS_MACOSX) + if (views_mode_controller::IsViewsBrowserCocoa()) + return AppMenuTestApi::CreateCocoa(browser); +#endif + return std::make_unique<AppMenuTestApiViews>(browser); +} + +} // namespace test
diff --git a/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc b/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc index 0152bc6..129f6712 100644 --- a/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc +++ b/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
@@ -3,25 +3,21 @@ // found in the LICENSE file. #include "base/bind.h" -#include "base/run_loop.h" #include "base/threading/thread_task_runner_handle.h" +#include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/extensions/browser_action_test_util.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h" #include "chrome/browser/ui/toolbar/media_router_action.h" #include "chrome/browser/ui/toolbar/media_router_action_controller.h" #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h" -#include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/browser/ui/views/toolbar/app_menu.h" -#include "chrome/browser/ui/views/toolbar/app_menu_button.h" -#include "chrome/browser/ui/views/toolbar/browser_actions_container.h" -#include "chrome/browser/ui/views/toolbar/toolbar_action_view.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" +#include "chrome/browser/ui/views/media_router/app_menu_test_api.h" #include "chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h" #include "chrome/browser/ui/webui/media_router/media_router_ui_service.h" #include "chrome/common/url_constants.h" @@ -50,12 +46,8 @@ ~MediaRouterUIBrowserTest() override {} void SetUpOnMainThread() override { - BrowserActionsContainer* browser_actions_container = - BrowserView::GetBrowserViewForBrowser(browser()) - ->toolbar() - ->browser_actions(); - ASSERT_TRUE(browser_actions_container); - toolbar_actions_bar_ = browser_actions_container->toolbar_actions_bar(); + toolbar_actions_bar_ = + BrowserActionTestUtil::Create(browser(), true)->GetToolbarActionsBar(); action_controller_ = MediaRouterUIService::Get(browser()->profile())->action_controller(); @@ -68,21 +60,19 @@ content::TestNavigationObserver nav_observer(NULL); nav_observer.StartWatchingNewWebContents(); - AppMenuButton* app_menu_button = GetAppMenuButton(); - // When the Media Router Action executes, it opens a dialog with web // contents to chrome://media-router. base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&MediaRouterUIBrowserTest::ExecuteMediaRouterAction, - base::Unretained(this), app_menu_button)); + base::Unretained(this))); - base::RunLoop run_loop; - app_menu_button->ShowMenu(false); - run_loop.RunUntilIdle(); + std::unique_ptr<test::AppMenuTestApi> test_api = + test::AppMenuTestApi::Create(browser()); + test_api->ShowMenu(); nav_observer.Wait(); - EXPECT_FALSE(app_menu_button->IsMenuShowing()); + EXPECT_FALSE(test_api->IsMenuShowing()); ASSERT_EQ(chrome::kChromeUIMediaRouterURL, nav_observer.last_navigation_url().spec()); nav_observer.StopWatchingNewWebContents(); @@ -99,8 +89,8 @@ GetMediaRouterAction()->GetContextMenu()); } - void ExecuteMediaRouterAction(AppMenuButton* app_menu_button) { - EXPECT_TRUE(app_menu_button->IsMenuShowing()); + void ExecuteMediaRouterAction() { + EXPECT_TRUE(test::AppMenuTestApi::Create(browser())->IsMenuShowing()); GetMediaRouterAction()->ExecuteAction(true); } @@ -115,12 +105,6 @@ always_show); } - AppMenuButton* GetAppMenuButton() { - return BrowserView::GetBrowserViewForBrowser(browser()) - ->toolbar() - ->app_menu_button(); - } - // Sets the old preference to show the toolbar action icon to |always_show|, // and migrates the preference. void MigrateToolbarIconPref(bool always_show) { @@ -144,8 +128,10 @@ MediaRouterActionController* action_controller_ = nullptr; }; -#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) +#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || \ + defined(OS_MACOSX) // Flaky on chromeos, linux, win: https://crbug.com/658005 +// Flaky on MacViews: https://crbug.com/817408 #define MAYBE_OpenDialogWithMediaRouterAction \ DISABLED_OpenDialogWithMediaRouterAction #else @@ -214,22 +200,20 @@ // Start with one tab showing about:blank. ASSERT_EQ(1, browser()->tab_strip_model()->count()); - AppMenuButton* menu_button = GetAppMenuButton(); - base::RunLoop run_loop; - menu_button->ShowMenu(false); - run_loop.RunUntilIdle(); + std::unique_ptr<test::AppMenuTestApi> app_menu_test_api = + test::AppMenuTestApi::Create(browser()); + app_menu_test_api->ShowMenu(); MediaRouterDialogController* dialog_controller = MediaRouterDialogController::GetOrCreateForWebContents( browser()->tab_strip_model()->GetActiveWebContents()); - AppMenu* menu = menu_button->app_menu_for_testing(); ASSERT_FALSE(dialog_controller->IsShowingMediaRouterDialog()); - menu->ExecuteCommand(IDC_ROUTE_MEDIA, 0); + app_menu_test_api->ExecuteCommand(IDC_ROUTE_MEDIA); EXPECT_TRUE(dialog_controller->IsShowingMediaRouterDialog()); // Executing the command again should be a no-op, and there should only be one // dialog opened per tab. - menu->ExecuteCommand(IDC_ROUTE_MEDIA, 0); + app_menu_test_api->ExecuteCommand(IDC_ROUTE_MEDIA); EXPECT_TRUE(dialog_controller->IsShowingMediaRouterDialog()); dialog_controller->HideMediaRouterDialog(); EXPECT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc index 95796ce..0c4c9c8 100644 --- a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc +++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/media_router/presentation_receiver_window_view.h" #include "base/logging.h" +#include "base/macros.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/content_settings/mixed_content_settings_tab_helper.h" #include "chrome/browser/content_settings/tab_specific_content_settings.h" @@ -35,8 +36,95 @@ #include "ui/views/layout/box_layout.h" #include "ui/views/widget/widget.h" +#if defined(OS_CHROMEOS) +#include "ash/public/cpp/window_properties.h" +#include "ash/public/interfaces/window_state_type.mojom.h" +#include "ui/aura/window.h" +#include "ui/aura/window_observer.h" +#include "ui/gfx/native_widget_types.h" +#endif + using content::WebContents; +#if defined(OS_CHROMEOS) +// Observes the NativeWindow hosting the receiver view to look for fullscreen +// state changes. This helps monitor fullscreen changes that don't go through +// the normal key accelerator to display and hide the location bar. +class PresentationReceiverWindowView::FullscreenWindowObserver final + : public aura::WindowObserver { + public: + explicit FullscreenWindowObserver( + PresentationReceiverWindowView* presentation_receiver_window_view); + ~FullscreenWindowObserver() final; + + private: + // aura::WindowObserver overrides. + void OnWindowPropertyChanged(aura::Window* window, + const void* key, + intptr_t old) final; + void OnWindowDestroying(aura::Window* window) final; + + PresentationReceiverWindowView* const presentation_receiver_window_view_; + + DISALLOW_COPY_AND_ASSIGN(FullscreenWindowObserver); +}; + +PresentationReceiverWindowView::FullscreenWindowObserver:: + FullscreenWindowObserver( + PresentationReceiverWindowView* presentation_receiver_window_view) + : presentation_receiver_window_view_(presentation_receiver_window_view) { + DCHECK(presentation_receiver_window_view); + DCHECK(presentation_receiver_window_view->GetWidget()); + DCHECK(presentation_receiver_window_view->GetWidget()->GetNativeWindow()); + presentation_receiver_window_view_->GetWidget() + ->GetNativeWindow() + ->AddObserver(this); +} + +PresentationReceiverWindowView::FullscreenWindowObserver:: + ~FullscreenWindowObserver() = default; + +void PresentationReceiverWindowView::FullscreenWindowObserver:: + OnWindowPropertyChanged(aura::Window* window, + const void* key, + intptr_t old) { + DCHECK(presentation_receiver_window_view_->GetWidget()); + DCHECK(window == + presentation_receiver_window_view_->GetWidget()->GetNativeWindow()); + if (key == ash::kWindowStateTypeKey) { + ash::mojom::WindowStateType new_state = + window->GetProperty(ash::kWindowStateTypeKey); + ash::mojom::WindowStateType old_state( + static_cast<ash::mojom::WindowStateType>(old)); + + // Toggle fullscreen when the user toggles fullscreen without going through + // FullscreenController::ToggleBrowserFullscreenMode(). This is the case if + // the user uses a hardware window state toggle button. + if (new_state != ash::mojom::WindowStateType::FULLSCREEN && + new_state != ash::mojom::WindowStateType::PINNED && + new_state != ash::mojom::WindowStateType::TRUSTED_PINNED && + new_state != ash::mojom::WindowStateType::MINIMIZED && + old_state == ash::mojom::WindowStateType::FULLSCREEN) { + presentation_receiver_window_view_->ExitFullscreen(); + } else if (new_state == ash::mojom::WindowStateType::FULLSCREEN && + old_state != ash::mojom::WindowStateType::PINNED && + old_state != ash::mojom::WindowStateType::TRUSTED_PINNED) { + presentation_receiver_window_view_->EnterFullscreen(); + } + } +} + +void PresentationReceiverWindowView::FullscreenWindowObserver:: + OnWindowDestroying(aura::Window* window) { + DCHECK(presentation_receiver_window_view_->GetWidget()); + DCHECK(window == + presentation_receiver_window_view_->GetWidget()->GetNativeWindow()); + presentation_receiver_window_view_->GetWidget() + ->GetNativeWindow() + ->RemoveObserver(this); +} +#endif + PresentationReceiverWindowView::PresentationReceiverWindowView( PresentationReceiverWindowFrame* frame, PresentationReceiverWindowDelegate* delegate) @@ -107,6 +195,10 @@ box->SetFlexForView(web_view, 1); location_bar_view_->Init(); + +#if defined(OS_CHROMEOS) + window_observer_ = std::make_unique<FullscreenWindowObserver>(this); +#endif } void PresentationReceiverWindowView::Close() { @@ -209,8 +301,7 @@ void PresentationReceiverWindowView::EnterFullscreen( const GURL& url, ExclusiveAccessBubbleType bubble_type) { - location_bar_view_->SetVisible(false); - frame_->SetFullscreen(true); + EnterFullscreen(); UpdateExclusiveAccessExitBubbleContent(url, bubble_type, ExclusiveAccessBubbleHideCallback()); } @@ -308,3 +399,8 @@ *accelerator = fullscreen_accelerator_; return true; } + +void PresentationReceiverWindowView::EnterFullscreen() { + location_bar_view_->SetVisible(false); + frame_->SetFullscreen(true); +}
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.h b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.h index b9d80d2..316f3ab 100644 --- a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.h +++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/strings/string16.h" +#include "build/build_config.h" #include "chrome/browser/command_updater_delegate.h" #include "chrome/browser/command_updater_impl.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" @@ -43,6 +44,8 @@ void Init(); + LocationBarView* location_bar_view() { return location_bar_view_; } + private: // PresentationReceiverWindow overrides. void Close() final; @@ -108,6 +111,8 @@ bool GetAcceleratorForCommandId(int command_id, ui::Accelerator* accelerator) const final; + void EnterFullscreen(); + PresentationReceiverWindowFrame* const frame_; PresentationReceiverWindowDelegate* const delegate_; base::string16 title_; @@ -118,6 +123,11 @@ ui::Accelerator fullscreen_accelerator_; std::unique_ptr<ExclusiveAccessBubbleViews> exclusive_access_bubble_; +#if defined(OS_CHROMEOS) + class FullscreenWindowObserver; + std::unique_ptr<FullscreenWindowObserver> window_observer_; +#endif + DISALLOW_COPY_AND_ASSIGN(PresentationReceiverWindowView); };
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_view_chromeos_browsertest.cc b/chrome/browser/ui/views/media_router/presentation_receiver_window_view_chromeos_browsertest.cc new file mode 100644 index 0000000..d376ab4 --- /dev/null +++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_view_chromeos_browsertest.cc
@@ -0,0 +1,183 @@ +// 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/views/media_router/presentation_receiver_window_view.h" + +#include "ash/public/cpp/window_properties.h" +#include "ash/public/interfaces/window_state_type.mojom.h" +#include "base/callback.h" +#include "base/macros.h" +#include "base/run_loop.h" +#include "build/build_config.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/media_router/presentation_receiver_window_delegate.h" +#include "chrome/browser/ui/views/location_bar/location_bar_view.h" +#include "chrome/browser/ui/views/location_bar/location_icon_view.h" +#include "chrome/browser/ui/views/media_router/presentation_receiver_window_frame.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "content/public/browser/web_contents.h" +#include "ui/aura/client/aura_constants.h" +#include "ui/aura/window.h" +#include "ui/base/ui_base_types.h" +#include "ui/events/event.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/native_widget_types.h" +#include "ui/views/widget/widget.h" + +namespace { + +using content::WebContents; + +// Provides a WebContents for the PresentationReceiverWindowView to display and +// a window-close callback for the test to cleanly close the view. +class FakeReceiverDelegate final : public PresentationReceiverWindowDelegate { + public: + explicit FakeReceiverDelegate(Profile* profile) + : web_contents_(WebContents::Create(WebContents::CreateParams(profile))) { + } + + void set_window_closed_callback(base::OnceClosure callback) { + closed_callback_ = std::move(callback); + } + + // PresentationReceiverWindowDelegate overrides. + void WindowClosed() final { + if (closed_callback_) { + std::move(closed_callback_).Run(); + } + } + content::WebContents* web_contents() const final { + return web_contents_.get(); + } + + private: + std::unique_ptr<content::WebContents> web_contents_; + base::OnceClosure closed_callback_; + + DISALLOW_COPY_AND_ASSIGN(FakeReceiverDelegate); +}; + +class PresentationReceiverWindowViewBrowserTest : public InProcessBrowserTest { + protected: + PresentationReceiverWindowViewBrowserTest() = default; + + PresentationReceiverWindowView* CreateReceiverWindowView( + PresentationReceiverWindowDelegate* delegate, + const gfx::Rect& bounds) { + auto* frame = + new PresentationReceiverWindowFrame(Profile::FromBrowserContext( + delegate->web_contents()->GetBrowserContext())); + auto view = + std::make_unique<PresentationReceiverWindowView>(frame, delegate); + auto* view_raw = view.get(); + frame->InitReceiverFrame(std::move(view), bounds); + view_raw->Init(); + return view_raw; + } + + DISALLOW_COPY_AND_ASSIGN(PresentationReceiverWindowViewBrowserTest); +}; + +IN_PROC_BROWSER_TEST_F(PresentationReceiverWindowViewBrowserTest, + ChromeOSHardwareFullscreenButton) { + auto fake_delegate = + std::make_unique<FakeReceiverDelegate>(browser()->profile()); + const gfx::Rect bounds(100, 100); + auto* receiver_view = CreateReceiverWindowView(fake_delegate.get(), bounds); + static_cast<PresentationReceiverWindow*>(receiver_view) + ->ShowInactiveFullscreen(); + ASSERT_TRUE( + static_cast<ExclusiveAccessContext*>(receiver_view)->IsFullscreen()); + EXPECT_FALSE(receiver_view->location_bar_view()->visible()); + // Bypass ExclusiveAccessContext and default accelerator to simulate hardware + // window state button, which sets the native aura window to a "normal" state. + + // This class checks the receiver view's fullscreen state when it's native + // aura::Window's bounds change. It calls |fullscreen_callback| when the + // desired fullscreen state is seen, set via |await_type|. It automatically + // registers and unregisters itself as an observer of the receiver view's + // aura::Window. This is necessary because Mus only schedules the fullscreen + // change during SetProperty and because the fullscreen change takes place in + // another process, we can't simply call base::RunLoop().RunUntilIdle(). + class FullscreenWaiter final : public aura::WindowObserver { + public: + enum class AwaitType { + kOutOfFullscreen, + kIntoFullscreen, + }; + + FullscreenWaiter(PresentationReceiverWindowView* receiver_view, + AwaitType await_type, + base::OnceClosure fullscreen_callback) + : receiver_view_(receiver_view), + await_type_(await_type), + fullscreen_callback_(std::move(fullscreen_callback)) { + static_cast<views::View*>(receiver_view_) + ->GetWidget() + ->GetNativeWindow() + ->AddObserver(this); + } + ~FullscreenWaiter() final { + static_cast<views::View*>(receiver_view_) + ->GetWidget() + ->GetNativeWindow() + ->RemoveObserver(this); + } + + private: + // aura::WindowObserver overrides. + void OnWindowBoundsChanged(aura::Window* window, + const gfx::Rect& old_bounds, + const gfx::Rect& new_bounds, + ui::PropertyChangeReason reason) final { + DCHECK(fullscreen_callback_); + if (static_cast<ExclusiveAccessContext*>(receiver_view_) + ->IsFullscreen() == (await_type_ == AwaitType::kIntoFullscreen)) { + std::move(fullscreen_callback_).Run(); + } + } + + PresentationReceiverWindowView* const receiver_view_; + const AwaitType await_type_; + base::OnceClosure fullscreen_callback_; + + DISALLOW_COPY_AND_ASSIGN(FullscreenWaiter); + }; + auto* native_window = + static_cast<views::View*>(receiver_view)->GetWidget()->GetNativeWindow(); + { + base::RunLoop fullscreen_loop; + FullscreenWaiter waiter(receiver_view, + FullscreenWaiter::AwaitType::kOutOfFullscreen, + fullscreen_loop.QuitClosure()); + native_window->SetProperty(aura::client::kShowStateKey, + ui::SHOW_STATE_NORMAL); + fullscreen_loop.Run(); + ASSERT_FALSE( + static_cast<ExclusiveAccessContext*>(receiver_view)->IsFullscreen()); + EXPECT_TRUE(receiver_view->location_bar_view()->visible()); + } + + // Back to fullscreen with the hardware button. + { + base::RunLoop fullscreen_loop; + FullscreenWaiter waiter(receiver_view, + FullscreenWaiter::AwaitType::kIntoFullscreen, + fullscreen_loop.QuitClosure()); + native_window->SetProperty(aura::client::kShowStateKey, + ui::SHOW_STATE_FULLSCREEN); + fullscreen_loop.Run(); + ASSERT_TRUE( + static_cast<ExclusiveAccessContext*>(receiver_view)->IsFullscreen()); + EXPECT_FALSE(receiver_view->location_bar_view()->visible()); + } + + base::RunLoop run_loop; + fake_delegate->set_window_closed_callback(run_loop.QuitClosure()); + static_cast<PresentationReceiverWindow*>(receiver_view)->Close(); + run_loop.Run(); +} + +} // namespace
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc index 7f1e652..3bd163a 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -130,7 +130,7 @@ keyword_icon_view_->EnableCanvasFlippingForRTLUI(true); keyword_icon_view_->SetImage(gfx::CreateVectorIcon( omnibox::kKeywordSearchIcon, GetLayoutConstant(LOCATION_BAR_ICON_SIZE), - GetVectorIconColor())); + GetColor(OmniboxPart::RESULTS_ICON))); keyword_icon_view_->SizeToPreferredSize(); if (OmniboxFieldTrial::InTabSwitchSuggestionWithButtonTrial()) { @@ -192,7 +192,7 @@ icon_view_->SetImage(GetIcon().ToImageSkia()); keyword_icon_view_->SetImage(gfx::CreateVectorIcon( omnibox::kKeywordSearchIcon, GetLayoutConstant(LOCATION_BAR_ICON_SIZE), - GetVectorIconColor())); + GetColor(OmniboxPart::RESULTS_ICON))); if (match_.answer) { content_view_->SetText(match_.answer->first_line()); @@ -370,15 +370,7 @@ } gfx::Image OmniboxResultView::GetIcon() const { - return model_->GetMatchIcon(match_, GetVectorIconColor()); -} - -SkColor OmniboxResultView::GetVectorIconColor() const { - // For selected rows, paint the icon the same color as the text. - SkColor color = GetColor(OmniboxPart::TEXT_DEFAULT); - if (!IsSelected()) - color = color_utils::DeriveDefaultIconColor(color); - return color; + return model_->GetMatchIcon(match_, GetColor(OmniboxPart::RESULTS_ICON)); } bool OmniboxResultView::ShowOnlyKeywordMatch() const {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.h b/chrome/browser/ui/views/omnibox/omnibox_result_view.h index f4d6d27..e0116d63 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.h +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
@@ -89,8 +89,6 @@ gfx::Image GetIcon() const; - SkColor GetVectorIconColor() const; - // Whether to render only the keyword match. Returns true if |match_| has an // associated keyword match that has been animated so close to the start that // the keyword match will hide even the icon of the regular match.
diff --git a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc index 2ca1985..d260762f 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
@@ -43,32 +43,32 @@ TextStyle GetTextStyle(int type) { switch (type) { case SuggestionAnswer::TOP_ALIGNED: - return {ui::ResourceBundle::LargeFont, OmniboxPart::TEXT_DIMMED, + return {ui::ResourceBundle::LargeFont, OmniboxPart::RESULTS_TEXT_DIMMED, gfx::SUPERIOR}; case SuggestionAnswer::DESCRIPTION_NEGATIVE: - return {ui::ResourceBundle::LargeFont, OmniboxPart::TEXT_NEGATIVE, + return {ui::ResourceBundle::LargeFont, OmniboxPart::RESULTS_TEXT_NEGATIVE, gfx::INFERIOR}; case SuggestionAnswer::DESCRIPTION_POSITIVE: - return {ui::ResourceBundle::LargeFont, OmniboxPart::TEXT_POSITIVE, + return {ui::ResourceBundle::LargeFont, OmniboxPart::RESULTS_TEXT_POSITIVE, gfx::INFERIOR}; case SuggestionAnswer::PERSONALIZED_SUGGESTION: - return {ui::ResourceBundle::BaseFont, OmniboxPart::TEXT_DEFAULT, + return {ui::ResourceBundle::BaseFont, OmniboxPart::RESULTS_TEXT_DEFAULT, gfx::NORMAL_BASELINE}; case SuggestionAnswer::ANSWER_TEXT_MEDIUM: - return {ui::ResourceBundle::BaseFont, OmniboxPart::TEXT_DIMMED, + return {ui::ResourceBundle::BaseFont, OmniboxPart::RESULTS_TEXT_DIMMED, gfx::NORMAL_BASELINE}; case SuggestionAnswer::ANSWER_TEXT_LARGE: - return {ui::ResourceBundle::LargeFont, OmniboxPart::TEXT_DIMMED, + return {ui::ResourceBundle::LargeFont, OmniboxPart::RESULTS_TEXT_DIMMED, gfx::NORMAL_BASELINE}; case SuggestionAnswer::SUGGESTION_SECONDARY_TEXT_SMALL: - return {ui::ResourceBundle::LargeFont, OmniboxPart::TEXT_DIMMED, + return {ui::ResourceBundle::LargeFont, OmniboxPart::RESULTS_TEXT_DIMMED, gfx::INFERIOR}; case SuggestionAnswer::SUGGESTION_SECONDARY_TEXT_MEDIUM: - return {ui::ResourceBundle::BaseFont, OmniboxPart::TEXT_DIMMED, + return {ui::ResourceBundle::BaseFont, OmniboxPart::RESULTS_TEXT_DIMMED, gfx::NORMAL_BASELINE}; case SuggestionAnswer::SUGGESTION: // Fall through. default: - return {ui::ResourceBundle::BaseFont, OmniboxPart::TEXT_DEFAULT, + return {ui::ResourceBundle::BaseFont, OmniboxPart::RESULTS_TEXT_DEFAULT, gfx::NORMAL_BASELINE}; } } @@ -138,14 +138,14 @@ if (classifications[i].style & ACMatchClassification::MATCH) render_text->ApplyWeight(gfx::Font::Weight::BOLD, current_range); - OmniboxPart part = OmniboxPart::TEXT_DEFAULT; + OmniboxPart part = OmniboxPart::RESULTS_TEXT_DEFAULT; if (classifications[i].style & ACMatchClassification::URL) { - part = OmniboxPart::TEXT_URL; + part = OmniboxPart::RESULTS_TEXT_URL; render_text->SetDirectionalityMode(gfx::DIRECTIONALITY_AS_URL); } else if (classifications[i].style & ACMatchClassification::DIM) { - part = OmniboxPart::TEXT_DIMMED; + part = OmniboxPart::RESULTS_TEXT_DIMMED; } else if (classifications[i].style & ACMatchClassification::INVISIBLE) { - part = OmniboxPart::TEXT_INVISIBLE; + part = OmniboxPart::RESULTS_TEXT_INVISIBLE; } render_text->ApplyColor(result_view_->GetColor(part), current_range); } @@ -160,7 +160,8 @@ } void OmniboxTextView::Dim() { - render_text_->SetColor(result_view_->GetColor(OmniboxPart::TEXT_DIMMED)); + render_text_->SetColor( + result_view_->GetColor(OmniboxPart::RESULTS_TEXT_DIMMED)); } void OmniboxTextView::SetText(const base::string16& text,
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc index fe34b2cd..18a35fe 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -18,6 +18,7 @@ #include "chrome/browser/command_updater.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/omnibox/clipboard_utils.h" +#include "chrome/browser/ui/omnibox/omnibox_theme.h" #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" @@ -300,7 +301,7 @@ views::Textfield::OnNativeThemeChanged(theme); if (location_bar_view_) { SetBackgroundColor( - location_bar_view_->GetColor(LocationBarView::BACKGROUND)); + location_bar_view_->GetColor(OmniboxPart::LOCATION_BAR_BACKGROUND)); } EmphasizeURLComponents(); } @@ -636,7 +637,8 @@ void OmniboxViewViews::SetEmphasis(bool emphasize, const gfx::Range& range) { SkColor color = location_bar_view_->GetColor( - emphasize ? LocationBarView::TEXT : LocationBarView::DEEMPHASIZED_TEXT); + emphasize ? OmniboxPart::LOCATION_BAR_TEXT_DEFAULT + : OmniboxPart::LOCATION_BAR_TEXT_DIMMED); if (range.IsValid()) ApplyColor(color, range); else
diff --git a/chrome/browser/ui/views/passwords/password_dialog_view_browsertest.cc b/chrome/browser/ui/views/passwords/password_dialog_view_browsertest.cc index 1fa7f30..8bc8024 100644 --- a/chrome/browser/ui/views/passwords/password_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/passwords/password_dialog_view_browsertest.cc
@@ -8,6 +8,7 @@ #include "base/run_loop.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" @@ -26,6 +27,7 @@ #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" #include "testing/gmock/include/gmock/gmock.h" +#include "ui/base/ui_base_switches.h" #include "ui/views/test/widget_test.h" #include "ui/views/widget/widget.h" @@ -134,6 +136,13 @@ }; void PasswordDialogViewTest::SetUpOnMainThread() { +#if defined(OS_MACOSX) + // On non-Mac platforms, animations are globally disabled during tests; on + // Mac they are generally not, but these tests are dramatically slower and + // flakier with animations. + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisableModalAnimations); +#endif SetupTabWithTestController(browser()); }
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc index 66f7beb..3e0073a 100644 --- a/chrome/browser/ui/views/tabs/tab.cc +++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -330,10 +330,8 @@ color_id = ThemeProperties::COLOR_TAB_CLOSE_BUTTON_BACKGROUND_PRESSED; break; default: - color_id = - IsActive() - ? ThemeProperties::COLOR_TAB_CLOSE_BUTTON_BACKGROUND_ACTIVE - : ThemeProperties::COLOR_TAB_CLOSE_BUTTON_BACKGROUND_INACTIVE; + color_id = IsActive() ? ThemeProperties::COLOR_TAB_CLOSE_BUTTON_ACTIVE + : ThemeProperties::COLOR_TAB_CLOSE_BUTTON_INACTIVE; } return theme_provider->GetColor(color_id); }
diff --git a/chrome/browser/ui/views/tabs/tab_close_button.cc b/chrome/browser/ui/views/tabs/tab_close_button.cc index bd957b9..7c343a7d 100644 --- a/chrome/browser/ui/views/tabs/tab_close_button.cc +++ b/chrome/browser/ui/views/tabs/tab_close_button.cc
@@ -30,11 +30,10 @@ const gfx::VectorIcon& GetTouchIcon(views::Button::ButtonState state, bool is_incognito) { - if (!is_incognito) + if (state == views::Button::STATE_NORMAL) return kTabCloseButtonTouchIcon; - return state == views::Button::STATE_NORMAL - ? kTabCloseButtonTouchIncognitoIcon - : kTabCloseButtonTouchIncognitoHoveredPressedIcon; + return is_incognito ? kTabCloseButtonTouchIncognitoHoveredPressedIcon + : kTabCloseButtonTouchHoveredPressedIcon; } } // namespace
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc index 32fec27..b5bd828 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc
@@ -276,7 +276,8 @@ #else #define MAYBE_ToolbarCycleFocusWithBookmarkBar ToolbarCycleFocusWithBookmarkBar #endif -IN_PROC_BROWSER_TEST_F(ToolbarViewTest, ToolbarCycleFocusWithBookmarkBar) { +IN_PROC_BROWSER_TEST_F(ToolbarViewTest, + MAYBE_ToolbarCycleFocusWithBookmarkBar) { CommandUpdater* updater = browser()->command_controller(); updater->ExecuteCommand(IDC_SHOW_BOOKMARK_BAR);
diff --git a/chrome/browser/upgrade_detector.h b/chrome/browser/upgrade_detector.h index d9ddb3e..42cc9e3 100644 --- a/chrome/browser/upgrade_detector.h +++ b/chrome/browser/upgrade_detector.h
@@ -51,6 +51,10 @@ virtual ~UpgradeDetector(); + // Returns the default delta from upgrade detection until high annoyance is + // reached. + static base::TimeDelta GetDefaultHighAnnoyanceThreshold(); + static void RegisterPrefs(PrefRegistrySimple* registry); // Returns the time at which an available upgrade was detected.
diff --git a/chrome/browser/upgrade_detector_impl.cc b/chrome/browser/upgrade_detector_impl.cc index c44e055..15f8820 100644 --- a/chrome/browser/upgrade_detector_impl.cc +++ b/chrome/browser/upgrade_detector_impl.cc
@@ -43,6 +43,12 @@ namespace { +// The default thresholds for reaching annoyance levels. +constexpr base::TimeDelta kDefaultLowThreshold = base::TimeDelta::FromDays(2); +constexpr base::TimeDelta kDefaultElevatedThreshold = + base::TimeDelta::FromDays(4); +constexpr base::TimeDelta kDefaultHighThreshold = base::TimeDelta::FromDays(7); + // How long (in milliseconds) to wait (each cycle) before checking whether // Chrome's been upgraded behind our back. const int kCheckForUpgradeMs = 2 * 60 * 60 * 1000; // 2 hours. @@ -322,21 +328,26 @@ if (!low_threshold_.is_zero()) return; - // Intervals are drastically shortened when test switches are used. - const bool is_testing = IsTesting(); - const base::TimeDelta multiplier = is_testing - ? base::TimeDelta::FromSeconds(10) - : base::TimeDelta::FromDays(1); - high_threshold_ = 7 * multiplier; - elevated_threshold_ = 4 * multiplier; + // Start with the default values. + low_threshold_ = kDefaultLowThreshold; + elevated_threshold_ = kDefaultElevatedThreshold; + high_threshold_ = kDefaultHighThreshold; + // When testing, scale everything back so that a day passes in ten seconds. + const bool is_testing = IsTesting(); + if (is_testing) { + static constexpr int64_t scale_factor = + base::TimeDelta::FromDays(1) / base::TimeDelta::FromSeconds(10); + low_threshold_ /= scale_factor; + elevated_threshold_ /= scale_factor; + high_threshold_ /= scale_factor; + } + + // Canary and dev channels are extra special, and reach "low" annoyance after + // one hour (one second in testing) and never advance beyond that. if (is_unstable_channel_) { - // Canary and dev channels reach "low" annoyance after one hour (one second - // in testing) and never advance beyond that. low_threshold_ = is_testing ? base::TimeDelta::FromSeconds(1) : base::TimeDelta::FromHours(1); - } else { - low_threshold_ = 2 * multiplier; } } @@ -511,3 +522,8 @@ UpgradeDetector* UpgradeDetector::GetInstance() { return UpgradeDetectorImpl::GetInstance(); } + +// static +base::TimeDelta UpgradeDetector::GetDefaultHighAnnoyanceThreshold() { + return kDefaultHighThreshold; +}
diff --git a/chrome/browser/vr/DEPS b/chrome/browser/vr/DEPS index 62e96cd..fbf92ce 100644 --- a/chrome/browser/vr/DEPS +++ b/chrome/browser/vr/DEPS
@@ -3,4 +3,5 @@ "+cc/base", "+cc/test", "+cc/trees", + "+device/vr/openvr/test/fake_openvr_log.h" ]
diff --git a/chrome/browser/vr/browser_ui_interface.h b/chrome/browser/vr/browser_ui_interface.h index a2283c1..19edb8b8 100644 --- a/chrome/browser/vr/browser_ui_interface.h +++ b/chrome/browser/vr/browser_ui_interface.h
@@ -48,6 +48,7 @@ std::unique_ptr<Assets> assets, const base::Version& component_version) = 0; virtual void OnAssetsUnavailable() = 0; + virtual void SetIncognitoTabsOpen(bool open) = 0; // Web contents text input related. virtual void ShowSoftInput(bool show) = 0; @@ -55,14 +56,6 @@ int selection_end, int composition_start, int composition_end) = 0; - - // Tab handling. - virtual void AppendToTabList(bool incognito, - int id, - const base::string16& title) {} - virtual void FlushTabList() {} - virtual void UpdateTab(bool incognito, int id, const std::string& title) {} - virtual void RemoveTab(bool incognito, int id) {} }; } // namespace vr
diff --git a/chrome/browser/vr/elements/button.cc b/chrome/browser/vr/elements/button.cc index 7af73ba0..8f429f1a 100644 --- a/chrome/browser/vr/elements/button.cc +++ b/chrome/browser/vr/elements/button.cc
@@ -65,6 +65,11 @@ OnStateUpdated(); } +void Button::SetEnabled(bool enabled) { + enabled_ = enabled; + OnStateUpdated(); +} + void Button::HandleHoverEnter() { hovered_ = enabled_; OnStateUpdated();
diff --git a/chrome/browser/vr/elements/button.h b/chrome/browser/vr/elements/button.h index 3677443..00323faa 100644 --- a/chrome/browser/vr/elements/button.h +++ b/chrome/browser/vr/elements/button.h
@@ -35,8 +35,11 @@ Rect* background() const { return background_; } UiElement* hit_plane() const { return hit_plane_; } void SetButtonColors(const ButtonColors& colors); + void SetEnabled(bool enabled); - void set_enabled(bool enabled) { enabled_ = enabled; } + void set_click_handler(base::RepeatingCallback<void()> click_handler) { + click_handler_ = click_handler; + } // TODO(vollick): once all elements are scaled by a ScaledDepthAdjuster, we // will never have to change the button hover offset from the default and this
diff --git a/chrome/browser/vr/elements/button_unittest.cc b/chrome/browser/vr/elements/button_unittest.cc index 69e2c7b..b68ce02 100644 --- a/chrome/browser/vr/elements/button_unittest.cc +++ b/chrome/browser/vr/elements/button_unittest.cc
@@ -25,7 +25,7 @@ EXPECT_NE(xform.ToString(), button.hit_plane()->LocalTransform().ToString()); button.OnHoverLeave(); - button.set_enabled(false); + button.SetEnabled(false); button.OnHoverEnter(gfx::PointF(0.5f, 0.5f)); EXPECT_EQ(xform.ToString(), button.hit_plane()->LocalTransform().ToString()); button.OnHoverLeave();
diff --git a/chrome/browser/vr/elements/ui_element_name.cc b/chrome/browser/vr/elements/ui_element_name.cc index 9bba5cd..0c687d6 100644 --- a/chrome/browser/vr/elements/ui_element_name.cc +++ b/chrome/browser/vr/elements/ui_element_name.cc
@@ -60,6 +60,10 @@ "kOverflowMenuBackplane", "kOverflowMenu", "kOverflowMenuLayout", + "kOverflowMenuFordwardButton", + "kOverflowMenuReloadButton", + "kOverflowMenuCloseAllIncognitoTabsItem", + "kOverflowMenuNewIncognitoTabItem", "kOmniboxVisibiltyControlForVoice", "kOmniboxVisibilityControlForAudioPermissionPrompt", "kOmniboxDmmRoot",
diff --git a/chrome/browser/vr/elements/ui_element_name.h b/chrome/browser/vr/elements/ui_element_name.h index 14ad85219f..1548b8b 100644 --- a/chrome/browser/vr/elements/ui_element_name.h +++ b/chrome/browser/vr/elements/ui_element_name.h
@@ -59,6 +59,10 @@ kOverflowMenuBackplane, kOverflowMenu, kOverflowMenuLayout, + kOverflowMenuFordwardButton, + kOverflowMenuReloadButton, + kOverflowMenuCloseAllIncognitoTabsItem, + kOverflowMenuNewIncognitoTabItem, kOmniboxVisibiltyControlForVoice, kOmniboxVisibilityControlForAudioPermissionPrompt, kOmniboxDmmRoot,
diff --git a/chrome/browser/vr/model/model.h b/chrome/browser/vr/model/model.h index 96d7319..adc71a33 100644 --- a/chrome/browser/vr/model/model.h +++ b/chrome/browser/vr/model/model.h
@@ -33,6 +33,7 @@ bool incognito = false; bool in_cct = false; bool can_navigate_back = false; + bool can_navigate_forward = false; ToolbarState toolbar_state; std::vector<OmniboxSuggestion> omnibox_suggestions; SpeechRecognitionModel speech; @@ -50,6 +51,7 @@ bool supports_selection = true; bool needs_keyboard_update = false; bool overflow_menu_enabled = false; + bool incognito_tabs_open = false; // WebVR state. WebVrModel web_vr;
diff --git a/chrome/browser/vr/test/mock_browser_ui_interface.h b/chrome/browser/vr/test/mock_browser_ui_interface.h index f440ca75..4cd950f 100644 --- a/chrome/browser/vr/test/mock_browser_ui_interface.h +++ b/chrome/browser/vr/test/mock_browser_ui_interface.h
@@ -42,6 +42,7 @@ std::unique_ptr<Assets> assets, const base::Version& component_version) {} MOCK_METHOD0(OnAssetsUnavailable, void()); + MOCK_METHOD1(SetIncognitoTabsOpen, void(bool)); MOCK_METHOD1(ShowSoftInput, void(bool)); MOCK_METHOD4(UpdateWebInputIndices, void(int, int, int, int));
diff --git a/chrome/browser/vr/test/mock_ui_browser_interface.h b/chrome/browser/vr/test/mock_ui_browser_interface.h index 33ca3be9..0b5e8c64 100644 --- a/chrome/browser/vr/test/mock_ui_browser_interface.h +++ b/chrome/browser/vr/test/mock_ui_browser_interface.h
@@ -20,6 +20,10 @@ MOCK_METHOD0(ExitFullscreen, void()); MOCK_METHOD2(Navigate, void(GURL gurl, NavigationMethod method)); MOCK_METHOD0(NavigateBack, void()); + MOCK_METHOD0(NavigateForward, void()); + MOCK_METHOD0(ReloadTab, void()); + MOCK_METHOD1(OpenNewTab, void(bool)); + MOCK_METHOD0(CloseAllIncognitoTabs, void()); MOCK_METHOD0(ExitCct, void()); MOCK_METHOD0(CloseHostedDialog, void()); MOCK_METHOD1(OnUnsupportedMode, void(UiUnsupportedMode mode));
diff --git a/chrome/browser/vr/testapp/vr_test_context.cc b/chrome/browser/vr/testapp/vr_test_context.cc index f315467..74b7e26 100644 --- a/chrome/browser/vr/testapp/vr_test_context.cc +++ b/chrome/browser/vr/testapp/vr_test_context.cc
@@ -52,7 +52,7 @@ constexpr float kMinViewScaleFactor = 0.5f; constexpr float kMaxViewScaleFactor = 5.0f; constexpr float kViewScaleAdjustmentFactor = 0.2f; -constexpr float kPageLoadTimeMilliseconds = 500; +constexpr float kPageLoadTimeMilliseconds = 1000; constexpr gfx::Point3F kDefaultLaserOrigin = {0.5f, -0.5f, 0.f}; constexpr gfx::Vector3dF kLaserLocalOffset = {0.f, -0.0075f, -0.05f}; @@ -468,6 +468,31 @@ void VrTestContext::NavigateBack() { page_load_start_ = base::TimeTicks::Now(); + model_->can_navigate_back = false; + model_->can_navigate_forward = true; +} + +void VrTestContext::NavigateForward() { + page_load_start_ = base::TimeTicks::Now(); + model_->can_navigate_back = true; + model_->can_navigate_forward = false; +} + +void VrTestContext::ReloadTab() { + page_load_start_ = base::TimeTicks::Now(); +} + +void VrTestContext::OpenNewTab(bool incognito) { + DCHECK(incognito); + incognito_ = true; + ui_->SetIncognito(true); + model_->incognito_tabs_open = true; +} + +void VrTestContext::CloseAllIncognitoTabs() { + incognito_ = true; + ui_->SetIncognito(false); + model_->incognito_tabs_open = false; } void VrTestContext::ExitCct() {}
diff --git a/chrome/browser/vr/testapp/vr_test_context.h b/chrome/browser/vr/testapp/vr_test_context.h index 68db23f..6d5e6eb 100644 --- a/chrome/browser/vr/testapp/vr_test_context.h +++ b/chrome/browser/vr/testapp/vr_test_context.h
@@ -44,6 +44,10 @@ void ExitPresent() override; void ExitFullscreen() override; void NavigateBack() override; + void NavigateForward() override; + void ReloadTab() override; + void OpenNewTab(bool incognito) override; + void CloseAllIncognitoTabs() override; void ExitCct() override; void CloseHostedDialog() override; void OnUnsupportedMode(vr::UiUnsupportedMode mode) override;
diff --git a/chrome/browser/vr/ui.cc b/chrome/browser/vr/ui.cc index d69c3d40..5b30ff7c 100644 --- a/chrome/browser/vr/ui.cc +++ b/chrome/browser/vr/ui.cc
@@ -123,8 +123,8 @@ } void Ui::SetHistoryButtonsEnabled(bool can_go_back, bool can_go_forward) { - // We don't yet support forward navigation so we ignore this parameter. model_->can_navigate_back = can_go_back; + model_->can_navigate_forward = can_go_forward; } void Ui::SetVideoCaptureEnabled(bool enabled) { @@ -435,6 +435,10 @@ model_->waiting_for_background = false; } +void Ui::SetIncognitoTabsOpen(bool open) { + model_->incognito_tabs_open = open; +} + void Ui::ReinitializeForTest(const UiInitialState& ui_initial_state) { InitializeModel(ui_initial_state); }
diff --git a/chrome/browser/vr/ui.h b/chrome/browser/vr/ui.h index decd571..0b0e71d 100644 --- a/chrome/browser/vr/ui.h +++ b/chrome/browser/vr/ui.h
@@ -100,6 +100,7 @@ std::unique_ptr<Assets> assets, const base::Version& component_version) override; void OnAssetsUnavailable() override; + void SetIncognitoTabsOpen(bool open) override; // TODO(ymalik): We expose this to stop sending VSync to the WebVR page until // the splash screen has been visible for its minimum duration. The visibility
diff --git a/chrome/browser/vr/ui_browser_interface.h b/chrome/browser/vr/ui_browser_interface.h index fc6d59e..8b72d43 100644 --- a/chrome/browser/vr/ui_browser_interface.h +++ b/chrome/browser/vr/ui_browser_interface.h
@@ -30,6 +30,10 @@ virtual void ExitFullscreen() = 0; virtual void Navigate(GURL gurl, NavigationMethod method) = 0; virtual void NavigateBack() = 0; + virtual void NavigateForward() = 0; + virtual void ReloadTab() = 0; + virtual void OpenNewTab(bool incognito) = 0; + virtual void CloseAllIncognitoTabs() = 0; virtual void ExitCct() = 0; virtual void CloseHostedDialog() = 0; virtual void OnUnsupportedMode(UiUnsupportedMode mode) = 0;
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc index fd1175c48..68a1cfb 100644 --- a/chrome/browser/vr/ui_scene_creator.cc +++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -645,7 +645,6 @@ CreateSystemIndicators(); CreateUrlBar(); CreateOverflowMenu(); - CreateLoadingIndicator(); if (model_->update_ready_snackbar_enabled) { CreateSnackbars(); } @@ -1758,6 +1757,42 @@ VR_BIND_VISIBILITY(url_bar, !model->fullscreen_enabled()); scene_->AddUiElement(kUrlBarDmmRoot, std::move(url_bar)); + auto indicator_bg = std::make_unique<Rect>(); + indicator_bg->SetName(kLoadingIndicator); + indicator_bg->set_hit_testable(true); + indicator_bg->SetDrawPhase(kPhaseForeground); + indicator_bg->SetTranslate(0, kLoadingIndicatorVerticalOffsetDMM, 0); + indicator_bg->SetSize(kLoadingIndicatorWidthDMM, kLoadingIndicatorHeightDMM); + indicator_bg->set_y_anchoring(TOP); + indicator_bg->SetTransitionedProperties({OPACITY}); + indicator_bg->set_corner_radius(kLoadingIndicatorHeightDMM * 0.5f); + indicator_bg->set_contributes_to_parent_bounds(false); + VR_BIND_VISIBILITY(indicator_bg, model->loading); + VR_BIND_COLOR(model_, indicator_bg.get(), + &ColorScheme::loading_indicator_background, &Rect::SetColor); + + scene_->AddUiElement(kUrlBar, std::move(indicator_bg)); + + auto indicator_fg = std::make_unique<Rect>(); + indicator_fg->SetDrawPhase(kPhaseForeground); + indicator_fg->SetName(kLoadingIndicatorForeground); + indicator_fg->set_x_anchoring(LEFT); + indicator_fg->set_corner_radius(kLoadingIndicatorHeightDMM * 0.5f); + VR_BIND_COLOR(model_, indicator_fg.get(), + &ColorScheme::loading_indicator_foreground, &Rect::SetColor); + indicator_fg->AddBinding(std::make_unique<Binding<float>>( + VR_BIND_LAMBDA([](Model* m) { return m->load_progress; }, + base::Unretained(model_)), + VR_BIND_LAMBDA( + [](Rect* r, const float& value) { + r->SetSize(kLoadingIndicatorWidthDMM * value, + kLoadingIndicatorHeightDMM); + r->SetTranslate(kLoadingIndicatorWidthDMM * value * 0.5f, 0.0f, + 0.001f); + }, + base::Unretained(indicator_fg.get())))); + + scene_->AddUiElement(kLoadingIndicator, std::move(indicator_fg)); auto layout = Create<LinearLayout>(kUrlBarLayout, kPhaseNone, LinearLayout::kRight); layout->set_bounds_contain_children(true); @@ -1774,7 +1809,7 @@ back_button->SetSounds(CreateButtonSounds(), audio_delegate_); back_button->AddBinding(VR_BIND_FUNC(bool, Model, model_, model->can_navigate_back, Button, - back_button.get(), set_enabled)); + back_button.get(), SetEnabled)); VR_BIND_BUTTON_COLORS(model_, back_button.get(), &ColorScheme::back_button, &Button::SetButtonColors); scene_->AddUiElement(kUrlBarLayout, std::move(back_button)); @@ -1886,10 +1921,7 @@ overflow_icon->SetSize(kUrlBarButtonIconSizeDMM, kUrlBarButtonIconSizeDMM); overflow_icon->SetTranslate(-kUrlBarEndButtonIconOffsetDMM, 0, 0); overflow_icon->AddBinding(VR_BIND_FUNC( - SkColor, Model, model_, - model->can_navigate_back - ? model->color_scheme().button_colors.foreground - : model->color_scheme().button_colors.foreground_disabled, + SkColor, Model, model_, model->color_scheme().element_foreground, VectorIcon, overflow_icon.get(), SetColor)); scene_->AddUiElement(kUrlBarOverflowButton, std::move(overflow_icon)); } @@ -1924,21 +1956,16 @@ // space for them, and the buttons themselves are anchored to the bottom // corners of the overall layout. In the future, when we have more buttons, // they may instead be placed in a linear layout (locked to one side). - std::vector<std::tuple<LayoutAlignment, const gfx::VectorIcon&, - base::RepeatingCallback<void()>>> + std::vector< + std::tuple<UiElementName, LayoutAlignment, const gfx::VectorIcon&>> menu_buttons = { - {LEFT, vector_icons::kForwardArrowIcon, base::DoNothing()}, - {RIGHT, vector_icons::kReloadIcon, base::DoNothing()}, + {kOverflowMenuFordwardButton, LEFT, vector_icons::kForwardArrowIcon}, + {kOverflowMenuReloadButton, RIGHT, vector_icons::kReloadIcon}, }; for (auto& item : menu_buttons) { - auto button = std::make_unique<DiscButton>( - base::BindRepeating( - [](base::RepeatingCallback<void()> callback, Model* model) { - model->overflow_menu_enabled = false; - callback.Run(); - }, - std::get<2>(item), base::Unretained(model_)), - std::get<1>(item), audio_delegate_); + auto button = Create<DiscButton>(std::get<0>(item), kPhaseForeground, + base::DoNothing(), std::get<2>(item), + audio_delegate_); button->SetType(kTypeOverflowMenuButton); button->SetDrawPhase(kPhaseForeground); button->SetSize(kUrlBarButtonSizeDMM, kUrlBarButtonSizeDMM); @@ -1947,15 +1974,40 @@ button->set_corner_radius(kUrlBarItemCornerRadiusDMM); button->set_requires_layout(false); button->set_contributes_to_parent_bounds(false); - button->set_x_anchoring(std::get<0>(item)); - button->set_x_centering(std::get<0>(item)); + button->set_x_anchoring(std::get<1>(item)); + button->set_x_centering(std::get<1>(item)); button->set_y_anchoring(BOTTOM); button->set_y_centering(BOTTOM); button->SetTranslate( - kOverflowButtonXOffset * (std::get<0>(item) == RIGHT ? -1 : 1), + kOverflowButtonXOffset * (std::get<1>(item) == RIGHT ? -1 : 1), kOverflowMenuYPadding, 0); VR_BIND_BUTTON_COLORS(model_, button.get(), &ColorScheme::back_button, &Button::SetButtonColors); + + switch (std::get<0>(item)) { + case kOverflowMenuFordwardButton: + button->set_click_handler(base::BindRepeating( + [](Model* model, UiBrowserInterface* browser) { + model->overflow_menu_enabled = false; + browser->NavigateForward(); + }, + base::Unretained(model_), base::Unretained(browser_))); + button->AddBinding(VR_BIND_FUNC(bool, Model, model_, + model->can_navigate_forward, Button, + button.get(), SetEnabled)); + break; + case kOverflowMenuReloadButton: + button->set_click_handler(base::BindRepeating( + [](Model* model, UiBrowserInterface* browser) { + model->overflow_menu_enabled = false; + browser->ReloadTab(); + }, + base::Unretained(model_), base::Unretained(browser_))); + break; + default: + break; + } + overflow_menu->AddChild(std::move(button)); } @@ -1966,23 +2018,27 @@ kOverflowButtonRegionHeight); overflow_layout->AddChild(std::move(button_spacer)); - std::vector<std::pair<int, base::RepeatingCallback<void()>>> menu_items = { - {IDS_VR_MENU_CLOSE_INCOGNITO_TABS, base::DoNothing()}, - {IDS_VR_MENU_NEW_INCOGNITO_TAB, base::DoNothing()}, + std::vector<std::tuple<UiElementName, int>> menu_items = { + {kOverflowMenuCloseAllIncognitoTabsItem, + IDS_VR_MENU_CLOSE_INCOGNITO_TABS}, + {kOverflowMenuNewIncognitoTabItem, IDS_VR_MENU_NEW_INCOGNITO_TAB}, }; for (auto& item : menu_items) { auto layout = std::make_unique<LinearLayout>(LinearLayout::kRight); layout->SetType(kTypeOverflowMenuItem); layout->SetDrawPhase(kPhaseNone); - layout->set_layout_length(kOverflowMenuMinimumWidth); + layout->set_layout_length(kOverflowMenuMinimumWidth - + 2 * kOverflowMenuItemXPadding); auto text = Create<Text>(kNone, kPhaseForeground, kSuggestionContentTextHeightDMM); text->SetDrawPhase(kPhaseForeground); - text->SetText(l10n_util::GetStringUTF16(std::get<0>(item))); + text->SetText(l10n_util::GetStringUTF16(std::get<1>(item))); text->SetLayoutMode(TextLayoutMode::kSingleLineFixedHeight); text->SetAlignment(UiTexture::kTextAlignmentLeft); + VR_BIND_COLOR(model_, text.get(), &ColorScheme::element_foreground, + &Text::SetColor); layout->AddChild(std::move(text)); auto spacer = Create<Rect>(kNone, kPhaseNone); @@ -1991,14 +2047,8 @@ spacer->set_resizable_by_layout(true); layout->AddChild(std::move(spacer)); - auto background = Create<Button>( - kNone, kPhaseForeground, - base::BindRepeating( - [](base::RepeatingCallback<void()> callback, Model* model) { - model->overflow_menu_enabled = false; - callback.Run(); - }, - std::get<1>(item), base::Unretained(model_))); + auto background = + Create<Button>(std::get<0>(item), kPhaseForeground, base::DoNothing()); background->set_hit_testable(true); background->set_bounds_contain_children(true); background->set_hover_offset(0); @@ -2007,6 +2057,28 @@ &Button::SetButtonColors); background->AddChild(std::move(layout)); + switch (std::get<0>(item)) { + case kOverflowMenuCloseAllIncognitoTabsItem: + background->set_click_handler(base::BindRepeating( + [](Model* model, UiBrowserInterface* browser) { + model->overflow_menu_enabled = false; + browser->CloseAllIncognitoTabs(); + }, + base::Unretained(model_), base::Unretained(browser_))); + VR_BIND_VISIBILITY(background, model->incognito_tabs_open); + break; + case kOverflowMenuNewIncognitoTabItem: + background->set_click_handler(base::BindRepeating( + [](Model* model, UiBrowserInterface* browser) { + model->overflow_menu_enabled = false; + browser->OpenNewTab(true); + }, + base::Unretained(model_), base::Unretained(browser_))); + break; + default: + break; + } + overflow_layout->AddChild(std::move(background)); } @@ -2020,44 +2092,6 @@ scene_->AddUiElement(kUrlBarOverflowButton, std::move(overflow_backplane)); } -void UiSceneCreator::CreateLoadingIndicator() { - auto indicator_bg = std::make_unique<Rect>(); - indicator_bg->SetName(kLoadingIndicator); - indicator_bg->set_hit_testable(true); - indicator_bg->SetDrawPhase(kPhaseForeground); - indicator_bg->SetTranslate(0, kLoadingIndicatorVerticalOffsetDMM, 0); - indicator_bg->SetSize(kLoadingIndicatorWidthDMM, kLoadingIndicatorHeightDMM); - indicator_bg->set_y_anchoring(TOP); - indicator_bg->SetTransitionedProperties({OPACITY}); - indicator_bg->set_corner_radius(kLoadingIndicatorHeightDMM * 0.5f); - indicator_bg->set_contributes_to_parent_bounds(false); - VR_BIND_VISIBILITY(indicator_bg, model->loading); - VR_BIND_COLOR(model_, indicator_bg.get(), - &ColorScheme::loading_indicator_background, &Rect::SetColor); - - scene_->AddUiElement(kUrlBar, std::move(indicator_bg)); - - auto indicator_fg = std::make_unique<Rect>(); - indicator_fg->SetDrawPhase(kPhaseForeground); - indicator_fg->SetName(kLoadingIndicatorForeground); - indicator_fg->set_x_anchoring(LEFT); - indicator_fg->set_corner_radius(kLoadingIndicatorHeightDMM * 0.5f); - VR_BIND_COLOR(model_, indicator_fg.get(), - &ColorScheme::loading_indicator_foreground, &Rect::SetColor); - indicator_fg->AddBinding(std::make_unique<Binding<float>>( - VR_BIND_LAMBDA([](Model* m) { return m->load_progress; }, - base::Unretained(model_)), - VR_BIND_LAMBDA( - [](Rect* r, const float& value) { - r->SetSize(kLoadingIndicatorWidthDMM * value, - kLoadingIndicatorHeightDMM); - r->SetTranslate(kLoadingIndicatorWidthDMM * value * 0.5f, 0.0f, - 0.001f); - }, - base::Unretained(indicator_fg.get())))); - scene_->AddUiElement(kLoadingIndicator, std::move(indicator_fg)); -} - void UiSceneCreator::CreateSnackbars() { auto snackbar = CreateSnackbar( kDownloadedSnackbar, model_, kFileDownloadDoneIcon,
diff --git a/chrome/browser/vr/ui_scene_creator.h b/chrome/browser/vr/ui_scene_creator.h index c246dfb..9ed7c4e 100644 --- a/chrome/browser/vr/ui_scene_creator.h +++ b/chrome/browser/vr/ui_scene_creator.h
@@ -44,7 +44,6 @@ void CreateViewportAwareRoot(); void CreateUrlBar(); void CreateOverflowMenu(); - void CreateLoadingIndicator(); void CreateSnackbars(); void CreateOmnibox(); void CreateCloseButton();
diff --git a/chrome/browser/vr/webvr_pixel_browser_test.cc b/chrome/browser/vr/webvr_pixel_browser_test.cc new file mode 100644 index 0000000..b0bad415 --- /dev/null +++ b/chrome/browser/vr/webvr_pixel_browser_test.cc
@@ -0,0 +1,81 @@ +// 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 "base/environment.h" +#include "base/files/file.h" +#include "base/strings/utf_string_conversions.h" +#include "base/threading/thread_restrictions.h" +#include "chrome/browser/vr/test/vr_browser_test.h" +#include "chrome/browser/vr/test/vr_transition_utils.h" +#include "device/vr/openvr/test/fake_openvr_log.h" + +#include <memory> + +namespace vr { + +// Pixel test for WebXR - start presentation, submit frames, get data back out. +// Validates that a pixel was rendered at with the expected color. +IN_PROC_BROWSER_TEST_F(VrBrowserTestStandard, + REQUIRES_GPU(TestPresentationPixels)) { + // Set up environment variable to tell mock device to save pixel logs + std::unique_ptr<base::Environment> env = base::Environment::Create(); + base::ScopedTempDir temp_dir; + base::FilePath log_path; + + { + base::ScopedAllowBlockingForTesting allow_files; + EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); + log_path = temp_dir.GetPath().Append(FILE_PATH_LITERAL("VRPixelTest.Log")); + EXPECT_TRUE(log_path.MaybeAsASCII() != "") << "Temp dir is non-ascii"; + env->SetVar(GetVrPixelLogEnvVarName(), log_path.MaybeAsASCII()); + } + + // Load the test page, and enter presentation. + LoadUrlAndAwaitInitialization(GetHtmlTestFile("test_webvr_pixels")); + EnterPresentationOrFail(GetFirstTabWebContents()); + + // Wait for javascript to submit at least one frame. + EXPECT_TRUE(PollJavaScriptBoolean("hasPresentedFrame", kPollTimeoutShort, + GetFirstTabWebContents())) + << "No frame submitted"; + + // Tell javascript that it is done with the test. + ExecuteStepAndWait("finishTest()", GetFirstTabWebContents()); + EndTest(GetFirstTabWebContents()); + + // Try to open the log file. + { + base::ScopedAllowBlockingForTesting allow_files; + std::unique_ptr<base::File> file; + base::Time start = base::Time::Now(); + while (!file) { + file = std::make_unique<base::File>( + log_path, base::File::FLAG_OPEN | base::File::FLAG_READ | + base::File::FLAG_DELETE_ON_CLOSE); + if (!file->IsValid()) { + file = nullptr; + } + + if (base::Time::Now() - start > kPollTimeoutLong) + break; + } + EXPECT_TRUE(file); + + // Now parse the log to validate that we ran correctly. + VRSubmittedFrameEvent event; + int read = + file->ReadAtCurrentPos(reinterpret_cast<char*>(&event), sizeof(event)); + EXPECT_EQ(read, static_cast<int>(sizeof(event))); + VRSubmittedFrameEvent::Color expected = {0, 0, 255, 255}; + EXPECT_EQ(expected.r, event.color.r); + EXPECT_EQ(expected.g, event.color.g); + EXPECT_EQ(expected.b, event.color.b); + EXPECT_EQ(expected.a, event.color.a); + + file = nullptr; // Make sure we destroy this before allow_files. + EXPECT_TRUE(temp_dir.Delete()); + } +} + +} // namespace vr
diff --git a/chrome/browser/win/titlebar_config.cc b/chrome/browser/win/titlebar_config.cc index 09fc359..fce6289 100644 --- a/chrome/browser/win/titlebar_config.cc +++ b/chrome/browser/win/titlebar_config.cc
@@ -9,13 +9,17 @@ #include "chrome/common/chrome_switches.h" #include "ui/native_theme/native_theme_win.h" +// Enables custom-drawing the titlebar and tabstrip background so that we can +// paint it various gray colors instead of the default #FFFFFF. +const base::Feature kWindows10CustomTitlebar{"Windows10CustomTitlebar", + base::FEATURE_ENABLED_BY_DEFAULT}; + bool ShouldCustomDrawSystemTitlebar() { // TODO(bsep): We would like the custom-draw the titlebar in high-contrast // mode so that we can correctly draw the caption buttons on the left in RTL // mode. But they require a different style and color selection that isn't // currently implemented. return !ui::NativeTheme::GetInstanceForNativeUi()->UsesHighContrastColors() && - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kWindows10CustomTitlebar) && + base::FeatureList::IsEnabled(kWindows10CustomTitlebar) && base::win::GetVersion() >= base::win::VERSION_WIN10; }
diff --git a/chrome/browser/win/titlebar_config.h b/chrome/browser/win/titlebar_config.h index 548674686..89f923fa 100644 --- a/chrome/browser/win/titlebar_config.h +++ b/chrome/browser/win/titlebar_config.h
@@ -5,6 +5,10 @@ #ifndef CHROME_BROWSER_WIN_TITLEBAR_CONFIG_H_ #define CHROME_BROWSER_WIN_TITLEBAR_CONFIG_H_ +#include "base/feature_list.h" + +extern const base::Feature kWindows10CustomTitlebar; + // Returns whether we should custom draw the titlebar even if we're using the // native frame. bool ShouldCustomDrawSystemTitlebar();
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index e412ce5..400cd6fe 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc
@@ -950,10 +950,6 @@ // Causes the process to run as a watcher process. const char kWatcherProcess[] = "watcher"; - -// Enables custom-drawing the titlebar and tabstrip background so that it's not -// a garish #FFFFFF like it is by default on Windows 10. -const char kWindows10CustomTitlebar[] = "windows10-custom-titlebar"; #endif // defined(OS_WIN) #if BUILDFLAG(ENABLE_PRINT_PREVIEW) && !defined(OFFICIAL_BUILD)
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 0fbdff4c..0d2b79be 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h
@@ -294,7 +294,6 @@ extern const char kShowIcons[]; extern const char kUninstall[]; extern const char kWatcherProcess[]; -extern const char kWindows10CustomTitlebar[]; #endif // defined(OS_WIN) #if BUILDFLAG(ENABLE_PRINT_PREVIEW) && !defined(OFFICIAL_BUILD)
diff --git a/chrome/common/profiling/memlog_allocator_shim.cc b/chrome/common/profiling/memlog_allocator_shim.cc index 1633cdcd..885385d 100644 --- a/chrome/common/profiling/memlog_allocator_shim.cc +++ b/chrome/common/profiling/memlog_allocator_shim.cc
@@ -149,12 +149,16 @@ GetShimState()->thread_name = name; } -// Cannot call ThreadIdNameManager::GetName because it holds a lock and causes -// deadlock when lock is already held by ThreadIdNameManager before the current -// allocation. Gets the thread name from kernel if available or returns a string -// with id. This function intentionally leaks the allocated strings since they -// are used to tag allocations even after the thread dies. +// If a thread name has been set from ThreadIdNameManager, use that. Otherwise, +// gets the thread name from kernel if available or returns a string with id. +// This function intentionally leaks the allocated strings since they are used +// to tag allocations even after the thread dies. const char* GetAndLeakThreadName() { + const char* thread_name = + base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread(); + if (thread_name && strcmp(thread_name, "") != 0) + return thread_name; + // prctl requires 16 bytes, snprintf requires 19, pthread_getname_np requires // 64 on macOS, see PlatformThread::SetName in platform_thread_mac.mm. constexpr size_t kBufferLen = 64;
diff --git a/chrome/installer/mini_installer/BUILD.gn b/chrome/installer/mini_installer/BUILD.gn index c8a7e829..27bb1d4 100644 --- a/chrome/installer/mini_installer/BUILD.gn +++ b/chrome/installer/mini_installer/BUILD.gn
@@ -6,7 +6,6 @@ import("//build/config/features.gni") import("//build/config/ui.gni") import("//chrome/process_version_rc_template.gni") -import("//chrome/test/mini_installer/mini_installer_test.gni") import("//components/nacl/features.gni") import("//third_party/icu/config.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") @@ -54,15 +53,6 @@ } configs += [ ":mini_installer_compiler_flags" ] - - # This input dependency on the mini installer test Python files will force a - # recompilation when any of the Python files have changed. This will then - # invalidate the build and trigger running the test on the bots even when - # no other Chrome files have changed. These have to be inputs rather than a - # dependency because a dependency won't actually trigger recompiles in - # incremental build cases unless a source file actually references one of the - # dependency outputs. - inputs = mini_installer_test_files } process_version_rc_template("version") {
diff --git a/chrome/profiling/memlog_connection_manager.cc b/chrome/profiling/memlog_connection_manager.cc index b5e3a72..d0e54f6 100644 --- a/chrome/profiling/memlog_connection_manager.cc +++ b/chrome/profiling/memlog_connection_manager.cc
@@ -92,7 +92,8 @@ bool HeapDumpNeedsVmRegions() { return stack_mode == mojom::StackMode::NATIVE_WITHOUT_THREAD_NAMES || - stack_mode == mojom::StackMode::NATIVE_WITH_THREAD_NAMES; + stack_mode == mojom::StackMode::NATIVE_WITH_THREAD_NAMES || + stack_mode == mojom::StackMode::MIXED; } base::Thread thread;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 64021945..13e0140 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -249,11 +249,20 @@ if (toolkit_views) { public_deps += [ "//ui/views:test_support" ] sources += [ + "../browser/ui/views/media_router/app_menu_test_api.h", "views/chrome_views_test_base.cc", "views/chrome_views_test_base.h", "views/scoped_macviews_browser_mode.cc", "views/scoped_macviews_browser_mode.h", ] + if (is_mac) { + sources += + [ "../browser/ui/views/media_router/app_menu_test_api_cocoa.mm" ] + } + if (!is_mac || mac_views_browser) { + sources += + [ "../browser/ui/views/media_router/app_menu_test_api_views.cc" ] + } } if (enable_extensions) { @@ -1670,6 +1679,7 @@ "../browser/ui/views/frame/browser_frame_ash_browsertest.cc", "../browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc", "../browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc", + "../browser/ui/views/media_router/presentation_receiver_window_view_chromeos_browsertest.cc", "../browser/ui/webui/chromeos/keyboard_overlay_ui_browsertest.cc", "../browser/ui/webui/chromeos/system_web_dialog_browsertest.cc", ] @@ -1905,6 +1915,7 @@ "../browser/vr/test/vr_transition_utils.cc", "../browser/vr/test/vr_transition_utils.h", "../browser/vr/webvr_input_browser_test.cc", + "../browser/vr/webvr_pixel_browser_test.cc", "../browser/vr/webvr_tab_browser_test.cc", "../browser/vr/webvr_transition_browser_test.cc", ]
diff --git a/chrome/test/data/vr/e2e_test_files/html/test_webvr_pixels.html b/chrome/test/data/vr/e2e_test_files/html/test_webvr_pixels.html new file mode 100644 index 0000000..074e0d9 --- /dev/null +++ b/chrome/test/data/vr/e2e_test_files/html/test_webvr_pixels.html
@@ -0,0 +1,21 @@ +<!doctype html> +<!-- +Tests webvr pixel data is submitted correctly. +--> +<html> + <head> + <link rel="stylesheet" type="text/css" href="../resources/webvr_e2e.css"> + </head> + <body> + <canvas id="webgl-canvas"></canvas> + <script src="../../../../../../third_party/WebKit/LayoutTests/resources/testharness.js"></script> + <script src="../resources/webvr_e2e.js"></script> + <script src="../resources/webvr_boilerplate.js"></script> + <script> + var t = async_test("Pixel data is correct"); + function finishTest() { + t.done(); + } + </script> + </body> +</html>
diff --git a/chrome/test/data/vr/e2e_test_files/resources/webvr_boilerplate.js b/chrome/test/data/vr/e2e_test_files/resources/webvr_boilerplate.js index c789f65..fabf183 100644 --- a/chrome/test/data/vr/e2e_test_files/resources/webvr_boilerplate.js +++ b/chrome/test/data/vr/e2e_test_files/resources/webvr_boilerplate.js
@@ -21,6 +21,7 @@ var onMagicWindowAnimationFrameCallback = null; var onPresentingAnimationFrameCallback = null; var shouldSubmitFrame = true; +var hasPresentedFrame = false; function onResize() { if (vrDisplay && vrDisplay.isPresenting) { @@ -64,7 +65,10 @@ gl.viewport(webglCanvas.width * 0.5, 0, webglCanvas.width * 0.5, webglCanvas.height); - if (shouldSubmitFrame) vrDisplay.submitFrame(); + if (shouldSubmitFrame) { + vrDisplay.submitFrame(); + hasPresentedFrame = true; + } } else { if (onMagicWindowAnimationFrameCallback) { onMagicWindowAnimationFrameCallback();
diff --git a/chrome/test/data/webui/print_preview/native_layer_stub.js b/chrome/test/data/webui/print_preview/native_layer_stub.js index ac27754..150c588 100644 --- a/chrome/test/data/webui/print_preview/native_layer_stub.js +++ b/chrome/test/data/webui/print_preview/native_layer_stub.js
@@ -57,6 +57,14 @@ * @private {string} The ID of a printer with a bad driver. */ this.badPrinterId_ = ''; + + /** @private {number} The number of total pages in the document. */ + this.pageCount_ = 1; + } + + /** @param {number} pageCount The number of pages in the document. */ + setPageCount(pageCount) { + this.pageCount_ = pageCount; } /** @override */ @@ -96,8 +104,10 @@ const pageRanges = printTicketParsed.pageRange; const requestId = printTicketParsed.requestID; if (pageRanges.length == 0) { // assume full length document, 1 page. - cr.webUIListenerCallback('page-count-ready', 1, requestId, 100); - cr.webUIListenerCallback('page-preview-ready', 0, 0, requestId); + cr.webUIListenerCallback( + 'page-count-ready', this.pageCount_, requestId, 100); + for (let i = 0; i < this.pageCount_; i++) + cr.webUIListenerCallback('page-preview-ready', i, 0, requestId); } else { const pages = pageRanges.reduce(function(soFar, range) { for (let page = range.from; page <= range.to; page++) { @@ -106,7 +116,7 @@ return soFar; }, []); cr.webUIListenerCallback( - 'page-count-ready', pages.length, requestId, 100); + 'page-count-ready', this.pageCount_, requestId, 100); pages.forEach(function(page) { cr.webUIListenerCallback( 'page-preview-ready', page - 1, 0, requestId);
diff --git a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js index 42c974c..f2897d17 100644 --- a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js +++ b/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
@@ -187,3 +187,76 @@ TEST_F('PrintPreviewModelTest', 'SetStickySettings', function() { this.runMochaTest(model_test.TestNames.SetStickySettings); }); + +PrintPreviewPreviewGenerationTest = class extends NewPrintPreviewTest { + /** @override */ + get browsePreload() { + return 'chrome://print/new/app.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + '../test_browser_proxy.js', + 'native_layer_stub.js', + 'plugin_stub.js', + 'print_preview_test_utils.js', + 'preview_generation_test.js', + ]); + } + + /** @override */ + get suiteName() { + return preview_generation_test.suiteName; + } +}; + +TEST_F('PrintPreviewPreviewGenerationTest', 'Color', function() { + this.runMochaTest(preview_generation_test.TestNames.Color); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'CssBackground', function() { + this.runMochaTest(preview_generation_test.TestNames.CssBackground); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'FitToPage', function() { + this.runMochaTest(preview_generation_test.TestNames.FitToPage); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'HeaderFooter', function() { + this.runMochaTest(preview_generation_test.TestNames.HeaderFooter); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'Layout', function() { + this.runMochaTest(preview_generation_test.TestNames.Layout); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'Margins', function() { + this.runMochaTest(preview_generation_test.TestNames.Margins); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'MediaSize', function() { + this.runMochaTest(preview_generation_test.TestNames.MediaSize); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'PageRange', function() { + this.runMochaTest(preview_generation_test.TestNames.PageRange); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'SelectionOnly', function() { + this.runMochaTest(preview_generation_test.TestNames.SelectionOnly); +}); + +TEST_F('PrintPreviewPreviewGenerationTest', 'Scaling', function() { + this.runMochaTest(preview_generation_test.TestNames.Scaling); +}); + +GEN('#if !defined(OS_WIN) && !defined(OS_MACOSX)'); +TEST_F('PrintPreviewPreviewGenerationTest', 'Rasterize', function() { + this.runMochaTest(preview_generation_test.TestNames.Rasterize); +}); +GEN('#endif'); + +TEST_F('PrintPreviewPreviewGenerationTest', 'Destination', function() { + this.runMochaTest(preview_generation_test.TestNames.Destination); +});
diff --git a/chrome/test/data/webui/print_preview/preview_generation_test.js b/chrome/test/data/webui/print_preview/preview_generation_test.js new file mode 100644 index 0000000..0314720 --- /dev/null +++ b/chrome/test/data/webui/print_preview/preview_generation_test.js
@@ -0,0 +1,287 @@ +// 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. + +cr.define('preview_generation_test', function() { + /** @enum {string} */ + const TestNames = { + Color: 'color', + CssBackground: 'css background', + FitToPage: 'fit to page', + HeaderFooter: 'header/footer', + Layout: 'layout', + Margins: 'margins', + MediaSize: 'media size', + PageRange: 'page range', + Rasterize: 'rasterize', + Scaling: 'scaling', + SelectionOnly: 'selection only', + Destination: 'destination', + }; + + const suiteName = 'PreviewGenerationTest'; + suite(suiteName, function() { + /** @type {?PrintPreviewAppElement} */ + let page = null; + + /** @type {?print_preview.NativeLayer} */ + let nativeLayer = null; + + /** @type {?print_preview.DocumentInfo} */ + let documentInfo = null; + + /** @type {!print_preview.NativeInitialSettings} */ + const initialSettings = { + isInKioskAutoPrintMode: false, + isInAppKioskMode: false, + thousandsDelimeter: ',', + decimalDelimeter: '.', + unitType: 1, + previewModifiable: true, + documentTitle: 'title', + documentHasSelection: true, + shouldPrintSelectionOnly: false, + printerName: 'FooDevice', + serializedAppStateStr: null, + serializedDefaultDestinationSelectionRulesStr: null + }; + + /** @override */ + setup(function() { + nativeLayer = new print_preview.NativeLayerStub(); + print_preview.NativeLayer.setInstance(nativeLayer); + PolymerTest.clearBody(); + }); + + /** + * Initializes the UI with a default local destination. |documentInfo| is + * initialized to a 3 page HTML document with no selection if it has not + * been set yet. + * @return {!Promise} Promise that resolves when initialization is done, + * destination is set, and initial preview request is complete. + */ + function initialize() { + nativeLayer.setInitialSettings(initialSettings); + nativeLayer.setLocalDestinationCapabilities( + print_preview_test_utils.getCddTemplate(initialSettings.printerName)); + nativeLayer.setPageCount(3); + + page = document.createElement('print-preview-app'); + const previewArea = page.$$('print-preview-preview-area'); + previewArea.plugin_ = new print_preview.PDFPluginStub(previewArea); + document.body.appendChild(page); + return Promise.all([ + nativeLayer.whenCalled('getInitialSettings'), + nativeLayer.whenCalled('getPrinterCapabilities'), + ]).then(function() { + if (!documentInfo) + initDocumentInfo(false, false); + page.set('documentInfo_', documentInfo); + page.notifyPath('documentInfo_.isModifiable'); + return nativeLayer.whenCalled('getPreview'); + }); + } + + /** + * Initializes |documentInfo| with a 3 page document. + * @param {boolean} isPdf Whether the document should be a PDF. + * @param {boolean} hasSelection Whether the document has a selection. + */ + function initDocumentInfo(isPdf, hasSelection) { + documentInfo = new print_preview.DocumentInfo(); + documentInfo.init(!isPdf, 'title', hasSelection); + if (isPdf) + documentInfo.updateFitToPageScaling(98); + documentInfo.updatePageCount(3); + } + + /** + * @param {string} settingName The name of the setting to test. + * @param {boolean | string} initialSettingValue The default setting value. + * @param {boolean | string} updatedSettingValue The setting value to update + * to. + * @param {string} ticketKey The field in the print ticket that corresponds + * to the setting. + * @param {boolean | string | number} initialTicketValue The ticket value + * corresponding to the default setting value. + * @param {boolean | string | number} updatedTicketValue The ticket value + * corresponding to the updated setting value. + * @return {!Promise} Promise that resolves when the setting has been + * changed, the preview has been regenerated, and the print ticket and + * UI state have been verified. + */ + function testSimpleSetting( + settingName, initialSettingValue, updatedSettingValue, + ticketKey, initialTicketValue, updatedTicketValue) { + return initialize().then(function(args) { + const originalTicket = JSON.parse(args.printTicket); + assertEquals(initialTicketValue, originalTicket[ticketKey]); + nativeLayer.resetResolver('getPreview'); + assertEquals(initialSettingValue, page.getSettingValue(settingName)); + page.setSetting(settingName, updatedSettingValue); + return nativeLayer.whenCalled('getPreview'); + }).then(function(args) { + assertEquals(updatedSettingValue, page.getSettingValue(settingName)); + const ticket = JSON.parse(args.printTicket); + assertEquals(updatedTicketValue, ticket[ticketKey]); + assertEquals(2, ticket.requestID); + }); + } + + /** Validate changing the color updates the preview. */ + test(assert(TestNames.Color), function() { + return testSimpleSetting( + 'color', true, false, 'color', print_preview.ColorMode.COLOR, + print_preview.ColorMode.GRAY); + }); + + /** Validate changing the background setting updates the preview. */ + test(assert(TestNames.CssBackground), function() { + return testSimpleSetting( + 'cssBackground', false, true, 'shouldPrintBackgrounds', false, true); + }); + + /** Validate changing the fit to page setting updates the preview. */ + test(assert(TestNames.FitToPage), function() { + // Set PDF document so setting is available. + initDocumentInfo(true, false); + return testSimpleSetting( + 'fitToPage', false, true, 'fitToPageEnabled', false, true); + }); + + /** Validate changing the header/footer setting updates the preview. */ + test(assert(TestNames.HeaderFooter), function() { + return testSimpleSetting( + 'headerFooter', true, false, 'headerFooterEnabled', true, false); + }); + + /** Validate changing the orientation updates the preview. */ + test(assert(TestNames.Layout), function() { + return testSimpleSetting('layout', false, true, 'landscape', false, true); + }); + + /** Validate changing the margins updates the preview. */ + test(assert(TestNames.Margins), function() { + return testSimpleSetting( + 'margins', print_preview.ticket_items.MarginsTypeValue.DEFAULT, + print_preview.ticket_items.MarginsTypeValue.MINIMUM, 'marginsType', + print_preview.ticket_items.MarginsTypeValue.DEFAULT, + print_preview.ticket_items.MarginsTypeValue.MINIMUM); + }); + + /** Validate changing the paper size updates the preview. */ + test(assert(TestNames.MediaSize), function() { + const mediaSizeCapability = + print_preview_test_utils.getCddTemplate('FooDevice').capabilities + .printer.media_size; + const letterOption = mediaSizeCapability.option[0]; + const squareOption = mediaSizeCapability.option[1]; + return initialize().then(function(args) { + const originalTicket = JSON.parse(args.printTicket); + assertEquals(letterOption.width_microns, + originalTicket.mediaSize.width_microns); + assertEquals(letterOption.height_microns, + originalTicket.mediaSize.height_microns); + nativeLayer.resetResolver('getPreview'); + const mediaSizeSetting = page.getSettingValue('mediaSize'); + assertEquals(letterOption.width_microns, + mediaSizeSetting.width_microns); + assertEquals(letterOption.height_microns, + mediaSizeSetting.height_microns); + page.setSetting('mediaSize', squareOption); + return nativeLayer.whenCalled('getPreview'); + }).then(function(args) { + const mediaSizeSettingUpdated = page.getSettingValue('mediaSize'); + assertEquals(squareOption.width_microns, + mediaSizeSettingUpdated.width_microns); + assertEquals(squareOption.height_microns, + mediaSizeSettingUpdated.height_microns); + const ticket = JSON.parse(args.printTicket); + assertEquals(squareOption.width_microns, + ticket.mediaSize.width_microns); + assertEquals(squareOption.height_microns, + ticket.mediaSize.height_microns); + nativeLayer.resetResolver('getPreview'); + assertEquals(2, ticket.requestID); + }); + }); + + /** Validate changing the page range updates the preview. */ + test(assert(TestNames.PageRange), function() { + return initialize().then(function(args) { + const originalTicket = JSON.parse(args.printTicket); + // Ranges is empty for full document. + assertEquals(0, page.getSettingValue('ranges').length); + assertEquals(0, originalTicket.pageRange.length); + nativeLayer.resetResolver('getPreview'); + page.setSetting('ranges', [{from: 1, to: 2}]); + return nativeLayer.whenCalled('getPreview'); + }).then(function(args) { + const setting = page.getSettingValue('ranges'); + assertEquals(1, setting.length); + assertEquals(1, setting[0].from); + assertEquals(2, setting[0].to); + const ticket = JSON.parse(args.printTicket); + assertEquals(1, ticket.pageRange.length); + assertEquals(1, ticket.pageRange[0].from); + assertEquals(2, ticket.pageRange[0].to); + }); + }); + + /** Validate changing the selection only setting updates the preview. */ + test(assert(TestNames.SelectionOnly), function() { + // Set has selection to true so that the setting is available. + initDocumentInfo(false, true); + return testSimpleSetting( + 'selectionOnly', false, true, 'shouldPrintSelectionOnly', false, + true); + }); + + /** Validate changing the scaling updates the preview. */ + test(assert(TestNames.Scaling), function() { + return testSimpleSetting( + 'scaling', '100', '90', 'scaleFactor', 100, 90); + }); + + /** + * Validate changing the rasterize setting updates the preview. Only runs + * on Linux and CrOS as setting is not available on other platforms. + */ + test(assert(TestNames.Rasterize), function() { + // Set PDF document so setting is available. + initDocumentInfo(true, false); + return testSimpleSetting( + 'rasterize', false, true, 'rasterizePDF', false, true); + }); + + /** Validate changing the destination updates the preview. */ + test(assert(TestNames.Destination), function() { + return initialize().then(function(args) { + const originalTicket = JSON.parse(args.printTicket); + assertEquals('FooDevice', page.destination_.id); + assertEquals('FooDevice', originalTicket.deviceName); + const barDestination = new print_preview.Destination( + 'BarDevice', print_preview.DestinationType.LOCAL, + print_preview.DestinationOrigin.LOCAL, 'BarName', + false /*isRecent*/, + print_preview.DestinationConnectionStatus.ONLINE); + barDestination.capabilities = + print_preview_test_utils.getCddTemplate(barDestination.id) + .capabilities; + page.set('destination_', barDestination); + nativeLayer.resetResolver('getPreview'); + page.set('destination_.capabilities', barDestination.capabilities); + return nativeLayer.whenCalled('getPreview'); + }).then(function(args) { + assertEquals('BarDevice', page.destination_.id); + const ticket = JSON.parse(args.printTicket); + assertEquals('BarDevice', ticket.deviceName); + }); + }); + }); + + return { + suiteName: suiteName, + TestNames: TestNames, + }; +});
diff --git a/chrome/test/data/webui/print_preview/settings_section_test.js b/chrome/test/data/webui/print_preview/settings_section_test.js index 686ae03..1baf0f9 100644 --- a/chrome/test/data/webui/print_preview/settings_section_test.js +++ b/chrome/test/data/webui/print_preview/settings_section_test.js
@@ -60,7 +60,7 @@ const info = new print_preview.DocumentInfo(); info.init(!isPdf, 'title', hasSelection); if (isPdf) - info.fitToPageScaling_ = '98'; + info.updateFitToPageScaling(98); info.updatePageCount(3); page.set('documentInfo_', info); } @@ -533,7 +533,8 @@ // verify that the input matches them. if (scalingValid) { const scalingDisplay = - fitToPage ? page.documentInfo_.fitToPageScaling : scalingValue; + fitToPage ? page.documentInfo_.fitToPageScaling.toString() : + scalingValue; expectEquals(scalingDisplay, scalingInput.value); } expectEquals(scalingValue, page.settings.scaling.value);
diff --git a/chrome/test/media_router/media_router_integration_browsertest.cc b/chrome/test/media_router/media_router_integration_browsertest.cc index 8bf1f43..f863c1d 100644 --- a/chrome/test/media_router/media_router_integration_browsertest.cc +++ b/chrome/test/media_router/media_router_integration_browsertest.cc
@@ -699,7 +699,8 @@ ASSERT_EQ(session_id, reconnected_session_id); } -IN_PROC_BROWSER_TEST_F(MediaRouterIntegrationBrowserTest, Basic) { +// TODO(crbug.com/822337): Flaky on Linux_CFI bot. +IN_PROC_BROWSER_TEST_F(MediaRouterIntegrationBrowserTest, MANUAL_Basic) { RunBasicTest(); }
diff --git a/chrome/test/mini_installer/BUILD.gn b/chrome/test/mini_installer/BUILD.gn new file mode 100644 index 0000000..679734c9 --- /dev/null +++ b/chrome/test/mini_installer/BUILD.gn
@@ -0,0 +1,69 @@ +# 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. + +if (is_win) { + group("mini_installer_tests") { + testonly = true + + data_deps = [ + "//chrome/test/chromedriver:chromedriver", + "//chrome/installer/mini_installer:mini_installer", + "//chrome/installer/mini_installer:next_version_mini_installer", + ] + data = [ + "//third_party/webdriver/pylib/", + "//third_party/depot_tools/download_from_google_storage.py", + "//third_party/depot_tools/gsutil.py", + ] + + get_path_info([ + "chrome_helper.py", + "config/chrome_beta_installed.prop", + "config/chrome_beta_no_pv.prop", + "config/chrome_beta_not_installed.prop", + "config/chrome_beta_not_inuse.prop", + "config/chrome_canary_installed.prop", + "config/chrome_canary_inuse.prop", + "config/chrome_canary_no_pv.prop", + "config/chrome_canary_not_installed.prop", + "config/chrome_canary_not_inuse.prop", + "config/chrome_canary_updated.prop", + "config/chrome_dev_installed.prop", + "config/chrome_dev_no_pv.prop", + "config/chrome_dev_not_installed.prop", + "config/chrome_dev_not_inuse.prop", + "config/chrome_multi_system_installed.prop", + "config/chrome_multi_user_installed.prop", + "config/chrome_system_installed.prop", + "config/chrome_system_inuse.prop", + "config/chrome_system_no_pv.prop", + "config/chrome_system_not_installed.prop", + "config/chrome_system_not_inuse.prop", + "config/chrome_system_updated.prop", + "config/chrome_user_binaries_killed.prop", + "config/chrome_user_installed.prop", + "config/chrome_user_inuse.prop", + "config/chrome_user_killed.prop", + "config/chrome_user_no_pv.prop", + "config/chrome_user_not_installed.prop", + "config/chrome_user_not_inuse.prop", + "config/chrome_user_updated.prop", + "config/config.config", + "file_verifier.py", + "launch_chrome.py", + "make_chrome_multi.py", + "process_verifier.py", + "quit_chrome.py", + "registry_verifier.py", + "test_chrome_with_chromedriver.py", + "test_installer.py", + "test_page.html", + "uninstall_chrome.py", + "update_lastrun.py", + "variable_expander.py", + "verifier.py", + "verifier_runner.py", + ], + "abspath") + } +}
diff --git a/chrome/test/mini_installer/config/config.config b/chrome/test/mini_installer/config/config.config index 18abcf1..e9c07c86 100644 --- a/chrome/test/mini_installer/config/config.config +++ b/chrome/test/mini_installer/config/config.config
@@ -195,6 +195,8 @@ "chrome_system_not_inuse.prop"]] ], "actions": [ + ["test_chrome_with_chromedriver_user", + "python test_chrome_with_chromedriver.py --chromedriver-path=\"$CHROMEDRIVER_PATH\" $QUIET \"$LOCAL_APPDATA\\$CHROME_DIR\\Application\\chrome.exe\""], ["install_chrome_beta", "\"$MINI_INSTALLER\" --chrome-beta --verbose-logging --do-not-launch-chrome"], ["install_chrome_canary", @@ -242,6 +244,16 @@ ], "tests": [ { + "name": "ChromedriverTestUserLevel", + "description": "Tests chrome using chromedriver to load real pages.", + "traversal": [ + "no_pv", + "install_chrome_user", "chrome_user_installed_not_inuse", + "test_chrome_with_chromedriver_user", "chrome_user_installed_not_inuse", + "uninstall_chrome_user", "clean" + ] + }, + { "name": "ChromeUserLevel", "description": "Verifies that user-level Chrome can be installed and uninstalled.", "traversal": [ @@ -378,7 +390,7 @@ "no_pv", "install_chrome_user", "chrome_user_installed_not_inuse", "make_chrome_user_multi", "chrome_multi_user_installed_not_inuse", - "kill_user_binaries", "no_chrome_user_binaries", + "kill_user_binaries", "no_chrome_user_binaries", "update_chrome_user", "chrome_user_updated_not_inuse", "uninstall_chrome_user", "clean" ]
diff --git a/chrome/test/mini_installer/mini_installer_test.gni b/chrome/test/mini_installer/mini_installer_test.gni deleted file mode 100644 index ecc39f3..0000000 --- a/chrome/test/mini_installer/mini_installer_test.gni +++ /dev/null
@@ -1,54 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# All test files. After get_path_info they will be in absolute-path format. -# This list is used to know when to re-trigger running this test. -mini_installer_test_files = - get_path_info([ - "chrome_helper.py", - "config/chrome_beta_installed.prop", - "config/chrome_beta_no_pv.prop", - "config/chrome_beta_not_installed.prop", - "config/chrome_beta_not_inuse.prop", - "config/chrome_canary_installed.prop", - "config/chrome_canary_inuse.prop", - "config/chrome_canary_no_pv.prop", - "config/chrome_canary_not_installed.prop", - "config/chrome_canary_not_inuse.prop", - "config/chrome_canary_updated.prop", - "config/chrome_dev_installed.prop", - "config/chrome_dev_no_pv.prop", - "config/chrome_dev_not_installed.prop", - "config/chrome_dev_not_inuse.prop", - "config/chrome_multi_system_installed.prop", - "config/chrome_multi_user_installed.prop", - "config/chrome_system_installed.prop", - "config/chrome_system_inuse.prop", - "config/chrome_system_no_pv.prop", - "config/chrome_system_not_installed.prop", - "config/chrome_system_not_inuse.prop", - "config/chrome_system_updated.prop", - "config/chrome_user_binaries_killed.prop", - "config/chrome_user_installed.prop", - "config/chrome_user_inuse.prop", - "config/chrome_user_killed.prop", - "config/chrome_user_no_pv.prop", - "config/chrome_user_not_installed.prop", - "config/chrome_user_not_inuse.prop", - "config/chrome_user_updated.prop", - "config/config.config", - "file_verifier.py", - "launch_chrome.py", - "make_chrome_multi.py", - "process_verifier.py", - "quit_chrome.py", - "registry_verifier.py", - "test_installer.py", - "uninstall_chrome.py", - "update_lastrun.py", - "variable_expander.py", - "verifier.py", - "verifier_runner.py", - ], - "abspath")
diff --git a/chrome/test/mini_installer/test_chrome_with_chromedriver.py b/chrome/test/mini_installer/test_chrome_with_chromedriver.py new file mode 100644 index 0000000..5b1f5e5a --- /dev/null +++ b/chrome/test/mini_installer/test_chrome_with_chromedriver.py
@@ -0,0 +1,117 @@ +# 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. + +"""Test Chrome using chromedriver. + +If the webdriver API or the chromedriver.exe binary can't be found this +becomes a no-op. This is to allow running locally while the waterfalls get +setup. Once all locations have been provisioned and are expected to contain +these items the checks should be removed to ensure this is run on each test +and fails if anything is incorrect. +""" + +import argparse +import atexit +import contextlib +import logging +import os +import shutil +import sys +import tempfile + +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) +SRC_DIR = os.path.join(THIS_DIR, '..', '..', '..') +WEBDRIVER_PATH = os.path.join( + SRC_DIR, r'third_party', 'webdriver', 'pylib') +TEST_HTML_FILE = 'file://' + os.path.join(THIS_DIR, 'test_page.html') + + +# Try and import webdriver +sys.path.insert(0, WEBDRIVER_PATH) +try: + from selenium import webdriver + from selenium.webdriver import ChromeOptions +except ImportError: + # If a system doesn't have the webdriver API this is a no-op phase + logging.info( + 'Chromedriver API (selenium.webdriver) is not installed available in ' + '%s. Exiting test_chrome_with_chromedriver.py' % WEBDRIVER_PATH) + sys.exit(0) + + +@contextlib.contextmanager +def CreateChromedriver(args): + """Create a webdriver object ad close it after.""" + user_data_dir = tempfile.mkdtemp() + fd, log_file = tempfile.mkstemp() + os.close(fd) + chrome_options = ChromeOptions() + chrome_options.binary_location = args.chrome_path + chrome_options.add_argument('user-data-dir=' + user_data_dir) + chrome_options.add_argument('log-file=' + log_file) + chrome_options.add_argument('enable-logging') + chrome_options.add_argument('v=1') + try: + driver = webdriver.Chrome( + args.chromedriver_path, + chrome_options=chrome_options) + yield driver + except: + with open(log_file) as fh: + logging.error(fh.read()) + raise + finally: + driver.quit() + os.remove(log_file) + shutil.rmtree(user_data_dir) + + +def main(): + """Main entry point.""" + parser = parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('-q', '--quiet', action='store_true', default=False, + help='Reduce test runner output') + parser.add_argument( + '--chromedriver-path', default='chromedriver.exe', metavar='FILENAME', + help='Path to chromedriver') + parser.add_argument( + 'chrome_path', metavar='FILENAME', help='Path to chrome installer') + args = parser.parse_args() + + # This test is run from src, but this script is called with a cwd of + # chrome/test/mini_installer, so relative paths need to be compensated for. + if not os.path.exists(args.chromedriver_path): + args.chromedriver_path = os.path.join( + '..', '..', '..', args.chromedriver_path) + if not os.path.exists(args.chrome_path): + args.chrome_path = os.path.join( + '..', '..', '..', args.chrome_path) + + logging.basicConfig( + format='[%(asctime)s:%(filename)s(%(lineno)d)] %(message)s', + datefmt='%m%d/%H%M%S', level=logging.ERROR if args.quiet else logging.INFO) + + if not args.chrome_path: + logging.error('The path to the chrome binary is required.') + return -1 + # Check that chromedriver is correct. + if not os.path.exists(args.chromedriver_path): + # If we can't find chromedriver exit as a no-op. + logging.info( + 'Cant find %s. Exiting test_chrome_with_chromedriver', + args.chromedriver_path) + return 0 + with CreateChromedriver(args) as driver: + driver.get(TEST_HTML_FILE) + assert driver.title == 'Chromedriver Test Page', ( + 'The page title was not correct.') + element = driver.find_element_by_tag_name('body') + assert element.text == 'This is the test page', ( + 'The page body was not correct') + return 0 + + +if __name__ == '__main__': + sys.exit(main())
diff --git a/chrome/test/mini_installer/test_installer.py b/chrome/test/mini_installer/test_installer.py index 4a06b7b..0fd57ad 100644 --- a/chrome/test/mini_installer/test_installer.py +++ b/chrome/test/mini_installer/test_installer.py
@@ -11,9 +11,8 @@ import argparse import contextlib -import datetime -import inspect import json +import logging import os import shutil import subprocess @@ -28,22 +27,11 @@ from variable_expander import VariableExpander import verifier_runner - -def LogMessage(message): - """Logs a message to stderr. - - Args: - message: The message string to be logged. - """ - now = datetime.datetime.now() - frameinfo = inspect.getframeinfo(inspect.currentframe().f_back) - filename = os.path.basename(frameinfo.filename) - line = frameinfo.lineno - sys.stderr.write('[%s:%s(%s)] %s\n' % (now.strftime('%m%d/%H%M%S'), - filename, line, message)) +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) +SRC_DIR = os.path.join(THIS_DIR, '..', '..', '..') -class Config: +class Config(object): """Describes the machine states, actions, and test cases. Attributes: @@ -62,7 +50,7 @@ class InstallerTest(unittest.TestCase): """Tests a test case in the config file.""" - def __init__(self, name, test, config, variable_expander, quiet): + def __init__(self, name, test, config, variable_expander): """Constructor. Args: @@ -77,7 +65,6 @@ self._test = test self._config = config self._variable_expander = variable_expander - self._quiet = quiet self._verifier_runner = verifier_runner.VerifierRunner() self._clean_on_teardown = True @@ -110,11 +97,10 @@ # Starting at index 1, we loop through pairs of (action, state). for i in range(1, len(self._test), 2): action = self._test[i] - if not self._quiet: - LogMessage('Beginning action %s' % action) - RunCommand(self._config.actions[action], self._variable_expander) - if not self._quiet: - LogMessage('Finished action %s' % action) + logging.info('Beginning action %s' % action) + RunCommand( + self._config.actions[action], self._variable_expander) + logging.info('Finished action %s' % action) state = self._test[i + 1] self._VerifyState(state) @@ -144,8 +130,7 @@ Args: state: A state name. """ - if not self._quiet: - LogMessage('Verifying state %s' % state) + logging.info('Verifying state %s' % state) try: self._verifier_runner.VerifyAll(self._config.states[state], self._variable_expander) @@ -167,10 +152,29 @@ """ expanded_command = variable_expander.Expand(command) script_dir = os.path.dirname(os.path.abspath(__file__)) - exit_status = subprocess.call(expanded_command, shell=True, cwd=script_dir) - if exit_status != 0: + returncode = None + stdout = '' + stderr = '' + # Uninstall is special in that it is run in interactive mode and may need user + # input. This needs to happen even if the quiet arg is passed to prevent a + # deadlock + if 'uninstall_chrome.py' in expanded_command: + returncode = subprocess.call( + expanded_command, shell=True, cwd=script_dir) + else: + proc = subprocess.Popen( + expanded_command, shell=True, cwd=script_dir, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdout, stderr = proc.communicate() + returncode = proc.returncode + + if stdout: + logging.info('stdout:\n%s', stdout.replace('\r', '').rstrip('\n')) + if stderr: + logging.error('stdout:\n%s', stderr.replace('\r', '').rstrip('\n')) + if returncode != 0: raise Exception('Command %s returned non-zero exit status %s' % ( - expanded_command, exit_status)) + expanded_command, returncode)) def DeleteGoogleUpdateRegistration(system_level, registry_subkey, @@ -234,7 +238,7 @@ except: message = traceback.format_exception(*sys.exc_info()) message.insert(0, 'Error cleaning up an old install with:\n') - LogMessage(''.join(message)) + logging.info(''.join(message)) if force_clean: DeleteGoogleUpdateRegistration(system_level, registry_subkey, variable_expander) @@ -387,7 +391,12 @@ def DoMain(): - parser = argparse.ArgumentParser() + # TODO(mmeade): Replace --build-dir and --target with a new path + # flags and plumb it through. + parser = parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('-q', '--quiet', action='store_true', default=False, + help='Reduce test runner output') parser.add_argument('--build-dir', default='out', help='Path to main build directory (the parent of the ' 'Release or Debug directory)') @@ -395,32 +404,59 @@ help='Build target (Release or Debug)') parser.add_argument('--force-clean', action='store_true', default=False, help='Force cleaning existing installations') - parser.add_argument('-q', '--quiet', action='store_true', default=False, - help='Reduce test runner output') parser.add_argument('--write-full-results-to', metavar='FILENAME', help='Path to write the list of full results to.') - parser.add_argument('--config', metavar='FILENAME', - help='Path to test configuration file') + parser.add_argument('--config', default=os.path.join( + 'chrome', 'test', 'mini_installer', 'config', 'config.config'), + metavar='FILENAME', help='Path to test configuration file') + parser.add_argument('--chromedriver-path', + default='', metavar='FILENAME', + help='The path to chromedriver.') parser.add_argument('test', nargs='*', help='Name(s) of tests to run.') + + # The following flags will replace the build-dir, target, and filename arg. + parser.add_argument('--installer-path', + default='', metavar='FILENAME', + help='The path of the installer.') + parser.add_argument('--next-version-installer-path', + default='', metavar='FILENAME', + help='The path of the next version installer.') + parser.add_argument('--results-directory', default='', + help='The path of the results directory.') args = parser.parse_args() + if not args.config: parser.error('missing mandatory --config FILENAME argument') - mini_installer_path = os.path.join(args.build_dir, args.target, - 'mini_installer.exe') - assert os.path.exists(mini_installer_path), ('Could not find file %s' % - mini_installer_path) + # TODO(mmeade): Fully switch to paths + installer_path = ( + args.installer_path or + os.path.join(args.build_dir, args.target, 'mini_installer.exe')) + assert os.path.exists(installer_path), ( + 'Could not find file %s' % installer_path) - next_version_mini_installer_path = os.path.join( - args.build_dir, args.target, 'next_version_mini_installer.exe') - assert os.path.exists(next_version_mini_installer_path), ( - 'Could not find file %s' % next_version_mini_installer_path) + next_version_installer_path = ( + args.next_version_installer_path or + os.path.join(args.build_dir, args.target, + 'next_version_mini_installer.exe')) + assert os.path.exists(next_version_installer_path), ( + 'Could not find file %s' % next_version_installer_path) + + chromedriver_path = ( + args.chromedriver_path or + os.path.join(args.build_dir, args.target, 'chromedriver.exe')) + + logging.basicConfig( + format='[%(asctime)s:%(filename)s(%(lineno)d)] %(message)s', + datefmt='%m%d/%H%M%S', level=logging.ERROR if args.quiet else logging.INFO) suite = unittest.TestSuite() - variable_expander = VariableExpander(mini_installer_path, - next_version_mini_installer_path) + variable_expander = VariableExpander(installer_path, + next_version_installer_path, + chromedriver_path, + args.quiet) config = ParseConfigFile(args.config, variable_expander) RunCleanCommand(args.force_clean, variable_expander) @@ -431,7 +467,7 @@ test['name']) if not args.test or test_name in args.test: suite.addTest(InstallerTest(test['name'], test['traversal'], config, - variable_expander, args.quiet)) + variable_expander)) verbosity = 2 if not args.quiet else 1 result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
diff --git a/chrome/test/mini_installer/test_page.html b/chrome/test/mini_installer/test_page.html new file mode 100644 index 0000000..84b11683 --- /dev/null +++ b/chrome/test/mini_installer/test_page.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<html> + +<head> + <title>Chromedriver Test Page</title> +</head> +<body>This is the test page</body> + +</html> \ No newline at end of file
diff --git a/chrome/test/mini_installer/variable_expander.py b/chrome/test/mini_installer/variable_expander.py index 00cc7f7c..44259283 100644 --- a/chrome/test/mini_installer/variable_expander.py +++ b/chrome/test/mini_installer/variable_expander.py
@@ -64,7 +64,8 @@ class VariableExpander: """Expands variables in strings.""" - def __init__(self, mini_installer_path, next_version_mini_installer_path): + def __init__(self, mini_installer_path, next_version_mini_installer_path, + chromedriver_path, quiet): """Constructor. The constructor initializes a variable dictionary that maps variables to @@ -92,6 +93,8 @@ root key, of Chrome Beta for Google Update. * $CHROME_UPDATE_REGISTRY_SUBKEY_SXS: the registry key, excluding the root key, of Chrome SxS for Google Update. + * $CHROMEDRIVER_PATH: Path to chromedriver. + * $QUIET: Supress output * $LAUNCHER_UPDATE_REGISTRY_SUBKEY: the registry key, excluding the root key, of the app launcher for Google Update if $BRAND is 'Google * Chrome'. @@ -129,6 +132,8 @@ next_version_mini_installer_path) windows_major_ver, windows_minor_ver, _, _, _ = win32api.GetVersionEx() self._variable_mapping = { + 'CHROMEDRIVER_PATH': chromedriver_path, + 'QUIET': '-q' if quiet else '', 'LOCAL_APPDATA': shell.SHGetFolderPath(0, shellcon.CSIDL_LOCAL_APPDATA, None, 0), 'MINI_INSTALLER': mini_installer_abspath,
diff --git a/chrome_cleaner/cleaner/BUILD.gn b/chrome_cleaner/cleaner/BUILD.gn new file mode 100644 index 0000000..364f27f --- /dev/null +++ b/chrome_cleaner/cleaner/BUILD.gn
@@ -0,0 +1,17 @@ +# Copyright (c) 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. + +source_set("cleaner_headers") { + sources = [ + "cleaner.h", + "noop_cleaner_impl.cc", + "noop_cleaner_impl.h", + ] + + public_deps = [ + "//base", + "//chrome_cleaner/constants:uws_id", + "//components/chrome_cleaner/public/constants:constants", + ] +}
diff --git a/chrome_cleaner/cleaner/DEPS b/chrome_cleaner/cleaner/DEPS new file mode 100644 index 0000000..9648b97a --- /dev/null +++ b/chrome_cleaner/cleaner/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+components/chrome_cleaner", +]
diff --git a/chrome_cleaner/cleaner/cleaner.h b/chrome_cleaner/cleaner/cleaner.h new file mode 100644 index 0000000..85d4912 --- /dev/null +++ b/chrome_cleaner/cleaner/cleaner.h
@@ -0,0 +1,48 @@ +// Copyright (c) 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_CLEANER_CLEANER_CLEANER_H_ +#define CHROME_CLEANER_CLEANER_CLEANER_H_ + +#include <vector> + +#include "base/callback.h" +#include "chrome_cleaner/constants/uws_id.h" +#include "components/chrome_cleaner/public/constants/result_codes.h" + +namespace chrome_cleaner { + +// This class defines the cleaning interface that is used for all engines. +class Cleaner { + public: + typedef base::OnceCallback<void(ResultCode status)> DoneCallback; + + virtual ~Cleaner() = default; + + // Start cleaning UwS specified in |uws_ids|. If the cleanup completes before + // |Stop| is called, |done_callback| must be called to report cleanup status. + virtual void Start(const std::vector<UwSId>& uws_ids, + DoneCallback done_callback) = 0; + + // Start post-reboot cleanup of UwS specified in |uws_ids|. |done_callback| + // must be called to report cleanup status. + virtual void StartPostReboot(const std::vector<UwSId>& uws_ids, + DoneCallback done_callback) = 0; + + // Interrupts the current cleaning. It's a noop when cleaning hasn't started + // yet, is already done, or has already been stopped. + virtual void Stop() = 0; + + // When calling |Stop|, some tasks may still be running, so make sure to call + // |IsCompletelyDone| and allow the main message loop to pump messages until + // all tasks are done before clearing data passed to the cleaner. + virtual bool IsCompletelyDone() const = 0; + + // Indicate whether the cleaner can remove UwS specified in |uws_ids|. + virtual bool CanClean(const std::vector<UwSId>& uws_ids) = 0; +}; + +} // namespace chrome_cleaner + +#endif // CHROME_CLEANER_CLEANER_CLEANER_H_
diff --git a/chrome_cleaner/cleaner/noop_cleaner_impl.cc b/chrome_cleaner/cleaner/noop_cleaner_impl.cc new file mode 100644 index 0000000..8c4cf74 --- /dev/null +++ b/chrome_cleaner/cleaner/noop_cleaner_impl.cc
@@ -0,0 +1,49 @@ +// Copyright (c) 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_cleaner/cleaner/noop_cleaner_impl.h" + +#include <utility> + +#include "base/logging.h" +#include "components/chrome_cleaner/public/constants/result_codes.h" + +namespace chrome_cleaner { + +NoopCleanerImpl::NoopCleanerImpl() = default; +NoopCleanerImpl::~NoopCleanerImpl() = default; + +void NoopCleanerImpl::Start(const std::vector<UwSId>& uws_ids, + DoneCallback done_callback) { + // NoopCleanerImpl should only be used by engines that don't support + // cleaning, so Start should never be called. + NOTREACHED(); + std::move(done_callback).Run(RESULT_CODE_CLEANUP_NOT_SUPPORTED_BY_ENGINE); +} + +void NoopCleanerImpl::StartPostReboot(const std::vector<UwSId>& uws_ids, + DoneCallback done_callback) { + // NoopCleanerImpl should only be used by engines that don't support + // cleaning, so StartPostReboot should never be called. + NOTREACHED(); + std::move(done_callback).Run(RESULT_CODE_CLEANUP_NOT_SUPPORTED_BY_ENGINE); +} + +void NoopCleanerImpl::Stop() { + // Do nothing. +} + +bool NoopCleanerImpl::IsCompletelyDone() const { + return true; +} + +bool NoopCleanerImpl::CanClean(const std::vector<UwSId>& uws_ids) { + // This should only be called if removable UwS is found, to verify that it's + // safe to remove. But NoopCleanerImpl should only be used by engines that + // have no removable UwS. + NOTREACHED(); + return false; +} + +} // namespace chrome_cleaner
diff --git a/chrome_cleaner/cleaner/noop_cleaner_impl.h b/chrome_cleaner/cleaner/noop_cleaner_impl.h new file mode 100644 index 0000000..0702110 --- /dev/null +++ b/chrome_cleaner/cleaner/noop_cleaner_impl.h
@@ -0,0 +1,34 @@ +// Copyright (c) 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_CLEANER_CLEANER_NOOP_CLEANER_IMPL_H_ +#define CHROME_CLEANER_CLEANER_NOOP_CLEANER_IMPL_H_ + +#include <vector> + +#include "chrome_cleaner/cleaner/cleaner.h" + +namespace chrome_cleaner { + +// A cleaner that does nothing. This should only be used with engines that do +// not support any removable UwS, so it asserts that cleaning-related functions +// are not called. +class NoopCleanerImpl : public Cleaner { + public: + NoopCleanerImpl(); + ~NoopCleanerImpl() override; + + // Cleaner. + void Start(const std::vector<UwSId>& uws_ids, + DoneCallback done_callback) override; + void StartPostReboot(const std::vector<UwSId>& uws_ids, + DoneCallback done_callback) override; + void Stop() override; + bool IsCompletelyDone() const override; + bool CanClean(const std::vector<UwSId>& uws_ids) override; +}; + +} // namespace chrome_cleaner + +#endif // CHROME_CLEANER_CLEANER_NOOP_CLEANER_IMPL_H_
diff --git a/chrome_cleaner/constants/BUILD.gn b/chrome_cleaner/constants/BUILD.gn new file mode 100644 index 0000000..46a3de0 --- /dev/null +++ b/chrome_cleaner/constants/BUILD.gn
@@ -0,0 +1,11 @@ +# Copyright (c) 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("//build/config/chrome_build.gni") + +source_set("uws_id") { + sources = [ + "uws_id.h", + ] +}
diff --git a/chrome_cleaner/constants/uws_id.h b/chrome_cleaner/constants/uws_id.h new file mode 100644 index 0000000..5bc3915 --- /dev/null +++ b/chrome_cleaner/constants/uws_id.h
@@ -0,0 +1,15 @@ +// Copyright (c) 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_CLEANER_CONSTANTS_UWS_ID_H_ +#define CHROME_CLEANER_CONSTANTS_UWS_ID_H_ + +namespace chrome_cleaner { + +// Identifies a family of UwS. +typedef unsigned int UwSId; + +} // namespace chrome_cleaner + +#endif // CHROME_CLEANER_CONSTANTS_UWS_ID_H_
diff --git a/chromecast/media/audio/cast_audio_output_stream_unittest.cc b/chromecast/media/audio/cast_audio_output_stream_unittest.cc index 4cbe069..5671745 100644 --- a/chromecast/media/audio/cast_audio_output_stream_unittest.cc +++ b/chromecast/media/audio/cast_audio_output_stream_unittest.cc
@@ -9,6 +9,7 @@ #include <memory> #include <utility> +#include "base/memory/ref_counted.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/time/time.h" @@ -16,8 +17,8 @@ #include "chromecast/media/audio/cast_audio_manager.h" #include "chromecast/media/audio/cast_audio_mixer.h" #include "chromecast/media/cma/backend/cma_backend.h" +#include "chromecast/media/cma/base/decoder_buffer_base.h" #include "chromecast/media/cma/test/mock_cma_backend_factory.h" -#include "chromecast/public/media/cast_decoder_buffer.h" #include "chromecast/public/task_runner.h" #include "media/audio/mock_audio_source_callback.h" #include "media/audio/test_audio_thread.h" @@ -71,7 +72,6 @@ pipeline_status_(PIPELINE_STATUS_OK), pending_push_(false), pushed_buffer_count_(0), - last_buffer_(nullptr), delegate_(nullptr) {} ~FakeAudioDecoder() override {} @@ -80,8 +80,8 @@ DCHECK(delegate); delegate_ = delegate; } - BufferStatus PushBuffer(CastDecoderBuffer* buffer) override { - last_buffer_ = buffer; + BufferStatus PushBuffer(scoped_refptr<DecoderBufferBase> buffer) override { + last_buffer_ = std::move(buffer); ++pushed_buffer_count_; switch (pipeline_status_) { @@ -126,7 +126,7 @@ rendering_delay_ = rendering_delay; } unsigned pushed_buffer_count() const { return pushed_buffer_count_; } - CastDecoderBuffer* last_buffer() { return last_buffer_; } + const DecoderBufferBase* last_buffer() { return last_buffer_.get(); } private: const MediaPipelineDeviceParams params_; @@ -136,7 +136,7 @@ PipelineStatus pipeline_status_; bool pending_push_; int pushed_buffer_count_; - CastDecoderBuffer* last_buffer_; + scoped_refptr<DecoderBufferBase> last_buffer_; Delegate* delegate_; RenderingDelay rendering_delay_; }; @@ -387,7 +387,7 @@ ::media::AudioParameters audio_params = GetAudioParams(); const size_t expected_frame_size = static_cast<size_t>(audio_params.GetBytesPerBuffer()); - const CastDecoderBuffer* buffer = audio_decoder->last_buffer(); + const DecoderBufferBase* buffer = audio_decoder->last_buffer(); EXPECT_TRUE(buffer->data()); EXPECT_EQ(expected_frame_size, buffer->data_size()); EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio.
diff --git a/chromecast/media/cma/backend/BUILD.gn b/chromecast/media/cma/backend/BUILD.gn index 87dcd2a7..87e9670 100644 --- a/chromecast/media/cma/backend/BUILD.gn +++ b/chromecast/media/cma/backend/BUILD.gn
@@ -30,6 +30,8 @@ "media_pipeline_backend_manager.h", "media_pipeline_backend_wrapper.cc", "media_pipeline_backend_wrapper.h", + "video_decoder_wrapper.cc", + "video_decoder_wrapper.h", ] public_deps = [
diff --git a/chromecast/media/cma/backend/audio_decoder_software_wrapper_unittest.cc b/chromecast/media/cma/backend/audio_decoder_software_wrapper_unittest.cc index 931ab95..8ea030d 100644 --- a/chromecast/media/cma/backend/audio_decoder_software_wrapper_unittest.cc +++ b/chromecast/media/cma/backend/audio_decoder_software_wrapper_unittest.cc
@@ -5,8 +5,9 @@ #include "chromecast/media/cma/backend/audio_decoder_software_wrapper.h" #include "base/test/scoped_task_environment.h" -#include "chromecast/media/cma/test/mock_cma_backend.h" +#include "chromecast/public/media/cast_decoder_buffer.h" #include "chromecast/public/media/decoder_config.h" +#include "chromecast/public/media/media_pipeline_backend.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -17,13 +18,27 @@ namespace chromecast { namespace media { +namespace { + +class MockAudioDecoder : public MediaPipelineBackend::AudioDecoder { + public: + MOCK_METHOD1(SetDelegate, void(Delegate*)); + MOCK_METHOD1(PushBuffer, BufferStatus(CastDecoderBuffer*)); + MOCK_METHOD1(SetConfig, bool(const AudioConfig&)); + MOCK_METHOD1(SetVolume, bool(float)); + MOCK_METHOD0(GetRenderingDelay, RenderingDelay()); + MOCK_METHOD1(GetStatistics, void(Statistics*)); +}; + +} // namespace + class AudioDecoderSoftwareWrapperTest : public ::testing::Test { public: AudioDecoderSoftwareWrapperTest() : audio_decoder_software_wrapper_(&audio_decoder_) {} base::test::ScopedTaskEnvironment scoped_task_environment_; - MockCmaBackend::AudioDecoder audio_decoder_; + MockAudioDecoder audio_decoder_; AudioDecoderSoftwareWrapper audio_decoder_software_wrapper_; };
diff --git a/chromecast/media/cma/backend/audio_decoder_wrapper.cc b/chromecast/media/cma/backend/audio_decoder_wrapper.cc index 7775fdb..47e8bd1 100644 --- a/chromecast/media/cma/backend/audio_decoder_wrapper.cc +++ b/chromecast/media/cma/backend/audio_decoder_wrapper.cc
@@ -57,14 +57,14 @@ } CmaBackend::BufferStatus AudioDecoderWrapper::PushBuffer( - CastDecoderBuffer* buffer) { + scoped_refptr<DecoderBufferBase> buffer) { if (buffer_delegate_ && buffer_delegate_->IsActive()) { // Mute the decoder, we are sending audio to delegate. if (!delegate_active_) { delegate_active_ = true; decoder_.SetVolume(0.0); } - buffer_delegate_->OnPushBuffer(buffer); + buffer_delegate_->OnPushBuffer(buffer.get()); } else { // Restore original volume. if (delegate_active_) { @@ -75,7 +75,7 @@ } } } - return decoder_.PushBuffer(buffer); + return decoder_.PushBuffer(buffer.get()); } bool AudioDecoderWrapper::SetConfig(const AudioConfig& config) {
diff --git a/chromecast/media/cma/backend/audio_decoder_wrapper.h b/chromecast/media/cma/backend/audio_decoder_wrapper.h index 80808b4..3a7d9f2 100644 --- a/chromecast/media/cma/backend/audio_decoder_wrapper.h +++ b/chromecast/media/cma/backend/audio_decoder_wrapper.h
@@ -6,6 +6,7 @@ #define CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_ #include "base/macros.h" +#include "base/memory/ref_counted.h" #include "chromecast/media/cma/backend/audio_decoder_software_wrapper.h" #include "chromecast/media/cma/backend/cma_backend.h" #include "chromecast/media/cma/backend/media_pipeline_backend_manager.h" @@ -32,7 +33,7 @@ private: // CmaBackend::AudioDecoder implementation: void SetDelegate(Delegate* delegate) override; - BufferStatus PushBuffer(CastDecoderBuffer* buffer) override; + BufferStatus PushBuffer(scoped_refptr<DecoderBufferBase> buffer) override; bool SetConfig(const AudioConfig& config) override; bool SetVolume(float multiplier) override; RenderingDelay GetRenderingDelay() override;
diff --git a/chromecast/media/cma/backend/cma_backend.h b/chromecast/media/cma/backend/cma_backend.h index bd370fa..96e232a 100644 --- a/chromecast/media/cma/backend/cma_backend.h +++ b/chromecast/media/cma/backend/cma_backend.h
@@ -7,6 +7,9 @@ #include <stdint.h> +#include "base/memory/ref_counted.h" +#include "chromecast/media/cma/base/decoder_buffer_base.h" +#include "chromecast/public/media/decoder_config.h" #include "chromecast/public/media/media_pipeline_backend.h" namespace chromecast { @@ -20,11 +23,36 @@ class CmaBackend { public: using BufferStatus = MediaPipelineBackend::BufferStatus; - using Decoder = MediaPipelineBackend::Decoder; - using VideoDecoder = MediaPipelineBackend::VideoDecoder; - class AudioDecoder : public MediaPipelineBackend::AudioDecoder { + class Decoder { public: + using BufferStatus = MediaPipelineBackend::BufferStatus; + using Delegate = MediaPipelineBackend::Decoder::Delegate; + + // These methods have the same behavior as the corresponding methods on + // MediaPipelineBackend::Decoder. + // See chromecast/public/media/media_pipeline_backend.h for documentation. + virtual void SetDelegate(Delegate* delegate) = 0; + virtual BufferStatus PushBuffer( + scoped_refptr<DecoderBufferBase> buffer) = 0; + + protected: + virtual ~Decoder() = default; + }; + + class AudioDecoder : public Decoder { + public: + using RenderingDelay = MediaPipelineBackend::AudioDecoder::RenderingDelay; + using Statistics = MediaPipelineBackend::AudioDecoder::Statistics; + + // These methods have the same behavior as the corresponding methods on + // MediaPipelineBackend::AudioDecoder. + // See chromecast/public/media/media_pipeline_backend.h for documentation. + virtual bool SetConfig(const AudioConfig& config) = 0; + virtual bool SetVolume(float multiplier) = 0; + virtual RenderingDelay GetRenderingDelay() = 0; + virtual void GetStatistics(Statistics* statistics) = 0; + // Returns true if the audio decoder requires that encrypted buffers be // decrypted before being passed to PushBuffer(). The return value may // change whenever SetConfig() is called or the backend is initialized. @@ -34,6 +62,20 @@ ~AudioDecoder() override = default; }; + class VideoDecoder : public Decoder { + public: + using Statistics = MediaPipelineBackend::VideoDecoder::Statistics; + + // These methods have the same behavior as the corresponding methods on + // MediaPipelineBackend::VideoDecoder. + // See chromecast/public/media/media_pipeline_backend.h for documentation. + virtual bool SetConfig(const VideoConfig& config) = 0; + virtual void GetStatistics(Statistics* statistics) = 0; + + protected: + ~VideoDecoder() override = default; + }; + virtual ~CmaBackend() = default; // These methods have the same behavior as the corresponding methods on
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc index a7ccbd4..e365e46 100644 --- a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc +++ b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc
@@ -8,6 +8,7 @@ #include "base/memory/ptr_util.h" #include "chromecast/media/cma/backend/audio_decoder_wrapper.h" #include "chromecast/media/cma/backend/media_pipeline_backend_manager.h" +#include "chromecast/media/cma/backend/video_decoder_wrapper.h" #include "chromecast/public/cast_media_shlib.h" #include "chromecast/public/media/media_pipeline_backend.h" #include "chromecast/public/volume_control.h" @@ -25,7 +26,6 @@ backend_manager_(backend_manager), audio_stream_type_(params.audio_type), content_type_(params.content_type), - have_video_decoder_(false), playing_(false) { DCHECK(backend_); DCHECK(backend_manager_); @@ -39,7 +39,7 @@ backend_manager_->UpdatePlayingAudioCount(IsSfx(), -1); } } - if (have_video_decoder_) { + if (video_decoder_) { backend_manager_->DecrementDecoderCount(DecoderType::VIDEO_DECODER); } } @@ -78,13 +78,18 @@ } CmaBackend::VideoDecoder* MediaPipelineBackendWrapper::CreateVideoDecoder() { - DCHECK(!have_video_decoder_); + DCHECK(!video_decoder_); if (!backend_manager_->IncrementDecoderCount(DecoderType::VIDEO_DECODER)) return nullptr; - have_video_decoder_ = true; + MediaPipelineBackend::VideoDecoder* real_decoder = + backend_->CreateVideoDecoder(); + if (!real_decoder) { + return nullptr; + } - return backend_->CreateVideoDecoder(); + video_decoder_ = std::make_unique<VideoDecoderWrapper>(real_decoder); + return video_decoder_.get(); } bool MediaPipelineBackendWrapper::Initialize() {
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h index e7ad2fd..3bb33f3c 100644 --- a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h +++ b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h
@@ -20,6 +20,7 @@ enum class AudioContentType; class AudioDecoderWrapper; +class VideoDecoderWrapper; class MediaPipelineBackend; class MediaPipelineBackendManager; @@ -57,8 +58,8 @@ const AudioContentType content_type_; std::unique_ptr<AudioDecoderWrapper> audio_decoder_; + std::unique_ptr<VideoDecoderWrapper> video_decoder_; - bool have_video_decoder_; bool playing_; DISALLOW_COPY_AND_ASSIGN(MediaPipelineBackendWrapper);
diff --git a/chromecast/media/cma/backend/video_decoder_wrapper.cc b/chromecast/media/cma/backend/video_decoder_wrapper.cc new file mode 100644 index 0000000..fb92764 --- /dev/null +++ b/chromecast/media/cma/backend/video_decoder_wrapper.cc
@@ -0,0 +1,39 @@ +// 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 "chromecast/media/cma/backend/video_decoder_wrapper.h" + +#include "chromecast/media/cma/base/decoder_buffer_base.h" + +namespace chromecast { +namespace media { + +VideoDecoderWrapper::VideoDecoderWrapper( + MediaPipelineBackend::VideoDecoder* decoder) + : decoder_(decoder) { + DCHECK(decoder_); +} + +VideoDecoderWrapper::~VideoDecoderWrapper() = default; + +void VideoDecoderWrapper::SetDelegate( + media::CmaBackend::VideoDecoder::Delegate* delegate) { + decoder_->SetDelegate(delegate); +} + +media::CmaBackend::BufferStatus VideoDecoderWrapper::PushBuffer( + scoped_refptr<media::DecoderBufferBase> buffer) { + return decoder_->PushBuffer(buffer.get()); +} + +bool VideoDecoderWrapper::SetConfig(const media::VideoConfig& config) { + return decoder_->SetConfig(config); +} + +void VideoDecoderWrapper::GetStatistics(Statistics* statistics) { + decoder_->GetStatistics(statistics); +} + +} // namespace media +} // namespace chromecast
diff --git a/chromecast/media/cma/backend/video_decoder_wrapper.h b/chromecast/media/cma/backend/video_decoder_wrapper.h new file mode 100644 index 0000000..e2be04f0 --- /dev/null +++ b/chromecast/media/cma/backend/video_decoder_wrapper.h
@@ -0,0 +1,38 @@ +// 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 CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_DECODER_WRAPPER_H_ +#define CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_DECODER_WRAPPER_H_ + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "chromecast/media/cma/backend/cma_backend.h" +#include "chromecast/public/media/decoder_config.h" +#include "chromecast/public/media/media_pipeline_backend.h" + +namespace chromecast { +namespace media { +class DecoderBufferBase; + +class VideoDecoderWrapper : public CmaBackend::VideoDecoder { + public: + explicit VideoDecoderWrapper(MediaPipelineBackend::VideoDecoder* decoder); + ~VideoDecoderWrapper() override; + + private: + // CmaBackend::VideoDecoder implementation: + void SetDelegate(Delegate* delegate) override; + BufferStatus PushBuffer(scoped_refptr<DecoderBufferBase> buffer) override; + bool SetConfig(const VideoConfig& config) override; + void GetStatistics(Statistics* statistics) override; + + MediaPipelineBackend::VideoDecoder* const decoder_; + + DISALLOW_COPY_AND_ASSIGN(VideoDecoderWrapper); +}; + +} // namespace media +} // namespace chromecast + +#endif // CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_DECODER_WRAPPER_H_
diff --git a/chromecast/media/cma/pipeline/av_pipeline_impl.cc b/chromecast/media/cma/pipeline/av_pipeline_impl.cc index cab31346..517dc3b 100644 --- a/chromecast/media/cma/pipeline/av_pipeline_impl.cc +++ b/chromecast/media/cma/pipeline/av_pipeline_impl.cc
@@ -277,7 +277,7 @@ pushed_buffer_ = std::move(buffer); - CmaBackend::BufferStatus status = decoder_->PushBuffer(pushed_buffer_.get()); + CmaBackend::BufferStatus status = decoder_->PushBuffer(pushed_buffer_); if (status != CmaBackend::BufferStatus::kBufferPending) OnPushBufferComplete(status);
diff --git a/chromecast/media/cma/test/mock_cma_backend.h b/chromecast/media/cma/test/mock_cma_backend.h index 43361d6..5614f27b 100644 --- a/chromecast/media/cma/test/mock_cma_backend.h +++ b/chromecast/media/cma/test/mock_cma_backend.h
@@ -7,7 +7,9 @@ #include <string> +#include "base/memory/ref_counted.h" #include "chromecast/media/cma/backend/cma_backend.h" +#include "chromecast/media/cma/base/decoder_buffer_base.h" #include "chromecast/public/graphics_types.h" #include "testing/gmock/include/gmock/gmock.h" @@ -33,7 +35,7 @@ AudioDecoder(); ~AudioDecoder() override; MOCK_METHOD1(SetDelegate, void(Delegate*)); - MOCK_METHOD1(PushBuffer, BufferStatus(CastDecoderBuffer*)); + MOCK_METHOD1(PushBuffer, BufferStatus(scoped_refptr<DecoderBufferBase>)); MOCK_METHOD1(SetConfig, bool(const AudioConfig&)); MOCK_METHOD1(SetVolume, bool(float)); MOCK_METHOD0(GetRenderingDelay, RenderingDelay()); @@ -46,7 +48,7 @@ VideoDecoder(); ~VideoDecoder() override; MOCK_METHOD1(SetDelegate, void(Delegate*)); - MOCK_METHOD1(PushBuffer, BufferStatus(CastDecoderBuffer*)); + MOCK_METHOD1(PushBuffer, BufferStatus(scoped_refptr<DecoderBufferBase>)); MOCK_METHOD1(SetConfig, bool(const VideoConfig&)); MOCK_METHOD1(GetStatistics, void(Statistics*)); };
diff --git a/components/autofill/content/common/autofill_driver.mojom b/components/autofill/content/common/autofill_driver.mojom index b867163..711f098 100644 --- a/components/autofill/content/common/autofill_driver.mojom +++ b/components/autofill/content/common/autofill_driver.mojom
@@ -6,7 +6,7 @@ import "components/autofill/content/common/autofill_types.mojom"; import "mojo/public/mojom/base/string16.mojom"; -import "mojo/common/text_direction.mojom"; +import "mojo/public/mojom/base/text_direction.mojom"; import "mojo/public/mojom/base/time.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; import "url/mojom/url.mojom"; @@ -116,7 +116,7 @@ // associated with |key|. The popup will use |text_direction| for displaying // text. ShowPasswordSuggestions(int32 key, - mojo.common.mojom.TextDirection text_direction, + mojo_base.mojom.TextDirection text_direction, mojo_base.mojom.String16 typed_username, int32 options, gfx.mojom.RectF bounds); @@ -124,14 +124,14 @@ // is not secure. The popup will use |text_direction| for displaying // text. This popup is shown when a password form on a non-secure page is // autofilled on page load. - ShowNotSecureWarning(mojo.common.mojom.TextDirection text_direction, + ShowNotSecureWarning(mojo_base.mojom.TextDirection text_direction, gfx.mojom.RectF bounds); // Instructs the browser to show a suggestion, which will redirect the user to // the list of all saved passwords. The popup will use |text_direction| for // displaying text. - ShowManualFallbackSuggestion(mojo.common.mojom.TextDirection text_direction, + ShowManualFallbackSuggestion(mojo_base.mojom.TextDirection text_direction, gfx.mojom.RectF bounds); // Instructs the browser to presave the form with generated password.
diff --git a/components/autofill/content/common/autofill_types.mojom b/components/autofill/content/common/autofill_types.mojom index 61426fa..ba1b719 100644 --- a/components/autofill/content/common/autofill_types.mojom +++ b/components/autofill/content/common/autofill_types.mojom
@@ -4,7 +4,7 @@ module autofill.mojom; -import "mojo/common/text_direction.mojom"; +import "mojo/public/mojom/base/text_direction.mojom"; import "mojo/public/mojom/base/time.mojom"; import "mojo/public/mojom/base/string16.mojom"; import "url/mojom/origin.mojom"; @@ -119,7 +119,7 @@ bool is_focusable; bool should_autocomplete; RoleAttribute role; - mojo.common.mojom.TextDirection text_direction; + mojo_base.mojom.TextDirection text_direction; array<mojo_base.mojom.String16> option_values; array<mojo_base.mojom.String16> option_contents;
diff --git a/components/autofill/content/common/autofill_types_struct_traits.cc b/components/autofill/content/common/autofill_types_struct_traits.cc index aab4414..51e4eeb3 100644 --- a/components/autofill/content/common/autofill_types_struct_traits.cc +++ b/components/autofill/content/common/autofill_types_struct_traits.cc
@@ -5,8 +5,8 @@ #include "components/autofill/content/common/autofill_types_struct_traits.h" #include "base/i18n/rtl.h" -#include "mojo/common/common_custom_types_struct_traits.h" #include "mojo/public/cpp/base/string16_mojom_traits.h" +#include "mojo/public/cpp/base/text_direction_mojom_traits.h" #include "mojo/public/cpp/base/time_mojom_traits.h" #include "url/mojom/origin_mojom_traits.h" #include "url/mojom/url_gurl_mojom_traits.h"
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index 94b68c0..9b25de3 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc
@@ -257,6 +257,7 @@ base::Bind(&MetricsServiceClient::GetStandardUploadInterval, base::Unretained(client_)))); + // Init() has to be called after LogCrash() in order for LogCrash() to work. delegating_provider_.Init(); }
diff --git a/components/metrics/stability_metrics_provider.cc b/components/metrics/stability_metrics_provider.cc index 56a2136..7d411d3e 100644 --- a/components/metrics/stability_metrics_provider.cc +++ b/components/metrics/stability_metrics_provider.cc
@@ -23,23 +23,23 @@ namespace { #if defined(OS_ANDROID) -bool UpdateGmsCoreVersionPref(PrefService* local_state) { +bool HasGmsCoreVersionChanged(PrefService* local_state) { std::string previous_version = local_state->GetString(prefs::kStabilityGmsCoreVersion); std::string current_version = base::android::BuildInfo::GetInstance()->gms_version_code(); // If the last version is empty, treat it as consistent. - if (previous_version.empty()) { - local_state->SetString(prefs::kStabilityGmsCoreVersion, current_version); - return true; - } + if (previous_version.empty()) + return false; - if (previous_version == current_version) - return true; + return previous_version != current_version; +} +void UpdateGmsCoreVersionPref(PrefService* local_state) { + std::string current_version = + base::android::BuildInfo::GetInstance()->gms_version_code(); local_state->SetString(prefs::kStabilityGmsCoreVersion, current_version); - return false; } #endif @@ -74,6 +74,14 @@ #endif } +void StabilityMetricsProvider::Init() { +#if defined(OS_ANDROID) + // This method has to be called after HasGmsCoreVersionChanged() to avoid + // overwriting thie result. + UpdateGmsCoreVersionPref(local_state_); +#endif +} + void StabilityMetricsProvider::ClearSavedStabilityMetrics() { local_state_->SetInteger(prefs::kStabilityCrashCount, 0); local_state_->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); @@ -186,7 +194,7 @@ // On Android, if there is an update for GMS core when Chrome is running, // Chrome will be killed and restart. This is expected and we should only // report crash if the GMS core version has not been changed. - if (UpdateGmsCoreVersionPref(local_state_)) + if (!HasGmsCoreVersionChanged(local_state_)) IncrementPrefValue(prefs::kStabilityCrashCountWithoutGmsCoreUpdate); #endif
diff --git a/components/metrics/stability_metrics_provider.h b/components/metrics/stability_metrics_provider.h index 0e06af8..3aeff631 100644 --- a/components/metrics/stability_metrics_provider.h +++ b/components/metrics/stability_metrics_provider.h
@@ -52,6 +52,7 @@ int GetPrefValue(const char* path, int* value); // MetricsProvider: + void Init() override; void ClearSavedStabilityMetrics() override; void ProvideStabilityMetrics( SystemProfileProto* system_profile_proto) override;
diff --git a/components/omnibox/browser/history_quick_provider_performance_unittest.cc b/components/omnibox/browser/history_quick_provider_performance_unittest.cc index 0bef4305..5fda86c 100644 --- a/components/omnibox/browser/history_quick_provider_performance_unittest.cc +++ b/components/omnibox/browser/history_quick_provider_performance_unittest.cc
@@ -121,9 +121,17 @@ } void HQPPerfTestOnePopularURL::PrepareData() { - // Adding fake urls to db must be done before RebuildFromHistory(). This will - // ensure that the index is properly populated with data from the database. +// Adding fake urls to db must be done before RebuildFromHistory(). This will +// ensure that the index is properly populated with data from the database. +// Note: on debug builds these tests can be slow. Use a smaller data set in +// that case. See crbug.com/822624. +#if defined NDEBUG constexpr size_t kSimilarUrlCount = 10000; +#else + LOG(ERROR) << "HQP performance test is running on a debug build, results may " + "not be accurate."; + constexpr size_t kSimilarUrlCount = 100; +#endif for (size_t i = 0; i < kSimilarUrlCount; ++i) AddFakeURLToHistoryDB(history_backend()->db(), GeneratePopularURLRow());
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc index 803e8f0..f63b73c 100644 --- a/components/omnibox/browser/zero_suggest_provider.cc +++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -133,7 +133,7 @@ return; Stop(true, false); - result_type_running_ = ResultType::NONE; + result_type_running_ = NONE; set_field_trial_triggered(false); set_field_trial_triggered_in_session(false); permanent_text_ = input.text(); @@ -148,7 +148,7 @@ return; result_type_running_ = TypeOfResultToRun(input.current_url(), suggest_url); - if (result_type_running_ == ZeroSuggestProvider::NONE) + if (result_type_running_ == NONE) return; done_ = false; @@ -158,26 +158,25 @@ // suggestions, if based on local browsing history. MaybeUseCachedSuggestions(); - if (result_type_running_ == ZeroSuggestProvider::MOST_VISITED) { + if (result_type_running_ == MOST_VISITED) { most_visited_urls_.clear(); scoped_refptr<history::TopSites> ts = client()->GetTopSites(); if (!ts) { done_ = true; - result_type_running_ = ResultType::NONE; + result_type_running_ = NONE; return; } ts->GetMostVisitedURLs( base::Bind(&ZeroSuggestProvider::OnMostVisitedUrlsAvailable, - weak_ptr_factory_.GetWeakPtr()), + weak_ptr_factory_.GetWeakPtr(), most_visited_request_num_), false); return; } - const std::string current_url = - result_type_running_ == ZeroSuggestProvider::DEFAULT_SERP_FOR_URL - ? current_query_ - : std::string(); + const std::string current_url = result_type_running_ == DEFAULT_SERP_FOR_URL + ? current_query_ + : std::string(); // Create a request for suggestions with |this| as the fetcher delegate. client() ->GetContextualSuggestionsService(/*create_if_necessary=*/true) @@ -201,7 +200,11 @@ if (contextual_suggestions_service != nullptr) { contextual_suggestions_service->StopCreatingContextualSuggestionsRequest(); } + // TODO(krb): It would allow us to remove some guards if we could also cancel + // the TopSites::GetMostVisitedURLs request. done_ = true; + result_type_running_ = NONE; + ++most_visited_request_num_; if (clear_cached_results) { // We do not call Clear() on |results_| to retain |verbatim_relevance| @@ -214,8 +217,6 @@ current_title_.clear(); most_visited_urls_.clear(); } - - result_type_running_ = ZeroSuggestProvider::NONE; } void ZeroSuggestProvider::DeleteMatch(const AutocompleteMatch& match) { @@ -250,7 +251,7 @@ : BaseSearchProvider(AutocompleteProvider::TYPE_ZERO_SUGGEST, client), history_url_provider_(history_url_provider), listener_(listener), - result_type_running_(ResultType::NONE), + result_type_running_(NONE), weak_ptr_factory_(this) { // Record whether contextual zero suggest is possible for this user / profile. const TemplateURLService* template_url_service = @@ -320,7 +321,8 @@ UpdateResults(SearchSuggestionParser::ExtractJsonData(source)); fetcher_.reset(); done_ = true; - result_type_running_ = ZeroSuggestProvider::NONE; + result_type_running_ = NONE; + ++most_visited_request_num_; listener_->OnProviderUpdate(results_updated); } @@ -332,7 +334,7 @@ // When running the personalized service, we want to store suggestion // responses if non-empty. - if (result_type_running_ == ResultType::DEFAULT_SERP && !json_data.empty()) { + if (result_type_running_ == DEFAULT_SERP && !json_data.empty()) { client()->GetPrefs()->SetString(omnibox::kZeroSuggestCachedResults, json_data); @@ -391,13 +393,17 @@ } void ZeroSuggestProvider::OnMostVisitedUrlsAvailable( + size_t orig_request_num, const history::MostVisitedURLList& urls) { - if (result_type_running_ != ResultType::MOST_VISITED) + if (result_type_running_ != MOST_VISITED || + orig_request_num != most_visited_request_num_) { return; + } most_visited_urls_ = urls; done_ = true; ConvertResultsToAutocompleteMatches(); - result_type_running_ = ResultType::NONE; + result_type_running_ = NONE; + ++most_visited_request_num_; listener_->OnProviderUpdate(true); } @@ -432,7 +438,7 @@ UMA_HISTOGRAM_COUNTS("ZeroSuggest.AllResults", num_results); // Show Most Visited results after ZeroSuggest response is received. - if (result_type_running_ == ResultType::MOST_VISITED) { + if (result_type_running_ == MOST_VISITED) { if (!current_url_match_.destination_url.is_valid()) return; matches_.push_back(current_url_match_); @@ -515,7 +521,7 @@ } void ZeroSuggestProvider::MaybeUseCachedSuggestions() { - if (result_type_running_ != ZeroSuggestProvider::DEFAULT_SERP) + if (result_type_running_ != DEFAULT_SERP) return; std::string json_data = @@ -564,24 +570,23 @@ // Check if zero suggestions are allowed in the current context. if (!AllowZeroSuggestSuggestions(current_url)) - return ResultType::NONE; + return NONE; if (OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial()) return PersonalizedServiceShouldFallBackToMostVisited( client()->GetPrefs(), client()->IsAuthenticated(), template_url_service) - ? ResultType::MOST_VISITED - : ResultType::DEFAULT_SERP; + ? MOST_VISITED + : DEFAULT_SERP; if (OmniboxFieldTrial::InZeroSuggestMostVisitedWithoutSerpFieldTrial() && client() ->GetTemplateURLService() ->IsSearchResultsPageFromDefaultSearchProvider(current_url)) - return ResultType::NONE; + return NONE; if (OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial()) - return ResultType::MOST_VISITED; + return MOST_VISITED; - return can_send_current_url ? ResultType::DEFAULT_SERP_FOR_URL - : ResultType::NONE; + return can_send_current_url ? DEFAULT_SERP_FOR_URL : NONE; }
diff --git a/components/omnibox/browser/zero_suggest_provider.h b/components/omnibox/browser/zero_suggest_provider.h index d27e5250..3a46e0ef 100644 --- a/components/omnibox/browser/zero_suggest_provider.h +++ b/components/omnibox/browser/zero_suggest_provider.h
@@ -131,7 +131,8 @@ // When the user is in the Most Visited field trial, we ask the TopSites // service for the most visited URLs. It then calls back to this function to // return those |urls|. - void OnMostVisitedUrlsAvailable(const history::MostVisitedURLList& urls); + void OnMostVisitedUrlsAvailable(size_t request_num, + const history::MostVisitedURLList& urls); // When the user is in the contextual omnibox suggestions field trial, we ask // the ContextualSuggestionsService for a fetcher to retrieve recommendations. @@ -163,6 +164,9 @@ // When the provider is not running, the result type is set to NONE. ResultType result_type_running_; + // For reconciling asynchronous requests for most visited URLs. + size_t most_visited_request_num_ = 0; + // The URL for which a suggestion fetch is pending. std::string current_query_;
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc index f516833..09b6189 100644 --- a/components/omnibox/browser/zero_suggest_provider_unittest.cc +++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -4,6 +4,7 @@ #include "components/omnibox/browser/zero_suggest_provider.h" +#include <list> #include <map> #include <memory> #include <string> @@ -86,11 +87,19 @@ // RefcountedKeyedService: void ShutdownOnUIThread() override {} - // A test-specific field for controlling when most visited callback is run - // after top sites have been requested. - GetMostVisitedURLsCallback mv_callback; + // Only runs a single callback, so that the test can specify a different + // set per call. + void RunACallback(const history::MostVisitedURLList& urls) { + DCHECK(!callbacks.empty()); + callbacks.front().Run(urls); + callbacks.pop_front(); + } protected: + // A test-specific field for controlling when most visited callback is run + // after top sites have been requested. + std::list<GetMostVisitedURLsCallback> callbacks; + ~FakeEmptyTopSites() override {} DISALLOW_COPY_AND_ASSIGN(FakeEmptyTopSites); @@ -99,7 +108,7 @@ void FakeEmptyTopSites::GetMostVisitedURLs( const GetMostVisitedURLsCallback& callback, bool include_forced_urls) { - mv_callback = callback; + callbacks.push_back(callback); } class FakeAutocompleteProviderClient : public MockAutocompleteProviderClient { @@ -281,7 +290,7 @@ provider_->Start(input, false); EXPECT_TRUE(provider_->matches().empty()); scoped_refptr<history::TopSites> top_sites = client_->GetTopSites(); - static_cast<FakeEmptyTopSites*>(top_sites.get())->mv_callback.Run(urls); + static_cast<FakeEmptyTopSites*>(top_sites.get())->RunACallback(urls); // Should have verbatim match + most visited url match. EXPECT_EQ(2U, provider_->matches().size()); provider_->Stop(false, false); @@ -291,8 +300,23 @@ EXPECT_TRUE(provider_->matches().empty()); // Most visited results arriving after Stop() has been called, ensure they // are not displayed. - static_cast<FakeEmptyTopSites*>(top_sites.get())->mv_callback.Run(urls); + static_cast<FakeEmptyTopSites*>(top_sites.get())->RunACallback(urls); EXPECT_TRUE(provider_->matches().empty()); + + history::MostVisitedURLList urls2; + urls2.push_back(history::MostVisitedURL(GURL("http://bar.com/"), + base::ASCIIToUTF16("Bar"))); + urls2.push_back(history::MostVisitedURL(GURL("http://zinga.com/"), + base::ASCIIToUTF16("Zinga"))); + provider_->Start(input, false); + provider_->Stop(false, false); + provider_->Start(input, false); + static_cast<FakeEmptyTopSites*>(top_sites.get())->RunACallback(urls); + // Stale results should get rejected. + EXPECT_TRUE(provider_->matches().empty()); + static_cast<FakeEmptyTopSites*>(top_sites.get())->RunACallback(urls2); + EXPECT_FALSE(provider_->matches().empty()); + provider_->Stop(false, false); } TEST_F(ZeroSuggestProviderTest, TestMostVisitedNavigateToSearchPage) { @@ -326,7 +350,7 @@ EXPECT_TRUE(provider_->matches().empty()); // Most visited results arriving after a new request has been started. scoped_refptr<history::TopSites> top_sites = client_->GetTopSites(); - static_cast<FakeEmptyTopSites*>(top_sites.get())->mv_callback.Run(urls); + static_cast<FakeEmptyTopSites*>(top_sites.get())->RunACallback(urls); EXPECT_TRUE(provider_->matches().empty()); }
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 96b9846..600785da 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -11354,7 +11354,7 @@ 'example_value': 604800000, 'desc': '''Allows you to set the time period over which <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> relaunch notifications are shown to apply a pending update. - This policy setting can be used to control the time period, in milliseconds, over which a user is progressively informed that <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> must be relaunched (or <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> must be restarted) for an update. Over this time period, the user will be repeatedly informed of the need for an update based on the setting of the <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME">RelaunchNotification</ph> policy. If not set, the default period of 604800000 milliseconds (one week) is used.''', + This policy setting can be used to control the time period, in milliseconds, over which a user is progressively informed that <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> must be relaunched (or <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> must be restarted) for an update. Over this time period, the user will be repeatedly informed of the need for an update based on the setting of the <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME">RelaunchNotification</ph> policy. If not set, the default period of 345600000 milliseconds (four days) is used for <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> and 604800000 milliseconds (one week) for all other platforms.''', }, { 'name': 'VirtualMachinesAllowed',
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index 713ce388..fa15cc9 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -300,14 +300,6 @@ ይህ የመመሪያ ቅንብር የአሳሽ ዳግም መጀመር የሚመከር ወይም የሚያስፈልግ መሆኑን ለተጠቃሚው የሚያሳውቅ ማሳወቂያን ያነቃል። ካልተዋቀረ <ph name="PRODUCT_NAME" /> በምናሌው ላይ በሚደረጉ አነስተኛ ለውጦች አማካኝነት ዳግም መጀመር የሚያስፈልግ መሆኑን ለተጤቃሚው ያመለክታል። ወደ «የሚመከር» ከተዋቀረ ዳግም መጀመር የሚመከር መሆኑን የሚያሳይ ተደጋጋሚ ማስጠንቀቂያ ለተጠቃሚው እንዲታይ ይደረጋል። ተጠቃሚው ዳግም ማስጀመሩን ለበኋላ ለማቆየት ይህን ማስጠንቀቂያ ማሰናበት ይችላል። ወደ «የሚያስፈልግ» ከተዋቀረ የማሳወቂያ ጊዜው ካለፈ በኋላ አሳሹ በግዴታ ዳግም የሚጀመር መሆኑን ለተጠቃሚው የሚያመለክት ተደጋጋሚ ማስጠንቀቂያ ይታያል። ይህ ጊዜ በነባሪነት ሰባት ቀኖች ነው፣ እና በ<ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> መመሪያ ቅንብሩ በኩል ሊዋቀር ይችላል። ዳግም መጀመሩ ተከትሎ የተጠቃሚው ክፍለ-ጊዜ ወደነበረበት ይመለሳል።</translation> -<translation id="2075434678547407637">ቪዲዮዎች (ያለ ተጠቃሚ ፈቃድ) ከኦዲዮ ይዘት ጋር በ<ph name="PRODUCT_NAME" /> ውስጥ ቪዲዮዎች በራስሰር ማጫወት ይችሉ እንደሆነ እንዲቆጣጠሩ ይፈቅድልዎታል። - - መመሪያው ወደ እውነት ከተቀናበረ <ph name="PRODUCT_NAME" /> ማህደረ መረጃን በራስሰር እንዲያጫውት ይፈቀድለታል። - መመሪያው ወደ ሐሰት ከተቀናበረ <ph name="PRODUCT_NAME" /> ማህደረ መረጃን በራስሰር እንዲያጫውት አይፈቀድለትም። - በነባሪ፣ <ph name="PRODUCT_NAME" /> ማህደረ መረጃን በራስሰር እንዲያጫውት አይፈቀድለትም። - - <ph name="PRODUCT_NAME" /> እየሠራ ከሆነ እና ይህ መመሪያ ከተለወጠ፣ በአዲስ በተከፈቱ ትሮች ላይ ብቻ ተፈጻሚ እንደሚሆን ልብ ይበሉ። በመሆኑም አንዳንድ ትሮች አሁንም ድረስ ቀደም ሲል የነበረውን ባሕሪ ሊያሳዩ ይችሉ ይሆናል። - </translation> <translation id="2077129598763517140">ሲገኝ የሃርድዌር ማጣደፍን ተጠቀም</translation> <translation id="2077273864382355561">በባትሪ ኃይል ላይ ሲሆን የማያ ገጽ መጥፋት መዘግየት</translation> <translation id="2082205219176343977">ለመሣሪያው የተፈቀደው ዝቅተኛው የChrome ስሪት ያዋቅሩ።</translation> @@ -352,9 +344,6 @@ ይህ ቅንብር ከተዋቀረ ፈጣን መክፈትን የሚጠቀሙ ተጠቃሚዎች በዚህ ቅንብር መሠረት የይለፍ ቃላታቸውን በማያ ገጽ ቁልፍው ላይ እንዲያስገቡ ይጠየቃሉ። ይህ ቅንብር ካልተዋቀረ ፈጣን መክፈትን የሚጠቀሙ ተጠቃሚዎች በየቀዩ በማያ ገጽ ቁልፍው ላይ የይለፍ ቃል እንዲያስገቡ ይጠየቃሉ።</translation> -<translation id="2188722565665306629">የ<ph name="PRODUCT_NAME" /> ዳግም መጀመር ማሳወቂያዎች በመጠባበቅ ላይ ያለ ዝማኔ ላይ የሚተገበሩበት የጊዜ እንዲያዋቅሩ ያስችልዎታል። - - ይህ መመሪያ አንድ ተጠቃሚ ለዝማኔ <ph name="PRODUCT_NAME" /> ዳግም መጀመር እንዳለበት (ወይም <ph name="PRODUCT_OS_NAME" /> ዳግም መጀመር እንዳለበት) በተከታታይነት የሚነገርባቸው ጊዜን በሚሊሰከንዶች ለመቆጣጠር ስራ ላይ መዋል ይችላል። በዚህ ጊዜ ላይ ተጠቃሚው በ<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> መመሪያው ላይ በመመስረት የዝማኔው አስፈላጊነት በተደጋጋሚነት ይነገረዋል። ካልተዋቀረ ነባሪ የሆነ 604800000 ሚሊሰከንዶች (አንድ ሳምንት) ስራ ላይ ይውላል።</translation> <translation id="2194470398825717446">ይህ መመሪያ በM61 ውስጥ ተቋርጧል፣ እባክዎ በምትኩ EcryptfsMigrationStrategyን ይጠቀሙ። ከecryptfs ጋር የመጣ እና ወደ የext4 ምስጠራ መፍለስ ያለበት አንድ መሣሪያ ምን አይነት ባህሪ ማሳየት እንዳለበት ይገልጻል።
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb index 89498cd..23bcd54 100644 --- a/components/policy/resources/policy_templates_ar.xtb +++ b/components/policy/resources/policy_templates_ar.xtb
@@ -295,14 +295,6 @@ يعمل تعيين هذه السياسة على تفعيل الإشعارات لإخبار المستخدم بأن إعادة تشغيل المتصفح موصى بها أو مطلوبة. وفي حال عدم تعيين هذه السياسة، يشير <ph name="PRODUCT_NAME" /> إلى المستخدم بأنه يلزم إعادة التشغيل عبر إجراء تغييرات دقيقة بالقائمة. وفي حال التعيين على "موصى به"، سيتم عرض رسالة تحذير مكررة على المستخدم تخبره بأن إعادة التشغيل موصى بها. ويمكن للمستخدم رفض هذا التحذير لتأجيل عملية إعادة التشغيل. وفي حال التعيين على "مطلوب"، سيتم عرض رسالة تحذير مكررة على المستخدم تشير إلى أنه سيتم فرض إعادة تشغيل المتصفح فور انتهاء مدة الإشعار. وتكون هذه المدة سبعة أيام بشكلٍ تلقائي ويمكن تهيئتها عبر تعيين السياسة <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. تتم استعادة جلسة المستخدم بعد إعادة التشغيل.</translation> -<translation id="2075434678547407637">تسمح لك هذه السياسة بالتحكم بتشغيل الفيديوهات تلقائيًا (بدون موافقة المستخدم) مع المحتوى الصوتي في <ph name="PRODUCT_NAME" />. - - في حال تعيين السياسة على الوضع "true"، يتم السماح لـ <ph name="PRODUCT_NAME" /> بتشغيل الوسائط تلقائيًا. - في حال تعيين السياسة على الوضع "false"، لا يتم السماح لـ <ph name="PRODUCT_NAME" /> بتشغيل الوسائط تلقائيًا. - في الإعداد الأساسي، لا يُسمح لـ <ph name="PRODUCT_NAME" /> بتشغيل الوسائط تلقائيًا. - - تجدر الإشارة إلى أنه في حال تغيير هذه السياسة خلال تشغيل <ph name="PRODUCT_NAME" />، فإنها تُطبَّق فقط على علامات التبويب الجديدة، لذلك قد تستمر بعض علامات التبويب في اتباع الإعدادات السابقة. - </translation> <translation id="2077129598763517140">استخدام تسريع الأجهزة عند توفره</translation> <translation id="2077273864382355561">مهلة إيقاف تشغيل الشاشة عند استخدام طاقة البطارية</translation> <translation id="2082205219176343977">تهيئة أدنى إصدار Chrome مسموح به للجهاز.</translation> @@ -347,9 +339,6 @@ إذا تمت تهيئة هذا الإعداد، فستتم مطالبة المستخدمين الذين يستخدمون إلغاء القفل السريع بإدخال كلمات المرور التابعة لهم في شاشة التأمين بناءً على هذا الإعداد. إذا لم تتم تهيئة هذا الإعداد، فستتم مطالبة المستخدمين الذين يستخدمون إلغاء القفل السريع بإدخال كلمات المرور التابعة لهم في شاشة التأمين كل يوم.</translation> -<translation id="2188722565665306629">تسمح لك بتعيين الفترة الزمنية التي يتم من خلالها عرض إشعارات إعادة تشغيل <ph name="PRODUCT_NAME" /> لتطبيق التحديث المعلّق. - - يمكن استخدام تعيين هذه السياسة للتحكم في الفترة الزمنية التي تقدر بالمللي ثانية، والتي يتم خلالها إبلاغ أحد المستخدمين بشكلٍ تدريجي بأنه يجب إعادة تشغيل <ph name="PRODUCT_NAME" /> (أو يجب إعادة تشغيل <ph name="PRODUCT_OS_NAME" />) لتطبيق أحد التحديثات. وخلال هذه الفترة الزمنية، سيتم إبلاغ المستخدم بشكلٍ متكرر بشأن ضرورة تطبيق أحد التحديثات استنادًا إلى تعيين السياسة <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. وفي حال عدم التعيين، يتم استخدام الفترة التلقائية 604800000 مللي ثانية (أسبوع واحد).</translation> <translation id="2194470398825717446">تم إيقاف تلك السياسة في M61. يُرجى استخدام إستراتيجية EcryptfsMigrationStrategy بدلاً من ذلك. @@ -1056,6 +1045,13 @@ <translation id="4482640907922304445">لعرض زر الصفحة الرئيسية في شريط أدوات <ph name="PRODUCT_NAME" />. إذا تم تمكين هذا الإعداد، فسيتم عرض زر الصفحة الرئيسية دائمًا. إذا تم تعطيل هذا الإعداد، فلن يتم عرض زر الصفحة الرئيسية مطلقًا. إذا تم تمكين هذا الإعداد أو تعطيله، فلن يتمكن المستخدمون من تغييره أو تجاوزه في <ph name="PRODUCT_NAME" />. سيؤدي ترك هذه السياسة بدون تعيين إلى السماح للمستخدم باختيار عرض زر الصفحة الرئيسية أو عدم عرضه.</translation> <translation id="4485425108474077672">تهيئة عنوان URL لصفحة علامة التبويب الجديدة</translation> <translation id="4492287494009043413">تعطيل التقاط لقطات الشاشة</translation> +<translation id="4497968613298501984">يمكنك تهيئة قائمة بعناوين URL لصفحة تسجيل الدخول للمؤسسة (مخططات HTTP وHTTPS فقط). سيتم الحصول على الملف المرجعي لكلمة المرور من عناوين URL هذه واستخدامه لرصد إعادة استخدام كلمة المرور. + يجب استخدام هذا الإعداد بواسطة مستخدمي G Suite فقط باستخدام نظام الدخول الموحّد (SSO)/SMAL. + وليتمكن <ph name="PRODUCT_NAME" /> من الحصول على الملفات المرجعية لكلمات المرور بشكلٍ صحيح، يُرجى التأكد من اتباع صفحات تسجيل الدخول للإرشادات الواردة في https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + إذا تم تفعيل هذا الإعداد، ستحصل خدمة "حماية كلمات المرور" على الملف المرجعي لكلمة المرور من عناوين URL هذه بغرض رصد إعادة استخدام كلمة المرور. + إذا تم إيقاف هذا الإعداد أو لم يتم تعيينه، ستحصل خدمة "حماية كلمات المرور" على الملف المرجعي لكلمة المرور فقط على https://accounts.google.com. + لا تتوفر هذه السياسة على النسخ الافتراضية لنظام التشغيل Windows غير الملحقة بنطاق <ph name="MS_AD_NAME" />.</translation> <translation id="450537894712826981">لتهيئة حجم ذاكرة التخزين المؤقت التي سيستخدمها <ph name="PRODUCT_NAME" /> لتخزين ملفات الوسائط المخزنة مؤقتًا في القرص. في حالة تعيين هذه السياسة، سيستخدم <ph name="PRODUCT_NAME" /> حجم ذاكرة التخزين المؤقت المتوفرة بصرف النظر عما إذا كان المستخدم قد حدد العلامة '--media-cache-size' أم لا. علمًا بأن القيمة المحددة في هذه السياسة لا تعد حدًا صارمًا لكنها تمثل اقتراحًا إلى نظام التخزين المؤقت، كما أن استخدام قيمة أقل من عدة وحدات ميغابايت ستكون أصغر من اللازم وسيتم تقريبها إلى حد أدنى معقول. @@ -1169,6 +1165,13 @@ إذا تم ترك هذه السياسة بدون تعيينها أو تركها فارغة، فسيتمكن أي مستخدم من تسجيل الدخول إلى <ph name="PRODUCT_NAME" />.</translation> <translation id="4858735034935305895">السماح بوضع ملء الشاشة</translation> +<translation id="4868249328547841081">يمكنك تهيئة عنوان URL لتغيير كلمة المرور (مخططات HTTP وHTTPS فقط). وستوجه خدمة "حماية كلمات المرور" المستخدمين إلى عنوان URL هذا لتغيير كلمات المرور في حال حدوث تصيّد احتيالي. + يجب استخدام هذا الإعداد بواسطة مستخدمي G Suite فقط باستخدام نظام الدخول الموحد (SSO)/SAML. + وليتمكن <ph name="PRODUCT_NAME" /> من الحصول على الملف المرجعي لكلمة المرور الجديدة بشكلٍ صحيح في صفحة تغيير كلمة المرور هذه، يُرجى التأكد من اتباع صفحة تغيير كلمة المرور للإرشادات الواردة في https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + إذا تم تفعيل هذا الإعداد، ستوجه خدمة "حماية كلمات المرور" المستخدمين إلى عنوان URL هذا لتغيير كلمات المرور في حال حدوث تصيد احتيالي. + إذا تم إيقاف هذا الإعداد أو لم يتم تعيينه، ستوجه خدمة "حماية كلمات المرور" المستخدمين إلى https://myaccounts.google.com لتغيير كلمة مرورهم. + لا تتوفر هذه السياسة على النسخ الافتراضية لنظام التشغيل Windows غير المُلحقة بنطاق <ph name="MS_AD_NAME" />.</translation> <translation id="4869787217450099946">لتحديد ما إذا كانت مفاتيح قفل تشغيل الشاشة مسموح بها أم لا. يمكن أن تطلب الإضافات مفاتيح قفل تشغيل الشاشة عبر واجهة برمجة التطبيقات للإضافة المعنية بإدارة الطاقة. في حالة ضبط هذه السياسة على true أو عدم ضبطها على أي قيمة، سيتم السماح باستخدام مفاتيح قفل تشغيل الشاشة لإدارة الطاقة.
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb index 8e25649..c279440 100644 --- a/components/policy/resources/policy_templates_bg.xtb +++ b/components/policy/resources/policy_templates_bg.xtb
@@ -286,14 +286,6 @@ С настройката на това правило се активират известията, които уведомяват потребителя, че повторното стартиране на браузъра е препоръчително или задължително. Ако тя не бъде зададена, необходимостта от рестартиране се указва чрез малки промени в менюто на <ph name="PRODUCT_NAME" />. При задаване на „Recommended“ периодично ще се извежда предупреждение, че повторното стартиране е препоръчително. Потребителят може да отхвърли предупреждението, за да отложи рестартирането. При „Required“ периодичното предупреждение ще указва, че браузърът ще бъде рестартиран принудително след края на периода на известяване. Продължителността на този период е седем дни по подразбиране и може да бъде конфигурирана чрез правилото <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Потребителската сесия се възстановява след повторното стартиране.</translation> -<translation id="2075434678547407637">Позволява ви да контролирате дали видеоклиповете могат да се възпроизвеждат автоматично (без съгласието на потребителя) с аудиосъдържание в/ъв <ph name="PRODUCT_NAME" />. - - Ако за правилото е зададено True, автоматичното възпроизвеждане на мултимедия в/ъв <ph name="PRODUCT_NAME" /> е разрешено. - При False тази опция не е разрешена в/ъв <ph name="PRODUCT_NAME" />. - По подразбиране автоматичното възпроизвеждане на мултимедия в/ъв <ph name="PRODUCT_NAME" /> не е разрешено. - - Обърнете внимание, че ако това правило бъде променено, докато <ph name="PRODUCT_NAME" /> се изпълнява, то ще се прилага само за новите отворени раздели. Следователно при някои раздели все още може да се наблюдава предишното поведение. - </translation> <translation id="2077129598763517140">Да се използва хардуерно ускорение, когато е налице</translation> <translation id="2077273864382355561">Забавяне преди изключване на екрана при работа на батерия</translation> <translation id="2082205219176343977">Конфигуриране на най-ниската разрешена версия на Chrome за устройството.</translation> @@ -338,9 +330,6 @@ Ако настройката е конфигурирана, потребителите на бързо отключване ще трябва да въвеждат паролите си на заключения екран толкова често, колкото е указано в нея. В случай че тя не е конфигурирана, потребителите ще трябва да въвеждат паролата си всеки ден.</translation> -<translation id="2188722565665306629">Дава възможност да зададете периода от време за показване на известията за повторно стартиране на <ph name="PRODUCT_NAME" /> с цел прилагане на изчакваща актуализация. - -Настройката на това правило служи за контролиране на времевия интервал в милисекунди, в рамките на който потребителят периодично да бъде информиран, че трябва да стартира отново <ph name="PRODUCT_NAME" /> (т.е. да рестартира <ph name="PRODUCT_OS_NAME" />), за да се инсталира актуализация. По време на този период потребителят ще бъде уведомяван неколкократно за необходимостта от актуализиране въз основа на настройката на правилото <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Ако периодът не бъде зададен, ще се използва стандартният, който е 604800000 милисекунди (една седмица).</translation> <translation id="2194470398825717446">Това правило е оттеглено в M61. Вместо това, моля, използвайте EcryptfsMigrationStrategy. Определя поведението на устройство, доставено с ecryptfs, което трябва да премине към шифроване в ext4.
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index 9eda032..e966061 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -103,7 +103,7 @@ <translation id="1353966721814789986">প্রারম্ভ পৃষ্ঠা</translation> <translation id="1354452738176731363">যখন এই নীতি মিথ্যাতে সেট করা হয়, ব্যবহারকারী লগ-ইন করা থাকলে ডিভাইসে অডিও আউটপুট থাকবে না। - এই নীতি শুধুমাত্র বিল্ট-ইন স্পিকারকেই নয়, সব ধরণের অডিও আউটপুটকে প্রভাবিত করে। এই নীতির মাধ্যমে অডিও অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলিও রোধ করা হয়। যদি কোনও ব্যবহারকারীর স্ক্রিন রিডার প্রয়োজন হয় তাহলে এই নীতি সক্ষম করবেন না। + এই নীতি শুধুমাত্র অন্তর্ভুক্ত স্পিকারকেই নয়, সব ধরণের অডিও আউটপুটকে প্রভাবিত করে। এই নীতির মাধ্যমে অডিও অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলিও রোধ করা হয়। যদি কোনও ব্যবহারকারীর স্ক্রিন রিডার প্রয়োজন হয় তাহলে এই নীতি সক্ষম করবেন না। যদি এই সেটিংটি সত্যতে সেট করা থাকে বা কনফিগার না করে রাখা হয় তাহলে ব্যবহারকারীরা তাদের ডিভাইসে যে সমস্ত অডিও আউটপুট কাজ করে সেগুলি ব্যবহার করতে পারবেন।</translation> <translation id="1359553908012294236">এই নীতিটি সত্যতে সেট থাকলে বা কনফিগার করা না থাকলে, <ph name="PRODUCT_NAME" /> অতিথি লগইন সক্ষম করবে। অতিথি লগইন হলো <ph name="PRODUCT_NAME" /> প্রোফাইল যেখানে সব উইন্ডোগুলি ছদ্মবেশী মোডে থাকে। @@ -196,7 +196,7 @@ <translation id="1509692106376861764"><ph name="PRODUCT_NAME" /> ২৯ সংস্করণে এই নীতিটি সরানো হয়েছে৷</translation> <translation id="1519337829779572350">এই সেটিংসটি শীঘ্রই বন্ধ হয়ে যাবে, এর পরিবর্তে SafeBrowsingExtendedReportingEnabled ব্যবহার করুন SafeBrowsingExtendedReportingEnabled চালু অথবা বন্ধ করার অর্থ হল 'ফল্সে' SafeBrowsingExtendedReportingOptInAllowed সেট করার সমান। - এই নীতিটি 'ফল্সে' সেট করলে ব্যবহারকারীরা চাইলেও সিস্টেমের কিছু তথ্য এবং পৃষ্ঠার কিছু কন্টেন্ট Google এর সার্ভারে আর পাঠাতে পারবেন না। এটি 'ট্রুতে' সেট করলে বা কনফিগার না করলে বিপজ্জনক অ্যাপ এবং সাইট শনাক্ত করার কাজে সাহায্য করার জন্য ব্যবহারকারীরা সিস্টেমের কিছু তথ্য এবং পৃষ্ঠার কিছু কন্টেন্ট নিরাপদ ব্রাউজিং এ পাঠাতে পারবেন। + এই নীতিটি 'ফল্সে' সেট করলে ব্যবহারকারীরা চাইলেও সিস্টেমের কিছু তথ্য এবং পৃষ্ঠার কিছু কন্টেন্ট Google এর সার্ভারে আর পাঠাতে পারবেন না। এটি 'ট্রুতে' সেট করলে বা কনফিগার না করলে বিপজ্জনক অ্যাপ এবং সাইট শনাক্ত করার কাজে সাহায্য করার জন্য ব্যবহারকারীরা সিস্টেমের কিছু তথ্য এবং পৃষ্ঠার কিছু কন্টেন্ট নিরাপদ ব্রাউজিং এ পাঠাতে পারবেন। নিরাপদ ব্রাউজিং এর বিষয়ে আরও জানতে https://developers.google.com/safe-browsing এ যান।</translation> <translation id="1522425503138261032">ব্যবহারকারীর শারীরিক অবস্থান ট্র্যাক করতে সাইটগুলিকে অনুমতি দিন</translation> @@ -354,14 +354,6 @@ ব্রাউজার রিলঞ্চ করা প্রয়োজন অথবা করলে ভাল হয়, তা ব্যবহারকারীকে জানানোর জন্য বিজ্ঞপ্তি পাঠানো হবে কিনা তা এই নীতির সেটিংস অনুযায়ী নির্ধারণ করা হয়। সেট করা না হলে মেনুতে সূক্ষ্ম পরিবর্তনের মাধ্যমে <ph name="PRODUCT_NAME" /> ব্যবহারকারীকে বোঝানোর চেষ্টা করে যে রিলঞ্চ করা প্রয়োজন। 'প্রস্তাবিত' সেটিংস বেছে নিলে ব্যবহারকারীকে বারবার সতর্কবার্তা দেখিয়ে বলা হয় যে রিলঞ্চ করার পরামর্শ দেওয়া হচ্ছে। রিলঞ্চ পিছিয়ে দিতে চাইলে ব্যবহারকারী সতর্কবার্তাগুলি খারিজ করে দিতে পারেন। 'প্রয়োজন' সেটিংস বেছে নিলে বারবার সতর্কবার্তা দেখিয়ে বোঝানো হবে যে বিজ্ঞপ্তির সময়সীমা পেরিয়ে গেলে ব্রাউজার নিজে থেকে রিলঞ্চ করা হবে। এই সময়সীমা স্বভাবত ৭ দিন হিসেবে ধরা হয় এবং <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> নীতির সেটিং থেকে এটি কনফিগার করা যায়। রিলঞ্চের পরে ব্যবহারকারীর সেশন যেখানে বন্ধ করা হয়েছিল সেখান থেকেই আবার চালু করা হয়।</translation> -<translation id="2075434678547407637"><ph name="PRODUCT_NAME" /> এ অডিও কন্টেন্ট সহ ভিডিও নিজে থেকেই চালানো যায় (ব্যবহারকারীর সম্মতি ছাড়াই) সেইক্ষেত্রে আপনাকে সেগুলি নিয়ন্ত্রণের অনুমতি দেয়। - - যদি নীতিটি 'ট্রুতে' সেট করা থাকে তাহলে <ph name="PRODUCT_NAME" /> মিডিয়া অটোপ্লেতে অনুমতি দেয়। - যদি নীতিটি 'ফল্সে' সেট করা থাকে তাহলে <ph name="PRODUCT_NAME" /> মিডিয়া অটোপ্লেতে অনুমতি দেয় না। - স্বভাবত <ph name="PRODUCT_NAME" /> মিডিয়া অটোপ্লেতে অনুমতি দেয় না। - - মনে রাখবেন যদি <ph name="PRODUCT_NAME" /> এটি চালু থাকে এবং নীতিটি পরিবর্তন করা হয় তাহলে সেটি খোলা নতুন ট্যাবেই প্রয়োগ করা হবে। ততক্ষণ পর্যন্ত কিছু ট্যাব তাদের পুরনো নীতিতেই চলবে। - </translation> <translation id="2077129598763517140">যখনই উপলব্ধ তখন হার্ডওয়্যার অ্যাক্সিলারেশন ব্যবহার করুন</translation> <translation id="2077273864382355561">AC পাওয়ার চলাকালীন স্ক্রীন বন্ধে বিলম্ব</translation> <translation id="2082205219176343977">ডিভাইসের জন্য সর্বনিম্ন অনুমোদিত Chrome ভার্সন কনফিগার করুন</translation> @@ -407,9 +399,6 @@ এই সেটিংটি কনফিগার করা হলে, যেসব ব্যবহারকারী দ্রুত আনলক ব্যবহার করবেন তাদেরকে সেটিং অনুযায়ী লক স্ক্রীনে তাদের পাসওয়ার্ড লিখতে অনুরোধ করা হবে। এই সেটিংটি কনফিগার না করা হলে, যেসব ব্যবহারকারী দ্রুত আনলক ব্যবহার করবেন তাদেরকে প্রতিদিন লক স্ক্রীনে তাদের পাসওয়ার্ড লিখতে অনুরোধ করা হবে।</translation> -<translation id="2188722565665306629">বাকি থাকা আপডেট প্রয়োগ করার আগে কতদিন ধরে <ph name="PRODUCT_NAME" /> রিলঞ্চের বিজ্ঞপ্তি দেখানো হবে, তা এর মাধ্যমে সেট করা যায়। - - আপডেটের জন্য <ph name="PRODUCT_NAME" /> রিলঞ্চ করতে হবে (অথবা <ph name="PRODUCT_OS_NAME" /> রিস্টার্ট করতে হবে), তা কতক্ষণ ধরে ব্যবহারকারীকে ক্রমাগত মনে করিয়ে যাওয়া হবে, সেটি এই নীতির সেটিংসের মাধ্যমে মিলিসেকেন্ডের হিসেবে নির্ধারণ করা যায়। এই সময়সীমার মধ্যে <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> এর নীতির সেটিং অনুযায়ী ব্যবহারকারীকে বারবার আপডেটের প্রয়োজনীয়তার কথা জানিয়ে যাওয়া হবে। নীতিটি সেট করা না হলে ডিফল্ট মান হিসেবে ৬০৪৮০০০০০ মিলিসেকেন্ড (এক সপ্তাহ) বেছে নেওয়া হবে।</translation> <translation id="2194470398825717446">M61 এ এই নীতিটি আর ব্যবহার করা হচ্ছে না, অনুগ্রহ করে এর পরিবর্তে EcryptfsMigrationStrategy ব্যবহার করুন। ecryptfs এ থাকা কোনও ডিভাইস কিভাবে আচরণ করবে এটি তা উল্লেখ করে এবং সেটি ext4 এনক্রিপশনে রূপান্তর করতে হবে। @@ -426,7 +415,7 @@ যখন এই নীতি অক্ষম করা থাকে তখন ব্যবহারকারীকে কখনই বিজ্ঞাপিত করা হবে না এবং শুধুমাত্র VideoCaptureAllowedUrls এ কনফিগার করা URLগুলিতে ভিডিও ক্যাপচার উপলব্ধ থাকে। - এই নীতি শুধুমাত্র বিল্ট-ইন ক্যামেরার ইনপুটকেই নয়, উপরন্তু সব ধরণের ভিডিও ইনপুটকে প্রভাবিত করে।</translation> + এই নীতি শুধুমাত্র অন্তর্ভুক্ত ক্যামেরার ইনপুটকেই নয়, উপরন্তু সব ধরণের ভিডিও ইনপুটকে প্রভাবিত করে।</translation> <translation id="2201555246697292490">নেটিভ বার্তাপ্রেরণের পরিচ্ছন্ন তলিকা কনফিগার করুন</translation> <translation id="2204753382813641270">তাক স্বয়ংক্রিয়ভাবে লুকানোকে নিয়ন্ত্রণ করুন</translation> <translation id="2208976000652006649">POST ব্যবহার করে এমন অনুসন্ধান URL এর প্যারামিটারগুলি</translation> @@ -509,7 +498,7 @@ এই নীতিটি সেট করা থাকলে, <ph name="PRODUCT_NAME" /> নির্দিষ্ট করা সকল অ্যাট্রিবিউটের সাথে মেলে এমন একটি প্রিন্টার খুঁজে বের করার প্রচেষ্টা চালায়, এবং সেটিকে ডিফল্ট প্রিন্টার হিসাবে নির্বাচন করে। নীতির সাথে মিল হওয়া প্রথম প্রিন্টারটি নির্বাচন করা হয়, কোনো অ-অনন্য মিলের ক্ষেত্রে যেকোনো সমরূপ প্রিন্টার নির্বাচন করা যাবে, এটি প্রিন্টারগুলির খোঁজ পাওয়ার ক্রমের উপর নির্ভর করে হবে। - এই নীতিটি সেট না করে রাখা হলে বা সময় সমাপ্ত হওয়ার আগে সমরূপ প্রিন্টার পাওয়া না গেলে, বিল্ট-ইন PDF প্রিন্টারকে ডিফল্ট হিসেবে ধরা হয় অথবা PDF প্রিন্টার না থাকলে কোনো প্রিন্টার নির্বাচিত হয় না। + এই নীতিটি সেট না করে রাখা হলে বা সময় সমাপ্ত হওয়ার আগে সমরূপ প্রিন্টার পাওয়া না গেলে, অন্তর্ভুক্ত PDF প্রিন্টারকে ডিফল্ট হিসেবে ধরা হয় অথবা PDF প্রিন্টার না থাকলে কোনো প্রিন্টার নির্বাচিত হয় না। মানটিকে JSON অবজেক্ট হিসেবে পার্স করা হয়, যা নিম্নল্লিখিত স্কিমা অনুসরণ করে: { @@ -1658,7 +1647,7 @@ যখন এই নীতি অক্ষম করা থাকে তখন ব্যবহারকারীকে কখনই বিজ্ঞাপিত করা হবে না এবং শুধুমাত্র AudioCaptureAllowedUrls এ কনফিগার করা URLগুলিতে অডিও ক্যাপচার উপলব্ধ থাকে। - এই নীতি শুধুমাত্র বিল্ট-ইন মাইক্রোফোনের ইনপুটকেই নয়, উপরন্তু সব ধরণের অডিও ইনপুটকে প্রভাবিত করে।</translation> + এই নীতি শুধুমাত্র অন্তর্ভুক্ত মাইক্রোফোনের ইনপুটকেই নয়, উপরন্তু সব ধরণের অডিও ইনপুটকে প্রভাবিত করে।</translation> <translation id="5423001109873148185">এই নীতিটি সক্ষম থাকলে অনুসন্ধানের ইঞ্জিনগুলিকে বর্তমান ডিফল্ট ব্রাউজার থেকে আমদানি করতে জোর দেয়৷ যদি সক্ষম থাকে এই নীতিটি কথোপকথন আমদানিকেও প্রভাবিত করে৷ যদি অক্ষম থাকে তবে ডিফল্ট অনুসন্ধানের ইঞ্জিনটি আমদানি করা হয় না৷ @@ -2805,7 +2794,7 @@ এই নীতিতে কোনও পরিবর্তন করা হলে তা শুধুমাত্র ARC চালু থাকা অবস্থাতেই প্রয়োগ করা হবে, যেমন, Chrome OS চালু হওয়ার সময়।</translation> <translation id="8614804915612153606">স্বত আপডেট অক্ষম করুন</translation> <translation id="8631434304112909927"><ph name="UNTIL_VERSION" /> সংস্করণ অবধি</translation> -<translation id="863319402127182273">Android অ্যাপ্লিকেশানগুলির জন্য, এই নীতিটি কেবলমাত্র বিল্ট-ইন ক্যামেরাকে প্রভাবিত করে। এই নীতিটি সত্য হিসেবে সেট করা থাকলে, কোনো ব্যতিক্রম ছাড়াই Android অ্যাপ্লিকেশানগুলির জন্য ক্যামেরা অক্ষম করা হয়।</translation> +<translation id="863319402127182273">Android অ্যাপ্লিকেশানগুলির জন্য, এই নীতিটি কেবলমাত্র অন্তর্ভুক্ত ক্যামেরাকে প্রভাবিত করে। এই নীতিটি সত্য হিসেবে সেট করা থাকলে, কোনো ব্যতিক্রম ছাড়াই Android অ্যাপ্লিকেশানগুলির জন্য ক্যামেরা অক্ষম করা হয়।</translation> <translation id="8649763579836720255">Chrome OS ডিভাইসগুলি Chrome OS CA এর ইস্যু করা একটি শংসাপত্র পেতে রিমোট শংসাপত্র ব্যবহার করতে পারে, যা ডিভাইসটি যে সুরক্ষিত সামগ্রী প্লে করতে পারবে তার দাবি করে৷ এই প্রক্রিয়ায Chrome OS CA এ হার্ডওয়্যার সমর্থন তথ্য পাঠানো জড়িত থাকে যা অনন্যভাবে ডিভাইসকে চিহ্নিত করে৷ যদি এই সেটিংস false থাকে, তবে ডিভাইস সামগ্রীর সুরক্ষার জন্য রিমোট শংসাপত্র ব্যবহার করবে না এবং ডিভাইস সুরক্ষিত সামগ্রী প্লে করতে অক্ষম হতে পারে৷ @@ -2873,7 +2862,7 @@ আপনি যদি এই সেটিং সক্ষম করেন তাহলে <ph name="PRODUCT_NAME" /> ব্যবহারকারীর জন্য পৃষ্ঠাটি অনুবাদ করার প্রস্তাব দিয়ে একটি সমন্বিত অনুবাদ টুলবার (সমুচিত ক্ষেত্রে) এবং ডান-ক্লিকের কন্টেক্সট মেনুতে একটি অনুবাদের বিকল্প দেখাবে। - আপনি যদি সেটিংটি অক্ষম করেন তাহলে সব বিল্ট-ইন অনুবাদ বৈশিষ্ট্য অক্ষম হয়ে যাবে। + আপনি যদি সেটিংটি অক্ষম করেন তাহলে সব অন্তর্ভুক্ত অনুবাদ বৈশিষ্ট্য অক্ষম হয়ে যাবে। আপনি যদি এই সেটিংটি সক্ষম অথবা অক্ষম করেন তাহলে ব্যবহারকারীরা <ph name="PRODUCT_NAME" /> এর মধ্যে এই সেটিংটি পরিবর্তন অথবা ওভাররাইড করতে পারবেন না।
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index 6e776f38..01b47c48 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -152,7 +152,7 @@ <translation id="1509692106376861764">Aquesta política no està disponible des de la versió 29 de <ph name="PRODUCT_NAME" />.</translation> <translation id="1519337829779572350">Aquesta opció de configuració està obsoleta, però pots utilitzar SafeBrowsingExtendedReportingEnabled. Activar o desactivar SafeBrowsingExtendedReportingEnabled és el mateix que establir SafeBrowsingExtendedReportingOptInAllowed en "false". - Si aquesta política s'estableix en "false", els usuaris no podran decidir si volen que algunes dades del sistema i cert contingut de les pàgines s'enviïn als servidors de Google. Si aquesta opció de configuració s'estableix en "true" o no s'estableix, els usuaris podran enviar aquestes dades a Navegació segura per ajudar a detectar aplicacions i llocs perillosos. + Si aquesta política s'estableix en "false", els usuaris no podran decidir si volen que s'enviï informació del sistema i contingut de les pàgines als servidors de Google. Si aquesta opció de configuració s'estableix en "true" o no s'estableix, els usuaris podran enviar aquestes dades a Navegació segura per ajudar a detectar aplicacions i llocs perillosos. Per obtenir més informació sobre Navegació segura, consulta https://developers.google.com/safe-browsing.</translation> <translation id="1522425503138261032">Permet que els llocs facin un seguiment de la ubicació física dels usuaris</translation> @@ -290,14 +290,6 @@ Aquesta política activa les notificacions per avisar l'usuari que es recomana o es requereix reiniciar el navegador. Si no s'estableix, <ph name="PRODUCT_NAME" /> fa canvis subtils al seu menú per indicar a l'usuari que cal reiniciar el navegador. Si s'estableix en "Recommended", s'avisa periòdicament l'usuari que es recomana reiniciar el navegador. L'usuari pot ignorar aquest advertiment per posposar el reinici. Si s'estableix en "Required", s'avisa periòdicament l'usuari que el navegador es reiniciarà a la força en finalitzar el període de notificació. La durada predeterminada d'aquest període és de 7 dies i es pot configurar amb la política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. La sessió de l'usuari es restaura en reiniciar el navegador.</translation> -<translation id="2075434678547407637">Et permet controlar si els vídeos es poden reproduir automàticament (sense el consentiment de l'usuari) amb contingut d'àudio a <ph name="PRODUCT_NAME" />. - - Si la política s'estableix en "true", <ph name="PRODUCT_NAME" /> podrà reproduir contingut multimèdia automàticament. - Si la política s'estableix en "false", <ph name="PRODUCT_NAME" /> no podrà reproduir contingut multimèdia automàticament. - De manera predeterminada, <ph name="PRODUCT_NAME" /> no pot reproduir contingut multimèdia automàticament. - - Tingues en compte que si <ph name="PRODUCT_NAME" /> s'està executant i aquesta política es modifica, només s'aplicarà a les noves pestanyes obertes. Per tant, és possible que algunes pestanyes continuïn presentant el comportament anterior. - </translation> <translation id="2077129598763517140">Utilitza l'acceleració per maquinari quan estigui disponible</translation> <translation id="2077273864382355561">Retard de la desactivació de pantalla quan s'utilitza bateria</translation> <translation id="2082205219176343977">Configura la versió mínima de Chrome que es permet al dispositiu.</translation> @@ -343,9 +335,6 @@ Si aquesta opció es configura, es demanarà als usuaris que fan servir el desbloqueig ràpid que introdueixin la contrasenya a la pantalla de bloqueig en funció d'aquesta opció. Si aquesta opció no es configura, es demanarà als usuaris que fan servir el desbloqueig ràpid que introdueixin la contrasenya a la pantalla de bloqueig cada dia.</translation> -<translation id="2188722565665306629">Et permet establir el període de temps durant el qual es mostren les notificacions per reiniciar <ph name="PRODUCT_NAME" /> a fi d'aplicar una actualització pendent. - - Aquesta política es pot utilitzar per controlar el període de temps, en mil·lisegons, durant el qual s'informa l'usuari de manera progressiva que cal reiniciar <ph name="PRODUCT_NAME" /> (o <ph name="PRODUCT_OS_NAME" />) per aplicar una actualització. Durant aquest període de temps, s'informa l'usuari repetidament de la necessitat d'actualitzar el navegador en funció de com estigui configurada la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si no s'estableix, s'utilitza el període predeterminat de 604.800.000 mil·lisegons (1 setmana).</translation> <translation id="2194470398825717446">Aquesta política es considera obsoleta a M61; utilitza EcryptfsMigrationStrategy en lloc seu. Especifica com s'ha de comportar un dispositiu que conté eCryptfs i que ha de fer una transició a encriptació ext4.
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb index efeafa5..8c3affb 100644 --- a/components/policy/resources/policy_templates_cs.xtb +++ b/components/policy/resources/policy_templates_cs.xtb
@@ -288,14 +288,6 @@ Tato zásada povoluje oznámení o tom, že je vyžadován nebo doporučen restart prohlížeče. Pokud není nastavena, <ph name="PRODUCT_NAME" /> uživatele o potřebě restartu informuje prostřednictvím drobných změn v nabídce. Pokud je nastavena na hodnotu Doporučeno, bude se uživateli opakovaně zobrazovat upozornění, že je doporučen restart. Uživatel upozornění může odmítnout a tím restart odložit. Pokud je nastavena na hodnotu Povinné, bude se uživateli opakovaně zobrazovat upozornění, že po uplynutí lhůty pro oznámení bude vynucen restart prohlížeče. Lhůta je ve výchozím nastavení sedm dní a lze ji nakonfigurovat pomocí zásady <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Relace uživatele se po restartu obnoví.</translation> -<translation id="2075434678547407637">Umožňuje určit, zda se v prohlížeči <ph name="PRODUCT_NAME" /> mohou videa automaticky (bez souhlasu uživatele) přehrávat se zvukovým obsahem. - - Je-li tato zásada nastavena na hodnotu True, může <ph name="PRODUCT_NAME" /> automaticky přehrávat média. - Je-li tato zásada nastavena na hodnotu False, <ph name="PRODUCT_NAME" /> média automaticky přehrávat nemůže. - Ve výchozím nastavení <ph name="PRODUCT_NAME" /> média automaticky přehrávat nemůže. - - Pokud je prohlížeč <ph name="PRODUCT_NAME" /> spuštěn a tato zásada se změní, použije se nové nastavení pouze na nově otevřené karty. Některé karty proto mohou nadále vykazovat předchozí chování. - </translation> <translation id="2077129598763517140">V případě dostupnosti použít hardwarovou akceleraci</translation> <translation id="2077273864382355561">Prodleva vypnutí obrazovky při napájení z baterie</translation> <translation id="2082205219176343977">Konfigurace minimální povolené verze Chromu v zařízení.</translation> @@ -334,9 +326,6 @@ Je-li toto nastavení nakonfigurováno, uživatelé, kteří používají rychlé odemknutí, budou muset na obrazovce uzamčení zadávat heslo podle tohoto nastavení. Pokud toto nastavení není nakonfigurováno, uživatelé, kteří používají rychlé odemknutí, budou na obrazovce uzamčení muset zadávat heslo každý den.</translation> -<translation id="2188722565665306629">Umožňuje nastavit dobu, po kterou se budou zobrazovat oznámení o restartu prohlížeče <ph name="PRODUCT_NAME" /> za účelem použití aktualizace čekající na vyřízení. - - Pomocí této zásady lze ovládat dobu (v milisekundách), po kterou je uživatel postupně informován o tom, že je třeba prohlížeč <ph name="PRODUCT_NAME" /> nebo systém <ph name="PRODUCT_OS_NAME" /> kvůli aktualizaci restartovat. Během této doby bude uživatel na základě nastavení zásady <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> opakovaně informován, že je potřeba nainstalovat aktualizaci. Pokud tuto zásadu nenastavíte, použije se výchozí hodnota 604 800 000 milisekund (jeden týden).</translation> <translation id="2194470398825717446">Podpora této zásady byla ve verzi M61 ukončena. Použijte namísto ní zásadu EcryptfsMigrationStrategy. Určuje, jak se má chovat zařízení dodané s šifrováním ecryptfs, které potřebuje přejít na šifrování ext4.
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb index 3f92b8d6a..2ca21eb 100644 --- a/components/policy/resources/policy_templates_da.xtb +++ b/components/policy/resources/policy_templates_da.xtb
@@ -294,14 +294,6 @@ Denne politikindstilling aktiverer underretninger, som anbefaler eller kræver, at brugeren genstarter browseren. Hvis politikken ikke angives, indikerer <ph name="PRODUCT_NAME" /> over for brugeren via diskrete ændringer af menuen, at en genstart er nødvendig. Hvis politikken indstilles til "Anbefalet", får brugeren vist en fast advarsel med en anbefaling om, at browseren genstartes. Brugeren kan afvise advarslen for at udskyde genstarten. Hvis politikken er indstillet til "Påkrævet", får brugeren vist en fast advarsel, som indikerer, at der gennemtvinges en genstart af browseren, når underretningsperioden er udløbet. Denne periode er som standard syv dage, og den kan konfigureres via politikindstillingen <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Brugerens session genoprettes efter genstarten.</translation> -<translation id="2075434678547407637">Giver dig mulighed for at bestemme, om videoer skal afspilles automatisk (uden brugernes samtykke) med lydindhold i <ph name="PRODUCT_NAME" />. - - Hvis politikken er angivet som Sand, har <ph name="PRODUCT_NAME" /> tilladelse til automatisk at afspille medier. - Hvis politikken er angivet som Falsk, har <ph name="PRODUCT_NAME" /> ikke tilladelse til automatisk at afspille medier. - <ph name="PRODUCT_NAME" /> har som standard ikke tilladelse til automatisk at afspille medier. - - Bemærk! Hvis <ph name="PRODUCT_NAME" /> kører, og denne politik ændres, anvendes ændringerne kun i nye åbne faner. Nogle faner kan derfor stadig have den tidligere adfærd. - </translation> <translation id="2077129598763517140">Brug hardwareacceleration, når det er muligt</translation> <translation id="2077273864382355561">Skærmslukforsinkelse, når batteriet bruges</translation> <translation id="2082205219176343977">Konfigurer den Chrome-version, der som minimum påkræves for enheden.</translation> @@ -346,9 +338,6 @@ Hvis denne indstilling er konfigureret, bliver brugere, der anvender hurtig oplåsning, anmodet om at indtaste deres adgangskode på låseskærmen afhængigt af denne indstilling. Hvis denne indstilling ikke er konfigureret, bliver brugere, der anvender hurtig oplåsning, anmodet om at indtaste deres adgangskode på låseskærmen hver dag.</translation> -<translation id="2188722565665306629">Giver dig mulighed for at angive, hvor længe underretninger om genstart af <ph name="PRODUCT_NAME" /> skal vises, i forbindelse med anvendelsen af en afventende opdatering. - - Denne politikindstilling kan bruges til at bestemme det tidsrum i millisekunder, hvor en bruger i stigende grad underrettes om, at <ph name="PRODUCT_NAME" /> skal genstartes (eller at <ph name="PRODUCT_OS_NAME" /> skal genstartes) i forbindelse med en opdatering. I løbet af dette tidsrum får brugeren gentagne gange besked om, at en opdatering er nødvendig, på baggrund af indstillingen for politikken <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Hvis politikken ikke angives, anvendes et tidsrum på 604800000 millisekunder (én uge) som standard.</translation> <translation id="2194470398825717446">Denne politik er udfaset i M61. Brug EcryptfsMigrationStrategy i stedet. Angiver, hvordan en enhed skal opføre sig, hvis den blev leveret med ecryptfs-kryptering og skal skifte til ext4-kryptering.
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 198beb80..3608b228 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -288,14 +288,6 @@ Mit dieser Richtlinieneinstellung kann der Nutzer durch Benachrichtigungen informiert werden, dass ein Neustart des Browsers empfohlen wird oder erforderlich ist. Wenn die Richtlinie nicht festgelegt ist, wird dem Nutzer in <ph name="PRODUCT_NAME" /> durch kleinere Menüänderungen angezeigt, dass ein Neustart erforderlich ist. Wenn die Richtlinie auf "Recommended" (Empfohlen) festgelegt ist, wird dem Nutzer eine wiederkehrende Warnung angezeigt, dass ein Neustart empfohlen wird. Der Nutzer kann diese Warnung schließen, um den Neustart zu verschieben. Wenn die Richtlinie auf "Required" (Erforderlich) festgelegt ist, wird dem Nutzer eine wiederkehrende Warnung angezeigt, dass nach Ablauf des Benachrichtigungszeitraums ein Neustart des Browsers erzwungen wird. Dieser Zeitraum beträgt standardmäßig sieben Tage und kann über die <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />-Richtlinieneinstellung konfiguriert werden. Nach dem Neustart wird die Sitzung des Nutzers wiederhergestellt.</translation> -<translation id="2075434678547407637">Mit dieser Richtlinie können Sie festlegen, ob Videos mit Ton automatisch (ohne Zustimmung durch den Nutzer) in <ph name="PRODUCT_NAME" /> wiedergegeben werden dürfen. - - Wenn die Richtlinie auf "true" gesetzt ist, darf <ph name="PRODUCT_NAME" /> Medien automatisch wiedergeben. - Wird die Richtlinie auf "false" festgelegt, darf <ph name="PRODUCT_NAME" /> Medien nicht automatisch wiedergeben. - Standardmäßig darf <ph name="PRODUCT_NAME" /> Medien nicht automatisch wiedergeben. - - Hinweis: Wenn <ph name="PRODUCT_NAME" /> gerade läuft und diese Richtlinie geändert wird, wird sie nur auf Tabs angewendet, die neu geöffnet werden. Aus diesem Grund kann es passieren, dass einige Tabs das zuvor eingestellte Verhalten zeigen. - </translation> <translation id="2077129598763517140">Hardwarebeschleunigung verwenden, falls verfügbar</translation> <translation id="2077273864382355561">Verzögerung für die Bildschirmabschaltung im Akkubetrieb</translation> <translation id="2082205219176343977">Konfigurieren Sie die für das Gerät erforderliche Mindestversion von Chrome.</translation> @@ -341,9 +333,6 @@ Ist diese Einstellung konfiguriert, werden Nutzer, die das schnelle Entsperren verwenden, dazu aufgefordert, ihr Passwort je nach Einstellung auf dem Sperrbildschirm einzugeben. Ist diese Einstellung nicht konfiguriert, werden Nutzer, die das schnelle Entsperren verwenden, dazu aufgefordert, ihr Passwort jeden Tag auf dem Sperrbildschirm einzugeben.</translation> -<translation id="2188722565665306629">Mit dieser Einstellung können Sie festlegen, wie lange Benachrichtigungen zum Neustart von <ph name="PRODUCT_NAME" /> angezeigt werden, um ein ausstehendes Update durchzuführen. - - Mit dieser Richtlinieneinstellung kann der Zeitraum in Millisekunden festgelegt werden, in dem ein Nutzer fortschreitend darüber informiert wird, dass <ph name="PRODUCT_NAME" /> oder <ph name="PRODUCT_OS_NAME" /> für ein Update neu gestartet werden muss. Während dieses Zeitraums wird der Nutzer basierend auf der Einstellung der <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-Richtlinie wiederholt über die Notwendigkeit eines Updates informiert. Wenn die Richtlinie nicht festgelegt ist, wird der Standardzeitraum von 604.800.000 Millisekunden verwendet. Dies entspricht einer Woche.</translation> <translation id="2194470398825717446">Diese Richtlinie ist in M61 eingestellt, bitte verwenden Sie stattdessen EcryptfsMigrationStrategy. Hiermit wird angegeben, wie sich ein Gerät verhalten soll, das mit eCryptfs geliefert wurde und nun eine ext4-Verschlüsselung benötigt. @@ -1249,7 +1238,7 @@ Wird die Richtlinie auf "false" festgelegt, werden grundsätzlich keine Berichte gesendet. - Falls diese Richtlinie weder auf "true" noch auf "false" festgelegt wird, kann der Nutzer die Einstellung nicht ändern. + Wenn diese Richtlinie auf "true" oder "false" festgelegt wird, kann der Nutzer die Einstellung nicht ändern. Wenn diese Richtlinie nicht konfiguriert wird, kann der Nutzer die Einstellung ändern und entscheiden, ob Berichte gesendet werden sollen.
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb index 93782f96..5bad67a 100644 --- a/components/policy/resources/policy_templates_el.xtb +++ b/components/policy/resources/policy_templates_el.xtb
@@ -302,14 +302,6 @@ Αυτή η ρύθμιση πολιτικής επιτρέπει στις ειδοποιήσεις να ενημερώνουν τον χρήστη ότι συνιστάται ή απαιτείται επανεκκίνηση του προγράμματος περιήγησης. Εάν δεν έχει ρυθμιστεί, το <ph name="PRODUCT_NAME" /> υποδεικνύει στον χρήστη ότι απαιτείται επανεκκίνηση μέσω ανεπαίσθητων αλλαγών στο μενού του. Εάν έχει οριστεί ως "Συνιστάται", θα εμφανίζεται μια επαναλαμβανόμενη προειδοποίηση στον χρήστη, η οποία θα τον ενημερώνει ότι συνιστάται επανεκκίνηση. Ο χρήστης μπορεί να παραβλέψει αυτήν την προειδοποίηση, ούτως ώστε να καθυστερήσει την επανεκκίνηση. Εάν έχει οριστεί ως "Απαιτείται", θα εμφανίζεται μια επαναλαμβανόμενη προειδοποίηση στον χρήστη, η οποία θα υποδεικνύει ότι θα πραγματοποιηθεί αναγκαστική επανεκκίνηση του προγράμματος περιήγησης μόλις παρέλθει η περίοδος της ειδοποίησης. Αυτή η περίοδος έχει διάρκεια επτά ημερών από προεπιλογή και μπορεί να διαμορφωθεί μέσω της ρύθμισης της πολιτικής <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Η περίοδος λειτουργίας του χρήστη αποκαθίσταται μετά την επανεκκίνηση.</translation> -<translation id="2075434678547407637">Σας επιτρέπει να ελέγχετε εάν είναι δυνατή η αυτόματη αναπαραγωγή των βίντεο (χωρίς τη συγκατάθεση του χρήστη) με περιεχόμενο ήχου στο <ph name="PRODUCT_NAME" />. - - Εάν η πολιτική έχει οριστεί ως Αληθής (True), επιτρέπεται στο <ph name="PRODUCT_NAME" /> η αυτόματη αναπαραγωγή μέσων. - Εάν η πολιτική έχει οριστεί ως Ψευδής (False), δεν επιτρέπεται στο <ph name="PRODUCT_NAME" /> η αυτόματη αναπαραγωγή μέσων. - Από προεπιλογή, δεν επιτρέπεται στο <ph name="PRODUCT_NAME" /> η αυτόματη αναπαραγωγή μέσων. - - Λάβετε υπόψη ότι εάν εκτελείται το <ph name="PRODUCT_NAME" /> και αυτή η πολιτική αλλάξει, θα εφαρμοστεί μόνο σε νέες ανοιγμένες καρτέλες. Συνεπώς, ορισμένες καρτέλες μπορεί να εξακολουθήσουν να παρατηρούν την προηγούμενη συμπεριφορά. - </translation> <translation id="2077129598763517140">Χρήση της επιτάχυνσης υλικού όταν είναι διαθέσιμη</translation> <translation id="2077273864382355561">Καθυστέρηση απενεργοποίησης οθόνης κατά τη λειτουργία με μπαταρία</translation> <translation id="2082205219176343977">Διαμόρφωση ελάχιστης επιτρεπόμενης έκδοσης Chrome για τη συσκευή.</translation> @@ -354,9 +346,6 @@ Εάν οριστεί αυτή η ρύθμιση, θα ζητηθεί από τους χρήστες που χρησιμοποιούν το γρήγορο ξεκλείδωμα να εισαγάγουν τους κωδικούς πρόσβασης στην οθόνη κλειδώματος ανάλογα με αυτήν τη ρύθμιση. Εάν δεν οριστεί αυτή η ρύθμιση, θα ζητείται από τους χρήστες που χρησιμοποιούν το γρήγορο ξεκλείδωμα να εισαγάγουν τους κωδικούς πρόσβασης στην οθόνη κλειδώματος καθημερινά.</translation> -<translation id="2188722565665306629">Σας επιτρέπει να ορίσετε τη χρονική περίοδο κατά τη διάρκεια της οποίας εμφανίζονται ειδοποιήσεις επανεκκίνησης του <ph name="PRODUCT_NAME" />, για την εφαρμογή μιας ενημέρωσης που εκκρεμεί. - - Αυτή η ρύθμιση πολιτικής μπορεί να χρησιμοποιηθεί για τον έλεγχο της χρονικής περιόδου, σε χιλιοστά του δευτερολέπτου, κατά τη διάρκεια της οποίας ο χρήστης ενημερώνεται σταδιακά ότι πρέπει να γίνει επανεκκίνηση του <ph name="PRODUCT_NAME" /> (ή επανεκκίνηση του <ph name="PRODUCT_OS_NAME" />), προκειμένου να εφαρμοστεί μια ενημέρωση. Κατά τη διάρκεια αυτής της χρονικής περιόδου, ο χρήστης θα ενημερώνεται επανειλημμένα σχετικά με την ανάγκη ενημέρωσης, σύμφωνα με τη ρύθμιση της πολιτικής <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Εάν δεν έχει οριστεί, χρησιμοποιείται η προεπιλεγμένη περίοδος των 604.800.000 χιλιοστών του δευτερολέπτου (μία εβδομάδα).</translation> <translation id="2194470398825717446">Αυτή η πολιτική έχει καταργηθεί στο M61. Στη θέση της, χρησιμοποιήστε την EcryptfsMigrationStrategy. Καθορίζει τον τρόπο με τον οποίο θα συμπεριφέρεται μια συσκευή που αποστέλλεται με ecryptfs και απαιτεί μετάβαση σε κρυπτογράφηση ext4.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index ed4827b..95ef643 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -58,6 +58,17 @@ If this policy is used, all printers are provided to the user except for the IDs listed in this policy. </translation> +<translation id="1181881366217399113"> + NOTE: This policy is experimental and may break functionality! + If the policy is enabled, each of the named origins in a + comma-separated list will run in its own process. This will also isolate + origins named by subdomains; e.g. specifying https://example.com/ will + also cause https://foo.example.com/ to be isolated as part of the + https://example.com/ site. + If the policy is disabled, the per-Site Isolation process management logic will take effect. + If the policy is not configured, the user will be able to change this setting. + On <ph name="PRODUCT_OS_NAME" />, it is recommended to also set the <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> device policy to the same value. If the values specified by the two policies don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. + </translation> <translation id="1198465924256827162">How frequently device status uploads are sent, in milliseconds. If this policy is unset, the default frequency is 3 hours. The minimum @@ -256,7 +267,15 @@ The format of the value follows the names of timezones in the "IANA Time Zone Database" (see "https://en.wikipedia.org/wiki/Tz_database"). In particular, most timezones can be referred to by "continent/large_city" or "ocean/large_city". Setting this policy completely disables automatic timezone resolve by device location. It also overrides SystemTimezoneAutomaticDetection policy.</translation> +<translation id="1888871729456797026">The enrolment token of cloud policy on desktop</translation> <translation id="1897365952389968758">Allow all sites to run JavaScript (recommended)</translation> +<translation id="1906888171268104594">Controls whether usage metrics and diagnostic data, including crash reports, are reported back to Google. + + If set to true, <ph name="PRODUCT_OS_NAME" /> will report usage metrics and diagnostic data. + + If set to false, metrics and diagnostic data reporting will be disabled. + + If not configured, metrics and diagnostic data reporting will be disabled on unmanaged devices, and enabled on managed devices.</translation> <translation id="193259052151668190">Whitelist of USB detachable devices</translation> <translation id="1933378685401357864">Wallpaper image</translation> <translation id="1956493342242507974">Configure power management on the log-in screen in <ph name="PRODUCT_OS_NAME" />. @@ -302,14 +321,6 @@ This policy setting enables notifications to inform the user that a browser relaunch is recommended or required. If not set, <ph name="PRODUCT_NAME" /> indicates to the user that a relaunch is needed via subtle changes to its menu. If set to 'Recommended', a recurring warning will be shown to the user that a relaunch is recommended. The user can dismiss this warning to defer the relaunch. If set to 'Required', a recurring warning will be shown to the user indicating that a browser relaunch will be forced once the notification period passes. This period is seven days by default, and may be configured via the <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> policy setting. The user's session is restored following the relaunch.</translation> -<translation id="2075434678547407637">Allows you to control if videos can play automatically (without user consent) with audio content in <ph name="PRODUCT_NAME" />. - - If the policy is set to True, <ph name="PRODUCT_NAME" /> is allowed to auto-play media. - If the policy is set to False, <ph name="PRODUCT_NAME" /> is not allowed to auto-play media. - By default, <ph name="PRODUCT_NAME" /> is not allowed to auto-play media. - - Note that if <ph name="PRODUCT_NAME" /> is running and this policy changes, it will be applied only to new opened tabs. Therefore some tabs might still observe the previous behaviour. - </translation> <translation id="2077129598763517140">Use hardware acceleration when available</translation> <translation id="2077273864382355561">Screen off delay when running on battery power</translation> <translation id="2082205219176343977">Configure minimum allowed Chrome version for the device.</translation> @@ -354,9 +365,6 @@ If this setting is configured, users using quick unlock will be requested to enter their passwords on the lock screen depending on this setting. If this setting is not configured, users using quick unlock will be requested to enter their password on the lock screen every day.</translation> -<translation id="2188722565665306629">Allows you to set the time period over which <ph name="PRODUCT_NAME" /> relaunch notifications are shown to apply a pending update. - - This policy setting can be used to control the time period, in milliseconds, over which a user is progressively informed that <ph name="PRODUCT_NAME" /> must be relaunched (or <ph name="PRODUCT_OS_NAME" /> must be restarted) for an update. Over this time period, the user will be repeatedly informed of the need for an update based on the setting of the <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> policy. If not set, the default period of 604,800,000 milliseconds (one week) is used.</translation> <translation id="2194470398825717446">This policy is deprecated in M61, please use EcryptfsMigrationStrategy instead. Specifies how a device should behave that shipped with ecryptfs and needs to transition to ext4 encryption. @@ -430,6 +438,12 @@ <translation id="2386362615870139244">Allow screen wake locks</translation> <translation id="2411817661175306360">Password protection warning is off</translation> <translation id="2411919772666155530">Block notifications from these sites</translation> +<translation id="2415979855753196119">Allows you to control the triggering of password protection at-risk account flagging. Password protection at-risk account flagging means informing Google that this account is at risk of being hijacked. + + If this policy is set to 'PasswordProtectionRiskOff', no password protection at-risk account flagging will be triggered. + If this policy is set to 'PasswordProtectionRiskOnPasswordReuse', password protection at-risk account flagging will be triggered when the user reuses their Google password on a non-whitelisted site. + If this policy is set to 'PasswordProtectionRiskOnPhishingReuse', password protection at-risk account flagging will be triggered when the user reuses their Google password on a phishing site. + If this policy is left unset, password protection at-risk account flagging will be triggered when the user reuses their Google password on a phishing site, but the user will be able to change this setting.</translation> <translation id="2418507228189425036">Disables saving browser history in <ph name="PRODUCT_NAME" /> and prevents users from changing this setting. If this setting is enabled, browsing history is not saved. This setting also disables tab syncing. @@ -625,6 +639,12 @@ If you enable this setting, Print Preview will use the OS system default printer as the default destination choice.</translation> <translation id="2867699958489427143">Roll back and stay on target version if OS version is newer than target. Do a full Powerwash during the process.</translation> +<translation id="286802604195763750">Allows you to control the triggering of password protection warning. Password protection alerts users when they reuse their protected password on potentially suspicious sites. + + If this policy is set to 'PasswordProtectionWarningOff', no password protection warning will be shown. + If this policy is set to 'PasswordProtectionWarningOnPasswordReuse', password protection warning will be shown when the user reuses their Google password on a non-whitelisted site. + If this policy is set to 'PasswordProtectionWarningOnPhishingReuse', password protection warning will be shown when the user reuses their Google password on a phishing site. + If this policy is left unset, password protection warning will be triggered when the user reuses their Google password on a phishing site, but the user will be able to change this setting.</translation> <translation id="2872961005593481000">Shut down</translation> <translation id="2874209944580848064">Note for <ph name="PRODUCT_OS_NAME" /> devices supporting Android apps:</translation> <translation id="2877225735001246144">Disable CNAME lookup when negotiating Kerberos authentication</translation> @@ -659,6 +679,17 @@ The policy value should be specified in milliseconds. Values are clamped to be less than or equal the screen off delay (if set) and the idle delay.</translation> <translation id="2987155890997901449">Enable ARC</translation> <translation id="2987227569419001736">Control use of the Web Bluetooth API</translation> +<translation id="2998886474614739865"> + NOTE: This policy is experimental and may break functionality! + This policy applies to the sign-in screen. Please see also the <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> policy which applies to the user session. It is recommended to set both policies to the same value. If the values don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. + If the policy is enabled, each of the named origins in a + comma-separated list will run in its own process. This will also isolate + origins named by subdomains; e.g. specifying https://example.com/ will + also cause https://foo.example.com/ to be isolated as part of the + https://example.com/ site. + If the policy is disabled, the per-Site Isolation process management logic will take effect. + If the policy is not configured, the platform default site isolation settings will be used for the sign-in screen. + </translation> <translation id="3016255526521614822">Whitelist note-taking apps allowed on the <ph name="PRODUCT_OS_NAME" /> lock screen</translation> <translation id="3021562480854470924">Number of milestones roll-back is allowed</translation> <translation id="3030000825273123558">Enable metrics reporting</translation> @@ -768,6 +799,17 @@ If this policy is set to a non-empty string, that string will be used as the name of the <ph name="PRODUCT_NAME" /> destination. Otherwise, the destination name will be the device name. If this policy is not set, the destination name will be the device name, and the owner of the device (or a user from the domain managing the device) will be allowed to change it. The name is limited to 24 characters.</translation> <translation id="3381968327636295719">Use the host browser by default</translation> +<translation id="3386001018488754001"> + NOTE: This policy is experimental and may break functionality! + This policy applies to the sign-in screen. Please see also the <ph name="SITE_PER_PROCESS_POLICY_NAME" /> policy which applies to the user session. It is recommended to set both policies to the same value. If the values don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. + You might want to look at the IsolateOrigins policy setting to get the + best of both worlds, isolation and limited impact for users, by using + IsolateOrigins with a list of the sites that you want to isolate. This setting, + SitePerProcess, isolates all sites. + If the policy is enabled, each site will run in its own process. + If the policy is disabled, the per-Site Isolation process management logic will take effect. + If the policy is not configured, the user will be able to change this setting. + </translation> <translation id="3395348522300156660">Specifies the printers which a user can use. This policy is only used if <ph name="PRINTERS_WHITELIST" /> is chosen for <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -806,6 +848,10 @@ If this policy is set to False or left unset, power management delays and the session length limit start running immediately on session start.</translation> <translation id="3478024346823118645">Wipe user data on sign-out</translation> <translation id="348495353354674884">Enable virtual keyboard</translation> +<translation id="3487623755010328395"> + If this policy is set, <ph name="PRODUCT_NAME" /> will try to register itself and apply associated cloud policy for all profiles. + + The value of this policy is an Enrolment token that can be retrieved from the Google Admin console.</translation> <translation id="3496296378755072552">Password manager</translation> <translation id="350443680860256679">Configure ARC</translation> <translation id="3504791027627803580">Specifies the URL of the search engine used to provide image search. Search requests will be sent using the GET method. If the DefaultSearchProviderImageURLPostParams policy is set then image search requests will use the POST method instead. @@ -1115,6 +1161,13 @@ Leaving this policy unset will allow the user to choose whether to show the home button.</translation> <translation id="4485425108474077672">Configure the New Tab page URL</translation> <translation id="4492287494009043413">Disable taking screenshots</translation> +<translation id="4497968613298501984">Configure the list of enterprise login URLs (HTTP and HTTPS schemes only). Fingerprint of password will be captured on these URLs and used for password reuse detection. + This setting should only be used by GSuite users using a SSO/SAML system. + In order for <ph name="PRODUCT_NAME" /> to correctly capture password fingerprints, please make sure that your login pages follow the guidelines on https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + If this setting is enabled, then password protection service will capture password fingerprint on these URLs for password reuse detection purpose. + If this setting is disabled or not set, then password protection service will only capture password fingerprint on https://accounts.google.com. + This policy is not available on Windows instances that are not joined to a <ph name="MS_AD_NAME" /> domain.</translation> <translation id="450537894712826981">Configures the cache size that <ph name="PRODUCT_NAME" /> will use for storing cached media files on the disk. If you set this policy, <ph name="PRODUCT_NAME" /> will use the provided cache size regardless of whether the user has specified the '--media-cache-size' flag or not. The value specified in this policy is not a hard boundary but rather a suggestion to the caching system, any value below a few megabytes is too small and will be rounded up to a sane minimum. @@ -1233,6 +1286,13 @@ If this policy is left not set or blank, then any user can sign in to <ph name="PRODUCT_NAME" />.</translation> <translation id="4858735034935305895">Allow fullscreen mode</translation> +<translation id="4868249328547841081">Configure the change password URL (HTTP and HTTPS schemes only). Password protection service will send users to this URL to change their passwords if they've been phished. + This setting should only be used by GSuite users using a SSO/SAML system. + In order for <ph name="PRODUCT_NAME" /> to correctly capture the new password fingerprint on this change password page, please make sure that your change password page follows the guidelines on https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + If this setting is enabled, then password protection service will send users to this URL to change their passwords if they've been phished. + If this setting is disabled or not set, then password protection service will send users to https://myaccounts.google.com to change their password. + This policy is not available on Windows instances that are not joined to a <ph name="MS_AD_NAME" /> domain.</translation> <translation id="4869787217450099946">Specifies whether screen wake locks are allowed. Screen wake locks can be requested by extensions via the power management extension API. If this policy is set to true or left not set, screen wake locks will be honoured for power management. @@ -1388,6 +1448,17 @@ If the policy is not set, or if it is set to the empty string or an invalid port range, WebRTC is allowed to use any available local UDP port.</translation> <translation id="5290940294294002042">Specify a list of plug-ins that the user can enable or disable</translation> +<translation id="5301787427319106606"> + NOTE: This policy is experimental and may break functionality! + You might want to look at the IsolateOrigins policy setting to get the + best of both worlds, isolation and limited impact for users, by using + IsolateOrigins with a list of the sites that you want to isolate. This setting, + SitePerProcess, isolates all sites. + If the policy is enabled, each site will run in its own process. + If the policy is disabled, the per-Site Isolation process management logic will take effect. + If the policy is not configured, the user will be able to change this setting. + On <ph name="PRODUCT_OS_NAME" />, it is recommended to also set the <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> device policy to the same value. If the values specified by the two policies don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. + </translation> <translation id="5302612588919538756">This policy is deprecated, consider using SyncDisabled instead. Allows the user to sign in to <ph name="PRODUCT_NAME" />. @@ -1982,6 +2053,14 @@ <translation id="706669471845501145">Allow SITE to show desktop notifications?</translation> <translation id="7072208053150563108">Machine password change rate</translation> <translation id="7072406291414141328">Enables throttling network bandwidth</translation> +<translation id="7074513465313721551">Configure the list of domains which Safe Browsing will trust. This means: + Safe Browsing will not check for dangerous resources (e.g. phishing, malware or unwanted software) if their URLs match these domains. + Safe Browsing's download protection service will not check downloads hosted on these domains. + Safe Browsing's password protection service will not check for password reuse if the page URL matches these domains. + + If this setting is enabled, then Safe Browsing will trust these domains. + If this setting is disabled or not set, then default Safe Browsing protection is applied to all resources. + This policy is not available on Windows instances that are not joined to a <ph name="MS_AD_NAME" /> domain.</translation> <translation id="7079519252486108041">Block pop-ups on these sites</translation> <translation id="7106631983877564505">Enable lock when <ph name="PRODUCT_OS_NAME" /> devices become idle or suspended.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index f11f9e6e..023d2ba5 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -293,14 +293,6 @@ Esta configuración de la política habilita notificaciones para informarle al usuario que se recomienda o es obligatorio realizar un reinicio. Si no se establece, <ph name="PRODUCT_NAME" /> implementará cambios sutiles en el menú para indicarle al usuario que se necesita llevar a cabo el reinicio. Si se establece como "Recomendado", el usuario verá una advertencia recurrente con una recomendación para hacerlo. El usuario puede omitir esta advertencia para posponer el reinicio. Si se establece como "Obligatorio", se le mostrará una advertencia recurrente al usuario para indicarle que el navegador se reiniciará de manera forzada una vez que finalice un período específico. De forma predeterminada, este período es de siete días y se puede configurar a través de la configuración de política de <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Después del reinicio, se restablecerá la sesión del usuario.</translation> -<translation id="2075434678547407637">Te permite controlar si los videos pueden reproducirse de forma automática (sin el consentimiento del usuario) con contenido de audio en <ph name="PRODUCT_NAME" />. - - Si la política se establece como verdadera, <ph name="PRODUCT_NAME" /> podrá reproducir contenido multimedia de forma automática. - Si se establece como falsa, <ph name="PRODUCT_NAME" /> no podrá hacerlo. - De forma predeterminada, <ph name="PRODUCT_NAME" /> no puede hacerlo. - - Ten en cuenta que si se está ejecutando <ph name="PRODUCT_NAME" /> y esta política cambia, se aplicará solo a las pestañas que se abran a partir de ese momento. Por lo tanto, es posible que algunas pestañas sigan teniendo el comportamiento anterior. - </translation> <translation id="2077129598763517140">Usar aceleración de hardware cuando esté disponible</translation> <translation id="2077273864382355561">Demora de pantalla apagada con batería</translation> <translation id="2082205219176343977">Configura la versión mínima permitida de Chrome para el dispositivo.</translation> @@ -339,9 +331,6 @@ Si se establece esta configuración, se les solicitará a los usuarios que usan el desbloqueo rápido que ingresen sus contraseñas en la pantalla bloqueada, de acuerdo con esta configuración. Si no se establece esta configuración, se les solicitará a los usuarios que usan el desbloqueo rápido que ingresen sus contraseñas en la pantalla bloqueada todos los días.</translation> -<translation id="2188722565665306629">Permite establecer el período en el que se mostrarán las notificaciones de reinicio de <ph name="PRODUCT_NAME" /> para aplicar una actualización pendiente. - - Esta configuración de política se puede usar para controlar el período, en milisegundos, durante el cual se informa a los usuarios que <ph name="PRODUCT_NAME" /> (o <ph name="PRODUCT_OS_NAME" />) debe reiniciarse para instalar una actualización. En este período, se le informará al usuario de manera reiterada que es necesario instalar una actualización en función de la configuración de la política de <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si no se establece, se utiliza el período predeterminado de 604800000 milisegundos (una semana).</translation> <translation id="2194470398825717446">Esta política dejó de estar disponible en M61, usa EcryptfsMigrationStrategy en su lugar. Especifica el comportamiento de un dispositivo que se envió con ecryptfs y debe realizar una transición a la encriptación ext4.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 6d65a41..f6b5636b 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -297,14 +297,6 @@ Este ajuste de la política habilita las notificaciones para informar al usuario de que es necesario o recomendable reiniciar el navegador. Si no se configura, <ph name="PRODUCT_NAME" /> indica al usuario que es necesario reiniciarlo mediante pequeños cambios en el menú. Si se le asigna el valor "Recomendada", se muestra una advertencia al usuario de forma periódica indicando que se recomienda reiniciar el navegador. El usuario puede ignorar esta advertencia y aplazar esta acción. Si se le asigna el valor "Obligatoria", se muestra una advertencia al usuario de forma periódica indicando que se reiniciará el navegador cuando haya transcurrido el periodo de notificación. De forma predeterminada, este periodo dura siete días, pero se puede configurar en los ajustes de la política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. La sesión del usuario se restaurará cuando el navegador se reinicie.</translation> -<translation id="2075434678547407637">Permite controlar si los vídeos se pueden reproducir automáticamente (sin el consentimiento de los usuarios) con contenido de audio en <ph name="PRODUCT_NAME" />. - - Si se le asigna el valor "True" a esta política, <ph name="PRODUCT_NAME" /> puede reproducir contenido multimedia automáticamente. - Si se le asigna el valor "False" a esta política, <ph name="PRODUCT_NAME" /> no puede reproducir contenido multimedia automáticamente. - De forma predeterminada, <ph name="PRODUCT_NAME" /> no puede reproducir contenido multimedia automáticamente. - - Ten en cuenta que, si <ph name="PRODUCT_NAME" /> se está ejecutando y esta política cambia, solo se aplicará a las nuevas pestañas que abras. Por lo tanto, en algunas pestañas se seguirá el comportamiento anterior. - </translation> <translation id="2077129598763517140">Utilizar aceleración por hardware cuando esté disponible</translation> <translation id="2077273864382355561">Retraso de desconexión de pantalla cuando el dispositivo funciona con la batería</translation> <translation id="2082205219176343977">Configurar la versión mínima permitida de Chrome en el dispositivo.</translation> @@ -349,9 +341,6 @@ Si se configura esta opción, se solicitará a los usuarios que utilicen el desbloqueo rápido que introduzcan sus contraseñas en la pantalla de bloqueo según corresponda. Si esta opción no se configura, se solicitará a los usuarios que utilicen el desbloqueo rápido que introduzcan su contraseña en la pantalla de bloqueo todos los días.</translation> -<translation id="2188722565665306629">Te permite definir cada cuánto tiempo muestra <ph name="PRODUCT_NAME" /> las notificaciones de reinicio para aplicar una actualización pendiente. - - Puedes utilizar esta opción de la política para controlar el periodo (en milisegundos) en el que se informa al usuario de forma progresiva de que debe reiniciar <ph name="PRODUCT_NAME" /> (o de que debe reiniciar <ph name="PRODUCT_OS_NAME" />) para aplicar una actualización. En este periodo, el usuario recibe una notificación de forma periódica indicando que es necesario aplicar una actualización de acuerdo con el ajuste de la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si no se le asigna ningún valor, se utiliza el periodo predeterminado, que es de 604.800.000 milisegundos (una semana).</translation> <translation id="2194470398825717446">Esta política está obsoleta en M61. En su lugar, utiliza EcryptfsMigrationStrategy. Especifica cómo debe comportarse un dispositivo que se ha enviado con eCryptfs y tiene que transferirse al sistema de cifrado ext4.
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb index cc66112..3999ab9 100644 --- a/components/policy/resources/policy_templates_et.xtb +++ b/components/policy/resources/policy_templates_et.xtb
@@ -302,14 +302,6 @@ See reegli seade lubab märguanded, mis teavitavad kasutajat sellest, brauseri taaskäivitamine on soovitatav või nõutav. Kui reegel on määramata, <ph name="PRODUCT_NAME" /> näidatakse taaskäivitamise vajadust menüü väikeste muudatuste abil. Kui reegel on seatud väärtusele „Soovitatav”, kuvatakse kasutajale korduv hoiatus, mis annab teada, et taaskäivitamine on soovitatav. Kasutaja saab hoiatusest loobuda, et taaskäivitamine edasi lükata. Kui valitud on väärtus „Nõutav”, kuvatakse kasutajale korduv hoiatus, mis annab teada, et brauser taaskäivitatakse sunniviisiliselt pärast märguandeperioodi möödumist. Perioodi vaikekestus on seitse päeva ja seda saab reegli <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> seadetes konfigureerida. Kasutaja seanss taastatakse pärast taaskäivitamist.</translation> -<translation id="2075434678547407637">Võimaldab teil juhtida, kas videoid saab teenuses <ph name="PRODUCT_NAME" /> automaatselt (ilma kasutaja nõusolekuta) koos helisisuga esitada. - - Kui reegel on määratud väärtusele Tõene, lubatakse teenuses <ph name="PRODUCT_NAME" /> meedia automaatesitus. - Kui reegel on määratud väärtusele Väär, ei lubata teenuses <ph name="PRODUCT_NAME" /> meedia automaatesitust. - Vaikimisi ei lubata teenuses <ph name="PRODUCT_NAME" /> meedia automaatesitust. - - Pange tähele, et kui teenus <ph name="PRODUCT_NAME" /> töötab ja seda reeglit muudetakse, rakendatakse seda ainult uutel avatud vahelehtedel. Seetõttu võite mõnel vahelehel siiski märgata eelmist käitumismustrit. - </translation> <translation id="2077129598763517140">Kasuta võimaluse korral riistvarakiirendust</translation> <translation id="2077273864382355561">Ekraani väljalülitamise viiteaeg akutoite kasutamisel</translation> <translation id="2082205219176343977">Seadmes kõige vanema lubatud Chrome'i versiooni seadistamine.</translation> @@ -354,9 +346,6 @@ Kui see seade on seadistatud, peavad kasutajad, kes kasutavad kiiravamist, sisestama lukustuskuval parooli sellest seadest olenevalt. Kui see seade on seadistamata, peavad kasutajad, kes kasutavad kiiravamist, sisestama lukustuskuval parooli iga päev.</translation> -<translation id="2188722565665306629">Võimaldab määrata ajavahemiku, mille jooksul kuvatakse märguanded rakenduse <ph name="PRODUCT_NAME" /> taaskäivitamiseks, et rakendada ootelolev värskendus. - - Reegli seade abil saab juhtida ajavahemikku millisekundites, mille jooksul antakse kasutajale regulaarselt teada, et <ph name="PRODUCT_NAME" /> (või <ph name="PRODUCT_OS_NAME" />) tuleb taaskäivitada värskenduse rakendamiseks. Ajavahemiku jooksul teavitatakse kasutajat reegli <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> seade alusel korduvalt sellest, et värskendus on nõutav. Kui reegel on määramata, kasutatakse vaikeperioodi 604 800 000 millisekundit (üks nädal).</translation> <translation id="2194470398825717446">Tugi sellele reeglile on versioonis M61 katkestatud. Kasutage selle asemel reeglit EcryptfsMigrationStrategy. Määrab, kuidas peaks käituma süsteemiga ecryptfs tarnitud seade, mis on vaja üle viia krüpteerimissüsteemile ext4.
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index 4a237e04..262cdb9a 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -287,14 +287,6 @@ این تنظیم خطمشی، اعلانها را فعال میکند تا به کاربر اطلاع داده شود که راهاندازی مجدد مرورگر توصیه شده یا لازم است. اگر تنظیم نشده باشد، <ph name="PRODUCT_NAME" /> به کاربر نشان میدهد که راهاندازی مجدد ازطریق انجام تغییرات ظریف در منوی آن لازم است. اگر روی «توصیه میشود» تنظیم شده باشد، هشدار تکرارشوندهای به کاربر نشان داده میشود مبنی بر اینکه راهاندازی مجدد توصیه میشود. اگر روی «لازم است» تنظیم شده باشد، هشداری تکرارشونده به کاربر نمایش داده میشود که نشان میدهد بهمحض گذشت مدت زمان اعلان، راهاندازی مجدد مرورگر به اجبار اعمال میشود. این مدت زمان بهطور پیشفرض هفت روز است و ممکن است ازطریق تنظیم خطمشی <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> پیکربندی شود. بعد از راهاندازی مجدد، جلسه کاربر بازنشانی میشود.</translation> -<translation id="2075434678547407637">به شما اجازه میدهد امکان پخش خودکار (بدون رضایت کاربر) ویدیوهای دارای محتوای صوتی را در <ph name="PRODUCT_NAME" /> کنترل کنید. - - اگر این خطمشی روی درست تنظیم شده باشد، <ph name="PRODUCT_NAME" /> مجاز است رسانه را بهطور خودکار پخش کند. - اگر این خطمشی روی نادرست تنظیم شده باشد، <ph name="PRODUCT_NAME" /> مجاز نیست رسانه را بهطور خودکار پخش کند. - بهطور پیشفرض، <ph name="PRODUCT_NAME" /> مجاز است رسانه را بهطور خودکار پخش کند. - - توجه داشته باشید اگر <ph name="PRODUCT_NAME" /> درحال اجرا باشد و این خطمشی تغییر کند، این تغییر ففط برای برگههایی اعمال میشود که جدید باز میشوند. بنابراین شاید بعضی از برگهها همچنان رفتار قبلی را مشاهده کنند. - </translation> <translation id="2077129598763517140">در صورت امکان از شتاب سختافزاری استفاده شود</translation> <translation id="2077273864382355561">تأخیر خاموشی صفحه هنگام کار با باتری</translation> <translation id="2082205219176343977">پایینترین نسخه Chrome مجاز دستگاه را پیکربندی کنید.</translation> @@ -338,9 +330,6 @@ اگر این تنظیم پیکربندی شود، از کاربرانی که از باز کردن سریع قفل استفاده میکنند درخواست میشود بسته به مقادیر مشخصشده در این تنظیم گذرواژهشان را وارد کنند. اگر این تنظیم پیکربندی نشود، از کاربرانی که از باز کردن سریع قفل استفاده میکنند درخواست میشود هر روز گذرواژهشان را در صفحه قفل وارد کنند.</translation> -<translation id="2188722565665306629">به شما اجازه میدهد دوره زمانی را تنظیم کنید که طی آن اعلانهای راهاندازی مجدد <ph name="PRODUCT_NAME" /> برای اعمال بهروزرسانی در انتظاری نمایش داده میشوند. - - این تنظیم خطمشی میتواند برای کنترل دوره زمانی (به میلیثانیه) استفاده شود که طی آن بهطور مداوم به کاربر اطلاع داده میشود <ph name="PRODUCT_NAME" /> باید برای بهروزرسانی راهاندازی مجدد شود (یا <ph name="PRODUCT_OS_NAME" /> باید بازراهاندازی شود). طی این دوره زمانی براساس تنظیم خطمشی <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />، مکرراً به کاربر اطلاع داده میشود که لازم است بهروزرسانی انجام شود. اگر تنظیم نشده باشد، مدت زمان پیشفرض ۶۰۴۸۰۰۰۰۰ میلیثانیه (یک هفته) استفاده میشود.</translation> <translation id="2194470398825717446">این خطمشی در M61 منسوخ شده است. لطفاً بهجای آن از EcryptfsMigrationStrategy استفاده کنید. نحوه عملکرد دستگاهی که با ecryptfs ارسال شده است را مشخص میکند و لازم است به رمزگذاری ext4 منتقل شود.
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb index 51a383e5..2f05b1d7 100644 --- a/components/policy/resources/policy_templates_fi.xtb +++ b/components/policy/resources/policy_templates_fi.xtb
@@ -293,14 +293,6 @@ Tämän käytäntöasetuksen avulla voit ilmoittaa käyttäjälle, että selaimen uudelleenkäynnistystä suositellaan tai vaaditaan. Jos asetusta ei ole määritetty, <ph name="PRODUCT_NAME" /> kertoo käyttäjälle uudelleenkäynnistyksen tarpeesta hienovaraisilla valikon muutoksilla. Jos tilana on Suositeltu, käyttäjä saa toistuvan varoituksen suositellusta uudelleenkäynnistyksestä. Käyttäjä voi hylätä varoituksen ja lykätä uudelleenkäynnistystä. Jos tilana on Vaadittu, käyttäjä saa toistuvan varoituksen ilmoitusaikaa seuraavasta selaimen pakotetusta uudelleenkäynnistyksestä. Tämä aika on oletuksena seitsemän päivää, ja sitä voi muuttaa <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />-käytäntoasetuksista. Käyttäjän käyttökerta palautetaan uudelleenkäynnistyksen jälkeen.</translation> -<translation id="2075434678547407637">Voit valita, voiko <ph name="PRODUCT_NAME" /> toistaa videoita äänen kanssa automaattisesti (ilman käyttäjän hyväksyntää). - - Jos käytännön arvoksi asetetaan Tosi, <ph name="PRODUCT_NAME" /> saa toistaa mediasisältöä automaattisesti. - Jos käytännön arvoksi asetetaan Epätosi, <ph name="PRODUCT_NAME" /> ei saa toistaa mediasisältöä automaattisesti. - Oletuksena <ph name="PRODUCT_NAME" /> ei saa toistaa mediasisältöä automaattisesti. - - Huomaa, että jos <ph name="PRODUCT_NAME" /> on käynnissä, kun tätä käytäntöä muutetaan, muutos ei vaikuta auki olleisiin välilehtiin vaan vain myöhemmin avattuihin välilehtiin. - </translation> <translation id="2077129598763517140">Käytä laitteistokiihdytystä, jos mahdollista</translation> <translation id="2077273864382355561">Ruudun sammutuksen viive käytettäessä laitetta akkuvirralla</translation> <translation id="2082205219176343977">Määritä vanhin sallittu Chrome-versio laitteelle.</translation> @@ -346,9 +338,6 @@ Jos tämä asetus on määritetty, pika-avaamista käyttäviä käyttäjiä pyydetään antamaan salasana lukitusnäytöllä tämän asetuksen mukaisesti. Jos tätä asetusta ei ole määritetty, pika-avaamista käyttäviä käyttäjiä pyydetään antamaan salasana lukitusnäytöllä päivittäin.</translation> -<translation id="2188722565665306629">Voit määrittää ajanjakson, jolloin tuotteen <ph name="PRODUCT_NAME" /> uudelleenkäynnistysilmoituksia näytetään. - - Tämän käytäntöasetuksen avulla voit määrittää millisekunteina sen ajan, jolloin käyttäjä saa ilmoituksia päivityksen edellyttämästä tuotteen <ph name="PRODUCT_NAME" /> uudelleenkäynnistyksestä (tai tuotteen <ph name="PRODUCT_OS_NAME" /> uudelleenkäynnistyksestä). Tänä aikana käyttäjä saa toistuvia muistutuksia <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-käytännön mukaisen päivityksen tarpeellisuudesta. Jos ajanjaksoa ei ole määritetty, oletuksena on 604 800 000 millisekuntia (yksi viikko).</translation> <translation id="2194470398825717446">Tämä käytäntö on poistettu käytöstä M61:ssä, ota sen sijaan käyttöön EcryptfsMigrationStrategy. Määrittää laitteen toiminnan, jos se toimitettiin ecryptfs-salauksen kanssa mutta on siirrettävä ext4-salaukseen.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index dd5abbf..27d7bb0 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -300,14 +300,6 @@ Ine-enable ng setting ng patakarang ito ang mga notification upang ipaalam sa user na inirerekomenda o kinakailangan ang muling paglulunsad ng browser. Kung hindi nakatakda, ipapaalam ng <ph name="PRODUCT_NAME" /> sa user na kinakailangan ang muling paglulunsad sa pamamagitan ng maliliit na pagbabago sa menu nito. Kung nakatakda sa 'Inirerekomenda,' magpapakita ng umuulit na babala sa user na inirerekomenda ang muling paglulunsad. Maaaring i-dismiss ng user ang babalang ito upang ipagpaliban ang muling paglulunsad. Kung nakatakda sa 'Kinakailangan,' magpapakita ng umuulit na babala sa user na nagsasaad na sapilitang magsasagawa ng muling paglulunsad ng browser kapag lumampas na sa panahon ng notification. Bilang default, may pitong araw ang panahong ito at maaari itong i-configure sa pamamagitan ng setting ng patakarang <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Ire-restore ang session ng user pagkatapos ng muling paglulunsad.</translation> -<translation id="2075434678547407637">Nagbibigay-daan sa iyong kontrolin kung maaaring awtomatikong mag-play ang mga video (nang walang pahintulot ng user) na may content na audio sa <ph name="PRODUCT_NAME" />. - - Kung nakatakda ang patakaran sa True, pinapayagan ang <ph name="PRODUCT_NAME" /> na mag-autoplay ng media. - Kung nakatakda ang patakaran sa False, hindi pinapayagan ang <ph name="PRODUCT_NAME" /> na mag-autoplay ng media. - Bilang default, hindi pinapayagan ang <ph name="PRODUCT_NAME" /> na mag-autoplay ng media. - - Tandaan na kung tumatakbo ang <ph name="PRODUCT_NAME" /> at magbabago ang patakarang ito, malalapat lang ito sa mga bagong nabuksang tab. Kaya maaaring maobserbahan pa rin sa ilang tab ang nakaraang gawi. - </translation> <translation id="2077129598763517140">Gamitin ang pagpapabilis ng hardware kapag available</translation> <translation id="2077273864382355561">Delay ng pag-off ng screen kapag tumatakbo gamit ang power ng baterya</translation> <translation id="2082205219176343977">I-configure ang minimum na pinapayagang bersyon ng Chrome para sa device.</translation> @@ -352,9 +344,6 @@ Kung naka-configure ang setting na ito, hihilingin sa mga user na gumagamit ng mabilisang pag-unlock na ilagay ang password nila sa lock screen depende sa setting na ito. Kung hindi naka-configure ang setting na ito, hihilingin sa mga user na gumagamit ng mabilisang pag-unlock na ilagay ang password nila sa lock screen araw-araw.</translation> -<translation id="2188722565665306629">Nagbibigay-daan sa iyong itakda ang yugto ng panahon kung kailan ipapakita ang mga notification ng muling paglulunsad ng <ph name="PRODUCT_NAME" /> upang malapat ang nakabinbing pag-update. - - Magagamit ang setting ng patakarang ito upang makontrol ang yugto ng panahon, sa mga millisecond, kung kailan unti-unting sasabihan ang user na dapat muling ilunsad ang <ph name="PRODUCT_NAME" /> (o dapat i-restart ang <ph name="PRODUCT_OS_NAME" />) para sa pag-update. Sa loob ng yugto ng panahong ito, paulit-ulit na sasabihan ang user tungkol sa pangangailangang mag-update batay sa setting ng patakarang <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Kung hindi nakatakda, ang default na panahong 604800000 millisecond (isang linggo) ang gagamitin.</translation> <translation id="2194470398825717446">Hindi na ginagamit ang patakarang ito sa M61, pakigamit na lang ang EcryptfsMigrationStrategy. Tinutukoy kung paano dapat kumilos ang isang device na naipadala nang may ecryptfs at kinakailangang lumipat sa ext4 na pag-encrpyt.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index a940853..87df311 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -304,14 +304,6 @@ Cette règle active l'envoi de notifications pour avertir l'utilisateur qu'un redémarrage du navigateur est recommandé ou requis. Si cette règle n'est pas configurée, <ph name="PRODUCT_NAME" /> indique à l'utilisateur, par le biais de modifications discrètes du menu, qu'un redémarrage est nécessaire. Si elle est définie sur "Recommandé", un avertissement récurrent s'affiche, indiquant qu'un redémarrage est recommandé. L'utilisateur peut ignorer cet avertissement et redémarrer le navigateur plus tard. Si elle est définie sur "Requis", un avertissement récurrent s'affiche, indiquant que le redémarrage du navigateur sera forcé à l'issue de la période de notification. Par défaut, ce délai est de sept jours, et peut être configuré à l'aide du paramètre <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. La session de l'utilisateur est restaurée après le redémarrage.</translation> -<translation id="2075434678547407637">Permet de définir si des vidéos avec du contenu audio peuvent être lues automatiquement (sans le consentement de l'utilisateur) dans <ph name="PRODUCT_NAME" />. - - Si cette règle est définie sur "True", la lecture automatique de contenu multimédia est autorisée dans <ph name="PRODUCT_NAME" />. - Si cette règle est définie sur "False", la lecture automatique de contenu multimédia n'est pas autorisée dans <ph name="PRODUCT_NAME" />. - Par défaut, la lecture automatique de contenu multimédia n'est pas autorisée dans <ph name="PRODUCT_NAME" />. - - Notez que si cette règle est modifiée pendant que <ph name="PRODUCT_NAME" /> est en cours d'exécution, elle ne s'applique qu'aux onglets ouverts après cette modification. Il est donc possible que les onglets ouverts avant appliquent encore l'ancien paramètre. - </translation> <translation id="2077129598763517140">Utiliser l'accélération matérielle (le cas échéant)</translation> <translation id="2077273864382355561">Délai d'arrêt de l'écran (batterie)</translation> <translation id="2082205219176343977">Configurer la version Chrome minimale autorisée de l'appareil.</translation> @@ -362,9 +354,6 @@ Si ce paramètre n'est pas configuré, les utilisateurs sont invités à saisir leur mot de passe tous les jours dans l'écran de verrouillage.</translation> -<translation id="2188722565665306629">Vous permet de définir la période au cours de laquelle les notifications de redémarrage de <ph name="PRODUCT_NAME" /> concernant l'application d'une mise à jour en cours s'affichent. - - Ce paramètre peut être utilisé pour définir la période, en millisecondes, pendant laquelle un utilisateur est régulièrement averti que <ph name="PRODUCT_NAME" /> (ou <ph name="PRODUCT_OS_NAME" />) doit être redémarré pour être mis à jour. Au cours de cette période, l'utilisateur est régulièrement informé de la nécessité de la mise à jour en fonction du paramètre de la règle <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si ce paramètre n'est pas défini, la période par défaut utilisée est de 604 800 000 millisecondes (une semaine).</translation> <translation id="2194470398825717446">Cette stratégie est obsolète dans M61. Veuillez appliquer "EcryptfsMigrationStrategy" à la place. Indique le comportement à adopter par un appareil qui a été fourni avec eCryptfs et qui doit faire la transition vers un chiffrement ext4.
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb index 765d40c..9473ab48 100644 --- a/components/policy/resources/policy_templates_gu.xtb +++ b/components/policy/resources/policy_templates_gu.xtb
@@ -354,14 +354,6 @@ આ નીતિની સેટિંગ વપરાશકર્તાને જાણ કરવા માટે નોટિફિકેશનને ચાલુ કરે છે કે બ્રાઉઝર રીલૉન્ચ કરવાનો સુઝાવ આપેલ છે અથવા આવશ્યક છે. જો તે સેટ કરવામાં આવ્યું ન હોય, તો <ph name="PRODUCT_NAME" /> વપરાશકર્તાને ઝીણવટભર્યા ફેરફારોથી દર્શાવવામાં આવે છે કે તેના મેનૂને રીલૉન્ચ કરવું જરૂરી છે. જો 'સુઝાવ આપેલ' પર સેટ કરવામાં આવ્યું હોય, તો રીલૉન્ચ કરવાનો સુઝાવ આપેલ છે તેવી ચેતવણી વપરાશકર્તાને વારંવાર બતાવવામાં આવશે. રીલૉન્ચ મુલતવી રાખવા માટે વપરાશકર્તા આ ચેતવણીને છોડી શકે છે. જો 'આવશ્યક' તરીકે સેટ કરવામાં આવ્યું હોય, તો વપરાશકર્તાને એવું દર્શાવતી ચેતવણી વારંવાર બતાવવામાં આવશે કે જ્યાં સુધી નોટિફિકેશનનો સમયગાળો પસાર ન થઈ જાય, ત્યાં સુધી બ્રાઉઝરને ફરજિયાત પણે રીલૉન્ચ કરવામાં આવશે. ડિફૉલ્ટ તરીકે આ સમયગાળો સાત દિવસનો હોય છે અને તેને કદાચ <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />ની નીતિ સેટિંગ મારફતે ગોઠવવામાં આવી શકે છે. રીલૉન્ચ કર્યા પછી વપરાશકર્તાનું સત્ર પાછું મેળવવામાં આવે છે.</translation> -<translation id="2075434678547407637"><ph name="PRODUCT_NAME" />માં આપમેળે (વપરાશકર્તા સંમતિ વિના) ઑડિઓ કન્ટેન્ટ સાથે વીડિઓ ચાલુ થઈ શકે કે નહીં તે નિયંત્રિત કરવાની મંજૂરી આપે છે. - - જો નીતિ True પર સેટ કરેલ હશે, તો <ph name="PRODUCT_NAME" />ને મીડિયા ઑટોપ્લે કરવાની મંજૂરી છે. - જો નીતિ False પર સેટ કરેલ હશે, તો <ph name="PRODUCT_NAME" />ને મીડિયા ઑટોપ્લે કરવાની મંજૂરી નથી. - ડિફૉલ્ટ તરીકે, <ph name="PRODUCT_NAME" />ને મીડિયા ઑટોપ્લે કરવાની મંજૂરી નથી. - - નોંધ લેશો કે જો <ph name="PRODUCT_NAME" /> ચાલુ હોય અને આ નીતિ બદલાય, તો તે માત્ર નવા ખુલેલા ટૅબને લાગુ પડશે. તેથી, કેટલાક ટૅબ હજુ પણ પહેલાં જેવું વર્તન કરી શકે છે. - </translation> <translation id="2077129598763517140">હાર્ડવેર ઍક્સિલરેશન ઉપલબ્ધ હોવા પર ઉપયોગ કરો</translation> <translation id="2077273864382355561">જ્યારે બેટરી પાવર પર ચાલી રહ્યું હોય ત્યારે સ્ક્રીન બંધ વિલંબ</translation> <translation id="2082205219176343977">ઉપકરણ માટે Chromeના ન્યૂનતમ માન્ય વર્ઝનની ગોઠવણી કરો.</translation> @@ -411,9 +403,6 @@ જો આ સેટિંગ ગોઠવવામાં આવી હોય, તો ઝડપી અનલૉકનો ઉપયોગ કરતાં વપરાશકર્તાઓને આ સેટિંગના આધારે લૉક સ્ક્રીન પર તેમના પાસવર્ડ્સ દાખલ કરવાની વિનંતી કરવામાં આવશે. જો આ સેટિંગ ગોઠવવામાં આવેલ ન હોય, તો ઝડપી અનલૉકનો ઉપયોગ કરતાં વપરાશકર્તાઓને લૉક સ્ક્રીન પર દરરોજ તેમનો પાસવર્ડ દાખલ કરવાની વિનંતી કરવામાં આવશે.</translation> -<translation id="2188722565665306629">એક બાકી અપડેટને લાગુ કરવા માટે <ph name="PRODUCT_NAME" />ના રીલૉન્ચ કરવાના નોટિફિકેશન બતાવવા માટે તમને સમયગાળો સેટ કરવાની મંજૂરી આપે છે. - - આ નીતિ સેટિંગનો ઉપયોગ સમયગાળાને મિલીસેકન્ડમાં નિયંત્રિત કરવા માટે કરી શકાય છે, જેમાં એક વપરાશકર્તાને ક્રમશઃ જણાવવામાં આવે છે કે અપડેટ માટે <ph name="PRODUCT_NAME" />ને રીલૉન્ચ કરવું આવશ્યક છે (અથવા <ph name="PRODUCT_OS_NAME" />ને ફરીથી શરૂ કરવું આવશ્યક છે). આ સમયગાળા દરમિયાન, વપરાશકર્તાને વારંવાર <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />ની નીતિના સેટિંગ આધારિત અપડેટની જરૂરિયાત વિશે જાણ કરવામાં આવશે. જો તે સેટ કરવામાં આવી ન હોય, તો 604800000 મિલીસેકન્ડ (એક અઠવાડિયું)ના ડિફૉલ્ટ સમયગાળાનો ઉપયોગ કરવામાં આવશે.</translation> <translation id="2194470398825717446">આ નીતિ M61માં ટાળવામાં આવે છે, તેના બદલે કૃપા કરીને EcryptfsMigrationStrategyનો ઉપયોગ કરો. ecryptfs સાથે રવાના કરવામાં આવેલ અને ext4 એન્ક્રિપ્શન પર ટ્રાન્ઝિશનની આવશ્યકતા ધરાવતું ઉપકરણ કઈ રીતે કાર્ય કરવું જોઈએ તેનો ઉલ્લેખ કરે છે.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index 4a5b3792..4cc8331 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -297,14 +297,6 @@ यह नीति सेटिंग उपयोगकर्ता को इस बात की सूचना देने के लिए सूचनाएं चालू करती है कि ब्राउज़र को फिर से लॉन्च करने का सुझाव दिया गया है या ऐसा करना ज़रूरी है. अगर सेट नहीं होती है, तो <ph name="PRODUCT_NAME" /> उपयोगकर्ता को यह बताती है कि उसके मेन्यू में खास बदलावों के ज़रिए फिर से लॉन्च करना ज़रूरी है. अगर 'सुझाया गया' पर सेट होती है, तो उपयोगकर्ता को बार-बार यह चेतावनी दिखाएगी कि फिर से लॉन्च करने का सुझाव दिया गया है. उपयोगकर्ता फिर से लॉन्च करने को टालने के लिए इस चेतावनी को खारिज कर सकता है. अगर 'ज़रूरी' पर सेट होती है, तो उपयोगकर्ता को बार-बार यह चेतावनी दिखाएगी कि सूचना की अवधि खत्म होने पर ब्राउज़र को बिना पूछे फिर से लॉन्च कर दिया जाएगा. डिफ़ॉल्ट रूप से यह अवधि सात दिनों की होती है और <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> नीति सेटिंग के ज़रिए कॉन्फ़िगर की जा सकती है. फिर से लॉन्च करने के बाद उपयोगकर्ता का सत्र बहाल कर दिया जाता है.</translation> -<translation id="2075434678547407637">आपको यह नियंत्रित करने देती है कि <ph name="PRODUCT_NAME" /> में ऑडियो सामग्री होने पर वीडियो अपने आप (उपयोगकर्ता की मंज़ूरी के बिना) चल सकते हैं या नहीं. - - अगर नीति को सही पर सेट किया गया है, तो <ph name="PRODUCT_NAME" /> को मीडिया अपने आप चलाने की अनुमति है. - अगर नीति को गलत पर सेट किया गया है, तो <ph name="PRODUCT_NAME" /> को अपने आप मीडिया चलाने की अनुमति नहीं है. - डिफ़ॉल्ट रूप से, <ph name="PRODUCT_NAME" /> को अपने आप मीडिया चलाने की अनुमति नहीं है. - - ध्यान रखें कि अगर <ph name="PRODUCT_NAME" /> चल रहा है और यह नीति बदलती है, तो यह सिर्फ़ नए खोले गए टैब पर लागू होगी. इसलिए हो सकता है कि कुछ टैब अभी भी पुराने तरीके का अनुसरण करें. - </translation> <translation id="2077129598763517140">उपलब्ध होने पर हार्डवेयर त्वरण का उपयोग करें</translation> <translation id="2077273864382355561">बैटरी पावर पर चलते समय स्क्रीन बंद विलंब</translation> <translation id="2082205219176343977">डिवाइस के लिए कम से कम अनुमत Chrome वर्शन कॉन्फ़िगर करें.</translation> @@ -347,9 +339,6 @@ यदि यह सेटिंग कॉन्फ़िगर की जाती है, तो तुरंत अनलॉक करें का उपयोग करने वाले उपयोगकर्ताओं से इस सेटिंग के आधार पर लॉक स्क्रीन पर अपना पासवर्ड डालने का अनुरोध किया जाएगा. यदि यह सेटिंग कॉन्फ़िगर नहीं की जाती है, तो तुरंत अनलॉक करें का उपयोग करने वाले उपयोगकर्ताओं से प्रति दिन लॉक स्क्रीन पर अपना पासवर्ड डालने का अनुरोध किया जाएगा.</translation> -<translation id="2188722565665306629">आपको वह समयावधि सेट करने देती है जिसके दौरान <ph name="PRODUCT_NAME" /> रुके हुए अपडेट को लागू करने के लिए फिर से लॉन्च करने की सूचनाएं दिखाता है. - - इस नीति सेटिंग का इस्तेमाल मिलीसेकंड में उस समयावधि को नियंत्रित करने के लिए किया जा सकता है, जिसके दौरान उपयोगकर्ता को बार-बार यह सूचित किया जाएगा कि <ph name="PRODUCT_NAME" /> को एक अपडेट के लिए फिर से लॉन्च करना होगा (या <ph name="PRODUCT_OS_NAME" /> को रीस्टार्ट करना होगा). इस समयावधि के दौरान, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> नीति की सेटिंग के मुताबिक उपयोगकर्ता को अपडेट की ज़रूरत के बारे में बार-बार सूचित किया जाएगा. अगर सेट नहीं होती है, तो 604800000 मिलीसेकंड (एक हफ़्ते) की डिफ़ॉल्ट अवधि इस्तेमाल की जाती है.</translation> <translation id="2194470398825717446">इस नीति का समर्थन M61 में रोक दिया गया है, कृपया इसके बजाय EcryptfsMigrationStrategy का उपयोग करें. यह बताती है कि ecryptfs के ज़रिए भेजे गए डिवाइस को किस तरह व्यवहार करना चाहिए और उसे ext4 एन्क्रिप्शन में संक्रमण करने की ज़रूरत होती है.
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb index 7f98065..be63b55 100644 --- a/components/policy/resources/policy_templates_hr.xtb +++ b/components/policy/resources/policy_templates_hr.xtb
@@ -294,14 +294,6 @@ Ova postavka pravila omogućuje obavijesti koje informiraju korisnika o preporučenom ili obaveznom ponovnom pokretanju preglednika. Ako nije postavljeno, <ph name="PRODUCT_NAME" /> korisniku naznačuje potrebu za ponovnim pokretanjem putem sitnih promjena na izborniku. Ako se postavi na "Preporučeno", korisniku će se prikazivati ponavljajuće upozorenje da je preporučeno ponovno pokretanje. Korisnik može odbaciti upozorenje i tako odgoditi ponovno pokretanje. Ako se postavi na "Obavezno", korisniku će se prikazati ponavljajuće upozorenje da će se preglednik prisilno ponovo pokrenuti nakon isteka naznačenog vremena u obavijesti. To razdoblje prema zadanim postavkama iznosi sedam dana, a može se konfigurirati putem postavke pravila <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Korisnička će se sesija vratiti nakon ponovnog pokretanja.</translation> -<translation id="2075434678547407637">Omogućuje vam da odredite mogu li se videozapisi reproducirati automatski (bez korisnikova pristanka) s audiosadržajem u pregledniku <ph name="PRODUCT_NAME" />. - - Ako se to pravilo postavi na točno, <ph name="PRODUCT_NAME" /> može automatski reproducirati medije. - Ako se to pravilo postavi na netočno, <ph name="PRODUCT_NAME" /> ne može automatski reproducirati medije. - Prema zadanim postavkama <ph name="PRODUCT_NAME" /> ne može automatski reproducirati medije. - - Ako se <ph name="PRODUCT_NAME" /> izvodi, a pravilo se promijeni, pravilo će se primjenjivati samo na nove otvorene kartice. Zato će se neke kartice možda i dalje ponašati u skladu s prethodnim pravilom. - </translation> <translation id="2077129598763517140">Upotrijebi hardversko ubrzanje kada je dostupno</translation> <translation id="2077273864382355561">Odgoda isključivanja zaslona za vrijeme baterijskog napajanja</translation> <translation id="2082205219176343977">Konfiguriraj najmanju dopuštenu verziju Chromea za uređaj.</translation> @@ -346,9 +338,6 @@ Ako se ta postavka konfigurira, korisnici koji upotrebljavaju brzo otključavanje morat će unijeti zaporku na zaključanom zaslonu ovisno o toj postavci. Ako se ta postavka ne konfigurira, korisnici koji upotrebljavaju brzo otključavanje morat će svaki dan unijeti zaporku na zaključanom zaslonu.</translation> -<translation id="2188722565665306629">Omogućuje postavljanje razdoblja tijekom kojeg će se prikazivati obavijesti o ponovnom pokretanju preglednika <ph name="PRODUCT_NAME" /> radi primjene ažuriranja na čekanju. - - Pomoću ove postavke pravila može se odrediti razdoblje u milisekundama tijekom kojeg se korisnik progresivno obavještava o tome da je potrebno ponovo pokrenuti <ph name="PRODUCT_NAME" /> (ili <ph name="PRODUCT_OS_NAME" />) radi ažuriranja. Tijekom tog će se vremena korisniku prikazivati ponavljajuća obavijest o potrebnom ažuriranju na temelju postavke pravila <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Ako se ne postavi, koristit će se zadano razdoblje od 604800000 milisekundi (tjedan dana).</translation> <translation id="2194470398825717446">To je pravilo obustavljeno u verziji M61. Umjesto toga upotrijebite EcryptfsMigrationStrategy. Određuje kako se treba ponašati uređaj koji je isporučen s enkripcijom ecryptfs, a treba se prebaciti na enkripciju ext4.
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index bc10c1d..9b1bedb 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -293,14 +293,6 @@ Ezen házirend-beállítás használatával a felhasználó értesítéseken keresztül tudomást szerezhet arról, hogy ajánlott, illetve szükséges a böngésző újraindítása. Ha nincs beállítva, a <ph name="PRODUCT_NAME" /> a menüben található apró módosításokkal jelzi a felhasználónak, hogy szükség van az újraindításra. Ha a házirend beállítása „Ajánlott”, ismétlődő figyelmeztetés jelenik meg a felhasználó számára az ajánlott újraindítással kapcsolatban. A felhasználónak lehetősége van a figyelmeztetés elvetésére és az újraindítás elhalasztására. Ha a házirend beállítása „Szükséges”, ismétlődő figyelmeztetés jelenik meg a felhasználó számára, amely szerint a rendszer kényszeríti a böngésző újraindítását az értesítési időszak lejárta után. Ez az időszak alapértelmezés szerint hét nap, és a <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> házirend-beállításnál módosítható. Az újraindítás után a rendszer visszaállítja a felhasználói munkamenetet.</translation> -<translation id="2075434678547407637">Lehetővé teszi annak ellenőrzését, hogy a videók automatikusan lejátszhatók-e (felhasználói engedély nélkül) hangtartalommal a <ph name="PRODUCT_NAME" /> böngészőben. - - Ha a házirend beállítása igaz, akkor a <ph name="PRODUCT_NAME" /> automatikusan lejátszhatja a médiatartalmakat. - Ha a házirend beállítása hamis, akkor a <ph name="PRODUCT_NAME" /> nem játszhatja le automatikusan a médiatartalmakat. - A <ph name="PRODUCT_NAME" /> alapértelmezés szerint nem játszhatja le automatikusan a médiatartalmakat. - - Kérjük, vegye figyelembe, hogy amennyiben fut a <ph name="PRODUCT_NAME" />, és a házirend módosul, akkor a változás csak az újonnan megnyitott lapokon érvényesül. Emiatt egyes lapokon továbbra is a korábbi viselkedés tapasztalható. - </translation> <translation id="2077129598763517140">Hardveres gyorsítás alkalmazása lehetőség szerint</translation> <translation id="2077273864382355561">Képernyő kikapcsolásának késleltetése akkumulátorról való működés során</translation> <translation id="2082205219176343977">Az engedélyezett legrégebbi Chrome-verzió beállítása az eszközön.</translation> @@ -345,9 +337,6 @@ Ha konfigurálta ezt a beállítást, a gyorsfeloldást használó felhasználóknak a beállítástól függően kell beírniuk jelszavukat a lezárási képernyőn. Ha nem konfigurálta ezt a beállítást, a gyorsfeloldást használó felhasználóknak minden nap be kell írniuk jelszavukat a lezárási képernyőn.</translation> -<translation id="2188722565665306629">Lehetővé teszi annak az időszaknak a beállítását, amely során a <ph name="PRODUCT_NAME" /> újraindítására vonatkozó értesítések jelennek meg a függőben lévő frissítéssel kapcsolatban. - - Ezen házirend-beállítás segítségével ezredmásodpercben adható meg az az időszak, amely során a rendszer folyamatosan tájékoztatja a felhasználót arról, hogy frissítés miatt szükség van a <ph name="PRODUCT_NAME" /> (vagy a <ph name="PRODUCT_OS_NAME" />) újraindítására. Ezen időszak során a rendszer újra és újra tájékoztatja a felhasználót a frissítés szükségességéről a <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> házirend beállítása alapján. Ha a házirend értéke nincs megadva, a rendszer alapértelmezés szerint 604 800 000 ezredmásodperces időszakot (egy hét) vesz alapul.</translation> <translation id="2194470398825717446">Ezt a házirendet megszüntettük az M61 verzióban, használja helyette az EcryptfsMigrationStrategy házirendet. Meghatározza az olyan eszközök viselkedését, amelyek ecryptfs titkosítással rendelkeznek, és amelyeket át kell ültetni ext4 titkosításra.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index c758b33f..f43ebb5e 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -294,14 +294,6 @@ Setelan kebijakan ini mengaktifkan notifikasi untuk memberi tahu pengguna bahwa peluncuran ulang browser direkomendasikan atau diperlukan. Jika tidak disetel, <ph name="PRODUCT_NAME" /> memberi tahu pengguna bahwa peluncuran ulang diperlukan melalui sedikit perubahan pada menunya. Jika disetel ke 'Recommended', akan muncul peringatan berulang yang menunjukkan bahwa peluncuran ulang direkomendasikan. Pengguna dapat menutup peringatan ini untuk menunda peluncuran ulang. Jika disetel ke 'Required', akan muncul peringatan berulang yang menunjukkan bahwa peluncuran ulang browser akan dilakukan secara paksa setelah periode notifikasi terlampaui. Periode ini akan disetel secara default menjadi 7 hari, dan dapat dikonfigurasi melalui setelan kebijakan <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Sesi pengguna akan dilanjutkan kembali setelah peluncuran ulang.</translation> -<translation id="2075434678547407637">Mengizinkan Anda untuk mengontrol apakah video dapat diputar otomatis (tanpa persetujuan pengguna) dengan konten audio di <ph name="PRODUCT_NAME" />. - - Jika kebijakan disetel ke True, <ph name="PRODUCT_NAME" /> diizinkan untuk memutar otomatis media. - Jika kebijakan disetel ke False, <ph name="PRODUCT_NAME" /> tidaik diizinkan untuk memutar otomatis media. - Secara default, <ph name="PRODUCT_NAME" /> tidak diizinkan untuk memutar otomatis media. - - Perlu diperhatikan bahwa jika <ph name="PRODUCT_NAME" /> berjalan dan kebijakan ini berubah, perubahan hanya akan diterapkan ke tab baru yang terbuka. Oleh karena itu, beberapa tab mungkin masih mengalami perilaku sebelumnya. - </translation> <translation id="2077129598763517140">Gunakan akselerasi hardware jika tersedia</translation> <translation id="2077273864382355561">Penundaan mematikan layar saat menggunakan daya baterai</translation> <translation id="2082205219176343977">Mengonfigurasi versi minimum Chrome yang diizinkan untuk perangkat.</translation> @@ -346,9 +338,6 @@ Jika setelan ini dikonfigurasi, pengguna yang menggunakan buka kunci cepat akan diminta untuk memasukkan sandi pada layar kunci, bergantung pada setelan ini. Jika setelan ini tidak dikonfigurasi, pengguna yang menggunakan buka kunci cepat akan diminta untuk memasukkan sandi pada layar kunci setiap hari.</translation> -<translation id="2188722565665306629">Mengizinkan Anda menyetel jangka waktu pada <ph name="PRODUCT_NAME" /> tempat notifikasi peluncuran ditampilkan, untuk menerapkan update yang tertunda. - - Setelan kebijakan ini dapat digunakan untuk mengontrol jangka waktu, dalam milidetik, pada produk tempat pengguna mendapatkan notifikasi bahwa <ph name="PRODUCT_NAME" /> harus diluncurkan ulang (atau <ph name="PRODUCT_OS_NAME" /> harus dimulai ulang) untuk menerapkan update. Selama jangka waktu ini, pengguna akan berulang kali mendapatkan notifikasi tentang perlunya update, berdasarkan setelan kebijakan <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Jika tidak disetel, akan digunakan periode default selama 604800000 milidetik (1 minggu).</translation> <translation id="2194470398825717446">Kebijakan ini sudah tidak digunakan lagi di M61, sebagai gantinya harap gunakan EcryptfsMigrationStrategy. Menentukan perilaku perangkat yang dikirim dengan ecryptfs dan memerlukan transisi ke enkripsi ext4. @@ -1068,6 +1057,13 @@ <translation id="4482640907922304445">Menampilkan tombol Beranda di bilah alat <ph name="PRODUCT_NAME" />. Jika Anda mengaktifkan setelan ini, tombol Beranda akan selalu ditampilkan. Jika Anda menonaktifkan setelan ini, tombol Beranda tidak akan pernah ditampilkan. Jika Anda mengaktifkan atau menonaktifkan setelan ini, pengguna tidak dapat mengubah atau menimpa setelan ini di <ph name="PRODUCT_NAME" />. Membiarkan kebijakan ini tidak disetel akan memungkinkan pengguna memilih apakah akan menampilkan tombol beranda.</translation> <translation id="4485425108474077672">Mengonfigurasi URL halaman Tab Baru</translation> <translation id="4492287494009043413">Menonaktifkan pengambilan screenshot</translation> +<translation id="4497968613298501984">Mengonfigurasi daftar URL login perusahaan (khusus skema HTTP dan HTTPS). Sidik jari sandi akan diambil di URL tersebut dan digunakan untuk deteksi penggunaan ulang sandi. + Setelan ini sebaiknya hanya digunakan oleh pengguna G Suite yang menggunakan sistem SSO/SMAL. + Agar <ph name="PRODUCT_NAME" /> dapat mengambil sidik jari sandi dengan benar, harap pastikan bahwa halaman login Anda mengikuti pedoman di https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + Jika setelan ini diaktifkan, layanan perlindungan sandi akan mengambil sidik jari sandi di URL tersebut untuk tujuan deteksi penggunaan ulang sandi. + Jika setelan ini dinonaktifkan atau tidak disetel, layanan perlindungan sandi hanya akan mengambil sidik jari sandi di https://accounts.google.com. + Kebijakan ini tidak tersedia pada instance Windows yang tidak digabungkan ke domain <ph name="MS_AD_NAME" />.</translation> <translation id="450537894712826981">Mengonfigurasi ukuran cache yang akan digunakan <ph name="PRODUCT_NAME" /> untuk menyimpan file media di disk. Jika Anda menyetel kebijakan ini, <ph name="PRODUCT_NAME" /> akan menggunakan ukuran cache yang disediakan terlepas dari apakah pengguna menentukan tanda '--media-cache-size' atau tidak. Nilai yang ditentukan dalam kebijakan ini bukan merupakan batas mutlak namun merupakan saran terhadap sistem penyimpanan dalam cache, nilai apa pun di bawah beberapa megabyte dianggap terlalu kecil dan akan dibulatkan ke nilai minimum yang lebih wajar. @@ -1184,6 +1180,13 @@ Jika kebijakan ini dibiarkan tidak disetel atau kosong, semua pengguna dapat masuk ke <ph name="PRODUCT_NAME" />.</translation> <translation id="4858735034935305895">Izinkan mode layar penuh</translation> +<translation id="4868249328547841081">Mengonfigurasi URL ubah sandi (khusus skema HTTP dan HTTPS). Layanan perlindungan sandi akan mengarahkan pengguna ke URL ini untuk mengubah sandinya jika mereka menjadi sasaran phishing. + Setelan ini sebaiknya hanya digunakan oleh pengguna GSuite yang menggunakan sistem SSO/SAML. + Agar <ph name="PRODUCT_NAME" /> dapat mengambil sidik jari sandi baru di halaman ubah sandi ini dengan benar, harap pastikan bahwa halaman ubah sandi Anda mengikuti pedoman di https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + Jika setelan ini diaktifkan, layanan perlindungan sandi akan mengarahkan pengguna ke URL ini untuk mengubah sandinya jika mereka menjadi sasaran phishing. + Jika setelan ini dinonaktifkan atau tidak disetel, layanan perlindungan sandi akan mengarahkan pengguna ke https://myaccounts.google.com untuk mengubah sandinya. + Kebijakan ini tidak tersedia pada instance Windows yang tidak digabungkan ke domain <ph name="MS_AD_NAME" />.</translation> <translation id="4869787217450099946">Menentukan apakah penguncian layar saat bangun diizinkan atau tidak. Penguncian layar saat bangun dapat diminta dengan ekstensi melalui API ekstensi pengelola daya. Jika kebijakan ini disetel ke true atau tidak disetel, penguncian layar saat bangun akan diterima demi pengelolaan daya.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index c68d402..efd7936b 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -283,14 +283,6 @@ Questa impostazione della norma consente di informare l'utente tramite notifiche che è obbligatorio o consigliato eseguire un riavvio del browser. Se non è impostata, <ph name="PRODUCT_NAME" /> indica all'utente che è necessario un riavvio tramite piccole modifiche al menu. Se impostata su "Recommended", all'utente verrà mostrato un avviso ricorrente con un riavvio consigliato. L'utente può ignorare questo avviso e rimandare il riavvio. Se impostata su "Required", verrà visualizzato un avviso ricorrente all'utente che indica che il riavvio del browser sarà forzato una volta trascorso il periodo di notifica. Per impostazione predefinita, il periodo di notifica è di sette giorni e può essere configurato tramite l'impostazione della norma <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. La sessione dell'utente viene ripristinata dopo il riavvio.</translation> -<translation id="2075434678547407637">Permette di controllare se i video possono essere riprodotti automaticamente (senza il consenso dell'utente) con contenuti audio in <ph name="PRODUCT_NAME" />. - - Se la norma è impostata su true, i contenuti multimediali possono essere riprodotti automaticamente in <ph name="PRODUCT_NAME" />. - Se la norma è impostata su false, i contenuti multimediali non possono essere riprodotti automaticamente in <ph name="PRODUCT_NAME" />. - Per impostazione predefinita, <ph name="PRODUCT_NAME" /> non consente la riproduzione automatica dei contenuti multimediali. - - Tieni presente che, se <ph name="PRODUCT_NAME" /> è in esecuzione e l'impostazione della norma cambia, la modifica interesserà solo le nuove schede aperte. Pertanto alcune schede potrebbero ancora avere il comportamento precedente. - </translation> <translation id="2077129598763517140">Usa accelerazione hardware quando disponibile</translation> <translation id="2077273864382355561">Ritardo disattivazione schermo in caso di utilizzo della batteria</translation> <translation id="2082205219176343977">Configura la versione minima di Chrome consentita per il dispositivo.</translation> @@ -329,9 +321,6 @@ Se questa impostazione viene configurata, gli utenti che usano lo sblocco rapido devono inserire le proprie password nella schermata di blocco in base a questa impostazione. Se questa impostazione non viene configurata, gli utenti che usano lo sblocco rapido devono inserire ogni giorno la propria password nella schermata di blocco.</translation> -<translation id="2188722565665306629">Ti consente di impostare il periodo di tempo durante il quale vengono visualizzate le notifiche di riavvio di <ph name="PRODUCT_NAME" /> per applicare un aggiornamento in attesa. - - Questa impostazione della norma può essere utilizzata per controllare il periodo di tempo, in millisecondi, durante il quale un utente viene informato progressivamente che <ph name="PRODUCT_NAME" /> deve essere riavviato (o <ph name="PRODUCT_OS_NAME" /> deve essere riavviato) per un aggiornamento. Durante questo periodo, l'utente verrà ripetutamente informato della necessità di un aggiornamento in base all'impostazione della norma <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Se non impostata, viene utilizzato il periodo predefinito di 604800000 millisecondi (una settimana).</translation> <translation id="2194470398825717446">Questa norma è stata ritirata in M61. Usa la norma EcryptfsMigrationStrategy. Consente di specificare come deve comportarsi un dispositivo con ecryptfs e come deve passare alla crittografia ext4.
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index 97259da9..5787001 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -291,14 +291,6 @@ המדיניות הזו מאפשרת להציג למשתמש הודעות על כך שמומלץ לבצע הפעלה מחדש של הדפדפן, או שהיא נדרשת. אם המדיניות לא מוגדרת, <ph name="PRODUCT_NAME" /> מציין למשתמש שיש צורך בהפעלה מחדש בעזרת שינויים קלים במראה התפריט. אם היא מוגדרת כ'מומלצת', תוצג למשתמש אזהרה חוזרת על כך שמומלץ להפעיל מחדש את הדפדפן. המשתמש יכול לסגור את האזהרה כדי לדחות את ההפעלה מחדש. אם המדיניות מוגדרת כ'נדרשת', תוצג למשתמש אזהרה חוזרת על כך שתבוצע הפעלה מחדש כפויה של הדפדפן בסיום תקופת ההודעה. התקופה נקבעת כברירת מחדל לשבעה ימים, ואפשר לשנות אותה דרך הגדרת המדיניות <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. בסיום ההפעלה מחדש המשתמש יוחזר למצב שבו היה.</translation> -<translation id="2075434678547407637">מאפשרת לך לקבוע אם סרטונים יכולים להתחיל לפעול באופן אוטומטי (גם מבלי שהמשתמש התכוון לכך) עם תוכן אודיו ב-<ph name="PRODUCT_NAME" />. - - אם המדיניות הזו נקבעת כ-True, <ph name="PRODUCT_NAME" /> מורשה להפעיל מדיה באופן אוטומטי. - אם המדיניות הזו נקבעת כ-False, <ph name="PRODUCT_NAME" /> לא מורשה להפעיל מדיה באופן אוטומטי. - כברירת מחדל, <ph name="PRODUCT_NAME" /> לא מורשה להפעיל מדיה באופן אוטומטי. - - הערה: אם <ph name="PRODUCT_NAME" /> פועל כשמשנים את המדיניות הזו, היא תחול רק על כרטיסיות חדשות. ייתכן שכרטיסיות שכבר היו פתוחות יפעלו לפי ההתנהגות הקודמת. - </translation> <translation id="2077129598763517140">השתמש בהאצת חומרה כשניתן</translation> <translation id="2077273864382355561">השהיה של כיבוי מסך בזמן שימוש בסוללה</translation> <translation id="2082205219176343977">הגדרת הגירסה המוקדמת ביותר של Chrome שבה אפשר להשתמש במכשיר הזה.</translation> @@ -343,9 +335,6 @@ אם ההגדרה הזו נקבעה, משתמשים שהגדירו ביטול נעילה מהיר יתבקשו להזין את הסיסמה במסך הנעילה בהתאם להגדרה הזו. אם ההגדרה הזו לא נקבעה, משתמשים שהגדירו ביטול נעילה מהיר יתבקשו להזין את הסיסמה במסך הנעילה בכל יום.</translation> -<translation id="2188722565665306629">המדיניות מאפשרת לקבוע את תקופת הזמן להצגת ההודעות של <ph name="PRODUCT_NAME" /> לגבי הצורך בהפעלה מחדש כדי להחיל עדכון שנמצא בהמתנה. - - בעזרת הגדרת המדיניות הזו אפשר לקבוע במשך כמה זמן (באלפיות שנייה) תוצג למשתמש הודעה חוזרת על כך שיש להפעיל מחדש את <ph name="PRODUCT_NAME" /> (או את <ph name="PRODUCT_OS_NAME" />) כדי להחיל עדכון. בתקופת הזמן הזו המשתמש יראה הודעה חוזרת לגבי הצורך בעדכון, בהתבסס על ההגדרה של המדיניות <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. אם היא לא מוגדרת, תקופת ברירת המחדל היא 604800000 אלפיות שנייה (שבוע).</translation> <translation id="2194470398825717446">המדיניות הזו יצאה משימוש ב-M61. במקומה יש להשתמש ב-EcryptfsMigrationStrategy. מציינת איך מכשיר צריך להתנהג אם הוא כולל ecryptfs ויש להעביר אותו להצפנת ext4.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index bc40dd63..ba13e0c 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -295,14 +295,6 @@ このポリシー設定は、ブラウザの再起動を推奨するか必要とすることをユーザーに示す通知を有効にするものです。このポリシーを設定しない場合、再起動が必要であることをユーザーに知らせるために <ph name="PRODUCT_NAME" /> のメニュー表示がわずかに変更されます。このポリシーを「推奨」に設定した場合は、再起動を推奨する警告がユーザーに繰り返し表示されます。ユーザーはこの警告を閉じて再起動を遅らせることができます。このポリシーを「必須」に設定した場合は、通知期間を過ぎるとブラウザが自動的に再起動されることを示す警告がユーザーに繰り返し表示されます。この期間はデフォルトでは 7 日間で、<ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> ポリシー設定で変更できます。 再起動後はユーザー セッションが復元されます。</translation> -<translation id="2075434678547407637"><ph name="PRODUCT_NAME" /> で音声コンテンツ付きの動画をユーザーの同意なしに自動再生できるかどうかを制御します。 - - このポリシーを true に設定した場合、<ph name="PRODUCT_NAME" /> ではメディアを自動再生できます。 - このポリシーを false に設定した場合、<ph name="PRODUCT_NAME" /> ではメディアを自動再生できません。 - デフォルトでは、<ph name="PRODUCT_NAME" /> ではメディアを自動再生できません。 - - <ph name="PRODUCT_NAME" /> の実行中にこのポリシーを変更した場合、変更内容は新しく開かれるタブにのみ適用されます。そのため、一部のタブでは引き続き以前の動作が見られる可能性があります。 - </translation> <translation id="2077129598763517140">ハードウェア アクセラレーションが使用可能な場合は使用する</translation> <translation id="2077273864382355561">画面がオフになるまでの時間(バッテリー電源での実行時)</translation> <translation id="2082205219176343977">端末での使用を許可する Chrome の最小バージョンを設定する。</translation> @@ -341,9 +333,6 @@ この設定に値を指定した場合、ロックのクイック解除機能を使用しているユーザーには、この設定に基づくタイミングでロック画面でのパスワード入力が求められます。 この設定に値を指定しなかった場合、ロックのクイック解除機能を使用しているユーザーには、1 日に 1 回ロック画面でのパスワード入力が求められます。</translation> -<translation id="2188722565665306629">保留中のアップデートを適用するための <ph name="PRODUCT_NAME" /> の再起動通知を表示する期間を設定します。 - - このポリシー設定を使用して、アップデートに <ph name="PRODUCT_NAME" /> の再起動(または <ph name="PRODUCT_OS_NAME" /> の再起動)が必要であることをユーザーに連続的に通知する期間をミリ秒単位で設定できます。この期間を通じて、<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ポリシーの設定に基づき、アップデートが必要であることがユーザーに繰り返し通知されます。このポリシーが設定されていない場合は、デフォルトの期間として 604800000 ミリ秒(1 週間)が使用されます。</translation> <translation id="2194470398825717446">このポリシーは M61 でサポート終了となりました。代わりに EcryptfsMigrationStrategy を使用してください。 初期状態で ecryptfs を使用するように設定され、ext4 暗号化に移行する必要のある端末について、動作方法を指定します。
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index 9cb0d9ea..0e9f5e31 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -320,14 +320,6 @@ ಬ್ರೌಸರ್ ಅನ್ನು ಪುನರಾರಂಭಿಸುವುದು ಅಗತ್ಯವಿದೆ ಅಥವಾ ಅದನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ ಎಂದು ಬಳಕೆದಾರರಿಗೆ ತಿಳಿಸಲು ಈ ಕಾರ್ಯನೀತಿ ಸೆಟ್ಟಿಂಗ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. ಇದನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, ಮೆನುವಿಗೆ ಸೂಕ್ಷ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡುವ ಮೂಲಕ <ph name="PRODUCT_NAME" />, ಪುನರಾರಂಭಿಸುವ ಅಗತ್ಯವಿದೆಯೆಂದು ಬಳಕೆದಾರರಿಗೆ ಸೂಚನೆ ನೀಡುತ್ತದೆ. 'ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಪುನರಾರಂಭಿಸುವುದನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ ಎಂದು ಬಳಕೆದಾದರಿಗೆ ಸೂಚಿಸುವ, ಮರುಕಳಿಸುವ ಎಚ್ಚರಿಕೆಯನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ. ಪುನರಾರಂಭಿಸುವುದನ್ನು ಮುಂದೂಡಲು, ಬಳಕೆದಾರರು ಈ ಎಚ್ಚರಿಕೆಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಬಹುದು. 'ಅಗತ್ಯವಿದೆ' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಅಧಿಸೂಚನೆಯು ಮರೆಯಾದ ಬಳಿಕ, ಬ್ರೌಸರ್ ಅನ್ನು ಬಲವಂತವಾಗಿ ಪುನರಾರಂಭಿಸಲಾಗುವುದು ಎಂದು ಬಳಕೆದಾರರಿಗೆ ಸೂಚಿಸುವ, ಮರುಕಳಿಸುವ ಎಚ್ಚರಿಕೆಯನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ. ಈ ಕಾಲಾವಧಿಯು ಡಿಫಾಲ್ಟ್ ಆಗಿ ಏಳು ದಿನಗಳಾಗಿರುತ್ತದೆ ಮತ್ತು <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> ಕಾರ್ಯನೀತಿ ಸೆಟ್ಟಿಂಗ್ ಮೂಲಕ ಇದನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು. ಪುನರಾರಂಭಿಸಿದ ಬಳಿಕ, ಬಳಕೆದಾರರ ಸೆಶನ್ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗುವುದು.</translation> -<translation id="2075434678547407637">ಒಂದು ವೇಳೆ <ph name="PRODUCT_NAME" /> ನಲ್ಲಿರುವ ಆಡಿಯೋ ವಿಷಯದೊಂದಿಗೆ ವೀಡಿಯೊಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ (ಬಳಕೆದಾರನ ಸಮ್ಮತಿಯಿಲ್ಲದೆ) ಪ್ಲೇ ಆಗಬಹುದಾದರೆ, ನಿಮಗೆ ನಿಯಂತ್ರಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. - - ಕಾರ್ಯನೀತಿಯನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿದರೆ, ಮಾಧ್ಯಮವನ್ನು ಸ್ವಯಂಪ್ಲೇ ಮಾಡಲು <ph name="PRODUCT_NAME" /> ಗೆ ಅನುಮತಿಯಿರುತ್ತದೆ. - ಕಾರ್ಯನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದರೆ, ಮಾಧ್ಯಮವನ್ನು ಸ್ವಯಂಪ್ಲೇ ಮಾಡಲು <ph name="PRODUCT_NAME" /> ಗೆ ಅನುಮತಿಯಿರುವುದಿಲ್ಲ. - ಡಿಫಾಲ್ಟ್ ರೂಪದಲ್ಲಿ, ಮಾಧ್ಯಮವನ್ನು ಸ್ವಯಂಪ್ಲೇ ಮಾಡಲು <ph name="PRODUCT_NAME" /> ಗೆ ಅನುಮತಿಯಿರುವುದಿಲ್ಲ. - - ಒಂದು ವೇಳೆ <ph name="PRODUCT_NAME" /> ಚಾಲನೆಯಲ್ಲಿದ್ದಾಗ ಮತ್ತು ಈ ನೀತಿಯನ್ನು ಬದಲಾಯಿಸಿದ್ದಲ್ಲಿ, ಹೊಸದಾಗಿ ತೆರೆದ ಟ್ಯಾಬ್ಗಳಿಗೆ ಮಾತ್ರ ಇದನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಗಮನದಲ್ಲಿಟ್ಟುಕೊಳ್ಳಿ. ಆದ್ದರಿಂದ ಕೆಲವು ಟ್ಯಾಬ್ಗಳು ಹಿಂದಿನ ನಡುವಳಿಕೆಯನ್ನೇ ಇನ್ನೂ ಸಹ ಅನುಸರಿಸಬಹುದು. - </translation> <translation id="2077129598763517140">ಲಭ್ಯವಿರುವಾಗ ಹಾರ್ಡ್ವೇರ್ ಆಕ್ಸಲರೇಶನ್ ಬಳಸು</translation> <translation id="2077273864382355561">ಬ್ಯಾಟರಿ ಪವರ್ನಲ್ಲಿ ರನ್ ಆಗುತ್ತಿರುವಾಗ ಪರದೆ ಆಫ್ ವಿಳಂಬವಾಗುತ್ತದೆ</translation> <translation id="2082205219176343977">ಸಾಧನಕ್ಕಾಗಿ ಅನುಮತಿಸಿರುವ, Chrome ನ ಕನಿಷ್ಠ ಆವೃತ್ತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ.</translation> @@ -373,9 +365,6 @@ ಈ ಸೆಟ್ಟಿಂಗ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದರೆ, ಬಳಕೆದಾರರು ಬಳಸುತ್ತಿರುವ ತ್ವರಿತ ಅನ್ಲಾಕ್ ಈ ಸೆಟ್ಟಿಂಗ್ ಆಧರಿಸಿ ಲಾಕ್ ಪರದೆಯಲ್ಲಿ ಅವರ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಮೂದಿಸಲು ವಿನಂತಿಸುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿಲ್ಲದಿದ್ದರೆ, ಬಳಕೆದಾರರು ಬಳಸುತ್ತಿರುವ ತ್ವರಿತ ಅನ್ಲಾಕ್ ಪ್ರತಿ ದಿನ ಲಾಕ್ ಪರದೆಯಲ್ಲಿ ಅವರ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಮೂದಿಸಲು ವಿನಂತಿಸುತ್ತದೆ.</translation> -<translation id="2188722565665306629">ಬಾಕಿ ಇರುವ ಅಪ್ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲು <ph name="PRODUCT_NAME" /> ಪುನರಾರಂಭದ ಸೂಚನೆಗಳನ್ನು ತೋರಿಸಬೇಕಾದ ಕಾಲಾವಧಿಯನ್ನು ಹೊಂದಿಸಲು ಇದು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. - - ಮಿಲಿಸೆಕೆಂಡುಗಳಲ್ಲಿ ಕಾಲಾವಧಿಯನ್ನು ನಿಯಂತ್ರಿಸಲು ಈ ಕಾರ್ಯನೀತಿ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಸಬಹುದು. ಅಪ್ಡೇಟ್ ಮಾಡಲು <ph name="PRODUCT_NAME" /> ಅನ್ನು ಪುನರಾರಂಭಿಸಬೇಕು (ಅಥವಾ <ph name="PRODUCT_OS_NAME" /> ಅನ್ನು ರಿಸ್ಟಾರ್ಟ್ ಮಾಡಬೇಕು) ಎಂದು ಈ ಅವಧಿಯಲ್ಲಿ, ಬಳಕೆದಾರರಿಗೆ ಆಗಾಗ ತಿಳಿಸಲಾಗುತ್ತದೆ. ಈ ಅವಧಿಯಲ್ಲಿ, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯನ್ನು ಆಧರಿಸಿ, ಅಪ್ಡೇಟ್ನ ಆವಶ್ಯಕತೆಯ ಕುರಿತು ಬಳಕೆದಾರರಿಗೆ ಪುನರಾವರ್ತಿತವಾಗಿ ತಿಳಿಸಲಾಗುತ್ತದೆ. ಇದನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, 604800000 ಮಿಲಿಸೆಕೆಂಡುಗಳ (ಒಂದು ವಾರ) ಡಿಫಾಲ್ಟ್ ಅವಧಿಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.</translation> <translation id="2194470398825717446">ಈ ನೀತಿಯನ್ನು M61ನಲ್ಲಿ ಅಸಮ್ಮತಿಸಲಾಗಿದೆ. ಬದಲಿಗೆ RemoteAccessHostClientDomainList ಅನ್ನು ಬಳಸಿ. ecryptfs ನೊಂದಿಗೆ ಶಿಪ್ಪಿಂಗ್ ಆಗಿರುವ ಸಾಧನವು ಹೇಗೆ ವರ್ತಿಸಬೇಕು ಮತ್ತು ext4 ಎನ್ಕ್ರಿಪ್ಶನ್ಗೆ ಪರಿವರ್ತನೆಯಾಗಬೇಕು ಎಂಬುದನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 4b95c9b..075249c 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -302,14 +302,6 @@ 이 정책을 설정하면 사용자에게 브라우저 재실행이 필요하거나 권장된다는 알림이 전송됩니다. 정책을 설정하지 않으면 <ph name="PRODUCT_NAME" />의 메뉴가 미세하게 변경되어 재실행이 필요하다는 정보가 사용자에게 전달됩니다. 정책을 '권장'으로 설정하면 재실행하는 것이 좋다는 경고 메시지가 사용자에게 반복적으로 표시됩니다. 사용자는 이 경고를 무시하고 나중에 재실행할 수 있습니다. '필수'로 설정하면 알림 기간이 지난 후 브라우저가 강제로 재실행된다는 경고 메시지가 사용자에게 반복적으로 표시됩니다. 이 기간은 기본적으로 7일로 설정되어 있으며, <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 정책 설정을 통해 변경할 수 있습니다. 재실행 후에는 사용자의 세션이 복원됩니다.</translation> -<translation id="2075434678547407637"><ph name="PRODUCT_NAME" />에서 오디오 콘텐츠가 포함된 동영상을 사용자 동의 없이 자동 재생할지 제어할 수 있습니다. - - 이 정책을 True로 설정하면 <ph name="PRODUCT_NAME" />에서 미디어를 자동재생할 수 있습니다. - 이 정책을 False로 설정하면 <ph name="PRODUCT_NAME" />에서 미디어를 자동재생할 수 없습니다. - 기본적으로 <ph name="PRODUCT_NAME" />에서는 미디어를 자동재생할 수 없습니다. - - <ph name="PRODUCT_NAME" />이(가) 실행 중이며 이 정책이 변경되면 새로 열린 탭에만 변경사항이 적용됩니다. 따라서 일부 탭에서는 이전과 같은 행동이 계속 나타날 수 있습니다. - </translation> <translation id="2077129598763517140">가능한 경우 하드웨어 가속 사용</translation> <translation id="2077273864382355561">배터리 전원으로 실행할 때 화면 꺼짐 지연</translation> <translation id="2082205219176343977">기기에 허용되는 최소 Chrome 버전을 설정합니다.</translation> @@ -354,9 +346,6 @@ 이 설정을 구성하면 빠른 잠금 해제를 사용하는 사용자에게 이 설정에 따라 잠금 화면에 비밀번호를 입력하라는 메시지가 표시됩니다. 이 설정을 구성하지 않으면 빠른 잠금 해제를 사용하는 사용자는 매일 잠금 화면에 비밀번호를 입력해야 합니다</translation> -<translation id="2188722565665306629">대기 중인 업데이트를 적용하기 위해 <ph name="PRODUCT_NAME" /> 재실행 알림이 표시되는 기간을 설정할 수 있습니다. - - 이 정책 설정을 사용하면 업데이트를 위해 <ph name="PRODUCT_NAME" />을(를) 재실행하거나 <ph name="PRODUCT_OS_NAME" />을(를) 재시작해야 한다는 알림을 사용자에게 반복적으로 표시할 기간을 밀리초 단위로 관리할 수 있습니다. 이 기간 동안 <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 정책의 설정에 따라 업데이트가 필요하다는 알림이 사용자에게 반복적으로 표시됩니다. 이 정책을 설정하지 않으면 604,800,000밀리초(일주일)가 기본적으로 사용됩니다.</translation> <translation id="2194470398825717446">이 정책은 M61부터 지원이 중단되었으므로 EcryptfsMigrationStrategy를 대신 사용하세요. ecryptfs가 포함되어 배송된 기기의 작동 방식을 지정하며 ex4 암호화로 전환해야 합니다.
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index 903ef0b5..167172a 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -302,14 +302,6 @@ Taikant šį politikos nustatymą įgalinami pranešimai, kuriais naudotojas informuojamas, kad rekomenduojama arba būtina iš naujo paleisti naršyklę. Nenustačius, „<ph name="PRODUCT_NAME" />“ subtiliais meniu pakeitimais nurodo naudotojui, kad reikia paleisti iš naujo. Nustačius kaip „Rekomenduojama“, naudotojui rodomas pasikartojantis įspėjimas, kad rekomenduojama paleisti iš naujo. Naudotojas gali atsisakyti šio pranešimo, kad atidėtų paleidimą iš naujo. Nustačius kaip „Būtina“, naudotojui rodomas pasikartojantis įspėjimas, nurodantis, kad naršyklė bus priverstinai paleista iš naujo pasibaigus pranešimo laikotarpiui. Pagal numatytuosius nustatymus šis laikotarpis yra septynios dienos. Jį galima konfigūruoti politikos „<ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />“ nustatymuose. Paleidus iš naujo, naudotojo sesija atkuriama.</translation> -<translation id="2075434678547407637">Leidžiama jums valdyti, ar vaizdo įrašus galima leisti automatiškai (be naudotojo sutikimo) su garso įrašo turiniu, naudojant „<ph name="PRODUCT_NAME" />“. - - Nustačius politiką kaip „True“, „<ph name="PRODUCT_NAME" />“ leidžiama automatiškai leisti mediją. - Nustačius politiką kaip „False“, „<ph name="PRODUCT_NAME" />“ neleidžiama automatiškai leisti medijos. - Pagal numatytuosius nustatymus „<ph name="PRODUCT_NAME" />“ neleidžiama automatiškai leisti medijos. - - Atminkite, kad pakeitus politiką, kai vykdoma „<ph name="PRODUCT_NAME" />“, tai bus taikoma tik naujiems atidarytiems skirtukams. Todėl kai kurie skirtukai vis dar gali veikti, kaip anksčiau. - </translation> <translation id="2077129598763517140">Kai galima, naudoti aparatinės įrangos paspartinimą</translation> <translation id="2077273864382355561">Ekrano išjungimo delsa, kai naudojama akumuliatoriaus energija</translation> <translation id="2082205219176343977">Konfigūruoti mažiausią leistiną įrenginio „Chrome“ versiją.</translation> @@ -354,9 +346,6 @@ Jei šis nustatymas sukonfigūruotas, spartųjį atrakinimą naudojančių naudotojų bus prašoma įvesti slaptažodžius užrakinimo ekrane, atsižvelgiant į šį nustatymą. Jei šis nustatymas nesukonfigūruotas, spartųjį atrakinimą naudojančių naudotojų bus prašoma kasdien įvesti slaptažodį užrakinimo ekrane.</translation> -<translation id="2188722565665306629">Leidžiama nustatyti laikotarpį, per kurį rodomi „<ph name="PRODUCT_NAME" />“ paleidimo iš naujo pranešimai, kad būtų galima pritaikyti laukiantį naujinį. - - Šį politikos nustatymą galima naudoti norint valdyti laikotarpį (milisekundėmis), per kurį naudotojas pakartotinai informuojamas, kad būtina iš naujo paleisti „<ph name="PRODUCT_NAME" />“ (arba pakartotinai paleisti „<ph name="PRODUCT_OS_NAME" />“) norint pritaikyti naujinį. Per šį laikotarpį naudotojui bus pakartotinai pranešama apie reikalingą atnaujinimą, atsižvelgiant į politikos „<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />“ nustatymą. Jei nenustatyta, naudojamas numatytasis 604 800 000 millisekundžių (vienos savaitės) laikotarpis.</translation> <translation id="2194470398825717446">Ši politika nebenaudojama M61, vietoje jos naudokite „EcryptfsMigrationStrategy“. Nurodo, kaip su „ecryptfs“ pristatytas įrenginys turi elgtis, jei reikia pereiti prie „ext4“ šifruotės.
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb index b249fa6e..a6f2064 100644 --- a/components/policy/resources/policy_templates_lv.xtb +++ b/components/policy/resources/policy_templates_lv.xtb
@@ -301,14 +301,6 @@ Izmantojot šo politikas iestatījumu, tiek iespējoti paziņojumi lietotājiem par ieteicamu vai obligātu pārlūka atkārtotu palaišanu. Ja šī politika nav iestatīta, pārlūkā <ph name="PRODUCT_NAME" /> ar nelielām izmaiņām izvēlnē lietotājam tiek norādīts, ka ir jāveic atkārtota palaišana. Ja politikai ir iestatīta vērtība “Recommended”, lietotājam periodiski tiek rādīts brīdinājums par to, ka ieteicams veikt atkārtotu palaišanu. Lietotājs var noraidīt šo brīdinājumu, lai atliktu atkārtoto palaišanu. Ja šai politikai ir iestatīta vērtība “Required”, lietotājam periodiski tiek rādīts brīdinājums par to, ka pārlūks tiks atkārtoti palaists piespiedu kārtā, tiklīdz beigsies paziņojuma periods. Pēc noklusējuma šis periods ir septiņas dienas, un to var konfigurēt politikas <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> iestatījumos. Pēc atkārtotas palaišanas tiek atjaunota lietotāja sesija.</translation> -<translation id="2075434678547407637">Atļauj kontrolēt, vai <ph name="PRODUCT_NAME" /> videoklipus var atskaņot automātiski kopā ar audio saturu (bez lietotāja piekrišanas). - - Ja politikai ir iestatīta vērtība “True”, <ph name="PRODUCT_NAME" /> ir atļauts atskaņot multividi automātiski. - Ja politikai ir iestatīta vērtība “False”, <ph name="PRODUCT_NAME" /> nav atļauts atskaņot multividi automātiski. - Pēc noklusējuma <ph name="PRODUCT_NAME" /> nav atļauts atskaņot multividi automātiski. - - Ņemiet vērā, ja darbojas <ph name="PRODUCT_NAME" /> un šīs politikas vērtība tiek mainīta, tā tiks piemērota tikai jaunākajām atvērtajām cilnēm. Tādējādi dažās cilnēs joprojām var tikt novērota iepriekšējā rīcība. - </translation> <translation id="2077129598763517140">Izmantot aparatūras paātrināšanas režīmu, kad tas ir pieejams</translation> <translation id="2077273864382355561">Aizkave līdz ekrāna izslēgšanai, ja ierīce darbojas ar akumulatora jaudu</translation> <translation id="2082205219176343977">Konfigurējiet ierīcē minimālo atļauto Chrome versiju.</translation> @@ -355,9 +347,6 @@ Ja šis iestatījums ir konfigurēts, lietotājiem, kuri izmanto ātro atbloķēšanu, atbilstoši šim iestatījumam bloķēšanas ekrānā būs jāievada parole. Ja šis iestatījums nav konfigurēts, lietotājiem, kuri izmanto ātro bloķēšanu, bloķēšanas ekrānā būs jāievada parole katru dienu.</translation> -<translation id="2188722565665306629">Ļauj iestatīt laika periodu, kurā tiek rādīti <ph name="PRODUCT_NAME" /> atkārtotas palaišanas paziņojumi, lai veiktu neapstrādātu atjauninājumu. - - Šīs politikas iestatījumus var izmantot, lai kontrolētu laika periodu (milisekundēs), kurā lietotājs tiek pakāpeniski informēts, ka pārlūks <ph name="PRODUCT_NAME" /> ir atkārtoti jāpalaiž (vai ka pārlūks <ph name="PRODUCT_OS_NAME" /> ir jārestartē) atjaunināšanas nolūkā. Šajā laika periodā lietotājs tiks atkārtoti informēts par to, ka jāveic atjaunināšana, pamatojoties uz politikas <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> iestatījumu. Ja šī politika nav iestatīta, tiek izmantots noklusējuma periods — 604800000 milisekundes (viena nedēļa).</translation> <translation id="2194470398825717446">Šī politika ir novecojusi versijā M61. Lūdzu, izmantojiet politiku EcryptfsMigrationStrategy. Norāda ierīces darbību gadījumos, kad tajā uzstādīta sistēma eCryptfs un jāpāriet uz ext4 šifrēšanu.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index d2d2fb9c..ef8d28d 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -358,14 +358,6 @@ സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഇതിന്റെ മെനുവിലെ സൂക്ഷ്മമായ മാറ്റങ്ങളിലൂടെ വീണ്ടും സമാരംഭിക്കൽ ആവശ്യമാണെന്ന് <ph name="PRODUCT_NAME" /> ഉപയോക്താവിനോട് സൂചിപ്പിക്കുന്നു. 'ശുപാർശ ചെയ്തു' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, വീണ്ടും സമാരംഭിക്കൽ ശുപാർശ ചെയ്തിരിക്കുന്നതായി ആവർത്തിച്ചുള്ള മുന്നറിയിപ്പ് ഉപയോക്താവിനെ കാണിക്കും. വീണ്ടും സമാരംഭിക്കൽ നീട്ടിവെക്കാനായി ഉപയോക്താവിന് ഈ മുന്നറിയിപ്പ് നിരാകരിക്കാനാവും. 'ആവശ്യമാണ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, അറിയിപ്പ് കാലാവധി കഴിഞ്ഞാലുടൻ, ബ്രൗസർ നിർബന്ധിത സമാരംഭിക്കലിന് വിധേയമാകുമെന്ന് സൂചിപ്പിക്കുന്ന ആവർത്തിച്ചുള്ള മുന്നറിയിപ്പ് ഉപയോക്താവിനെ കാണിക്കും. ഡിഫോൾട്ടായി ഏഴ് ദിവസമാണ് ഇതിന്റെ കാലാവധി, മാത്രമല്ല <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> നയ ക്രമീകരണം വഴി ഇത് കോണ്ഫിഗര് ചെയ്തേക്കാം. വീണ്ടും സമാരംഭിക്കലിനെ തുടർന്ന് ഉപയോക്താവിന്റെ സെഷൻ പുനഃസ്ഥാപിക്കപ്പെടും.</translation> -<translation id="2075434678547407637"><ph name="PRODUCT_NAME" />-ൽ, ഓഡിയോ ഉള്ളടക്കത്തിനൊപ്പം വീഡിയോകൾക്ക് സ്വമേധയാ (ഉപയോക്താവിന്റെ അനുമതി ഇല്ലാതെ) പ്ലേ ചെയ്യാൻ കഴിയുമോ എന്നത് നിയന്ത്രിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. - - നയം 'ട്രൂ' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, മീഡിയ സ്വമേധയാ പ്ലേ ചെയ്യാൻ <ph name="PRODUCT_NAME" />-നെ അനുവദിക്കും. - നയം 'ഫാൾസ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, മീഡിയ സ്വമേധയാ പ്ലേ ചെയ്യാൻ <ph name="PRODUCT_NAME" />-നെ അനുവദിക്കില്ല. - ഡിഫോൾട്ടായി, മീഡിയ സ്വമേധയാ പ്ലേ ചെയ്യാൻ <ph name="PRODUCT_NAME" />-നെ അനുവദിക്കില്ല. - - <ph name="PRODUCT_NAME" /> റൺ ചെയ്യുകയും ഈ നയം മാറ്റുകയും ചെയ്യുന്നെങ്കിൽ, ഇത് പുതിയതായി തുറന്ന ടാബുകളിലേക്ക് മാത്രം ബാധകമാക്കപ്പെടും. അതിനാൽ ചില ടാബുകൾ മുമ്പത്തെ പ്രവർത്തനരീതി തുടർന്നും പാലിച്ചേക്കാം. - </translation> <translation id="2077129598763517140">ലഭ്യമാകുമ്പോൾ ഹാർഡ്വെയർ ത്വരിതപ്പെടുത്തൽ ഉപയോഗിക്കുക</translation> <translation id="2077273864382355561">ബാറ്ററി പവറിൽ പ്രവർത്തിക്കുമ്പോൾ സ്ക്രീൻ ഓഫ് ആകുന്നതിന്റെ കാലതാമസം</translation> <translation id="2082205219176343977">ഉപകരണത്തിന് അനുവദനീയമായ കുറഞ്ഞ Chrome പതിപ്പ് കോണ്ഫിഗര് ചെയ്യുക.</translation> @@ -421,9 +413,6 @@ ഈ ക്രമീകരണം കോൺഫിഗർ ചെയ്തിട്ടുണ്ടെങ്കിൽ, ഈ ക്രമീകരണം അടിസ്ഥാനമാക്കി അതിവേഗ അൺലോക്ക് ഉപയോഗിക്കുന്ന ഉപയോക്താക്കളോട് ലോക്ക് സ്ക്രീനിൽ അവരുടെ പാസ്വേഡ് നൽകാൻ അഭ്യർത്ഥിക്കും. ഈ ക്രമീകരണം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിൽ, അതിവേഗ അൺലോക്ക് ഉപയോഗിക്കുന്ന ഉപയോക്താക്കളോട് ലോക്ക് സ്ക്രീനിൽ ഓരോ ദിവസവും അവരുടെ പാസ്വേഡ് നൽകാൻ അഭ്യർത്ഥിക്കും.</translation> -<translation id="2188722565665306629">തീർച്ചപ്പെടുത്താത്ത അപ്ഡേറ്റ് പ്രയോഗിക്കാൻ, <ph name="PRODUCT_NAME" /> വീണ്ടും സമാരംഭിക്കൽ അറിയിപ്പുകൾ കാണിക്കുന്ന സമയ പരിധി സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. - - മില്ലി സെക്കൻഡിൽ സമയ പരിധി നിയന്ത്രിക്കാനായി ഈ നയ ക്രമീകരണം ഉപയോഗിക്കാം, അപ്ഡേറ്റിനായി <ph name="PRODUCT_NAME" /> വീണ്ടും സമാരംഭിക്കേണ്ടതുണ്ടെന്ന് (അല്ലെങ്കിൽ <ph name="PRODUCT_OS_NAME" /> പുനരാരംഭിക്കേണ്ടതുണ്ട്) ഉപയോക്താവിനെ ഇത് പ്രകാരം അറിയിക്കും. ഈ കാലയളവിൽ, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> നയ ക്രമീകരണത്തിന്റെ അടിസ്ഥാനത്തിൽ അപ്ഡേറ്റ് ചെയ്യേണ്ടതിന്റെ ആവശ്യകതയെ കുറിച്ച് ആവർത്തിച്ച് ഉപയോക്താവിനെ അറിയിക്കും. സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഡിഫോൾട്ട് സമയ പരിധിയായ 604800000 മില്ലി സെക്കൻഡുകൾ (ഒരാഴ്ച) ഉപയോഗിക്കപ്പെടും.</translation> <translation id="2194470398825717446">ഈ നയം M61-ൽ അവസാനിപ്പിച്ചതിനാൽ പകരം EcryptfsMigrationStrategy ഉപയോഗിക്കുക. ecryptfs ഉപയോഗിച്ച് ഷിപ്പുചെയ്ത ഒരു ഉപകരണം എങ്ങനെ പ്രവർത്തിക്കണമെന്നും, ext4 എന്ക്രിപ്ഷനിലേക്ക് സംക്രമണം നടത്തേണ്ടത് ആവശ്യമാണെന്നും വ്യക്തമാക്കുന്നു.
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb index 4bd0a260..4c3b3ac9 100644 --- a/components/policy/resources/policy_templates_mr.xtb +++ b/components/policy/resources/policy_templates_mr.xtb
@@ -339,14 +339,6 @@ हे धोरण सेटिंग ब्राउझर रीलाँच करण्याची शिफारस केली आहे किंवा आवश्यक आहे हे वापरकर्त्यास सूचित कण्यासाठी सूचना सुरू करते. सेट केले नसल्यास, मेनूमध्ये थोडे बदल करून रीलाँच करणे आवश्यक असल्याचे <ph name="PRODUCT_NAME" /> वापरकर्त्याला सूचित करते. 'शिफारस केली' वर सेट केले असल्यास, रीलाँचची शिफारस केली आहे ही आवर्ती चेतावणी वापरकर्त्याला दाखवली जाईल. रीलाँच स्थगित करण्यासाठी वापरकर्ता ही चेतावणी डिसमिस करू शकतो. 'आवश्यक' वर सेट केले असल्यास, सूचना कालावधी संपल्यावर ब्राउझरला रीलॉंच होण्यास भाग पाडले जाईल असे सूचित करणारी आवर्ती चेतावणी वापरकर्त्याला दाखवली जाईल. हा कालावधी बाय डिफॉल्ट सात दिवसांचा आहे आणि <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> धोरण सेटिंगमधून कॉन्फिगर केला जाऊ शकतो. रीलॉंचनंतर वापरकर्त्याचे सत्र रीस्टोअर केले जाते.</translation> -<translation id="2075434678547407637"><ph name="PRODUCT_NAME" /> मध्ये (वापरकर्ता संमतीशिवाय) ऑडिओ आशयासह आपोआप प्ले होणारे व्हिडिओ नियंत्रित करण्याची तुम्हाला अनुमती देते. - - धोरण सत्य वर सेट केले असल्यास, <ph name="PRODUCT_NAME" /> ला मीडिया ऑटोप्ले करण्याची अनुमती आहे. - धोरण असत्य वर सेट केले असल्यास, <ph name="PRODUCT_NAME" /> ला मीडिया ऑटोप्ले करण्याची अनुमती नाही. - डीफॉल्टनुसार, <ph name="PRODUCT_NAME" /> ला मीडिया ऑटोप्ले करण्याची अनुमती नसते. - - लक्षात ठेवा की <ph name="PRODUCT_NAME" /> सुरू असताना धोरण बदल्यास, ते फक्त नवीन उघडलेल्या टॅबना लागू होईल. म्हणूनच काही टॅब कदाचित मागील वर्तनाचे निरीक्षण करू शकतील. - </translation> <translation id="2077129598763517140">उपलब्ध असेल तेव्हा हार्डवेअर ऍक्सीलरेशन वापरा</translation> <translation id="2077273864382355561">बॅटरी उर्जेवर चालताना स्क्रीन बंद विलंब</translation> <translation id="2082205219176343977">डिव्हाइससाठी किमान अनुमती असलेली Chrome आवृत्ती कॉन्फिगर करा.</translation> @@ -398,9 +390,6 @@ हे सेटिंग कॉन्फिगर केले असल्यास, द्रुत अनलॉक वापरत असलेल्या वापरकर्त्यांना या सेटिंगवर आधारित लॉक स्क्रीनवर त्यांचे संंकेतशब्द एंटर करण्याची विनंती केली जाईल. हे सेटिंग कॉन्फिगर केले नसल्यास, द्रुत अनलॉक वापरणार्या वापरकर्त्यांना दर दिवशी लॉक स्क्रीनवर त्यांचा संंकेतशब्द एंटर करण्याची विनंती केली जाईल.</translation> -<translation id="2188722565665306629">तुम्हाला कालावधी सेट करण्याची अनुमती देतो ज्यानुसार प्रलंबित अपडेट दाखवण्यासाठी <ph name="PRODUCT_NAME" /> रीलाँच सूचना दाखवल्या आहेत. - - कालावधी मिलीसेकंदांमध्ये नियंत्रित करण्यासाठी हे धोरण सेटिंग वापरले जाऊ शकते, ज्यानुसार वापरकर्त्याला टप्प्याटप्प्याने कळवले जाते की, अपडेटसाठी <ph name="PRODUCT_NAME" /> रीलाँच करणे आवश्यक आहे (किंंवा <ph name="PRODUCT_OS_NAME" /> रीस्टार्ट करणे आवश्यक आहे). या कालावधीत वापरकर्त्याला <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> धोरणाच्या सेटिंगवर आधारित अपडेटची आवश्यकता वारंवार कळवली जाते. सेट न केल्यास, ६०४८००००० मिलीसेकंदांचा डिफॉल्ट कालावधी (एक आठवडा) वापरला जातो.</translation> <translation id="2194470398825717446">हे धोरण M61 मध्ये कालबाह्य झाले आहे, कृपया त्याऐवजी EcryptfsMigrationStrategy धोरण वापरा. ecryptfs सोबत पाठवलेल्या डिव्हाइसने कसे काम करावे आणि ext4 एंक्रिप्शनवर संक्रमणाची आवश्यकता असते हे निर्दिष्ट करते. @@ -1494,13 +1483,13 @@ <translation id="5106504910236139235"><ph name="PRODUCT_NAME" /> चे सुरक्षित ब्राउझिंग विस्तारित अहवाल सुरू करते आणि वापरकर्त्यांना हे सेटिंग बदलण्यापासून प्रतिबंधित करते. विस्तारित अहवाल Google सर्व्हरला धोकादायक अॅप्स आणि साइट शोधण्यासाठी सिस्टमबद्दलची माहिती आणि पेज आशय पाठवते. - जर हे सेटिंग सत्य वर सेट केले असेल, तर जेव्हा गरज असेल तेव्हा अहवाल तयार करून पाठवले जातील (जसे सुरक्षा इंटर्स्टिशल दाखवले जाते तेव्हा). + जर हे सेटिंग सत्य वर सेट केले असेल, तर जेव्हा गरज असेल तेव्हा अहवाल तयार करून पाठवले जातील (जसे सुरक्षा इंटरस्टिशियल दाखवले जाते तेव्हा). जर हे सेटिंग असत्य वर सेट केले असेल, तर अहवाल कधीच पाठवले जाणार नाहीत. जर हे धोरण सत्य किंवा असत्य वर सेट केले असेल, तर वापरकर्ता सेटिंग सुधारू शकणार नाही. - जर हे धोरण सेट न केलेले ठेवल्यास, तर वापरकर्ता सेटिंग बदलु शकेल आणि अहवाल पाठवायचे की नाही ते ठरवू शकेल. + जर हे धोरण सेट न केलेले ठेवले असेल, तर वापरकर्ता सेटिंग बदलू शकेल आणि अहवाल पाठवायचे की नाही ते ठरवू शकेल. सुरक्षित ब्राउझिंग च्या अधिक माहितीसाठी https://developers.google.com/safe-browsing पहा.</translation> <translation id="5108031557082757679">बंद केलेले एंटरप्राइझ डीव्हाइस प्रिंटर</translation> @@ -3020,13 +3009,13 @@ <translation id="924557436754151212">प्रथमच चालताना डीफॉल्ट ब्राउझरमधून सेव्ह केलेले पासवर्ड आयात करा</translation> <translation id="930930237275114205"><ph name="PRODUCT_FRAME_NAME" /> वापरकर्ता डेटा निर्देशिका सेट करा</translation> <translation id="934390688529359269"><ph name="PRODUCT_NAME" /> साठी सक्तीने साइन इन करणे चालू करते.</translation> -<translation id="938916311528680351">व्हर्चुअल मशीनना Chrome OS वर रन करण्याची अनुमती द्यायची का हे नियंत्रित करण्याची अनुमती देते. +<translation id="938916311528680351">व्हर्च्युअल मशीनना Chrome OS वर रन करण्याची अनुमती द्यायची का हे नियंत्रित करण्याची अनुमती देते. - धोरण सत्य वर सेट केले असल्यास, डिव्हाइसला व्हर्चुअल मशीन रन करण्याची अनुमती आहे. - धोरण असत्य वर सेट केले असल्यास, डिव्हाइसला व्हर्चुअल मशीन रन करण्याची अनुमती नाही. - जेव्हा धोरण असत्य वर सेट केले जाते, तेव्हा ते फक्त नवीन व्हर्चुअल मशीनना लागू होते पण ते आधीपासुन सुरू असलेले व्हर्चुअल मशीन बंद करत नाही. - जेव्हा हे धोरण व्यवस्थापित डिव्हाइसवर सेट केले नसते,तेव्हा डिव्हाइसला व्हर्चुअल मशीन रन करण्याची अनुमती असते - अव्यवस्थापित डिव्हाइसना व्हर्चुअल मशीन रन करण्याची अनुमती असते.</translation> + धोरण सत्य वर सेट केले असल्यास, डिव्हाइसला व्हर्च्युअल मशीन रन करण्याची अनुमती आहे. + धोरण असत्य वर सेट केले असल्यास, डिव्हाइसला व्हर्च्युअल मशीन रन करण्याची अनुमती नाही. + जेव्हा धोरण असत्य वर सेट केले जाते, तेव्हा ते फक्त नवीन व्हर्च्युअल मशीनना लागू होते पण ते आधीपासुन सुरू असलेले व्हर्च्युअल मशीन बंद करत नाही. + जेव्हा हे धोरण व्यवस्थापित डिव्हाइसवर सेट केले नसते, तेव्हा डिव्हाइसला व्हर्च्युअल मशीन रन करण्याची अनुमती असते + अव्यवस्थापित डिव्हाइसना व्हर्च्युअल मशीन रन करण्याची अनुमती असते.</translation> <translation id="943865157632139008"><ph name="PRODUCT_FRAME_NAME" /> इंस्टॉल केले जाते तेव्हा तुम्हाला डीफॉल्ट HTML प्रस्तुतकर्ता कॉन्फिगर करण्याची परवानगी देते. होस्ट ब्राउझरला प्रस्तुत करण्याची परवानगी देणे ही डीफॉल्ट सेटिंग आहे, परंतु तुम्ही वैकिल्पिकरित्या हे अधिलिखित करू शकता आणि डीफॉल्टनुसार <ph name="PRODUCT_FRAME_NAME" /> HTML पेज प्रस्तुत करू शकता.</translation> <translation id="944817693306670849">डीस्क कॅश आकार सेट करा</translation>
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb index b2e0caa..1e680244 100644 --- a/components/policy/resources/policy_templates_ms.xtb +++ b/components/policy/resources/policy_templates_ms.xtb
@@ -302,14 +302,6 @@ Tetapan dasar ini mendayakan pemberitahuan untuk memaklumi pengguna bahawa pelancaran semula penyemak imbas adalah disyorkan atau diperlukan. Jika tidak ditetapkan, <ph name="PRODUCT_NAME" /> menunjukkan kepada pengguna bahawa pelancaran semula diperlukan melalui sedikit perubahan kepada menunya. Jika ditetapkan kepada 'Disyorkan', amaran berulang akan ditunjukkan kepada pengguna bahawa pelancaran semula disyorkan. Pengguna boleh menolak amaran ini untuk menunda pelancaran semula. Jika ditetapkan kepada 'Diperlukan', amaran berulang akan ditunjukkan kepada pengguna yang menunjukkan bahawa pelancaran semula penyemak imbas akan dipaksa selepas tempoh pemberitahuan tamat. Tempoh ini ialah 7 hari secara lalai dan boleh dikonfigurasikan melalui tetapan dasar <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Sesi pengguna dipulihkan selepas pelancaran semula.</translation> -<translation id="2075434678547407637">Membolehkan anda mengawal jika video boleh dimainkan secara automatik (tanpa kebenaran pengguna) dengan kandungan audio dalam <ph name="PRODUCT_NAME" />. - - Jika dasar ditetapkan kepada Benar, <ph name="PRODUCT_NAME" /> dibenarkan untuk automain media. - Jika dasar ditetapkan kepada Palsu, <ph name="PRODUCT_NAME" /> tidak dibenarkan untuk automain media. - Secara lalainya, <ph name="PRODUCT_NAME" /> tidak dibenarkan untuk automain media. - - Sila ambil perhatian jika <ph name="PRODUCT_NAME" /> dijalankan dan dasar ini berubah, dasar ini akan digunakan pada tab baharu yang dibuka sahaja. Oleh sebab itu, sesetengah tab mungkin masih mematuhi gelagat sebelum ini. - </translation> <translation id="2077129598763517140">Gunakan pecutan perkakasan apabila tersedia</translation> <translation id="2077273864382355561">Kelewatan pemadaman skrin apabila dijalankan dengan kuasa bateri</translation> <translation id="2082205219176343977">Konfigurasikan versi Chrome minimum yang dibenarkan untuk peranti ini.</translation> @@ -354,9 +346,6 @@ Jika tetapan ini dikonfigurasikan, pengguna yang menggunakan buka kunci pantas akan diminta memasukkan kata laluan mereka pada kunci skrin bergantung pada tetapan ini. Jika tetapan ini tidak dikonfigurasikan, pengguna yang menggunakan buka kunci pantas akan diminta memasukkan kata laluan mereka pada kunci skrin setiap hari.</translation> -<translation id="2188722565665306629">Membolehkan anda menetapkan jangka masa untuk pemberitahuan pelancaran semula <ph name="PRODUCT_NAME" /> ditunjukkan bagi menggunakan kemas kini yang belum selesai. - - Tetapan dasar ini boleh digunakan untuk mengawal jangka masa pengguna dimaklumi secara progresif dalam milisaat berkenaan <ph name="PRODUCT_NAME" /> yang perlu dilancarkan semula (atau <ph name="PRODUCT_OS_NAME" /> mesti dimulakan semula) untuk dikemas kini. Dalam jangka masa ini, pengguna akan dimaklumi berulang kali tentang keperluan kemas kini berdasarkan tetapan dasar <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Jika dasar ini tidak ditetapkan, tempoh lalai ialah 604800000 milisaat (satu minggu) akan digunakan.</translation> <translation id="2194470398825717446">Dasar ini ditamatkan dalam M61, sila gunakan EcryptfsMigrationStrategy. Menentukan gelagat peranti yang dihantar dengan ecryptfs dan memerlukan peralihan kepada penyulitan ext4. @@ -1112,6 +1101,13 @@ Membiarkan tetapan tanpa ditetapkan akan membolehkan pengguna memilih sama ada untuk memaparkan butang laman utama atau tidak.</translation> <translation id="4485425108474077672">Konfigurasi URL halaman Tab Baharu</translation> <translation id="4492287494009043413">Lumpuhkan pengambilan tangkapan skrin</translation> +<translation id="4497968613298501984">Konfigurasi senarai URL log masuk perusahaan (skim HTTP dan HTTPS sahaja). Cap jari kata laluan akan dirakam pada URL ini dan digunakan untuk pengesanan pengunaan semula kata laluan. + Tetapan ini hendaklah digunakan oleh pengguna GSuite yang menggunakan sistem SSO/SAML sahaja. + Untuk membolehkan <ph name="PRODUCT_NAME" /> merakam cap jari kata laluan dengan betul, sila pastikan halaman log masuk anda mengikut garis panduan di https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + Jika tetapan ini didayakan, maka perkhidmatan perlindungan kata laluan akan merakam cap jari kata laluan pada URL ini bagi tujuan pengesanan penggunaan semula kata laluan. + Jika tetapan ini dilumpuhkan atau tidak ditetapkan, maka perkhidmatan perlindungan kata laluan hanya akan merakam cap jari kata laluan pada https://accounts.google.com. + Dasar ini tidak tersedia pada kejadian Windows yang tidak menyertai domain <ph name="MS_AD_NAME" />.</translation> <translation id="450537894712826981">Mengkonfigurasikan saiz cache yang <ph name="PRODUCT_NAME" /> akan gunakan untuk menyimpan fail media cache pada cakera. Jika anda menetapkan dasar ini, <ph name="PRODUCT_NAME" /> akan menggunakan saiz cache yang diberikan tidak kira sama ada pengguna telah menyatakan bendera '--saiz-cache-cakera'' atau tidak. Nilai yang dinyatakan dalam dasar ini bukan sempadan keras tetapi lebih kepada cadangan kepada sistem cache, sebarang nilai di bawah beberapa megabait adalah terlalu kecil dan akan dibulatkan kepada jumlah minimum yang munasabah. @@ -1230,6 +1226,13 @@ Jika dasar ini dibiarkan tanpa ditetapkan atau kosong, maka mana-mana pengguna boleh log masuk ke <ph name="PRODUCT_NAME" />.</translation> <translation id="4858735034935305895">Benarkan mod skrin penuh</translation> +<translation id="4868249328547841081">Konfigurasi penukaran kata laluan URL (skim HTTP dan HTTPS sahaja). Perkhidmatan perlindungan kata laluan akan menghantar pengguna ke URL ini untuk menukar kata laluan mereka jika mereka telah mengalami pancingan data. + Tetapan ini hendaklah digunakan oleh pengguna GSuite yang menggunakan sistem SSO/SAML sahaja. + Untuk membolehkan <ph name="PRODUCT_NAME" /> merakam cap jari kata laluan baharu dengan betul pada halaman penukaran kata laluan ini, sila pastikan halaman penukaran kata laluan anda mengikut garis panduan di https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + Jika tetapan ini didayakan, maka perkhidmatan perlindungan kata laluan akan menghantar pengguna ke URL ini untuk menukar kata laluan mereka jika mereka telah mengalami pancingan data. + Jika tetapan ini dilumpuhkan atau tidak ditetapkan, maka perkhidmatan perlindungan kata laluan akan menghantar pengguna ke https://myaccounts.google.com to change their password. + Dasar ini tidak tersedia pada kejadian Windows yang tidak menyertai domain <ph name="MS_AD_NAME" />.</translation> <translation id="4869787217450099946">Menentukan sama ada kunci bangkit skrin dibenarkan. Kunci bangkit skrin boleh diminta oleh sambungan melalui API sambungan pengurusan kuasa. Jika dasar ini ditetapkan kepada benar atau dibiarkan tanpa ditetapkan, kunci bangkit skrin akan digunakan untuk pengurusan kuasa.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 9115f1f..df3aeac 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -298,14 +298,6 @@ Met deze beleidsinstelling worden meldingen ingeschakeld waarmee de gebruiker wordt gevraagd of aangeraden om de browser opnieuw op te starten. Als dit niet is ingesteld, ziet de gebruiker een melding in <ph name="PRODUCT_NAME" /> dat de browser opnieuw moet worden opgestart via kleine wijzigingen in het menu. Als dit is ingesteld op 'Recommended', wordt er een herhaalde waarschuwing weergeven om de gebruiker te laten weten dat het raadzaam is de browser opnieuw op te starten. De gebruiker kan deze waarschuwing negeren om de actie uit te stellen. Als dit is ingesteld op 'Required', wordt er een herhaalde waarschuwing weergegeven om de gebruiker te laten weten dat de browser automatisch opnieuw wordt opgestart zodra de meldingsperiode is verstreken. Deze periode is standaard zeven dagen en kan worden ingesteld via de beleidsinstelling voor <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. De sessie van de gebruiker wordt hersteld zodra de browser opnieuw is opgestart.</translation> -<translation id="2075434678547407637">Hiermee kun je bepalen of video's automatisch (zonder toestemming van gebruiker) met audiocontent in <ph name="PRODUCT_NAME" /> kunnen worden afgespeeld. - - Als het beleid is ingesteld op True (Waar), is het <ph name="PRODUCT_NAME" /> toegestaan om automatisch media af te spelen. - Als dit beleid is ingesteld op False (Onwaar), is het <ph name="PRODUCT_NAME" /> niet toegestaan om automatisch media af te spelen. - Standaard is het <ph name="PRODUCT_NAME" /> niet toegestaan om automatisch media af te spelen. - - Als <ph name="PRODUCT_NAME" /> wordt uitgevoerd en dit beleid wordt gewijzigd, wordt het beleid alleen toegepast op nieuw geopende tabbladen. Het is dus mogelijk dat sommige tabbladen het eerdere gedrag nog vertonen. - </translation> <translation id="2077129598763517140">Hardwareversnelling gebruiken indien beschikbaar</translation> <translation id="2077273864382355561">Vertraging van scherm uitschakelen wanneer op de batterij wordt gewerkt</translation> <translation id="2082205219176343977">Configureer de minimaal toegestane Chrome-versie voor het apparaat.</translation> @@ -352,9 +344,6 @@ Als deze instelling is ingeschakeld, wordt gebruikers die de functie voor snel ontgrendelen gebruiken, op basis van deze instelling gevraagd hun wachtwoord op te geven voor het vergrendelingsscherm. Als deze instelling niet is geconfigureerd, wordt gebruikers die de functie voor snel ontgrendelen gebruiken, elke dag gevraagd hun wachtwoord voor het vergrendelingsscherm op te geven.</translation> -<translation id="2188722565665306629">Hiermee kun je de periode instellen waarin meldingen om <ph name="PRODUCT_NAME" /> opnieuw op te starten, worden weergegeven om een update toe te passen. - - Met deze beleidsinstellingen kun je de periode tot op de milliseconde nauwkeurig bepalen waarin een gebruiker op progressieve wijze wordt geïnformeerd dat <ph name="PRODUCT_NAME" /> opnieuw moet worden gestart (of dat <ph name="PRODUCT_OS_NAME" /> opnieuw moet worden gestart) om een update toe te passen. De gebruiker wordt gedurende deze periode herhaaldelijk geïnformeerd over de update op basis van de instelling van het <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-beleid. Als dit niet is ingesteld, wordt de standaardperiode van 604.800.000 milliseconden (één week) gehanteerd.</translation> <translation id="2194470398825717446">Dit beleid is beëindigd in M61. Gebruik EcryptfsMigrationStrategy. Geeft aan hoe een apparaat zich moet gedragen dat is geleverd met eCryptfs en moet worden overgezet naar ext4-versleuteling.
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb index 4d8019f4..e32b730 100644 --- a/components/policy/resources/policy_templates_no.xtb +++ b/components/policy/resources/policy_templates_no.xtb
@@ -300,15 +300,6 @@ Denne regelen aktiverer varsler for å informere brukeren om at nettleseren må eller bør startes på nytt. Hvis regelen ikke er angitt, varsler <ph name="PRODUCT_NAME" /> brukeren om at det er nødvendig med en omstart ved hjelp av diskrete endringer i menyen. Hvis regelen er angitt som «Recommended» (anbefalt), ser brukeren en gjentakende advarsel om at en omstart er anbefalt. Brukeren kan avvise advarselen for å utsette omstarten. Hvis regelen er angitt som «Required» (obligatorisk), ser brukeren en gjentakende advarsel om at en tvungen omstart utføres når varselperioden er utløpt. Denne perioden er som standard 7 dager og kan konfigureres via regelen <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Brukerens økt gjenopprettes etter omstarten.</translation> -<translation id="2075434678547407637">Lar deg styre om videoer kan spilles automatisk (uten brukernes samtykke) sammen med lydinnhold i <ph name="PRODUCT_NAME" />. - - Hvis regelen er angitt som «true» (sann), kan <ph name="PRODUCT_NAME" /> spille av medier automatisk. - Hvis regelen er angitt som «false» (usann), kan ikke <ph name="PRODUCT_NAME" /> spille av medier automatisk. - - Som standard kan ikke <ph name="PRODUCT_NAME" /> spille av medier automatisk. - - Hvis <ph name="PRODUCT_NAME" /> kjører og denne regelen endres, gjelder endringen bare for nye faner som åpnes. Det kan derfor hende at enkelte faner fortsatt følger den tidligere regelen. - </translation> <translation id="2077129598763517140">Bruk maskinvareakselerasjon når det er tilgjengelig</translation> <translation id="2077273864382355561">Forsinkelse for avslått skjerm når enheten kjører på batteristrøm</translation> <translation id="2082205219176343977">Konfigurer minimum tillatt Chrome-versjon for enheten.</translation> @@ -353,9 +344,6 @@ Hvis denne innstillingen er konfigurert, kan brukere som bruker hurtigopplåsing, bli bedt om å skrive inn passordet sitt på låseskjermen. Dette avhenger imidlertid av hvilken innstilling som er valgt. Hvis denne innstillingen ikke konfigureres, blir brukere som bruker hurtigopplåsing, bedt om å skrive inn passordet sitt på låseskjermen hver dag.</translation> -<translation id="2188722565665306629">Lar deg angi hvor lenge varsler for omstart av <ph name="PRODUCT_NAME" /> skal vises når det finnes en oppdatering som ikke er installert ennå. - - Denne regelen kan brukes til å styre tidsperioden (i millisekunder) brukeren skal informeres om at <ph name="PRODUCT_NAME" /> (eller <ph name="PRODUCT_OS_NAME" />) må startes på nytt på grunn av en oppdatering. I denne tidsperioden blir brukeren gjentatte ganger informert om at oppdateringen må installeres. Dette er basert på innstillingen for regelen <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Hvis denne regelen ikke er angitt, brukes standardperioden på 604 800 000 millisekunder (én uke).</translation> <translation id="2194470398825717446">Denne regelen er avviklet i M61. Bruk EcryptfsMigrationStrategy i stedet. Spesifiserer hvordan enheter som har blitt levert med eCryptfs, og som må gå over til ext4-kryptering, bør oppføre seg.
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb index 78c68179..c7185b7 100644 --- a/components/policy/resources/policy_templates_pl.xtb +++ b/components/policy/resources/policy_templates_pl.xtb
@@ -292,14 +292,6 @@ Ta zasada włącza powiadomienia informujące użytkownika o tym, że zalecane lub wymagane jest ponowne uruchomienie przeglądarki. Jeśli nie jest włączona, <ph name="PRODUCT_NAME" /> informuje użytkownika o potrzebie ponownego uruchomienia za pomocą subtelnych zmian w menu. Wybranie opcji „Zalecane” powoduje cykliczne wyświetlanie ostrzeżenia o tym, że ponowne uruchomienie jest zalecane. Użytkownik może zamknąć to ostrzeżenie, by odłożyć ponowne uruchomienie na później. Wybranie opcji „Wymagane” powoduje wyświetlanie ostrzeżenia, że ponowne uruchomienie przeglądarki zostanie wymuszone po upływie czasu powiadamiania. Domyślnie ten czas to siedem dni, a można go ustawić za pomocą zasady <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Sesja użytkownika zostanie przywrócona po ponownym uruchomieniu.</translation> -<translation id="2075434678547407637">Określa, czy <ph name="PRODUCT_NAME" /> może automatycznie (bez zgody użytkownika) odtwarzać filmy z dźwiękiem. - - Jeśli zasada ma wartość Prawda, <ph name="PRODUCT_NAME" /> może automatycznie odtwarzać multimedia. - Jeśli zasada ma wartość Fałsz, <ph name="PRODUCT_NAME" /> nie może automatycznie odtwarzać multimediów. - Domyślnie <ph name="PRODUCT_NAME" /> nie może automatycznie odtwarzać multimediów. - - Jeśli zmienisz tę zasadę, gdy <ph name="PRODUCT_NAME" /> działa, zmieniona zasada będzie obowiązywać tylko w nowych kartach. Karty otwarte wcześniej mogą działać jak dawniej. - </translation> <translation id="2077129598763517140">Użyj akceleracji sprzętowej, gdy jest dostępna</translation> <translation id="2077273864382355561">Opóźnienie wyłączenia ekranu przy zasilaniu z baterii</translation> <translation id="2082205219176343977">Skonfiguruj minimalną dozwoloną wersję Chrome dla urządzenia.</translation> @@ -345,9 +337,6 @@ Jeśli to ustawienie jest skonfigurowane, jego wartość określa, jak często użytkownicy korzystający z szybkiego odblokowania muszą podawać swoje hasło na ekranie blokady. Jeśli to ustawienie nie jest skonfigurowane, użytkownicy korzystający z szybkiego odblokowania muszą podawać swoje hasło na ekranie blokady codziennie.</translation> -<translation id="2188722565665306629">Umożliwia ustawienie czasu, przez który <ph name="PRODUCT_NAME" /> będzie wyświetlać powiadomienia o konieczności ponownego uruchomienia w celu zastosowania oczekującej aktualizacji. - - Ta zasada umożliwia określenie czasu (w milisekundach), przez który użytkownik będzie informowany o konieczności ponownego uruchomienia <ph name="PRODUCT_NAME" /> (lub <ph name="PRODUCT_OS_NAME" />) z powodu aktualizacji. Przez ten czas użytkownik będzie cyklicznie informowany o konieczności aktualizacji zgodnie z ustawieniem zasady <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Jeśli zasada nie jest skonfigurowana, stosowany jest domyślny czas 604800000 milisekund (jeden tydzień).</translation> <translation id="2194470398825717446">Ta zasada jest wycofywana w wersji M61. Zmiast niej należy użyć zasady EcryptfsMigrationStrategy. Określa, jak powinno zachowywać się urządzenie, które zostało dostarczone z systemem plików eCryptfs i wymaga przejścia na szyfrowany system plików ext4.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 4b400818..a6d870b 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -290,14 +290,6 @@ A definição desta política ativa notificações para informar ao usuário que a reinicialização do navegador é recomendada ou necessária. Se a política não for definida, o <ph name="PRODUCT_NAME" /> indicará ao usuário que a reinicialização precisa ser feita por meio de alterações sutis no menu. Se definida como "Recomendado", um aviso recorrente será exibido ao usuário indicando que a reinicialização é recomendada. O usuário pode dispensar esse aviso para adiar a reinicialização. Se definida como "Obrigatório", um aviso recorrente será exibido ao usuário indicando que a reinicialização do navegador será forçada assim que o período de notificação passar. Esse período tem, por padrão, sete dias e pode ser definido na configuração da política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. A sessão do usuário é restaurada após a reinicialização.</translation> -<translation id="2075434678547407637">Permite que você controle se os vídeos serão reproduzidos automaticamente (sem o consentimento do usuário) com conteúdo de áudio no <ph name="PRODUCT_NAME" />. - - Se a política for definida como verdadeira, o <ph name="PRODUCT_NAME" /> poderá reproduzir mídia de forma automática. - Se a política for definida como falsa, o <ph name="PRODUCT_NAME" /> não poderá reproduzir mídia de forma automática. - Por padrão, o <ph name="PRODUCT_NAME" /> não pode reproduzir mídia de forma automática. - - Se o <ph name="PRODUCT_NAME" /> estiver sendo executado e essa política mudar, ela será aplicada apenas a novas guias abertas. Assim, algumas guias ainda podem ter o comportamento anterior. - </translation> <translation id="2077129598763517140">Usar aceleração de hardware quando disponível</translation> <translation id="2077273864382355561">Intervalo de desligamento da tela no funcionamento com energia da bateria</translation> <translation id="2082205219176343977">Configurar a versão mínima permitida do Chrome para o dispositivo.</translation> @@ -342,9 +334,6 @@ Se esta configuração for definida, os usuários que utilizam o desbloqueio rápido terão que informar as respectivas senhas na tela de bloqueio de acordo com esta configuração. Se esta configuração não for definida, os usuários que utilizam o desbloqueio rápido terão que informar as respectivas senhas na tela de bloqueio todos os dias.</translation> -<translation id="2188722565665306629">Permite definir o período em que as notificações de reinicialização do <ph name="PRODUCT_NAME" /> são exibidas para aplicar uma atualização pendente. - - A definição desta política pode ser usada para controlar o período, em milissegundos, em que o usuário é informado progressivamente de que o <ph name="PRODUCT_NAME" /> precisa ser reiniciado (ou que o <ph name="PRODUCT_OS_NAME" /> precisa ser reiniciado) para a aplicação de uma atualização. Nesse período, o usuário será informado várias vezes sobre a necessidade de uma atualização com base na definição da política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Se a política não for definida, o período padrão de 604.800.000 milissegundos (uma semana) será usado.</translation> <translation id="2194470398825717446">O uso desta política foi suspenso no M61. Substitua-a por EcryptfsMigrationStrategy. Especifica como um dispositivo deve se comportar tendo sido embarcado com ecryptfs e precisando fazer a transição para criptografia ext4.
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb index 106efb5..87b4e45 100644 --- a/components/policy/resources/policy_templates_pt-PT.xtb +++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -294,14 +294,6 @@ Esta definição de política ativa as notificações para informar o utilizador de que é recomendado ou necessário reiniciar o navegador. Se não estiver definida, o <ph name="PRODUCT_NAME" /> indica ao utilizador que é necessário reiniciá-lo através de alterações subtis ao respetivo menu. Se estiver definida como "Recomendado", é apresentado um aviso recorrente ao utilizador a recomendar o reinício. O utilizador pode ignorar este aviso para adiar o reinício. Se estiver definida como "Obrigatório", é apresentado um aviso recorrente ao utilizador a indicar que o reinício do navegador será forçado assim que o período da notificação passar. Por predefinição, este período é de sete dias e pode ser configurado através da definição da política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. A sessão do utilizador é restaurada após o reinício.</translation> -<translation id="2075434678547407637">Permite-lhe controlar se os vídeos podem ser reproduzidos automaticamente (sem autorização do utilizador) com conteúdo de áudio no <ph name="PRODUCT_NAME" />. - - Se a política estiver definida como verdadeira, o <ph name="PRODUCT_NAME" /> está autorizado a reproduzir automaticamente conteúdo multimédia. - Se a política estiver definida como falsa, o <ph name="PRODUCT_NAME" /> não está autorizado a reproduzir automaticamente conteúdo multimédia. - Por predefinição, o <ph name="PRODUCT_NAME" /> não está autorizado a reproduzir automaticamente conteúdo multimédia. - - Tenha em atenção que, se o <ph name="PRODUCT_NAME" /> estiver em execução e esta política for alterada, a alteração aplica-se apenas aos novos separadores abertos. Por conseguinte, é possível que alguns separadores continuem a seguir o comportamento anterior. - </translation> <translation id="2077129598763517140">Utilizar aceleração de hardware sempre que estiver disponível</translation> <translation id="2077273864382355561">Atraso para desligar o ecrã quando o dispositivo está a utilizar a energia da bateria</translation> <translation id="2082205219176343977">Configurar a versão mínima do Chrome permitida para o dispositivo</translation> @@ -353,9 +345,6 @@ Se esta definição estiver configurada, os utilizadores que recorram ao desbloqueio rápido terão de introduzir as respetivas palavras-passe no ecrã de bloqueio, consoante esta definição. Se esta definição não estiver configurada, os utilizadores que recorram ao desbloqueio rápido terão de introduzir a respetiva palavra-passe no ecrã de bloqueio todos os dias.</translation> -<translation id="2188722565665306629">Permite-lhe definir o período de tempo durante o qual são apresentadas notificações de reinício do <ph name="PRODUCT_NAME" /> para aplicar uma atualização pendente. - - Esta definição de política pode ser utilizada para controlar o período de tempo, em milissegundos, durante o qual o utilizador é gradualmente informado de que o <ph name="PRODUCT_NAME" /> tem de ser reiniciado (ou o <ph name="PRODUCT_OS_NAME" /> tem de ser reiniciado) para aplicar uma atualização. Durante este período de tempo, o utilizador é repetidamente informado da necessidade de aplicar uma atualização com base na definição da política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Se não estiver definida, é utilizado o período predefinido de 604 800 000 milissegundos (uma semana).</translation> <translation id="2194470398825717446">Esta política está obsoleta em M61, utilize EcryptfsMigrationStrategy em alternativa. Especifica o comportamento de um dispositivo enviado com ecryptfs e que tem de transitar para a encriptação ext4.
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb index a4f6aa9..41ffff8 100644 --- a/components/policy/resources/policy_templates_ro.xtb +++ b/components/policy/resources/policy_templates_ro.xtb
@@ -295,14 +295,6 @@ Setarea acestei politici activează notificările care informează utilizatorul că este recomandată sau necesară relansarea browserului. Dacă politica nu este setată, <ph name="PRODUCT_NAME" /> îi arată utilizatorului că este necesară o relansare prin schimbări subtile aduse meniului. Dacă politica este setată la „Recomandat”, utilizatorului i se va afișa o avertizare recurentă prin care se indică faptul că relansarea este recomandată. Utilizatorul poate să respingă avertizarea pentru a amâna relansarea. Dacă politica este setată la „Obligatoriu”, utilizatorului i se va afișa o avertizare recurentă prin care se indică faptul că relansarea browserului va fi obligatorie după încheierea perioadei de notificare. În mod prestabilit, această perioadă este de șapte zile și poate fi configurată prin setarea politicii <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Sesiunea utilizatorului este restabilită după relansare.</translation> -<translation id="2075434678547407637">Îți permite să controlezi dacă videoclipurile se pot reda automat (fără consimțământul utilizatorului) cu conținut audio în <ph name="PRODUCT_NAME" />. - - Dacă politica este activată, <ph name="PRODUCT_NAME" /> are permisiunea de a reda automat conținut media. - Dacă politica este dezactivată, <ph name="PRODUCT_NAME" /> nu are permisiunea de a reda automat conținut media. - În mod prestabilit, <ph name="PRODUCT_NAME" /> nu are permisiunea de a reda automat conținut media. - - Reține că, dacă <ph name="PRODUCT_NAME" /> rulează și această politică se modifică, ea se va aplica doar la filele nou deschise. Astfel, este posibil ca unele file să mențină comportamentul anterior. - </translation> <translation id="2077129598763517140">Utilizează accelerarea hardware când este disponibilă</translation> <translation id="2077273864382355561">Interval până la oprirea ecranului la funcționarea pe baterie</translation> <translation id="2082205219176343977">Configurează versiunea Chrome minimă acceptată pentru dispozitiv.</translation> @@ -347,9 +339,6 @@ Dacă setarea este configurată, utilizatorilor care folosesc deblocarea rapidă li se va solicita să își introducă parola pe ecranul de blocare, în funcție de această setare. Dacă setarea nu este configurată, utilizatorilor care folosesc deblocarea rapidă li se va solicita să își introducă parola pe ecranul de blocare în fiecare zi.</translation> -<translation id="2188722565665306629">Îți permite să setezi perioada în care se afișează notificările de relansare a browserului <ph name="PRODUCT_NAME" /> pentru a aplica o actualizare în așteptare. - - Setarea acestei politici poate fi folosită pentru a controla perioada, în milisecunde, în care utilizatorul este informat treptat că <ph name="PRODUCT_NAME" /> trebuie relansat (sau <ph name="PRODUCT_OS_NAME" /> trebuie repornit) pentru o actualizare. În această perioadă, utilizatorul va fi informat în mod repetat despre necesitatea unei actualizări pe baza setării politicii <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Dacă aceasta nu este setată, se folosește perioada prestabilită de 604800000 milisecunde (o săptămână).</translation> <translation id="2194470398825717446">Politica nu mai este dezvoltată în M61, folosește EcryptfsMigrationStrategy. Specifică modul în care trebuie să se comporte un dispozitiv care a fost livrat cu ecryptfs și necesită trecerea la criptarea ext4. @@ -1074,6 +1063,13 @@ <translation id="4482640907922304445">Afișează butonul Pagină de pornire în bara de instrumente din <ph name="PRODUCT_NAME" />. Dacă activați această setare, butonul Pagina de pornire este întotdeauna afișat. Dacă dezactivați această setare, butonul Pagina de pornire nu este afișat. Dacă activați sau dezactivați această setare, utilizatorii nu o pot modifica sau anula în <ph name="PRODUCT_NAME" />. Dacă lăsați această politică nesetată, acest lucru va permite utilizatorului să aleagă dacă să afișeze sau nu butonul Pagină de pornire.</translation> <translation id="4485425108474077672">Configurează adresa URL a paginii Filă nouă</translation> <translation id="4492287494009043413">Dezactivați capturile de ecran</translation> +<translation id="4497968613298501984">Configurează lista de adrese URL de autentificare de întreprindere (doar schemele HTTP și HTTPS). Amprenta digitală a parolei va fi scanată în aceste adrese URL și folosită pentru detectarea refolosirii parolelor. + Această setare trebuie aplicată doar de utilizatorii GSuite care folosesc un sistem SSO/SMAL. + Pentru ca <ph name="PRODUCT_NAME" /> să scaneze corect amprentele parolei, asigură-te că paginile de conectare respectă regulile prevăzute în https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + Dacă această setare este activată, serviciul de protecție prin parolă va scana amprenta digitală a parolelor pe aceste adrese URL pentru a detecta refolosirea parolelor. + Dacă această setare este dezactivată sau nu este configurată, serviciul de protecție prin parolă va scana amprenta digitală a parolei doar pe https://accounts.google.com. + Această politică nu este disponibilă în instanțele Windows care nu sunt asociate unui domeniu <ph name="MS_AD_NAME" />.</translation> <translation id="450537894712826981">Configurează dimensiunea memoriei cache pe care <ph name="PRODUCT_NAME" /> o va utiliza pentru a stoca pe disc fișierele media salvate în memoria cache. Dacă setați această politică, <ph name="PRODUCT_NAME" /> va utiliza dimensiunea indicată a memoriei cache, indiferent dacă utilizatorul a specificat parametrul „--media-cache-size” sau nu. Valoarea specificată în această politică nu reprezintă o limită fermă, ci doar o sugestie pentru sistemul de salvare în memoria cache. Orice valoare sub câțiva megabytes este prea mică și va fi rotunjită în sus la o limită rezonabilă. @@ -1190,6 +1186,13 @@ Dacă această politică nu este setată sau este necompletată, atunci toți utilizatorii se pot conecta la <ph name="PRODUCT_NAME" />.</translation> <translation id="4858735034935305895">Activează modul ecran complet</translation> +<translation id="4868249328547841081">Configurează adresa URL de modificare a parolei (doar schemele HTTP și HTTPS). Serviciul de protecție prin parolă va direcționa utilizatorii la această adresă URL pentru a-și schimba parolele în cazul în care acestea au fost compromise prin phishing. + Această setare trebuie aplicată doar de utilizatorii GSuite care folosesc un sistem SSO/SMAL. + Pentru ca <ph name="PRODUCT_NAME" /> să scaneze corect noua amprentă a parolei pe această pagină de schimbare a parolei, asigură-te că pagina de schimbare a parolei respectă regulile prevăzute în https://www.chromium.org/developers/design-documents/create-amazing-password-forms. + + Dacă această setare este activată, serviciul de protecție prin parolă va direcționa utilizatorii la această adresă URL pentru a-și schimba parolele în cazul în care acestea au fost compromise prin phishing. + Dacă această setare este dezactivată sau nu este configurată, serviciul de protecție prin parolă va direcționa utilizatorii la https://myaccounts.google.com pentru a-și schimba parola. + Această politică nu este disponibilă în instanțele Windows care nu sunt asociate unui domeniu <ph name="MS_AD_NAME" />.</translation> <translation id="4869787217450099946">Specifică dacă este permisă blocarea activării ecranului. Blocarea activării ecranului poate fi solicitată de extensii prin intermediul API-ului pentru extensiile de gestionare a consumului de energie. Dacă această politică este activată sau nu este configurată, se va bloca activarea ecranului pentru gestionarea consumului de energie.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index b6c22cc..58ef8b6 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -284,14 +284,6 @@ Это правило разрешает уведомлять пользователя о том, что перезапуск браузера рекомендован или необходим. Если значение не задано, пользователь сможет узнать о необходимости перезапуска по небольшим изменениям в меню <ph name="PRODUCT_NAME" />. Если установить, что перезапуск рекомендуется, пользователь будет получать уведомление, но действие можно будет откладывать. Если установить, что перезапуск необходим, пользователь будет получать предупреждение о том, что браузер перезапустится автоматически, когда истечет срок показа уведомлений. По умолчанию он равен семи дням и может быть изменен через настройки правила <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. После перезапуска сеанс пользователя восстанавливается.</translation> -<translation id="2075434678547407637">Позволяет разрешать или запрещать <ph name="PRODUCT_NAME" /> автоматически (без согласия пользователя) воспроизводить видео со звуковой дорожкой. - - Если задано значение True, <ph name="PRODUCT_NAME" /> будет автоматически воспроизводить видео. - Если задано значение False, <ph name="PRODUCT_NAME" /> не будет автоматически воспроизводить видео. - По умолчанию <ph name="PRODUCT_NAME" /> не воспроизводит видео автоматически. - - Если вы изменили правило во время работы браузера <ph name="PRODUCT_NAME" />, оно будет применено только к новым вкладкам. - </translation> <translation id="2077129598763517140">Использовать аппаратное ускорение (при наличии)</translation> <translation id="2077273864382355561">Задержка отключения экрана при работе от батареи</translation> <translation id="2082205219176343977">Настройка версии Chrome, минимально допустимой для устройства</translation> @@ -336,9 +328,6 @@ Если этот параметр настроен, запрос пароля будет появляться в соответствии с заданным периодом времени. Если параметр не настроен, потребуется ежедневно вводить пароль, чтобы пользоваться быстрой разблокировкой.</translation> -<translation id="2188722565665306629">Позволяет установить период, в течение которого пользователю будут показываться уведомления о том, что для установки обновления необходимо перезапустить <ph name="PRODUCT_NAME" />. - - Это правило позволяет установить срок показа уведомлений о необходимости перезапуска <ph name="PRODUCT_NAME" /> или <ph name="PRODUCT_OS_NAME" /> для установки обновления. Период указывается в миллисекундах. На его протяжении пользователь будет получать напоминания о необходимости установить обновление, при этом учитываются настройки правила <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Если значение не указано, используется срок по умолчанию длительностью 604800000 мс (одна неделя).</translation> <translation id="2194470398825717446">Это правило перестало поддерживаться в M61, используйте вместо него EcryptfsMigrationStrategy. Определяет порядок работы устройства при переходе с шифрования ecryptfs на ext4.
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index 0f7614d..5700f161 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -293,14 +293,6 @@ Toto nastavenie pravidla aktivuje upozornenia, ktoré informujú používateľa o tom, že sa odporúča alebo vyžaduje opätovné spustenie prehliadača. Ak nie je nastavené, <ph name="PRODUCT_NAME" /> upozorní používateľa prostredníctvom nenápadných zmien v ponuke, že sa vyžaduje opätovné spustenie. Ak je nastavené na možnosť Recommended (Odporúčané), používateľovi sa bude zobrazovať opakované upozornenie na to, že sa odporúča opätovné spustenie. Používateľ môže toto upozornenie zrušiť a opätovné spustenie tak odmietnuť. Ak je nastavené na možnosť Required (Vyžadované), používateľovi sa zobrazí opakované upozornenie, že po vypršaní obdobia upozornenia sa vynúti opätovné spustenie prehliadača. Toto obdobie je predvolene nastavené na sedem dní a dá sa nakonfigurovať prostredníctvom nastavenia pravidla <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Relácia používateľa sa po opätovnom spustení obnoví.</translation> -<translation id="2075434678547407637">Umožňuje ovládať, či sa majú videá prehrávať automaticky (bez súhlasu používateľa) so zvukovým obsahom v prehliadači <ph name="PRODUCT_NAME" />. - - Ak toto pravidlo nastavíte na hodnotu True, v prehliadači <ph name="PRODUCT_NAME" /> je povolené automatické prehrávanie médií. - Ak ho nastavíte na hodnotu False, v prehliadači <ph name="PRODUCT_NAME" /> je zakázané automatické prehrávanie médií. - Predvolene je v prehliadači <ph name="PRODUCT_NAME" /> automatické prehrávanie médií zakázané. - - Upozorňujeme, že ak toto pravidlo zmeníte, keď je prehliadač <ph name="PRODUCT_NAME" /> spustený, použije sa iba na nové otvorené karty. Pri niektorých kartách si preto budete môcť všimnúť predchádzajúce správanie. - </translation> <translation id="2077129598763517140">Používať hardvérovú akceleráciu (keď je dostupná)</translation> <translation id="2077273864382355561">Oneskorenie vypnutia obrazovky pri napájaní z batérie</translation> <translation id="2082205219176343977">Konfigurácia minimálnej povolenej verzie Chromu pre zariadenie.</translation> @@ -344,9 +336,6 @@ Ak je toto nastavenie nakonfigurované, používatelia využívajúci rýchle odomknutie budú musieť na uzamknutej obrazovke zadať svoje heslo v závislosti od tohto nastavenia. Ak toto nastavenie nie je nakonfigurované, používatelia využívajúci rýchle odomknutie budú musieť na uzamknutej obrazovke zadávať heslo každý deň.</translation> -<translation id="2188722565665306629">Umožňuje nastaviť časové obdobie, počas ktorého sa zobrazujú upozornenia na opätovné spustenie prehliadača <ph name="PRODUCT_NAME" />, aby sa použila čakajúca aktualizácia. - - Pomocou tohto nastavenia pravidla môžete ovládať časové obdobie (v milisekundách), počas ktorého je používateľ postupne informovaný o tom, že <ph name="PRODUCT_NAME" /> musí znova spustiť (alebo že sa <ph name="PRODUCT_OS_NAME" /> musí reštartovať), aby mohol použiť aktualizáciu. V priebehu tohto časového obdobia bude používateľ opakovane informovaný o potrebe aktualizácie na základe nastavenia pravidla <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Ak pravidlo nenastavíte, použije sa predvolené obdobie 604 800 000 milisekúnd (jeden týždeň).</translation> <translation id="2194470398825717446">Podpora tohto pravidla bola vo verzii M61 ukončená, použite namiesto neho pravidlo EcryptfsMigrationStrategy. Umožňuje určiť, ako sa má správať zariadenie, ktoré bolo dodané so šifrovaním ecryptfs a ktoré potrebuje prejsť na šifrovanie ext4.
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb index 9918a068..e5b5c251 100644 --- a/components/policy/resources/policy_templates_sl.xtb +++ b/components/policy/resources/policy_templates_sl.xtb
@@ -302,14 +302,6 @@ Ta nastavitev pravilnika omogoči obvestila, ki uporabnika obvestijo, da je priporočen ali obvezen vnovičen zagon brskalnika. Če pravilnik ni nastavljen, brskalnik <ph name="PRODUCT_NAME" /> uporabnika glede potrebnega vnovičnega zagona obvesti prek manjših sprememb menija. Če je pravilnik nastavljen na »Recommended«, je uporabniku prikazano ponavljajoče se opozorilo, da je priporočen vnovičen zagon. Uporabnik lahko opozorilo opusti in tako odloži vnovičen zagon. Če je pravilnik nastavljen na »Required«, je uporabniku prikazano ponavljajoče se opozorilo, da bo po izteku obdobja za obveščanje vsiljen vnovičen zagon brskalnika. To obdobje privzeto traja sedem dni in ga je mogoče konfigurirati v nastavitvi pravilnika <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Uporabniška seja je po vnovičnem zagonu obnovljena.</translation> -<translation id="2075434678547407637">Omogoča nadziranje, ali se lahko videoposnetki samodejno predvajajo (brez dovoljenja uporabnika) z zvočno vsebino v brskalniku <ph name="PRODUCT_NAME" />. - - Če je pravilnik omogočen, je v brskalniku <ph name="PRODUCT_NAME" /> dovoljeno samodejno predvajanje predstavnosti. - Če je pravilnik onemogočen, v brskalniku <ph name="PRODUCT_NAME" /> samodejno predvajanje predstavnosti ni dovoljeno. - V brskalniku <ph name="PRODUCT_NAME" /> samodejno predvajanje predstavnosti privzeto ni dovoljeno. - - Če se <ph name="PRODUCT_NAME" /> izvaja in se ta pravilnik spremeni, se uporabi samo za novo odprte zavihke. Nekateri zavihki bodo zato morda delovali tako, kot je bilo pred spremembo. - </translation> <translation id="2077129598763517140">Uporabi strojno pospeševanje, če je na voljo</translation> <translation id="2077273864382355561">Časovni zamik izklopa zaslona ob napajanju iz akumulatorja</translation> <translation id="2082205219176343977">Konfiguriranje najmanjše dovoljene različice Chroma za napravo.</translation> @@ -354,9 +346,6 @@ Če je ta nastavitev konfigurirana, bodo morali uporabniki, ki uporabljajo hitro odklepanje, na zaklenjenem zaslonu vnesti geslo glede na to nastavitev. Če ta nastavitev ni konfigurirana, bodo morali uporabniki, ki uporabljajo hitro odklepanje, na zaklenjenem zaslonu vnesti geslo vsak dan.</translation> -<translation id="2188722565665306629">Omogoči nastavitev časovnega obdobja, v katerem so prikazana obvestila o vnovičnem zagonu brskalnika <ph name="PRODUCT_NAME" /> zaradi uveljavitve posodobitve na čakanju. - - S to nastavitvijo pravilnika je mogoče v milisekundah nadzirati časovno obdobje, v katerem je uporabnik postopno obveščan, da mora zaradi posodobitve znova zagnati brskalnik <ph name="PRODUCT_NAME" /> (ali operacijski sistem <ph name="PRODUCT_OS_NAME" />). V tem časovnem obdobju je uporabnik postopno obveščan glede potrebe po posodobitvi na podlagi nastavitve pravilnika <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Če pravilnik ni nastavljen, se kot privzeto časovno obdobje uporabi 604.800.000 milisekund (en teden).</translation> <translation id="2194470398825717446">Ta pravilnik je zastarel v različici M61, uporabite EcryptfsMigrationStrategy. Določa, kako naj deluje naprava, ki je bila dobavljena z ecryptfs in mora preiti na šifriranje ext4.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index d98be3a..aafe89f15 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -301,13 +301,6 @@ Ово подешавање смерница омогућава обавештавање корисника да се препоручује или је потребно поновно покретање прегледача. Ако се не подеси, <ph name="PRODUCT_NAME" /> указује кориснику незнатним променама менија да је поновно покретање потребно. Ако се изабере подешавање „Препоручено“, кориснику ће се приказивати упозорење да се поновно покретање препоручује. Корисник може да одбаци ово упозорење да би одложио поновно покретање. Ако се изабере подешавање „Обавезно“, кориснику ће се приказивати упозорење да ће се прегледач принудно поново покренути када истекне период за обавештење. Подразумевано трајање тог периода је седам дана и може да се конфигурише преко подешавања смерница <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Корисникова сесија се обнавља после поновног покретања.</translation> -<translation id="2075434678547407637">Омогућава вам да контролишете аутоматско пуштање видео снимака (без сагласности корисника) са аудио садржајем на производу <ph name="PRODUCT_NAME" />. - - Ако подесите смернице на Тачно, производ <ph name="PRODUCT_NAME" /> може да пушта медије аутоматски. - Ако подесите смернице на Нетачно, производ <ph name="PRODUCT_NAME" /> не може да пушта медије аутоматски. - Производ <ph name="PRODUCT_NAME" /> подразумевано не може да пушта медије аутоматски. - Имајте на уму да ће се смернице применити само на нове отворене картице ако промените смернице док је производ <ph name="PRODUCT_NAME" /> покренут. Из тог разлога понашање неких картица неће бити промењено. - </translation> <translation id="2077129598763517140">Користи хардверско убрзање када је доступно</translation> <translation id="2077273864382355561">Време до искључивања екрана када се користи батерија</translation> <translation id="2082205219176343977">Конфигуришу најстарију дозвољену верзију Chrome-а за уређај.</translation> @@ -352,9 +345,6 @@ Ако је ово подешавање конфигурисано, од корисника који користе брзо откључавање ће се захтевати да унесу лозинку на закључаном екрану у складу са овим подешавањем. Ако ово подешавање није конфигурисано, од корисника који користе брзо откључавање ће се захтевати да унесу лозинку на закључаном екрану сваког дана.</translation> -<translation id="2188722565665306629">Омогућава вам да подесите временски период током којег се приказују обавештења о поновном покретању <ph name="PRODUCT_NAME" />-а да би се применило ажурирање на чекању. - - То подешавање смерница може да се користи за конролу временског периода, у милисекундама, током којег корисник све чешће добија обавештење да <ph name="PRODUCT_NAME" /> мора поново да се покрене (или да <ph name="PRODUCT_OS_NAME" /> мора да се рестартује) због ажурирања. Током тог временског периода, корисник ће стално добијати обавештење да је потребно ажурирање на основу подешавања смерница <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Ако се не подеси, користи се подразумевани период од 604800000 милисекунди (недељу дана).</translation> <translation id="2194470398825717446">Ове смернице су застареле у M61, уместо њих користите EcryptfsMigrationStrategy. Наводи како треба да се понаша уређај који сте добили уз ecryptfs и како треба да пређе на шифровање ext4.
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb index 74bc41d..afda191 100644 --- a/components/policy/resources/policy_templates_sv.xtb +++ b/components/policy/resources/policy_templates_sv.xtb
@@ -303,14 +303,6 @@ Med den här principen kan användaren få en avisering om att webbläsaren bör eller måste startas om. Om principen lämnas utan inställning framgår det av en diskret ändring i menyn i <ph name="PRODUCT_NAME" /> att omstart krävs. Med inställningen Rekommenderas visas ett återkommande meddelande för användaren att en omstart rekommenderas. Användaren kan ignorera meddelandet och skjuta upp omstarten. Med inställningen Krävs visas ett återkommande meddelande om att webbläsaren kommer att startas om efter en viss tid. Tidsperioden är sju dagar som standard och kan konfigureras via principen <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Användarens session återställs efter omstarten.</translation> -<translation id="2075434678547407637">Ger dig möjlighet att styra om videor får spelas upp automatiskt (utan användarens tillstånd) tillsammans med ljudinnehåll i <ph name="PRODUCT_NAME" />. - - Om principen är inställd på sant får <ph name="PRODUCT_NAME" /> spela upp media automatiskt. - Om principen är inställd på falskt får <ph name="PRODUCT_NAME" /> inte spela upp media automatiskt. - <ph name="PRODUCT_NAME" /> får inte spela upp media automatiskt som standard. - - Observera att om <ph name="PRODUCT_NAME" /> körs när principen ändras tillämpas den endast på nya flikar som öppnas. Därför kan den tidigare inställningen gälla för vissa flikar. - </translation> <translation id="2077129598763517140">Använd maskinvaruacceleration när det är tillgängligt</translation> <translation id="2077273864382355561">Skärmavstängningstid när enheten drivs av batteriet</translation> <translation id="2082205219176343977">Konfigurera lägsta tillåtna Chrome-version för enheten.</translation> @@ -355,9 +347,6 @@ Om inställningen konfigureras uppmanas användaren att ange lösenord på låsskärmen beroende på inställningen. Om inställningen inte konfigureras uppmanas användaren att ange lösenord på låsskärmen varje dag.</translation> -<translation id="2188722565665306629">Gör att du kan ställa in under hur lång tid som uppmaningar om att starta om <ph name="PRODUCT_NAME" /> ska visas när en uppdatering väntar. - - Med den här principen kan du ställa in under hur lång tid (i millisekunder) som användaren ska få upprepade aviseringar om att <ph name="PRODUCT_NAME" /> (eller <ph name="PRODUCT_OS_NAME" />) behöver startas om på grund av en uppdatering. Under den tiden visas upprepade uppmaningar att starta om för användaren utifrån principen <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Om principen lämnas utan inställning används standardperioden 604 800 000 millisekunder (en vecka).</translation> <translation id="2194470398825717446">Den här principen har fasats ut i M61. Använd EcryptfsMigrationStrategy i stället. Anger beteendet för en enhet som levererades med ecryptfs och måste övergå till ext4-kryptering.
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb index b52be3ed..0b01046 100644 --- a/components/policy/resources/policy_templates_sw.xtb +++ b/components/policy/resources/policy_templates_sw.xtb
@@ -295,14 +295,6 @@ Mipangilio hii ya sera huwasha arifa ili kumwarifu mtumiaji kwamba anatakiwa afungue kivinjari upya au tunapendekeza afanye hivyo. Kama haijawekwa, <ph name="PRODUCT_NAME" /> humwonyesha mtumiaji kwamba anatakiwa aifungue upya kwa kufanya mabadiliko madogo kwenye menyu yake. Kama sera imewekwa kuwa 'Inapendekezwa', mtumiaji ataonyeshwa onyo linalojirudiarudia litakaloashiria kwamba anatakiwa afungue kivinjari upya. Mtumiaji anaweza kuondoa onyo hili ili afungue kivinjari upya baadaye. Kama sera imewekwa kuwa 'Inahitajika', mtumiaji ataonyeshwa onyo linalojirudiarudia litakaloashiria kwamba kivinjari kitafunguliwa upya kwa lazima pindi kipindi cha arifa kitakapokamiika. Kulingana na mipangilio chaguomsingi, kipindi hiki huwa siku saba na huenda mipangilio yake ikawekwa kupitia sera ya <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Kurasa alizokuwa amefungua mtumiaji hurejeshwa baada ya kuvinjari kufunguliwa upya.</translation> -<translation id="2075434678547407637">Hukuruhusu udhibiti video ambazo ungependa kucheza kiotomatiki (bila idhini ya mtumiaji) ukitumia maudhui ya sauti katika <ph name="PRODUCT_NAME" />. - - Kama sera imewekwa kuwa Ndivyo, <ph name="PRODUCT_NAME" /> inaruhusiwa kucheza maudhui kiotomatiki. - Kama sera imewekwa kuwa Sivyo, <ph name="PRODUCT_NAME" /> hairuhusiwi kucheza maudhui kiotomatiki. - Kwa chaguomsingi, <ph name="PRODUCT_NAME" /> hairuhusiwi kucheza maudhui kiotomatiki. - - Kumbuka kwamba kama <ph name="PRODUCT_NAME" /> inatumika na sera hii inabadilika, itatumika tu kwenye vichupo vipya vilivyofunguliwa. Kwa hivyo, baadhi ya vichupo huenda vikahitaji kutumia sifa za awali. - </translation> <translation id="2077129598763517140">Tumia uongezaji kasi wa maunzi wakati unapatikana</translation> <translation id="2077273864382355561">Kuzimika kwa skrini kunachelewa wakati wa kuendesha kwa nishati ya betri</translation> <translation id="2082205219176343977">Weka mipangilio ya msingi inayoruhusiwa ya toleo la Chrome kwenye kifaa.</translation> @@ -346,9 +338,6 @@ Mipangilio hii ikiwekwa, watumiaji wanaotumia kipengele cha kufungua skrini haraka wataombwa waweke manenosiri yao kwenye skrini iliyofungwa kutegemea mipangilio hii. Mipangilio hii isipowekwa, watumiaji wanaotumia kipengele cha kufungua skrini haraka wataombwa waweke manenosiri yao kwenye skrini iliyofungwa kila siku.</translation> -<translation id="2188722565665306629">Hukuruhusu uweke kipindi ambapo arifa za kufungua <ph name="PRODUCT_NAME" /> upya huonyeshwa ili sasisho linalosubiri liwekwe. - - Mipangilio ya sera hii inaweza kutumiwa kudhibiti kipindi, katika milisekunde, ambapo mtumiaji anaarifiwa mara kwa mara kwamba ni lazima afungue <ph name="PRODUCT_NAME" /> upya (au ni lazima azime kisha awashe <ph name="PRODUCT_OS_NAME" />) ili apate sasisho. Katika kipindi hiki, ni lazima mtumiaji aarifiwe kuhusu umuhimu wa kusasisha, kulingana na mipangilio ya sera ya <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Kama sera haijawekwa, kipindi chaguomsingi cha milisekunde 604800000 (wiki moja) kitatumika.</translation> <translation id="2194470398825717446">Sera hii haitumiki tena katika M61, tafadhali tumia EcryptfsMigrationStrategy badala yake. Hubainisha jinsi kifaa kilicholetwa kikiwa na ecryptfs ambacho kinahitaji kupata usimbaji fiche wa ext4 kinavyopaswa kufanya kazi.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index a5894da31..0871be3 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -287,14 +287,6 @@ இந்தக் கொள்கை அமைப்பானது உலாவியை மீண்டும் தொடங்குவது பரிந்துரைக்கப்படுவதா அல்லது தேவையானதா என்பதைப் பயனருக்குத் தெரிவிப்பதற்கு அறிவிப்புகளை இயக்குகிறது. இதை அமைக்கவில்லை எனில், அதன் மெனுவில் நுட்பமான மாற்றங்கள் செய்வதன் வழியாக மீண்டும் தொடங்க வேண்டும் என்பதைப் பயனருக்கு <ph name="PRODUCT_NAME" /> அறிவிக்கும். "பரிந்துரைக்கப்படுவது" என அமைத்தால், மீண்டும் தொடங்குவது பரிந்துரைக்கப்படுகிறது என்பதைக் குறிக்கும், தொடர்ச்சியாகத் தெரியும் எச்சரிக்கை பயனருக்குக் காட்டப்படும். மீண்டும் தொடங்குவதை ஒத்திவைக்க, இந்த எச்சரிக்கையைப் பயனர் நிராகரிக்கலாம். "தேவையானது" என அமைத்தால், அறிவிப்புக் காலம் கடந்த பிறகு, உலாவி மறுதொடக்கமானது கட்டாயமாகச் செய்யப்படும் என்பதைக் குறிக்கும், தொடர்ச்சியாகத் தெரியும் எச்சரிக்கை பயனருக்குக் காட்டப்படும். இந்த அறிவிப்புக் காலம் என்பது ஏழு நாட்கள் ஆகும். <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> கொள்கை அமைப்பு மூலம் அதை உள்ளமைக்கலாம். மீண்டும் தொடங்கிய பிறகு, பயனரின் அமர்வு மீட்டமைக்கப்படும்.</translation> -<translation id="2075434678547407637"><ph name="PRODUCT_NAME" /> இல் ஆடியோ உள்ளடக்கத்துடன் வீடியோக்கள் தானாக (பயனரின் அனுமதி இல்லாமல்) இயக்கப்படலாமா என்பதைக் கட்டுப்படுத்த அனுமதிக்கும். - - கொள்கை "சரி" என அமைக்கப்பட்டால், மீடியாவைத் தானாக இயக்குவதற்கு <ph name="PRODUCT_NAME" /> அனுமதிக்கப்படும். - கொள்கை "தவறு" என அமைக்கப்பட்டால், மீடியாவைத் தானாக இயக்குவதற்கு <ph name="PRODUCT_NAME" /> அனுமதிக்கப்படாது. - இயல்பாக, மீடியாவைத் தானாக இயக்குவதற்கு <ph name="PRODUCT_NAME" /> அனுமதிக்கப்படாது. - - <ph name="PRODUCT_NAME" /> இயக்கத்தில் இருந்து, இந்தக் கொள்கை மாற்றப்பட்டால், புதிதாகத் திறக்கப்படும் தாவல்களுக்கு மட்டுமே இது பயன்படுத்தப்படும் என்பதைக் கவனத்தில் கொள்ளவும். அதனால் சில தாவல்கள், முந்தைய நடத்தையைப் பின்பற்றக்கூடும். - </translation> <translation id="2077129598763517140">கிடைக்கும்போது வன்பொருளின் முடுக்கத்தைப் பயன்படுத்தவும்</translation> <translation id="2077273864382355561">பேட்டரி சக்தியில் இயங்கும்போது திரை முடக்கம் தாமதமாகும்</translation> <translation id="2082205219176343977">சாதனத்திற்கு அனுமதிக்கப்படும் குறைந்தபட்ச Chrome பதிப்பை உள்ளமை.</translation> @@ -333,9 +325,6 @@ இந்த அமைப்பு உள்ளமைக்கப்பட்டால், விரைந்து திறக்கும் அம்சத்தைப் பயன்படுத்தும் பயனர்களிடம், இந்த அமைப்பைச் சார்ந்து பூட்டுத் திரையில் அவர்களின் கடவுச்சொற்களை உள்ளிடும்படி கேட்கப்படும். இந்த அமைப்பு உள்ளமைக்கப்படவில்லை எனில், விரைந்து திறக்கும் அம்சத்தைப் பயன்படுத்தும் பயனர்களிடம், தினந்தோறும் பூட்டுத் திரையில் கடவுச்சொல்லை உள்ளிடும்படி கேட்கப்படும்.</translation> -<translation id="2188722565665306629">நிலுவையிலுள்ள புதுப்பிப்பைப் பயன்படுத்துவதற்கு, <ph name="PRODUCT_NAME" />ஐ மீண்டும் தொடங்குவதற்கான அறிவிப்புகளைக் காட்டுவதற்குக் கால அளவை அமைக்க அனுமதிக்கும். - - புதுப்பிப்புக்காக <ph name="PRODUCT_NAME" /> மீண்டும் தொடங்கப்பட வேண்டும் (அல்லது <ph name="PRODUCT_OS_NAME" /> மீண்டும் தொடங்கப்பட வேண்டும்) என்பது பயனருக்கு அறிவிக்கப்படுவதற்கு, இந்தக் கொள்கை அமைப்பைப் பயன்படுத்தி, மில்லிவினாடிகளில் கால அளவைக் கட்டுப்படுத்தலாம். இந்தக் கால அளவின்போது, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> கொள்கை அமைப்பின் அடிப்படையில் புதுப்பிப்புக்கான தேவை குறித்து பயனருக்குத் தொடர்ச்சியாக அறிவிக்கப்படும். அமைக்கப்படவில்லை எனில், இயல்பான கால அளவான 604800000 மில்லிவினாடிகள் (ஒரு வாரம்) பயன்படுத்தப்படும்.</translation> <translation id="2194470398825717446">இந்தக் கொள்கையானது M61 இல் தடுக்கப்பட்டது. அதற்குப் பதிலாக EcryptfsMigrationStrategyஐப் பயன்படுத்தவும். ecryptfs உடன் ஷிப் செய்யப்பட்ட, ext4 என்கிரிப்ஷனுக்கு மாற வேண்டிய சாதனம் எப்படிச் செயல்பட வேண்டும் என்பதைக் குறிப்பிடுகிறது.
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb index e020e85..8b82cf9 100644 --- a/components/policy/resources/policy_templates_te.xtb +++ b/components/policy/resources/policy_templates_te.xtb
@@ -349,14 +349,6 @@ ఈ విధాన సెట్టింగ్ బ్రౌజర్ పునఃప్రారంభం సిఫార్సు చేయబడినదని కానీ అవసరమైనదని కానీ వినియోగదారుకు తెలియజేయడానికి నోటిఫికేషన్లను ప్రారంభిస్తుంది. సెట్ చేయకపోతే, <ph name="PRODUCT_NAME" /> దాని మెనూకు సూక్ష్మ మార్పుల ద్వారా పునఃప్రారంభం అవసరమవుతుందని వినియోగదారుకు సూచిస్తుంది. సిఫార్సు చేయబడినది' అని సెట్ చేసినట్లయితే, ఒక పునరావృత హెచ్చరిక వినియోగదారుకు పునఃప్రారంభం గురించి సిఫార్సు చేయబడుతుంది. పునఃప్రారంభాన్ని వాయిదా వేయడానికి వినియోగదారు ఈ హెచ్చరికను విస్మరించవచ్చు. అవసరం' అని సెట్ చేసినట్లయితే, నోటిఫికేషన్ వ్యవధి గడిచినప్పుడు బ్రౌజర్ పునఃప్రారంభం కావచ్చని సూచించే వినియోగదారుకు పునరావృత హెచ్చరిక చూపబడుతుంది. ఈ సమయం డిఫాల్ట్గా ఏడు రోజులు, మరియు <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> విధాన సెట్టింగ్ ద్వారా కాన్ఫిగర్ చేయబడవచ్చు. పునఃప్రారంభం తరువాత వినియోగదారు యొక్క సెషన్ పునరుద్ధరించబడుతుంది.</translation> -<translation id="2075434678547407637"><ph name="PRODUCT_NAME" />లో వీడియోలను ఆటోమేటిక్గా ఆడియో కంటెంట్తో కలిపి (వినియోగదారు సమ్మతి లేకుండా) ప్లే చేయాలో లేదో నియంత్రించడానికి మిమ్మల్ని అనుమతిస్తుంది. - - ఒకవేళ విధానాన్ని ఒప్పు అని సెట్ చేస్తే, మీడియాని స్వీయ ప్లే చేయడానికి <ph name="PRODUCT_NAME" /> అనుమతించబడుతుంది. - ఒకవేళ విధానాన్ని తప్పు అని సెట్ చేస్తే, మీడియాని స్వీయ ప్లే చేయడానికి <ph name="PRODUCT_NAME" /> అనుమతించబడదు. - డిఫాల్ట్గా అయితే, మీడియాని స్వీయ ప్లే చేయడానికి <ph name="PRODUCT_NAME" /> అనుమతించబడదు. - - ఒకవేళ <ph name="PRODUCT_NAME" /> పని చేస్తుంటే మరియు ఆ సందర్భంలో ఈ విధానం మార్చబడితే, ఇది కొత్తగా తెరవబడే ట్యాబ్లకు మాత్రమే వర్తిస్తుందని గుర్తుంచుకోండి. కనుక కొన్ని ట్యాబ్లలో ఇప్పటికీ మునుపటి ప్రవర్తనే కొనసాగడం గమనించగలరు. - </translation> <translation id="2077129598763517140">హార్డ్వేర్ త్వరితం అందుబాటులో ఉన్నప్పుడు ఉపయోగించు</translation> <translation id="2077273864382355561">బ్యాటరీ శక్తితో అమలవుతున్నప్పుడు స్క్రీన్ ఆపివేత ఆలస్యం</translation> <translation id="2082205219176343977">పరికరం కోసం అనుమతించబడిన కనిష్ట Chrome వెర్షన్ని కాన్ఫిగర్ చేయండి.</translation> @@ -408,9 +400,6 @@ ఈ సెట్టింగ్ కాన్ఫిగర్ చేస్తే, త్వరిత అన్లాక్ను ఉపయోగించే వినియోగదారులు ఈ సెట్టింగ్పై ఆధారపడి లాక్ స్క్రీన్లో వారి పాస్వర్డ్లను నమోదు చేయమని అభ్యర్థించబడతారు. ఈ సెట్టింగ్ కాన్ఫిగర్ చేయకుంటే, త్వరిత అన్లాక్ను ఉపయోగిస్తున్న వినియోగదారులు లాక్ స్క్రీన్లో వారి పాస్వర్డ్ను ప్రతి రోజూ నమోదు చేయమని అభ్యర్థించబడతారు.</translation> -<translation id="2188722565665306629"><ph name="PRODUCT_NAME" /> పునఃప్రారంభ నోటిఫికేషన్లు పెండింగ్లో ఉన్న అప్డేట్ను వర్తింపజేసినట్లు చూపే సమయ వ్యవధిని సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. - -ఈ విధాన సెట్టింగ్ మిల్లీసెకన్లలో, కాల వ్యవధిని నియంత్రించి తద్వారా, అప్డేట్ కోసం <ph name="PRODUCT_NAME" /> పునఃప్రారంభించబడాలి అని కానీ (లేదా <ph name="PRODUCT_OS_NAME" /> పునఃప్రారంభించబడాలి అని) వినియోగదారుకి క్రమక్రమంగా తెలియజేయడంలో ఉపయోగించబడుతుంది. ఈ కాల వ్యవధిలో, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> విధానం యొక్క సెట్టింగ్ ఆధారంగా అప్డేట్ కోసం వినియోగదారుకు పదేపదే తెలియజేయబడుతుంది. సెట్ చేయకపోతే, 604800000 మిల్లీసెకన్లు (ఒక వారం) యొక్క డిఫాల్ట్ కాలం ఉపయోగించబడుతుంది.</translation> <translation id="2194470398825717446">ఈ విధానం M61లో నిలిపివేయబడింది, దయచేసి బదులుగా EcryptfsMigrationStrategyని ఉపయోగించండి. ecryptfsతో పాటు అందించబడిన మరియు ext4 ఎన్క్రిప్షన్కు మార్పిడి అవసరమైన పరికరం ఎలా ప్రవర్తించాలో నిర్దేశిస్తుంది.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 595382a..6028a3e 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -289,14 +289,6 @@ การตั้งค่านโยบายนี้จะเปิดใช้การแจ้งเตือนที่จะบอกว่าผู้ใช้ "ควร" หรือ "จำเป็นต้อง" เปิดเบราว์เซอร์ขึ้นมาใหม่ หากไม่มีการตั้งค่านโยบายนี้ <ph name="PRODUCT_NAME" /> จะแจ้งผู้ใช้ว่าจำเป็นต้องมีการเปิดเบราว์เซอร์ใหม่ผ่านการเปลี่ยนแปลงเพียงเล็กน้อยในเมนูเบราว์เซอร์ หากตั้งค่าเป็น "แนะนำ" ระบบจะแสดงคำเตือนที่เกิดซ้ำแก่ผู้ใช้ว่าขอแนะนำให้เปิดเบราว์เซอร์ใหม่ โดยผู้ใช้จะปิดคำเตือนนี้ได้เพื่อเลื่อนการเปิดใหม่ หากตั้งค่าเป็น "จำเป็น" ระบบจะแสดงคำเตือนที่เกิดซ้ำแก่ผู้ใช้ว่าจะมีการบังคับเปิดเบราว์เซอร์ใหม่หลังจากสิ้นสุดระยะการแจ้งเตือน โดยค่าเริ่มต้นแล้ว ระยะเวลาดังกล่าวคือ 7 วันแต่จะกำหนดค่าผ่านการตั้งค่านโยบาย <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> ได้ เซสชันของผู้ใช้จะได้รับการคืนค่าหลังการเปิดเบราว์เซอร์ขึ้นมาใหม่</translation> -<translation id="2075434678547407637">อนุญาตให้คุณควบคุมว่าวิดีโอที่มีเนื้อหาเสียงจะเล่นโดยอัตโนมัติ (โดยไม่ต้องขอคำยินยอมจากผู้ใช้) ใน <ph name="PRODUCT_NAME" /> ได้หรือไม่ - - หากตั้งค่านโยบายเป็น "จริง" <ph name="PRODUCT_NAME" /> จะมีสิทธิ์เล่นสื่อโดยอัตโนมัติ - หากตั้งค่านโยบายเป็น "เท็จ" <ph name="PRODUCT_NAME" /> จะไม่มีสิทธิ์เล่นสื่อโดยอัตโนมัติ - โดยค่าเริ่มต้น <ph name="PRODUCT_NAME" /> จะไม่มีสิทธิ์เล่นสื่อโดยอัตโนมัติ - - โปรดทราบว่าหาก <ph name="PRODUCT_NAME" /> เปิดอยู่และมีการเปลี่ยนนโยบายนี้ การเปลี่ยนแปลงจะใช้กับแท็บที่เปิดขึ้นมาใหม่เท่านั้น ดังนั้นแท็บบางแท็บอาจยังใช้ลักษณะการทำงานที่เลือกไว้ก่อนหน้านี้ - </translation> <translation id="2077129598763517140">ใช้การเร่งฮาร์ดแวร์เมื่อสามารถใช้ได้</translation> <translation id="2077273864382355561">ระยะหน่วงเวลาการปิดหน้าจอเมื่อทำงานโดยใช้พลังงานแบตเตอรี่</translation> <translation id="2082205219176343977">กำหนดค่าเวอร์ชัน Chrome ขั้นต่ำที่อุปกรณ์จะใช้ได้</translation> @@ -341,9 +333,6 @@ หากกำหนดค่านี้แล้ว ระบบจะขอให้ผู้ใช้ที่ใช้การปลดล็อกด่วนป้อนรหัสผ่านในหน้าจอล็อก ทั้งนี้ขึ้นอยู่กับการตั้งค่าดังกล่าว หากไม่ได้กำหนดค่านี้ไว้ ระบบจะขอให้ผู้ใช้ที่ใช้การปลดล็อกด่วนป้อนรหัสผ่านบนหน้าจอล็อกทุกวัน</translation> -<translation id="2188722565665306629">อนุญาตให้ผู้ใช้ตั้งระยะเวลาที่จะแสดงการแจ้งเตือนให้เปิด <ph name="PRODUCT_NAME" /> ขึ้นมาใหม่เพื่อนำอัปเดตที่รอดำเนินการไปใช้ - - การตั้งค่านโยบายนี้จะนำไปใช้ควบคุมระยะเวลา (หน่วยเป็นมิลลิวินาที) ซึ่งผู้ใช้จะได้รับแจ้งอย่างต่อเนื่องว่าต้องเปิด <ph name="PRODUCT_NAME" /> ขึ้นมาใหม่ (หรือต้องรีสตาร์ท <ph name="PRODUCT_OS_NAME" />) เพื่อรับการอัปเดต ในระยะเวลาดังกล่าว ระบบจะแจ้งเตือนผู้ใช้อยู่เรื่อยๆ ถึงความจำเป็นของการอัปเดต โดยอิงจากการตั้งค่านโยบาย <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> หากไม่ได้ตั้งค่านโยบาย ระบบจะใช้ระยะเวลาเริ่มต้น ซึ่งก็คือ 604,800,000 มิลลิวินาที (1 สัปดาห์)</translation> <translation id="2194470398825717446">นโยบายนี้เลิกใช้งานใน M61 แล้ว โปรดใช้ EcryptfsMigrationStrategy แทน ระบุลักษณะการทำงานของอุปกรณ์ที่มาพร้อม eCryptfs และต้องเปลี่ยนไปใช้การเข้ารหัส Ext4
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 3794f23..01396a7 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -305,14 +305,6 @@ Bu politika ayarı, kullanıcıya tarayıcının yeniden başlatılmasının önerildiği veya gerektiği bilgisini verecek bildirimleri etkinleştirir. Bir değer ayarlanmazsa <ph name="PRODUCT_NAME" />, menüsündeki küçük değişiklikler aracılığıyla kullanıcıya uygulamanın yeniden başlatılması gerektiğini belirtir. "Önerilen" seçeneği ayarlanırsa, kullanıcıya uygulamayı yeniden başlatmasının önerildiği yinelenen bir uyarı ile bildirilir. Kullanıcı, yeniden başlatmayı ertelemek için bu uyarıyı kapatabilir. "Zorunlu" değeri ayarlanırsa kullanıcıya, bildirim dönemi geçtikten sonra tarayıcının yeniden başlatılmasının zorlanacağını belirten yinelenen bir uyarı gösterilir. Bu dönem varsayılan olarak yedi gündür ve <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> politika ayarı aracılığıyla yapılandırılabilir. Yeniden başlatmanın ardından kullanıcı oturumu yeniden açılır.</translation> -<translation id="2075434678547407637">Videoların <ph name="PRODUCT_NAME" /> içinde otomatik olarak (kullanıcı onayı olmadan) ses içeriğiyle oynatılıp oynatılamayacağını kontrol etmenize olanak tanır. - - Bu politika Doğru değerine ayarlanırsa, <ph name="PRODUCT_NAME" /> ürününün medyayı otomatik olarak oynatmasına izin verilir. - Bu politika Yanlış değerine ayarlanırsa, <ph name="PRODUCT_NAME" /> ürününün medyayı otomatik olarak oynatmasına izin verilmez. - Varsayılan olarak <ph name="PRODUCT_NAME" /> ürününün medyayı otomatik olarak oynatmasına izin verilmez. - - <ph name="PRODUCT_NAME" /> çalışıyorsa ve bu politika değişirse, yalnızca yeni açılan sekmelere uygulanır. Bu nedenle bazı sekmeler hâlâ önceki davranışı yerine getiriyor olabilir. - </translation> <translation id="2077129598763517140">Kullanılabilir olduğunda donanım hızlandırmayı kullan</translation> <translation id="2077273864382355561">Pil gücüyle çalışırken ekran kapatma gecikmesi</translation> <translation id="2082205219176343977">Cihaz için izin verilen minimum Chrome sürümünü yapılandır.</translation> @@ -357,9 +349,6 @@ Bu ayar yapılandırılırsa, hızlı kilit açmayı kullanan kullanıcılardan kilit ekranında şifrelerini bu ayara göre girmeleri istenir. Bu ayar yapılandırılmazsa, hızlı kilit açmayı kullanan kullanıcılardan kilit ekranında şifrelerini her gün girmeleri istenir.</translation> -<translation id="2188722565665306629">Bekleyen bir güncellemenin uygulanması için <ph name="PRODUCT_NAME" /> uygulamasını yeniden başlatılmasıyla ilgili bildirimlerin gösterileceği dönemi ayarlamanıza olanak tanır. - - Bu politika ayarı, kullanıcıya bir güncelleme için <ph name="PRODUCT_NAME" /> uygulamasının (veya <ph name="PRODUCT_OS_NAME" /> işletim sisteminin) yeniden başlatılması gerektiği bilgisinin kademeli olarak verileceği dönemi milisaniye cinsinden kontrol etmek için kullanılabilir. Bu dönem boyunca, kullanıcıya <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> politikasının ayarına dayalı olarak bir güncelleme gerektiği konusunda tekrarlanan şekilde bilgi verilir. Bir değer ayarlanmazsa, varsayılan olarak 604.800.000 milisaniye (bir hafta) değeri kullanılır.</translation> <translation id="2194470398825717446">Bu politika M61'de kullanımdan kaldırılmıştır, onun yerine lütfen EcryptfsMigrationStrategy'yi kullanın. Ecryptfs koduyla gönderilen ve ext4 şifrelemesine geçmesi gereken bir cihazın nasıl davranması gerektiğini belirtir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index cdcf1cb..3c10bbe 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -295,14 +295,6 @@ Це правило дає змогу надсилати користувачеві сповіщення з рекомендацією про бажаний чи обов’язковий перезапуск веб-переглядача. Якщо правило не налаштовано, <ph name="PRODUCT_NAME" /> повідомляє користувачеві про потребу в перезапуску за допомогою незначних змін у своєму меню. Якщо для правила вибрано значення "Рекомендовано", користувач регулярно бачитиме застереження. Його можна закрити, щоб відкласти перезапуск. Якщо для правила вибрано значення "Обов’язково", користувач регулярно бачитиме застереження про примусовий перезапуск веб-переглядача після закінчення вказаного в сповіщенні часу. За умовчанням цей термін установлено на сім днів, але його можна змінити за допомогою правила "<ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />". Після перезапуску сеанс користувача відновлюється.</translation> -<translation id="2075434678547407637">Дозволяє контролювати автоматичне (без дозволу користувача) відтворення відео зі звуком у <ph name="PRODUCT_NAME" />. - - Якщо для правила вибрано значення true, у <ph name="PRODUCT_NAME" /> дозволено автоматично відтворювати медіа. - Якщо для правила вибрано значення false, у <ph name="PRODUCT_NAME" /> заборонено автоматично відтворювати медіа. - За умовчуванням у <ph name="PRODUCT_NAME" /> заборонено автоматично відтворювати медіа. - - Зауважте: якщо це правило зміниться, коли <ph name="PRODUCT_NAME" /> запущено, воно застосовуватиметься лише до нових відкритих вкладок. Тому деякі вкладки можуть працювати в попередньому режимі. - </translation> <translation id="2077129598763517140">Використовувати апаратне прискорення, якщо доступно</translation> <translation id="2077273864382355561">Затримка вимкнення екрана, коли використовується заряд акумулятора</translation> <translation id="2082205219176343977">Налаштуйте мінімальну дозволену версію Chrome для пристрою.</translation> @@ -348,9 +340,6 @@ Якщо цей параметр налаштовано, користувачам, які активували швидке розблокування, потрібно буде вводити пароль на заблокованому екрані залежно від значення параметра. Якщо цей параметр не налаштовано, користувачам, які активували швидке розблокування, потрібно буде вводити пароль на заблокованому екрані щодня.</translation> -<translation id="2188722565665306629">Дає змогу встановити період часу, протягом якого користувач бачитиме сповіщення про перезапуск <ph name="PRODUCT_NAME" />, щоб застосувати оновлення, яке очікує на розгляд. - - Це правило можна використовувати, щоб указати період часу (у мілісекундах), протягом якого користувач регулярно отримуватиме сповіщення, що <ph name="PRODUCT_NAME" /> потрібно перезапустити (або <ph name="PRODUCT_OS_NAME" /> треба перезавантажити) для оновлення. Користувач бачитиме це сповіщення впродовж часу, указаного в правилі <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Якщо час не налаштовано, використовується період за умовчанням – 604 800 000 мілісекунд (один тиждень).</translation> <translation id="2194470398825717446">Це правило більше не підтримується у версії M61. Натомість використовуйте правило стратегії переходу зі стандарту eCryptfs (EcryptfsMigrationStrategy). Указує, як має поводитися пристрій стандарту eCryptfs, який має перейти на шифрування стандарту ext4.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index c7faa5c..5a298567 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -152,9 +152,9 @@ <translation id="1503487916067509762">Cho phép chặn phần mềm bên thứ ba thêm mã thực thi</translation> <translation id="1504431521196476721">Chứng thực từ xa</translation> <translation id="1509692106376861764">Chính sách này đã chấm dứt kể từ phiên bản <ph name="PRODUCT_NAME" /> 29.</translation> -<translation id="1519337829779572350">Cài đặt này không còn được dùng nữa, hãy sử dụng cài đặt SafeBrowsingExtendedReportingEnabled để thay thế. Thao tác bật hoặc tắt cài đặt SafeBrowsingExtendedReportingEnabled cũng giống với thao tác đặt SafeBrowsingExtendedReportingOptInAllowed thành False. +<translation id="1519337829779572350">Cài đặt này không còn được dùng nữa, hãy sử dụng cài đặt SafeBrowsingExtendedReportingEnabled để thay thế. Việc bật hoặc tắt cài đặt SafeBrowsingExtendedReportingEnabled cũng giống với thao tác đặt SafeBrowsingExtendedReportingOptInAllowed thành False. - Đặt chính sách này thành false sẽ ngăn người dùng chọn gửi một số thông tin hệ thống và nội dung trang cho máy chủ Google. Nếu cài đặt này là true hoặc chưa được định cấu hình, thì người dùng sẽ được phép gửi một số thông tin hệ thống và nội dung trang cho dịch vụ Duyệt web an toàn nhằm giúp phát hiện các trang web cũng như ứng dụng nguy hiểm. + Đặt chính sách này thành false sẽ ngăn người dùng chọn gửi một số thông tin hệ thống và nội dung trang đến máy chủ Google. Nếu cài đặt này là true hoặc chưa được định cấu hình, thì người dùng sẽ được phép gửi một số thông tin hệ thống và nội dung trang đến dịch vụ Duyệt web an toàn nhằm giúp phát hiện các trang web cũng như ứng dụng nguy hiểm. Hãy truy cập vào https://developers.google.com/safe-browsing để biết thêm thông tin về Duyệt web an toàn.</translation> <translation id="1522425503138261032">Cho phép các trang web theo dõi vị trí thực của người dùng</translation> @@ -296,14 +296,6 @@ Cài đặt chính sách này bật thông báo để báo cho người dùng rằng họ cần hoặc bắt buộc phải chạy lại trình duyệt. Nếu người dùng không đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ cho người dùng biết rằng họ cần chạy lại qua các thay đổi nhỏ đối với menu của sản phẩm. Nếu người dùng đặt chính sách thành 'Đề xuất', một cảnh báo lặp lại sẽ hiển thị cho người dùng biết rằng họ cần chạy lại. Người dùng có thể bỏ qua cảnh báo này để hoãn việc chạy lại. Nếu người dùng đặt chính sách thành 'Bắt buộc', một cảnh báo lặp lại sẽ hiển thị cho người dùng biết rằng bắt buộc phải chạy lại trình duyệt sau khi khoảng thời gian thông báo đã hết. Khoảng thời gian này là 7 ngày theo mặc định và có thể định cấu hình qua cài đặt chính sách <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Phiên của người dùng được lưu trữ sau lần chạy lại đó.</translation> -<translation id="2075434678547407637">Cho phép bạn kiểm soát xem có thể tự động phát video chứa nội dung âm thanh trong <ph name="PRODUCT_NAME" /> (khi chưa có sự đồng ý của người dùng) hay không. - - Nếu bạn đặt chính sách thành True, <ph name="PRODUCT_NAME" /> sẽ được phép tự động phát phương tiện. - Nếu bạn đặt chính sách thành False, <ph name="PRODUCT_NAME" /> sẽ không được phép tự động phát phương tiện. - Theo mặc định, <ph name="PRODUCT_NAME" /> sẽ không được phép tự động phát phương tiện. - - Xin lưu ý rằng nếu <ph name="PRODUCT_NAME" /> đang chạy và chính sách này thay đổi thì chính sách sẽ chỉ áp dụng cho các tab mới mở. Vì vậy, một số tab có thể vẫn hoạt động như cũ. - </translation> <translation id="2077129598763517140">Sử dụng chế độ tăng tốc phần cứng khi khả dụng</translation> <translation id="2077273864382355561">Độ trễ tắt màn hình khi chạy trên nguồn pin</translation> <translation id="2082205219176343977">Định cấu hình phiên bản Chrome tối thiểu được phép cho thiết bị.</translation> @@ -355,9 +347,6 @@ Nếu cài đặt này được định cấu hình, người dùng sử dụng mở khóa nhanh sẽ được yêu cầu nhập mật khẩu vào màn hình khóa tùy theo cài đặt này. Nếu cài đặt này không được định cấu hình, người dùng sử dụng mở khóa nhanh sẽ được yêu cầu nhập mật khẩu vào màn hình khóa hàng ngày.</translation> -<translation id="2188722565665306629">Cho phép bạn thiết lập khoảng thời gian hiển thị thông báo yêu cầu chạy lại <ph name="PRODUCT_NAME" /> để áp dụng bản cập nhật đang chờ. - - Có thể sử dụng cài đặt chính sách này để kiểm soát khoảng thời gian, tính bằng mili giây, qua đó người dùng được thông báo dần dần rằng cần phải chạy lại <ph name="PRODUCT_NAME" /> (hoặc cần phải khởi động lại <ph name="PRODUCT_OS_NAME" />) để cập nhật. Quá khoảng thời gian này, người dùng sẽ được nhắc lại nhiều lần về việc cần phải cập nhật dựa trên việc đặt chính sách <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Nếu người dùng không đặt chính sách thì khoảng thời gian mặc định là 604800000 mili giây (một tuần) sẽ được sử dụng.</translation> <translation id="2194470398825717446">Chính sách này không dùng trong M61 nữa, vui lòng sử dụng EcryptfsMigrationStrategy. Chỉ định cách thiết bị đã có sẵn ecryptfs sẽ hoạt động và cần chuyển đổi sang mã hóa ext4..
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 25c686f..d2fb5cd 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -281,14 +281,6 @@ 此政策设置旨在启用建议或要求用户重新启动浏览器的通知功能。如果此政策未设置,<ph name="PRODUCT_NAME" /> 会通过菜单的细微变化来提示用户需要重新启动。如果此政策设为“推荐”,系统将会显示建议用户重新启动浏览器的周期性警告。用户可以关闭该警告来推迟重新启动。如果此政策设为“必需”,系统将会显示周期性警告,以便让用户知道系统将于通知期结束后强制重新启动浏览器。该通知期会默认设为 7 天,不过可以通过 <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 政策设置进行配置。 浏览器重新启动后,将会恢复用户会话。</translation> -<translation id="2075434678547407637">可让您控制 <ph name="PRODUCT_NAME" /> 中的视频能否不经用户同意即可有声地自动播放。 - - 如果此政策设为 true,<ph name="PRODUCT_NAME" /> 将能够自动播放媒体。 - 如果此政策设为 false,<ph name="PRODUCT_NAME" /> 将无法自动播放媒体。 - 默认情况下,<ph name="PRODUCT_NAME" /> 无法自动播放媒体。 - - 请注意,如果此政策在 <ph name="PRODUCT_NAME" /> 运行期间发生了更改,更改后的设置将会仅应用于新打开的标签页。因此,部分标签页或许仍会遵循先前的行为方式。 - </translation> <translation id="2077129598763517140">使用硬件加速模式(如果可用)</translation> <translation id="2077273864382355561">使用电源供电时的屏幕关闭延迟时间</translation> <translation id="2082205219176343977">为设备配置允许使用的最低 Chrome 版本。</translation> @@ -327,9 +319,6 @@ 如果此设置已配置,系统将会根据此设置的值要求那些使用“快速解锁”的用户在锁定屏幕上输入密码。 如果此设置未配置,系统每天都会要求那些使用“快速解锁”的用户在锁定屏幕上输入密码。</translation> -<translation id="2188722565665306629">可让您设置系统显示 <ph name="PRODUCT_NAME" /> 重新启动通知(提示用户应用尚未应用的更新)的时间段。 - - 此政策设置可用于控制该时间段的时长(以毫秒为单位),系统将在该时间段内循序渐进地通知用户必须重新启动 <ph name="PRODUCT_NAME" />(或 <ph name="PRODUCT_OS_NAME" />)以进行更新。在该时间段内,系统将会根据 <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 政策的设置重复提示用户需要进行更新。如果此政策未设置,系统将会使用 604800000 毫秒(1 周)的默认时长。</translation> <translation id="2194470398825717446">我们在 M61 中弃用了此政策,请改用 EcryptfsMigrationStrategy。 用于指定内置了 ecryptfs 且需要转换为采用 ext4 加密功能的设备的行为方式。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 444c905..5468f7693 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -294,14 +294,6 @@ 這項政策設定可啟用通知,藉此建議或要求使用者重新啟動瀏覽器。如果不予設定,<ph name="PRODUCT_NAME" /> 會以細微的選單變更讓使用者知道瀏覽器需要重新啟動。如果設為「Recommended」(建議),瀏覽器會定期顯示警告,建議使用者重新啟動。如果不想立即重新啟動,使用者可以關閉這項警告。如果設為「Required」(必要),瀏覽器會定期顯示警告,告知使用者瀏覽器將於通知期過後強制重新啟動。通知期預設為七天,可透過 <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 政策設定加以設定。 使用者的工作階段會在瀏覽器重新啟動後恢復。</translation> -<translation id="2075434678547407637">讓你控制 <ph name="PRODUCT_NAME" /> 中的影片能否自動播放音訊內容 (不需使用者同意)。 - - 如果將這項政策設為 True,<ph name="PRODUCT_NAME" /> 即可自動播放媒體。 - 如果將這項政策設為 False,<ph name="PRODUCT_NAME" /> 就無法自動播放媒體。 - 根據預設,<ph name="PRODUCT_NAME" /> 不能自動播放媒體。 - - 請注意,如果 <ph name="PRODUCT_NAME" /> 正在執行中,而這項政策發生變更,則只有新開啟的分頁會套用變更後的政策。因此,部分分頁仍可能執行先前行為。 - </translation> <translation id="2077129598763517140">在可用時使用硬體加速</translation> <translation id="2077273864382355561">在電池供電環境下執行時的螢幕關閉延遲時間</translation> <translation id="2082205219176343977">設定裝置的最低 Chrome 版本限制。</translation> @@ -346,9 +338,6 @@ 如果指定這項設定,系統會根據這項設定的值要求快速解鎖功能使用者在鎖定畫面中輸入密碼。 如果未指定這項設定,系統則會每天要求快速解鎖功能使用者在鎖定畫面中輸入密碼。</translation> -<translation id="2188722565665306629">讓你設定要顯示 <ph name="PRODUCT_NAME" /> 重新啟動通知 (為了套用待安裝的更新) 的時間範圍。 - - 這項設定可用於控制時間範圍 (以毫秒為單位),透過定期通知讓使用者瞭解 <ph name="PRODUCT_NAME" /> 必須重新啟動 (或者 <ph name="PRODUCT_OS_NAME" />必須重新啟動) 才能套用更新。在此期間內,系統會根據 <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 政策的設定持續告知使用者必須進行更新。如果不予設定,則會使用 604800000 毫秒 (一週) 做為預設的時間範圍。</translation> <translation id="2194470398825717446">M61 已淘汰這項政策,請改用 EcryptfsMigrationStrategy。 針對採用 eCryptfs 檔案系統且需要轉換成 Ext4 加密系統的裝置指定相關行為。 @@ -1783,7 +1772,7 @@ <translation id="6856743875250214792">這項政策僅供內部測試,而且有安全性方面的問題,因此 M66 已淘汰並移除這項政策。 指定要在 <ph name="PRODUCT_NAME" /> 啟動時套用的設定。系統僅會在進入登入畫面時套用指定的設定。透過這個政策所指定的設定不會反映在使用者工作階段中。</translation> -<translation id="685769593149966548">強制執行高度的 YouTube 嚴格篩選模式</translation> +<translation id="685769593149966548">強制執行 YouTube 高度嚴格篩選模式</translation> <translation id="686079137349561371">Microsoft Windows 7 以上版本</translation> <translation id="687046793986382807">我們已於 <ph name="PRODUCT_NAME" /> 35 版中移除這項政策。
diff --git a/components/sessions/core/tab_restore_service_helper.cc b/components/sessions/core/tab_restore_service_helper.cc index 889626c..66feac6 100644 --- a/components/sessions/core/tab_restore_service_helper.cc +++ b/components/sessions/core/tab_restore_service_helper.cc
@@ -146,21 +146,21 @@ Tab* tab) { // TODO(dullweber): Change to DCHECK() when this is tested to be true. CHECK(ValidateTab(*tab)); - CHECK_EQ(tab->current_navigation_index, - tab->navigations[tab->current_navigation_index].index()); std::vector<SerializedNavigationEntry> new_navigations; - int deleted_navigations = 0; - for (auto& navigation : tab->navigations) { + int deleted_navigations_count = 0; + for (size_t i = 0; i < tab->navigations.size(); i++) { + SerializedNavigationEntry& navigation = tab->navigations[i]; if (predicate.Run(navigation)) { // If the current navigation is deleted, remove this tab. - if (tab->current_navigation_index == navigation.index()) + if (static_cast<int>(i) == tab->current_navigation_index) return true; - deleted_navigations++; + deleted_navigations_count++; } else { // Adjust indices according to number of deleted navigations. - if (tab->current_navigation_index == navigation.index()) - tab->current_navigation_index -= deleted_navigations; - navigation.set_index(navigation.index() - deleted_navigations); + if (static_cast<int>(i) == tab->current_navigation_index) + tab->current_navigation_index -= deleted_navigations_count; + DCHECK_GE(navigation.index(), deleted_navigations_count); + navigation.set_index(navigation.index() - deleted_navigations_count); new_navigations.push_back(std::move(navigation)); } } @@ -173,24 +173,30 @@ bool TabRestoreServiceHelper::DeleteFromWindow( const DeletionPredicate& predicate, Window* window) { + // TODO(dullweber): Change to DCHECK() when this is tested to be true. + CHECK(ValidateWindow(*window)); std::vector<std::unique_ptr<Tab>> new_tabs; - int deleted_tabs = 0; - for (auto& tab : window->tabs) { + int deleted_tabs_count = 0; + for (size_t i = 0; i < window->tabs.size(); i++) { + std::unique_ptr<Tab>& tab = window->tabs[i]; if (DeleteFromTab(predicate, tab.get())) { - if (window->tabs[window->selected_tab_index] == tab) - window->selected_tab_index = 0; - deleted_tabs++; + if (static_cast<int>(i) == window->selected_tab_index) + window->selected_tab_index = new_tabs.empty() ? 0 : new_tabs.size() - 1; + deleted_tabs_count++; } else { // Adjust indices according to number of deleted tabs. - if (window->tabs[window->selected_tab_index] == tab) - window->selected_tab_index -= deleted_tabs; - if (tab->tabstrip_index >= 0) - tab->tabstrip_index -= deleted_tabs; + if (static_cast<int>(i) == window->selected_tab_index) + window->selected_tab_index -= deleted_tabs_count; + if (tab->tabstrip_index >= 0) { + DCHECK_GE(tab->tabstrip_index, deleted_tabs_count); + tab->tabstrip_index -= deleted_tabs_count; + } new_tabs.push_back(std::move(tab)); } } window->tabs = std::move(new_tabs); - DCHECK(window->tabs.empty() || ValidateWindow(*window)); + // TODO(dullweber): Change to DCHECK() when this is tested to be true. + CHECK(window->tabs.empty() || ValidateWindow(*window)); return window->tabs.empty(); }
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index f3fab681..fb98904 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -310,7 +310,7 @@ <translation id="3207960819495026254">বুকমার্ক করা হয়েছে</translation> <translation id="3209375525920864198">অনুগ্রহ করে একটি সঠিক সেশনের নাম লিখুন।</translation> <translation id="3211223744486044430">পরের বার আরও দ্রুত পেমেন্ট করা জন্য এই কার্ডটি Google অ্যাকাউন্টে এবং এই ডিভাইসে সেভ করে রাখুন।</translation> -<translation id="3225919329040284222">সার্ভারটি এমন একটি শংসাপত্র উপস্থাপনা করেছে যা বিল্ট-ইন প্রত্যাশাগুলির সাথে মেলে না৷ এই প্রত্যাশাগুলি আপনাকে সুরক্ষিত করতে কিছু নিশ্চিত, উচ্চ সুরক্ষার ওয়েবসাইটের জন্য অন্তর্ভুক্ত৷</translation> +<translation id="3225919329040284222">সার্ভারটি এমন একটি শংসাপত্র উপস্থাপনা করেছে যা অন্তর্ভুক্ত প্রত্যাশাগুলির সাথে মেলে না৷ এই প্রত্যাশাগুলি আপনাকে সুরক্ষিত করতে কিছু নিশ্চিত, উচ্চ সুরক্ষার ওয়েবসাইটের জন্য অন্তর্ভুক্ত৷</translation> <translation id="3226128629678568754">পৃষ্ঠাটি লোড করতে প্রয়োজনীয় ডেটেটি আবার জমা দিতে আবার লোড করার বোতামটি টিপুন৷</translation> <translation id="3227137524299004712">মাইক্রোফোন</translation> <translation id="3228969707346345236">পৃষ্ঠাটি ইতিমধ্যে <ph name="LANGUAGE" />-এ থাকার কারণে অনুবাদ ব্যর্থ হয়েছে৷</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 738625f..a8cb177 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -798,6 +798,7 @@ <translation id="7275334191706090484">Spravované záložky</translation> <translation id="7298195798382681320">Doporučeno</translation> <translation id="7309308571273880165">Zpráva o selhání pořízená <ph name="CRASH_TIME" /> (o nahrání požádal uživatel, dosud nenahrána)</translation> +<translation id="7320336641823683070">Pomoc s připojením</translation> <translation id="7334320624316649418">&Opakovat změnu uspořádání</translation> <translation id="733923710415886693">Certifikát serveru nebyl zveřejněn prostřednictvím projektu Certificate Transparency.</translation> <translation id="7353601530677266744">Příkazový řádek</translation> @@ -882,6 +883,7 @@ <translation id="782886543891417279">Síť Wi-Fi, kterou používáte (<ph name="WIFI_NAME" />), může vyžadovat, abyste navštívili její stránku přihlášení.</translation> <translation id="785549533363645510">To neznamená, že jste neviditelní. Anonymní režim neskryje vaši aktivitu před vaším zaměstnavatelem, poskytovatelem internetových služeb ani webovými stránkami, které navštívíte.</translation> <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation> +<translation id="7862185352068345852">Opustit web?</translation> <translation id="7878176543348854470">Obchodník přijímá debetní a předplacené karty.</translation> <translation id="7878562273885520351">Heslo může být prolomeno</translation> <translation id="7887683347370398519">Zkontrolujte kód CVC a zkuste to znovu</translation> @@ -904,6 +906,7 @@ <translation id="8041940743680923270">Použít výchozí globální hodnotu (Dotázat se)</translation> <translation id="8042918947222776840">Vybrat způsob vyzvednutí</translation> <translation id="8057711352706143257">Software <ph name="SOFTWARE_NAME" /> není nakonfigurován správně. Tento problém lze obvykle vyřešit odinstalováním softwaru <ph name="SOFTWARE_NAME" />. <ph name="FURTHER_EXPLANATION" /></translation> +<translation id="8079031581361219619">Načíst web znovu?</translation> <translation id="8088680233425245692">Zobrazení článku se nezdařilo.</translation> <translation id="8091372947890762290">Čeká se na aktivaci na serveru</translation> <translation id="8094917007353911263">Síť, kterou používáte, může vyžadovat, abyste navštívili stránku <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> @@ -919,6 +922,7 @@ <translation id="8201077131113104583">Neplatná adresa URL aktualizace rozšíření s ID <ph name="EXTENSION_ID" />.</translation> <translation id="8202097416529803614">Shrnutí objednávky</translation> <translation id="8205463626947051446">Tento web často zobrazuje rušivé reklamy</translation> +<translation id="8211406090763984747">Připojení není zabezpečené</translation> <translation id="8218327578424803826">Přiřazené místo:</translation> <translation id="8225771182978767009">Uživatel, který tento počítač nastavoval, se rozhodl tento web blokovat.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index c6e2bc5b..8e8fd823 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -430,6 +430,7 @@ <translation id="4103249731201008433">Device serial number is invalid</translation> <translation id="410351446219883937">Autoplay</translation> <translation id="4103763322291513355">Visit <strong>chrome://policy</strong> to see the list of blacklisted URLs and other policies enforced by your system administrator.</translation> +<translation id="4110652170750985508">Review your payment</translation> <translation id="4116663294526079822">Always allow on this site</translation> <translation id="4117700440116928470">Policy scope is not supported.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 other}other{# others}}</translation> @@ -803,6 +804,7 @@ <translation id="7275334191706090484">Managed Bookmarks</translation> <translation id="7298195798382681320">Recommended</translation> <translation id="7309308571273880165">Crash report captured on <ph name="CRASH_TIME" /> (upload requested by user, not yet uploaded)</translation> +<translation id="7320336641823683070">Connection Help</translation> <translation id="7334320624316649418">&Redo reorder</translation> <translation id="733923710415886693">The server's certificate was not disclosed via Certificate Transparency.</translation> <translation id="7353601530677266744">Command Line</translation> @@ -887,6 +889,7 @@ <translation id="782886543891417279">The Wi-Fi that you are using (<ph name="WIFI_NAME" />) may require you to visit its login page.</translation> <translation id="785549533363645510">However, you aren’t invisible. Going incognito doesn’t hide your browsing from your employer, your Internet service provider or the websites that you visit.</translation> <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation> +<translation id="7862185352068345852">Leave site?</translation> <translation id="7878176543348854470">Debit and prepaid cards are accepted.</translation> <translation id="7878562273885520351">Your password may be compromised</translation> <translation id="7887683347370398519">Check your CVC and try again</translation> @@ -909,6 +912,7 @@ <translation id="8041940743680923270">Use global default (Ask)</translation> <translation id="8042918947222776840">Choose pickup method</translation> <translation id="8057711352706143257">'<ph name="SOFTWARE_NAME" />' isn’t configured correctly. Uninstalling '<ph name="SOFTWARE_NAME" />' usually fixes the problem. <ph name="FURTHER_EXPLANATION" /></translation> +<translation id="8079031581361219619">Reload site?</translation> <translation id="8088680233425245692">Failed to view article.</translation> <translation id="8091372947890762290">Activation is pending on the server</translation> <translation id="8094917007353911263">The network that you are using may require you to visit <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> @@ -924,6 +928,7 @@ <translation id="8201077131113104583">Invalid update URL for extension with ID "<ph name="EXTENSION_ID" />".</translation> <translation id="8202097416529803614">Order summary</translation> <translation id="8205463626947051446">Site tends to show intrusive ads</translation> +<translation id="8211406090763984747">Connection is secure</translation> <translation id="8218327578424803826">Assigned Location:</translation> <translation id="8225771182978767009">The person who set up this computer has chosen to block this site.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
diff --git a/components/visitedlink/browser/visitedlink_event_listener.cc b/components/visitedlink/browser/visitedlink_event_listener.cc index 52410fc..d1e6040d 100644 --- a/components/visitedlink/browser/visitedlink_event_listener.cc +++ b/components/visitedlink/browser/visitedlink_event_listener.cc
@@ -92,7 +92,7 @@ if (!process) return; // Happens in tests - if (!process->VisibleWidgetCount()) + if (!process->VisibleClientCount()) return; if (reset_needed_) {
diff --git a/components/visitedlink/test/visitedlink_unittest.cc b/components/visitedlink/test/visitedlink_unittest.cc index cde6fc1..7e91065 100644 --- a/components/visitedlink/test/visitedlink_unittest.cc +++ b/components/visitedlink/test/visitedlink_unittest.cc
@@ -602,7 +602,7 @@ explicit VisitRelayingRenderProcessHost( content::BrowserContext* browser_context, VisitCountingContext* context) - : MockRenderProcessHost(browser_context), widgets_(0) { + : MockRenderProcessHost(browser_context) { OverrideBinderForTesting( mojom::VisitedLinkNotificationSink::Name_, base::Bind(&VisitCountingContext::Bind, base::Unretained(context))); @@ -618,13 +618,7 @@ content::NotificationService::NoDetails()); } - void WidgetRestored() override { widgets_++; } - void WidgetHidden() override { widgets_--; } - int VisibleWidgetCount() const override { return widgets_; } - private: - int widgets_; - DISALLOW_COPY_AND_ASSIGN(VisitRelayingRenderProcessHost); };
diff --git a/components/viz/client/client_layer_tree_frame_sink.cc b/components/viz/client/client_layer_tree_frame_sink.cc index 6640d1d..1549f472 100644 --- a/components/viz/client/client_layer_tree_frame_sink.cc +++ b/components/viz/client/client_layer_tree_frame_sink.cc
@@ -126,6 +126,10 @@ if (!enable_surface_synchronization_) { local_surface_id_ = local_surface_id_provider_->GetLocalSurfaceIdForFrame(frame); + } else { + CHECK(local_surface_id_ != last_submitted_local_surface_id_ || + (last_submitted_device_scale_factor_ == frame.device_scale_factor() && + last_submitted_size_in_pixels_ == frame.size_in_pixels())); } TRACE_EVENT_FLOW_BEGIN0(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"), @@ -138,6 +142,10 @@ if (hit_test_data_provider_) hit_test_region_list = hit_test_data_provider_->GetHitTestData(frame); + last_submitted_local_surface_id_ = local_surface_id_; + last_submitted_device_scale_factor_ = frame.device_scale_factor(); + last_submitted_size_in_pixels_ = frame.size_in_pixels(); + compositor_frame_sink_ptr_->SubmitCompositorFrame( local_surface_id_, std::move(frame), std::move(hit_test_region_list), tracing_enabled ? base::TimeTicks::Now().since_origin().InMicroseconds()
diff --git a/components/viz/client/client_layer_tree_frame_sink.h b/components/viz/client/client_layer_tree_frame_sink.h index 701c349..27f882c 100644 --- a/components/viz/client/client_layer_tree_frame_sink.h +++ b/components/viz/client/client_layer_tree_frame_sink.h
@@ -127,6 +127,10 @@ const bool enable_surface_synchronization_; const bool wants_animate_only_begin_frames_; + LocalSurfaceId last_submitted_local_surface_id_; + float last_submitted_device_scale_factor_ = 1.f; + gfx::Size last_submitted_size_in_pixels_; + base::WeakPtrFactory<ClientLayerTreeFrameSink> weak_factory_; DISALLOW_COPY_AND_ASSIGN(ClientLayerTreeFrameSink);
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn index ae65bd8..91512424 100644 --- a/components/viz/common/BUILD.gn +++ b/components/viz/common/BUILD.gn
@@ -127,6 +127,8 @@ "resources/single_release_callback.h", "resources/transferable_resource.cc", "resources/transferable_resource.h", + "skia_helper.cc", + "skia_helper.h", "surfaces/child_local_surface_id_allocator.cc", "surfaces/child_local_surface_id_allocator.h", "surfaces/frame_sink_id.cc",
diff --git a/components/viz/common/DEPS b/components/viz/common/DEPS index 7aece4f..eb42d45 100644 --- a/components/viz/common/DEPS +++ b/components/viz/common/DEPS
@@ -1,6 +1,10 @@ # Please consult components/viz/README.md about allowable dependencies. specific_include_rules = { + "skia_helper.(cc|h)": [ + "+cc/base", + "+third_party/skia", + ], # DEPS for GLHelper and friends which are in the root common/ directory. "(yuv_readback|gl_helper).*\.(cc|h)": [ "+gpu/GLES2",
diff --git a/components/viz/common/display/renderer_settings.h b/components/viz/common/display/renderer_settings.h index f0b595f..db0b1d7 100644 --- a/components/viz/common/display/renderer_settings.h +++ b/components/viz/common/display/renderer_settings.h
@@ -29,6 +29,7 @@ bool show_overdraw_feedback = false; bool enable_draw_occlusion = false; bool use_skia_renderer = false; + bool use_skia_deferred_display_list = false; bool allow_overlays = true; bool dont_round_texture_sizes_for_pixel_tests = false; int highp_threshold_min = 0;
diff --git a/components/viz/common/gl_helper.cc b/components/viz/common/gl_helper.cc index efc29c8..e906c6e3 100644 --- a/components/viz/common/gl_helper.cc +++ b/components/viz/common/gl_helper.cc
@@ -955,6 +955,13 @@ (output_size.height() + 1) / 2); } +// static +uint32_t ReadbackYUVInterface::GetGrGLBackendStateChanges() { + return kTextureBinding_GrGLBackendState | kView_GrGLBackendState | + kVertex_GrGLBackendState | kProgram_GrGLBackendState | + kRenderTarget_GrGLBackendState; +} + namespace { I420ConverterImpl::I420ConverterImpl(GLES2Interface* gl,
diff --git a/components/viz/common/gl_helper.h b/components/viz/common/gl_helper.h index a142e9c..bd11e11 100644 --- a/components/viz/common/gl_helper.h +++ b/components/viz/common/gl_helper.h
@@ -574,6 +574,10 @@ unsigned char* v_plane_data, const gfx::Point& paste_location, const base::Callback<void(bool)>& callback) = 0; + + // Returns the bitwise ORed set of GL backend state change that can be used to + // restore the GL state after ReadbackYUV() calls. + static uint32_t GetGrGLBackendStateChanges(); }; } // namespace viz
diff --git a/components/viz/common/gpu/context_provider.h b/components/viz/common/gpu/context_provider.h index c00e9ff..21af48a04 100644 --- a/components/viz/common/gpu/context_provider.h +++ b/components/viz/common/gpu/context_provider.h
@@ -92,6 +92,11 @@ // nullptr if a GrContext fails to initialize on this context. virtual class GrContext* GrContext() = 0; + // Invalidates the cached OpenGL state in GrContext. The context provider + // must have been successfully bound to a thread before calling this. + // See skia GrContext::resetContext for details. + virtual void InvalidateGrContext(uint32_t state) = 0; + // Returns the capabilities of the currently bound 3d context. The context // provider must have been successfully bound to a thread before calling this. virtual const gpu::Capabilities& ContextCapabilities() const = 0;
diff --git a/components/viz/common/gpu/in_process_context_provider.cc b/components/viz/common/gpu/in_process_context_provider.cc index 48a4bf5..d85e714 100644 --- a/components/viz/common/gpu/in_process_context_provider.cc +++ b/components/viz/common/gpu/in_process_context_provider.cc
@@ -107,8 +107,8 @@ &max_glyph_cache_texture_bytes); gr_context_.reset(new skia_bindings::GrContextForGLES2Interface( - ContextGL(), ContextSupport(), ContextCapabilities(), - max_resource_cache_bytes, max_glyph_cache_texture_bytes)); + ContextGL(), ContextCapabilities(), max_resource_cache_bytes, + max_glyph_cache_texture_bytes)); return gr_context_->get(); } @@ -116,6 +116,11 @@ return cache_controller_.get(); } +void InProcessContextProvider::InvalidateGrContext(uint32_t state) { + if (gr_context_) + gr_context_->ResetContext(state); +} + base::Lock* InProcessContextProvider::GetLock() { return &context_lock_; }
diff --git a/components/viz/common/gpu/in_process_context_provider.h b/components/viz/common/gpu/in_process_context_provider.h index aa66c1b..37c39be 100644 --- a/components/viz/common/gpu/in_process_context_provider.h +++ b/components/viz/common/gpu/in_process_context_provider.h
@@ -59,6 +59,7 @@ gpu::ContextSupport* ContextSupport() override; class GrContext* GrContext() override; ContextCacheController* CacheController() override; + void InvalidateGrContext(uint32_t state) override; base::Lock* GetLock() override; const gpu::Capabilities& ContextCapabilities() const override; const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override;
diff --git a/components/viz/common/gpu/raster_context_provider.h b/components/viz/common/gpu/raster_context_provider.h index f302ebd8..e1d0f28 100644 --- a/components/viz/common/gpu/raster_context_provider.h +++ b/components/viz/common/gpu/raster_context_provider.h
@@ -97,6 +97,11 @@ // nullptr if a GrContext fails to initialize on this context. virtual class GrContext* GrContext() = 0; + // Invalidates the cached OpenGL state in GrContext. The context provider + // must have been successfully bound to a thread before calling this. + // See skia GrContext::resetContext for details. + virtual void InvalidateGrContext(uint32_t state) = 0; + // Returns the capabilities of the currently bound 3d context. The context // provider must have been successfully bound to a thread before calling this. virtual const gpu::Capabilities& ContextCapabilities() const = 0;
diff --git a/components/viz/common/skia_helper.cc b/components/viz/common/skia_helper.cc new file mode 100644 index 0000000..151f552 --- /dev/null +++ b/components/viz/common/skia_helper.cc
@@ -0,0 +1,55 @@ +// Copyright (c) 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 "components/viz/common/skia_helper.h" +#include "base/trace_event/trace_event.h" +#include "cc/base/math_util.h" +#include "ui/gfx/skia_util.h" + +namespace viz { +sk_sp<SkImage> SkiaHelper::ApplyImageFilter(sk_sp<SkImage> src_image, + const gfx::RectF& src_rect, + const gfx::RectF& dst_rect, + const gfx::Vector2dF& scale, + sk_sp<SkImageFilter> filter, + SkIPoint* offset, + SkIRect* subset, + const gfx::PointF& origin) { + if (!filter) + return nullptr; + + if (!src_image) { + TRACE_EVENT_INSTANT0("cc", + "ApplyImageFilter wrap background texture failed", + TRACE_EVENT_SCOPE_THREAD); + return nullptr; + } + + // Big filters can sometimes fallback to CPU. Therefore, we need + // to disable subnormal floats for performance and security reasons. + cc::ScopedSubnormalFloatDisabler disabler; + SkMatrix local_matrix; + local_matrix.setTranslate(origin.x(), origin.y()); + local_matrix.postScale(scale.x(), scale.y()); + local_matrix.postTranslate(-src_rect.x(), -src_rect.y()); + + SkIRect clip_bounds = gfx::RectFToSkRect(dst_rect).roundOut(); + clip_bounds.offset(-src_rect.x(), -src_rect.y()); + + filter = filter->makeWithLocalMatrix(local_matrix); + SkIRect in_subset = SkIRect::MakeWH(src_rect.width(), src_rect.height()); + + sk_sp<SkImage> image = src_image->makeWithFilter(filter.get(), in_subset, + clip_bounds, subset, offset); + if (!image || !image->isTextureBacked()) { + return nullptr; + } + + // Force a flush of the Skia pipeline before we switch back to the compositor + // context. + image->getTextureHandle(true); + CHECK(image->isTextureBacked()); + return image; +} + +} // namespace viz
diff --git a/components/viz/common/skia_helper.h b/components/viz/common/skia_helper.h new file mode 100644 index 0000000..9ab8d142 --- /dev/null +++ b/components/viz/common/skia_helper.h
@@ -0,0 +1,31 @@ +// Copyright (c) 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 COMPONENTS_VIZ_COMMON_SKIA_HELPER_H_ +#define COMPONENTS_VIZ_COMMON_SKIA_HELPER_H_ + +#include "components/viz/common/viz_common_export.h" +#include "third_party/skia/include/core/SkImage.h" +#include "third_party/skia/include/core/SkImageFilter.h" +#include "third_party/skia/include/core/SkPoint.h" +#include "ui/gfx/geometry/rect_f.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/geometry/vector2d_f.h" + +namespace viz { +class VIZ_COMMON_EXPORT SkiaHelper { + public: + static sk_sp<SkImage> ApplyImageFilter(sk_sp<SkImage> src_image, + const gfx::RectF& src_rect, + const gfx::RectF& dst_rect, + const gfx::Vector2dF& scale, + sk_sp<SkImageFilter> filter, + SkIPoint* offset, + SkIRect* subset, + const gfx::PointF& origin); +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_COMMON_SKIA_HELPER_H_
diff --git a/components/viz/host/renderer_settings_creation.cc b/components/viz/host/renderer_settings_creation.cc index e0b69bf..0a147ee 100644 --- a/components/viz/host/renderer_settings_creation.cc +++ b/components/viz/host/renderer_settings_creation.cc
@@ -59,6 +59,8 @@ !command_line->HasSwitch(switches::kDisableCompositedAntialiasing); renderer_settings.use_skia_renderer = command_line->HasSwitch(switches::kUseSkiaRenderer); + renderer_settings.use_skia_deferred_display_list = + command_line->HasSwitch(switches::kUseSkiaDeferredDisplayList); #if defined(OS_MACOSX) renderer_settings.allow_overlays = ui::RemoteLayerAPISupported() &&
diff --git a/components/viz/service/display/gl_renderer.cc b/components/viz/service/display/gl_renderer.cc index e6e852a..cfac540 100644 --- a/components/viz/service/display/gl_renderer.cc +++ b/components/viz/service/display/gl_renderer.cc
@@ -44,6 +44,7 @@ #include "components/viz/common/resources/resource_fence.h" #include "components/viz/common/resources/resource_format_utils.h" #include "components/viz/common/resources/resource_id.h" +#include "components/viz/common/skia_helper.h" #include "components/viz/service/display/draw_polygon.h" #include "components/viz/service/display/dynamic_geometry_binding.h" #include "components/viz/service/display/layer_quad.h" @@ -566,58 +567,6 @@ nullptr); } -static sk_sp<SkImage> ApplyImageFilter( - std::unique_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, - const gfx::RectF& src_rect, - const gfx::RectF& dst_rect, - const gfx::Vector2dF& scale, - sk_sp<SkImageFilter> filter, - GLuint texture_id, - GLenum target, - const gfx::Size& size, - SkIPoint* offset, - SkIRect* subset, - bool flip_texture, - const gfx::PointF& origin) { - if (!filter || !use_gr_context) - return nullptr; - - sk_sp<SkImage> src_image = WrapTexture( - texture_id, target, size, use_gr_context->context(), flip_texture); - - if (!src_image) { - TRACE_EVENT_INSTANT0("cc", - "ApplyImageFilter wrap background texture failed", - TRACE_EVENT_SCOPE_THREAD); - return nullptr; - } - - // Big filters can sometimes fallback to CPU. Therefore, we need - // to disable subnormal floats for performance and security reasons. - cc::ScopedSubnormalFloatDisabler disabler; - SkMatrix local_matrix; - local_matrix.setTranslate(origin.x(), origin.y()); - local_matrix.postScale(scale.x(), scale.y()); - local_matrix.postTranslate(-src_rect.x(), -src_rect.y()); - - SkIRect clip_bounds = gfx::RectFToSkRect(dst_rect).roundOut(); - clip_bounds.offset(-src_rect.x(), -src_rect.y()); - filter = filter->makeWithLocalMatrix(local_matrix); - SkIRect in_subset = SkIRect::MakeWH(src_rect.width(), src_rect.height()); - sk_sp<SkImage> image = src_image->makeWithFilter(filter.get(), in_subset, - clip_bounds, subset, offset); - - if (!image || !image->isTextureBacked()) { - return nullptr; - } - - // Force a flush of the Skia pipeline before we switch back to the compositor - // context. - image->getTextureHandle(true); - CHECK(image->isTextureBacked()); - return image; -} - static gfx::RectF CenteredRect(const gfx::Rect& tile_rect) { return gfx::RectF( gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), @@ -918,24 +867,6 @@ return image; } -// Map device space quad to local space. Device_transform has no 3d -// component since it was flattened, so we don't need to project. We should -// have already checked that the transform was uninvertible before this call. -gfx::QuadF MapQuadToLocalSpace(const gfx::Transform& device_transform, - const gfx::QuadF& device_quad) { - gfx::Transform inverse_device_transform(gfx::Transform::kSkipInitialization); - DCHECK(device_transform.IsInvertible()); - bool did_invert = device_transform.GetInverse(&inverse_device_transform); - DCHECK(did_invert); - bool clipped = false; - gfx::QuadF local_quad = - cc::MathUtil::MapQuad(inverse_device_transform, device_quad, &clipped); - // We should not DCHECK(!clipped) here, because anti-aliasing inflation may - // cause device_quad to become clipped. To our knowledge this scenario does - // not need to be handled differently than the unclipped case. - return local_quad; -} - const TileDrawQuad* GLRenderer::CanPassBeDrawnDirectly(const RenderPass* pass) { #if defined(OS_MACOSX) // On Macs, this path can sometimes lead to all black output. @@ -1208,8 +1139,12 @@ clip_rect = current_draw_rect_; } gfx::Transform transform = params->quad_to_target_transform; + if (!transform.IsInvertible()) { + return false; + } gfx::QuadF clip_quad = gfx::QuadF(gfx::RectF(clip_rect)); - gfx::QuadF local_clip = MapQuadToLocalSpace(transform, clip_quad); + gfx::QuadF local_clip = + cc::MathUtil::InverseMapQuadToLocalSpace(transform, clip_quad); params->dst_rect.Intersect(local_clip.BoundingBox()); // If we've been fully clipped out (by crop rect or clipping), there's // nothing to draw. @@ -1219,28 +1154,34 @@ SkIPoint offset; SkIRect subset; gfx::RectF src_rect(quad->rect); + auto use_gr_context = ScopedUseGrContext::Create(this); + if (!use_gr_context) + return false; + if (params->contents_texture) { params->contents_and_bypass_color_space = params->contents_texture->color_space(); - params->filter_image = ApplyImageFilter( - ScopedUseGrContext::Create(this), src_rect, params->dst_rect, - quad->filters_scale, std::move(filter), - params->contents_texture->id(), GL_TEXTURE_2D, - params->contents_texture->size(), &offset, &subset, - params->flip_texture, quad->filters_origin); + sk_sp<SkImage> src_image = + WrapTexture(params->contents_texture->id(), GL_TEXTURE_2D, + params->contents_texture->size(), + use_gr_context->context(), params->flip_texture); + params->filter_image = SkiaHelper::ApplyImageFilter( + src_image, src_rect, params->dst_rect, quad->filters_scale, + std::move(filter), &offset, &subset, quad->filters_origin); } else { cc::DisplayResourceProvider::ScopedReadLockGL prefilter_bypass_quad_texture_lock( resource_provider_, params->bypass_quad_texture.resource_id); params->contents_and_bypass_color_space = prefilter_bypass_quad_texture_lock.color_space(); - params->filter_image = ApplyImageFilter( - ScopedUseGrContext::Create(this), src_rect, params->dst_rect, - quad->filters_scale, std::move(filter), - prefilter_bypass_quad_texture_lock.texture_id(), - prefilter_bypass_quad_texture_lock.target(), - prefilter_bypass_quad_texture_lock.size(), &offset, &subset, - params->flip_texture, quad->filters_origin); + sk_sp<SkImage> src_image = + WrapTexture(prefilter_bypass_quad_texture_lock.texture_id(), + prefilter_bypass_quad_texture_lock.target(), + prefilter_bypass_quad_texture_lock.size(), + use_gr_context->context(), params->flip_texture); + params->filter_image = SkiaHelper::ApplyImageFilter( + src_image, src_rect, params->dst_rect, quad->filters_scale, + std::move(filter), &offset, &subset, quad->filters_origin); } if (!params->filter_image) @@ -1705,7 +1646,8 @@ quad); } - *local_quad = MapQuadToLocalSpace(device_transform, device_quad); + *local_quad = + cc::MathUtil::InverseMapQuadToLocalSpace(device_transform, device_quad); } // static @@ -1745,7 +1687,8 @@ device_quad = device_layer_edges.ToQuadF(); } - *local_quad = MapQuadToLocalSpace(device_transform, device_quad); + *local_quad = + cc::MathUtil::InverseMapQuadToLocalSpace(device_transform, device_quad); } void GLRenderer::DrawSolidColorQuad(const SolidColorDrawQuad* quad,
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc index f8b55e5..4efa8ea 100644 --- a/components/viz/service/display/skia_renderer.cc +++ b/components/viz/service/display/skia_renderer.cc
@@ -9,6 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/trace_event/trace_event.h" #include "cc/base/math_util.h" +#include "cc/paint/render_surface_filters.h" #include "components/viz/common/display/renderer_settings.h" #include "components/viz/common/frame_sinks/copy_output_request.h" #include "components/viz/common/quads/debug_border_draw_quad.h" @@ -20,6 +21,7 @@ #include "components/viz/common/resources/platform_color.h" #include "components/viz/common/resources/resource_fence.h" #include "components/viz/common/resources/resource_format_utils.h" +#include "components/viz/common/skia_helper.h" #include "components/viz/service/display/output_surface.h" #include "components/viz/service/display/output_surface_frame.h" #include "components/viz/service/display/renderer_utils.h" @@ -28,15 +30,12 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColorSpaceXformCanvas.h" -#include "third_party/skia/include/core/SkImageFilter.h" #include "third_party/skia/include/core/SkMatrix.h" #include "third_party/skia/include/core/SkOverdrawCanvas.h" #include "third_party/skia/include/core/SkPath.h" -#include "third_party/skia/include/core/SkPoint.h" #include "third_party/skia/include/core/SkShader.h" #include "third_party/skia/include/effects/SkOverdrawColorFilter.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" -#include "third_party/skia/include/gpu/GrContext.h" #include "ui/gfx/geometry/axis_transform2d.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/skia_util.h" @@ -54,6 +53,20 @@ #endif namespace viz { +// Parameters needed to draw a RenderPassDrawQuad. +struct DrawRenderPassDrawQuadParams { + // The "in" parameters that will be used when apply filters. + const cc::FilterOperations* filters = nullptr; + const cc::FilterOperations* background_filters = nullptr; + + // The "out" parameters that will be returned for future use. + // A Skia image that should be sampled from instead of the original + // contents. + sk_sp<SkImage> filter_image; + gfx::Point src_offset; + gfx::RectF dst_rect; + gfx::RectF tex_coord_rect; +}; SkiaRenderer::SkiaRenderer(const RendererSettings* settings, OutputSurface* output_surface, @@ -204,9 +217,8 @@ gr_context, render_target, kTopLeft_GrSurfaceOrigin, nullptr, &surface_props); #else - // TODO(weiliangc): Set up correct can_use_lcd_text and - // use_distance_field_text for SkSurfaceProps flags. How to setup is in - // ResourceProvider. (crbug.com/644851) + // TODO(weiliangc): Set up correct can_use_lcd_text for SkSurfaceProps flags. + // How to setup is in ResourceProvider. (http://crbug.com/644851) GrContext* gr_context = output_surface_->context_provider()->GrContext(); if (!root_canvas_ || root_canvas_->getGrContext() != gr_context || @@ -553,6 +565,73 @@ ¤t_paint_); } +bool SkiaRenderer::CalculateRPDQParams(sk_sp<SkImage> content, + const RenderPassDrawQuad* quad, + DrawRenderPassDrawQuadParams* params) { + auto iter = render_pass_backings_.find(quad->render_pass_id); + DCHECK(render_pass_backings_.end() != iter); + if (params->filters == nullptr) { + return true; + } + + // This function is called after AllocateRenderPassResourceIfNeeded, so there + // should be backing ready. + RenderPassBacking& content_texture = iter->second; + DCHECK(!params->filters->IsEmpty()); + gfx::Size size(content_texture.render_pass_surface->width(), + content_texture.render_pass_surface->height()); + auto paint_filter = cc::RenderSurfaceFilters::BuildImageFilter( + *params->filters, gfx::SizeF(size)); + auto filter = paint_filter ? paint_filter->cached_sk_filter_ : nullptr; + + // Apply filters to the content texture. + // TODO(xing.xu): Support SkColorFilter here. (https://crbug.com/823182) + + if (filter) { + gfx::Rect clip_rect = quad->shared_quad_state->clip_rect; + if (clip_rect.IsEmpty()) { + clip_rect = current_draw_rect_; + } + gfx::Transform transform = + quad->shared_quad_state->quad_to_target_transform; + gfx::QuadF clip_quad = gfx::QuadF(gfx::RectF(clip_rect)); + gfx::QuadF local_clip = + cc::MathUtil::InverseMapQuadToLocalSpace(transform, clip_quad); + + SkMatrix local_matrix; + local_matrix.setTranslate(quad->filters_origin.x(), + quad->filters_origin.y()); + local_matrix.postScale(quad->filters_scale.x(), quad->filters_scale.y()); + gfx::RectF dst_rect(params->filters + ? params->filters->MapRect(quad->rect, local_matrix) + : quad->rect); + + dst_rect.Intersect(local_clip.BoundingBox()); + // If we've been fully clipped out (by crop rect or clipping), there's + // nothing to draw. + if (dst_rect.IsEmpty()) { + return false; + } + SkIPoint offset; + SkIRect subset; + gfx::RectF src_rect(quad->rect); + // TODO(xing.xu): Support flip_texture. (https://crbug.com/822859) + params->filter_image = SkiaHelper::ApplyImageFilter( + content, src_rect, dst_rect, quad->filters_scale, std::move(filter), + &offset, &subset, quad->filters_origin); + if (!params->filter_image) + return false; + params->dst_rect = + gfx::RectF(src_rect.x() + offset.fX, src_rect.y() + offset.fY, + subset.width(), subset.height()); + params->src_offset.SetPoint(subset.x(), subset.y()); + gfx::RectF tex_rect = + gfx::RectF(gfx::PointF(params->src_offset), params->dst_rect.size()); + params->tex_coord_rect = tex_rect; + } + return true; +} + void SkiaRenderer::DrawRenderPassQuad(const RenderPassDrawQuad* quad) { auto iter = render_pass_backings_.find(quad->render_pass_id); DCHECK(render_pass_backings_.end() != iter); @@ -563,23 +642,31 @@ sk_sp<SkImage> content = content_texture.render_pass_surface->makeImageSnapshot(); - SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect()); - SkRect dest_visible_rect = - gfx::RectFToSkRect(cc::MathUtil::ScaleRectProportional( - QuadVertexRect(), gfx::RectF(quad->rect), - gfx::RectF(quad->visible_rect))); - SkRect content_rect = RectFToSkRect(quad->tex_coord_rect); + DrawRenderPassDrawQuadParams params; + params.filters = FiltersForPass(quad->render_pass_id); + params.background_filters = BackgroundFiltersForPass(quad->render_pass_id); + bool can_draw = CalculateRPDQParams(content, quad, ¶ms); + if (!can_draw) + return; + + SkRect content_rect; + SkRect dest_visible_rect; + if (params.filter_image) { + content_rect = RectFToSkRect(params.tex_coord_rect); + dest_visible_rect = gfx::RectFToSkRect(cc::MathUtil::ScaleRectProportional( + QuadVertexRect(), gfx::RectF(quad->rect), gfx::RectF(params.dst_rect))); + content = params.filter_image; + } else { + content_rect = RectFToSkRect(quad->tex_coord_rect); + dest_visible_rect = gfx::RectFToSkRect(cc::MathUtil::ScaleRectProportional( + QuadVertexRect(), gfx::RectF(quad->rect), + gfx::RectF(quad->visible_rect))); + } current_canvas_->drawImageRect(content, content_rect, dest_visible_rect, ¤t_paint_); - const cc::FilterOperations* filters = FiltersForPass(quad->render_pass_id); - - // TODO(weiliangc): Implement filters. (crbug.com/644851) - if (filters) { - NOTIMPLEMENTED(); - } - + SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect()); SkMatrix content_mat; content_mat.setRectToRect(content_rect, dest_rect, SkMatrix::kFill_ScaleToFit); @@ -588,16 +675,17 @@ shader = content->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &content_mat); - // TODO(weiliangc): Implement mask. (crbug.com/644851) + // TODO(weiliangc): Implement mask. (https://crbug.com/644851) if (quad->mask_resource_id()) { NOTIMPLEMENTED(); } - // TODO(weiliangc): If we have a background filter shader, render its results - // first. (crbug.com/644851) - - current_paint_.setShader(std::move(shader)); - current_canvas_->drawRect(dest_visible_rect, current_paint_); + // TODO(weiliangc): If we have a background filter shader, render its + // results first. (https://crbug.com/644851) + if (ShouldApplyBackgroundFilters(quad, params.background_filters)) { + current_paint_.setShader(std::move(shader)); + current_canvas_->drawRect(dest_visible_rect, current_paint_); + } } void SkiaRenderer::DrawUnsupportedQuad(const DrawQuad* quad) { @@ -653,18 +741,6 @@ return true; } -// If non-null, auto_bounds will be filled with the automatically-computed -// destination bounds. If null, the output will be the same size as the -// input bitmap. -sk_sp<SkImage> SkiaRenderer::ApplyImageFilter(SkImageFilter* filter, - const RenderPassDrawQuad* quad, - const SkBitmap& to_filter, - SkIRect* auto_bounds) const { - // TODO(weiliangc): Implement image filter. (crbug.com/644851) - NOTIMPLEMENTED(); - return nullptr; -} - SkBitmap SkiaRenderer::GetBackdropBitmap(const gfx::Rect& bounding_rect) const { SkBitmap bitmap; bitmap.allocPixels(SkImageInfo::MakeN32Premul(bounding_rect.width(),
diff --git a/components/viz/service/display/skia_renderer.h b/components/viz/service/display/skia_renderer.h index 3bdc6a9b..b330c57 100644 --- a/components/viz/service/display/skia_renderer.h +++ b/components/viz/service/display/skia_renderer.h
@@ -26,6 +26,7 @@ class SolidColorDrawQuad; class TextureDrawQuad; class TileDrawQuad; +struct DrawRenderPassDrawQuadParams; class VIZ_SERVICE_EXPORT SkiaRenderer : public DirectRenderer { public: @@ -83,13 +84,13 @@ void DrawTextureQuad(const TextureDrawQuad* quad); void DrawTileQuad(const TileDrawQuad* quad); void DrawUnsupportedQuad(const DrawQuad* quad); + bool CalculateRPDQParams(sk_sp<SkImage> src_image, + const RenderPassDrawQuad* quad, + DrawRenderPassDrawQuadParams* params); + bool ShouldApplyBackgroundFilters( const RenderPassDrawQuad* quad, const cc::FilterOperations* background_filters) const; - sk_sp<SkImage> ApplyImageFilter(SkImageFilter* filter, - const RenderPassDrawQuad* quad, - const SkBitmap& to_filter, - SkIRect* auto_bounds) const; gfx::Rect GetBackdropBoundingBoxForRenderPassQuad( const RenderPassDrawQuad* quad, const gfx::Transform& contents_device_transform,
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc index 9045cbe..a95bdf3c8 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -53,16 +53,11 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); video_capturers_.clear(); - // Delete any remaining owned CompositorFrameSinks. - sink_map_.clear(); - - // All BeginFrameSources should be deleted before FrameSinkManagerImpl - // destruction. + // All mojom::CompositorFrameSinks and BeginFrameSources should be deleted by + // this point. + DCHECK(sink_map_.empty()); DCHECK(registered_sources_.empty()); - // TODO(kylechar): Enforce that all CompositorFrameSinks are destroyed before - // ~FrameSinkManagerImpl() runs. - surface_manager_.RemoveObserver(this); surface_manager_.RemoveObserver(&hit_test_manager_); }
diff --git a/components/viz/test/test_context_provider.cc b/components/viz/test/test_context_provider.cc index 23f9466..0879486 100644 --- a/components/viz/test/test_context_provider.cc +++ b/components/viz/test/test_context_provider.cc
@@ -269,7 +269,7 @@ skia_bindings::GrContextForGLES2Interface::DefaultCacheLimitsForTests( &max_resource_cache_bytes, &max_glyph_cache_texture_bytes); gr_context_ = std::make_unique<skia_bindings::GrContextForGLES2Interface>( - context_gl_.get(), support_.get(), context3d_->test_capabilities(), + context_gl_.get(), context3d_->test_capabilities(), max_resource_cache_bytes, max_glyph_cache_texture_bytes); cache_controller_->SetGrContext(gr_context_->get()); @@ -285,6 +285,14 @@ return cache_controller_.get(); } +void TestContextProvider::InvalidateGrContext(uint32_t state) { + DCHECK(bound_); + CheckValidThreadOrLockAcquired(); + + if (gr_context_) + gr_context_->get()->resetContext(state); +} + base::Lock* TestContextProvider::GetLock() { if (!support_locking_) return nullptr;
diff --git a/components/viz/test/test_context_provider.h b/components/viz/test/test_context_provider.h index e2566f8..c2c395a 100644 --- a/components/viz/test/test_context_provider.h +++ b/components/viz/test/test_context_provider.h
@@ -62,6 +62,7 @@ gpu::ContextSupport* ContextSupport() override; class GrContext* GrContext() override; ContextCacheController* CacheController() override; + void InvalidateGrContext(uint32_t state) override; base::Lock* GetLock() override; void AddObserver(ContextLostObserver* obs) override; void RemoveObserver(ContextLostObserver* obs) override;
diff --git a/components/viz/test/test_context_support.cc b/components/viz/test/test_context_support.cc index 311409d0..2d525c94 100644 --- a/components/viz/test/test_context_support.cc +++ b/components/viz/test/test_context_support.cc
@@ -141,14 +141,4 @@ return 0; } -bool TestContextSupport::HasGrContextSupport() const { - return true; -} - -void TestContextSupport::SetGrContext(GrContext* gr) {} - -void TestContextSupport::WillCallGLFromSkia() {} - -void TestContextSupport::DidCallGLFromSkia() {} - } // namespace viz
diff --git a/components/viz/test/test_context_support.h b/components/viz/test/test_context_support.h index 922ca423..3dcd97d 100644 --- a/components/viz/test/test_context_support.h +++ b/components/viz/test/test_context_support.h
@@ -64,10 +64,6 @@ void DeleteTransferCacheEntry(uint32_t entry_type, uint32_t entry_id) override; unsigned int GetTransferBufferFreeSize() const override; - bool HasGrContextSupport() const override; - void SetGrContext(GrContext* gr) override; - void WillCallGLFromSkia() override; - void DidCallGLFromSkia() override; void CallAllSyncPointCallbacks();
diff --git a/components/viz/test/viz_test_suite.cc b/components/viz/test/viz_test_suite.cc index 63868d65..1b5de9e 100644 --- a/components/viz/test/viz_test_suite.cc +++ b/components/viz/test/viz_test_suite.cc
@@ -23,8 +23,7 @@ message_loop_ = std::make_unique<base::MessageLoop>(); - base::ThreadIdNameManager::GetInstance()->SetName( - base::PlatformThread::CurrentId(), "Main"); + base::ThreadIdNameManager::GetInstance()->SetName("Main"); base::DiscardableMemoryAllocator::SetInstance(&discardable_memory_allocator_); }
diff --git a/components/zucchini/main_utils.cc b/components/zucchini/main_utils.cc index 3a7055a..7a283881 100644 --- a/components/zucchini/main_utils.cc +++ b/components/zucchini/main_utils.cc
@@ -63,8 +63,10 @@ /******** List of Zucchini commands ********/ constexpr Command kCommands[] = { - {"gen", "-gen <old_file> <new_file> <patch_file> [-raw]", 3, &MainGen}, - {"apply", "-apply <old_file> <patch_file> <new_file>", 3, &MainApply}, + {"gen", "-gen <old_file> <new_file> <patch_file> [-raw] [-keep]", 3, + &MainGen}, + {"apply", "-apply <old_file> <patch_file> <new_file> [-keep]", 3, + &MainApply}, {"read", "-read <exe> [-dump]", 1, &MainRead}, {"detect", "-detect <archive_file> [-dd=format#]", 1, &MainDetect}, {"match", "-match <old_file> <new_file>", 2, &MainMatch},
diff --git a/components/zucchini/zucchini_commands.cc b/components/zucchini/zucchini_commands.cc index 53b5bd7..2d4b1564 100644 --- a/components/zucchini/zucchini_commands.cc +++ b/components/zucchini/zucchini_commands.cc
@@ -29,6 +29,7 @@ /******** Command-line Switches ********/ constexpr char kSwitchDump[] = "dump"; +constexpr char kSwitchKeep[] = "keep"; constexpr char kSwitchRaw[] = "raw"; } // namespace @@ -79,6 +80,9 @@ return zucchini::status::kStatusFileWriteError; } + if (params.command_line.HasSwitch(kSwitchKeep)) + patch.Keep(); + if (!patch_writer.SerializeInto(patch.region())) return zucchini::status::kStatusPatchWriteError; @@ -91,7 +95,8 @@ zucchini::status::Code MainApply(MainParams params) { CHECK_EQ(3U, params.file_paths.size()); return zucchini::Apply(params.file_paths[0], params.file_paths[1], - params.file_paths[2]); + params.file_paths[2], + params.command_line.HasSwitch(kSwitchKeep)); } zucchini::status::Code MainRead(MainParams params) {
diff --git a/components/zucchini/zucchini_integration.cc b/components/zucchini/zucchini_integration.cc index 2d78fdd..1149658 100644 --- a/components/zucchini/zucchini_integration.cc +++ b/components/zucchini/zucchini_integration.cc
@@ -42,7 +42,8 @@ status::Code ApplyCommon(base::File&& old_file_handle, base::File&& patch_file_handle, base::File&& new_file_handle, - const FileNames& names) { + const FileNames& names, + bool force_keep) { MappedFileReader patch_file(std::move(patch_file_handle)); if (patch_file.HasError()) { LOG(ERROR) << "Error with file " << names.patch_name.value() << ": " @@ -63,10 +64,6 @@ << old_file.error(); return status::kStatusFileReadError; } - if (!patch_reader->CheckOldFile(old_file.region())) { - LOG(ERROR) << "Invalid old_file."; - return status::kStatusInvalidOldImage; - } zucchini::PatchHeader header = patch_reader->header(); // By default, delete output on destruction, to avoid having lingering files @@ -83,6 +80,9 @@ return status::kStatusFileWriteError; } + if (force_keep) + new_file.Keep(); + zucchini::status::Code result = zucchini::Apply(old_file.region(), *patch_reader, new_file.region()); if (result != status::kStatusSuccess) { @@ -100,15 +100,17 @@ status::Code Apply(base::File&& old_file_handle, base::File&& patch_file_handle, - base::File&& new_file_handle) { + base::File&& new_file_handle, + bool force_keep) { const FileNames file_names; return ApplyCommon(std::move(old_file_handle), std::move(patch_file_handle), - std::move(new_file_handle), file_names); + std::move(new_file_handle), file_names, force_keep); } status::Code Apply(const base::FilePath& old_path, const base::FilePath& patch_path, - const base::FilePath& new_path) { + const base::FilePath& new_path, + bool force_keep) { using base::File; File old_file(old_path, File::FLAG_OPEN | File::FLAG_READ); File patch_file(patch_path, File::FLAG_OPEN | File::FLAG_READ); @@ -117,7 +119,7 @@ File::FLAG_CAN_DELETE_ON_CLOSE); const FileNames file_names(old_path, patch_path, new_path); return ApplyCommon(std::move(old_file), std::move(patch_file), - std::move(new_file), file_names); + std::move(new_file), file_names, force_keep); } } // namespace zucchini
diff --git a/components/zucchini/zucchini_integration.h b/components/zucchini/zucchini_integration.h index 7c3fc40..ce98b281 100644 --- a/components/zucchini/zucchini_integration.h +++ b/components/zucchini/zucchini_integration.h
@@ -13,21 +13,24 @@ // Applies the patch in |patch_file| to the bytes in |old_file| and writes the // result to |new_file|. Since this uses memory mapped files, crashes are -// expected in case of I/O errors. On Windows |new_file| is kept iff returned -// code is kStatusSuccess, and is deleted otherwise. For UNIX systems the -// caller needs to do cleanup since it has ownership of the base::File params -// and Zucchini has no knowledge of which base::FilePath to delete. +// expected in case of I/O errors. On Windows, |new_file| is kept iff returned +// code is kStatusSuccess or if |force_keep == true|, and is deleted otherwise. +// For UNIX systems the caller needs to do cleanup since it has ownership of the +// base::File params and Zucchini has no knowledge of which base::FilePath to +// delete. status::Code Apply(base::File&& old_file, base::File&& patch_file, - base::File&& new_file); + base::File&& new_file, + bool force_keep = false); // Applies the patch in |patch_path| to the bytes in |old_path| and writes the // result to |new_path|. Since this uses memory mapped files, crashes are // expected in case of I/O errors. |new_path| is kept iff returned code is -// kStatusSuccess, and is deleted otherwise. +// kStatusSuccess or if |force_keep == true|, and is deleted otherwise. status::Code Apply(const base::FilePath& old_path, const base::FilePath& patch_path, - const base::FilePath& new_path); + const base::FilePath& new_path, + bool force_keep = false); } // namespace zucchini
diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h index cd64f60b5..f1bf1cb 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.h +++ b/content/browser/browser_plugin/browser_plugin_guest.h
@@ -318,7 +318,8 @@ // fewer GPU and CPU resources. // // When every WebContents in a RenderProcessHost is hidden, it will lower - // the priority of the process (see RenderProcessHostImpl::WidgetHidden). + // the priority of the process (see + // RenderProcessHostImpl::UpdateClientPriority). // // It will also send a message to the guest renderer process to cleanup // resources such as dropping back buffers and adjusting memory limits (if in
diff --git a/content/browser/browser_thread_impl.cc b/content/browser/browser_thread_impl.cc index 183fbef..c679f3f 100644 --- a/content/browser/browser_thread_impl.cc +++ b/content/browser/browser_thread_impl.cc
@@ -127,6 +127,12 @@ if (!target_thread_outlives_current) globals.lock.Acquire(); + // Posting tasks before BrowserThreads are initialized is incorrect as it + // would silently no-op. If you need to support posting early, gate it on + // BrowserThread::IsThreadInitialized(). If you hit this in unittests, you + // most likely posted a task outside the scope of a TestBrowserThreadBundle. + DCHECK_GE(globals.states[identifier], BrowserThreadState::RUNNING); + const bool accepting_tasks = globals.states[identifier] == BrowserThreadState::RUNNING; if (accepting_tasks) {
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index c04c556..d58fcaf 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -394,11 +394,10 @@ bool support_locking = true; bool support_gles2_interface = false; bool support_raster_interface = true; - bool support_grcontext = false; shared_worker_context_provider_ = CreateContextCommon( gpu_channel_host, gpu::kNullSurfaceHandle, need_alpha_channel, false /* support_stencil */, support_locking, support_gles2_interface, - support_raster_interface, support_grcontext, + support_raster_interface, ui::command_buffer_metrics::BROWSER_WORKER_CONTEXT); auto result = shared_worker_context_provider_->BindToCurrentThread(); if (result != gpu::ContextResult::kSuccess) { @@ -421,11 +420,10 @@ bool support_locking = false; bool support_gles2_interface = true; bool support_raster_interface = false; - bool support_grcontext = true; context_provider = CreateContextCommon( std::move(gpu_channel_host), surface_handle, need_alpha_channel, support_stencil, support_locking, support_gles2_interface, - support_raster_interface, support_grcontext, + support_raster_interface, ui::command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT); // On Mac, GpuCommandBufferMsg_SwapBuffersCompleted must be handled in // a nested run loop during resize. @@ -970,11 +968,9 @@ bool support_locking = false; bool support_gles2_interface = true; bool support_raster_interface = false; - bool support_grcontext = true; shared_main_thread_contexts_ = CreateContextCommon( std::move(gpu_channel_host), gpu::kNullSurfaceHandle, need_alpha_channel, false, support_locking, support_gles2_interface, support_raster_interface, - support_grcontext, ui::command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT); shared_main_thread_contexts_->AddObserver(this); auto result = shared_main_thread_contexts_->BindToCurrentThread(); @@ -1063,7 +1059,6 @@ bool support_locking, bool support_gles2_interface, bool support_raster_interface, - bool support_grcontext, ui::command_buffer_metrics::ContextType type) { DCHECK(gpu_channel_host); DCHECK(!is_gpu_compositing_disabled_); @@ -1104,8 +1099,7 @@ return base::MakeRefCounted<ui::ContextProviderCommandBuffer>( std::move(gpu_channel_host), GetGpuMemoryBufferManager(), stream_id, stream_priority, surface_handle, url, automatic_flushes, support_locking, - support_grcontext, gpu::SharedMemoryLimits(), attributes, - nullptr /* share_context */, type); + gpu::SharedMemoryLimits(), attributes, nullptr /* share_context */, type); } } // namespace content
diff --git a/content/browser/compositor/gpu_process_transport_factory.h b/content/browser/compositor/gpu_process_transport_factory.h index bc7e7750..0e6713c 100644 --- a/content/browser/compositor/gpu_process_transport_factory.h +++ b/content/browser/compositor/gpu_process_transport_factory.h
@@ -139,7 +139,6 @@ bool support_locking, bool support_gles2_interface, bool support_raster_interface, - bool support_grcontext, ui::command_buffer_metrics::ContextType type); viz::FrameSinkIdAllocator frame_sink_id_allocator_;
diff --git a/content/browser/compositor/viz_process_transport_factory.cc b/content/browser/compositor/viz_process_transport_factory.cc index 0bf9569a..e16db96 100644 --- a/content/browser/compositor/viz_process_transport_factory.cc +++ b/content/browser/compositor/viz_process_transport_factory.cc
@@ -49,7 +49,6 @@ bool support_locking, bool support_gles2_interface, bool support_raster_interface, - bool support_grcontext, ui::command_buffer_metrics::ContextType type) { constexpr bool kAutomaticFlushes = false; @@ -69,7 +68,7 @@ return base::MakeRefCounted<ui::ContextProviderCommandBuffer>( std::move(gpu_channel_host), gpu_memory_buffer_manager, kGpuStreamIdDefault, kGpuStreamPriorityUI, gpu::kNullSurfaceHandle, - std::move(url), kAutomaticFlushes, support_locking, support_grcontext, + std::move(url), kAutomaticFlushes, support_locking, gpu::SharedMemoryLimits(), attributes, nullptr /* share_context */, type); } @@ -520,11 +519,9 @@ constexpr bool kSharedWorkerContextSupportsLocking = true; constexpr bool kSharedWorkerContextSupportsGLES2 = false; constexpr bool kSharedWorkerContextSupportsRaster = true; - constexpr bool kSharedWorkerContextSupportsGrContext = false; constexpr bool kCompositorContextSupportsLocking = false; constexpr bool kCompositorContextSupportsGLES2 = true; constexpr bool kCompositorContextSupportsRaster = false; - constexpr bool kCompositorContextSupportsGrContext = true; if (main_context_provider_ && IsContextLost(main_context_provider_.get())) { main_context_provider_->RemoveObserver(this); @@ -540,7 +537,6 @@ gpu_channel_host, GetGpuMemoryBufferManager(), kSharedWorkerContextSupportsLocking, kSharedWorkerContextSupportsGLES2, kSharedWorkerContextSupportsRaster, - kSharedWorkerContextSupportsGrContext, ui::command_buffer_metrics::BROWSER_WORKER_CONTEXT); // Don't observer context loss on |worker_context_provider_| here, that is @@ -557,7 +553,7 @@ main_context_provider_ = CreateContextProviderImpl( std::move(gpu_channel_host), GetGpuMemoryBufferManager(), kCompositorContextSupportsLocking, kCompositorContextSupportsGLES2, - kCompositorContextSupportsRaster, kCompositorContextSupportsGrContext, + kCompositorContextSupportsRaster, ui::command_buffer_metrics::UI_COMPOSITOR_CONTEXT); main_context_provider_->SetDefaultTaskRunner(resize_task_runner_); main_context_provider_->AddObserver(this);
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index eb3fa27..7b509ff 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1903,11 +1903,11 @@ ClearAllWebUI(); // If this is a main frame RFH that's about to be deleted, update its RVH's - // swapped-out state here. https://crbug.com/505887 - if (frame_tree_node_->IsMainFrame()) { - render_view_host_->set_is_active(false); + // swapped-out state here. https://crbug.com/505887. This should only be + // done if the RVH hasn't been already reused and marked as active by another + // navigation. See https://crbug.com/823567. + if (frame_tree_node_->IsMainFrame() && !render_view_host_->is_active()) render_view_host_->set_is_swapped_out(true); - } bool deleted = frame_tree_node_->render_manager()->DeleteFromPendingList(this); @@ -4402,7 +4402,7 @@ if (!registry_ || !registry_->TryBindInterface(interface_name, &interface_pipe)) { delegate_->OnInterfaceRequest(this, interface_name, &interface_pipe); - if (interface_pipe->is_valid() && + if (interface_pipe.is_valid() && !TryBindFrameInterface(interface_name, &interface_pipe, this)) { GetContentClient()->browser()->BindInterfaceRequestFromFrame( this, interface_name, std::move(interface_pipe));
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 604dd2d..8e80d51 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -756,6 +756,8 @@ FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, RenderViewHostIsNotReusedAfterDelayedSwapOutACK); FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, + RenderViewHostStaysActiveWithLateSwapoutACK); + FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, LoadEventForwardingWhilePendingDeletion); FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, ContextMenuAfterCrossProcessNavigation);
diff --git a/content/browser/gpu/gpu_ipc_browsertests.cc b/content/browser/gpu/gpu_ipc_browsertests.cc index 420922d..e1ec69f 100644 --- a/content/browser/gpu/gpu_ipc_browsertests.cc +++ b/content/browser/gpu/gpu_ipc_browsertests.cc
@@ -42,12 +42,11 @@ attributes.bind_generates_resource = false; constexpr bool automatic_flushes = false; constexpr bool support_locking = false; - constexpr bool support_grcontext = true; return base::MakeRefCounted<ui::ContextProviderCommandBuffer>( std::move(gpu_channel_host), factory->GetGpuMemoryBufferManager(), content::kGpuStreamIdDefault, content::kGpuStreamPriorityDefault, gpu::kNullSurfaceHandle, GURL(), automatic_flushes, support_locking, - support_grcontext, gpu::SharedMemoryLimits(), attributes, nullptr, + gpu::SharedMemoryLimits(), attributes, nullptr, ui::command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_TESTING); }
diff --git a/content/browser/loader/url_loader_factory_impl_unittest.cc b/content/browser/loader/url_loader_factory_impl_unittest.cc index f40bbfd5..05dcb5d 100644 --- a/content/browser/loader/url_loader_factory_impl_unittest.cc +++ b/content/browser/loader/url_loader_factory_impl_unittest.cc
@@ -82,9 +82,7 @@ class URLLoaderFactoryImplTest : public ::testing::TestWithParam<size_t> { public: URLLoaderFactoryImplTest() - : thread_bundle_( - new TestBrowserThreadBundle(TestBrowserThreadBundle::IO_MAINLOOP)), - browser_context_(new TestBrowserContext()), + : browser_context_(new TestBrowserContext()), resource_message_filter_(new ResourceMessageFilter( kChildId, nullptr, @@ -125,7 +123,6 @@ base::RunLoop().RunUntilIdle(); MojoAsyncResourceHandler::SetAllocationSizeForTesting( MojoAsyncResourceHandler::kDefaultAllocationSize); - thread_bundle_.reset(nullptr); } void GetContexts(ResourceType resource_type, @@ -136,7 +133,9 @@ browser_context_->GetResourceContext()->GetRequestContext(); } - std::unique_ptr<TestBrowserThreadBundle> thread_bundle_; + // Must outlive all members below. + TestBrowserThreadBundle thread_bundle_{TestBrowserThreadBundle::IO_MAINLOOP}; + LoaderDelegateImpl loader_deleate_; ResourceDispatcherHostImpl rdh_; std::unique_ptr<TestBrowserContext> browser_context_;
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc index 50f3cb7..ad11272 100644 --- a/content/browser/media/capture/desktop_capture_device.cc +++ b/content/browser/media/capture/desktop_capture_device.cc
@@ -246,10 +246,14 @@ DCHECK(!wake_lock_); // Gets a service_manager::Connector first, then request a wake lock. - BrowserThread::PostTaskAndReplyWithResult( - BrowserThread::UI, FROM_HERE, base::BindOnce(&GetServiceConnector), - base::BindOnce(&DesktopCaptureDevice::Core::RequestWakeLock, - weak_factory_.GetWeakPtr())); + // TODO(https://crbug.com/823869): Fix DesktopCaptureDeviceTest and remove + // this conditional. + if (BrowserThread::IsThreadInitialized(BrowserThread::UI)) { + BrowserThread::PostTaskAndReplyWithResult( + BrowserThread::UI, FROM_HERE, base::BindOnce(&GetServiceConnector), + base::BindOnce(&DesktopCaptureDevice::Core::RequestWakeLock, + weak_factory_.GetWeakPtr())); + } desktop_capturer_->Start(this); // Assume it will be always started successfully for now.
diff --git a/content/browser/media/capture/desktop_capture_device_unittest.cc b/content/browser/media/capture/desktop_capture_device_unittest.cc index 3ca88ac..cc74e1e7 100644 --- a/content/browser/media/capture/desktop_capture_device_unittest.cc +++ b/content/browser/media/capture/desktop_capture_device_unittest.cc
@@ -19,7 +19,6 @@ #include "base/test/test_timeouts.h" #include "base/time/tick_clock.h" #include "base/time/time.h" -#include "content/public/test/test_browser_thread_bundle.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
diff --git a/content/browser/net/network_quality_observer_impl_unittest.cc b/content/browser/net/network_quality_observer_impl_unittest.cc index 1112635..19e9d677 100644 --- a/content/browser/net/network_quality_observer_impl_unittest.cc +++ b/content/browser/net/network_quality_observer_impl_unittest.cc
@@ -4,10 +4,10 @@ #include "content/browser/net/network_quality_observer_impl.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/test/histogram_tester.h" #include "base/time/time.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "net/nqe/effective_connection_type.h" #include "net/nqe/network_quality_estimator_test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -16,7 +16,8 @@ namespace { TEST(NetworkQualityObserverImplTest, TestObserverNotified) { - base::MessageLoopForIO message_loop; + content::TestBrowserThreadBundle thread_bundle( + content::TestBrowserThreadBundle::Options::IO_MAINLOOP); net::TestNetworkQualityEstimator estimator; estimator.SetStartTimeNullHttpRtt(base::TimeDelta::FromMilliseconds(1)); @@ -45,4 +46,4 @@ } } // namespace -} // namespace content \ No newline at end of file +} // namespace content
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc index aaf25773..6026c43f 100644 --- a/content/browser/renderer_host/compositor_impl_android.cc +++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -234,15 +234,14 @@ constexpr bool automatic_flushes = false; constexpr bool support_locking = false; - constexpr bool support_grcontext = false; auto context_provider = base::MakeRefCounted<ui::ContextProviderCommandBuffer>( std::move(gpu_channel_host), factory->GetGpuMemoryBufferManager(), stream_id, stream_priority, handle, GURL(std::string("chrome://gpu/Compositor::CreateContextProvider")), - automatic_flushes, support_locking, support_grcontext, - shared_memory_limits, attributes, nullptr /* shared_context */, + automatic_flushes, support_locking, shared_memory_limits, attributes, + nullptr /* shared_context */, ui::command_buffer_metrics::CONTEXT_TYPE_UNKNOWN); callback.Run(std::move(context_provider)); } @@ -797,7 +796,6 @@ constexpr bool support_locking = false; constexpr bool automatic_flushes = false; - constexpr bool support_grcontext = true; display_color_space_ = display::Screen::GetScreen() ->GetDisplayNearestWindow(root_window_) .color_space(); @@ -809,7 +807,7 @@ stream_id, stream_priority, surface_handle_, GURL(std::string("chrome://gpu/CompositorImpl::") + std::string("CompositorContextProvider")), - automatic_flushes, support_locking, support_grcontext, + automatic_flushes, support_locking, GetCompositorContextSharedMemoryLimits(root_window_), GetCompositorContextAttributes(display_color_space_, requires_alpha_channel_),
diff --git a/content/browser/renderer_host/direct_manipulation_browsertest.cc b/content/browser/renderer_host/direct_manipulation_browsertest.cc index 7c8a4e7..c5b259564 100644 --- a/content/browser/renderer_host/direct_manipulation_browsertest.cc +++ b/content/browser/renderer_host/direct_manipulation_browsertest.cc
@@ -163,6 +163,7 @@ ui::MouseWheelEvent* wheel_event = event->AsMouseWheelEvent(); EXPECT_EQ(1, wheel_event->x_offset()); EXPECT_EQ(2, wheel_event->y_offset()); + EXPECT_TRUE(wheel_event->flags() & ui::EF_PRECISION_SCROLLING_DELTA); } {
diff --git a/content/browser/renderer_host/input/input_router_impl.h b/content/browser/renderer_host/input/input_router_impl.h index 5b62b9a..a7da333 100644 --- a/content/browser/renderer_host/input/input_router_impl.h +++ b/content/browser/renderer_host/input/input_router_impl.h
@@ -38,6 +38,8 @@ class InputDispositionHandler; +class MockRenderWidgetHost; + class CONTENT_EXPORT InputRouterImplClient : public InputRouterClient { public: virtual mojom::WidgetInputHandler* GetWidgetInputHandler() = 0; @@ -102,6 +104,7 @@ private: friend class InputRouterImplTest; + friend class MockRenderWidgetHost; // Keeps track of last position of touch points and sets MovementXY for them. void SetMovementXYForTouchPoints(blink::WebTouchEvent* event);
diff --git a/content/browser/renderer_host/input/legacy_input_router_impl.h b/content/browser/renderer_host/input/legacy_input_router_impl.h index d6412d6..ca897e6d 100644 --- a/content/browser/renderer_host/input/legacy_input_router_impl.h +++ b/content/browser/renderer_host/input/legacy_input_router_impl.h
@@ -40,6 +40,8 @@ class InputRouterClient; struct InputEventAck; +class MockRenderWidgetHost; + // An implementation for browser input event routing based on // Chrome IPC. This class is named "legacy" because it is largely tied to // Chrome IPC which is deprecated. This class will be replaced with a Mojo @@ -93,6 +95,8 @@ private: friend class LegacyInputRouterImplTest; + friend class MockRenderWidgetHost; + FRIEND_TEST_ALL_PREFIXES(SitePerProcessHitTestBrowserTest, SubframeTouchEventRouting); FRIEND_TEST_ALL_PREFIXES(SitePerProcessHitTestBrowserTest,
diff --git a/content/browser/renderer_host/input/touch_action_filter.h b/content/browser/renderer_host/input/touch_action_filter.h index 44002ed..d2c0061 100644 --- a/content/browser/renderer_host/input/touch_action_filter.h +++ b/content/browser/renderer_host/input/touch_action_filter.h
@@ -15,6 +15,8 @@ namespace content { +class MockRenderWidgetHost; + // The TouchActionFilter is responsible for filtering scroll and pinch gesture // events according to the CSS touch-action values the renderer has sent for // each touch point. @@ -53,6 +55,8 @@ void SetForceEnableZoom(bool enabled) { force_enable_zoom_ = enabled; } private: + friend class MockRenderWidgetHost; + bool ShouldSuppressManipulation(const blink::WebGestureEvent&); bool FilterManipulationEventAndResetState();
diff --git a/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc b/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc index 8e6d66b9..135e6c4 100644 --- a/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc +++ b/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc
@@ -120,13 +120,27 @@ ~RenderFrameAudioInputStreamFactoryTest() override { audio_manager_.Shutdown(); + + // UniqueAudioInputStreamFactoryPtr uses DeleteOnIOThread and must run + // before |thread_bundle_| tear down. + factory_handle_.reset(); + + // Shutdown BrowserThread::IO before tearing down members. thread_bundle_.reset(); } + // |thread_bundle_| needs to be up before the members below (as they use + // BrowserThreads for their initialization) but then needs to be torn down + // before them as some verify they're town down in a single-threaded + // environment (while + // !BrowserThread::IsThreadInitiaslized(BrowserThread::IO)). base::Optional<TestBrowserThreadBundle> thread_bundle_; + + // These members need to be torn down after |thread_bundle_|. media::MockAudioManager audio_manager_; media::AudioSystemImpl audio_system_; MediaStreamManager media_stream_manager_; + mojom::RendererAudioInputStreamFactoryPtr factory_ptr_; media::mojom::AudioInputStreamPtr stream_ptr_; MockRendererAudioInputStreamFactoryClient client_;
diff --git a/content/browser/renderer_host/offscreen_canvas_provider_impl_unittest.cc b/content/browser/renderer_host/offscreen_canvas_provider_impl_unittest.cc index 935bdc287..4cdfe1aa 100644 --- a/content/browser/renderer_host/offscreen_canvas_provider_impl_unittest.cc +++ b/content/browser/renderer_host/offscreen_canvas_provider_impl_unittest.cc
@@ -128,9 +128,10 @@ &host_frame_sink_client_); } void TearDown() override { + host_frame_sink_manager_->InvalidateFrameSinkId(kFrameSinkParent); provider_.reset(); - frame_sink_manager_.reset(); host_frame_sink_manager_.reset(); + frame_sink_manager_.reset(); } private:
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 42252a6..9f73bdc 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -889,7 +889,7 @@ host, host->GetBrowserContext(), site_url)) continue; - if (host->VisibleWidgetCount()) + if (host->VisibleClientCount()) foreground_processes->insert(host); else background_processes->insert(host); @@ -1350,7 +1350,7 @@ keep_alive_ref_count_(0), is_keep_alive_ref_count_disabled_(false), route_provider_binding_(this), - visible_widgets_(0), + visible_clients_(0), priority_({ blink::kLaunchingProcessIsBackgrounded, blink::kLaunchingProcessIsBoostedForPendingView, @@ -2301,47 +2301,19 @@ PROCESS_TYPE_RENDERER); } -void RenderProcessHostImpl::WidgetRestored() { - visible_widgets_++; - UpdateProcessPriority(); +void RenderProcessHostImpl::UpdateClientPriority(PriorityClient* client) { + DCHECK(client); + DCHECK_EQ(1u, priority_clients_.count(client)); + UpdateProcessPriorityInputs(); } -void RenderProcessHostImpl::WidgetHidden() { - // On startup, the browser will call Hide. We ignore this call. - if (visible_widgets_ == 0) - return; - - --visible_widgets_; - if (visible_widgets_ == 0) { - UpdateProcessPriority(); - } -} - -int RenderProcessHostImpl::VisibleWidgetCount() const { - return visible_widgets_; +int RenderProcessHostImpl::VisibleClientCount() const { + return visible_clients_; } #if defined(OS_ANDROID) -void RenderProcessHostImpl::UpdateWidgetImportance( - ChildProcessImportance old_value, - ChildProcessImportance new_value) { - DCHECK_NE(old_value, new_value); - DCHECK(widget_importance_counts_[static_cast<size_t>(old_value)]); - widget_importance_counts_[static_cast<size_t>(old_value)]--; - widget_importance_counts_[static_cast<size_t>(new_value)]++; - UpdateProcessPriority(); -} - ChildProcessImportance RenderProcessHostImpl::ComputeEffectiveImportance() { - ChildProcessImportance importance = ChildProcessImportance::NORMAL; - for (size_t i = 0u; i < arraysize(widget_importance_counts_); ++i) { - DCHECK_GE(widget_importance_counts_[i], 0); - if (widget_importance_counts_[i]) { - // No early out. Highest importance wins. - importance = static_cast<ChildProcessImportance>(i); - } - } - return importance; + return effective_importance_; } #endif @@ -2581,7 +2553,6 @@ switches::kDisableCompositorUkmForTests, switches::kDisablePreferCompositingToLCDText, switches::kDisableDatabases, - switches::kDisableDistanceFieldText, switches::kDisableFileSystem, switches::kDisableGpuMemoryBufferVideoFrames, switches::kDisableGpuVsync, @@ -2609,7 +2580,6 @@ switches::kDisableWebGLImageChromium, switches::kDomAutomationController, switches::kEnableAutomation, - switches::kEnableDistanceFieldText, switches::kEnableExperimentalWebPlatformFeatures, switches::kEnableHeapProfiling, switches::kEnableGPUClientLogging, @@ -3148,10 +3118,10 @@ RenderWidgetHostImpl* widget_impl = static_cast<RenderWidgetHostImpl*>(widget); widgets_.insert(widget_impl); -#if defined(OS_ANDROID) - widget_importance_counts_[static_cast<size_t>(widget_impl->importance())]++; - UpdateProcessPriority(); -#endif + + DCHECK(!base::ContainsKey(priority_clients_, widget_impl)); + priority_clients_.insert(widget_impl); + UpdateProcessPriorityInputs(); } void RenderProcessHostImpl::RemoveWidget(RenderWidgetHost* widget) { @@ -3159,12 +3129,9 @@ static_cast<RenderWidgetHostImpl*>(widget); widgets_.erase(widget_impl); -#if defined(OS_ANDROID) - ChildProcessImportance importance = widget_impl->importance(); - DCHECK(widget_importance_counts_[static_cast<size_t>(importance)]); - widget_importance_counts_[static_cast<size_t>(importance)]--; - UpdateProcessPriority(); -#endif + DCHECK(base::ContainsKey(priority_clients_, widget_impl)); + priority_clients_.erase(widget_impl); + UpdateProcessPriorityInputs(); } void RenderProcessHostImpl::SetSuddenTerminationAllowed(bool enabled) { @@ -3857,6 +3824,33 @@ SetSuddenTerminationAllowed(enabled); } +void RenderProcessHostImpl::UpdateProcessPriorityInputs() { + int32_t new_visible_widgets_count = 0; +#if defined(OS_ANDROID) + ChildProcessImportance new_effective_importance = + ChildProcessImportance::NORMAL; +#endif + for (auto* client : priority_clients_) { + Priority priority = client->GetPriority(); + if (!priority.is_hidden) + new_visible_widgets_count++; +#if defined(OS_ANDROID) + new_effective_importance = + std::max(new_effective_importance, priority.importance); +#endif + } + + bool inputs_changed = new_visible_widgets_count != visible_clients_; + visible_clients_ = new_visible_widgets_count; +#if defined(OS_ANDROID) + inputs_changed = + inputs_changed || new_effective_importance != effective_importance_; + effective_importance_ = new_effective_importance; +#endif + if (inputs_changed) + UpdateProcessPriority(); +} + void RenderProcessHostImpl::UpdateProcessPriority() { if (!run_renderer_in_process() && (!child_process_launcher_.get() || child_process_launcher_->IsStarting())) { @@ -3870,7 +3864,7 @@ // We background a process as soon as it hosts no active audio/video streams // and no visible widgets -- the callers must call this function whenever we // transition in/out of those states. - visible_widgets_ == 0 && media_stream_count_ == 0 && + visible_clients_ == 0 && media_stream_count_ == 0 && !base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableRendererBackgrounding), // boost_for_pending_views
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index dab3d66d..814762ce9 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -14,6 +14,7 @@ #include <set> #include <string> +#include "base/containers/flat_set.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/observer_list.h" @@ -155,9 +156,8 @@ void AddObserver(RenderProcessHostObserver* observer) override; void RemoveObserver(RenderProcessHostObserver* observer) override; void ShutdownForBadMessage(CrashReportMode crash_report_mode) override; - void WidgetRestored() override; - void WidgetHidden() override; - int VisibleWidgetCount() const override; + void UpdateClientPriority(PriorityClient* client) override; + int VisibleClientCount() const override; bool IsForGuestsOnly() const override; StoragePartition* GetStoragePartition() const override; bool Shutdown(int exit_code) override; @@ -177,8 +177,6 @@ void AddWidget(RenderWidgetHost* widget) override; void RemoveWidget(RenderWidgetHost* widget) override; #if defined(OS_ANDROID) - void UpdateWidgetImportance(ChildProcessImportance old_value, - ChildProcessImportance new_value) override; ChildProcessImportance ComputeEffectiveImportance() override; #endif void SetSuddenTerminationAllowed(bool enabled) override; @@ -490,6 +488,10 @@ const base::CommandLine& browser_cmd, base::CommandLine* renderer_cmd); + // Recompute |visible_clients_| and |effective_importance_| from + // |priority_clients_|. + void UpdateProcessPriorityInputs(); + // Inspects the current object state and sets/removes background priority if // appropriate. Should be called after any of the involved data members // change. @@ -609,19 +611,19 @@ mojo::AssociatedBindingSet<mojom::AssociatedInterfaceProvider, int32_t> associated_interface_provider_bindings_; - // The count of currently visible widgets. Since the host can be a container - // for multiple widgets, it uses this count to determine when it should be - // backgrounded. - int32_t visible_widgets_; - + // These fields are cached values that are updated in + // UpdateProcessPriorityInputs, and are used to compute priority sent to + // ChildProcessLauncher. + // |visible_clients_|is the count of currently visible clients. + int32_t visible_clients_; #if defined(OS_ANDROID) - // Track count of number of widgets with each possible ChildProcessImportance - // value. - int32_t widget_importance_counts_[static_cast<size_t>( - ChildProcessImportance::COUNT)] = {0}; - + // Highest importance of all clients that contribute priority. + ChildProcessImportance effective_importance_ = ChildProcessImportance::NORMAL; #endif + // Clients that contribute priority to this proces. + base::flat_set<PriorityClient*> priority_clients_; + // The set of widgets in this RenderProcessHostImpl. std::set<RenderWidgetHostImpl*> widgets_;
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 5bd3fee..8571ab6 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -29,6 +29,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/task_scheduler/post_task.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/time/default_tick_clock.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "cc/base/switches.h" @@ -57,7 +58,6 @@ #include "content/browser/renderer_host/input/synthetic_gesture_target.h" #include "content/browser/renderer_host/input/timeout_monitor.h" #include "content/browser/renderer_host/input/touch_emulator.h" -#include "content/browser/renderer_host/render_process_host_impl.h" #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/renderer_host/render_view_host_delegate_view.h" #include "content/browser/renderer_host/render_view_host_impl.h" @@ -336,6 +336,7 @@ owner_delegate_(nullptr), process_(process), routing_id_(routing_id), + clock_(base::DefaultTickClock::GetInstance()), is_loading_(false), is_hidden_(hidden), repaint_ack_pending_(false), @@ -360,10 +361,9 @@ next_browser_snapshot_id_(1), owned_by_render_frame_host_(false), is_focused_(false), - hung_renderer_delay_( - base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)), + hung_renderer_delay_(TimeDelta::FromMilliseconds(kHungRendererDelayMs)), new_content_rendering_delay_( - base::TimeDelta::FromMilliseconds(kNewContentRenderingDelayMs)), + TimeDelta::FromMilliseconds(kNewContentRenderingDelayMs)), current_content_source_id_(0), monitoring_composition_info_(false), compositor_frame_sink_binding_(this), @@ -386,11 +386,6 @@ process_->AddWidget(this); process_->GetSharedBitmapAllocationNotifier()->AddObserver(this); - // If we're initially visible, tell the process host that we're alive. - // Otherwise we'll notify the process host when we are first shown. - if (!hidden) - process_->WidgetRestored(); - latency_tracker_.Initialize(routing_id_, GetProcess()->GetID()); SetupInputRouter(); @@ -674,7 +669,7 @@ Send(new ViewMsg_WasHidden(routing_id_)); // Tell the RenderProcessHost we were hidden. - process_->WidgetHidden(); + process_->UpdateClientPriority(this); bool is_visible = false; NotificationService::current()->Notify( @@ -702,7 +697,7 @@ needs_repainting_on_restore_ = false; Send(new ViewMsg_WasShown(routing_id_, needs_repainting, latency_info)); - process_->WidgetRestored(); + process_->UpdateClientPriority(this); bool is_visible = true; NotificationService::current()->Notify( @@ -732,9 +727,8 @@ void RenderWidgetHostImpl::SetImportance(ChildProcessImportance importance) { if (importance_ == importance) return; - ChildProcessImportance old = importance_; importance_ = importance; - process_->UpdateWidgetImportance(old, importance_); + process_->UpdateClientPriority(this); } #endif @@ -1005,7 +999,7 @@ // Pump a nested run loop until we time out or get a frame of the right // size. - TimeTicks start_time = TimeTicks::Now(); + TimeTicks start_time = clock_->NowTicks(); TimeDelta time_left = TimeDelta::FromMilliseconds(kPaintMsgTimeoutMS); TimeTicks timeout_time = start_time + time_left; while (1) { @@ -1014,7 +1008,7 @@ if (!view_->ShouldContinueToPauseForFrame()) break; } - time_left = timeout_time - TimeTicks::Now(); + time_left = timeout_time - clock_->NowTicks(); if (time_left <= TimeDelta::FromSeconds(0)) { TRACE_EVENT0("renderer_host", "WaitForSurface::Timeout"); break; @@ -1030,7 +1024,7 @@ } // Send out a request to the renderer to paint the view if required. - repaint_start_time_ = TimeTicks::Now(); + repaint_start_time_ = clock_->NowTicks(); repaint_ack_pending_ = true; TRACE_EVENT_ASYNC_BEGIN0( "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); @@ -1046,10 +1040,11 @@ RestartHangMonitorTimeoutIfNecessary(); } -void RenderWidgetHostImpl::StartHangMonitorTimeout(base::TimeDelta delay) { +void RenderWidgetHostImpl::StartHangMonitorTimeout(TimeDelta delay) { if (!hang_monitor_timeout_) return; hang_monitor_timeout_->Start(delay); + hang_monitor_start_time_ = clock_->NowTicks(); } void RenderWidgetHostImpl::RestartHangMonitorTimeoutIfNecessary() { @@ -1064,6 +1059,16 @@ void RenderWidgetHostImpl::StopHangMonitorTimeout() { if (hang_monitor_timeout_) hang_monitor_timeout_->Stop(); + + if (!hang_monitor_start_time_.is_null()) { + base::TimeDelta elapsed = clock_->NowTicks() - hang_monitor_start_time_; + const base::TimeDelta kMinimumHangTimeToReport = + base::TimeDelta::FromSeconds(5); + if (elapsed >= kMinimumHangTimeToReport) + UMA_HISTOGRAM_LONG_TIMES("Renderer.Hung.Duration", elapsed); + + hang_monitor_start_time_ = TimeTicks(); + } RendererIsResponsive(); } @@ -1607,6 +1612,15 @@ SetCursor(cursor); } +RenderProcessHost::Priority RenderWidgetHostImpl::GetPriority() { + return { + is_hidden_, +#if defined(OS_ANDROID) + importance_, +#endif + }; +} + mojom::WidgetInputHandler* RenderWidgetHostImpl::GetWidgetInputHandler() { if (associated_widget_input_handler_) return associated_widget_input_handler_.get(); @@ -1770,8 +1784,9 @@ // the |is_hidden_| change, so that the renderer will have correct visibility // set when respawned. if (!is_hidden_) { - process_->WidgetHidden(); is_hidden_ = true; + if (!destroyed_) + process_->UpdateClientPriority(this); } // Reset this to ensure the hung renderer mechanism is working properly. @@ -1949,7 +1964,7 @@ FROM_HERE, base::Bind(&RenderWidgetHostImpl::WindowSnapshotReachedScreen, weak_factory_.GetWeakPtr(), sequence_number), - base::TimeDelta::FromSecondsD(1. / 6)); + TimeDelta::FromSecondsD(1. / 6)); #else WindowSnapshotReachedScreen(sequence_number); #endif @@ -2064,7 +2079,7 @@ void RenderWidgetHostImpl::OnResizeOrRepaintACK( const ViewHostMsg_ResizeOrRepaint_ACK_Params& params) { TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::OnResizeOrRepaintACK"); - TimeTicks paint_start = TimeTicks::Now(); + TimeTicks paint_start = clock_->NowTicks(); // Update our knowledge of the RenderWidget's size. current_size_ = params.view_size; @@ -2086,7 +2101,7 @@ TRACE_EVENT_ASYNC_END0( "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); repaint_ack_pending_ = false; - TimeDelta delta = TimeTicks::Now() - repaint_start_time_; + TimeDelta delta = clock_->NowTicks() - repaint_start_time_; UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta); } @@ -2109,7 +2124,7 @@ // Log the time delta for processing a paint message. On platforms that don't // support asynchronous painting, this is equivalent to // MPArch.RWH_TotalPaintTime. - TimeDelta delta = TimeTicks::Now() - paint_start; + TimeDelta delta = clock_->NowTicks() - paint_start; UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgResizeOrRepaintACK", delta); } @@ -2778,8 +2793,8 @@ TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"), &tracing_enabled); if (tracing_enabled) { - base::TimeDelta elapsed = base::TimeTicks::Now().since_origin() - - base::TimeDelta::FromMicroseconds(submit_time); + TimeDelta elapsed = clock_->NowTicks().since_origin() - + TimeDelta::FromMicroseconds(submit_time); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"), "SubmitCompositorFrame::TimeElapsed", TRACE_EVENT_SCOPE_THREAD, @@ -2944,7 +2959,7 @@ SubmitCompositorFrame( saved_frame_.local_surface_id, std::move(saved_frame_.frame), std::move(saved_frame_.hit_test_region_list), - tracing_enabled ? base::TimeTicks::Now().since_origin().InMicroseconds() + tracing_enabled ? clock_->NowTicks().since_origin().InMicroseconds() : 0); saved_frame_.local_surface_id = viz::LocalSurfaceId(); compositor_frame_sink_binding_.ResumeIncomingMethodCallProcessing(); @@ -2976,12 +2991,16 @@ static_cast<LegacyInputRouterImpl*>(input_router_.get())); } + // input_router_ recreated, need to update the force_enable_zoom_ state. + input_router_->SetForceEnableZoom(force_enable_zoom_); + if (IsUseZoomForDSFEnabled()) { input_router_->SetDeviceScaleFactor(GetScaleFactorForView(view_.get())); } } void RenderWidgetHostImpl::SetForceEnableZoom(bool enabled) { + force_enable_zoom_ = enabled; input_router_->SetForceEnableZoom(enabled); } @@ -3014,7 +3033,7 @@ } } -void RenderWidgetHostImpl::ProgressFling(base::TimeTicks current_time) { +void RenderWidgetHostImpl::ProgressFling(TimeTicks current_time) { browser_fling_needs_begin_frame_ = false; if (input_router_) input_router_->ProgressFling(current_time);
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index c06fe24d..9ef34d3c 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -24,6 +24,7 @@ #include "base/observer_list.h" #include "base/process/kill.h" #include "base/strings/string16.h" +#include "base/time/tick_clock.h" #include "base/time/time.h" #include "base/timer/elapsed_timer.h" #include "build/build_config.h" @@ -39,6 +40,7 @@ #include "content/browser/renderer_host/input/synthetic_gesture_controller.h" #include "content/browser/renderer_host/input/touch_emulator_client.h" #include "content/browser/renderer_host/render_frame_metadata_provider_impl.h" +#include "content/browser/renderer_host/render_process_host_impl.h" #include "content/browser/renderer_host/render_widget_host_delegate.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/common/drag_event_source_info.h" @@ -112,6 +114,7 @@ public FrameTokenMessageQueue::Client, public InputRouterImplClient, public InputDispositionHandler, + public RenderProcessHostImpl::PriorityClient, public TouchEmulatorClient, public SyntheticGestureController::Delegate, public viz::mojom::CompositorFrameSink, @@ -162,6 +165,8 @@ RenderWidgetHostOwnerDelegate* owner_delegate() { return owner_delegate_; } + void set_clock_for_testing(base::TickClock* clock) { clock_ = clock; } + // Returns the viz::FrameSinkId that this object uses to put things on screen. // This value is constant throughout the lifetime of this object. Note that // until a RenderWidgetHostView is created, initialized, and assigned to this @@ -229,6 +234,9 @@ void FilterDropData(DropData* drop_data) override; void SetCursor(const CursorInfo& cursor_info) override; + // RenderProcessHostImpl::PriorityClient implementation. + RenderProcessHost::Priority GetPriority() override; + // Notification that the screen info has changed. void NotifyScreenInfoChanged(); @@ -868,16 +876,18 @@ // The ID of the corresponding object in the Renderer Instance. const int routing_id_; + // The clock used; overridable for tests. + base::TickClock* clock_; + // Indicates whether a page is loading or not. bool is_loading_; - // Indicates whether a page is hidden or not. It has to stay in sync with the - // most recent call to process_->WidgetRestored() / WidgetHidden(). + // Indicates whether a page is hidden or not. Need to call + // process_->UpdateClientPriority when this value changes. bool is_hidden_; #if defined(OS_ANDROID) - // Tracks the current importance of widget, so the old value can be passed to - // RenderProcessHost on changes. + // Tracks the current importance of widget. ChildProcessImportance importance_ = ChildProcessImportance::NORMAL; #endif @@ -994,6 +1004,7 @@ std::unique_ptr<InputRouter> input_router_; std::unique_ptr<TimeoutMonitor> hang_monitor_timeout_; + base::TimeTicks hang_monitor_start_time_; std::unique_ptr<TimeoutMonitor> new_content_rendering_timeout_; @@ -1103,6 +1114,8 @@ bool next_resize_needs_resize_ack_ = false; + bool force_enable_zoom_ = false; + RenderFrameMetadataProviderImpl render_frame_metadata_provider_; const viz::FrameSinkId frame_sink_id_;
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc index 95d265d..ec9145ea 100644 --- a/content/browser/renderer_host/render_widget_host_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -15,7 +15,9 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/test/histogram_tester.h" #include "base/test/scoped_feature_list.h" +#include "base/test/simple_test_tick_clock.h" #include "base/threading/thread_task_runner_handle.h" #include "base/timer/timer.h" #include "build/build_config.h" @@ -221,6 +223,20 @@ } } + void ExpectForceEnableZoom(bool enable) { + EXPECT_EQ(enable, force_enable_zoom_); + + if (base::FeatureList::IsEnabled(features::kMojoInputMessages)) { + InputRouterImpl* input_router = + static_cast<InputRouterImpl*>(input_router_.get()); + EXPECT_EQ(enable, input_router->touch_action_filter_.force_enable_zoom_); + } else { + LegacyInputRouterImpl* input_router = + static_cast<LegacyInputRouterImpl*>(input_router_.get()); + EXPECT_EQ(enable, input_router->touch_action_filter_.force_enable_zoom_); + } + } + WebInputEvent::Type acked_touch_event_type() const { return acked_touch_event_type_; } @@ -3055,6 +3071,26 @@ EXPECT_EQ(0u, host_->in_flight_event_count()); } +TEST_F(RenderWidgetHostTest, ForceEnableZoomShouldUpdateAfterRebind) { + SCOPED_TRACE("force_enable_zoom is false at start."); + host_->ExpectForceEnableZoom(false); + + // Set force_enable_zoom true. + host_->SetForceEnableZoom(true); + + SCOPED_TRACE("force_enable_zoom is true after set."); + host_->ExpectForceEnableZoom(true); + + // Rebind should also update to the latest force_enable_zoom state. + mojom::WidgetPtr widget; + std::unique_ptr<MockWidgetImpl> widget_impl = + std::make_unique<MockWidgetImpl>(mojo::MakeRequest(&widget)); + host_->SetWidget(std::move(widget)); + + SCOPED_TRACE("force_enable_zoom is true after rebind."); + host_->ExpectForceEnableZoom(true); +} + TEST_F(RenderWidgetHostTest, RenderWidgetSurfaceProperties) { RenderWidgetSurfaceProperties prop1; prop1.size = gfx::Size(200, 200); @@ -3097,4 +3133,29 @@ EXPECT_TRUE(host_->new_content_rendering_timeout_fired()); } +TEST_F(RenderWidgetHostTest, RendererHangRecordsMetrics) { + base::SimpleTestTickClock clock; + host_->set_clock_for_testing(&clock); + base::HistogramTester tester; + + // RenderWidgetHost makes private the methods it overrides from + // InputRouterClient. Call them through the base class. + InputRouterClient* input_router_client = host_.get(); + + // Do a 3s hang. This shouldn't affect metrics. + input_router_client->IncrementInFlightEventCount(); + clock.Advance(base::TimeDelta::FromSeconds(3)); + input_router_client->DecrementInFlightEventCount( + InputEventAckSource::UNKNOWN); + tester.ExpectTotalCount("Renderer.Hung.Duration", 0u); + + // Do a 17s hang. This should affect metrics. + input_router_client->IncrementInFlightEventCount(); + clock.Advance(base::TimeDelta::FromSeconds(17)); + input_router_client->DecrementInFlightEventCount( + InputEventAckSource::UNKNOWN); + tester.ExpectTotalCount("Renderer.Hung.Duration", 1u); + tester.ExpectUniqueSample("Renderer.Hung.Duration", 17000, 1); +} + } // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm index ca82d54..f6096a0 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm
@@ -10,7 +10,6 @@ #include "base/mac/scoped_nsautorelease_pool.h" #include "base/message_loop/message_loop.h" -#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/compositor/test/test_image_transport_factory.h" #include "content/browser/gpu/compositor_util.h" @@ -19,6 +18,7 @@ #include "content/common/input_messages.h" #include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_browser_context.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "content/test/mock_widget_impl.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -117,8 +117,10 @@ void TearDown() override { ImageTransportFactory::Terminate(); } private: - // This has a MessageLoop for ImageTransportFactory. - base::test::ScopedTaskEnvironment scoped_task_environment_; + // This has a MessageLoop for ImageTransportFactory and enables + // BrowserThread::UI for RecyclableCompositorMac used by + // RenderWidgetHostViewMac. + content::TestBrowserThreadBundle thread_bundle_; }; } // namespace
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index edca553b..30eb1ed6 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -10859,6 +10859,63 @@ EXPECT_GT(height, 0); } +// Test that a late swapout ACK won't incorrectly mark RenderViewHost as +// inactive if it's already been reused and switched to active by another +// navigation. See https://crbug.com/823567. +IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, + RenderViewHostStaysActiveWithLateSwapoutACK) { + EXPECT_TRUE(NavigateToURL( + shell(), embedded_test_server()->GetURL("a.com", "/title1.html"))); + + // Open a popup and navigate it to a.com. + Shell* popup = OpenPopup( + shell(), embedded_test_server()->GetURL("a.com", "/title2.html"), "foo"); + WebContentsImpl* popup_contents = + static_cast<WebContentsImpl*>(popup->web_contents()); + RenderFrameHostImpl* rfh = popup_contents->GetMainFrame(); + RenderViewHostImpl* rvh = rfh->render_view_host(); + + // Disable the swapout ACK and the swapout timer. + scoped_refptr<SwapoutACKMessageFilter> filter = new SwapoutACKMessageFilter(); + rfh->GetProcess()->AddFilter(filter.get()); + rfh->DisableSwapOutTimerForTesting(); + + // Navigate popup to b.com. Because there's an opener, the RVH for a.com + // stays around in swapped-out state. + EXPECT_TRUE(NavigateToURLInSameBrowsingInstance( + popup, embedded_test_server()->GetURL("b.com", "/title3.html"))); + EXPECT_FALSE(rvh->is_active()); + + // The old RenderFrameHost is now pending deletion. + ASSERT_TRUE(rfh->IsRenderFrameLive()); + ASSERT_FALSE(rfh->is_active()); + + // Kill the b.com process. + RenderProcessHost* b_process = popup_contents->GetMainFrame()->GetProcess(); + RenderProcessHostWatcher crash_observer( + b_process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); + b_process->Shutdown(0); + crash_observer.Wait(); + + // Go back in the popup from b.com to a.com/title2.html. Because the current + // b.com RFH is dead, the new RFH is committed right away (without waiting + // for renderer to commit), so that users don't need to look at the sad tab. + TestNavigationObserver back_observer(popup_contents); + popup_contents->GetController().GoBack(); + + // Pretend that the original RFH in a.com now finishes running its unload + // handler and sends the swapout ACK. + rfh->OnSwappedOut(); + + // Wait for the new a.com navigation to finish. + back_observer.Wait(); + + // The RVH for a.com should've been reused, and it should be active. Its + // main frame should've been updated to the RFH from the back navigation. + EXPECT_EQ(popup_contents->GetMainFrame()->render_view_host(), rvh); + EXPECT_TRUE(rvh->is_active()); + EXPECT_EQ(rvh->GetMainFrame(), popup_contents->GetMainFrame()); +} // Check that when A opens a new window with B which embeds an A subframe, the // subframe is visible and generates paint events. See
diff --git a/content/browser/webauth/authenticator_impl.cc b/content/browser/webauth/authenticator_impl.cc index a9668a1f..ab49fcd5 100644 --- a/content/browser/webauth/authenticator_impl.cc +++ b/content/browser/webauth/authenticator_impl.cc
@@ -30,6 +30,7 @@ #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_getter.h" #include "services/service_manager/public/cpp/connector.h" +#include "url/url_constants.h" #include "url/url_util.h" namespace content { @@ -49,7 +50,15 @@ bool HasValidEffectiveDomain(url::Origin caller_origin) { return !caller_origin.unique() && !url::HostIsIPAddress(caller_origin.host()) && - content::IsOriginSecure(caller_origin.GetURL()); + content::IsOriginSecure(caller_origin.GetURL()) && + // Additionally, the scheme is required to be HTTP(S). Other schemes + // may be supported in the future but the webauthn relying party is + // just the domain of the origin so we would have to define how the + // authority part of other schemes maps to a "domain" without + // collisions. Given the |IsOriginSecure| check, just above, HTTP is + // effectively restricted to just "localhost". + (caller_origin.scheme() == url::kHttpScheme || + caller_origin.scheme() == url::kHttpsScheme); } // Ensure the relying party ID is a registrable domain suffix of or equal
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc index 62cd1ed..0685849 100644 --- a/content/browser/webauth/authenticator_impl_unittest.cc +++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -98,10 +98,6 @@ {"https://.google.com", ".google.com"}, {"https://..google.com", ".google.com"}, {"https://accounts.google.com", ".google.com"}, - - // The spec notes that RPs should not use non-https schemes, but this is - // technically still valid according to the authoritative parts. - {"wss:///google.com", "google.com"}, }; constexpr OriginRelyingPartyIdPair kInvalidRelyingPartyTestCases[] = { @@ -149,6 +145,9 @@ {"gopher://google.com", "google.com"}, {"ftp://google.com", "google.com"}, {"file:///google.com", "google.com"}, + // Use of webauthn from a WSS origin may be technically valid, but we + // prohibit use on non-HTTPS origins. (At least for now.) + {"wss://google.com", "google.com"}, {"data:,", ""}, {"https://google.com", ""},
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCoreImpl.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCoreImpl.java index 9c341c25..a79e966 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCoreImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCoreImpl.java
@@ -92,7 +92,7 @@ ContentViewCoreImpl contentViewCore = mWeakContentViewCore.get(); if (contentViewCore == null) return; contentViewCore.hidePopupsAndClearSelection(); - contentViewCore.resetScrollInProgress(); + contentViewCore.getGestureListenerManager().resetScrollInProgress(); } } @@ -103,19 +103,19 @@ private class ContentGestureStateListener implements GestureStateListener { @Override public void onFlingStartGesture(int scrollOffsetY, int scrollExtentY) { - setTouchScrollInProgress(false); + getGestureListenerManager().setTouchScrollInProgress(false); } @Override public void onFlingEndGesture(int scrollOffsetY, int scrollExtentY) { // Note that mTouchScrollInProgress should normally be false at this // point, but we reset it anyway as another failsafe. - setTouchScrollInProgress(false); + getGestureListenerManager().setTouchScrollInProgress(false); } @Override public void onScrollStarted(int scrollOffsetY, int scrollExtentY) { - setTouchScrollInProgress(true); + getGestureListenerManager().setTouchScrollInProgress(false); } @Override @@ -125,7 +125,7 @@ @Override public void onScrollEnded(int scrollOffsetY, int scrollExtentY) { - setTouchScrollInProgress(false); + getGestureListenerManager().setTouchScrollInProgress(false); } @Override @@ -435,18 +435,6 @@ } @Override - public boolean isScrollInProgress() { - return getSelectionPopupController().getScrollInProgress() - || getGestureListenerManager().hasPotentiallyActiveFling(); - } - - private void setTouchScrollInProgress(boolean touchScrollInProgress) { - final boolean scrollInProgress = - touchScrollInProgress || getGestureListenerManager().hasPotentiallyActiveFling(); - getSelectionPopupController().setScrollInProgress(touchScrollInProgress, scrollInProgress); - } - - @Override public void onShow() { assert mWebContents != null; mWebContents.onShow(); @@ -779,20 +767,6 @@ settings.getTextTrackTextSize()); } - /** - * Reset scroll and fling accounting, notifying listeners as appropriate. - * This is useful as a failsafe when the input stream may have been interruped. - */ - private void resetScrollInProgress() { - if (!isScrollInProgress()) return; - - final boolean touchScrollInProgress = getSelectionPopupController().getScrollInProgress(); - - setTouchScrollInProgress(false); - if (touchScrollInProgress) getGestureListenerManager().updateOnScrollEnd(); - getGestureListenerManager().resetFlingGesture(); - } - // DisplayAndroidObserver method. @Override public void onRotationChanged(int rotation) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java b/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java index 6e57fb34..f4d371f 100644 --- a/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java
@@ -11,6 +11,7 @@ import org.chromium.base.TraceEvent; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; +import org.chromium.content.browser.selection.SelectionPopupControllerImpl; import org.chromium.content.browser.webcontents.WebContentsImpl; import org.chromium.content.browser.webcontents.WebContentsUserData; import org.chromium.content.browser.webcontents.WebContentsUserData.UserDataFactory; @@ -47,6 +48,13 @@ private long mNativeGestureListenerManager; /** + * Whether a touch scroll sequence is active, used to hide text selection + * handles. Note that a scroll sequence will *always* bound a pinch + * sequence, so this will also be true for the duration of a pinch gesture. + */ + private boolean mIsTouchScrollInProgress; + + /** * @param webContents {@link WebContents} object. * @return {@link GestureListenerManager} object used for the give WebContents. * Creates one if not present. @@ -268,6 +276,36 @@ TraceEvent.end("GestureListenerManagerImpl:updateScrollInfo"); } + @Override + public boolean isScrollInProgress() { + return mIsTouchScrollInProgress || hasPotentiallyActiveFling(); + } + + void setTouchScrollInProgress(boolean touchScrollInProgress) { + mIsTouchScrollInProgress = touchScrollInProgress; + + // Use the active touch scroll signal for hiding. The animation movement + // by fling will naturally hide the ActionMode by invalidating its content rect. + getSelectionPopupController().setScrollInProgress(touchScrollInProgress); + } + + /** + * Reset scroll and fling accounting, notifying listeners as appropriate. + * This is useful as a failsafe when the input stream may have been interruped. + */ + void resetScrollInProgress() { + if (!isScrollInProgress()) return; + + final boolean touchScrollInProgress = mIsTouchScrollInProgress; + setTouchScrollInProgress(false); + if (touchScrollInProgress) updateOnScrollEnd(); + resetFlingGesture(); + } + + private SelectionPopupControllerImpl getSelectionPopupController() { + return SelectionPopupControllerImpl.fromWebContents(mWebContents); + } + /** * Offer a long press gesture to the embedding View, primarily for WebView compatibility. *
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java index d726a89..c696d51 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
@@ -41,6 +41,7 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.content.R; import org.chromium.content.browser.ContentClassFactory; +import org.chromium.content.browser.GestureListenerManagerImpl; import org.chromium.content.browser.PopupController; import org.chromium.content.browser.PopupController.HideablePopup; import org.chromium.content.browser.WindowAndroidChangedObserver; @@ -162,9 +163,6 @@ // SelectionClient was able to classify it, otherwise null. private SelectionClient.Result mClassificationResult; - // Whether a scroll is in progress. - private boolean mScrollInProgress; - private boolean mPreserveSelectionOnNextLossOfFocus; private boolean mInitialized; @@ -604,22 +602,12 @@ updateTextSelectionUI(false); } - public void setScrollInProgress(boolean touchScrollInProgress, boolean scrollInProgress) { - mScrollInProgress = scrollInProgress; - - // The active fling count reflected in |scrollInProgress| isn't reliable with WebView, - // so only use the active touch scroll signal for hiding. The fling animation - // movement will naturally hide the ActionMode by invalidating its content rect. - hideActionMode(touchScrollInProgress); - } - /** - * Whether a touch scroll sequence is active, used to hide text selection - * handles. Note that a scroll sequence will *always* bound a pinch - * sequence, so this will also be true for the duration of a pinch gesture. + * Update scroll status. + * @param scrollInProgress {@code true} if scroll is in progress. */ - public boolean getScrollInProgress() { - return mScrollInProgress; + public void setScrollInProgress(boolean scrollInProgress) { + hideActionMode(scrollInProgress); } /** @@ -1256,7 +1244,7 @@ case SelectionEventType.INSERTION_HANDLE_MOVED: mSelectionRect.set(left, top, right, bottom); - if (!mScrollInProgress && isPastePopupShowing()) { + if (!getGestureListenerManager().isScrollInProgress() && isPastePopupShowing()) { showPastePopup(); } else { destroyPastePopup(); @@ -1307,6 +1295,10 @@ } } + private GestureListenerManagerImpl getGestureListenerManager() { + return GestureListenerManagerImpl.fromWebContents(mWebContents); + } + @VisibleForTesting @CalledByNative /* package */ void onDragUpdate(float x, float y) {
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentViewCore.java index 2ce70aa..a9de30f 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/ContentViewCore.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/ContentViewCore.java
@@ -155,11 +155,6 @@ boolean isAlive(); /** - * @return Whether a scroll targeting web content is in progress. - */ - boolean isScrollInProgress(); - - /** * To be called when the ContentView is shown. */ void onShow();
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/GestureListenerManager.java b/content/public/android/java/src/org/chromium/content_public/browser/GestureListenerManager.java index d21b9361..70e40dc 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/GestureListenerManager.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/GestureListenerManager.java
@@ -31,4 +31,9 @@ * @param listener Listener to remove. */ void removeListener(GestureStateListener listener); + + /** + * @return Whether a scroll targeting web content is in progress. + */ + boolean isScrollInProgress(); }
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h index 4c09d56..a87b4c6 100644 --- a/content/public/browser/render_process_host.h +++ b/content/public/browser/render_process_host.h
@@ -23,6 +23,10 @@ #include "media/media_features.h" #include "ui/gfx/native_widget_types.h" +#if defined(OS_ANDROID) +#include "content/public/browser/android/child_process_importance.h" +#endif + class GURL; namespace base { @@ -68,6 +72,27 @@ public: using iterator = base::IDMap<RenderProcessHost*>::iterator; + // Priority (or on Android, the importance) that a client contributes to this + // RenderProcessHost. Eg a RenderProcessHost with a visible client has higher + // priority / importance than a RenderProcessHost with hidden clients only. + struct Priority { + bool is_hidden; +#if defined(OS_ANDROID) + ChildProcessImportance importance; +#endif + }; + + // Interface for a client that contributes Priority to this + // RenderProcessHost. Clients can call UpdateClientPriority when their + // Priority changes. + class PriorityClient { + public: + virtual Priority GetPriority() = 0; + + protected: + virtual ~PriorityClient() {} + }; + // Details for RENDERER_PROCESS_CLOSED notifications. struct RendererClosedDetails { RendererClosedDetails(base::TerminationStatus status, @@ -126,11 +151,9 @@ // will be reported as well. virtual void ShutdownForBadMessage(CrashReportMode crash_report_mode) = 0; - // Track the count of visible widgets. Called by listeners to register and - // unregister visibility. - virtual void WidgetRestored() = 0; - virtual void WidgetHidden() = 0; - virtual int VisibleWidgetCount() const = 0; + // Track the count of visible clients. + virtual void UpdateClientPriority(PriorityClient* client) = 0; + virtual int VisibleClientCount() const = 0; virtual RendererAudioOutputStreamFactoryContext* GetRendererAudioOutputStreamFactoryContext() = 0; @@ -233,10 +256,6 @@ virtual void RemoveWidget(RenderWidgetHost* widget) = 0; #if defined(OS_ANDROID) - // Called by an already added widget when its importance changes. - virtual void UpdateWidgetImportance(ChildProcessImportance old_value, - ChildProcessImportance new_value) = 0; - // Return the highest importance of all widgets in this process. virtual ChildProcessImportance ComputeEffectiveImportance() = 0; #endif
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index c41cbacc..9d85caf 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -196,9 +196,6 @@ // Disables LCD text. const char kDisableLCDText[] = "disable-lcd-text"; -// Disables distance field text. -const char kDisableDistanceFieldText[] = "disable-distance-field-text"; - // Disable LocalStorage. const char kDisableLocalStorage[] = "disable-local-storage"; @@ -338,10 +335,6 @@ // Enables LCD text. const char kEnableLCDText[] = "enable-lcd-text"; -// Enables using signed distance fields when rendering text. -// Only valid if GPU rasterization is enabled as well. -const char kEnableDistanceFieldText[] = "enable-distance-field-text"; - // Enable the creation of compositing layers when it would prevent LCD text. const char kEnablePreferCompositingToLCDText[] = "enable-prefer-compositing-to-lcd-text";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index 26a2745..fc1a3de 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -44,7 +44,6 @@ CONTENT_EXPORT extern const char kDisableBlinkFeatures[]; CONTENT_EXPORT extern const char kDisableCompositorUkmForTests[]; CONTENT_EXPORT extern const char kDisableDatabases[]; -CONTENT_EXPORT extern const char kDisableDistanceFieldText[]; CONTENT_EXPORT extern const char kDisableDisplayList2dCanvas[]; extern const char kDisableDomainBlockingFor3DAPIs[]; CONTENT_EXPORT extern const char kDisableWebGL[]; @@ -114,7 +113,6 @@ CONTENT_EXPORT extern const char kEnableBlinkFeatures[]; CONTENT_EXPORT extern const char kEnableBackgroundFetchPersistence[]; CONTENT_EXPORT extern const char kEnableDisplayList2dCanvas[]; -CONTENT_EXPORT extern const char kEnableDistanceFieldText[]; CONTENT_EXPORT extern const char kEnableExperimentalWebPlatformFeatures[]; CONTENT_EXPORT extern const char kEnableGpuMemoryBufferCompositorResources[]; CONTENT_EXPORT extern const char kEnableGpuMemoryBufferVideoFrames[];
diff --git a/content/public/common/font_cache_win.mojom b/content/public/common/font_cache_win.mojom index 46fa04c..a6d269a0 100644 --- a/content/public/common/font_cache_win.mojom +++ b/content/public/common/font_cache_win.mojom
@@ -4,7 +4,7 @@ module content.mojom; -import "mojo/common/logfont_win.mojom"; +import "mojo/public/mojom/base/logfont_win.mojom"; // Messages sent from child processes to the browser on Windows only. This file // will not be built on other platforms. @@ -13,7 +13,7 @@ // OS. This must wait for the browser to finish to guarantee the font has been // cached. See ChildProcessHost::PreCacheFont() for details. [Sync] - PreCacheFont(mojo.common.mojom.LOGFONT log_font) => (); + PreCacheFont(mojo_base.mojom.LOGFONT log_font) => (); // Release the cached fonts. ReleaseCachedFonts();
diff --git a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestContentViewCore.java b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestContentViewCore.java index de151d07..d484ab1 100644 --- a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestContentViewCore.java +++ b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestContentViewCore.java
@@ -55,11 +55,6 @@ } @Override - public boolean isScrollInProgress() { - return false; - } - - @Override public void onShow() {} @Override
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc index c67ea4b..e78b20a 100644 --- a/content/public/test/mock_render_process_host.cc +++ b/content/public/test/mock_render_process_host.cc
@@ -153,14 +153,17 @@ ++bad_msg_count_; } -void MockRenderProcessHost::WidgetRestored() { -} +void MockRenderProcessHost::UpdateClientPriority(PriorityClient* client) {} -void MockRenderProcessHost::WidgetHidden() { -} - -int MockRenderProcessHost::VisibleWidgetCount() const { - return 1; +int MockRenderProcessHost::VisibleClientCount() const { + int count = 0; + for (auto* client : priority_clients_) { + const Priority priority = client->GetPriority(); + if (!priority.is_hidden) { + count++; + } + } + return count; } bool MockRenderProcessHost::IsForGuestsOnly() const { @@ -260,16 +263,14 @@ } void MockRenderProcessHost::AddWidget(RenderWidgetHost* widget) { + priority_clients_.insert(static_cast<RenderWidgetHostImpl*>(widget)); } void MockRenderProcessHost::RemoveWidget(RenderWidgetHost* widget) { + priority_clients_.erase(static_cast<RenderWidgetHostImpl*>(widget)); } #if defined(OS_ANDROID) -void MockRenderProcessHost::UpdateWidgetImportance( - ChildProcessImportance old_value, - ChildProcessImportance new_value) {} - ChildProcessImportance MockRenderProcessHost::ComputeEffectiveImportance() { NOTIMPLEMENTED(); return ChildProcessImportance::NORMAL;
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h index 28522da0..4e69482 100644 --- a/content/public/test/mock_render_process_host.h +++ b/content/public/test/mock_render_process_host.h
@@ -10,10 +10,12 @@ #include <map> #include <memory> +#include <set> #include <string> #include <utility> #include <vector> +#include "base/containers/flat_set.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/metrics/persistent_memory_allocator.h" @@ -29,6 +31,10 @@ #include "services/service_manager/public/cpp/identity.h" #include "services/service_manager/public/cpp/interface_provider.h" +#if defined(OS_ANDROID) +#include "content/public/browser/android/child_process_importance.h" +#endif + class StoragePartition; class SiteInstance; @@ -67,9 +73,8 @@ void AddObserver(RenderProcessHostObserver* observer) override; void RemoveObserver(RenderProcessHostObserver* observer) override; void ShutdownForBadMessage(CrashReportMode crash_report_mode) override; - void WidgetRestored() override; - void WidgetHidden() override; - int VisibleWidgetCount() const override; + void UpdateClientPriority(PriorityClient* client) override; + int VisibleClientCount() const override; bool IsForGuestsOnly() const override; RendererAudioOutputStreamFactoryContext* GetRendererAudioOutputStreamFactoryContext() override; @@ -93,8 +98,6 @@ void AddWidget(RenderWidgetHost* widget) override; void RemoveWidget(RenderWidgetHost* widget) override; #if defined(OS_ANDROID) - void UpdateWidgetImportance(ChildProcessImportance old_value, - ChildProcessImportance new_value) override; ChildProcessImportance ComputeEffectiveImportance() override; #endif void SetSuddenTerminationAllowed(bool allowed) override; @@ -194,6 +197,7 @@ BrowserContext* browser_context_; base::ObserverList<RenderProcessHostObserver> observers_; + base::flat_set<PriorityClient*> priority_clients_; int prev_routing_id_; base::IDMap<IPC::Listener*> listeners_; bool fast_shutdown_started_;
diff --git a/content/public/test/test_browser_thread_bundle.cc b/content/public/test/test_browser_thread_bundle.cc index 013e1f3..b6c045d3 100644 --- a/content/public/test/test_browser_thread_bundle.cc +++ b/content/public/test/test_browser_thread_bundle.cc
@@ -128,4 +128,8 @@ SetBrowserStartupIsCompleteForTesting(); } +void TestBrowserThreadBundle::RunUntilIdle() { + scoped_task_environment_->RunUntilIdle(); +} + } // namespace content
diff --git a/content/public/test/test_browser_thread_bundle.h b/content/public/test/test_browser_thread_bundle.h index cd838ad..88411d9 100644 --- a/content/public/test/test_browser_thread_bundle.h +++ b/content/public/test/test_browser_thread_bundle.h
@@ -123,6 +123,13 @@ // 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 momment, this will not process BrowserThread::IO if this + // TestBrowserThreadBundle is using a REAL_IO_THREAD. TODO(robliao): fix this + // by making TaskScheduler aware of all MessageLoops. + // Prefer this to the equivalent content::RunAllTasksUntilIdle(). + void RunUntilIdle(); + ~TestBrowserThreadBundle(); private:
diff --git a/content/public/test/test_browser_thread_bundle_unittest.cc b/content/public/test/test_browser_thread_bundle_unittest.cc index 0b5d34bf..f810fa8 100644 --- a/content/public/test/test_browser_thread_bundle_unittest.cc +++ b/content/public/test/test_browser_thread_bundle_unittest.cc
@@ -4,6 +4,7 @@ #include "content/public/test/test_browser_thread_bundle.h" +#include "base/atomicops.h" #include "base/bind_helpers.h" #include "base/message_loop/message_loop.h" #include "base/task_scheduler/post_task.h" @@ -42,6 +43,63 @@ } // Would hang here prior to fix. } +namespace { + +// TestBrowserThreadBundleTest.RunUntilIdle will run kNumTasks tasks that will +// hop back-and-forth between TaskScheduler and UI thread kNumHops times. +// Note: These values are arbitrary. +constexpr int kNumHops = 13; +constexpr int kNumTasks = 8; + +void PostTaskToUIThread(int iteration, base::subtle::Atomic32* tasks_run); + +void PostToTaskScheduler(int iteration, base::subtle::Atomic32* tasks_run) { + // All iterations but the first come from a task that was posted. + if (iteration > 0) + base::subtle::NoBarrier_AtomicIncrement(tasks_run, 1); + + if (iteration == kNumHops) + return; + + base::PostTask(FROM_HERE, + base::BindOnce(&PostTaskToUIThread, iteration + 1, tasks_run)); +} + +void PostTaskToUIThread(int iteration, base::subtle::Atomic32* tasks_run) { + // All iterations but the first come from a task that was posted. + if (iteration > 0) + base::subtle::NoBarrier_AtomicIncrement(tasks_run, 1); + + if (iteration == kNumHops) + return; + + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::BindOnce(&PostToTaskScheduler, iteration + 1, tasks_run)); +} + +} // namespace + +TEST(TestBrowserThreadBundleTest, RunUntilIdle) { + TestBrowserThreadBundle test_browser_thread_bundle; + + base::subtle::Atomic32 tasks_run = 0; + + // Post half the tasks on TaskScheduler and the other half on the UI thread + // so they cross and the last hops aren't all on the same task runner. + for (int i = 0; i < kNumTasks; ++i) { + if (i % 2) { + PostToTaskScheduler(0, &tasks_run); + } else { + PostTaskToUIThread(0, &tasks_run); + } + } + + test_browser_thread_bundle.RunUntilIdle(); + + EXPECT_EQ(kNumTasks * kNumHops, base::subtle::NoBarrier_Load(&tasks_run)); +} + TEST(TestBrowserThreadBundleTest, MessageLoopTypeMismatch) { base::MessageLoopForUI message_loop;
diff --git a/content/public/test/test_utils.h b/content/public/test/test_utils.h index d99cf7d..659e685 100644 --- a/content/public/test/test_utils.h +++ b/content/public/test/test_utils.h
@@ -62,6 +62,7 @@ // (have no more immediate tasks, delayed tasks may still exist). Tasks may // still be running from sources outside of the task scheduler and the current // message loop. +// Prefer TestBrowserThreadBundle::RunUntilIdle() over this static method. void RunAllTasksUntilIdle(); // Get task to quit the given RunLoop. It allows a few generations of pending
diff --git a/content/renderer/dom_storage/dom_storage_cached_area.cc b/content/renderer/dom_storage/dom_storage_cached_area.cc index 805470f..f359b188 100644 --- a/content/renderer/dom_storage/dom_storage_cached_area.cc +++ b/content/renderer/dom_storage/dom_storage_cached_area.cc
@@ -77,9 +77,9 @@ virtual_time_pauser.PauseVirtualTime(true); ignore_key_mutations_[key]++; proxy_->SetItem(connection_id, key, value, old_value, page_url, - base::Bind(&DOMStorageCachedArea::OnSetItemComplete, - weak_factory_.GetWeakPtr(), key, - base::Passed(std::move(virtual_time_pauser)))); + base::BindOnce(&DOMStorageCachedArea::OnSetItemComplete, + weak_factory_.GetWeakPtr(), key, + std::move(virtual_time_pauser))); return true; } @@ -105,9 +105,9 @@ ignore_key_mutations_[key]++; proxy_->RemoveItem(connection_id, key, base::NullableString16(old_value, false), page_url, - base::Bind(&DOMStorageCachedArea::OnRemoveItemComplete, - weak_factory_.GetWeakPtr(), key, - base::Passed(std::move(virtual_time_pauser)))); + base::BindOnce(&DOMStorageCachedArea::OnRemoveItemComplete, + weak_factory_.GetWeakPtr(), key, + std::move(virtual_time_pauser))); } void DOMStorageCachedArea::Clear(int connection_id, const GURL& page_url) { @@ -121,9 +121,9 @@ virtual_time_pauser.PauseVirtualTime(true); ignore_all_mutations_ = true; proxy_->ClearArea(connection_id, page_url, - base::Bind(&DOMStorageCachedArea::OnClearComplete, - weak_factory_.GetWeakPtr(), - base::Passed(std::move(virtual_time_pauser)))); + base::BindOnce(&DOMStorageCachedArea::OnClearComplete, + weak_factory_.GetWeakPtr(), + std::move(virtual_time_pauser))); } void DOMStorageCachedArea::ApplyMutation( @@ -182,10 +182,9 @@ ignore_all_mutations_ = true; DOMStorageValuesMap values; base::TimeTicks before = base::TimeTicks::Now(); - proxy_->LoadArea(connection_id, - &values, - base::Bind(&DOMStorageCachedArea::OnLoadComplete, - weak_factory_.GetWeakPtr())); + proxy_->LoadArea(connection_id, &values, + base::BindOnce(&DOMStorageCachedArea::OnLoadComplete, + weak_factory_.GetWeakPtr())); base::TimeDelta time_to_prime = base::TimeTicks::Now() - before; // Keeping this histogram named the same (without the ForRenderer suffix) // to maintain histogram continuity.
diff --git a/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc b/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc index 3a9dd025..1a336ccb 100644 --- a/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc +++ b/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc
@@ -29,8 +29,8 @@ void LoadArea(int connection_id, DOMStorageValuesMap* values, - const CompletionCallback& callback) override { - pending_callbacks_.push_back(callback); + CompletionCallback callback) override { + pending_callbacks_.push_back(std::move(callback)); observed_load_area_ = true; observed_connection_id_ = connection_id; *values = load_area_return_values_; @@ -41,8 +41,8 @@ const base::string16& value, const base::NullableString16& old_value, const GURL& page_url, - const CompletionCallback& callback) override { - pending_callbacks_.push_back(callback); + CompletionCallback callback) override { + pending_callbacks_.push_back(std::move(callback)); observed_set_item_ = true; observed_connection_id_ = connection_id; observed_key_ = key; @@ -54,8 +54,8 @@ const base::string16& key, const base::NullableString16& old_value, const GURL& page_url, - const CompletionCallback& callback) override { - pending_callbacks_.push_back(callback); + CompletionCallback callback) override { + pending_callbacks_.push_back(std::move(callback)); observed_remove_item_ = true; observed_connection_id_ = connection_id; observed_key_ = key; @@ -64,8 +64,8 @@ void ClearArea(int connection_id, const GURL& page_url, - const CompletionCallback& callback) override { - pending_callbacks_.push_back(callback); + CompletionCallback callback) override { + pending_callbacks_.push_back(std::move(callback)); observed_clear_area_ = true; observed_connection_id_ = connection_id; observed_page_url_ = page_url; @@ -91,7 +91,7 @@ void CompleteOnePendingCallback(bool success) { ASSERT_TRUE(!pending_callbacks_.empty()); - pending_callbacks_.front().Run(success); + std::move(pending_callbacks_.front()).Run(success); pending_callbacks_.pop_front(); }
diff --git a/content/renderer/dom_storage/dom_storage_dispatcher.cc b/content/renderer/dom_storage/dom_storage_dispatcher.cc index 1842a2f..001de4fb 100644 --- a/content/renderer/dom_storage/dom_storage_dispatcher.cc +++ b/content/renderer/dom_storage/dom_storage_dispatcher.cc
@@ -110,21 +110,21 @@ // DOMStorageProxy interface for use by DOMStorageCachedArea. void LoadArea(int connection_id, DOMStorageValuesMap* values, - const CompletionCallback& callback) override; + CompletionCallback callback) override; void SetItem(int connection_id, const base::string16& key, const base::string16& value, const base::NullableString16& old_value, const GURL& page_url, - const CompletionCallback& callback) override; + CompletionCallback callback) override; void RemoveItem(int connection_id, const base::string16& key, const base::NullableString16& old_value, const GURL& page_url, - const CompletionCallback& callback) override; + CompletionCallback callback) override; void ClearArea(int connection_id, const GURL& page_url, - const CompletionCallback& callback) override; + CompletionCallback callback) override; private: // Struct to hold references to our contained areas and @@ -141,7 +141,7 @@ ~ProxyImpl() override {} - void PushPendingCallback(const CompletionCallback& callback) { + void PushPendingCallback(CompletionCallback callback) { // Terminate the renderer if an excessive number of calls are made, // This is indicative of script in an infinite loop or being malicious. // It's better to crash intentionally than by running the system OOM @@ -154,11 +154,11 @@ // to more reliably commit changes during shutdown. if (pending_callbacks_.empty()) blink::Platform::Current()->SuddenTerminationChanged(false); - pending_callbacks_.push_back(callback); + pending_callbacks_.push_back(std::move(callback)); } CompletionCallback PopPendingCallback() { - CompletionCallback callback = pending_callbacks_.front(); + CompletionCallback callback = std::move(pending_callbacks_.front()); pending_callbacks_.pop_front(); if (pending_callbacks_.empty()) blink::Platform::Current()->SuddenTerminationChanged(true); @@ -238,10 +238,10 @@ pending_callbacks_.clear(); } -void DomStorageDispatcher::ProxyImpl::LoadArea( - int connection_id, DOMStorageValuesMap* values, - const CompletionCallback& callback) { - PushPendingCallback(callback); +void DomStorageDispatcher::ProxyImpl::LoadArea(int connection_id, + DOMStorageValuesMap* values, + CompletionCallback callback) { + PushPendingCallback(std::move(callback)); throttling_filter_->SendThrottled(new DOMStorageHostMsg_LoadStorageArea( connection_id, values)); } @@ -252,8 +252,8 @@ const base::string16& value, const base::NullableString16& old_value, const GURL& page_url, - const CompletionCallback& callback) { - PushPendingCallback(callback); + CompletionCallback callback) { + PushPendingCallback(std::move(callback)); throttling_filter_->SendThrottled(new DOMStorageHostMsg_SetItem( connection_id, key, value, old_value, page_url)); } @@ -263,16 +263,16 @@ const base::string16& key, const base::NullableString16& old_value, const GURL& page_url, - const CompletionCallback& callback) { - PushPendingCallback(callback); + CompletionCallback callback) { + PushPendingCallback(std::move(callback)); throttling_filter_->SendThrottled(new DOMStorageHostMsg_RemoveItem( connection_id, key, old_value, page_url)); } void DomStorageDispatcher::ProxyImpl::ClearArea(int connection_id, - const GURL& page_url, - const CompletionCallback& callback) { - PushPendingCallback(callback); + const GURL& page_url, + CompletionCallback callback) { + PushPendingCallback(std::move(callback)); throttling_filter_->SendThrottled(new DOMStorageHostMsg_Clear( connection_id, page_url)); }
diff --git a/content/renderer/dom_storage/dom_storage_proxy.h b/content/renderer/dom_storage/dom_storage_proxy.h index 8fbd361..9434567a 100644 --- a/content/renderer/dom_storage/dom_storage_proxy.h +++ b/content/renderer/dom_storage/dom_storage_proxy.h
@@ -17,28 +17,28 @@ // Abstract interface for cached area, renderer to browser communications. class DOMStorageProxy : public base::RefCounted<DOMStorageProxy> { public: - typedef base::Callback<void(bool)> CompletionCallback; + typedef base::OnceCallback<void(bool)> CompletionCallback; virtual void LoadArea(int connection_id, DOMStorageValuesMap* values, - const CompletionCallback& callback) = 0; + CompletionCallback callback) = 0; virtual void SetItem(int connection_id, const base::string16& key, const base::string16& value, const base::NullableString16& old_value, const GURL& page_url, - const CompletionCallback& callback) = 0; + CompletionCallback callback) = 0; virtual void RemoveItem(int connection_id, const base::string16& key, const base::NullableString16& old_value, const GURL& page_url, - const CompletionCallback& callback) = 0; + CompletionCallback callback) = 0; virtual void ClearArea(int connection_id, const GURL& page_url, - const CompletionCallback& callback) = 0; + CompletionCallback callback) = 0; protected: friend class base::RefCounted<DOMStorageProxy>;
diff --git a/content/renderer/dom_storage/local_storage_cached_area.cc b/content/renderer/dom_storage/local_storage_cached_area.cc index 22f1a9c..ca8d1bd3 100644 --- a/content/renderer/dom_storage/local_storage_cached_area.cc +++ b/content/renderer/dom_storage/local_storage_cached_area.cc
@@ -32,20 +32,21 @@ class GetAllCallback : public mojom::LevelDBWrapperGetAllCallback { public: static mojom::LevelDBWrapperGetAllCallbackAssociatedPtrInfo CreateAndBind( - const base::Callback<void(bool)>& callback) { + base::OnceCallback<void(bool)> callback) { mojom::LevelDBWrapperGetAllCallbackAssociatedPtrInfo ptr_info; auto request = mojo::MakeRequest(&ptr_info); mojo::MakeStrongAssociatedBinding( - base::WrapUnique(new GetAllCallback(callback)), std::move(request)); + base::WrapUnique(new GetAllCallback(std::move(callback))), + std::move(request)); return ptr_info; } private: - explicit GetAllCallback(const base::Callback<void(bool)>& callback) - : m_callback(callback) {} - void Complete(bool success) override { m_callback.Run(success); } + explicit GetAllCallback(base::OnceCallback<void(bool)> callback) + : m_callback(std::move(callback)) {} + void Complete(bool success) override { std::move(m_callback).Run(success); } - base::Callback<void(bool)> m_callback; + base::OnceCallback<void(bool)> m_callback; }; } // namespace @@ -428,8 +429,8 @@ leveldb::mojom::DatabaseError status = leveldb::mojom::DatabaseError::OK; std::vector<content::mojom::KeyValuePtr> data; leveldb_->GetAll(GetAllCallback::CreateAndBind( - base::Bind(&LocalStorageCachedArea::OnGetAllComplete, - weak_factory_.GetWeakPtr())), + base::BindOnce(&LocalStorageCachedArea::OnGetAllComplete, + weak_factory_.GetWeakPtr())), &status, &data); DOMStorageValuesMap values;
diff --git a/content/renderer/gpu/compositor_dependencies.h b/content/renderer/gpu/compositor_dependencies.h index 536de2a..b8ecf862 100644 --- a/content/renderer/gpu/compositor_dependencies.h +++ b/content/renderer/gpu/compositor_dependencies.h
@@ -33,7 +33,6 @@ virtual bool IsGpuRasterizationForced() = 0; virtual int GetGpuRasterizationMSAASampleCount() = 0; virtual bool IsLcdTextEnabled() = 0; - virtual bool IsDistanceFieldTextEnabled() = 0; virtual bool IsZeroCopyEnabled() = 0; virtual bool IsPartialRasterEnabled() = 0; virtual bool IsGpuMemoryBufferCompositorResourcesEnabled() = 0;
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index 5aaf0f9..d7ce39f3 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -415,8 +415,6 @@ compositor_deps->IsGpuRasterizationForced(); settings.can_use_lcd_text = compositor_deps->IsLcdTextEnabled(); - settings.use_distance_field_text = - compositor_deps->IsDistanceFieldTextEnabled(); settings.use_zero_copy = compositor_deps->IsZeroCopyEnabled(); settings.use_partial_raster = compositor_deps->IsPartialRasterEnabled(); settings.enable_elastic_overscroll =
diff --git a/content/renderer/media_capture_from_element/canvas_capture_handler.cc b/content/renderer/media_capture_from_element/canvas_capture_handler.cc index 1ae5b97e..19dadd25 100644 --- a/content/renderer/media_capture_from_element/canvas_capture_handler.cc +++ b/content/renderer/media_capture_from_element/canvas_capture_handler.cc
@@ -290,6 +290,7 @@ base::Bind(&CanvasCaptureHandler::OnARGBPixelsReadAsync, weak_ptr_factory_.GetWeakPtr(), image, temp_argb_frame, timestamp, surface_origin != kTopLeft_GrSurfaceOrigin)); + context_provider->InvalidateGrContext(kTextureBinding_GrGLBackendState); } void CanvasCaptureHandler::ReadYUVPixelsAsync( @@ -330,6 +331,8 @@ base::Bind(&CanvasCaptureHandler::OnYUVPixelsReadAsync, weak_ptr_factory_.GetWeakPtr(), image, output_frame, timestamp)); + context_provider->InvalidateGrContext( + viz::ReadbackYUVInterface::GetGrGLBackendStateChanges()); } void CanvasCaptureHandler::OnARGBPixelsReadAsync(
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc index fbe8b16c..a20432f7 100644 --- a/content/renderer/pepper/video_decoder_shim.cc +++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -40,6 +40,11 @@ namespace content { +static const uint32_t kGrInvalidateState = + kRenderTarget_GrGLBackendState | kTextureBinding_GrGLBackendState | + kView_GrGLBackendState | kVertex_GrGLBackendState | + kProgram_GrGLBackendState | kPixelStore_GrGLBackendState; + namespace { bool IsCodecSupported(media::VideoCodec codec) { @@ -350,6 +355,8 @@ gl_->TraceEndCHROMIUM(); + context_provider_->InvalidateGrContext(kGrInvalidateState); + return (program_ != 0); } @@ -580,6 +587,8 @@ gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, 0); gl_->TraceEndCHROMIUM(); + + context_provider_->InvalidateGrContext(kGrInvalidateState); } struct VideoDecoderShim::PendingDecode {
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc index 7f5e64c..b01a33f 100644 --- a/content/renderer/render_process_impl.cc +++ b/content/renderer/render_process_impl.cc
@@ -149,15 +149,15 @@ SetV8FlagIfNotFeature(features::kSharedArrayBuffer, "--no-harmony-sharedarraybuffer"); - SetV8FlagIfFeature(features::kWebAssemblyTrapHandler, "--wasm-trap-handler"); SetV8FlagIfNotFeature(features::kWebAssemblyTrapHandler, "--no-wasm-trap-handler"); SetV8FlagIfFeature(features::kArrayPrototypeValues, "--harmony-array-prototype-values"); SetV8FlagIfNotFeature(features::kArrayPrototypeValues, - "--no-harmony-array-prototype-values"); + "--no-harmony-array-prototype-values"); #if defined(OS_LINUX) && defined(ARCH_CPU_X86_64) && !defined(OS_ANDROID) if (base::FeatureList::IsEnabled(features::kWebAssemblyTrapHandler)) { + bool use_v8_signal_handler = false; base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (!command_line->HasSwitch( service_manager::switches::kDisableInProcessStackTraces)) { @@ -169,8 +169,9 @@ // in-process stack traces are disabled then there will be no signal // handler. In this case, we fall back on V8's default handler // (https://crbug.com/798150). - v8::V8::RegisterDefaultSignalHandler(); + use_v8_signal_handler = true; } + CHECK(v8::V8::EnableWebAssemblyTrapHandler(use_v8_signal_handler)); } #endif
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 501d0f7..bf0d8eb 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -363,7 +363,6 @@ bool support_gles2_interface, bool support_raster_interface, bool support_oop_rasterization, - bool support_grcontext, ui::command_buffer_metrics::ContextType type, int32_t stream_id, gpu::SchedulingPriority stream_priority) { @@ -401,7 +400,7 @@ stream_priority, gpu::kNullSurfaceHandle, GURL("chrome://gpu/RenderThreadImpl::CreateOffscreenContext/" + ui::command_buffer_metrics::ContextTypeToString(type)), - automatic_flushes, support_locking, support_grcontext, limits, attributes, + automatic_flushes, support_locking, limits, attributes, nullptr /* share_context */, type); } @@ -1009,14 +1008,6 @@ gpu_rasterization_msaa_sample_count_ = -1; } - if (command_line.HasSwitch(switches::kDisableDistanceFieldText)) { - is_distance_field_text_enabled_ = false; - } else if (command_line.HasSwitch(switches::kEnableDistanceFieldText)) { - is_distance_field_text_enabled_ = true; - } else { - is_distance_field_text_enabled_ = false; - } - // Note that under Linux, the media library will normally already have // been initialized by the Zygote before this instance became a Renderer. media::InitializeMediaLibrary(); @@ -1574,14 +1565,12 @@ bool support_gles2_interface = true; bool support_raster_interface = false; bool support_oop_rasterization = false; - bool support_grcontext = false; scoped_refptr<ui::ContextProviderCommandBuffer> media_context_provider = - CreateOffscreenContext(gpu_channel_host, GetGpuMemoryBufferManager(), - limits, support_locking, support_gles2_interface, - support_raster_interface, - support_oop_rasterization, support_grcontext, - ui::command_buffer_metrics::MEDIA_CONTEXT, - kGpuStreamIdMedia, kGpuStreamPriorityMedia); + CreateOffscreenContext( + gpu_channel_host, GetGpuMemoryBufferManager(), limits, + support_locking, support_gles2_interface, support_raster_interface, + support_oop_rasterization, ui::command_buffer_metrics::MEDIA_CONTEXT, + kGpuStreamIdMedia, kGpuStreamPriorityMedia); const bool enable_video_accelerator = !cmd_line->HasSwitch(switches::kDisableAcceleratedVideoDecode) && @@ -1631,11 +1620,10 @@ bool support_gles2_interface = true; bool support_raster_interface = false; bool support_oop_rasterization = false; - bool support_grcontext = true; shared_main_thread_contexts_ = CreateOffscreenContext( std::move(gpu_channel_host), GetGpuMemoryBufferManager(), gpu::SharedMemoryLimits(), support_locking, support_gles2_interface, - support_raster_interface, support_oop_rasterization, support_grcontext, + support_raster_interface, support_oop_rasterization, ui::command_buffer_metrics::RENDERER_MAINTHREAD_CONTEXT, kGpuStreamIdDefault, kGpuStreamPriorityDefault); auto result = shared_main_thread_contexts_->BindToCurrentThread(); @@ -1724,10 +1712,6 @@ return is_lcd_text_enabled_; } -bool RenderThreadImpl::IsDistanceFieldTextEnabled() { - return is_distance_field_text_enabled_; -} - bool RenderThreadImpl::IsZeroCopyEnabled() { return is_zero_copy_enabled_; } @@ -2192,14 +2176,13 @@ constexpr bool automatic_flushes = false; constexpr bool support_locking = false; - constexpr bool support_grcontext = false; scoped_refptr<ui::ContextProviderCommandBuffer> context_provider( new ui::ContextProviderCommandBuffer( gpu_channel_host, GetGpuMemoryBufferManager(), kGpuStreamIdDefault, kGpuStreamPriorityDefault, gpu::kNullSurfaceHandle, url, - automatic_flushes, support_locking, support_grcontext, limits, - attributes, nullptr /* share_context */, + automatic_flushes, support_locking, limits, attributes, + nullptr /* share_context */, ui::command_buffer_metrics::RENDER_COMPOSITOR_CONTEXT)); if (layout_test_deps_) { @@ -2523,11 +2506,10 @@ switches::kEnableOOPRasterization); bool support_gles2_interface = !support_oop_rasterization; bool support_raster_interface = true; - bool support_grcontext = !support_oop_rasterization; shared_worker_context_provider_ = CreateOffscreenContext( std::move(gpu_channel_host), GetGpuMemoryBufferManager(), gpu::SharedMemoryLimits(), support_locking, support_gles2_interface, - support_raster_interface, support_oop_rasterization, support_grcontext, + support_raster_interface, support_oop_rasterization, ui::command_buffer_metrics::RENDER_WORKER_CONTEXT, kGpuStreamIdWorker, kGpuStreamPriorityWorker); auto result = shared_worker_context_provider_->BindToCurrentThread();
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index 56957145..18f99a9f9 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h
@@ -250,7 +250,6 @@ bool IsGpuRasterizationForced() override; int GetGpuRasterizationMSAASampleCount() override; bool IsLcdTextEnabled() override; - bool IsDistanceFieldTextEnabled() override; bool IsZeroCopyEnabled() override; bool IsPartialRasterEnabled() override; bool IsGpuMemoryBufferCompositorResourcesEnabled() override; @@ -768,7 +767,6 @@ bool is_gpu_rasterization_forced_; int gpu_rasterization_msaa_sample_count_; bool is_lcd_text_enabled_; - bool is_distance_field_text_enabled_; bool is_zero_copy_enabled_; bool is_gpu_memory_buffer_compositor_resources_enabled_; bool is_partial_raster_enabled_;
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index 0e07efa..4ca3668 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -214,21 +214,6 @@ return blob_loader_factory; } -gpu::ContextType ToGpuContextType(blink::Platform::ContextType type) { - switch (type) { - case blink::Platform::kWebGL1ContextType: - return gpu::CONTEXT_TYPE_WEBGL1; - case blink::Platform::kWebGL2ContextType: - return gpu::CONTEXT_TYPE_WEBGL2; - case blink::Platform::kGLES2ContextType: - return gpu::CONTEXT_TYPE_OPENGLES2; - case blink::Platform::kGLES3ContextType: - return gpu::CONTEXT_TYPE_OPENGLES3; - } - NOTREACHED(); - return gpu::CONTEXT_TYPE_OPENGLES2; -} - } // namespace //------------------------------------------------------------------------------ @@ -1139,8 +1124,12 @@ attributes.fail_if_major_perf_caveat = web_attributes.fail_if_major_performance_caveat; - - attributes.context_type = ToGpuContextType(web_attributes.context_type); + DCHECK_GT(web_attributes.web_gl_version, 0u); + DCHECK_LE(web_attributes.web_gl_version, 2u); + if (web_attributes.web_gl_version == 2) + attributes.context_type = gpu::CONTEXT_TYPE_WEBGL2; + else + attributes.context_type = gpu::CONTEXT_TYPE_WEBGL1; constexpr bool automatic_flushes = true; constexpr bool support_locking = false; @@ -1151,8 +1140,8 @@ RenderThreadImpl::current()->GetGpuMemoryBufferManager(), kGpuStreamIdDefault, kGpuStreamPriorityDefault, gpu::kNullSurfaceHandle, GURL(top_document_web_url), - automatic_flushes, support_locking, web_attributes.support_grcontext, - gpu::SharedMemoryLimits(), attributes, share_context, + automatic_flushes, support_locking, gpu::SharedMemoryLimits(), + attributes, share_context, ui::command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_WEBGL)); return std::make_unique<WebGraphicsContext3DProviderImpl>( std::move(provider), is_software_rendering);
diff --git a/content/renderer/webgraphicscontext3d_provider_impl.cc b/content/renderer/webgraphicscontext3d_provider_impl.cc index f2b948d..466330b0 100644 --- a/content/renderer/webgraphicscontext3d_provider_impl.cc +++ b/content/renderer/webgraphicscontext3d_provider_impl.cc
@@ -38,6 +38,10 @@ return provider_->GrContext(); } +void WebGraphicsContext3DProviderImpl::InvalidateGrContext(uint32_t state) { + return provider_->InvalidateGrContext(state); +} + const gpu::Capabilities& WebGraphicsContext3DProviderImpl::GetCapabilities() const { return provider_->ContextCapabilities();
diff --git a/content/renderer/webgraphicscontext3d_provider_impl.h b/content/renderer/webgraphicscontext3d_provider_impl.h index 3495e6a3e..37998850 100644 --- a/content/renderer/webgraphicscontext3d_provider_impl.h +++ b/content/renderer/webgraphicscontext3d_provider_impl.h
@@ -44,6 +44,7 @@ bool BindToCurrentThread() override; gpu::gles2::GLES2Interface* ContextGL() override; GrContext* GetGrContext() override; + void InvalidateGrContext(uint32_t state) override; const gpu::Capabilities& GetCapabilities() const override; const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override; viz::GLHelper* GetGLHelper() override;
diff --git a/content/shell/test_runner/test_plugin.cc b/content/shell/test_runner/test_plugin.cc index a871303..40f876f 100644 --- a/content/shell/test_runner/test_plugin.cc +++ b/content/shell/test_runner/test_plugin.cc
@@ -173,6 +173,8 @@ container_ = container; blink::Platform::ContextAttributes attrs; + attrs.web_gl_version = + 1; // We are creating a context through the WebGL APIs. blink::WebURL url = container->GetDocument().Url(); blink::Platform::GraphicsInfo gl_info; context_provider_ =
diff --git a/content/test/fake_compositor_dependencies.cc b/content/test/fake_compositor_dependencies.cc index b1fa5f5..ef8ea08 100644 --- a/content/test/fake_compositor_dependencies.cc +++ b/content/test/fake_compositor_dependencies.cc
@@ -33,10 +33,6 @@ return false; } -bool FakeCompositorDependencies::IsDistanceFieldTextEnabled() { - return false; -} - bool FakeCompositorDependencies::IsZeroCopyEnabled() { return true; }
diff --git a/content/test/fake_compositor_dependencies.h b/content/test/fake_compositor_dependencies.h index dd7f325f..ea95e6a 100644 --- a/content/test/fake_compositor_dependencies.h +++ b/content/test/fake_compositor_dependencies.h
@@ -22,7 +22,6 @@ bool IsGpuRasterizationForced() override; int GetGpuRasterizationMSAASampleCount() override; bool IsLcdTextEnabled() override; - bool IsDistanceFieldTextEnabled() override; bool IsZeroCopyEnabled() override; bool IsPartialRasterEnabled() override; bool IsGpuMemoryBufferCompositorResourcesEnabled() override;
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py index d94bacb..0921860c 100755 --- a/content/test/gpu/generate_buildbot_json.py +++ b/content/test/gpu/generate_buildbot_json.py
@@ -1843,6 +1843,7 @@ '--test-launcher-bot-mode', '--test-launcher-jobs=1', '--gtest_filter=VrBrowserTest*', + '--enable-pixel-output-in-tests', '--gtest_also_run_disabled_tests', ], 'test': 'browser_tests',
diff --git a/content/test/gpu/gpu_tests/depth_capture_expectations.py b/content/test/gpu/gpu_tests/depth_capture_expectations.py index a63efaf7..d4ff0f9 100644 --- a/content/test/gpu/gpu_tests/depth_capture_expectations.py +++ b/content/test/gpu/gpu_tests/depth_capture_expectations.py
@@ -19,5 +19,7 @@ ['linux', ('nvidia', 0x104a)], bug=737410) self.Flaky('DepthCapture_depthStreamToRGBAUint8Texture', ['highsierra', ('amd', 0x6821)], bug=819661) + self.Flaky('DepthCapture_depthStreamToRGBAUint8Texture', + ['highsierra', ('intel', 0x0a2e)], bug=824438) self.Fail('DepthCapture_depthStreamToR32FloatTexture', ['android', ('qualcomm', 'Adreno (TM) 330')], bug=765913)
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py index ef0538f..4b86e332 100644 --- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py +++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -246,8 +246,6 @@ # Win / Intel self.Fail('conformance/rendering/rendering-stencil-large-viewport.html', ['win', 'intel', 'd3d11'], bug=782317) - self.Fail('conformance2/textures/misc/angle-stuck-depth-textures.html', - ['win', 'intel', 'd3d11'], bug=820419) # Seems to cause the harness to fail immediately afterward self.Skip('conformance2/textures/video/tex-2d-rgba16f-rgba-half_float.html',
diff --git a/content/test/layouttest_support.cc b/content/test/layouttest_support.cc index 1514eb96..c10abdd9 100644 --- a/content/test/layouttest_support.cc +++ b/content/test/layouttest_support.cc
@@ -381,7 +381,6 @@ attributes.lose_context_when_out_of_memory = true; const bool automatic_flushes = false; const bool support_locking = false; - const bool support_grcontext = true; auto context_provider = base::MakeRefCounted<ui::ContextProviderCommandBuffer>( @@ -389,8 +388,8 @@ kGpuStreamPriorityDefault, gpu::kNullSurfaceHandle, GURL("chrome://gpu/" "LayoutTestDependenciesImpl::CreateOutputSurface"), - automatic_flushes, support_locking, support_grcontext, - gpu::SharedMemoryLimits(), attributes, nullptr, + automatic_flushes, support_locking, gpu::SharedMemoryLimits(), + attributes, nullptr, ui::command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_TESTING); context_provider->BindToCurrentThread();
diff --git a/device/bluetooth/bluetooth_classic_win.cc b/device/bluetooth/bluetooth_classic_win.cc index b4e4eac56..e268093 100644 --- a/device/bluetooth/bluetooth_classic_win.cc +++ b/device/bluetooth/bluetooth_classic_win.cc
@@ -35,10 +35,17 @@ HBLUETOOTH_RADIO_FIND BluetoothClassicWrapper::FindFirstRadio( const BLUETOOTH_FIND_RADIO_PARAMS* params, HANDLE* out_handle) { - HANDLE radio_handle = NULL; + HANDLE radio_handle = INVALID_HANDLE_VALUE; HBLUETOOTH_RADIO_FIND radio_find_handle = BluetoothFindFirstRadio(params, &radio_handle); if (radio_find_handle) { + // TODO(crbug.com/820864): At some point, we crash when we attempt to close + // the handle. This and the related checks in this file are designed to + // see if our handle becomes garbage (i.e., "valid", but not closeable) at + // some point. + DWORD info; + CHECK(!base::win::HandleTraits::IsHandleValid(radio_handle) || + ::GetHandleInformation(radio_handle, &info)); opened_radio_handle_.Set(radio_handle); *out_handle = opened_radio_handle_.Get(); } @@ -48,7 +55,11 @@ DWORD BluetoothClassicWrapper::GetRadioInfo( HANDLE handle, PBLUETOOTH_RADIO_INFO out_radio_info) { - return BluetoothGetRadioInfo(handle, out_radio_info); + DWORD ret = BluetoothGetRadioInfo(handle, out_radio_info); + DWORD info; + // TODO(crbug.com/820864): Remove this check. + CHECK(::GetHandleInformation(handle, &info)); + return ret; } BOOL BluetoothClassicWrapper::FindRadioClose(HBLUETOOTH_RADIO_FIND handle) { @@ -56,7 +67,11 @@ } BOOL BluetoothClassicWrapper::IsConnectable(HANDLE handle) { - return BluetoothIsConnectable(handle); + DWORD ret = BluetoothIsConnectable(handle); + DWORD info; + // TODO(crbug.com/820864): Remove this check. + CHECK(::GetHandleInformation(handle, &info)); + return ret; } HBLUETOOTH_DEVICE_FIND BluetoothClassicWrapper::FindFirstDevice( @@ -76,12 +91,20 @@ } BOOL BluetoothClassicWrapper::EnableDiscovery(HANDLE handle, BOOL is_enable) { - return BluetoothEnableDiscovery(handle, is_enable); + DWORD ret = BluetoothEnableDiscovery(handle, is_enable); + DWORD info; + // TODO(crbug.com/820864): Remove this check. + CHECK(::GetHandleInformation(handle, &info)); + return ret; } BOOL BluetoothClassicWrapper::EnableIncomingConnections(HANDLE handle, BOOL is_enable) { - return BluetoothEnableIncomingConnections(handle, is_enable); + DWORD ret = BluetoothEnableIncomingConnections(handle, is_enable); + DWORD info; + // TODO(crbug.com/820864): Remove this check. + CHECK(::GetHandleInformation(handle, &info)); + return ret; } DWORD BluetoothClassicWrapper::LastError() {
diff --git a/device/vr/BUILD.gn b/device/vr/BUILD.gn index f624bbc..fd388e1 100644 --- a/device/vr/BUILD.gn +++ b/device/vr/BUILD.gn
@@ -183,6 +183,7 @@ sources = [ "openvr/test/fake_openvr_impl_api.cc", + "openvr/test/fake_openvr_log.h", ] libs = [
diff --git a/device/vr/openvr/test/fake_openvr_impl_api.cc b/device/vr/openvr/test/fake_openvr_impl_api.cc index d861603..144d193 100644 --- a/device/vr/openvr/test/fake_openvr_impl_api.cc +++ b/device/vr/openvr/test/fake_openvr_impl_api.cc
@@ -2,16 +2,111 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/debug/debugger.h" +#include "base/environment.h" +#include "base/files/file.h" #include "base/logging.h" +#include "base/strings/utf_string_conversions.h" +#include "base/threading/thread_restrictions.h" +#include "device/vr/openvr/test/fake_openvr_log.h" #include "third_party/openvr/src/headers/openvr.h" #include "third_party/openvr/src/src/ivrclientcore.h" #include <D3D11_1.h> #include <DXGI1_4.h> #include <wrl.h> +#include <memory> namespace vr { +class TestVRLogger { + public: + void Start() { + // Look for environment variable saying we should log data. + std::unique_ptr<base::Environment> env = base::Environment::Create(); + std::string log_filename; + if (env->GetVar(GetVrPixelLogEnvVarName(), &log_filename)) { + base::ScopedAllowBlockingForTesting allow_files; + log_file_ = std::make_unique<base::File>( + base::FilePath::FromUTF8Unsafe(log_filename), + base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | + base::File::FLAG_EXCLUSIVE_WRITE); + logging_ = log_file_->IsValid(); + } + } + + void Stop() { + base::ScopedAllowBlockingForTesting allow_files; + if (logging_) { + log_file_->Flush(); + log_file_->Close(); + log_file_ = nullptr; + } + logging_ = false; + } + + void OnPresentedFrame(ID3D11Texture2D* texture) { + if (!logging_) + return; + + VRSubmittedFrameEvent frame; + + Microsoft::WRL::ComPtr<ID3D11Device> device; + texture->GetDevice(&device); + + Microsoft::WRL::ComPtr<ID3D11DeviceContext> context; + device->GetImmediateContext(&context); + + // We copy the submitted texture to a new texture, so we can map it, and + // read back pixel data. + Microsoft::WRL::ComPtr<ID3D11Texture2D> texture_copy; + D3D11_TEXTURE2D_DESC desc; + texture->GetDesc(&desc); + desc.Width = 1; + desc.Height = 1; + desc.MiscFlags = 0; + desc.BindFlags = 0; + desc.Usage = D3D11_USAGE_STAGING; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture_copy); + if (FAILED(hr)) { + // We'll have invalid data in log (no frame data) so test will fail. + Stop(); + return; + } + + D3D11_BOX box = {0, 0, 0, 1, 1, 1}; // a 1-pixel box + context->CopySubresourceRegion(texture_copy.Get(), 0, 0, 0, 0, texture, 0, + &box); + + D3D11_MAPPED_SUBRESOURCE map_data = {}; + hr = context->Map(texture_copy.Get(), 0, D3D11_MAP_READ, 0, &map_data); + if (FAILED(hr)) { + // We'll have invalid data in log (no frame data) so test will fail. + Stop(); + return; + } + + VRSubmittedFrameEvent::Color* data = + reinterpret_cast<VRSubmittedFrameEvent::Color*>(map_data.pData); + frame.color = data[0]; // Save top-left pixel value. + context->Unmap(texture_copy.Get(), 0); + + WriteVRSubmittedFrameEvent(&frame); + Stop(); // For now only validate one pixel from first frame. + } + + private: + void WriteVRSubmittedFrameEvent(VRSubmittedFrameEvent* frame) { + base::ScopedAllowBlockingForTesting allow_files; + log_file_->WriteAtCurrentPos(reinterpret_cast<char*>(frame), + sizeof(*frame)); + } + + bool logging_ = false; + std::unique_ptr<base::File> log_file_; +}; + class TestVRSystem : public IVRSystem { public: void GetRecommendedRenderTargetSize(uint32_t* pnWidth, @@ -393,15 +488,19 @@ } }; +TestVRLogger g_logger; TestVRSystem g_system; TestVRCompositor g_compositor; TestVRClientCore g_loader; EVRInitError TestVRClientCore::Init(EVRApplicationType eApplicationType) { + g_logger.Start(); return VRInitError_None; } -void TestVRClientCore::Cleanup() {} +void TestVRClientCore::Cleanup() { + g_logger.Stop(); +} EVRInitError TestVRClientCore::IsInterfaceVersionValid( const char* pchInterfaceVersion) { @@ -564,9 +663,11 @@ } EVRCompositorError TestVRCompositor::Submit(EVREye, - Texture_t const*, + Texture_t const* texture, VRTextureBounds_t const*, EVRSubmitFlags) { + g_logger.OnPresentedFrame( + reinterpret_cast<ID3D11Texture2D*>(texture->handle)); return VRCompositorError_None; }
diff --git a/device/vr/openvr/test/fake_openvr_log.h b/device/vr/openvr/test/fake_openvr_log.h new file mode 100644 index 0000000..3800e229 --- /dev/null +++ b/device/vr/openvr/test/fake_openvr_log.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 DEVICE_VR_OPENVR_TEST_FAKE_OPENVR_LOG_H_ +#define DEVICE_VR_OPENVR_TEST_FAKE_OPENVR_LOG_H_ + +namespace vr { + +// We log instances of this structure when a frame is submitted. +// Tests can walk the log to validate things ran as expected. +struct VRSubmittedFrameEvent { + struct Color { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; + } color; +}; + +inline char* GetVrPixelLogEnvVarName() { + static char ret[] = "VR_MOCK_LOG_PATH"; + return ret; +} + +} // namespace vr + +#endif // DEVICE_VR_OPENVR_TEST_FAKE_OPENVR_LOG_H_ \ No newline at end of file
diff --git a/docs/security/sheriff.md b/docs/security/sheriff.md index e729fa0..dd62ae6 100644 --- a/docs/security/sheriff.md +++ b/docs/security/sheriff.md
@@ -110,6 +110,7 @@ **Restrict-View-Google** label * Change **Type-Bug-Security** label to **Type-Bug** * Add the **Security** component + * See below for reporting URLs to SafeBrowsing * **If the report is a potentially valid bug but is not a security vulnerability:** * remove the **Restrict-View-SecurityTeam** label. If necessary, add one of the other **Restrict-View-?** labels: @@ -188,11 +189,11 @@ **Ensure the comment adequately explains any status changes.** Severity, milestone, and priority assignment generally require explanatory text. -* Report suspected malicious URLs to SafeBrowsing. +* Report suspected malicious URLs to SafeBrowsing: * Public URL: - [https://www.google.com/safebrowsing/report_badware/](https://www.google.com/safebrowsing/report_badware/) - * Googlers: see instructions at [go/report-safe-browsing](go/report-safe-browsing) -* Report suspected malicious file attachments to SafeBrowsing and VirusTotal. + [https://support.google.com/websearch/contact/safe_browsing](https://support.google.com/websearch/contact/safe_browsing) + * Googlers: see instructions at [go/safebrowsing-escalation](https://goto.google.com/safebrowsing-escalation) + * Report suspected malicious file attachments to SafeBrowsing and VirusTotal. * Make sure the report is properly forwarded when the vulnerability is in an upstream project, the OS, or some other dependency. * For vulnerabilities in services Chrome uses (e.g. Omaha, Chrome Web Store,
diff --git a/docs/speed/benchmark_harnesses/telemetry_device_setup.md b/docs/speed/benchmark_harnesses/telemetry_device_setup.md index 0983a2f..7479ccb 100644 --- a/docs/speed/benchmark_harnesses/telemetry_device_setup.md +++ b/docs/speed/benchmark_harnesses/telemetry_device_setup.md
@@ -4,16 +4,18 @@ ## Install extra python dependencies -Telemetry depends on pustil version 2.6+. Make sure that you install psutil -first. - -If you only use Telemetry through tools/perf/run_benchmark script, -vpython should already automatically install all the required deps for you. e.g: +If you only use Telemetry through `tools/perf/run_benchmark` script, +`vpython` should already automatically install all the required deps for you, +e.g: ``` $ tools/perf/run_benchmark --browser=system dummy_benchmark.noisy_benchmark_1 ``` +Otherwise have a look at the required catapult dependencies listed in the +[.vpython](https://chromium.googlesource.com/chromium/src/+/master/.vpython) +spec file. + ## Desktop benchmarks ### Mac, Windows, Linux @@ -37,7 +39,7 @@ To run Telemetry Android benchmarks, you need a host machine and an Android device attached to the host machine through USB. -**WARNING:** it’s highly recommended that you don’t use your personal Android device +> **WARNING:** it’s highly recommended that you don’t use your personal Android device for this. Some of the steps below will wipe out the phone completely. **Host machine:** we only support Linux Ubuntu as the host. @@ -57,14 +59,13 @@ export CATAPULT=$CHROMIUM_SRC/third_party/catapult $CATAPULT/devil/devil/android/tools/provision_devices.py --disable-network --disable-java-debug ``` -* Use one of the supported [`--browser` names](https://github.com/catapult-project/catapult/blob/02ec794ca7c836a14e6d6054e4e337d1ea3acd6f/telemetry/telemetry/internal/backends/chrome/android_browser_finder.py#L30) + If you are planning to test WebView on Android M or lower also add + `--remove-system-webview` to this command, otherwise Telemetry will + have trouble installing the required APKs. This should take care of + everything, but see [build instructions for WebView](https://www.chromium.org/developers/how-tos/build-instructions-android-webview) + if you run into problems. +* Finally, use one of the supported [`--browser` types](https://github.com/catapult-project/catapult/blob/d5b0db081b74c717effa1080ca06c4f679136b73/telemetry/telemetry/internal/backends/android_browser_backend_settings.py#L150) on your - [run_benchmark](https://cs.chromium.org/chromium/src/tools/perf/run_benchmark) - or [run_tests](https://cs.chromium.org/chromium/src/tools/perf/run_tests) + [`run_benchmark`](https://cs.chromium.org/chromium/src/tools/perf/run_benchmark) + or [`run_tests`](https://cs.chromium.org/chromium/src/tools/perf/run_tests) command. -* Running benchmarks on WebView? - 1. Add `--remove-system-webview` on the provision devices command above. - 2. Make sure to [build, install, and enable](https://www.chromium.org/developers/how-tos/build-instructions-android-webview) - the right WebView apk for your Android build. Also always install - SystemWebViewShell.apk. - 3. Use `--browser=android-webview` in the `run_benchmark` command.
diff --git a/gpu/command_buffer/client/context_support.h b/gpu/command_buffer/client/context_support.h index 55d9468..5f78198 100644 --- a/gpu/command_buffer/client/context_support.h +++ b/gpu/command_buffer/client/context_support.h
@@ -11,8 +11,6 @@ #include "base/callback.h" #include "ui/gfx/overlay_transform.h" -class GrContext; - namespace gfx { class GpuFence; class Rect; @@ -117,19 +115,6 @@ virtual unsigned int GetTransferBufferFreeSize() const = 0; - // Returns true if the context provider automatically manages calls to - // GrContext::resetContext under the hood to prevent GL state synchronization - // problems between the GLES2 interface and skia. - virtual bool HasGrContextSupport() const = 0; - - // Sets the GrContext that is to receive resetContext signals when the GL - // state is modified via direct calls to the GLES2 interface. - virtual void SetGrContext(GrContext* gr) = 0; - - virtual void WillCallGLFromSkia() = 0; - - virtual void DidCallGLFromSkia() = 0; - protected: ContextSupport() = default; virtual ~ContextSupport() = default;
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h index 562bf272..279026e 100644 --- a/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1766,12 +1766,11 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) { gles2::GetGLContext()->BeginRasterCHROMIUM( - texture_id, sk_color, msaa_sample_count, can_use_lcd_text, - use_distance_field_text, color_type, color_space_transfer_cache_id); + texture_id, sk_color, msaa_sample_count, can_use_lcd_text, color_type, + color_space_transfer_cache_id); } void* GL_APIENTRY GLES2MapRasterCHROMIUM(GLsizeiptr size) { return gles2::GetGLContext()->MapRasterCHROMIUM(size);
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h index 853b7b0..44b08e7 100644 --- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -3264,14 +3264,13 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) { gles2::cmds::BeginRasterCHROMIUM* c = GetCmdSpace<gles2::cmds::BeginRasterCHROMIUM>(); if (c) { c->Init(texture_id, sk_color, msaa_sample_count, can_use_lcd_text, - use_distance_field_text, color_type, color_space_transfer_cache_id); + color_type, color_space_transfer_cache_id); } }
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h index 97089ca..0120360 100644 --- a/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -1241,7 +1241,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) override;
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h index 9641e07..cffa0340 100644 --- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -3578,19 +3578,17 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG( "[" << GetLogPrefix() << "] glBeginRasterCHROMIUM(" << texture_id << ", " << sk_color << ", " << msaa_sample_count << ", " - << GLES2Util::GetStringBool(can_use_lcd_text) << ", " - << GLES2Util::GetStringBool(use_distance_field_text) << ", " - << color_type << ", " << color_space_transfer_cache_id << ")"); + << GLES2Util::GetStringBool(can_use_lcd_text) << ", " << color_type + << ", " << color_space_transfer_cache_id << ")"); helper_->BeginRasterCHROMIUM(texture_id, sk_color, msaa_sample_count, - can_use_lcd_text, use_distance_field_text, - color_type, color_space_transfer_cache_id); + can_use_lcd_text, color_type, + color_space_transfer_cache_id); CheckGLError(); }
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h index 61e1ec9..f73cba23 100644 --- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -3087,9 +3087,9 @@ cmds::BeginRasterCHROMIUM cmd; }; Cmds expected; - expected.cmd.Init(1, 2, 3, true, true, 6, 7); + expected.cmd.Init(1, 2, 3, true, 5, 6); - gl_->BeginRasterCHROMIUM(1, 2, 3, true, true, 6, 7); + gl_->BeginRasterCHROMIUM(1, 2, 3, true, 5, 6); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); }
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h index 89d36c8..878e010 100644 --- a/gpu/command_buffer/client/gles2_interface_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -923,7 +923,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) = 0; virtual void* MapRasterCHROMIUM(GLsizeiptr size) = 0;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h index e838c03..26ce223 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -896,7 +896,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) override; void* MapRasterCHROMIUM(GLsizeiptr size) override;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h index cc76b5c..e89c1a5 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -1204,7 +1204,6 @@ GLuint /* sk_color */, GLuint /* msaa_sample_count */, GLboolean /* can_use_lcd_text */, - GLboolean /* use_distance_field_text */, GLint /* color_type */, GLuint /* color_space_transfer_cache_id */) {} void* GLES2InterfaceStub::MapRasterCHROMIUM(GLsizeiptr /* size */) {
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h index 05d52db..19004c5 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -896,7 +896,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) override; void* MapRasterCHROMIUM(GLsizeiptr size) override;
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h index be6855d..2afc896f 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -2568,13 +2568,12 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BeginRasterCHROMIUM"); gl_->BeginRasterCHROMIUM(texture_id, sk_color, msaa_sample_count, - can_use_lcd_text, use_distance_field_text, - color_type, color_space_transfer_cache_id); + can_use_lcd_text, color_type, + color_space_transfer_cache_id); } void* GLES2TraceImplementation::MapRasterCHROMIUM(GLsizeiptr size) {
diff --git a/gpu/command_buffer/client/implementation_base.cc b/gpu/command_buffer/client/implementation_base.cc index 06678ce..8e3a4f0 100644 --- a/gpu/command_buffer/client/implementation_base.cc +++ b/gpu/command_buffer/client/implementation_base.cc
@@ -338,20 +338,4 @@ } } -void ImplementationBase::SetGrContext(GrContext* gr) {} - -bool ImplementationBase::HasGrContextSupport() const { - return false; -} - -void ImplementationBase::WillCallGLFromSkia() { - // Should only be called on subclasses that have GrContextSupport - NOTREACHED(); -} - -void ImplementationBase::DidCallGLFromSkia() { - // Should only be called on subclasses that have GrContextSupport - NOTREACHED(); -} - } // namespace gpu
diff --git a/gpu/command_buffer/client/implementation_base.h b/gpu/command_buffer/client/implementation_base.h index 81ca9c5..aee0048 100644 --- a/gpu/command_buffer/client/implementation_base.h +++ b/gpu/command_buffer/client/implementation_base.h
@@ -91,10 +91,6 @@ const std::vector<std::pair<uint32_t, uint32_t>>& entries) override; void DeleteTransferCacheEntry(uint32_t type, uint32_t id) override; unsigned int GetTransferBufferFreeSize() const override; - void SetGrContext(GrContext* gr) override; - bool HasGrContextSupport() const override; - void WillCallGLFromSkia() override; - void DidCallGLFromSkia() override; // base::trace_event::MemoryDumpProvider implementation. bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
diff --git a/gpu/command_buffer/client/raster_cmd_helper_autogen.h b/gpu/command_buffer/client/raster_cmd_helper_autogen.h index 1780e6c6..6d44b1c 100644 --- a/gpu/command_buffer/client/raster_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/raster_cmd_helper_autogen.h
@@ -164,13 +164,12 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type) { raster::cmds::BeginRasterCHROMIUM* c = GetCmdSpace<raster::cmds::BeginRasterCHROMIUM>(); if (c) { c->Init(texture_id, sk_color, msaa_sample_count, can_use_lcd_text, - use_distance_field_text, color_type); + color_type); } }
diff --git a/gpu/command_buffer/client/raster_implementation.cc b/gpu/command_buffer/client/raster_implementation.cc index 71b0000..8ba25ae4 100644 --- a/gpu/command_buffer/client/raster_implementation.cc +++ b/gpu/command_buffer/client/raster_implementation.cc
@@ -947,7 +947,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint pixel_config, const cc::RasterColorSpace& raster_color_space) { NOTIMPLEMENTED();
diff --git a/gpu/command_buffer/client/raster_implementation.h b/gpu/command_buffer/client/raster_implementation.h index e7698f35..90e425b0 100644 --- a/gpu/command_buffer/client/raster_implementation.h +++ b/gpu/command_buffer/client/raster_implementation.h
@@ -104,7 +104,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint pixel_config, const cc::RasterColorSpace& raster_color_space) override; void RasterCHROMIUM(const cc::DisplayItemList* list,
diff --git a/gpu/command_buffer/client/raster_implementation_gles.cc b/gpu/command_buffer/client/raster_implementation_gles.cc index ff39b915..5a388913 100644 --- a/gpu/command_buffer/client/raster_implementation_gles.cc +++ b/gpu/command_buffer/client/raster_implementation_gles.cc
@@ -430,7 +430,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, const cc::RasterColorSpace& raster_color_space) { TransferCacheSerializeHelperImpl transfer_cache_serialize_helper(support_); @@ -446,8 +445,8 @@ Texture* texture = GetTexture(texture_id); gl_->BeginRasterCHROMIUM(texture->id, sk_color, msaa_sample_count, - can_use_lcd_text, use_distance_field_text, - color_type, raster_color_space.color_space_id); + can_use_lcd_text, color_type, + raster_color_space.color_space_id); transfer_cache_serialize_helper.FlushEntries(); background_color_ = sk_color; };
diff --git a/gpu/command_buffer/client/raster_implementation_gles.h b/gpu/command_buffer/client/raster_implementation_gles.h index cf26d477..d6a4f2ba 100644 --- a/gpu/command_buffer/client/raster_implementation_gles.h +++ b/gpu/command_buffer/client/raster_implementation_gles.h
@@ -115,7 +115,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, const cc::RasterColorSpace& raster_color_space) override; void RasterCHROMIUM(const cc::DisplayItemList* list,
diff --git a/gpu/command_buffer/client/raster_implementation_gles_unittest.cc b/gpu/command_buffer/client/raster_implementation_gles_unittest.cc index c282eb7..54d1a7e 100644 --- a/gpu/command_buffer/client/raster_implementation_gles_unittest.cc +++ b/gpu/command_buffer/client/raster_implementation_gles_unittest.cc
@@ -140,12 +140,11 @@ MOCK_METHOD1(LockDiscardableTextureCHROMIUM, bool(GLuint texture_id)); // OOP-Raster - MOCK_METHOD7(BeginRasterCHROMIUM, + MOCK_METHOD6(BeginRasterCHROMIUM, void(GLuint texture_id, GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_id)); MOCK_METHOD2(RasterCHROMIUM, void(GLsizeiptr size, const void* list)); @@ -212,10 +211,6 @@ const std::vector<std::pair<uint32_t, uint32_t>>& entries) override {} void DeleteTransferCacheEntry(uint32_t type, uint32_t id) override {} unsigned int GetTransferBufferFreeSize() const override { return 0; } - bool HasGrContextSupport() const override { return false; } - void SetGrContext(GrContext* gr) override {} - void WillCallGLFromSkia() override {} - void DidCallGLFromSkia() override {} private: std::unique_ptr<char[]> mapped_transfer_cache_entry_; @@ -670,7 +665,6 @@ const GLuint sk_color = 0x226688AAu; const GLuint msaa_sample_count = 4; const GLboolean can_use_lcd_text = GL_TRUE; - const GLboolean use_distance_field_text = GL_FALSE; const GLint color_type = kRGBA_8888_SkColorType; const auto raster_color_space = cc::RasterColorSpace(gfx::ColorSpace::CreateSRGB(), 2); @@ -678,12 +672,10 @@ AllocTextureId(false, gfx::BufferUsage::GPU_READ, viz::RGBA_8888, texture_id); EXPECT_CALL(*gl_, BeginRasterCHROMIUM(texture_id, sk_color, msaa_sample_count, - can_use_lcd_text, - use_distance_field_text, color_type, 2)) + can_use_lcd_text, color_type, 2)) .Times(1); ri_->BeginRasterCHROMIUM(texture_id, sk_color, msaa_sample_count, - can_use_lcd_text, use_distance_field_text, - color_type, raster_color_space); + can_use_lcd_text, color_type, raster_color_space); } TEST_F(RasterImplementationGLESTest, RasterCHROMIUM) {
diff --git a/gpu/command_buffer/client/raster_interface.h b/gpu/command_buffer/client/raster_interface.h index 7b4e8ac..a38bbbce 100644 --- a/gpu/command_buffer/client/raster_interface.h +++ b/gpu/command_buffer/client/raster_interface.h
@@ -41,7 +41,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint pixel_config, const cc::RasterColorSpace& raster_color_space) = 0; virtual void RasterCHROMIUM(const cc::DisplayItemList* list,
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h index 536fafa..740e6e8 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -16043,7 +16043,6 @@ GLuint _sk_color, GLuint _msaa_sample_count, GLboolean _can_use_lcd_text, - GLboolean _use_distance_field_text, GLint _color_type, GLuint _color_space_transfer_cache_id) { SetHeader(); @@ -16051,7 +16050,6 @@ sk_color = _sk_color; msaa_sample_count = _msaa_sample_count; can_use_lcd_text = _can_use_lcd_text; - use_distance_field_text = _use_distance_field_text; color_type = _color_type; color_space_transfer_cache_id = _color_space_transfer_cache_id; } @@ -16061,12 +16059,11 @@ GLuint _sk_color, GLuint _msaa_sample_count, GLboolean _can_use_lcd_text, - GLboolean _use_distance_field_text, GLint _color_type, GLuint _color_space_transfer_cache_id) { static_cast<ValueType*>(cmd)->Init( _texture_id, _sk_color, _msaa_sample_count, _can_use_lcd_text, - _use_distance_field_text, _color_type, _color_space_transfer_cache_id); + _color_type, _color_space_transfer_cache_id); return NextCmdAddress<ValueType>(cmd); } @@ -16075,13 +16072,12 @@ uint32_t sk_color; uint32_t msaa_sample_count; uint32_t can_use_lcd_text; - uint32_t use_distance_field_text; int32_t color_type; uint32_t color_space_transfer_cache_id; }; -static_assert(sizeof(BeginRasterCHROMIUM) == 32, - "size of BeginRasterCHROMIUM should be 32"); +static_assert(sizeof(BeginRasterCHROMIUM) == 28, + "size of BeginRasterCHROMIUM should be 28"); static_assert(offsetof(BeginRasterCHROMIUM, header) == 0, "offset of BeginRasterCHROMIUM header should be 0"); static_assert(offsetof(BeginRasterCHROMIUM, texture_id) == 4, @@ -16092,14 +16088,11 @@ "offset of BeginRasterCHROMIUM msaa_sample_count should be 12"); static_assert(offsetof(BeginRasterCHROMIUM, can_use_lcd_text) == 16, "offset of BeginRasterCHROMIUM can_use_lcd_text should be 16"); +static_assert(offsetof(BeginRasterCHROMIUM, color_type) == 20, + "offset of BeginRasterCHROMIUM color_type should be 20"); static_assert( - offsetof(BeginRasterCHROMIUM, use_distance_field_text) == 20, - "offset of BeginRasterCHROMIUM use_distance_field_text should be 20"); -static_assert(offsetof(BeginRasterCHROMIUM, color_type) == 24, - "offset of BeginRasterCHROMIUM color_type should be 24"); -static_assert( - offsetof(BeginRasterCHROMIUM, color_space_transfer_cache_id) == 28, - "offset of BeginRasterCHROMIUM color_space_transfer_cache_id should be 28"); + offsetof(BeginRasterCHROMIUM, color_space_transfer_cache_id) == 24, + "offset of BeginRasterCHROMIUM color_space_transfer_cache_id should be 24"); struct RasterCHROMIUM { typedef RasterCHROMIUM ValueType;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h index 2614e34..5450bbf 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -5327,8 +5327,7 @@ void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLuint>(12), static_cast<GLuint>(13), static_cast<GLboolean>(14), - static_cast<GLboolean>(15), static_cast<GLint>(16), - static_cast<GLuint>(17)); + static_cast<GLint>(15), static_cast<GLuint>(16)); EXPECT_EQ(static_cast<uint32_t>(cmds::BeginRasterCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); @@ -5336,9 +5335,8 @@ EXPECT_EQ(static_cast<GLuint>(12), cmd.sk_color); EXPECT_EQ(static_cast<GLuint>(13), cmd.msaa_sample_count); EXPECT_EQ(static_cast<GLboolean>(14), cmd.can_use_lcd_text); - EXPECT_EQ(static_cast<GLboolean>(15), cmd.use_distance_field_text); - EXPECT_EQ(static_cast<GLint>(16), cmd.color_type); - EXPECT_EQ(static_cast<GLuint>(17), cmd.color_space_transfer_cache_id); + EXPECT_EQ(static_cast<GLint>(15), cmd.color_type); + EXPECT_EQ(static_cast<GLuint>(16), cmd.color_space_transfer_cache_id); CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); }
diff --git a/gpu/command_buffer/common/raster_cmd_format_autogen.h b/gpu/command_buffer/common/raster_cmd_format_autogen.h index 77363176..a61fd62 100644 --- a/gpu/command_buffer/common/raster_cmd_format_autogen.h +++ b/gpu/command_buffer/common/raster_cmd_format_autogen.h
@@ -754,14 +754,12 @@ GLuint _sk_color, GLuint _msaa_sample_count, GLboolean _can_use_lcd_text, - GLboolean _use_distance_field_text, GLint _color_type) { SetHeader(); texture_id = _texture_id; sk_color = _sk_color; msaa_sample_count = _msaa_sample_count; can_use_lcd_text = _can_use_lcd_text; - use_distance_field_text = _use_distance_field_text; color_type = _color_type; } @@ -770,11 +768,10 @@ GLuint _sk_color, GLuint _msaa_sample_count, GLboolean _can_use_lcd_text, - GLboolean _use_distance_field_text, GLint _color_type) { static_cast<ValueType*>(cmd)->Init(_texture_id, _sk_color, _msaa_sample_count, _can_use_lcd_text, - _use_distance_field_text, _color_type); + _color_type); return NextCmdAddress<ValueType>(cmd); } @@ -783,12 +780,11 @@ uint32_t sk_color; uint32_t msaa_sample_count; uint32_t can_use_lcd_text; - uint32_t use_distance_field_text; int32_t color_type; }; -static_assert(sizeof(BeginRasterCHROMIUM) == 28, - "size of BeginRasterCHROMIUM should be 28"); +static_assert(sizeof(BeginRasterCHROMIUM) == 24, + "size of BeginRasterCHROMIUM should be 24"); static_assert(offsetof(BeginRasterCHROMIUM, header) == 0, "offset of BeginRasterCHROMIUM header should be 0"); static_assert(offsetof(BeginRasterCHROMIUM, texture_id) == 4, @@ -799,11 +795,8 @@ "offset of BeginRasterCHROMIUM msaa_sample_count should be 12"); static_assert(offsetof(BeginRasterCHROMIUM, can_use_lcd_text) == 16, "offset of BeginRasterCHROMIUM can_use_lcd_text should be 16"); -static_assert( - offsetof(BeginRasterCHROMIUM, use_distance_field_text) == 20, - "offset of BeginRasterCHROMIUM use_distance_field_text should be 20"); -static_assert(offsetof(BeginRasterCHROMIUM, color_type) == 24, - "offset of BeginRasterCHROMIUM color_type should be 24"); +static_assert(offsetof(BeginRasterCHROMIUM, color_type) == 20, + "offset of BeginRasterCHROMIUM color_type should be 20"); struct RasterCHROMIUM { typedef RasterCHROMIUM ValueType;
diff --git a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h index dee15e96..83b70e1 100644 --- a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h
@@ -248,10 +248,9 @@ TEST_F(RasterFormatTest, BeginRasterCHROMIUM) { cmds::BeginRasterCHROMIUM& cmd = *GetBufferAs<cmds::BeginRasterCHROMIUM>(); - void* next_cmd = - cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLuint>(12), - static_cast<GLuint>(13), static_cast<GLboolean>(14), - static_cast<GLboolean>(15), static_cast<GLint>(16)); + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), + static_cast<GLuint>(12), static_cast<GLuint>(13), + static_cast<GLboolean>(14), static_cast<GLint>(15)); EXPECT_EQ(static_cast<uint32_t>(cmds::BeginRasterCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); @@ -259,8 +258,7 @@ EXPECT_EQ(static_cast<GLuint>(12), cmd.sk_color); EXPECT_EQ(static_cast<GLuint>(13), cmd.msaa_sample_count); EXPECT_EQ(static_cast<GLboolean>(14), cmd.can_use_lcd_text); - EXPECT_EQ(static_cast<GLboolean>(15), cmd.use_distance_field_text); - EXPECT_EQ(static_cast<GLint>(16), cmd.color_type); + EXPECT_EQ(static_cast<GLint>(15), cmd.color_type); CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); }
diff --git a/gpu/command_buffer/gles2_cmd_buffer_functions.txt b/gpu/command_buffer/gles2_cmd_buffer_functions.txt index 345eca7..d7dd11c 100644 --- a/gpu/command_buffer/gles2_cmd_buffer_functions.txt +++ b/gpu/command_buffer/gles2_cmd_buffer_functions.txt
@@ -377,7 +377,7 @@ GL_APICALL bool GL_APIENTRY glLockDiscardableTextureCHROMIUM (GLuint texture_id); // Extension CHROMIUM_raster_transport -GL_APICALL void GL_APIENTRY glBeginRasterCHROMIUM (GLuint texture_id, GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id); +GL_APICALL void GL_APIENTRY glBeginRasterCHROMIUM (GLuint texture_id, GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, GLint color_type, GLuint color_space_transfer_cache_id); GL_APICALL void GL_APIENTRY glRasterCHROMIUM (GLsizeiptr size, const void* list); GL_APICALL void* GL_APIENTRY glMapRasterCHROMIUM (GLsizeiptr size); GL_APICALL void GL_APIENTRY glUnmapRasterCHROMIUM (GLsizeiptr written_size);
diff --git a/gpu/command_buffer/raster_cmd_buffer_functions.txt b/gpu/command_buffer/raster_cmd_buffer_functions.txt index 5bccf7a..b496b56 100644 --- a/gpu/command_buffer/raster_cmd_buffer_functions.txt +++ b/gpu/command_buffer/raster_cmd_buffer_functions.txt
@@ -38,7 +38,7 @@ GL_APICALL bool GL_APIENTRY glLockDiscardableTextureCHROMIUM (GLuint texture_id); // Extension CHROMIUM_raster_transport -GL_APICALL void GL_APIENTRY glBeginRasterCHROMIUM (GLuint texture_id, GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, GLboolean use_distance_field_text, GLint color_type); +GL_APICALL void GL_APIENTRY glBeginRasterCHROMIUM (GLuint texture_id, GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, GLint color_type); GL_APICALL void GL_APIENTRY glRasterCHROMIUM (GLsizeiptr size, const void* list); GL_APICALL void GL_APIENTRY glEndRasterCHROMIUM (void); GL_APICALL void GL_APIENTRY glCreateTransferCacheEntryINTERNAL (GLuint entry_type, GLuint entry_id, GLuint handle_shm_id, GLuint handle_shm_offset, GLuint data_shm_id, GLuint data_shm_offset, GLuint data_size);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 0f77855..5f736e5 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -2020,7 +2020,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id); void DoRasterCHROMIUM(GLsizeiptr size, const void* list); @@ -20384,7 +20383,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) { if (!gr_context_) { @@ -20477,8 +20475,8 @@ GrBackendTexture gr_texture(width, height, GrMipMapped::kNo, texture_info); - uint32_t flags = - use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0; + uint32_t flags = 0; + // Use unknown pixel geometry to disable LCD text. SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); if (can_use_lcd_text) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index 821d21f..a51e3c0 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -5169,13 +5169,11 @@ GLuint sk_color = static_cast<GLuint>(c.sk_color); GLuint msaa_sample_count = static_cast<GLuint>(c.msaa_sample_count); GLboolean can_use_lcd_text = static_cast<GLboolean>(c.can_use_lcd_text); - GLboolean use_distance_field_text = - static_cast<GLboolean>(c.use_distance_field_text); GLint color_type = static_cast<GLint>(c.color_type); GLuint color_space_transfer_cache_id = static_cast<GLuint>(c.color_space_transfer_cache_id); DoBeginRasterCHROMIUM(texture_id, sk_color, msaa_sample_count, - can_use_lcd_text, use_distance_field_text, color_type, + can_use_lcd_text, color_type, color_space_transfer_cache_id); return error::kNoError; }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h index cf023a6..2078fe7 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
@@ -1009,7 +1009,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id); error::Error DoRasterCHROMIUM(GLsizeiptr size, const void* list);
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 82dff6c..647bb39b 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -4650,7 +4650,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type, GLuint color_space_transfer_cache_id) { NOTIMPLEMENTED();
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc index 81b057e1..d167a1f 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -4551,14 +4551,12 @@ GLuint sk_color = static_cast<GLuint>(c.sk_color); GLuint msaa_sample_count = static_cast<GLuint>(c.msaa_sample_count); GLboolean can_use_lcd_text = static_cast<GLboolean>(c.can_use_lcd_text); - GLboolean use_distance_field_text = - static_cast<GLboolean>(c.use_distance_field_text); GLint color_type = static_cast<GLint>(c.color_type); GLuint color_space_transfer_cache_id = static_cast<GLuint>(c.color_space_transfer_cache_id); error::Error error = DoBeginRasterCHROMIUM( - texture_id, sk_color, msaa_sample_count, can_use_lcd_text, - use_distance_field_text, color_type, color_space_transfer_cache_id); + texture_id, sk_color, msaa_sample_count, can_use_lcd_text, color_type, + color_space_transfer_cache_id); if (error != error::kNoError) { return error; }
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index c4eb47c..06eccef6 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -303,7 +303,6 @@ GLuint sk_color, GLuint msaa_sample_count, GLboolean can_use_lcd_text, - GLboolean use_distance_field_text, GLint color_type) { NOTIMPLEMENTED(); }
diff --git a/gpu/command_buffer/service/raster_decoder_autogen.h b/gpu/command_buffer/service/raster_decoder_autogen.h index fccd84b..516780a8 100644 --- a/gpu/command_buffer/service/raster_decoder_autogen.h +++ b/gpu/command_buffer/service/raster_decoder_autogen.h
@@ -207,11 +207,9 @@ GLuint sk_color = static_cast<GLuint>(c.sk_color); GLuint msaa_sample_count = static_cast<GLuint>(c.msaa_sample_count); GLboolean can_use_lcd_text = static_cast<GLboolean>(c.can_use_lcd_text); - GLboolean use_distance_field_text = - static_cast<GLboolean>(c.use_distance_field_text); GLint color_type = static_cast<GLint>(c.color_type); DoBeginRasterCHROMIUM(texture_id, sk_color, msaa_sample_count, - can_use_lcd_text, use_distance_field_text, color_type); + can_use_lcd_text, color_type); return error::kNoError; }
diff --git a/gpu/command_buffer/service/sync_point_manager.cc b/gpu/command_buffer/service/sync_point_manager.cc index 7fdf99e..ac08111 100644 --- a/gpu/command_buffer/service/sync_point_manager.cc +++ b/gpu/command_buffer/service/sync_point_manager.cc
@@ -133,7 +133,6 @@ } for (OrderFence& order_fence : ensure_releases) { - DLOG(ERROR) << "Client did not release sync token as expected"; order_fence.client_state->EnsureWaitReleased(order_fence.fence_release, order_fence.release_callback); } @@ -156,7 +155,6 @@ // We should have an unprocessed order number lower than the wait order // number for the wait to be valid. It's not possible for wait order number to // equal next unprocessed order number, but we handle that defensively. - DCHECK_NE(wait_order_num, unprocessed_order_nums_.front()); if (wait_order_num <= unprocessed_order_nums_.front()) return false; @@ -309,6 +307,7 @@ if (call_callback) { // This effectively releases the wait without releasing the fence. + DLOG(ERROR) << "Client did not release sync token as expected"; callback.Run(); } }
diff --git a/gpu/ipc/BUILD.gn b/gpu/ipc/BUILD.gn index 50e33a6..aec82e98 100644 --- a/gpu/ipc/BUILD.gn +++ b/gpu/ipc/BUILD.gn
@@ -35,7 +35,6 @@ "//gpu/config", "//gpu/ipc/client", "//gpu/ipc/service", - "//gpu/skia_bindings:skia_bindings", "//ui/gfx", "//ui/gfx/geometry", "//ui/gl",
diff --git a/gpu/ipc/gl_in_process_context.cc b/gpu/ipc/gl_in_process_context.cc index 572de973..16db1ed 100644 --- a/gpu/ipc/gl_in_process_context.cc +++ b/gpu/ipc/gl_in_process_context.cc
@@ -28,12 +28,12 @@ #include "base/message_loop/message_loop.h" #include "base/threading/thread_task_runner_handle.h" #include "gpu/command_buffer/client/gles2_cmd_helper.h" +#include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/client/shared_memory_limits.h" #include "gpu/command_buffer/client/transfer_buffer.h" #include "gpu/command_buffer/common/command_buffer.h" #include "gpu/command_buffer/common/constants.h" #include "gpu/config/gpu_feature_info.h" -#include "gpu/skia_bindings/gles2_implementation_with_grcontext_support.h" #include "ui/gfx/geometry/size.h" #include "ui/gl/gl_image.h" @@ -210,11 +210,10 @@ const bool support_client_side_arrays = false; // Create the object exposing the OpenGL API. - gles2_implementation_ = - std::make_unique<skia_bindings::GLES2ImplementationWithGrContextSupport>( - gles2_helper_.get(), share_group.get(), transfer_buffer_.get(), - bind_generates_resource, attribs.lose_context_when_out_of_memory, - support_client_side_arrays, command_buffer_.get()); + gles2_implementation_ = std::make_unique<gles2::GLES2Implementation>( + gles2_helper_.get(), share_group.get(), transfer_buffer_.get(), + bind_generates_resource, attribs.lose_context_when_out_of_memory, + support_client_side_arrays, command_buffer_.get()); result = gles2_implementation_->Initialize(mem_limits); return result;
diff --git a/gpu/skia_bindings/BUILD.gn b/gpu/skia_bindings/BUILD.gn index e9116a6..6ebdd9b 100644 --- a/gpu/skia_bindings/BUILD.gn +++ b/gpu/skia_bindings/BUILD.gn
@@ -6,14 +6,11 @@ sources = [ "gl_bindings_skia_cmd_buffer.cc", "gl_bindings_skia_cmd_buffer.h", - "gles2_implementation_with_grcontext_support.cc", - "gles2_implementation_with_grcontext_support.h", "grcontext_for_gles2_interface.cc", "grcontext_for_gles2_interface.h", ] deps = [ "//base", - "//gpu/command_buffer/client:gles2_implementation", "//gpu/command_buffer/client:gles2_interface", "//gpu/ipc/common:interfaces", "//skia",
diff --git a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc index ce78575..bc67f8e3 100644 --- a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc +++ b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc
@@ -4,51 +4,24 @@ #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" -#include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "third_party/skia/include/gpu/gl/GrGLInterface.h" using gpu::gles2::GLES2Interface; -using gpu::ContextSupport; namespace { - -class ScopedCallingGLFromSkia { - public: - ScopedCallingGLFromSkia(ContextSupport* context_support) - : context_support_(context_support) { - context_support_->WillCallGLFromSkia(); - } - ~ScopedCallingGLFromSkia() { context_support_->DidCallGLFromSkia(); } - - private: - ContextSupport* context_support_; -}; - template <typename R, typename... Args> GrGLFunction<R (*)(Args...)> gles_bind(R (GLES2Interface::*func)(Args...), - GLES2Interface* gles2_interface, - ContextSupport* context_support) { - if (context_support->HasGrContextSupport()) { - return [func, context_support, gles2_interface](Args... args) { - ScopedCallingGLFromSkia guard(context_support); - return (gles2_interface->*func)(args...); - }; - } - - // This fallback binding should only be used by unit tests which do not care - // about GrContext::resetContext() getting called automatically. - return [func, gles2_interface](Args... args) { - return (gles2_interface->*func)(args...); + GLES2Interface* gles2Interface) { + return [func, gles2Interface](Args... args) { + return (gles2Interface->*func)(args...); }; } } // namespace namespace skia_bindings { -sk_sp<GrGLInterface> CreateGLES2InterfaceBindings( - GLES2Interface* impl, - ContextSupport* context_support) { +sk_sp<GrGLInterface> CreateGLES2InterfaceBindings(GLES2Interface* impl) { sk_sp<GrGLInterface> interface(new GrGLInterface); interface->fStandard = kGLES_GrGLStandard; @@ -60,363 +33,269 @@ return reinterpret_cast<const GLubyte*>("OpenGL ES 2.0 Chromium"); return impl->GetString(name); }; - auto get_stringi = - gles_bind(&GLES2Interface::GetStringi, impl, context_support); - auto get_integerv = - gles_bind(&GLES2Interface::GetIntegerv, impl, context_support); + auto get_stringi = gles_bind(&GLES2Interface::GetStringi, impl); + auto get_integerv = gles_bind(&GLES2Interface::GetIntegerv, impl); interface->fExtensions.init(kGLES_GrGLStandard, get_string, get_stringi, get_integerv); GrGLInterface::Functions* functions = &interface->fFunctions; - functions->fActiveTexture = - gles_bind(&GLES2Interface::ActiveTexture, impl, context_support); - functions->fAttachShader = - gles_bind(&GLES2Interface::AttachShader, impl, context_support); + functions->fActiveTexture = gles_bind(&GLES2Interface::ActiveTexture, impl); + functions->fAttachShader = gles_bind(&GLES2Interface::AttachShader, impl); functions->fBindAttribLocation = - gles_bind(&GLES2Interface::BindAttribLocation, impl, context_support); - functions->fBindBuffer = - gles_bind(&GLES2Interface::BindBuffer, impl, context_support); - functions->fBindTexture = - gles_bind(&GLES2Interface::BindTexture, impl, context_support); + gles_bind(&GLES2Interface::BindAttribLocation, impl); + functions->fBindBuffer = gles_bind(&GLES2Interface::BindBuffer, impl); + functions->fBindTexture = gles_bind(&GLES2Interface::BindTexture, impl); functions->fBindVertexArray = - gles_bind(&GLES2Interface::BindVertexArrayOES, impl, context_support); - functions->fBlendBarrier = - gles_bind(&GLES2Interface::BlendBarrierKHR, impl, context_support); - functions->fBlendColor = - gles_bind(&GLES2Interface::BlendColor, impl, context_support); - functions->fBlendEquation = - gles_bind(&GLES2Interface::BlendEquation, impl, context_support); - functions->fBlendFunc = - gles_bind(&GLES2Interface::BlendFunc, impl, context_support); - functions->fBufferData = - gles_bind(&GLES2Interface::BufferData, impl, context_support); - functions->fBufferSubData = - gles_bind(&GLES2Interface::BufferSubData, impl, context_support); - functions->fClear = gles_bind(&GLES2Interface::Clear, impl, context_support); - functions->fClearColor = - gles_bind(&GLES2Interface::ClearColor, impl, context_support); - functions->fClearStencil = - gles_bind(&GLES2Interface::ClearStencil, impl, context_support); - functions->fClientWaitSync = - gles_bind(&GLES2Interface::ClientWaitSync, impl, context_support); - functions->fColorMask = - gles_bind(&GLES2Interface::ColorMask, impl, context_support); - functions->fCompileShader = - gles_bind(&GLES2Interface::CompileShader, impl, context_support); + gles_bind(&GLES2Interface::BindVertexArrayOES, impl); + functions->fBlendBarrier = gles_bind(&GLES2Interface::BlendBarrierKHR, impl); + functions->fBlendColor = gles_bind(&GLES2Interface::BlendColor, impl); + functions->fBlendEquation = gles_bind(&GLES2Interface::BlendEquation, impl); + functions->fBlendFunc = gles_bind(&GLES2Interface::BlendFunc, impl); + functions->fBufferData = gles_bind(&GLES2Interface::BufferData, impl); + functions->fBufferSubData = gles_bind(&GLES2Interface::BufferSubData, impl); + functions->fClear = gles_bind(&GLES2Interface::Clear, impl); + functions->fClearColor = gles_bind(&GLES2Interface::ClearColor, impl); + functions->fClearStencil = gles_bind(&GLES2Interface::ClearStencil, impl); + functions->fClientWaitSync = gles_bind(&GLES2Interface::ClientWaitSync, impl); + functions->fColorMask = gles_bind(&GLES2Interface::ColorMask, impl); + functions->fCompileShader = gles_bind(&GLES2Interface::CompileShader, impl); functions->fCompressedTexImage2D = - gles_bind(&GLES2Interface::CompressedTexImage2D, impl, context_support); - functions->fCompressedTexSubImage2D = gles_bind( - &GLES2Interface::CompressedTexSubImage2D, impl, context_support); + gles_bind(&GLES2Interface::CompressedTexImage2D, impl); + functions->fCompressedTexSubImage2D = + gles_bind(&GLES2Interface::CompressedTexSubImage2D, impl); functions->fCopyTexSubImage2D = - gles_bind(&GLES2Interface::CopyTexSubImage2D, impl, context_support); - functions->fCreateProgram = - gles_bind(&GLES2Interface::CreateProgram, impl, context_support); - functions->fCreateShader = - gles_bind(&GLES2Interface::CreateShader, impl, context_support); - functions->fCullFace = - gles_bind(&GLES2Interface::CullFace, impl, context_support); - functions->fDeleteBuffers = - gles_bind(&GLES2Interface::DeleteBuffers, impl, context_support); - functions->fDeleteProgram = - gles_bind(&GLES2Interface::DeleteProgram, impl, context_support); - functions->fDeleteShader = - gles_bind(&GLES2Interface::DeleteShader, impl, context_support); - functions->fDeleteSync = - gles_bind(&GLES2Interface::DeleteSync, impl, context_support); - functions->fDeleteTextures = - gles_bind(&GLES2Interface::DeleteTextures, impl, context_support); + gles_bind(&GLES2Interface::CopyTexSubImage2D, impl); + functions->fCreateProgram = gles_bind(&GLES2Interface::CreateProgram, impl); + functions->fCreateShader = gles_bind(&GLES2Interface::CreateShader, impl); + functions->fCullFace = gles_bind(&GLES2Interface::CullFace, impl); + functions->fDeleteBuffers = gles_bind(&GLES2Interface::DeleteBuffers, impl); + functions->fDeleteProgram = gles_bind(&GLES2Interface::DeleteProgram, impl); + functions->fDeleteShader = gles_bind(&GLES2Interface::DeleteShader, impl); + functions->fDeleteSync = gles_bind(&GLES2Interface::DeleteSync, impl); + functions->fDeleteTextures = gles_bind(&GLES2Interface::DeleteTextures, impl); functions->fDeleteVertexArrays = - gles_bind(&GLES2Interface::DeleteVertexArraysOES, impl, context_support); - functions->fDepthMask = - gles_bind(&GLES2Interface::DepthMask, impl, context_support); - functions->fDisable = - gles_bind(&GLES2Interface::Disable, impl, context_support); - functions->fDisableVertexAttribArray = gles_bind( - &GLES2Interface::DisableVertexAttribArray, impl, context_support); + gles_bind(&GLES2Interface::DeleteVertexArraysOES, impl); + functions->fDepthMask = gles_bind(&GLES2Interface::DepthMask, impl); + functions->fDisable = gles_bind(&GLES2Interface::Disable, impl); + functions->fDisableVertexAttribArray = + gles_bind(&GLES2Interface::DisableVertexAttribArray, impl); functions->fDiscardFramebuffer = - gles_bind(&GLES2Interface::DiscardFramebufferEXT, impl, context_support); - functions->fDrawArrays = - gles_bind(&GLES2Interface::DrawArrays, impl, context_support); - functions->fDrawArraysInstanced = gles_bind( - &GLES2Interface::DrawArraysInstancedANGLE, impl, context_support); - functions->fDrawBuffers = - gles_bind(&GLES2Interface::DrawBuffersEXT, impl, context_support); - functions->fDrawElements = - gles_bind(&GLES2Interface::DrawElements, impl, context_support); - functions->fDrawElementsInstanced = gles_bind( - &GLES2Interface::DrawElementsInstancedANGLE, impl, context_support); + gles_bind(&GLES2Interface::DiscardFramebufferEXT, impl); + functions->fDrawArrays = gles_bind(&GLES2Interface::DrawArrays, impl); + functions->fDrawArraysInstanced = + gles_bind(&GLES2Interface::DrawArraysInstancedANGLE, impl); + functions->fDrawBuffers = gles_bind(&GLES2Interface::DrawBuffersEXT, impl); + functions->fDrawElements = gles_bind(&GLES2Interface::DrawElements, impl); + functions->fDrawElementsInstanced = + gles_bind(&GLES2Interface::DrawElementsInstancedANGLE, impl); functions->fDrawRangeElements = - gles_bind(&GLES2Interface::DrawRangeElements, impl, context_support); - functions->fEnable = - gles_bind(&GLES2Interface::Enable, impl, context_support); - functions->fEnableVertexAttribArray = gles_bind( - &GLES2Interface::EnableVertexAttribArray, impl, context_support); - functions->fEndQuery = - gles_bind(&GLES2Interface::EndQueryEXT, impl, context_support); - functions->fFenceSync = - gles_bind(&GLES2Interface::FenceSync, impl, context_support); - functions->fFinish = - gles_bind(&GLES2Interface::Finish, impl, context_support); - functions->fFlush = gles_bind(&GLES2Interface::Flush, impl, context_support); + gles_bind(&GLES2Interface::DrawRangeElements, impl); + functions->fEnable = gles_bind(&GLES2Interface::Enable, impl); + functions->fEnableVertexAttribArray = + gles_bind(&GLES2Interface::EnableVertexAttribArray, impl); + functions->fEndQuery = gles_bind(&GLES2Interface::EndQueryEXT, impl); + functions->fFenceSync = gles_bind(&GLES2Interface::FenceSync, impl); + functions->fFinish = gles_bind(&GLES2Interface::Finish, impl); + functions->fFlush = gles_bind(&GLES2Interface::Flush, impl); functions->fFlushMappedBufferRange = - gles_bind(&GLES2Interface::FlushMappedBufferRange, impl, context_support); - functions->fFrontFace = - gles_bind(&GLES2Interface::FrontFace, impl, context_support); - functions->fGenBuffers = - gles_bind(&GLES2Interface::GenBuffers, impl, context_support); - functions->fGenTextures = - gles_bind(&GLES2Interface::GenTextures, impl, context_support); + gles_bind(&GLES2Interface::FlushMappedBufferRange, impl); + functions->fFrontFace = gles_bind(&GLES2Interface::FrontFace, impl); + functions->fGenBuffers = gles_bind(&GLES2Interface::GenBuffers, impl); + functions->fGenTextures = gles_bind(&GLES2Interface::GenTextures, impl); functions->fGenVertexArrays = - gles_bind(&GLES2Interface::GenVertexArraysOES, impl, context_support); + gles_bind(&GLES2Interface::GenVertexArraysOES, impl); functions->fGetBufferParameteriv = - gles_bind(&GLES2Interface::GetBufferParameteriv, impl, context_support); - functions->fGetError = - gles_bind(&GLES2Interface::GetError, impl, context_support); + gles_bind(&GLES2Interface::GetBufferParameteriv, impl); + functions->fGetError = gles_bind(&GLES2Interface::GetError, impl); functions->fGetIntegerv = get_integerv; functions->fGetInternalformativ = - gles_bind(&GLES2Interface::GetInternalformativ, impl, context_support); + gles_bind(&GLES2Interface::GetInternalformativ, impl); functions->fGetProgramInfoLog = - gles_bind(&GLES2Interface::GetProgramInfoLog, impl, context_support); - functions->fGetProgramiv = - gles_bind(&GLES2Interface::GetProgramiv, impl, context_support); - functions->fGetQueryiv = - gles_bind(&GLES2Interface::GetQueryivEXT, impl, context_support); + gles_bind(&GLES2Interface::GetProgramInfoLog, impl); + functions->fGetProgramiv = gles_bind(&GLES2Interface::GetProgramiv, impl); + functions->fGetQueryiv = gles_bind(&GLES2Interface::GetQueryivEXT, impl); functions->fGetQueryObjectuiv = - gles_bind(&GLES2Interface::GetQueryObjectuivEXT, impl, context_support); + gles_bind(&GLES2Interface::GetQueryObjectuivEXT, impl); functions->fGetShaderInfoLog = - gles_bind(&GLES2Interface::GetShaderInfoLog, impl, context_support); - functions->fGetShaderiv = - gles_bind(&GLES2Interface::GetShaderiv, impl, context_support); - functions->fGetShaderPrecisionFormat = gles_bind( - &GLES2Interface::GetShaderPrecisionFormat, impl, context_support); + gles_bind(&GLES2Interface::GetShaderInfoLog, impl); + functions->fGetShaderiv = gles_bind(&GLES2Interface::GetShaderiv, impl); + functions->fGetShaderPrecisionFormat = + gles_bind(&GLES2Interface::GetShaderPrecisionFormat, impl); functions->fGetString = get_string; functions->fGetStringi = get_stringi; functions->fGetUniformLocation = - gles_bind(&GLES2Interface::GetUniformLocation, impl, context_support); + gles_bind(&GLES2Interface::GetUniformLocation, impl); functions->fInsertEventMarker = - gles_bind(&GLES2Interface::InsertEventMarkerEXT, impl, context_support); + gles_bind(&GLES2Interface::InsertEventMarkerEXT, impl); functions->fInvalidateFramebuffer = - gles_bind(&GLES2Interface::InvalidateFramebuffer, impl, context_support); - functions->fInvalidateSubFramebuffer = gles_bind( - &GLES2Interface::InvalidateSubFramebuffer, impl, context_support); - functions->fIsSync = - gles_bind(&GLES2Interface::IsSync, impl, context_support); - functions->fIsTexture = - gles_bind(&GLES2Interface::IsTexture, impl, context_support); - functions->fLineWidth = - gles_bind(&GLES2Interface::LineWidth, impl, context_support); - functions->fLinkProgram = - gles_bind(&GLES2Interface::LinkProgram, impl, context_support); - functions->fMapBufferRange = - gles_bind(&GLES2Interface::MapBufferRange, impl, context_support); - functions->fMapBufferSubData = gles_bind( - &GLES2Interface::MapBufferSubDataCHROMIUM, impl, context_support); - functions->fMapTexSubImage2D = gles_bind( - &GLES2Interface::MapTexSubImage2DCHROMIUM, impl, context_support); - functions->fPixelStorei = - gles_bind(&GLES2Interface::PixelStorei, impl, context_support); + gles_bind(&GLES2Interface::InvalidateFramebuffer, impl); + functions->fInvalidateSubFramebuffer = + gles_bind(&GLES2Interface::InvalidateSubFramebuffer, impl); + functions->fIsSync = gles_bind(&GLES2Interface::IsSync, impl); + functions->fIsTexture = gles_bind(&GLES2Interface::IsTexture, impl); + functions->fLineWidth = gles_bind(&GLES2Interface::LineWidth, impl); + functions->fLinkProgram = gles_bind(&GLES2Interface::LinkProgram, impl); + functions->fMapBufferRange = gles_bind(&GLES2Interface::MapBufferRange, impl); + functions->fMapBufferSubData = + gles_bind(&GLES2Interface::MapBufferSubDataCHROMIUM, impl); + functions->fMapTexSubImage2D = + gles_bind(&GLES2Interface::MapTexSubImage2DCHROMIUM, impl); + functions->fPixelStorei = gles_bind(&GLES2Interface::PixelStorei, impl); functions->fPopGroupMarker = - gles_bind(&GLES2Interface::PopGroupMarkerEXT, impl, context_support); + gles_bind(&GLES2Interface::PopGroupMarkerEXT, impl); functions->fPushGroupMarker = - gles_bind(&GLES2Interface::PushGroupMarkerEXT, impl, context_support); - functions->fReadBuffer = - gles_bind(&GLES2Interface::ReadBuffer, impl, context_support); - functions->fReadPixels = - gles_bind(&GLES2Interface::ReadPixels, impl, context_support); - functions->fScissor = - gles_bind(&GLES2Interface::Scissor, impl, context_support); - functions->fShaderSource = - gles_bind(&GLES2Interface::ShaderSource, impl, context_support); - functions->fStencilFunc = - gles_bind(&GLES2Interface::StencilFunc, impl, context_support); + gles_bind(&GLES2Interface::PushGroupMarkerEXT, impl); + functions->fReadBuffer = gles_bind(&GLES2Interface::ReadBuffer, impl); + functions->fReadPixels = gles_bind(&GLES2Interface::ReadPixels, impl); + functions->fScissor = gles_bind(&GLES2Interface::Scissor, impl); + functions->fShaderSource = gles_bind(&GLES2Interface::ShaderSource, impl); + functions->fStencilFunc = gles_bind(&GLES2Interface::StencilFunc, impl); functions->fStencilFuncSeparate = - gles_bind(&GLES2Interface::StencilFuncSeparate, impl, context_support); - functions->fStencilMask = - gles_bind(&GLES2Interface::StencilMask, impl, context_support); + gles_bind(&GLES2Interface::StencilFuncSeparate, impl); + functions->fStencilMask = gles_bind(&GLES2Interface::StencilMask, impl); functions->fStencilMaskSeparate = - gles_bind(&GLES2Interface::StencilMaskSeparate, impl, context_support); - functions->fStencilOp = - gles_bind(&GLES2Interface::StencilOp, impl, context_support); + gles_bind(&GLES2Interface::StencilMaskSeparate, impl); + functions->fStencilOp = gles_bind(&GLES2Interface::StencilOp, impl); functions->fStencilOpSeparate = - gles_bind(&GLES2Interface::StencilOpSeparate, impl, context_support); - functions->fTexImage2D = - gles_bind(&GLES2Interface::TexImage2D, impl, context_support); - functions->fTexParameteri = - gles_bind(&GLES2Interface::TexParameteri, impl, context_support); - functions->fTexParameteriv = - gles_bind(&GLES2Interface::TexParameteriv, impl, context_support); - functions->fTexStorage2D = - gles_bind(&GLES2Interface::TexStorage2DEXT, impl, context_support); - functions->fTexSubImage2D = - gles_bind(&GLES2Interface::TexSubImage2D, impl, context_support); - functions->fUniform1f = - gles_bind(&GLES2Interface::Uniform1f, impl, context_support); - functions->fUniform1i = - gles_bind(&GLES2Interface::Uniform1i, impl, context_support); - functions->fUniform1fv = - gles_bind(&GLES2Interface::Uniform1fv, impl, context_support); - functions->fUniform1iv = - gles_bind(&GLES2Interface::Uniform1iv, impl, context_support); - functions->fUniform2f = - gles_bind(&GLES2Interface::Uniform2f, impl, context_support); - functions->fUniform2i = - gles_bind(&GLES2Interface::Uniform2i, impl, context_support); - functions->fUniform2fv = - gles_bind(&GLES2Interface::Uniform2fv, impl, context_support); - functions->fUniform2iv = - gles_bind(&GLES2Interface::Uniform2iv, impl, context_support); - functions->fUniform3f = - gles_bind(&GLES2Interface::Uniform3f, impl, context_support); - functions->fUniform3i = - gles_bind(&GLES2Interface::Uniform3i, impl, context_support); - functions->fUniform3fv = - gles_bind(&GLES2Interface::Uniform3fv, impl, context_support); - functions->fUniform3iv = - gles_bind(&GLES2Interface::Uniform3iv, impl, context_support); - functions->fUniform4f = - gles_bind(&GLES2Interface::Uniform4f, impl, context_support); - functions->fUniform4i = - gles_bind(&GLES2Interface::Uniform4i, impl, context_support); - functions->fUniform4fv = - gles_bind(&GLES2Interface::Uniform4fv, impl, context_support); - functions->fUniform4iv = - gles_bind(&GLES2Interface::Uniform4iv, impl, context_support); + gles_bind(&GLES2Interface::StencilOpSeparate, impl); + functions->fTexImage2D = gles_bind(&GLES2Interface::TexImage2D, impl); + functions->fTexParameteri = gles_bind(&GLES2Interface::TexParameteri, impl); + functions->fTexParameteriv = gles_bind(&GLES2Interface::TexParameteriv, impl); + functions->fTexStorage2D = gles_bind(&GLES2Interface::TexStorage2DEXT, impl); + functions->fTexSubImage2D = gles_bind(&GLES2Interface::TexSubImage2D, impl); + functions->fUniform1f = gles_bind(&GLES2Interface::Uniform1f, impl); + functions->fUniform1i = gles_bind(&GLES2Interface::Uniform1i, impl); + functions->fUniform1fv = gles_bind(&GLES2Interface::Uniform1fv, impl); + functions->fUniform1iv = gles_bind(&GLES2Interface::Uniform1iv, impl); + functions->fUniform2f = gles_bind(&GLES2Interface::Uniform2f, impl); + functions->fUniform2i = gles_bind(&GLES2Interface::Uniform2i, impl); + functions->fUniform2fv = gles_bind(&GLES2Interface::Uniform2fv, impl); + functions->fUniform2iv = gles_bind(&GLES2Interface::Uniform2iv, impl); + functions->fUniform3f = gles_bind(&GLES2Interface::Uniform3f, impl); + functions->fUniform3i = gles_bind(&GLES2Interface::Uniform3i, impl); + functions->fUniform3fv = gles_bind(&GLES2Interface::Uniform3fv, impl); + functions->fUniform3iv = gles_bind(&GLES2Interface::Uniform3iv, impl); + functions->fUniform4f = gles_bind(&GLES2Interface::Uniform4f, impl); + functions->fUniform4i = gles_bind(&GLES2Interface::Uniform4i, impl); + functions->fUniform4fv = gles_bind(&GLES2Interface::Uniform4fv, impl); + functions->fUniform4iv = gles_bind(&GLES2Interface::Uniform4iv, impl); functions->fUniformMatrix2fv = - gles_bind(&GLES2Interface::UniformMatrix2fv, impl, context_support); + gles_bind(&GLES2Interface::UniformMatrix2fv, impl); functions->fUniformMatrix3fv = - gles_bind(&GLES2Interface::UniformMatrix3fv, impl, context_support); + gles_bind(&GLES2Interface::UniformMatrix3fv, impl); functions->fUniformMatrix4fv = - gles_bind(&GLES2Interface::UniformMatrix4fv, impl, context_support); - functions->fUnmapBufferSubData = gles_bind( - &GLES2Interface::UnmapBufferSubDataCHROMIUM, impl, context_support); - functions->fUnmapTexSubImage2D = gles_bind( - &GLES2Interface::UnmapTexSubImage2DCHROMIUM, impl, context_support); - functions->fUseProgram = - gles_bind(&GLES2Interface::UseProgram, impl, context_support); - functions->fVertexAttrib1f = - gles_bind(&GLES2Interface::VertexAttrib1f, impl, context_support); + gles_bind(&GLES2Interface::UniformMatrix4fv, impl); + functions->fUnmapBufferSubData = + gles_bind(&GLES2Interface::UnmapBufferSubDataCHROMIUM, impl); + functions->fUnmapTexSubImage2D = + gles_bind(&GLES2Interface::UnmapTexSubImage2DCHROMIUM, impl); + functions->fUseProgram = gles_bind(&GLES2Interface::UseProgram, impl); + functions->fVertexAttrib1f = gles_bind(&GLES2Interface::VertexAttrib1f, impl); functions->fVertexAttrib2fv = - gles_bind(&GLES2Interface::VertexAttrib2fv, impl, context_support); + gles_bind(&GLES2Interface::VertexAttrib2fv, impl); functions->fVertexAttrib3fv = - gles_bind(&GLES2Interface::VertexAttrib3fv, impl, context_support); + gles_bind(&GLES2Interface::VertexAttrib3fv, impl); functions->fVertexAttrib4fv = - gles_bind(&GLES2Interface::VertexAttrib4fv, impl, context_support); - functions->fVertexAttribDivisor = gles_bind( - &GLES2Interface::VertexAttribDivisorANGLE, impl, context_support); + gles_bind(&GLES2Interface::VertexAttrib4fv, impl); + functions->fVertexAttribDivisor = + gles_bind(&GLES2Interface::VertexAttribDivisorANGLE, impl); functions->fVertexAttribPointer = - gles_bind(&GLES2Interface::VertexAttribPointer, impl, context_support); + gles_bind(&GLES2Interface::VertexAttribPointer, impl); functions->fVertexAttribIPointer = - gles_bind(&GLES2Interface::VertexAttribIPointer, impl, context_support); - functions->fViewport = - gles_bind(&GLES2Interface::Viewport, impl, context_support); - functions->fWaitSync = - gles_bind(&GLES2Interface::WaitSync, impl, context_support); + gles_bind(&GLES2Interface::VertexAttribIPointer, impl); + functions->fViewport = gles_bind(&GLES2Interface::Viewport, impl); + functions->fWaitSync = gles_bind(&GLES2Interface::WaitSync, impl); functions->fBindFramebuffer = - gles_bind(&GLES2Interface::BindFramebuffer, impl, context_support); - functions->fBeginQuery = - gles_bind(&GLES2Interface::BeginQueryEXT, impl, context_support); + gles_bind(&GLES2Interface::BindFramebuffer, impl); + functions->fBeginQuery = gles_bind(&GLES2Interface::BeginQueryEXT, impl); functions->fBindRenderbuffer = - gles_bind(&GLES2Interface::BindRenderbuffer, impl, context_support); + gles_bind(&GLES2Interface::BindRenderbuffer, impl); functions->fCheckFramebufferStatus = - gles_bind(&GLES2Interface::CheckFramebufferStatus, impl, context_support); + gles_bind(&GLES2Interface::CheckFramebufferStatus, impl); functions->fDeleteFramebuffers = - gles_bind(&GLES2Interface::DeleteFramebuffers, impl, context_support); + gles_bind(&GLES2Interface::DeleteFramebuffers, impl); functions->fDeleteQueries = - gles_bind(&GLES2Interface::DeleteQueriesEXT, impl, context_support); + gles_bind(&GLES2Interface::DeleteQueriesEXT, impl); functions->fDeleteRenderbuffers = - gles_bind(&GLES2Interface::DeleteRenderbuffers, impl, context_support); - functions->fFramebufferRenderbuffer = gles_bind( - &GLES2Interface::FramebufferRenderbuffer, impl, context_support); + gles_bind(&GLES2Interface::DeleteRenderbuffers, impl); + functions->fFramebufferRenderbuffer = + gles_bind(&GLES2Interface::FramebufferRenderbuffer, impl); functions->fFramebufferTexture2D = - gles_bind(&GLES2Interface::FramebufferTexture2D, impl, context_support); + gles_bind(&GLES2Interface::FramebufferTexture2D, impl); functions->fFramebufferTexture2DMultisample = - gles_bind(&GLES2Interface::FramebufferTexture2DMultisampleEXT, impl, - context_support); + gles_bind(&GLES2Interface::FramebufferTexture2DMultisampleEXT, impl); functions->fGenFramebuffers = - gles_bind(&GLES2Interface::GenFramebuffers, impl, context_support); + gles_bind(&GLES2Interface::GenFramebuffers, impl); functions->fGenRenderbuffers = - gles_bind(&GLES2Interface::GenRenderbuffers, impl, context_support); + gles_bind(&GLES2Interface::GenRenderbuffers, impl); functions->fGetFramebufferAttachmentParameteriv = - gles_bind(&GLES2Interface::GetFramebufferAttachmentParameteriv, impl, - context_support); - functions->fGetRenderbufferParameteriv = gles_bind( - &GLES2Interface::GetRenderbufferParameteriv, impl, context_support); - functions->fGenQueries = - gles_bind(&GLES2Interface::GenQueriesEXT, impl, context_support); + gles_bind(&GLES2Interface::GetFramebufferAttachmentParameteriv, impl); + functions->fGetRenderbufferParameteriv = + gles_bind(&GLES2Interface::GetRenderbufferParameteriv, impl); + functions->fGenQueries = gles_bind(&GLES2Interface::GenQueriesEXT, impl); functions->fRenderbufferStorage = - gles_bind(&GLES2Interface::RenderbufferStorage, impl, context_support); + gles_bind(&GLES2Interface::RenderbufferStorage, impl); functions->fRenderbufferStorageMultisample = - gles_bind(&GLES2Interface::RenderbufferStorageMultisampleCHROMIUM, impl, - context_support); + gles_bind(&GLES2Interface::RenderbufferStorageMultisampleCHROMIUM, impl); functions->fRenderbufferStorageMultisampleES2EXT = - gles_bind(&GLES2Interface::RenderbufferStorageMultisampleEXT, impl, - context_support); - functions->fBindFragDataLocation = gles_bind( - &GLES2Interface::BindFragDataLocationEXT, impl, context_support); - functions->fBindFragDataLocationIndexed = gles_bind( - &GLES2Interface::BindFragDataLocationIndexedEXT, impl, context_support); - functions->fBindUniformLocation = gles_bind( - &GLES2Interface::BindUniformLocationCHROMIUM, impl, context_support); - functions->fBlitFramebuffer = gles_bind( - &GLES2Interface::BlitFramebufferCHROMIUM, impl, context_support); - functions->fGenerateMipmap = - gles_bind(&GLES2Interface::GenerateMipmap, impl, context_support); + gles_bind(&GLES2Interface::RenderbufferStorageMultisampleEXT, impl); + functions->fBindFragDataLocation = + gles_bind(&GLES2Interface::BindFragDataLocationEXT, impl); + functions->fBindFragDataLocationIndexed = + gles_bind(&GLES2Interface::BindFragDataLocationIndexedEXT, impl); + functions->fBindUniformLocation = + gles_bind(&GLES2Interface::BindUniformLocationCHROMIUM, impl); + functions->fBlitFramebuffer = + gles_bind(&GLES2Interface::BlitFramebufferCHROMIUM, impl); + functions->fGenerateMipmap = gles_bind(&GLES2Interface::GenerateMipmap, impl); functions->fMatrixLoadf = - gles_bind(&GLES2Interface::MatrixLoadfCHROMIUM, impl, context_support); - functions->fMatrixLoadIdentity = gles_bind( - &GLES2Interface::MatrixLoadIdentityCHROMIUM, impl, context_support); + gles_bind(&GLES2Interface::MatrixLoadfCHROMIUM, impl); + functions->fMatrixLoadIdentity = + gles_bind(&GLES2Interface::MatrixLoadIdentityCHROMIUM, impl); functions->fPathCommands = - gles_bind(&GLES2Interface::PathCommandsCHROMIUM, impl, context_support); + gles_bind(&GLES2Interface::PathCommandsCHROMIUM, impl); functions->fPathParameteri = - gles_bind(&GLES2Interface::PathParameteriCHROMIUM, impl, context_support); + gles_bind(&GLES2Interface::PathParameteriCHROMIUM, impl); functions->fPathParameterf = - gles_bind(&GLES2Interface::PathParameterfCHROMIUM, impl, context_support); - functions->fGenPaths = - gles_bind(&GLES2Interface::GenPathsCHROMIUM, impl, context_support); - functions->fIsPath = - gles_bind(&GLES2Interface::IsPathCHROMIUM, impl, context_support); + gles_bind(&GLES2Interface::PathParameterfCHROMIUM, impl); + functions->fGenPaths = gles_bind(&GLES2Interface::GenPathsCHROMIUM, impl); + functions->fIsPath = gles_bind(&GLES2Interface::IsPathCHROMIUM, impl); functions->fDeletePaths = - gles_bind(&GLES2Interface::DeletePathsCHROMIUM, impl, context_support); - functions->fPathStencilFunc = gles_bind( - &GLES2Interface::PathStencilFuncCHROMIUM, impl, context_support); - functions->fStencilFillPath = gles_bind( - &GLES2Interface::StencilFillPathCHROMIUM, impl, context_support); - functions->fStencilStrokePath = gles_bind( - &GLES2Interface::StencilStrokePathCHROMIUM, impl, context_support); + gles_bind(&GLES2Interface::DeletePathsCHROMIUM, impl); + functions->fPathStencilFunc = + gles_bind(&GLES2Interface::PathStencilFuncCHROMIUM, impl); + functions->fStencilFillPath = + gles_bind(&GLES2Interface::StencilFillPathCHROMIUM, impl); + functions->fStencilStrokePath = + gles_bind(&GLES2Interface::StencilStrokePathCHROMIUM, impl); functions->fCoverFillPath = - gles_bind(&GLES2Interface::CoverFillPathCHROMIUM, impl, context_support); - functions->fCoverStrokePath = gles_bind( - &GLES2Interface::CoverStrokePathCHROMIUM, impl, context_support); - functions->fStencilThenCoverFillPath = gles_bind( - &GLES2Interface::StencilThenCoverFillPathCHROMIUM, impl, context_support); + gles_bind(&GLES2Interface::CoverFillPathCHROMIUM, impl); + functions->fCoverStrokePath = + gles_bind(&GLES2Interface::CoverStrokePathCHROMIUM, impl); + functions->fStencilThenCoverFillPath = + gles_bind(&GLES2Interface::StencilThenCoverFillPathCHROMIUM, impl); functions->fStencilThenCoverStrokePath = - gles_bind(&GLES2Interface::StencilThenCoverStrokePathCHROMIUM, impl, - context_support); - functions->fStencilFillPathInstanced = gles_bind( - &GLES2Interface::StencilFillPathInstancedCHROMIUM, impl, context_support); + gles_bind(&GLES2Interface::StencilThenCoverStrokePathCHROMIUM, impl); + functions->fStencilFillPathInstanced = + gles_bind(&GLES2Interface::StencilFillPathInstancedCHROMIUM, impl); functions->fStencilStrokePathInstanced = - gles_bind(&GLES2Interface::StencilStrokePathInstancedCHROMIUM, impl, - context_support); - functions->fCoverFillPathInstanced = gles_bind( - &GLES2Interface::CoverFillPathInstancedCHROMIUM, impl, context_support); - functions->fCoverStrokePathInstanced = gles_bind( - &GLES2Interface::CoverStrokePathInstancedCHROMIUM, impl, context_support); - functions->fStencilThenCoverFillPathInstanced = - gles_bind(&GLES2Interface::StencilThenCoverFillPathInstancedCHROMIUM, - impl, context_support); - functions->fStencilThenCoverStrokePathInstanced = - gles_bind(&GLES2Interface::StencilThenCoverStrokePathInstancedCHROMIUM, - impl, context_support); + gles_bind(&GLES2Interface::StencilStrokePathInstancedCHROMIUM, impl); + functions->fCoverFillPathInstanced = + gles_bind(&GLES2Interface::CoverFillPathInstancedCHROMIUM, impl); + functions->fCoverStrokePathInstanced = + gles_bind(&GLES2Interface::CoverStrokePathInstancedCHROMIUM, impl); + functions->fStencilThenCoverFillPathInstanced = gles_bind( + &GLES2Interface::StencilThenCoverFillPathInstancedCHROMIUM, impl); + functions->fStencilThenCoverStrokePathInstanced = gles_bind( + &GLES2Interface::StencilThenCoverStrokePathInstancedCHROMIUM, impl); functions->fProgramPathFragmentInputGen = - gles_bind(&GLES2Interface::ProgramPathFragmentInputGenCHROMIUM, impl, - context_support); + gles_bind(&GLES2Interface::ProgramPathFragmentInputGenCHROMIUM, impl); functions->fBindFragmentInputLocation = - gles_bind(&GLES2Interface::BindFragmentInputLocationCHROMIUM, impl, - context_support); - functions->fCoverageModulation = gles_bind( - &GLES2Interface::CoverageModulationCHROMIUM, impl, context_support); + gles_bind(&GLES2Interface::BindFragmentInputLocationCHROMIUM, impl); + functions->fCoverageModulation = + gles_bind(&GLES2Interface::CoverageModulationCHROMIUM, impl); functions->fWindowRectangles = - gles_bind(&GLES2Interface::WindowRectanglesEXT, impl, context_support); + gles_bind(&GLES2Interface::WindowRectanglesEXT, impl); return interface; }
diff --git a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h index 514a567..16df66cc 100644 --- a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h +++ b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h
@@ -11,7 +11,6 @@ struct GrGLInterface; namespace gpu { -class ContextSupport; namespace gles2 { class GLES2Interface; } // namespace gles2 @@ -21,9 +20,7 @@ // The GPU back-end for skia requires pointers to GL functions. This function // initializes bindings for skia-gpu to a GLES2Interface object. -sk_sp<GrGLInterface> CreateGLES2InterfaceBindings( - gpu::gles2::GLES2Interface*, - gpu::ContextSupport* context_support); +sk_sp<GrGLInterface> CreateGLES2InterfaceBindings(gpu::gles2::GLES2Interface*); } // namespace skia_bindings
diff --git a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc deleted file mode 100644 index 7eb4aad..0000000 --- a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc +++ /dev/null
@@ -1,383 +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 "gpu/skia_bindings/gles2_implementation_with_grcontext_support.h" - -#include "gpu/skia_bindings/grcontext_for_gles2_interface.h" -#include "third_party/khronos/GLES2/gl2ext.h" -#include "third_party/skia/include/gpu/GrContext.h" - -namespace skia_bindings { - -GLES2ImplementationWithGrContextSupport:: - GLES2ImplementationWithGrContextSupport( - gpu::gles2::GLES2CmdHelper* helper, - scoped_refptr<gpu::gles2::ShareGroup> share_group, - gpu::TransferBufferInterface* transfer_buffer, - bool bind_generates_resource, - bool lose_context_when_out_of_memory, - bool support_client_side_arrays, - gpu::GpuControl* gpu_control) - : GLES2Implementation(helper, - std::move(share_group), - transfer_buffer, - bind_generates_resource, - lose_context_when_out_of_memory, - support_client_side_arrays, - gpu_control) {} - -GLES2ImplementationWithGrContextSupport:: - ~GLES2ImplementationWithGrContextSupport() {} - -bool GLES2ImplementationWithGrContextSupport::HasGrContextSupport() const { - return true; -} - -void GLES2ImplementationWithGrContextSupport::ResetGrContextIfNeeded( - uint32_t dirty_bits) { - if (gr_context_ && !using_gl_from_skia_) { - gr_context_->resetContext(dirty_bits); - } -} - -void GLES2ImplementationWithGrContextSupport::SetGrContext(GrContext* gr) { - DCHECK(!gr || !gr_context_); // Cant have multiple linked GrContexts - gr_context_ = gr; -} - -void GLES2ImplementationWithGrContextSupport::WillCallGLFromSkia() { - using_gl_from_skia_ = true; -} - -void GLES2ImplementationWithGrContextSupport::DidCallGLFromSkia() { - using_gl_from_skia_ = false; -} - -void GLES2ImplementationWithGrContextSupport::EndRasterCHROMIUM() { - BaseClass::EndRasterCHROMIUM(); - // Assume that invoking the GLES2-backed version of the raster interface - // invalidates everything. - ResetGrContextIfNeeded(kALL_GrGLBackendState); -} - -// Calls that invalidate kRenderTarget_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::BindFramebuffer( - GLenum target, - GLuint framebuffer) { - BaseClass::BindFramebuffer(target, framebuffer); - ResetGrContextIfNeeded(kRenderTarget_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::BindRenderbuffer( - GLenum target, - GLuint renderbuffer) { - BaseClass::BindRenderbuffer(target, renderbuffer); - ResetGrContextIfNeeded(kRenderTarget_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::DiscardFramebufferEXT( - GLenum target, - GLsizei count, - const GLenum* attachments) { - BaseClass::DiscardFramebufferEXT(target, count, attachments); - ResetGrContextIfNeeded(kRenderTarget_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::DeleteFramebuffers( - GLsizei n, - const GLuint* framebuffers) { - BaseClass::DeleteFramebuffers(n, framebuffers); - ResetGrContextIfNeeded(kRenderTarget_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::DeleteRenderbuffers( - GLsizei n, - const GLuint* renderbuffers) { - BaseClass::DeleteRenderbuffers(n, renderbuffers); - ResetGrContextIfNeeded(kRenderTarget_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::FramebufferTexture2D( - GLenum target, - GLenum attachment, - GLenum textarget, - GLuint texture, - GLint level) { - BaseClass::FramebufferTexture2D(target, attachment, textarget, texture, - level); - ResetGrContextIfNeeded(kRenderTarget_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::FramebufferTextureLayer( - GLenum target, - GLenum attachment, - GLuint texture, - GLint level, - GLint layer) { - BaseClass::FramebufferTextureLayer(target, attachment, texture, level, layer); - ResetGrContextIfNeeded(kRenderTarget_GrGLBackendState); -} - -// Calls that invalidate kTextureBinding_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::BindTexture(GLenum target, - GLuint texture) { - BaseClass::BindTexture(target, texture); - ResetGrContextIfNeeded(kTextureBinding_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::UnlockDiscardableTextureCHROMIUM( - GLuint texture) { - BaseClass::UnlockDiscardableTextureCHROMIUM(texture); - ResetGrContextIfNeeded(kTextureBinding_GrGLBackendState); -} -bool GLES2ImplementationWithGrContextSupport::LockDiscardableTextureCHROMIUM( - GLuint texture) { - bool result = BaseClass::LockDiscardableTextureCHROMIUM(texture); - ResetGrContextIfNeeded(kTextureBinding_GrGLBackendState); - return result; -} -void GLES2ImplementationWithGrContextSupport::DeleteTextures( - GLsizei n, - const GLuint* textures) { - BaseClass::DeleteTextures(n, textures); - ResetGrContextIfNeeded(kTextureBinding_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::ActiveTexture(GLenum texture) { - BaseClass::ActiveTexture(texture); - ResetGrContextIfNeeded(kTextureBinding_GrGLBackendState); -} - -// Calls that invalidate kView_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::Scissor(GLint x, - GLint y, - GLsizei width, - GLsizei height) { - BaseClass::Scissor(x, y, width, height); - ResetGrContextIfNeeded(kView_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::Viewport(GLint x, - GLint y, - GLsizei width, - GLsizei height) { - BaseClass::Viewport(x, y, width, height); - ResetGrContextIfNeeded(kView_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::WindowRectanglesEXT( - GLenum mode, - GLsizei count, - const GLint* box) { - BaseClass::WindowRectanglesEXT(mode, count, box); - ResetGrContextIfNeeded(kView_GrGLBackendState); -} - -// Calls that invalidate kBlend_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::BlendColor(GLclampf red, - GLclampf green, - GLclampf blue, - GLclampf alpha) { - BaseClass::BlendColor(red, green, blue, alpha); - ResetGrContextIfNeeded(kBlend_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::BlendEquation(GLenum mode) { - BaseClass::BlendEquation(mode); - ResetGrContextIfNeeded(kBlend_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::BlendEquationSeparate( - GLenum modeRGB, - GLenum modeAlpha) { - BaseClass::BlendEquationSeparate(modeRGB, modeAlpha); - ResetGrContextIfNeeded(kBlend_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::BlendFunc(GLenum sfactor, - GLenum dfactor) { - BaseClass::BlendFunc(sfactor, dfactor); - ResetGrContextIfNeeded(kBlend_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::BlendFuncSeparate( - GLenum srcRGB, - GLenum dstRGB, - GLenum srcAlpha, - GLenum dstAlpha) { - BaseClass::BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); - ResetGrContextIfNeeded(kBlend_GrGLBackendState); -} - -// Calls that invalidate kMSAAEnable_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::CoverageModulationCHROMIUM( - GLenum components) { - BaseClass::CoverageModulationCHROMIUM(components); - ResetGrContextIfNeeded(kMSAAEnable_GrGLBackendState); -} - -// Calls that invalidate kVertex_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::BindVertexArrayOES(GLuint array) { - BaseClass::BindVertexArrayOES(array); - ResetGrContextIfNeeded(kVertex_GrGLBackendState); -} - -// Calls that invalidate kStencil_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::StencilFunc(GLenum func, - GLint ref, - GLuint mask) { - BaseClass::StencilFunc(func, ref, mask); - ResetGrContextIfNeeded(kStencil_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::StencilFuncSeparate(GLenum face, - GLenum func, - GLint ref, - GLuint mask) { - BaseClass::StencilFuncSeparate(face, func, ref, mask); - ResetGrContextIfNeeded(kStencil_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::StencilMask(GLuint mask) { - BaseClass::StencilMask(mask); - ResetGrContextIfNeeded(kStencil_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::StencilMaskSeparate(GLenum face, - GLuint mask) { - BaseClass::StencilMaskSeparate(face, mask); - ResetGrContextIfNeeded(kStencil_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::StencilOp(GLenum fail, - GLenum zfail, - GLenum zpass) { - BaseClass::StencilOp(fail, zfail, zpass); - ResetGrContextIfNeeded(kStencil_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::StencilOpSeparate(GLenum face, - GLenum fail, - GLenum zfail, - GLenum zpass) { - BaseClass::StencilOpSeparate(face, fail, zfail, zpass); - ResetGrContextIfNeeded(kStencil_GrGLBackendState); -} - -// Calls that invalidate kPixelStore_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::PixelStorei(GLenum pname, - GLint param) { - BaseClass::PixelStorei(pname, param); - ResetGrContextIfNeeded(kPixelStore_GrGLBackendState); -} - -// Calls that invalidate kProgram_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::UseProgram(GLuint program) { - BaseClass::UseProgram(program); - ResetGrContextIfNeeded(kProgram_GrGLBackendState); -} - -// Calls that invalidate kMisc_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::DepthMask(GLboolean flag) { - BaseClass::DepthMask(flag); - ResetGrContextIfNeeded(kMisc_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::FrontFace(GLenum mode) { - BaseClass::FrontFace(mode); - ResetGrContextIfNeeded(kMisc_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::LineWidth(GLfloat width) { - BaseClass::LineWidth(width); - ResetGrContextIfNeeded(kMisc_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::ColorMask(GLboolean red, - GLboolean green, - GLboolean blue, - GLboolean alpha) { - BaseClass::ColorMask(red, green, blue, alpha); - ResetGrContextIfNeeded(kMisc_GrGLBackendState); -} - -// Calls that invalidate kPathRendering_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::PathStencilFuncCHROMIUM( - GLenum func, - GLint ref, - GLuint mask) { - BaseClass::PathStencilFuncCHROMIUM(func, ref, mask); - ResetGrContextIfNeeded(kPathRendering_GrGLBackendState); -} -void GLES2ImplementationWithGrContextSupport::MatrixLoadfCHROMIUM( - GLenum matrixMode, - const GLfloat* m) { - BaseClass::MatrixLoadfCHROMIUM(matrixMode, m); - ResetGrContextIfNeeded(kPathRendering_GrGLBackendState); -} - -// Calls that invalidate many flags -void GLES2ImplementationWithGrContextSupport::BindBuffer(GLenum target, - GLuint buffer) { - WillBindBuffer(target); - BaseClass::BindBuffer(target, buffer); -} -void GLES2ImplementationWithGrContextSupport::BindBufferBase(GLenum target, - GLuint index, - GLuint buffer) { - WillBindBuffer(target); - BaseClass::BindBufferBase(target, index, buffer); -} -void GLES2ImplementationWithGrContextSupport::BindBufferRange(GLenum target, - GLuint index, - GLuint buffer, - GLintptr offset, - GLsizeiptr size) { - WillBindBuffer(target); - BaseClass::BindBufferRange(target, index, buffer, offset, size); -} -void GLES2ImplementationWithGrContextSupport::WillBindBuffer(GLenum target) { - switch (target) { - case GL_ELEMENT_ARRAY_BUFFER: - case GL_ARRAY_BUFFER: - ResetGrContextIfNeeded(kVertex_GrGLBackendState); - break; - case GL_TEXTURE_BUFFER_OES: - // case GL_DRAW_INDIRECT_BUFFER: - case GL_PIXEL_UNPACK_BUFFER: - case GL_PIXEL_PACK_BUFFER: - ResetGrContextIfNeeded(kMisc_GrGLBackendState); - break; - default: - break; - } -} - -void GLES2ImplementationWithGrContextSupport::Disable(GLenum cap) { - WillEnableOrDisable(cap); - BaseClass::Disable(cap); -} - -void GLES2ImplementationWithGrContextSupport::Enable(GLenum cap) { - WillEnableOrDisable(cap); - BaseClass::Enable(cap); -} - -void GLES2ImplementationWithGrContextSupport::WillEnableOrDisable(GLenum cap) { - switch (cap) { - case GL_FRAMEBUFFER_SRGB_EXT: - ResetGrContextIfNeeded(kRenderTarget_GrGLBackendState); - break; - case GL_SCISSOR_TEST: - ResetGrContextIfNeeded(kView_GrGLBackendState); - break; - case GL_BLEND: - ResetGrContextIfNeeded(kBlend_GrGLBackendState); - break; - case GL_MULTISAMPLE_EXT: - ResetGrContextIfNeeded(kMSAAEnable_GrGLBackendState); - break; - case GL_STENCIL_TEST: - ResetGrContextIfNeeded(kStencil_GrGLBackendState); - break; - case GL_DEPTH_TEST: - case GL_CULL_FACE: - case GL_DITHER: - // Commented-out non-ES bits that skia cares about - // case GL_POINT_SMOOTH: - // case GL_LINE_SMOOTH: - // case GL_POLYGON_SMOOTH: - // case GL_POLYGON_STIPPLE: - // case GL_COLOR_LOGIC_OP: - // case GL_INDEX_LOGIC_OP: - // case GL_COLOR_TABLE: - // case GL_VERTEX_PROGRAM_POINT_SIZE: - case GL_POLYGON_OFFSET_FILL: - case GL_FETCH_PER_SAMPLE_ARM: - ResetGrContextIfNeeded(kMisc_GrGLBackendState); - break; - default: - break; - } -} - -} // namespace skia_bindings
diff --git a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h deleted file mode 100644 index 853457c..0000000 --- a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h +++ /dev/null
@@ -1,156 +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 "gpu/command_buffer/client/gles2_implementation.h" - -#ifndef GPU_SKIA_BINDINGS_GLES2_IMPLEMENTATION_WITH_GRCONTEXT_SUPPORT_H_ -#define GPU_SKIA_BINDINGS_GLES2_IMPLEMENTATION_WITH_GRCONTEXT_SUPPORT_H_ - -class GrContext; - -namespace skia_bindings { - -class GLES2ImplementationWithGrContextSupport - : public gpu::gles2::GLES2Implementation { - public: - GLES2ImplementationWithGrContextSupport( - gpu::gles2::GLES2CmdHelper* helper, - scoped_refptr<gpu::gles2::ShareGroup> share_group, - gpu::TransferBufferInterface* transfer_buffer, - bool bind_generates_resource, - bool lose_context_when_out_of_memory, - bool support_client_side_arrays, - gpu::GpuControl* gpu_control); - - ~GLES2ImplementationWithGrContextSupport() override; - - typedef gpu::gles2::GLES2Implementation BaseClass; - - void WillCallGLFromSkia() override; - void DidCallGLFromSkia() override; - void SetGrContext(GrContext* gr) override; - bool HasGrContextSupport() const override; - - // Overrides for GLES2 calls that invalidate state that is tracked by skia - //========================================================================= - // - // These must be kept in sync with the invalidation defines in - // GrGLGpu::onResetContext() - - // Calls that invalidate arbitrary state - void EndRasterCHROMIUM() override; - - // Calls that invalidate kRenderTarget_GrGLBackendState - void BindFramebuffer(GLenum target, GLuint framebuffer) override; - void BindRenderbuffer(GLenum target, GLuint renderbuffer) override; - void DiscardFramebufferEXT(GLenum target, - GLsizei count, - const GLenum* attachments) override; - void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) override; - void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) override; - void FramebufferTexture2D(GLenum target, - GLenum attachment, - GLenum textarget, - GLuint texture, - GLint level) override; - void FramebufferTextureLayer(GLenum target, - GLenum attachment, - GLuint texture, - GLint level, - GLint layer) override; - - // Calls that invalidate kTextureBinding_GrGLBackendState - // Note: Deleting a texture may affect the binding if the currently bound - // texture is deleted. Locking and Unlocking discardable textures may - // internally invoke texture deletion, so they too may affect the texture - // binding. - void BindTexture(GLenum target, GLuint texture) override; - void UnlockDiscardableTextureCHROMIUM(GLuint texture) override; - bool LockDiscardableTextureCHROMIUM(GLuint texture) override; - void DeleteTextures(GLsizei n, const GLuint* textures) override; - void ActiveTexture(GLenum texture) override; - - // Calls that invalidate kView_GrGLBackendState - void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) override; - void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) override; - void WindowRectanglesEXT(GLenum mode, - GLsizei count, - const GLint* box) override; - - // Calls that invalidate kBlend_GrGLBackendState - void BlendColor(GLclampf red, - GLclampf green, - GLclampf blue, - GLclampf alpha) override; - void BlendEquation(GLenum mode) override; - void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) override; - void BlendFunc(GLenum sfactor, GLenum dfactor) override; - void BlendFuncSeparate(GLenum srcRGB, - GLenum dstRGB, - GLenum srcAlpha, - GLenum dstAlpha) override; - - // Calls that invalidate kMSAAEnable_GrGLBackendState - void CoverageModulationCHROMIUM(GLenum components) override; - - // Calls that invalidate kVertex_GrGLBackendState - void BindVertexArrayOES(GLuint array) override; - - // Calls that invalidate kStencil_GrGLBackendState - void StencilFunc(GLenum func, GLint ref, GLuint mask) override; - void StencilFuncSeparate(GLenum face, - GLenum func, - GLint ref, - GLuint mask) override; - void StencilMask(GLuint mask) override; - void StencilMaskSeparate(GLenum face, GLuint mask) override; - void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) override; - void StencilOpSeparate(GLenum face, - GLenum fail, - GLenum zfail, - GLenum zpass) override; - - // Calls that invalidate kPixelStore_GrGLBackendState - void PixelStorei(GLenum pname, GLint param) override; - - // Calls that invalidate kProgram_GrGLBackendState - void UseProgram(GLuint program) override; - - // Calls that invalidate kMisc_GrGLBackendState - void DepthMask(GLboolean flag) override; - void FrontFace(GLenum mode) override; - void LineWidth(GLfloat width) override; - void ColorMask(GLboolean red, - GLboolean green, - GLboolean blue, - GLboolean alpha) override; - - // Calls that invalidate kPathRendering_GrGLBackendState - void PathStencilFuncCHROMIUM(GLenum func, GLint ref, GLuint mask) override; - void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) override; - // Note: MatrixLoadIdentity omitted on purpose - - // Calls that invalidate different bits, depending on args - void BindBuffer(GLenum target, GLuint buffer) override; - void BindBufferBase(GLenum target, GLuint index, GLuint buffer) override; - void BindBufferRange(GLenum target, - GLuint index, - GLuint buffer, - GLintptr offset, - GLsizeiptr size) override; - void Disable(GLenum cap) override; - void Enable(GLenum cap) override; - - private: - void WillBindBuffer(GLenum target); - void WillEnableOrDisable(GLenum cap); - void ResetGrContextIfNeeded(uint32_t dirty_bits); - - GrContext* gr_context_ = nullptr; - bool using_gl_from_skia_ = false; -}; - -} // namespace skia_bindings - -#endif
diff --git a/gpu/skia_bindings/grcontext_for_gles2_interface.cc b/gpu/skia_bindings/grcontext_for_gles2_interface.cc index 1086e99..311b27a6 100644 --- a/gpu/skia_bindings/grcontext_for_gles2_interface.cc +++ b/gpu/skia_bindings/grcontext_for_gles2_interface.cc
@@ -15,7 +15,6 @@ #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/common/capabilities.h" #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" -#include "gpu/skia_bindings/gles2_implementation_with_grcontext_support.h" #include "third_party/skia/include/gpu/GrContext.h" #include "third_party/skia/include/gpu/GrContextOptions.h" #include "third_party/skia/include/gpu/gl/GrGLInterface.h" @@ -60,11 +59,9 @@ GrContextForGLES2Interface::GrContextForGLES2Interface( gpu::gles2::GLES2Interface* gl, - gpu::ContextSupport* context_support, const gpu::Capabilities& capabilities, size_t max_resource_cache_bytes, - size_t max_glyph_cache_texture_bytes) - : context_support_(context_support) { + size_t max_glyph_cache_texture_bytes) { // The limit of the number of GPU resources we hold in the GrContext's // GPU cache. static const int kMaxGaneshResourceCacheCount = 16384; @@ -75,22 +72,19 @@ options.fAllowPathMaskCaching = false; options.fSharpenMipmappedTextures = true; sk_sp<GrGLInterface> interface( - skia_bindings::CreateGLES2InterfaceBindings(gl, context_support)); + skia_bindings::CreateGLES2InterfaceBindings(gl)); gr_context_ = GrContext::MakeGL(std::move(interface), options); if (gr_context_) { gr_context_->setResourceCacheLimits(kMaxGaneshResourceCacheCount, max_resource_cache_bytes); - context_support_->SetGrContext(gr_context_.get()); } } GrContextForGLES2Interface::~GrContextForGLES2Interface() { // At this point the GLES2Interface is going to be destroyed, so have // the GrContext clean up and not try to use it anymore. - if (gr_context_) { + if (gr_context_) gr_context_->releaseResourcesAndAbandonContext(); - context_support_->SetGrContext(nullptr); - } } void GrContextForGLES2Interface::OnLostContext() { @@ -98,6 +92,11 @@ gr_context_->abandonContext(); } +void GrContextForGLES2Interface::ResetContext(uint32_t state) { + if (gr_context_) + gr_context_->resetContext(state); +} + void GrContextForGLES2Interface::FreeGpuResources() { if (gr_context_) { TRACE_EVENT_INSTANT0("gpu", "GrContext::freeGpuResources", @@ -106,8 +105,4 @@ } } -GrContext* GrContextForGLES2Interface::get() { - return gr_context_.get(); -} - } // namespace skia_bindings
diff --git a/gpu/skia_bindings/grcontext_for_gles2_interface.h b/gpu/skia_bindings/grcontext_for_gles2_interface.h index 3b4aab6..ab0b2611 100644 --- a/gpu/skia_bindings/grcontext_for_gles2_interface.h +++ b/gpu/skia_bindings/grcontext_for_gles2_interface.h
@@ -12,7 +12,7 @@ namespace gpu { struct Capabilities; -class ContextSupport; + namespace gles2 { class GLES2Interface; } @@ -33,21 +33,20 @@ size_t* max_glyph_cache_texture_bytes); explicit GrContextForGLES2Interface(gpu::gles2::GLES2Interface* gl, - gpu::ContextSupport* context_support, const gpu::Capabilities& capabilities, size_t max_resource_cache_bytes, size_t max_glyph_cache_texture_bytes); virtual ~GrContextForGLES2Interface(); - GrContext* get(); + GrContext* get() { return gr_context_.get(); } void OnLostContext(); + void ResetContext(uint32_t state); void FreeGpuResources(); private: sk_sp<class GrContext> gr_context_; - gpu::ContextSupport* context_support_; DISALLOW_COPY_AND_ASSIGN(GrContextForGLES2Interface); };
diff --git a/infra/config/global/luci-milo-dev.cfg b/infra/config/global/luci-milo-dev.cfg index 9a37a68..5c383790 100644 --- a/infra/config/global/luci-milo-dev.cfg +++ b/infra/config/global/luci-milo-dev.cfg
@@ -1357,11 +1357,6 @@ short_name: "med" } builders: { - name: "buildbot/chromium.lkgr/Win SyzyASAN LKGR" - category: "win asan" - short_name: "syz" - } - builders: { name: "buildbot/chromium.lkgr/Mac ASAN Debug" category: "mac asan" short_name: "dbg" @@ -4040,9 +4035,6 @@ name: "buildbot/tryserver.chromium.win/win_chromium_gn_upload" } builders: { - name: "buildbot/tryserver.chromium.win/win_chromium_syzyasan_rel" - } - builders: { name: "buildbot/tryserver.chromium.win/win_chromium_variable" } builders: {
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg index b12085e..ec744d67 100644 --- a/infra/config/global/luci-milo.cfg +++ b/infra/config/global/luci-milo.cfg
@@ -1385,11 +1385,6 @@ short_name: "med" } builders: { - name: "buildbot/chromium.lkgr/Win SyzyASAN LKGR" - category: "win asan" - short_name: "syz" - } - builders: { name: "buildbot/chromium.lkgr/Mac ASAN Debug" category: "mac asan" short_name: "dbg" @@ -4721,9 +4716,6 @@ name: "buildbot/tryserver.chromium.win/win_chromium_gn_upload" } builders: { - name: "buildbot/tryserver.chromium.win/win_chromium_syzyasan_rel" - } - builders: { name: "buildbot/tryserver.chromium.win/win_chromium_variable" } builders: {
diff --git a/ios/build/bots/chromium.fyi/ios-simulator-cronet.json b/ios/build/bots/chromium.fyi/ios-simulator-cronet.json index 860897f..7562c346 100644 --- a/ios/build/bots/chromium.fyi/ios-simulator-cronet.json +++ b/ios/build/bots/chromium.fyi/ios-simulator-cronet.json
@@ -43,17 +43,17 @@ { "app": "cronet_test", "device type": "iPhone 5s", - "os": "11.0" + "os": "11.2" }, { "app": "cronet_test", "device type": "iPad Air 2", - "os": "11.0" + "os": "11.2" }, { "app": "cronet_test", "device type": "iPhone X", - "os": "11.0" + "os": "11.2" } ]
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index fe9c9e3..4a8ccb7f8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">ይህ ፎቶዎችን እንዲያስቀምጡ እና እንዲሰቅሉ ያስችልዎታል።</translation> <translation id="802154636333426148">ማውረድ አልተሳካም</translation> <translation id="8023878949384262191">ክፍሉን ይዘረጋዋል።</translation> +<translation id="8053390638574070785">ይህን ገጽ ዳግም ጫን</translation> <translation id="8059533439631660104">ክፍሉን ይሰበስባል።</translation> <translation id="806745655614357130">የእኔን ውሂብ ለብቻው አቆይ</translation> <translation id="8076014560081431679">የተቀመጡ ጣቢያ ቅንብሮች አይሰረዙም፣ እና የእርስዎን የአሰሳ ልማዶች ሊያንጸባርቁ ይችሉ ይሆናል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index c996fe147..d1bd670 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">هذا يتيح لك حفظ الصور وتحميلها.</translation> <translation id="802154636333426148">تعذّر التنزيل</translation> <translation id="8023878949384262191">توسيع القسم.</translation> +<translation id="8053390638574070785">إعادة تحميل هذه الصفحة</translation> <translation id="8059533439631660104">طي القسم.</translation> <translation id="806745655614357130">الحفاظ على البيانات التابعة لي منفصلة</translation> <translation id="8076014560081431679">لن يتم حذف إعدادات موقع الويب المحفوظة وقد تعكس عادات التصفح. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index ecdc2b6..c5ce6ac5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Това ви позволява да запазвате и качвате снимки.</translation> <translation id="802154636333426148">Изтеглянето не бе успешно</translation> <translation id="8023878949384262191">Разгъва секцията.</translation> +<translation id="8053390638574070785">Презареждане на тази страница</translation> <translation id="8059533439631660104">Свива секцията.</translation> <translation id="806745655614357130">Оставяне на данните отделно</translation> <translation id="8076014560081431679">Запазените настройки за сайтове няма да бъдат изтрити и може да отразяват навиците ви при сърфиране. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 9b59cb1a..d75af85 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -371,6 +371,7 @@ <translation id="8019783059653722575">এটি আপনাকে ফটো সংরক্ষণ এবং আপলোড করতে দেয়।</translation> <translation id="802154636333426148">ডাউনলোড ব্যর্থ হয়েছে</translation> <translation id="8023878949384262191">বিভাগটি প্রসারিত করে।</translation> +<translation id="8053390638574070785">এই পৃষ্ঠাটি পুনঃ লোড করুন</translation> <translation id="8059533439631660104">বিভাগটি সঙ্কুচন করে।</translation> <translation id="806745655614357130">আমার ডেটা আলাদা রাখুন</translation> <translation id="8076014560081431679">সংরক্ষিত সাইটের সেটিংস মোছা হবে না এবং আপনার ব্রাউজিং অভ্যাস প্রতিফলিত হতে পারে। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 4f215a6e..44c52aa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Això et permet desar i penjar fotos.</translation> <translation id="802154636333426148">Error de baixada</translation> <translation id="8023878949384262191">Desplega la secció.</translation> +<translation id="8053390638574070785">Torna a carregar aquesta pàgina</translation> <translation id="8059533439631660104">Replega la secció.</translation> <translation id="806745655614357130">Mantén les meves dades separades</translation> <translation id="8076014560081431679">La configuració desada del lloc no se suprimirà i és possible que reflecteixi els vostres hàbits de navegació. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index e3bf52f..1bec2ef2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Toto umožňuje ukládat a nahrávat fotky.</translation> <translation id="802154636333426148">Stažení se nezdařilo</translation> <translation id="8023878949384262191">Rozbalí sekci.</translation> +<translation id="8053390638574070785">Načíst tuto stránku znovu</translation> <translation id="8059533439631660104">Sbalí sekci.</translation> <translation id="806745655614357130">Uchovat má data samostatně.</translation> <translation id="8076014560081431679">Uložená nastavení webů nebudou smazána a mohou vypovídat o vašich zvycích při prohlížení. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index 2a84d362..373bed8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Dette giver dig mulighed for at gemme og uploade billeder.</translation> <translation id="802154636333426148">Download mislykkedes</translation> <translation id="8023878949384262191">Udvider sektionen.</translation> +<translation id="8053390638574070785">Genindlæs denne side</translation> <translation id="8059533439631660104">Skjuler sektionen.</translation> <translation id="806745655614357130">Hold mine data adskilt</translation> <translation id="8076014560081431679">Gemte websiteindstillinger slettes ikke og kan afspejle dine søgevaner. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 675368c..6355423d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Dadurch können Sie Fotos speichern und hochladen.</translation> <translation id="802154636333426148">Downloadfehler</translation> <translation id="8023878949384262191">Maximiert den Abschnitt</translation> +<translation id="8053390638574070785">Diese Seite neu laden</translation> <translation id="8059533439631660104">Abschnitt minimieren</translation> <translation id="806745655614357130">Daten getrennt halten</translation> <translation id="8076014560081431679">Gespeicherte Website-Einstellungen werden nicht gelöscht und können möglicherweise Ihre Surfgewohnheiten wiedergeben. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index fe68c75fd..a898b07c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Σας επιτρέπει να αποθηκεύετε και να ανεβάζετε φωτογραφίες.</translation> <translation id="802154636333426148">Η λήψη απέτυχε</translation> <translation id="8023878949384262191">Ανάπτυξη ενότητας.</translation> +<translation id="8053390638574070785">Επαναφόρτωση αυτής της σελίδας</translation> <translation id="8059533439631660104">Σύμπτυξη ενότητας.</translation> <translation id="806745655614357130">Διατήρηση των δεδομένων μου ξεχωριστά</translation> <translation id="8076014560081431679">Οι αποθηκευμένες ρυθμίσεις ιστότοπου δεν θα διαγραφούν και ενδέχεται να υποδεικνύουν τις συνήθειες περιήγησής σας. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></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 d012ffa..3e763ff 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -38,6 +38,7 @@ <translation id="1540800554400757039">Address 1</translation> <translation id="1545749641540134597">Scan QR Code</translation> <translation id="1580783302095112590">Mail sent.</translation> +<translation id="1582732959743469162">This will stop all progress for your current download.</translation> <translation id="1612730193129642006">Show Tab Grid</translation> <translation id="1644574205037202324">History</translation> <translation id="1646446875146297738">Enabling ‘Do Not Track’ means that a request will be included with your browsing traffic. Any effect depends on whether a website responds to the request, and how the request is interpreted. @@ -284,6 +285,7 @@ <translation id="633809752005859102">Something went really wrong. We'll work on that.</translation> <translation id="6342069812937806050">Just now</translation> <translation id="6344783595350022745">Clear Text</translation> +<translation id="6346549652287021269">Start new download?</translation> <translation id="6362362396625799311">No Incognito Tabs</translation> <translation id="6374469231428023295">Try Again</translation> <translation id="6380866119319257197">If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /></translation> @@ -325,6 +327,7 @@ <translation id="7031882061095297553">Sync to</translation> <translation id="7053983685419859001">Block</translation> <translation id="7062545763355031412">Accept and switch accounts</translation> +<translation id="7102005569666697658">Downloading… <ph name="FILE_SIZE" /></translation> <translation id="7108338896283013870">Hide</translation> <translation id="7133798577887235672">Full Name</translation> <translation id="7136892417564438900">Camera is unavailable</translation> @@ -360,6 +363,7 @@ <translation id="7769602470925380267">Accept and sign out</translation> <translation id="7772032839648071052">Confirm passphrase</translation> <translation id="780301667611848630">No, thank you</translation> +<translation id="7856733331829174190">Couldn't download</translation> <translation id="7859704718976024901">Browsing history</translation> <translation id="7938254975914653459">FaceTime</translation> <translation id="7939128259257418052">Export Passwords…</translation> @@ -370,6 +374,7 @@ <translation id="8019783059653722575">This lets you save and upload photos.</translation> <translation id="802154636333426148">Download failed</translation> <translation id="8023878949384262191">Expands the section.</translation> +<translation id="8053390638574070785">Reload This Page</translation> <translation id="8059533439631660104">Collapses the section.</translation> <translation id="806745655614357130">Keep my data separate</translation> <translation id="8076014560081431679">Saved site settings will not be deleted and may reflect your browsing habits. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation> @@ -422,6 +427,7 @@ <translation id="9083392325882095631">1 item</translation> <translation id="9100610230175265781">Passphrase required</translation> <translation id="9148126808321036104">Sign in again</translation> +<translation id="915371508759614899">Cancel download?</translation> <translation id="9157836665414082580">Suppress Dialogues</translation> <translation id="9188680907066685419">Sign out of managed account</translation> <translation id="9203116392574189331">Handoff</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 c5c86ac..90b6cb15 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Te permite guardar fotos y cargarlas.</translation> <translation id="802154636333426148">Error en la descarga</translation> <translation id="8023878949384262191">Expande la sección.</translation> +<translation id="8053390638574070785">Volver a cargar esta página</translation> <translation id="8059533439631660104">Contrae la sección.</translation> <translation id="806745655614357130">Mantener mis datos separados</translation> <translation id="8076014560081431679">Las opciones de configuración de sitios guardadas no se borrarán y es posible que reflejen tus hábitos de navegación. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index cb9cb50..fc46e7d7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -55,7 +55,7 @@ <translation id="1813414402673211292">Borrar datos de navegación</translation> <translation id="1820259098641718022">Añadida a Lista de lectura</translation> <translation id="1876721852596493031">Enviar datos de uso</translation> -<translation id="1886928167269928266">El origen de los tiempos</translation> +<translation id="1886928167269928266">Desde siempre</translation> <translation id="1911619930368729126">Subir a Google Drive</translation> <translation id="1941314575388338491">Toca dos veces para copiar.</translation> <translation id="1952728750904661634">Inicia sesión con una cuenta gestionada</translation> @@ -370,6 +370,7 @@ <translation id="8019783059653722575">Esto te permite guardar fotos y subirlas.</translation> <translation id="802154636333426148">No se ha podido descargar el archivo</translation> <translation id="8023878949384262191">Amplía la sección.</translation> +<translation id="8053390638574070785">Cargar página de nuevo</translation> <translation id="8059533439631660104">Oculta la sección.</translation> <translation id="806745655614357130">Mantener mis datos separados</translation> <translation id="8076014560081431679">No se eliminará la configuración guardada de los sitios web, lo cual puede reflejar tus hábitos de navegación. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index d66dc468..e435844 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">See võimaldab fotosid salvestada ja üles laadida.</translation> <translation id="802154636333426148">Allalaadimine ebaõnnestus</translation> <translation id="8023878949384262191">Laiendab jaotist.</translation> +<translation id="8053390638574070785">Laadi see leht uuesti</translation> <translation id="8059533439631660104">Ahendab jaotist.</translation> <translation id="806745655614357130">Hoia minu andmed eraldi</translation> <translation id="8076014560081431679">Saitide salvestatud seadeid ei kustutata ja need võivad kajastada teie sirvimisharjumusi. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 5a778a3..296fd36f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -371,6 +371,7 @@ <translation id="8019783059653722575">این کار به شما اجازه میدهد عکسها را ذخیره و بارگذاری کنید.</translation> <translation id="802154636333426148">بارگیری نشد</translation> <translation id="8023878949384262191">بخش را بزرگ میکند.</translation> +<translation id="8053390638574070785">تازه سازی این صفحه</translation> <translation id="8059533439631660104">بخش را کوچک میکند.</translation> <translation id="806745655614357130">دادههای من مجزا باشد</translation> <translation id="8076014560081431679">تنظیمات ذخیرهشده سایت حذف نمیشوند و احتمالاً عادات مرور شما را نشان میدهند. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 8d4857d..29d37c9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Tämän avulla voit tallentaa kuvia ja ladata niitä palvelimelle.</translation> <translation id="802154636333426148">Lataus epäonnistui.</translation> <translation id="8023878949384262191">Laajentaa osion.</translation> +<translation id="8053390638574070785">Lataa tämä sivu uudelleen</translation> <translation id="8059533439631660104">Tiivistää osion.</translation> <translation id="806745655614357130">Pidä tiedot erillään</translation> <translation id="8076014560081431679">Tallennettuja sivustoasetuksia ei poisteta, ja ne saattavat sisältää tietoa selaustavoistasi. <ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 34d0ecdf..8085b0b8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Binibigyang-daan ka nito upang makapag-save at makapag-upload ng mga larawan.</translation> <translation id="802154636333426148">Hindi na-download</translation> <translation id="8023878949384262191">Pinapalawak ang seksyon.</translation> +<translation id="8053390638574070785">Reload This Page</translation> <translation id="8059533439631660104">Kino-collapse ang seksyon.</translation> <translation id="806745655614357130">Panatilihing hiwalay ang aking data</translation> <translation id="8076014560081431679">Hindi made-delete ang mga naka-save na setting ng site at maaari nitong ipakita ang iyong mga gawi sa pagba-browse. <ph name="BEGIN_LINK" />Matuto nang higit pa<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 19e0449..aace731c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Cela vous permet d'enregistrer et d'importer des photos.</translation> <translation id="802154636333426148">Échec du téléchargement</translation> <translation id="8023878949384262191">Développe la section.</translation> +<translation id="8053390638574070785">Actualiser cette page</translation> <translation id="8059533439631660104">Réduit la section.</translation> <translation id="806745655614357130">Conserver mes données à part</translation> <translation id="8076014560081431679">Les paramètres de site enregistrés ne seront pas supprimés et peuvent donner des indications sur vos habitudes de navigation. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index b1552adb..21a9729 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">આ તમને ફોટો સાચવવા અને અપલોડ કરવા દે છે.</translation> <translation id="802154636333426148">ડાઉનલોડ નિષ્ફળ થયું</translation> <translation id="8023878949384262191">વિભાગને વિસ્તૃત કરે છે.</translation> +<translation id="8053390638574070785">આ પૃષ્ઠને રીલોડ કરો</translation> <translation id="8059533439631660104">વિભાગને સંકુચિત કરે છે.</translation> <translation id="806745655614357130">મારા ડેટાને અલગ રાખો</translation> <translation id="8076014560081431679">સાચવેલ સાઇટ સેટિંગ્સ કાઢી નાખવામાં આવશે નહીં અને તે તમારી બ્રાઉઝિંગ ટેવોને પ્રતિબિંબિત કરી શકે છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index a8e40e2..fea03362 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">इससे आप फ़ोटो सहेज सकते हैं और अपलोड कर सकते हैं.</translation> <translation id="802154636333426148">डाउनलोड विफल रहा</translation> <translation id="8023878949384262191">अनुभाग का विस्तार करता है.</translation> +<translation id="8053390638574070785">यह पेज फिर से लोड करें</translation> <translation id="8059533439631660104">अनुभाग को संक्षिप्त करें.</translation> <translation id="806745655614357130">मेरा डेटा अलग रखें</translation> <translation id="8076014560081431679">सहेजी गई साइट सेटिंग नहीं हटाई जाएंगी और इससे आपका ब्राउज़िंग व्यवहार प्रदर्शित हो सकता है. <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 30a1719a..66aa40c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">To vam omogućuje spremanje i prijenos fotografija.</translation> <translation id="802154636333426148">Preuzimanje nije uspjelo</translation> <translation id="8023878949384262191">Proširuje odjeljak.</translation> +<translation id="8053390638574070785">Ponovo učitaj ovu stranicu</translation> <translation id="8059533439631660104">Sažima odjeljak.</translation> <translation id="806745655614357130">Moje podatke čuvaj zasebno</translation> <translation id="8076014560081431679">Spremljene postavke web-lokacije neće se izbrisati i mogu odražavati vaše navike prilikom pregledavanja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index 97f605b..9bbc862 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Lehetővé teszi a fotók mentését és feltöltését.</translation> <translation id="802154636333426148">Nem sikerült a letöltés</translation> <translation id="8023878949384262191">Kibontja a panelt.</translation> +<translation id="8053390638574070785">Az oldal újratöltése</translation> <translation id="8059533439631660104">Összecsukja a panelt.</translation> <translation id="806745655614357130">Maradjanak elkülönítve az adataim</translation> <translation id="8076014560081431679">A mentett webhelybeállítások nem törlődnek, és tájékozódási alapul szolgálhatnak böngészési szokásait illetően. <ph name="BEGIN_LINK" />További információ.<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 2aa378f..c32a35f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Hal ini memungkinkan Anda menyimpan dan mengupload foto.</translation> <translation id="802154636333426148">Download gagal</translation> <translation id="8023878949384262191">Luaskan bagian.</translation> +<translation id="8053390638574070785">Muat Ulang Halaman Ini</translation> <translation id="8059533439631660104">Ciutkan bagian.</translation> <translation id="806745655614357130">Tetap pisahkan data saya</translation> <translation id="8076014560081431679">Setelan situs yang disimpan tidak akan dihapus dan dapat mencerminkan kebiasaan penjelajahan Anda. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 474b3226..744998d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">In questo modo puoi salvare e caricare foto.</translation> <translation id="802154636333426148">Download non riuscito</translation> <translation id="8023878949384262191">Viene espansa la sezione.</translation> +<translation id="8053390638574070785">Ricarica questa pagina</translation> <translation id="8059533439631660104">Viene compressa la sezione.</translation> <translation id="806745655614357130">Mantieni separati i miei dati</translation> <translation id="8076014560081431679">Le impostazioni del sito salvate non verranno eliminate e potrebbero rispecchiare le tue abitudini di navigazione. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index bcc21c7..4e1274b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">אישור זה מאפשר לך לשמור ולהעלות תמונות.</translation> <translation id="802154636333426148">ההורדה נכשלה</translation> <translation id="8023878949384262191">מרחיב את הקטע.</translation> +<translation id="8053390638574070785">טען דף זה מחדש</translation> <translation id="8059533439631660104">מכווץ את הקטע.</translation> <translation id="806745655614357130">שמור בנפרד את הנתונים שלי</translation> <translation id="8076014560081431679">הגדרות אתרים שנשמרו לא יימחקו ועשויות לשקף את הרגלי הגלישה שלך. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 27b6cfbbc..251235f1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">写真を保存してアップロードできます。</translation> <translation id="802154636333426148">ダウンロード エラー</translation> <translation id="8023878949384262191">セクションを展開します。</translation> +<translation id="8053390638574070785">ページを再読み込み</translation> <translation id="8059533439631660104">セクションを折りたたみます。</translation> <translation id="806745655614357130">データを別に保持する</translation> <translation id="8076014560081431679">保存済みのサイト設定は削除されず、普段の閲覧行動を反映した設定などが残る場合があります。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 181eb3fe..a538787 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">ಇದು ಫೋಟೋಗಳನ್ನು ಉಳಿಸಲು ಮತ್ತು ಅಪ್ಲೋಡ್ ಮಾಡಲು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation> <translation id="802154636333426148">ಡೌನ್ಲೋಡ್ ವಿಫಲಗೊಂಡಿದೆ</translation> <translation id="8023878949384262191">ವಿಭಾಗವನ್ನು ವಿಸ್ತರಿಸುತ್ತದೆ.</translation> +<translation id="8053390638574070785">ಈ ಪುಟವನ್ನು ರೀಲೋಡ್ ಮಾಡಿ</translation> <translation id="8059533439631660104">ವಿಭಾಗವನ್ನು ಕುಗ್ಗಿಸುತ್ತದೆ.</translation> <translation id="806745655614357130">ನನ್ನ ಡೇಟಾ ಪ್ರತ್ಯೇಕವಾಗಿ ಇರಿಸಿಕೊಳ್ಳಿ</translation> <translation id="8076014560081431679">ಉಳಿಸಲಾದ ಸೈಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಹವ್ಯಾಸಗಳನ್ನು ಪ್ರತಿಬಿಂಬಿಸಬಹುದು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 7e3ecd51c..7dc1061d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">액세스를 허용하면 사진을 저장하고 업로드할 수 있습니다.</translation> <translation id="802154636333426148">다운로드 실패</translation> <translation id="8023878949384262191">섹션을 확장합니다.</translation> +<translation id="8053390638574070785">페이지 새로고침</translation> <translation id="8059533439631660104">섹션을 접습니다.</translation> <translation id="806745655614357130">내 데이터 별도로 유지</translation> <translation id="8076014560081431679">저장된 사이트 설정은 삭제되지 않으며 인터넷 사용 습관이 반영될 수 있습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index e4b961d..144feea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Taip galite išsaugoti ir įkelti nuotraukas.</translation> <translation id="802154636333426148">Įvyko atsisiuntimo klaida</translation> <translation id="8023878949384262191">Išplečia skiltį.</translation> +<translation id="8053390638574070785">Iš naujo įkelti šį puslapį</translation> <translation id="8059533439631660104">Sutraukia skiltį.</translation> <translation id="806745655614357130">Duomenis laikyti atskirai</translation> <translation id="8076014560081431679">Išsaugoti svetainių nustatymai nebus ištrinti ir gali nurodyti naršymo įpročius. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index b795c24..756f6737 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Varat saglabāt un augšupielādēt fotoattēlus.</translation> <translation id="802154636333426148">Lejupielāde neizdevās</translation> <translation id="8023878949384262191">Izvērš sadaļu.</translation> +<translation id="8053390638574070785">Atkārtoti ielādēt šo lapu</translation> <translation id="8059533439631660104">Sakļauj sadaļu.</translation> <translation id="806745655614357130">Glabāt datus atsevišķi</translation> <translation id="8076014560081431679">Saglabātie vietņu iestatījumi netiks dzēsti, un tie var atspoguļot jūsu pārlūkošanas ieradumus. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 1920d0c..8b25ed97 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">ഇത് ഫോട്ടോകൾ സംരക്ഷിച്ച്, അപ്ലോഡുചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു.</translation> <translation id="802154636333426148">ഡൗൺലോഡ് പരാജയപ്പെട്ടു</translation> <translation id="8023878949384262191">വിഭാഗത്തെ വിപുലീകരിക്കുന്നു.</translation> +<translation id="8053390638574070785">ഈ പേജ് വീണ്ടും ലോഡ് ചെയ്യുക</translation> <translation id="8059533439631660104">വിഭാഗത്തെ ചുരുക്കുന്നു.</translation> <translation id="806745655614357130">എന്റെ വിവരങ്ങൾ പ്രത്യേകം വേർതിരിച്ച് സൂക്ഷിക്കുക</translation> <translation id="8076014560081431679">സംരക്ഷിച്ച സൈറ്റ് ക്രമീകരണം ഇല്ലാതാക്കപ്പെടില്ല, ഇത് നിങ്ങളുടെ ബ്രൗസിംഗ് രീതികളെ പ്രതിഫലിപ്പിക്കാനുമിടയുണ്ട്. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index b6b34b6..44445765 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -371,6 +371,7 @@ <translation id="8019783059653722575">हे आपल्याला फोटो जतन आणि अपलोड करू देते.</translation> <translation id="802154636333426148">डाउनलोड अयशस्वी झाले</translation> <translation id="8023878949384262191">विभाग विस्तृत करते.</translation> +<translation id="8053390638574070785">हे पृष्ठ रीलोड करा</translation> <translation id="8059533439631660104">विभाग संकुचित करा.</translation> <translation id="806745655614357130">माझा डेटा स्वतंत्र ठेवा</translation> <translation id="8076014560081431679">जतन केलेल्या साइट सेटिंग्ज हटविल्या जाणार नाहीत आणि कदाचित आपल्या ब्राउझिंग सवयी दर्शवेल. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 60c8505e..6393afa5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Langkah ini membolehkan anda menyimpan dan memuat naik foto.</translation> <translation id="802154636333426148">Muat turun gagal</translation> <translation id="8023878949384262191">Mengembangkan bahagian.</translation> +<translation id="8053390638574070785">Muatkan Semula Halaman Ini</translation> <translation id="8059533439631660104">Meruntuhkan bahagian.</translation> <translation id="806745655614357130">Biarkan data saya diasingkan</translation> <translation id="8076014560081431679">Tetapan tapak yang disimpan tidak akan dipadamkan dan mungkin mencerminkan tabiat semak imbas anda. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index 045b478..3c638e4d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Hiermee kun je foto's opslaan en uploaden.</translation> <translation id="802154636333426148">Downloaden mislukt</translation> <translation id="8023878949384262191">Hiermee wordt het gedeelte uitgevouwen.</translation> +<translation id="8053390638574070785">Laad pagina opnieuw</translation> <translation id="8059533439631660104">Hiermee wordt het gedeelte samengevouwen.</translation> <translation id="806745655614357130">Mijn gegevens gescheiden houden</translation> <translation id="8076014560081431679">Opgeslagen site-instellingen worden niet verwijderd en kunnen je browsegedrag weerspiegelen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index af713751..279adaea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Dette gjør at du kan lagre og laste opp bilder.</translation> <translation id="802154636333426148">Nedlastingen mislyktes</translation> <translation id="8023878949384262191">Utvider delen.</translation> +<translation id="8053390638574070785">Last inn denne siden på nytt</translation> <translation id="8059533439631660104">Skjuler delen.</translation> <translation id="806745655614357130">Hold dataene mine adskilt</translation> <translation id="8076014560081431679">Lagrede nettstedsinnstillinger slettes ikke og kan gjenspeile nettleserbruken din. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 51a6227..9f36962 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Umożliwia zapisywanie i przesyłanie zdjęć.</translation> <translation id="802154636333426148">Nie udało się pobrać</translation> <translation id="8023878949384262191">Rozwija sekcję.</translation> +<translation id="8053390638574070785">Załaduj ponownie tę stronę</translation> <translation id="8059533439631660104">Zwija sekcję.</translation> <translation id="806745655614357130">Przechowuj dane oddzielnie</translation> <translation id="8076014560081431679">Zapisane ustawienia witryn nie zostaną usunięte i mogą zawierać informacje o Twoim korzystaniu z przeglądarki. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></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 6f455ef..efe2b2a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -371,6 +371,7 @@ <translation id="8019783059653722575">Isso permite que você salve fotos e faça upload delas.</translation> <translation id="802154636333426148">Falha no download</translation> <translation id="8023878949384262191">Expande a seção.</translation> +<translation id="8053390638574070785">Recarregar esta página</translation> <translation id="8059533439631660104">Recolhe a seção.</translation> <translation id="806745655614357130">Manter meus dados separados</translation> <translation id="8076014560081431679">As configurações salvas em sites não são excluídas e podem refletir seus hábitos de navegação. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></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 a5bd1558..ed0602d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Isto permite-lhe guardar e carregar fotos.</translation> <translation id="802154636333426148">Falha ao transferir</translation> <translation id="8023878949384262191">Expande a secção.</translation> +<translation id="8053390638574070785">Recarregar esta página</translation> <translation id="8059533439631660104">Reduz a secção.</translation> <translation id="806745655614357130">Manter os meus dados separados</translation> <translation id="8076014560081431679">As definições de sites guardadas não são eliminadas e podem refletir os seus hábitos de navegação. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index ab06337..17fa6abf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Astfel, poți să salvezi și să încarci fotografiile.</translation> <translation id="802154636333426148">Descărcarea nu a reușit</translation> <translation id="8023878949384262191">Extinde secțiunea.</translation> +<translation id="8053390638574070785">Reîncarcă această pagină</translation> <translation id="8059533439631660104">Restrânge secțiunea.</translation> <translation id="806745655614357130">Păstrează datele separat</translation> <translation id="8076014560081431679">Setările salvate pentru site-uri nu vor fi șterse și pot reflecta obiceiurile de navigare. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 9758a023..bb6f0af1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Это нужно, чтобы сохранять и загружать фотографии</translation> <translation id="802154636333426148">Ошибка скачивания</translation> <translation id="8023878949384262191">Разворачивает раздел.</translation> +<translation id="8053390638574070785">Обновить страницу</translation> <translation id="8059533439631660104">Сворачивает раздел.</translation> <translation id="806745655614357130">Не объединять данные</translation> <translation id="8076014560081431679">Настройки сайтов не изменятся, поэтому данные о вашей работе в Интернете сохранятся. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 52ce109c..fbc69ce1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Umožňuje uložiť a nahrať fotky.</translation> <translation id="802154636333426148">Stiahnutie zlyhalo</translation> <translation id="8023878949384262191">Rozbalí sekciu.</translation> +<translation id="8053390638574070785">Obnoviť túto stránku</translation> <translation id="8059533439631660104">Zbalí sekciu.</translation> <translation id="806745655614357130">Ponechať moje dáta oddelené</translation> <translation id="8076014560081431679">Uložené nastavenia webov sa neodstránia a môžu odrážať vaše návyky prehliadania. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index a6da475..d3fa4e5a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -368,6 +368,7 @@ <translation id="8019783059653722575">S tem je mogoče shranjevati in nalagati fotografije.</translation> <translation id="802154636333426148">Prenos ni uspel</translation> <translation id="8023878949384262191">Razširi razdelek.</translation> +<translation id="8053390638574070785">Znova naloži to stran</translation> <translation id="8059533439631660104">Strni razdelek.</translation> <translation id="806745655614357130">Podatki naj bodo ločeni</translation> <translation id="8076014560081431679">Shranjene nastavitve spletnih mest ne bodo izbrisane in morda odražajo vaše brskalne navade. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 4580297..376dd5c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Ово вам омогућава да чувате и отпремате слике.</translation> <translation id="802154636333426148">Преузимање није успело</translation> <translation id="8023878949384262191">Проширује одељак.</translation> +<translation id="8053390638574070785">Поново учитај ову страницу</translation> <translation id="8059533439631660104">Скупља одељак.</translation> <translation id="806745655614357130">Не обједињуј моје податке</translation> <translation id="8076014560081431679">Нећемо избрисати сачувана подешавања сајтова и она могу да одражавају ваше навике при прегледању. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index 2798777..47f4811 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Det här gör att du kan spara foton och ladda upp dem.</translation> <translation id="802154636333426148">Nedladdningen misslyckades</translation> <translation id="8023878949384262191">Expanderar avsnittet.</translation> +<translation id="8053390638574070785">Hämta sidan igen</translation> <translation id="8059533439631660104">Komprimera avsnittet.</translation> <translation id="806745655614357130">Håll min data separat</translation> <translation id="8076014560081431679">Sparade webbplatsinställningar raderas inte och kan visa dina surfvanor. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 10d2582..fa2f635 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Hii hukuwezesha kuhifadhi na kupakia picha.</translation> <translation id="802154636333426148">Haikuweza kupakua</translation> <translation id="8023878949384262191">Hupanua sehemu.</translation> +<translation id="8053390638574070785">Pakia Ukurasa Huu Upya</translation> <translation id="8059533439631660104">Hukunja sehemu.</translation> <translation id="806745655614357130">Weka data yangu katika sehemu tofauti</translation> <translation id="8076014560081431679">Mipangilio ya tovuti iliyohifadhiwa haitafutwa na inaweza kuonyesha mtindo wako wa kuvinjari. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 65c744a..916511c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">இதன் மூலம் படங்களைச் சேமித்துப் பதிவேற்றலாம்.</translation> <translation id="802154636333426148">பதிவிறக்க முடியவில்லை</translation> <translation id="8023878949384262191">பிரிவை விரிவாக்கும்.</translation> +<translation id="8053390638574070785">இந்த பக்கத்தை மீண்டும் ஏற்றுக</translation> <translation id="8059533439631660104">பிரிவைச் சுருக்கும்.</translation> <translation id="806745655614357130">எனது தரவைத் தனியாக வை</translation> <translation id="8076014560081431679">சேமித்த தள அமைப்புகள் நீக்கப்படாது, அவை உங்கள் உலாவல் தகவல்களைப் பிரதிபலிக்கக்கூடும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index a05d288..0707e4e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">దీని వలన మీరు ఫోటోలను సేవ్ చేసి, అప్లోడ్ చేయగలుగుతారు.</translation> <translation id="802154636333426148">డౌన్లోడ్ విఫలమైంది</translation> <translation id="8023878949384262191">విభాగాన్ని విస్తరింపజేస్తుంది.</translation> +<translation id="8053390638574070785">ఈ పేజీని రీలోడ్ చెయ్యి</translation> <translation id="8059533439631660104">విభాగాన్ని కుదిస్తుంది.</translation> <translation id="806745655614357130">నా డేటాను విడిగా ఉంచండి</translation> <translation id="8076014560081431679">సేవ్ చేసిన సైట్ సెట్టింగ్లు తొలగించబడవు మరియు మీ బ్రౌజింగ్ అలవాట్లను ప్రదర్శించవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 28c963d..007345d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -368,6 +368,7 @@ <translation id="8019783059653722575">ช่วยให้คุณบันทึกและอัปโหลดรูปภาพได้</translation> <translation id="802154636333426148">การดาวน์โหลดล้มเหลว</translation> <translation id="8023878949384262191">ขยายส่วนนี้</translation> +<translation id="8053390638574070785">โหลดหน้านี้ใหม่</translation> <translation id="8059533439631660104">ยุบส่วนนี้</translation> <translation id="806745655614357130">เก็บข้อมูลของฉันแยกต่างหาก</translation> <translation id="8076014560081431679">การตั้งค่าเว็บไซต์ที่บันทึกไว้จะไม่ถูกลบและอาจส่งผลกับลักษณะการท่องเว็บของคุณ <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 8e57962..ba31d08c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Böylece, fotoğrafları kaydedebilir ve yükleyebilirsiniz.</translation> <translation id="802154636333426148">İndirilemedi</translation> <translation id="8023878949384262191">Seçimi genişletir.</translation> +<translation id="8053390638574070785">Bu Sayfayı Tekrar Yükle</translation> <translation id="8059533439631660104">Bölümü daraltır.</translation> <translation id="806745655614357130">Verilerimi ayrı tut</translation> <translation id="8076014560081431679">Kayıtlı site ayarları silinmez ve web'e göz atma alışkanlıklarınızı yansıtabilir. <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index f937e47..64d7a93 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Ви зможете зберігати й завантажувати фотографії.</translation> <translation id="802154636333426148">Не вдалося завантажити</translation> <translation id="8023878949384262191">Розгортає розділ.</translation> +<translation id="8053390638574070785">Перезавантажити цю сторінку</translation> <translation id="8059533439631660104">Згортає розділ.</translation> <translation id="806745655614357130">Зберігати мої дані окремо</translation> <translation id="8076014560081431679">Збережені налаштування, які можуть стосуватися ваших зацікавлень в Інтернеті, не буде видалено. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 9afa6e7..63aef7bd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">Điều này cho phép bạn lưu và tải ảnh lên.</translation> <translation id="802154636333426148">Tải xuống không thành công</translation> <translation id="8023878949384262191">Mở rộng phần.</translation> +<translation id="8053390638574070785">Tải lại Trang Này</translation> <translation id="8059533439631660104">Thu gọn phần.</translation> <translation id="806745655614357130">Giữ dữ liệu của tôi riêng biệt</translation> <translation id="8076014560081431679">Cài đặt trang web đã lưu sẽ không bị xóa và có thể phản ánh thói quen duyệt web của bạn. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></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 1385f690..c960970 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">这样,您就可以保存并上传照片。</translation> <translation id="802154636333426148">下载失败</translation> <translation id="8023878949384262191">展开此部分。</translation> +<translation id="8053390638574070785">重新加载此页</translation> <translation id="8059533439631660104">合拢此部分。</translation> <translation id="806745655614357130">单独保存我的数据</translation> <translation id="8076014560081431679">已保存的网站设置将不会遭到删除,并且可能会反映您的浏览习惯。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></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 f7f6485..03cdba0e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -370,6 +370,7 @@ <translation id="8019783059653722575">可讓你儲存並上傳相片。</translation> <translation id="802154636333426148">下載失敗</translation> <translation id="8023878949384262191">展開這個專區。</translation> +<translation id="8053390638574070785">重新載入此網頁</translation> <translation id="8059533439631660104">收合這個專區。</translation> <translation id="806745655614357130">分開保留我的資料</translation> <translation id="8076014560081431679">已儲存的網站設定不會遭到刪除,而且可能會反映您的瀏覽習慣。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/browser/ui/download/BUILD.gn b/ios/chrome/browser/ui/download/BUILD.gn index 51a6cc3..18af241 100644 --- a/ios/chrome/browser/ui/download/BUILD.gn +++ b/ios/chrome/browser/ui/download/BUILD.gn
@@ -25,7 +25,9 @@ "radial_progress_view.mm", ] deps = [ + "resources:done_badge", "resources:download_manager_controller_xib", + "resources:error_badge", "resources:error_icon", "resources:file_icon_body", "resources:file_icon_fold",
diff --git a/ios/chrome/browser/ui/download/download_manager_state_view.mm b/ios/chrome/browser/ui/download/download_manager_state_view.mm index f3dd72df..60d490f3 100644 --- a/ios/chrome/browser/ui/download/download_manager_state_view.mm +++ b/ios/chrome/browser/ui/download/download_manager_state_view.mm
@@ -23,14 +23,19 @@ } // namespace @interface DownloadManagerStateView () -// CALayer that backs this view up. -@property(nonatomic, readonly) CAShapeLayer* shapeLayer; +// CALayer that backs this view up. Responsible for drawing the icon. +@property(nonatomic, readonly) CAShapeLayer* iconLayer; + +// CALayer for error or done badge. +@property(nonatomic, readonly) CALayer* badgeLayer; + @end @implementation DownloadManagerStateView @synthesize state = _state; @synthesize downloadColor = _downloadColor; @synthesize documentColor = _documentColor; +@synthesize badgeLayer = _badgeLayer; #pragma mark - UIView overrides @@ -40,6 +45,14 @@ - (void)setBounds:(CGRect)bounds { [super setBounds:bounds]; + + CGImageRef badgeImage = [self completionBadgeImage]; + CGFloat scale = UIScreen.mainScreen.scale; + self.badgeLayer.frame = CGRectMake(CGRectGetMidX(self.iconLayer.bounds), + CGRectGetMidY(self.iconLayer.bounds), + CGImageGetWidth(badgeImage) / scale, + CGImageGetHeight(badgeImage) / scale); + [self updateUIAnimated:NO]; } @@ -62,41 +75,81 @@ #pragma mark - Private +// Returns completion badge image approprivate for the state. The badge is +// visible only in Succeeded and Failed states. Badge presentation is animated +// by changing the badge scale. +- (CGImageRef)completionBadgeImage { + NSString* const imageName = + _state == kDownloadManagerStateSucceeded ? @"done_badge" : @"error_badge"; + return [UIImage imageNamed:imageName].CGImage; +} + +// Updates CoreAnimation layers (icon and badge). - (void)updateUIAnimated:(BOOL)animated { NSTimeInterval animationDuration = animated ? kDownloadManagerAnimationDuration : 0.0; switch (_state) { case kDownloadManagerStateNotStarted: - self.shapeLayer.path = self.downloadPath.CGPath; - self.shapeLayer.fillColor = self.downloadColor.CGColor; - self.shapeLayer.strokeColor = self.downloadColor.CGColor; - self.shapeLayer.transform = CATransform3DIdentity; + self.iconLayer.path = self.downloadPath.CGPath; + self.iconLayer.fillColor = self.downloadColor.CGColor; + self.iconLayer.strokeColor = self.downloadColor.CGColor; + self.iconLayer.transform = CATransform3DIdentity; + self.badgeLayer.transform = + CATransform3DScale(CATransform3DIdentity, 0, 0, 1); break; case kDownloadManagerStateSucceeded: case kDownloadManagerStateFailed: { - self.shapeLayer.path = self.documentPath.CGPath; - self.shapeLayer.fillColor = self.documentColor.CGColor; - self.shapeLayer.strokeColor = self.documentColor.CGColor; - if (!CATransform3DIsIdentity(self.shapeLayer.transform)) { + self.badgeLayer.contents = (__bridge id)[self completionBadgeImage]; + self.iconLayer.path = self.documentPath.CGPath; + self.iconLayer.fillColor = self.documentColor.CGColor; + self.iconLayer.strokeColor = self.documentColor.CGColor; + if (!CATransform3DIsIdentity(self.iconLayer.transform)) { [UIView animateWithDuration:animationDuration - animations:^{ - self.shapeLayer.transform = CATransform3DIdentity; - }]; + animations:^{ // Resize the icon. + self.iconLayer.transform = CATransform3DIdentity; + } + completion:^(BOOL finished) { // Resize the badge. + [CATransaction begin]; + [CATransaction setAnimationDuration:animationDuration]; + self.badgeLayer.transform = CATransform3DIdentity; + [CATransaction commit]; + }]; } break; } case kDownloadManagerStateInProgress: - self.shapeLayer.path = self.documentPath.CGPath; - self.shapeLayer.fillColor = self.documentColor.CGColor; - self.shapeLayer.strokeColor = self.documentColor.CGColor; - self.shapeLayer.transform = CATransform3DScale( - CATransform3DIdentity, kInProgressScale, kInProgressScale, 1); + if (CGPathEqualToPath(self.iconLayer.path, self.downloadPath.CGPath)) { + // There should be no animation when changing from downloadPath to + // documentPath. + animationDuration = 0; + } + + self.iconLayer.path = self.documentPath.CGPath; + self.iconLayer.fillColor = self.documentColor.CGColor; + self.iconLayer.strokeColor = self.documentColor.CGColor; + if (CATransform3DIsIdentity(self.iconLayer.transform)) { + [CATransaction begin]; // Resize the badge. + [CATransaction setAnimationDuration:animationDuration]; + self.badgeLayer.transform = + CATransform3DScale(CATransform3DIdentity, 0, 0, 1); + [CATransaction setCompletionBlock:^{ + [UIView animateWithDuration:animationDuration + animations:^{ // Resize the icon. + self.iconLayer.transform = CATransform3DScale( + CATransform3DIdentity, kInProgressScale, + kInProgressScale, 1); + }]; + }]; + [CATransaction commit]; + } + break; } - self.shapeLayer.lineWidth = kLineWidth; + self.iconLayer.lineWidth = kLineWidth; } +// Used for all states except "not started" for icon layer. - (UIBezierPath*)documentPath { const CGFloat kVerticalMargin = 4; // top and bottom margins const CGFloat kAspectRatio = 0.82; // height is bigger than width @@ -148,6 +201,7 @@ return path; } +// Used for "not started" state for icon layer. - (UIBezierPath*)downloadPath { const CGFloat horizontalMargin = 6; // left and right margins const CGFloat topMargin = 4; @@ -188,8 +242,16 @@ return path; } -- (CAShapeLayer*)shapeLayer { +- (CAShapeLayer*)iconLayer { return base::mac::ObjCCastStrict<CAShapeLayer>(self.layer); } +- (CALayer*)badgeLayer { + if (!_badgeLayer) { + _badgeLayer = [CALayer layer]; + [self.iconLayer addSublayer:_badgeLayer]; + } + return _badgeLayer; +} + @end
diff --git a/ios/chrome/browser/ui/download/download_manager_view_controller.mm b/ios/chrome/browser/ui/download/download_manager_view_controller.mm index 17420b6..51387f5 100644 --- a/ios/chrome/browser/ui/download/download_manager_view_controller.mm +++ b/ios/chrome/browser/ui/download/download_manager_view_controller.mm
@@ -10,7 +10,6 @@ #include "ios/chrome/browser/ui/download/download_manager_animation_constants.h" #import "ios/chrome/browser/ui/download/download_manager_state_view.h" #import "ios/chrome/browser/ui/download/radial_progress_view.h" -#import "ios/chrome/browser/ui/uikit_ui_util.h" #import "ios/chrome/browser/ui/util/named_guide.h" #include "ios/chrome/grit/ios_strings.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" @@ -31,10 +30,6 @@ // button). Defines the minimal distance between elements. const CGFloat kElementMargin = 16; -// Ideal download UI width if user interface has regular width. For compact -// user interface width download UI will take full width of the superview. -const CGFloat kPreferredWidthForRegularUIWidth = 500; - // Returns formatted size string. NSString* GetSizeString(long long size_in_bytes) { return [NSByteCountFormatter @@ -86,9 +81,9 @@ // deactivating the old constraint. @property(nonatomic) NSLayoutConstraint* bottomConstraint; -// Represents constraint for self.view.widthAnchor, which can either be -// constrained to superview's width or to kPreferredWidthForRegularUIWidth -// constant. Stored in a property to allow deactivating the old constraint. +// Represents constraint for self.view.widthAnchor, which is anchored to +// superview with different multipliers depending on size class. Stored in a +// property to allow deactivating the old constraint. @property(nonatomic) NSLayoutConstraint* widthConstraint; @end @@ -135,7 +130,7 @@ // self.view constraints. UIView* view = self.view; [self updateBottomConstraints]; - [self updateWidthConstraints]; + [self updateWidthConstraintsForTraitCollection:self.traitCollection]; // shadow constraints. UIImageView* shadow = self.shadow; @@ -275,10 +270,14 @@ ]]; } -- (void)viewWillTransitionToSize:(CGSize)size - withTransitionCoordinator: - (id<UIViewControllerTransitionCoordinator>)coordinator { - [self updateWidthConstraints]; +- (void)willTransitionToTraitCollection:(UITraitCollection*)newCollection + withTransitionCoordinator: + (id<UIViewControllerTransitionCoordinator>)coordinator { + void (^alongsideBlock)(id<UIViewControllerTransitionCoordinatorContext>) = + ^(id<UIViewControllerTransitionCoordinatorContext> context) { + [self updateWidthConstraintsForTraitCollection:newCollection]; + }; + [coordinator animateAlongsideTransition:alongsideBlock completion:nil]; } #pragma mark - Public @@ -565,29 +564,23 @@ self.bottomConstraint.active = YES; } -// Updates and activates self.widthConstraint. self.widthConstraint -// constraints self.view.widthAnchor to superview's width if user interface has -// compact width or there is no room to use kPreferredWidthForRegularUIWidth. -// Otherwise self.widthConstraint constraints self.view.widthAnchor to -// kPreferredWidthForRegularUIWidth constant. -- (void)updateWidthConstraints { +// Updates and activates self.widthConstraint anchored to superview width. Uses +// smaller multiplier for regular ui size class, because otherwise the bar will +// be too wide. +- (void)updateWidthConstraintsForTraitCollection: + (UITraitCollection*)traitCollection { self.widthConstraint.active = NO; - NSLayoutDimension* firstAnchor = self.view.widthAnchor; - CGFloat superviewWidth = self.view.superview.frame.size.width; - if (superviewWidth < kPreferredWidthForRegularUIWidth || IsCompactWidth()) { - // Superview is too narrow to accomodate kPreferredWidthForRegularUIWidth or - // user interface has compant width. In this case download view should - // occupy all superview width. - NSLayoutDimension* secondAnchor = self.view.superview.widthAnchor; - self.widthConstraint = [firstAnchor constraintEqualToAnchor:secondAnchor]; - } else { - // Superview is wide enough to accomodate kPreferredWidthForRegularUIWidth - // or user interface has regular width. In this case download view width - // should be constant. Otherwise the UI will jhave too much blank space. - self.widthConstraint = [firstAnchor - constraintEqualToConstant:kPreferredWidthForRegularUIWidth]; - } + // With regular horizontal size class, UI is too wide to take the full width, + // because there will be a lot of blank space. + CGFloat multiplier = + traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular + ? 0.6 + : 1.0; + + self.widthConstraint = [self.view.widthAnchor + constraintEqualToAnchor:self.view.superview.widthAnchor + multiplier:multiplier]; self.widthConstraint.active = YES; }
diff --git a/ios/chrome/browser/ui/download/resources/BUILD.gn b/ios/chrome/browser/ui/download/resources/BUILD.gn index 4ff56bf..f51b30ba 100644 --- a/ios/chrome/browser/ui/download/resources/BUILD.gn +++ b/ios/chrome/browser/ui/download/resources/BUILD.gn
@@ -9,6 +9,24 @@ source = "DownloadManagerController.xib" } +imageset("done_badge") { + sources = [ + "done_badge.imageset/Contents.json", + "done_badge.imageset/done_badge.png", + "done_badge.imageset/done_badge@2x.png", + "done_badge.imageset/done_badge@3x.png", + ] +} + +imageset("error_badge") { + sources = [ + "error_badge.imageset/Contents.json", + "error_badge.imageset/error_badge.png", + "error_badge.imageset/error_badge@2x.png", + "error_badge.imageset/error_badge@3x.png", + ] +} + imageset("error_icon") { sources = [ "error_icon.imageset/Contents.json",
diff --git a/ios/chrome/browser/ui/download/resources/done_badge.imageset/Contents.json b/ios/chrome/browser/ui/download/resources/done_badge.imageset/Contents.json new file mode 100644 index 0000000..10ca2c5 --- /dev/null +++ b/ios/chrome/browser/ui/download/resources/done_badge.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "done_badge.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "done_badge@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "done_badge@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +}
diff --git a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge.png b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge.png new file mode 100644 index 0000000..a05f3d6 --- /dev/null +++ b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge.png Binary files differ
diff --git a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@2x.png b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@2x.png new file mode 100644 index 0000000..60d595b2 --- /dev/null +++ b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@3x.png b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@3x.png new file mode 100644 index 0000000..731982e --- /dev/null +++ b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/download/resources/error_badge.imageset/Contents.json b/ios/chrome/browser/ui/download/resources/error_badge.imageset/Contents.json new file mode 100644 index 0000000..664e140 --- /dev/null +++ b/ios/chrome/browser/ui/download/resources/error_badge.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "error_badge.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "error_badge@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "error_badge@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +}
diff --git a/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge.png b/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge.png new file mode 100644 index 0000000..16e44e9d --- /dev/null +++ b/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge.png Binary files differ
diff --git a/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge@2x.png b/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge@2x.png new file mode 100644 index 0000000..6187805c --- /dev/null +++ b/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge@3x.png b/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge@3x.png new file mode 100644 index 0000000..2d839a0 --- /dev/null +++ b/ios/chrome/browser/ui/download/resources/error_badge.imageset/error_badge@3x.png Binary files differ
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index d2024ea..d370be2 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -4222,18 +4222,17 @@ return; } - BOOL allowLoad = [self shouldAllowLoadWithNavigationAction:action]; - - if (allowLoad) { - ui::PageTransition transition = - [self pageTransitionFromNavigationType:action.navigationType]; - allowLoad = - self.webStateImpl->ShouldAllowRequest(action.request, transition); - if (!allowLoad && action.targetFrame.mainFrame) { - [_pendingNavigationInfo setCancelled:YES]; - } + ui::PageTransition transition = + [self pageTransitionFromNavigationType:action.navigationType]; + BOOL allowLoad = + self.webStateImpl->ShouldAllowRequest(action.request, transition); + if (!allowLoad && action.targetFrame.mainFrame) { + [_pendingNavigationInfo setCancelled:YES]; } + if (allowLoad) + allowLoad = [self shouldAllowLoadWithNavigationAction:action]; + if (!allowLoad && !_isBeingDestroyed) { // Loading was started for user initiated navigations and should be stopped // because no other WKWebView callbacks are called. TODO(crbug.com/767092):
diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc index e2ff8b1..7f78e61c 100644 --- a/media/mojo/services/gpu_mojo_media_client.cc +++ b/media/mojo/services/gpu_mojo_media_client.cc
@@ -110,6 +110,10 @@ MediaLog* media_log, mojom::CommandBufferIdPtr command_buffer_id, RequestOverlayInfoCB request_overlay_info_cb) { + // Both MCVD and D3D11 VideoDecoders need a command buffer. + if (!command_buffer_id) + return nullptr; + #if defined(OS_ANDROID) auto get_stub_cb = base::Bind(&GetCommandBufferStub, media_gpu_channel_manager_,
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc index 7737096..708599b 100644 --- a/media/renderers/paint_canvas_video_renderer.cc +++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -144,6 +144,7 @@ source_textures[i].fTarget = GL_TEXTURE_2D; } } + context_3d.gr_context->resetContext(kTextureBinding_GrGLBackendState); GrBackendTexture textures[3] = { GrBackendTexture(ya_tex_size.width(), ya_tex_size.height(), GrMipMapped::kNo, source_textures[0]), @@ -207,6 +208,7 @@ PaintCanvasVideoRenderer::CopyVideoFrameSingleTextureToGLTexture( gl, video_frame, GL_TEXTURE_2D, source_texture, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 0, true, false); + context_3d.gr_context->resetContext(kTextureBinding_GrGLBackendState); } else { gl->WaitSyncTokenCHROMIUM(mailbox_holder.sync_token.GetConstData()); source_texture =
diff --git a/mojo/common/BUILD.gn b/mojo/common/BUILD.gn index 642e78f..612de0da 100644 --- a/mojo/common/BUILD.gn +++ b/mojo/common/BUILD.gn
@@ -16,16 +16,11 @@ sources = [ "memory_allocator_dump_cross_process_uid.mojom", "process_id.mojom", - "text_direction.mojom", "thread_priority.mojom", "unguessable_token.mojom", "values.mojom", ] - if (is_win) { - sources += [ "logfont_win.mojom" ] - } - public_deps = [ "//mojo/public/mojom/base", ]
diff --git a/mojo/common/common_custom_types_struct_traits.cc b/mojo/common/common_custom_types_struct_traits.cc index fd897194..7a2ea17e 100644 --- a/mojo/common/common_custom_types_struct_traits.cc +++ b/mojo/common/common_custom_types_struct_traits.cc
@@ -3,7 +3,6 @@ // found in the LICENSE file. #include "mojo/common/common_custom_types_struct_traits.h" - #include "mojo/public/cpp/system/platform_handle.h" namespace mojo { @@ -25,40 +24,6 @@ } // static -common::mojom::TextDirection -EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection>::ToMojom( - base::i18n::TextDirection text_direction) { - switch (text_direction) { - case base::i18n::UNKNOWN_DIRECTION: - return common::mojom::TextDirection::UNKNOWN_DIRECTION; - case base::i18n::RIGHT_TO_LEFT: - return common::mojom::TextDirection::RIGHT_TO_LEFT; - case base::i18n::LEFT_TO_RIGHT: - return common::mojom::TextDirection::LEFT_TO_RIGHT; - } - NOTREACHED(); - return common::mojom::TextDirection::UNKNOWN_DIRECTION; -} - -// static -bool EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection>:: - FromMojom(common::mojom::TextDirection input, - base::i18n::TextDirection* out) { - switch (input) { - case common::mojom::TextDirection::UNKNOWN_DIRECTION: - *out = base::i18n::UNKNOWN_DIRECTION; - return true; - case common::mojom::TextDirection::RIGHT_TO_LEFT: - *out = base::i18n::RIGHT_TO_LEFT; - return true; - case common::mojom::TextDirection::LEFT_TO_RIGHT: - *out = base::i18n::LEFT_TO_RIGHT; - return true; - } - return false; -} - -// static common::mojom::ThreadPriority EnumTraits<common::mojom::ThreadPriority, base::ThreadPriority>::ToMojom( base::ThreadPriority thread_priority) {
diff --git a/mojo/common/common_custom_types_struct_traits.h b/mojo/common/common_custom_types_struct_traits.h index b6aa724d..09c877e 100644 --- a/mojo/common/common_custom_types_struct_traits.h +++ b/mojo/common/common_custom_types_struct_traits.h
@@ -5,7 +5,6 @@ #ifndef MOJO_COMMON_COMMON_CUSTOM_TYPES_STRUCT_TRAITS_H_ #define MOJO_COMMON_COMMON_CUSTOM_TYPES_STRUCT_TRAITS_H_ -#include "base/i18n/rtl.h" #include "base/process/process_handle.h" #include "base/strings/utf_string_conversions.h" #include "base/trace_event/memory_allocator_dump_guid.h" @@ -13,7 +12,6 @@ #include "mojo/common/memory_allocator_dump_cross_process_uid.mojom-shared.h" #include "mojo/common/mojo_common_export.h" #include "mojo/common/process_id.mojom-shared.h" -#include "mojo/common/text_direction.mojom-shared.h" #include "mojo/common/thread_priority.mojom-shared.h" #include "mojo/common/unguessable_token.mojom-shared.h" @@ -53,14 +51,6 @@ }; template <> -struct EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection> { - static common::mojom::TextDirection ToMojom( - base::i18n::TextDirection text_direction); - static bool FromMojom(common::mojom::TextDirection input, - base::i18n::TextDirection* out); -}; - -template <> struct EnumTraits<common::mojom::ThreadPriority, base::ThreadPriority> { static common::mojom::ThreadPriority ToMojom( base::ThreadPriority thread_priority);
diff --git a/mojo/common/common_custom_types_unittest.cc b/mojo/common/common_custom_types_unittest.cc index 79282f9..14b60be 100644 --- a/mojo/common/common_custom_types_unittest.cc +++ b/mojo/common/common_custom_types_unittest.cc
@@ -101,21 +101,6 @@ mojo::Binding<TestValue> binding_; }; -class TestTextDirectionImpl : public TestTextDirection { - public: - explicit TestTextDirectionImpl(TestTextDirectionRequest request) - : binding_(this, std::move(request)) {} - - // TestTextDirection: - void BounceTextDirection(base::i18n::TextDirection in, - BounceTextDirectionCallback callback) override { - std::move(callback).Run(in); - } - - private: - mojo::Binding<TestTextDirection> binding_; -}; - class CommonCustomTypesTest : public testing::Test { protected: CommonCustomTypesTest() {} @@ -229,21 +214,6 @@ ASSERT_EQ(*input, *output); } -TEST_F(CommonCustomTypesTest, TextDirection) { - base::i18n::TextDirection kTestDirections[] = {base::i18n::LEFT_TO_RIGHT, - base::i18n::RIGHT_TO_LEFT, - base::i18n::UNKNOWN_DIRECTION}; - - TestTextDirectionPtr ptr; - TestTextDirectionImpl impl(MakeRequest(&ptr)); - - for (size_t i = 0; i < arraysize(kTestDirections); i++) { - base::i18n::TextDirection direction_out; - ASSERT_TRUE(ptr->BounceTextDirection(kTestDirections[i], &direction_out)); - EXPECT_EQ(kTestDirections[i], direction_out); - } -} - } // namespace test } // namespace common } // namespace mojo
diff --git a/mojo/common/test_common_custom_types.mojom b/mojo/common/test_common_custom_types.mojom index c9c20a3..69520da 100644 --- a/mojo/common/test_common_custom_types.mojom +++ b/mojo/common/test_common_custom_types.mojom
@@ -4,7 +4,6 @@ module mojo.common.test; -import "mojo/common/text_direction.mojom"; import "mojo/common/unguessable_token.mojom"; import "mojo/common/values.mojom"; @@ -24,9 +23,3 @@ BounceValue(mojo.common.mojom.Value? in) => (mojo.common.mojom.Value? out); }; - -interface TestTextDirection { - [Sync] - BounceTextDirection(mojo.common.mojom.TextDirection in) - => (mojo.common.mojom.TextDirection out); -};
diff --git a/mojo/common/text_direction.typemap b/mojo/common/text_direction.typemap deleted file mode 100644 index 1f5be8e..0000000 --- a/mojo/common/text_direction.typemap +++ /dev/null
@@ -1,12 +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. - -mojom = "//mojo/common/text_direction.mojom" -public_headers = [ "//base/i18n/rtl.h" ] -traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ] -public_deps = [ - "//base:i18n", - "//mojo/common:struct_traits", -] -type_mappings = [ "mojo.common.mojom.TextDirection=base::i18n::TextDirection" ]
diff --git a/mojo/common/typemaps.gni b/mojo/common/typemaps.gni index de8b35c..acf6dea 100644 --- a/mojo/common/typemaps.gni +++ b/mojo/common/typemaps.gni
@@ -3,11 +3,9 @@ # found in the LICENSE file. typemaps = [ - "//mojo/common/logfont_win.typemap", "//mojo/common/memory_allocator_dump_cross_process_uid.typemap", "//mojo/common/process_id.typemap", "//mojo/common/read_only_buffer.typemap", - "//mojo/common/text_direction.typemap", "//mojo/common/thread_priority.typemap", "//mojo/common/unguessable_token.typemap", "//mojo/common/values.typemap",
diff --git a/mojo/public/cpp/base/BUILD.gn b/mojo/public/cpp/base/BUILD.gn index 081ff8f..07daf07 100644 --- a/mojo/public/cpp/base/BUILD.gn +++ b/mojo/public/cpp/base/BUILD.gn
@@ -38,6 +38,7 @@ public_deps = [ ":base", + "//base:i18n", "//mojo/public/mojom/base:base_shared", ] } @@ -52,6 +53,7 @@ "file_unittest.cc", "ref_counted_memory_unittest.cc", "string16_unittest.cc", + "text_direction_unittest.cc", "time_unittest.cc", "values_unittest.cc", ]
diff --git a/mojo/common/logfont_win.typemap b/mojo/public/cpp/base/logfont_win.typemap similarity index 74% rename from mojo/common/logfont_win.typemap rename to mojo/public/cpp/base/logfont_win.typemap index 488d22e..43cdc1e 100644 --- a/mojo/common/logfont_win.typemap +++ b/mojo/public/cpp/base/logfont_win.typemap
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//mojo/common/logfont_win.mojom" +mojom = "//mojo/public/mojom/base/logfont_win.mojom" os_whitelist = [ "win" ] public_headers = [ "//base/win/windows_full.h" ] traits_headers = [ "//ipc/ipc_message_utils.h" ] public_deps = [ "//ipc", ] -type_mappings = [ "mojo.common.mojom.LOGFONT=::LOGFONT" ] +type_mappings = [ "mojo_base.mojom.LOGFONT=::LOGFONT" ]
diff --git a/mojo/public/cpp/base/text_direction.typemap b/mojo/public/cpp/base/text_direction.typemap new file mode 100644 index 0000000..33a3d11 --- /dev/null +++ b/mojo/public/cpp/base/text_direction.typemap
@@ -0,0 +1,15 @@ +# 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. + +mojom = "//mojo/public/mojom/base/text_direction.mojom" +public_headers = [ "//base/i18n/rtl.h" ] +traits_headers = [ "//mojo/public/cpp/base/text_direction_mojom_traits.h" ] +sources = [ + "//mojo/public/cpp/base/text_direction_mojom_traits.cc", + "//mojo/public/cpp/base/text_direction_mojom_traits.h", +] +public_deps = [ + "//base:i18n", +] +type_mappings = [ "mojo_base.mojom.TextDirection=base::i18n::TextDirection" ]
diff --git a/mojo/public/cpp/base/text_direction_mojom_traits.cc b/mojo/public/cpp/base/text_direction_mojom_traits.cc new file mode 100644 index 0000000..5e1f6eb --- /dev/null +++ b/mojo/public/cpp/base/text_direction_mojom_traits.cc
@@ -0,0 +1,43 @@ +// 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 "mojo/public/cpp/base/text_direction_mojom_traits.h" + +namespace mojo { + +// static +mojo_base::mojom::TextDirection +EnumTraits<mojo_base::mojom::TextDirection, base::i18n::TextDirection>::ToMojom( + base::i18n::TextDirection text_direction) { + switch (text_direction) { + case base::i18n::UNKNOWN_DIRECTION: + return mojo_base::mojom::TextDirection::UNKNOWN_DIRECTION; + case base::i18n::RIGHT_TO_LEFT: + return mojo_base::mojom::TextDirection::RIGHT_TO_LEFT; + case base::i18n::LEFT_TO_RIGHT: + return mojo_base::mojom::TextDirection::LEFT_TO_RIGHT; + } + NOTREACHED(); + return mojo_base::mojom::TextDirection::UNKNOWN_DIRECTION; +} + +// static +bool EnumTraits<mojo_base::mojom::TextDirection, base::i18n::TextDirection>:: + FromMojom(mojo_base::mojom::TextDirection input, + base::i18n::TextDirection* out) { + switch (input) { + case mojo_base::mojom::TextDirection::UNKNOWN_DIRECTION: + *out = base::i18n::UNKNOWN_DIRECTION; + return true; + case mojo_base::mojom::TextDirection::RIGHT_TO_LEFT: + *out = base::i18n::RIGHT_TO_LEFT; + return true; + case mojo_base::mojom::TextDirection::LEFT_TO_RIGHT: + *out = base::i18n::LEFT_TO_RIGHT; + return true; + } + return false; +} + +} // namespace mojo
diff --git a/mojo/public/cpp/base/text_direction_mojom_traits.h b/mojo/public/cpp/base/text_direction_mojom_traits.h new file mode 100644 index 0000000..f59d45c --- /dev/null +++ b/mojo/public/cpp/base/text_direction_mojom_traits.h
@@ -0,0 +1,25 @@ +// 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 MOJO_PUBLIC_CPP_BASE_TEXT_DIRECTION_MOJOM_TRAITS_H_ +#define MOJO_PUBLIC_CPP_BASE_TEXT_DIRECTION_MOJOM_TRAITS_H_ + +#include "base/component_export.h" +#include "base/i18n/rtl.h" +#include "mojo/public/mojom/base/text_direction.mojom-shared.h" + +namespace mojo { + +template <> +struct COMPONENT_EXPORT(MOJO_BASE_MOJOM) + EnumTraits<mojo_base::mojom::TextDirection, base::i18n::TextDirection> { + static mojo_base::mojom::TextDirection ToMojom( + base::i18n::TextDirection text_direction); + static bool FromMojom(mojo_base::mojom::TextDirection input, + base::i18n::TextDirection* out); +}; + +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_BASE_TEXT_DIRECTION_MOJOM_TRAITS_H_
diff --git a/mojo/public/cpp/base/text_direction_unittest.cc b/mojo/public/cpp/base/text_direction_unittest.cc new file mode 100644 index 0000000..696beb0 --- /dev/null +++ b/mojo/public/cpp/base/text_direction_unittest.cc
@@ -0,0 +1,31 @@ +// 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 "mojo/public/cpp/base/text_direction_mojom_traits.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace mojo_base { +namespace text_direction_unittest { + +TEST(TextDirectionTest, TextDirection) { + base::i18n::TextDirection kTestDirections[] = {base::i18n::LEFT_TO_RIGHT, + base::i18n::RIGHT_TO_LEFT, + base::i18n::UNKNOWN_DIRECTION}; + + for (auto direction_in : kTestDirections) { + base::i18n::TextDirection direction_out; + + mojo_base::mojom::TextDirection serialized_direction = + mojo::EnumTraits<mojo_base::mojom::TextDirection, + base::i18n::TextDirection>::ToMojom(direction_in); + ASSERT_TRUE((mojo::EnumTraits< + mojo_base::mojom::TextDirection, + base::i18n::TextDirection>::FromMojom(serialized_direction, + &direction_out))); + EXPECT_EQ(direction_in, direction_out); + } +} + +} // namespace text_direction_unittest +} // namespace mojo_base \ No newline at end of file
diff --git a/mojo/public/cpp/base/time_mojom_traits.cc b/mojo/public/cpp/base/time_mojom_traits.cc index 094df9f..1fc25d8 100644 --- a/mojo/public/cpp/base/time_mojom_traits.cc +++ b/mojo/public/cpp/base/time_mojom_traits.cc
@@ -1,4 +1,3 @@ - // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/mojo/public/cpp/base/typemaps.gni b/mojo/public/cpp/base/typemaps.gni index 0837f41ba..87127baa 100644 --- a/mojo/public/cpp/base/typemaps.gni +++ b/mojo/public/cpp/base/typemaps.gni
@@ -11,6 +11,8 @@ "//mojo/public/cpp/base/file.typemap", "//mojo/public/cpp/base/ref_counted_memory.typemap", "//mojo/public/cpp/base/string16.typemap", + "//mojo/public/cpp/base/logfont_win.typemap", + "//mojo/public/cpp/base/text_direction.typemap", "//mojo/public/cpp/base/time.typemap", "//mojo/public/cpp/base/values.typemap", ]
diff --git a/mojo/public/mojom/base/BUILD.gn b/mojo/public/mojom/base/BUILD.gn index 5e4ffae..6aa5f4e 100644 --- a/mojo/public/mojom/base/BUILD.gn +++ b/mojo/public/mojom/base/BUILD.gn
@@ -14,10 +14,15 @@ "file_path.mojom", "ref_counted_memory.mojom", "string16.mojom", + "text_direction.mojom", "time.mojom", "values.mojom", ] + if (is_win) { + sources += [ "logfont_win.mojom" ] + } + output_prefix = "mojo_base_mojom" macro_prefix = "MOJO_BASE_MOJOM" }
diff --git a/mojo/common/logfont_win.mojom b/mojo/public/mojom/base/logfont_win.mojom similarity index 90% rename from mojo/common/logfont_win.mojom rename to mojo/public/mojom/base/logfont_win.mojom index 71d60ea..81beefa 100644 --- a/mojo/common/logfont_win.mojom +++ b/mojo/public/mojom/base/logfont_win.mojom
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -module mojo.common.mojom; +module mojo_base.mojom; // Native Windows struct. Its typemap only exists for windows builds. [Native]
diff --git a/mojo/common/text_direction.mojom b/mojo/public/mojom/base/text_direction.mojom similarity index 67% rename from mojo/common/text_direction.mojom rename to mojo/public/mojom/base/text_direction.mojom index 7d65124..999ff3e5 100644 --- a/mojo/common/text_direction.mojom +++ b/mojo/public/mojom/base/text_direction.mojom
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -module mojo.common.mojom; +module mojo_base.mojom; // Corresponds to |base::i18n::TextDirection| in base/i18n/rtl.h -enum TextDirection { - UNKNOWN_DIRECTION, - RIGHT_TO_LEFT, - LEFT_TO_RIGHT -}; +enum TextDirection { + UNKNOWN_DIRECTION, + RIGHT_TO_LEFT, + LEFT_TO_RIGHT +};
diff --git a/net/quic/core/quic_connection.cc b/net/quic/core/quic_connection.cc index 03d8962c..3b9ccad4 100644 --- a/net/quic/core/quic_connection.cc +++ b/net/quic/core/quic_connection.cc
@@ -126,6 +126,19 @@ DISALLOW_COPY_AND_ASSIGN(SendAlarmDelegate); }; +class PathDegradingAlarmDelegate : public QuicAlarm::Delegate { + public: + explicit PathDegradingAlarmDelegate(QuicConnection* connection) + : connection_(connection) {} + + void OnAlarm() override { connection_->OnPathDegradingTimeout(); } + + private: + QuicConnection* connection_; + + DISALLOW_COPY_AND_ASSIGN(PathDegradingAlarmDelegate); +}; + class TimeoutAlarmDelegate : public QuicAlarm::Delegate { public: explicit TimeoutAlarmDelegate(QuicConnection* connection) @@ -263,6 +276,9 @@ retransmittable_on_wire_alarm_(alarm_factory_->CreateAlarm( arena_.New<RetransmittableOnWireAlarmDelegate>(this), &arena_)), + path_degrading_alarm_(alarm_factory_->CreateAlarm( + arena_.New<PathDegradingAlarmDelegate>(this), + &arena_)), visitor_(nullptr), debug_visitor_(nullptr), packet_generator_(connection_id_, &framer_, random_generator_, this), @@ -294,7 +310,11 @@ negotiate_version_early_( GetQuicReloadableFlag(quic_server_early_version_negotiation)), always_discard_packets_after_close_( - GetQuicReloadableFlag(quic_always_discard_packets_after_close)) { + GetQuicReloadableFlag(quic_always_discard_packets_after_close)), + handle_write_results_for_connectivity_probe_(GetQuicReloadableFlag( + quic_handle_write_results_for_connectivity_probe)), + use_path_degrading_alarm_( + GetQuicReloadableFlag(quic_path_degrading_alarm)) { QUIC_DLOG(INFO) << ENDPOINT << "Created connection with connection_id: " << connection_id << " and version: " @@ -822,8 +842,8 @@ } largest_seen_packet_with_ack_ = last_header_.packet_number; - sent_packet_manager_.OnIncomingAck(incoming_ack, - time_of_last_received_packet_); + bool acked_new_packet = sent_packet_manager_.OnIncomingAck( + incoming_ack, time_of_last_received_packet_); // If the incoming ack's packets set expresses missing packets: peer is still // waiting for a packet lower than a packet that we are no longer planning to // send. @@ -831,7 +851,8 @@ // acking packets which we never care about. // Send an ack to raise the high water mark. PostProcessAfterAckFrame(!incoming_ack.packets.Empty() && - GetLeastUnacked() > incoming_ack.packets.Min()); + GetLeastUnacked() > incoming_ack.packets.Min(), + acked_new_packet); return connected_; } @@ -901,7 +922,8 @@ if (!last_range) { return true; } - sent_packet_manager_.OnAckFrameEnd(time_of_last_received_packet_); + bool acked_new_packet = + sent_packet_manager_.OnAckFrameEnd(time_of_last_received_packet_); if (send_alarm_->IsSet()) { send_alarm_->Cancel(); } @@ -912,7 +934,7 @@ // If the incoming ack's packets set expresses received packets: peer is still // acking packets which we never care about. // Send an ack to raise the high water mark. - PostProcessAfterAckFrame(GetLeastUnacked() > start); + PostProcessAfterAckFrame(GetLeastUnacked() > start, acked_new_packet); return connected_; } @@ -1943,6 +1965,14 @@ // A retransmittable packet has been put on the wire, so no need for the // |retransmittable_on_wire_alarm_| to possibly send a PING. retransmittable_on_wire_alarm_->Cancel(); + if (use_path_degrading_alarm_) { + if (!path_degrading_alarm_->IsSet()) { + // This is the first retransmittable packet on the wire after having + // none on the wire. Start the path degrading alarm. + SetPathDegradingAlarm(); + } + } + // Only adjust the last sent time (for the purpose of tracking the idle // timeout) if this is the first retransmittable packet sent after a // packet is received. If it were updated on every sent packet, then @@ -2079,7 +2109,10 @@ } } +// TODO(wangyix): remove this method once +// FLAGS_quic_reloadable_flag_quic_path_degrading_alarm is deprecated. void QuicConnection::OnPathDegrading() { + DCHECK(!use_path_degrading_alarm_); visitor_->OnPathDegrading(); } @@ -2145,6 +2178,11 @@ visitor_->OnAckNeedsRetransmittableFrame(); } +void QuicConnection::OnPathDegradingTimeout() { + QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_path_degrading_alarm, 2, 4); + visitor_->OnPathDegrading(); +} + void QuicConnection::OnRetransmissionTimeout() { DCHECK(sent_packet_manager_.HasUnackedPackets()); @@ -2344,6 +2382,10 @@ timeout_alarm_->Cancel(); mtu_discovery_alarm_->Cancel(); retransmittable_on_wire_alarm_->Cancel(); + if (use_path_degrading_alarm_) { + QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_path_degrading_alarm, 4, 4); + path_degrading_alarm_->Cancel(); + } } QuicByteCount QuicConnection::max_packet_length() const { @@ -2483,6 +2525,14 @@ QuicTime::Delta::FromMilliseconds(1)); } +void QuicConnection::SetPathDegradingAlarm() { + DCHECK(use_path_degrading_alarm_); + QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_path_degrading_alarm, 1, 4); + const QuicTime::Delta delay = sent_packet_manager_.GetPathDegradingDelay(); + path_degrading_alarm_->Update(clock_->ApproximateNow() + delay, + QuicTime::Delta::FromMilliseconds(1)); +} + void QuicConnection::MaybeSetMtuAlarm(QuicPacketNumber sent_packet_number) { // Do not set the alarm if the target size is less than the current size. // This covers the case when |mtu_discovery_target_| is at its default value, @@ -2671,9 +2721,6 @@ QuicPacketWriter* probing_writer, const QuicSocketAddress& peer_address) { DCHECK(peer_address.IsInitialized()); - // TODO(zhongyi): remove this histogram once the cause of the INTERNAL_ERROR - // increase is determined. - UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.SentConnectivityProbe", true); if (always_discard_packets_after_close_ && !connected_) { QUIC_FLAG_COUNT_N( quic_reloadable_flag_quic_always_discard_packets_after_close, 2, 2); @@ -2688,7 +2735,20 @@ DCHECK(probing_writer); if (probing_writer->IsWriteBlocked()) { - QUIC_DLOG(INFO) << "Writer blocked when send connectivity probing packet"; + QUIC_DLOG(INFO) << ENDPOINT + << "Writer blocked when send connectivity probing packet."; + if (!handle_write_results_for_connectivity_probe_) { + visitor_->OnWriteBlocked(); + } else { + QUIC_FLAG_COUNT_N( + quic_reloadable_flag_quic_handle_write_results_for_connectivity_probe, + 1, 3); + if (probing_writer == writer_) { + // Visitor should not be write blocked if the probing writer is not the + // default packet writer. + visitor_->OnWriteBlocked(); + } + } return true; } @@ -2713,22 +2773,41 @@ self_address().host(), peer_address, per_packet_options_); if (IsWriteError(result.status)) { - QUIC_DLOG(INFO) << "Write probing packet not finished with error = " + if (!handle_write_results_for_connectivity_probe_) { + OnWriteError(result.error_code); + } else { + QUIC_FLAG_COUNT_N( + quic_reloadable_flag_quic_handle_write_results_for_connectivity_probe, + 2, 3); + // Write error for any connectivity probe should not affect the connection + // as it is sent on a different path. + } + QUIC_DLOG(INFO) << ENDPOINT << "Write probing packet failed with error = " << result.error_code; return false; } - // Call OnPacketSent regardless of the write result. This treats a blocked - // write the same as a packet loss. + // Call OnPacketSent regardless of the write result. sent_packet_manager_.OnPacketSent( probing_packet.get(), probing_packet->original_packet_number, packet_send_time, probing_packet->transmission_type, NO_RETRANSMITTABLE_DATA); if (result.status == WRITE_STATUS_BLOCKED) { - visitor_->OnWriteBlocked(); + if (!handle_write_results_for_connectivity_probe_) { + visitor_->OnWriteBlocked(); + } else { + QUIC_FLAG_COUNT_N( + quic_reloadable_flag_quic_handle_write_results_for_connectivity_probe, + 3, 3); + if (probing_writer == writer_) { + // Visitor should not be write blocked if the probing writer is not the + // default packet writer. + visitor_->OnWriteBlocked(); + } + } if (probing_writer->IsWriteBlockedDataBuffered()) { - QUIC_BUG << "Write probing packet blocked"; + QUIC_DLOG(INFO) << ENDPOINT << "Write probing packet blocked"; } } @@ -2939,7 +3018,8 @@ enable_session_decides_what_to_write); } -void QuicConnection::PostProcessAfterAckFrame(bool send_stop_waiting) { +void QuicConnection::PostProcessAfterAckFrame(bool send_stop_waiting, + bool acked_new_packet) { if (no_stop_waiting_frames_) { received_packet_manager_.DontWaitForPacketsBefore( sent_packet_manager_.largest_packet_peer_knows_is_acked()); @@ -2948,9 +3028,24 @@ // have a better estimate of the current rtt than when it was set. SetRetransmissionAlarm(); - if (!sent_packet_manager_.HasUnackedPackets() && - !retransmittable_on_wire_alarm_->IsSet()) { - SetRetransmittableOnWireAlarm(); + if (!sent_packet_manager_.HasUnackedPackets()) { + // There are no retransmittable packets on the wire, so it may be + // necessary to send a PING to keep a retransmittable packet on the wire. + if (!retransmittable_on_wire_alarm_->IsSet()) { + SetRetransmittableOnWireAlarm(); + } + // There are no retransmittable packets on the wire, so it's impossible to + // say if the connection has degraded. + if (use_path_degrading_alarm_) { + QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_path_degrading_alarm, 3, 4); + path_degrading_alarm_->Cancel(); + } + } else if (acked_new_packet) { + // A previously-unacked packet has been acked, which means forward progress + // has been made. Push back the path degrading alarm. + if (use_path_degrading_alarm_) { + SetPathDegradingAlarm(); + } } if (send_stop_waiting) {
diff --git a/net/quic/core/quic_connection.h b/net/quic/core/quic_connection.h index 4c5e6cc..6fa0a359 100644 --- a/net/quic/core/quic_connection.h +++ b/net/quic/core/quic_connection.h
@@ -492,6 +492,8 @@ // QuicSentPacketManager::NetworkChangeVisitor void OnCongestionChange() override; + // TODO(wangyix): remove OnPathDegrading() once + // FLAGS_quic_reloadable_flag_quic_path_degrading_alarm is deprecated. void OnPathDegrading() override; void OnPathMtuIncreased(QuicPacketLength packet_size) override; @@ -577,6 +579,9 @@ // Sets up a packet with an QuicAckFrame and sends it out. void SendAck(); + // Called when the path degrading alarm fires. + void OnPathDegradingTimeout(); + // Called when an RTO fires. Resets the retransmission alarm if there are // remaining unacked packets. void OnRetransmissionTimeout(); @@ -893,6 +898,9 @@ // Sets the retransmission alarm based on SentPacketManager. void SetRetransmissionAlarm(); + // Sets the path degrading alarm. + void SetPathDegradingAlarm(); + // Sets the MTU discovery alarm if necessary. // |sent_packet_number| is the recently sent packet number. void MaybeSetMtuAlarm(QuicPacketNumber sent_packet_number); @@ -930,7 +938,8 @@ // Called when last received ack frame has been processed. // |send_stop_waiting| indicates whether a stop waiting needs to be sent. - void PostProcessAfterAckFrame(bool send_stop_waiting); + // |acked_new_packet| is true if a previously-unacked packet was acked. + void PostProcessAfterAckFrame(bool send_stop_waiting, bool acked_new_packet); QuicFramer framer_; @@ -1089,6 +1098,8 @@ // An alarm that fires when there have been no retransmittable packets on the // wire for some period. QuicArenaScopedPtr<QuicAlarm> retransmittable_on_wire_alarm_; + // An alarm that fires when this connection is considered degrading. + QuicArenaScopedPtr<QuicAlarm> path_degrading_alarm_; // Neither visitor is owned by this class. QuicConnectionVisitorInterface* visitor_; @@ -1209,6 +1220,13 @@ // Latched value of // quic_reloadable_flag_quic_always_discard_packets_after_close. const bool always_discard_packets_after_close_; + // Latched valure of + // quic_reloadable_flag_quic_handle_write_results_for_connectivity_probe. + const bool handle_write_results_for_connectivity_probe_; + + // Latched value of + // quic_reloadable_flag_quic_path_degrading_alarm + const bool use_path_degrading_alarm_; DISALLOW_COPY_AND_ASSIGN(QuicConnection); };
diff --git a/net/quic/core/quic_connection_test.cc b/net/quic/core/quic_connection_test.cc index 85a44df..d562793b 100644 --- a/net/quic/core/quic_connection_test.cc +++ b/net/quic/core/quic_connection_test.cc
@@ -661,6 +661,11 @@ QuicConnectionPeer::GetRetransmittableOnWireAlarm(this)); } + TestAlarmFactory::TestAlarm* GetPathDegradingAlarm() { + return reinterpret_cast<TestAlarmFactory::TestAlarm*>( + QuicConnectionPeer::GetPathDegradingAlarm(this)); + } + void SetMaxTailLossProbes(size_t max_tail_loss_probes) { QuicSentPacketManagerPeer::SetMaxTailLossProbes( QuicConnectionPeer::GetSentPacketManager(this), max_tail_loss_probes); @@ -763,7 +768,9 @@ frame2_(1, false, 3, QuicStringPiece(data2)), packet_number_length_(PACKET_6BYTE_PACKET_NUMBER), connection_id_length_(PACKET_8BYTE_CONNECTION_ID), - notifier_(&connection_) { + notifier_(&connection_), + use_path_degrading_alarm_( + GetQuicReloadableFlag(quic_path_degrading_alarm)) { SetQuicFlag(&FLAGS_quic_supports_tls_handshake, true); connection_.set_defer_send_in_response_to_packets(GetParam().ack_response == AckResponse::kDefer); @@ -1174,6 +1181,10 @@ SimpleSessionNotifier notifier_; + // Latched value of + // quic_reloadable_flag_quic_path_degrading_alarm + bool use_path_degrading_alarm_; + private: DISALLOW_COPY_AND_ASSIGN(QuicConnectionTest); }; @@ -3178,7 +3189,9 @@ clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20)); { InSequence s; - EXPECT_CALL(visitor_, OnPathDegrading()); + if (!use_path_degrading_alarm_) { + EXPECT_CALL(visitor_, OnPathDegrading()); + } EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, first_packet_size, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, second_packet_size, _)); } @@ -4121,7 +4134,9 @@ // Send stream data. SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, FIN, nullptr); - EXPECT_CALL(visitor_, OnPathDegrading()); + if (!use_path_degrading_alarm_) { + EXPECT_CALL(visitor_, OnPathDegrading()); + } // Fire the retransmission alarm 6 times, twice for TLP and 4 times for RTO. for (int i = 0; i < 6; ++i) { EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); @@ -4155,7 +4170,9 @@ // Send stream data. SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, FIN, nullptr); - EXPECT_CALL(visitor_, OnPathDegrading()); + if (!use_path_degrading_alarm_) { + EXPECT_CALL(visitor_, OnPathDegrading()); + } // Fire the retransmission alarm 4 times, twice for TLP and 2 times for RTO. for (int i = 0; i < 4; ++i) { EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); @@ -5033,6 +5050,77 @@ } } +TEST_P(QuicConnectionTest, WriteBlockedAfterClientSendsConnectivityProbe) { + EXPECT_EQ(Perspective::IS_CLIENT, connection_.perspective()); + TestPacketWriter probing_writer(version(), &clock_); + // Block next write so that sending connectivity probe will encounter a + // blocked write when send a connectivity probe to the peer. + probing_writer.BlockOnNextWrite(); + if (GetQuicReloadableFlag(quic_handle_write_results_for_connectivity_probe)) { + // Connection will not be marked as write blocked as connectivity probe only + // affects the probing_writer which is not the default. + EXPECT_CALL(visitor_, OnWriteBlocked()).Times(0); + } else { + EXPECT_CALL(visitor_, OnWriteBlocked()).Times(1); + } + + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(1); + connection_.SendConnectivityProbingPacket(&probing_writer, + connection_.peer_address()); +} + +TEST_P(QuicConnectionTest, WriterBlockedAfterServerSendsConnectivityProbe) { + set_perspective(Perspective::IS_SERVER); + QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false); + + // Block next write so that sending connectivity probe will encounter a + // blocked write when send a connectivity probe to the peer. + writer_->BlockOnNextWrite(); + // Connection will be marked as write blocked as server uses the default + // writer to send connectivity probes. + EXPECT_CALL(visitor_, OnWriteBlocked()).Times(1); + + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(1); + connection_.SendConnectivityProbingPacket(writer_.get(), + connection_.peer_address()); +} + +TEST_P(QuicConnectionTest, WriterErrorWhenClientSendsConnectivityProbe) { + EXPECT_EQ(Perspective::IS_CLIENT, connection_.perspective()); + TestPacketWriter probing_writer(version(), &clock_); + probing_writer.SetShouldWriteFail(); + + if (GetQuicReloadableFlag(quic_handle_write_results_for_connectivity_probe)) { + // Connection should not be closed if a connectivity probe is failed to be + // sent. + EXPECT_CALL(visitor_, OnConnectionClosed(_, _, _)).Times(0); + } else { + EXPECT_CALL(visitor_, OnConnectionClosed(_, _, _)).Times(1); + } + + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); + connection_.SendConnectivityProbingPacket(&probing_writer, + connection_.peer_address()); +} + +TEST_P(QuicConnectionTest, WriterErrorWhenServerSendsConnectivityProbe) { + set_perspective(Perspective::IS_SERVER); + QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false); + + writer_->SetShouldWriteFail(); + if (GetQuicReloadableFlag(quic_handle_write_results_for_connectivity_probe)) { + // Connection should not be closed if a connectivity probe is failed to be + // sent. + EXPECT_CALL(visitor_, OnConnectionClosed(_, _, _)).Times(0); + } else { + EXPECT_CALL(visitor_, OnConnectionClosed(_, _, _)).Times(1); + } + + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); + connection_.SendConnectivityProbingPacket(writer_.get(), + connection_.peer_address()); +} + TEST_P(QuicConnectionTest, PublicReset) { QuicPublicResetPacket header; // Public reset packet in only built by server. @@ -5522,6 +5610,10 @@ } TEST_P(QuicConnectionTest, OnPathDegrading) { + if (use_path_degrading_alarm_) { + return; + } + QuicByteCount packet_size; const size_t kMinTimeoutsBeforePathDegrading = 2; @@ -5549,6 +5641,140 @@ connection_.GetRetransmissionAlarm()->Fire(); } +// Includes regression test for https://b.corp.google.com/issues/69979024. +TEST_P(QuicConnectionTest, PathDegradingAlarm) { + if (!use_path_degrading_alarm_) { + return; + } + + EXPECT_TRUE(connection_.connected()); + EXPECT_FALSE(connection_.GetPathDegradingAlarm()->IsSet()); + + const char data[] = "data"; + size_t data_size = strlen(data); + QuicStreamOffset offset = 0; + + for (int i = 0; i < 2; ++i) { + // Send a packet. Now there's a retransmittable packet on the wire, so the + // path degrading alarm should be set. + connection_.SendStreamDataWithString(1, data, offset, NO_FIN); + offset += data_size; + EXPECT_TRUE(connection_.GetPathDegradingAlarm()->IsSet()); + // Check the deadline of the path degrading alarm. + QuicTime::Delta delay = + QuicConnectionPeer::GetSentPacketManager(&connection_) + ->GetPathDegradingDelay(); + EXPECT_EQ(clock_.ApproximateNow() + delay, + connection_.GetPathDegradingAlarm()->deadline()); + + // Send a second packet. The path degrading alarm's deadline should remain + // the same. + // Regression test for https://b.corp.google.com/issues/69979024. + clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); + QuicTime prev_deadline = connection_.GetPathDegradingAlarm()->deadline(); + connection_.SendStreamDataWithString(1, data, offset, NO_FIN); + offset += data_size; + EXPECT_TRUE(connection_.GetPathDegradingAlarm()->IsSet()); + EXPECT_EQ(prev_deadline, connection_.GetPathDegradingAlarm()->deadline()); + + // Now receive an ACK of the first packet. This should advance the path + // degrading alarm's deadline since forward progress has been made. + clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); + if (i == 0) { + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); + } + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); + QuicAckFrame frame = InitAckFrame({{1u + 2u * i, 2u + 2u * i}}); + ProcessAckPacket(&frame); + EXPECT_TRUE(connection_.GetPathDegradingAlarm()->IsSet()); + // Check the deadline of the path degrading alarm. + delay = QuicConnectionPeer::GetSentPacketManager(&connection_) + ->GetPathDegradingDelay(); + EXPECT_EQ(clock_.ApproximateNow() + delay, + connection_.GetPathDegradingAlarm()->deadline()); + + if (i == 0) { + // Now receive an ACK of the second packet. Since there are no more + // retransmittable packets on the wire, this should cancel the path + // degrading alarm. + clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); + frame = InitAckFrame({{2, 3}}); + ProcessAckPacket(&frame); + EXPECT_FALSE(connection_.GetPathDegradingAlarm()->IsSet()); + } else { + // Advance time to the path degrading alarm's deadline and simulate + // firing the alarm. + clock_.AdvanceTime(delay); + EXPECT_CALL(visitor_, OnPathDegrading()); + connection_.GetPathDegradingAlarm()->Fire(); + EXPECT_FALSE(connection_.GetPathDegradingAlarm()->IsSet()); + } + } +} + +TEST_P(QuicConnectionTest, RetransmittableOnWireSetsPathDegradingAlarm) { + if (!use_path_degrading_alarm_) { + return; + } + const QuicTime::Delta retransmittable_on_wire_timeout = + QuicTime::Delta::FromMilliseconds(50); + connection_.set_retransmittable_on_wire_timeout( + retransmittable_on_wire_timeout); + + EXPECT_TRUE(connection_.connected()); + EXPECT_CALL(visitor_, HasOpenDynamicStreams()).WillRepeatedly(Return(true)); + + EXPECT_FALSE(connection_.GetPathDegradingAlarm()->IsSet()); + EXPECT_FALSE(connection_.GetRetransmittableOnWireAlarm()->IsSet()); + + const char data[] = "data"; + size_t data_size = strlen(data); + QuicStreamOffset offset = 0; + + // Send a packet. + connection_.SendStreamDataWithString(1, data, offset, NO_FIN); + offset += data_size; + // Now there's a retransmittable packet on the wire, so the path degrading + // alarm should be set. + // The retransmittable-on-wire alarm should not be set. + EXPECT_TRUE(connection_.GetPathDegradingAlarm()->IsSet()); + QuicTime::Delta delay = QuicConnectionPeer::GetSentPacketManager(&connection_) + ->GetPathDegradingDelay(); + EXPECT_EQ(clock_.ApproximateNow() + delay, + connection_.GetPathDegradingAlarm()->deadline()); + EXPECT_FALSE(connection_.GetRetransmittableOnWireAlarm()->IsSet()); + + // Now receive an ACK of the packet. + clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); + QuicAckFrame frame = InitAckFrame({{1, 2}}); + ProcessAckPacket(&frame); + // No more retransmittable packets on the wire, so the path degrading alarm + // should be cancelled, and the retransmittable-on-wire alarm should be set + // since a PING might be needed. + EXPECT_FALSE(connection_.GetPathDegradingAlarm()->IsSet()); + EXPECT_TRUE(connection_.GetRetransmittableOnWireAlarm()->IsSet()); + EXPECT_EQ(clock_.ApproximateNow() + retransmittable_on_wire_timeout, + connection_.GetRetransmittableOnWireAlarm()->deadline()); + + // Simulate firing the retransmittable-on-wire alarm and sending a PING. + clock_.AdvanceTime(retransmittable_on_wire_timeout); + EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() { + connection_.SendControlFrame(QuicFrame(QuicPingFrame(1))); + })); + connection_.GetRetransmittableOnWireAlarm()->Fire(); + + // Now there's a retransmittable packet (PING) on the wire, so the path + // degrading alarm should be set. + EXPECT_TRUE(connection_.GetPathDegradingAlarm()->IsSet()); + delay = QuicConnectionPeer::GetSentPacketManager(&connection_) + ->GetPathDegradingDelay(); + EXPECT_EQ(clock_.ApproximateNow() + delay, + connection_.GetPathDegradingAlarm()->deadline()); +} + TEST_P(QuicConnectionTest, MultipleCallsToCloseConnection) { // Verifies that multiple calls to CloseConnection do not // result in multiple attempts to close the connection - it will be marked as
diff --git a/net/quic/core/quic_flags_list.h b/net/quic/core/quic_flags_list.h index 1358996..2be46e7 100644 --- a/net/quic/core/quic_flags_list.h +++ b/net/quic/core/quic_flags_list.h
@@ -222,3 +222,15 @@ QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_reset_stream_is_not_zombie, true) + +// If true, when a packet write for connectivity probe does not complete +// successfully synchronously, connection will not be affected, i.e., blocked or +// closed, if the probing packet writer is not the default writer. +QUIC_FLAG( + bool, + FLAGS_quic_reloadable_flag_quic_handle_write_results_for_connectivity_probe, + true) + +// If true, a separate QuicAlarm in QuicConnection is used to trigger +// OnPathDegrading() instead of using retransmission_alarm_. +QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_path_degrading_alarm, true)
diff --git a/net/quic/core/quic_sent_packet_manager.cc b/net/quic/core/quic_sent_packet_manager.cc index 0d6de01..6693d2e 100644 --- a/net/quic/core/quic_sent_packet_manager.cc +++ b/net/quic/core/quic_sent_packet_manager.cc
@@ -31,8 +31,8 @@ static const size_t kMaxRetransmissions = 10; // Maximum number of packets retransmitted upon an RTO. static const size_t kMaxRetransmissionsOnTimeout = 2; -// Minimum number of consecutive RTOs before path is considered to be degrading. -const size_t kMinTimeoutsBeforePathDegrading = 2; +// The path degrading delay is the sum of this number of consecutive RTO delays. +const size_t kNumRetransmissionDelaysForPathDegradingDelay = 2; // Ensure the handshake timer isnt't faster than 10ms. // This limits the tenth retransmitted packet to 10s after the initial CHLO. @@ -91,7 +91,9 @@ largest_packet_peer_knows_is_acked_(0), delayed_ack_time_( QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs)), - rtt_updated_(false) { + rtt_updated_(false), + use_path_degrading_alarm_( + GetQuicReloadableFlag(quic_path_degrading_alarm)) { SetSendAlgorithm(congestion_control_type); } @@ -658,10 +660,13 @@ case RTO_MODE: ++stats_->rto_count; RetransmitRtoPackets(); - if (!session_decides_what_to_write() && - network_change_visitor_ != nullptr && - consecutive_rto_count_ == kMinTimeoutsBeforePathDegrading) { - network_change_visitor_->OnPathDegrading(); + if (!use_path_degrading_alarm_) { + if (!session_decides_what_to_write() && + network_change_visitor_ != nullptr && + consecutive_rto_count_ == + kNumRetransmissionDelaysForPathDegradingDelay) { + network_change_visitor_->OnPathDegrading(); + } } return; } @@ -766,9 +771,12 @@ ++consecutive_rto_count_; } if (session_decides_what_to_write()) { - if (network_change_visitor_ != nullptr && - consecutive_rto_count_ == kMinTimeoutsBeforePathDegrading) { - network_change_visitor_->OnPathDegrading(); + if (!use_path_degrading_alarm_) { + if (network_change_visitor_ != nullptr && + consecutive_rto_count_ == + kNumRetransmissionDelaysForPathDegradingDelay) { + network_change_visitor_->OnPathDegrading(); + } } for (QuicPacketNumber retransmission : retransmissions) { MarkForRetransmission(retransmission, RTO_RETRANSMISSION); @@ -901,6 +909,17 @@ return QuicTime::Zero(); } +const QuicTime::Delta QuicSentPacketManager::GetPathDegradingDelay() const { + QuicTime::Delta delay = QuicTime::Delta::Zero(); + for (size_t i = 0; i < max_tail_loss_probes_; ++i) { + delay = delay + GetTailLossProbeDelay(i); + } + for (size_t i = 0; i < kNumRetransmissionDelaysForPathDegradingDelay; ++i) { + delay = delay + GetRetransmissionDelay(i); + } + return delay; +} + const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() const { // This is equivalent to the TailLossProbeDelay, but slightly more aggressive @@ -920,9 +939,10 @@ delay_ms << consecutive_crypto_retransmission_count_); } -const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { +const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay( + size_t consecutive_tlp_count) const { QuicTime::Delta srtt = rtt_stats_.SmoothedOrInitialRtt(); - if (enable_half_rtt_tail_loss_probe_ && consecutive_tlp_count_ == 0u) { + if (enable_half_rtt_tail_loss_probe_ && consecutive_tlp_count == 0u) { return std::max(min_tlp_timeout_, srtt * 0.5); } if (ietf_style_tlp_) { @@ -940,7 +960,12 @@ return std::max(min_tlp_timeout_, 2 * srtt); } -const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { +const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { + return GetTailLossProbeDelay(consecutive_tlp_count_); +} + +const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay( + size_t consecutive_rto_count) const { QuicTime::Delta retransmission_delay = QuicTime::Delta::Zero(); if (rtt_stats_.smoothed_rtt().IsZero()) { // We are in the initial state, use default timeout values. @@ -957,7 +982,7 @@ // Calculate exponential back off. retransmission_delay = retransmission_delay * - (1 << std::min<size_t>(consecutive_rto_count_, kMaxRetransmissions)); + (1 << std::min<size_t>(consecutive_rto_count, kMaxRetransmissions)); if (retransmission_delay.ToMilliseconds() > kMaxRetransmissionTimeMs) { return QuicTime::Delta::FromMilliseconds(kMaxRetransmissionTimeMs); @@ -965,6 +990,10 @@ return retransmission_delay; } +const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { + return GetRetransmissionDelay(consecutive_rto_count_); +} + const RttStats* QuicSentPacketManager::GetRttStats() const { return &rtt_stats_; }
diff --git a/net/quic/core/quic_sent_packet_manager.h b/net/quic/core/quic_sent_packet_manager.h index b16cf22..0be2afa 100644 --- a/net/quic/core/quic_sent_packet_manager.h +++ b/net/quic/core/quic_sent_packet_manager.h
@@ -82,6 +82,8 @@ // Called with the path may be degrading. Note that the path may only be // temporarily degrading. + // TODO(wangyix): remove this once + // FLAGS_quic_reloadable_flag_quic_path_degrading_alarm is deprecated. virtual void OnPathDegrading() = 0; // Called when the Path MTU may have increased. @@ -177,6 +179,10 @@ // there are no retransmittable packets. const QuicTime GetRetransmissionTime() const; + // Returns the current delay for the path degrading timer, which is used to + // notify the session that this connection is degrading. + const QuicTime::Delta GetPathDegradingDelay() const; + const RttStats* GetRttStats() const; // Returns the estimated bandwidth calculated by the congestion algorithm. @@ -309,13 +315,26 @@ // packets from flight. void RetransmitRtoPackets(); - // Returns the timer for retransmitting crypto handshake packets. + // Returns the timeout for retransmitting crypto handshake packets. const QuicTime::Delta GetCryptoRetransmissionDelay() const; - // Returns the timer for a new tail loss probe. + // Returns the timeout for a new tail loss probe. |consecutive_tlp_count| is + // the number of consecutive tail loss probes that have already been sent. + const QuicTime::Delta GetTailLossProbeDelay( + size_t consecutive_tlp_count) const; + + // Calls GetTailLossProbeDelay() with values from the current state of this + // packet manager as its params. const QuicTime::Delta GetTailLossProbeDelay() const; // Returns the retransmission timeout, after which a full RTO occurs. + // |consecutive_rto_count| is the number of consecutive RTOs that have already + // occurred. + const QuicTime::Delta GetRetransmissionDelay( + size_t consecutive_rto_count) const; + + // Calls GetRetransmissionDelay() with values from the current state of this + // packet manager as its params. const QuicTime::Delta GetRetransmissionDelay() const; // Returns the newest transmission associated with a packet. @@ -487,6 +506,10 @@ // this once we use optimized QuicIntervalSet in last_ack_frame. QuicIntervalSet<QuicPacketNumber> all_packets_acked_; + // Latched value of + // quic_reloadable_flag_quic_path_degrading_alarm + const bool use_path_degrading_alarm_; + DISALLOW_COPY_AND_ASSIGN(QuicSentPacketManager); };
diff --git a/net/quic/core/quic_sent_packet_manager_test.cc b/net/quic/core/quic_sent_packet_manager_test.cc index a5919871..1157a73a 100644 --- a/net/quic/core/quic_sent_packet_manager_test.cc +++ b/net/quic/core/quic_sent_packet_manager_test.cc
@@ -86,7 +86,9 @@ QuicSentPacketManagerTest() : manager_(Perspective::IS_SERVER, &clock_, &stats_, kCubicBytes, kNack), send_algorithm_(new StrictMock<MockSendAlgorithm>), - network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) { + network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>), + use_path_degrading_alarm_( + GetQuicReloadableFlag(quic_path_degrading_alarm)) { QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_); // Disable tail loss probes for most tests. QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0); @@ -318,6 +320,10 @@ MockSendAlgorithm* send_algorithm_; std::unique_ptr<MockNetworkChangeVisitor> network_change_visitor_; StrictMock<MockSessionNotifier> notifier_; + + // Latched value of + // quic_reloadable_flag_quic_path_degrading_alarm + bool use_path_degrading_alarm_; }; INSTANTIATE_TEST_CASE_P(Tests, QuicSentPacketManagerTest, testing::Bool()); @@ -1582,7 +1588,9 @@ } // Rto a second time. - EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); + if (!use_path_degrading_alarm_) { + EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); + } if (manager_.session_decides_what_to_write()) { EXPECT_CALL(notifier_, RetransmitFrames(_, _)) .WillOnce(WithArgs<1>(Invoke( @@ -1640,7 +1648,9 @@ } // Rto a second time. - EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); + if (!use_path_degrading_alarm_) { + EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); + } if (manager_.session_decides_what_to_write()) { EXPECT_CALL(notifier_, RetransmitFrames(_, _)) .WillOnce(WithArgs<1>(Invoke( @@ -1677,6 +1687,10 @@ } TEST_P(QuicSentPacketManagerTest, OnPathDegrading) { + if (use_path_degrading_alarm_) { + return; + } + SendDataPacket(1); for (size_t i = 1; i < kMinTimeoutsBeforePathDegrading; ++i) { if (manager_.session_decides_what_to_write()) { @@ -1901,10 +1915,14 @@ // If the delay is smaller than the min, ensure it exponentially backs off // from the min. - EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); + if (!use_path_degrading_alarm_) { + EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); + } for (int i = 0; i < 5; ++i) { EXPECT_EQ(delay, QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); + EXPECT_EQ(delay, + QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i)); delay = delay + delay; if (manager_.session_decides_what_to_write()) { EXPECT_CALL(notifier_, RetransmitFrames(_, _)) @@ -1928,6 +1946,8 @@ EXPECT_EQ(QuicTime::Delta::FromSeconds(60), QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromSeconds(60), + QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0)); } TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayExponentialBackoff) { @@ -1935,10 +1955,14 @@ QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); // Delay should back off exponentially. - EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); + if (!use_path_degrading_alarm_) { + EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); + } for (int i = 0; i < 5; ++i) { EXPECT_EQ(delay, QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); + EXPECT_EQ(delay, + QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i)); delay = delay + delay; if (manager_.session_decides_what_to_write()) { EXPECT_CALL(notifier_, RetransmitFrames(_, _)) @@ -1968,6 +1992,8 @@ QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4); EXPECT_EQ(expected_delay, QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); + EXPECT_EQ(expected_delay, + QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0)); for (int i = 0; i < 100; ++i) { // Run to make sure that we converge. @@ -1985,6 +2011,8 @@ QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_) .ToMilliseconds(), 1); + EXPECT_EQ(QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0), + QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); } TEST_P(QuicSentPacketManagerTest, GetLossDelay) { @@ -2177,12 +2205,16 @@ // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms). EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); // Send two packets, and the TLP should be 2 us. SendDataPacket(1); SendDataPacket(2); EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); } TEST_F(QuicSentPacketManagerTest, @@ -2207,12 +2239,15 @@ // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms). EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); - + EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); // Send two packets, and the TLP should be 2 us. SendDataPacket(1); SendDataPacket(2); EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); } TEST_F(QuicSentPacketManagerTest, @@ -2233,12 +2268,16 @@ // Expect 1.5x * SRTT + 0ms MAD EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); // Expect 1.5x * SRTT + 50ms MAD rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(150), QuicTime::Delta::FromMilliseconds(50), QuicTime::Zero()); EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats->smoothed_rtt()); EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); } TEST_F(QuicSentPacketManagerTest, @@ -2260,12 +2299,16 @@ // Expect 1.5x * SRTT + 0ms MAD EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); // Expect 1.5x * SRTT + 50ms MAD rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(150), QuicTime::Delta::FromMilliseconds(50), QuicTime::Zero()); EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats->smoothed_rtt()); EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); } TEST_F(QuicSentPacketManagerTest, @@ -2285,9 +2328,13 @@ QuicTime::Delta::Zero(), QuicTime::Zero()); EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1), QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1), + QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0)); // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms). EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); } TEST_F(QuicSentPacketManagerTest, @@ -2308,9 +2355,13 @@ QuicTime::Delta::Zero(), QuicTime::Zero()); EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1), QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1), + QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0)); // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms). EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); + EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), + QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0)); } TEST_F(QuicSentPacketManagerTest, DISABLED_NegotiateNoTLPFromOptionsAtServer) {
diff --git a/net/quic/test_tools/quic_connection_peer.cc b/net/quic/test_tools/quic_connection_peer.cc index 9af3756..efb8582 100644 --- a/net/quic/test_tools/quic_connection_peer.cc +++ b/net/quic/test_tools/quic_connection_peer.cc
@@ -178,6 +178,12 @@ } // static +QuicAlarm* QuicConnectionPeer::GetPathDegradingAlarm( + QuicConnection* connection) { + return connection->path_degrading_alarm_.get(); +} + +// static QuicPacketWriter* QuicConnectionPeer::GetWriter(QuicConnection* connection) { return connection->writer_; }
diff --git a/net/quic/test_tools/quic_connection_peer.h b/net/quic/test_tools/quic_connection_peer.h index 984f488e..7ed5252 100644 --- a/net/quic/test_tools/quic_connection_peer.h +++ b/net/quic/test_tools/quic_connection_peer.h
@@ -85,6 +85,7 @@ static QuicAlarm* GetTimeoutAlarm(QuicConnection* connection); static QuicAlarm* GetMtuDiscoveryAlarm(QuicConnection* connection); static QuicAlarm* GetRetransmittableOnWireAlarm(QuicConnection* connection); + static QuicAlarm* GetPathDegradingAlarm(QuicConnection* connection); static QuicPacketWriter* GetWriter(QuicConnection* connection); // If |owns_writer| is true, takes ownership of |writer|.
diff --git a/net/quic/test_tools/quic_sent_packet_manager_peer.cc b/net/quic/test_tools/quic_sent_packet_manager_peer.cc index 8650eabf..0999690 100644 --- a/net/quic/test_tools/quic_sent_packet_manager_peer.cc +++ b/net/quic/test_tools/quic_sent_packet_manager_peer.cc
@@ -113,12 +113,26 @@ // static QuicTime::Delta QuicSentPacketManagerPeer::GetRetransmissionDelay( + const QuicSentPacketManager* sent_packet_manager, + size_t consecutive_rto_count) { + return sent_packet_manager->GetRetransmissionDelay(consecutive_rto_count); +} + +// static +QuicTime::Delta QuicSentPacketManagerPeer::GetRetransmissionDelay( const QuicSentPacketManager* sent_packet_manager) { return sent_packet_manager->GetRetransmissionDelay(); } // static QuicTime::Delta QuicSentPacketManagerPeer::GetTailLossProbeDelay( + const QuicSentPacketManager* sent_packet_manager, + size_t consecutive_tlp_count) { + return sent_packet_manager->GetTailLossProbeDelay(consecutive_tlp_count); +} + +// static +QuicTime::Delta QuicSentPacketManagerPeer::GetTailLossProbeDelay( const QuicSentPacketManager* sent_packet_manager) { return sent_packet_manager->GetTailLossProbeDelay(); }
diff --git a/net/quic/test_tools/quic_sent_packet_manager_peer.h b/net/quic/test_tools/quic_sent_packet_manager_peer.h index 713ae88..d1363ef2c 100644 --- a/net/quic/test_tools/quic_sent_packet_manager_peer.h +++ b/net/quic/test_tools/quic_sent_packet_manager_peer.h
@@ -57,8 +57,14 @@ TransmissionType transmission_type); static QuicTime::Delta GetRetransmissionDelay( + const QuicSentPacketManager* sent_packet_manager, + size_t consecutive_rto_count); + static QuicTime::Delta GetRetransmissionDelay( const QuicSentPacketManager* sent_packet_manager); static QuicTime::Delta GetTailLossProbeDelay( + const QuicSentPacketManager* sent_packet_manager, + size_t consecutive_tlp_count); + static QuicTime::Delta GetTailLossProbeDelay( const QuicSentPacketManager* sent_packet_manager); static bool HasUnackedCryptoPackets(
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h index c000bbe..1681f0eb 100644 --- a/net/quic/test_tools/quic_test_utils.h +++ b/net/quic/test_tools/quic_test_utils.h
@@ -854,6 +854,8 @@ ~MockNetworkChangeVisitor() override; MOCK_METHOD0(OnCongestionChange, void()); + // TODO(wangyix): remove OnPathDegrading() once + // FLAGS_quic_reloadable_flag_quic_path_degrading_alarm is deprecated. MOCK_METHOD0(OnPathDegrading, void()); MOCK_METHOD1(OnPathMtuIncreased, void(QuicPacketLength));
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc index 75b2e7a..ffd4f7fc 100644 --- a/pdf/out_of_process_instance.cc +++ b/pdf/out_of_process_instance.cc
@@ -1234,7 +1234,7 @@ paint_manager_.InvalidateRect(offset_rect); } -void OutOfProcessInstance::Scroll(const pp::Point& point) { +void OutOfProcessInstance::DidScroll(const pp::Point& point) { if (!image_data_.is_null()) { paint_manager_.ScrollRect(available_area_, point); pp::PDF::DidScroll(GetPluginInstance());
diff --git a/pdf/out_of_process_instance.h b/pdf/out_of_process_instance.h index 3c0a252..7a9c966f 100644 --- a/pdf/out_of_process_instance.h +++ b/pdf/out_of_process_instance.h
@@ -98,7 +98,7 @@ // PDFEngine::Client implementation. void DocumentSizeUpdated(const pp::Size& size) override; void Invalidate(const pp::Rect& rect) override; - void Scroll(const pp::Point& point) override; + void DidScroll(const pp::Point& point) override; void ScrollToX(int x_in_screen_coords) override; void ScrollToY(int y_in_screen_coords, bool compensate_for_toolbar) override; void ScrollToPage(int page) override;
diff --git a/pdf/pdf_engine.h b/pdf/pdf_engine.h index 216a8f0..5553336 100644 --- a/pdf/pdf_engine.h +++ b/pdf/pdf_engine.h
@@ -135,7 +135,7 @@ virtual void Invalidate(const pp::Rect& rect) = 0; // Informs the client to scroll the plugin area by the given offset. - virtual void Scroll(const pp::Point& point) = 0; + virtual void DidScroll(const pp::Point& point) = 0; // Scroll the horizontal/vertical scrollbars to a given position. // Values are in screen coordinates, where 0 is the top/left of the document
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index feacb2a..5ce0f64 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -1108,7 +1108,7 @@ int old_x = position_.x(); position_.set_x(position); CalculateVisiblePages(); - client_->Scroll(pp::Point(old_x - position, 0)); + client_->DidScroll(pp::Point(old_x - position, 0)); } void PDFiumEngine::ScrolledToYPosition(int position) { @@ -1117,7 +1117,7 @@ int old_y = position_.y(); position_.set_y(position); CalculateVisiblePages(); - client_->Scroll(pp::Point(0, old_y - position)); + client_->DidScroll(pp::Point(0, old_y - position)); } void PDFiumEngine::PrePaint() {
diff --git a/pdf/preview_mode_client.cc b/pdf/preview_mode_client.cc index 4bfa859..42af50c 100644 --- a/pdf/preview_mode_client.cc +++ b/pdf/preview_mode_client.cc
@@ -18,7 +18,7 @@ NOTREACHED(); } -void PreviewModeClient::Scroll(const pp::Point& point) { +void PreviewModeClient::DidScroll(const pp::Point& point) { NOTREACHED(); }
diff --git a/pdf/preview_mode_client.h b/pdf/preview_mode_client.h index e1c06529..2bd26571 100644 --- a/pdf/preview_mode_client.h +++ b/pdf/preview_mode_client.h
@@ -29,7 +29,7 @@ // PDFEngine::Client implementation. void DocumentSizeUpdated(const pp::Size& size) override; void Invalidate(const pp::Rect& rect) override; - void Scroll(const pp::Point& point) override; + void DidScroll(const pp::Point& point) override; void ScrollToX(int x_in_screen_coords) override; void ScrollToY(int y_in_screen_coords, bool compensate_for_toolbar) override; void ScrollToPage(int page) override;
diff --git a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java index c5bf610c..3fa3311 100644 --- a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java +++ b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
@@ -40,7 +40,6 @@ import org.chromium.chromoting.help.HelpSingleton; import org.chromium.chromoting.jni.Client; import org.chromium.chromoting.jni.ConnectionListener; -import org.chromium.chromoting.jni.JniInterface; import org.chromium.chromoting.jni.JniOAuthTokenGetter; import java.util.ArrayList; @@ -622,7 +621,6 @@ } mAccount = accountName; JniOAuthTokenGetter.setAccount(accountName); - JniInterface.setAccountForLogging(accountName); // The current host list is no longer valid for the new account, so clear the list. mHosts = new HostInfo[0];
diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java index ab130c77..9c8ed85 100644 --- a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java +++ b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
@@ -4,15 +4,11 @@ package org.chromium.chromoting.jni; -import android.annotation.SuppressLint; import android.content.Context; import org.chromium.base.ContextUtils; import org.chromium.base.Log; -import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chromoting.OAuthTokenConsumer; -import org.chromium.chromoting.base.OAuthTokenFetcher; /** * Initializes the Chromium remoting library, and provides JNI calls into it. @@ -21,17 +17,8 @@ @JNINamespace("remoting") public class JniInterface { private static final String TAG = "Chromoting"; - - private static final String TOKEN_SCOPE = "oauth2:https://www.googleapis.com/auth/chromoting"; - private static final String LIBRARY_NAME = "remoting_client_jni"; - // Used to fetch auth token for native client. - @SuppressLint("StaticFieldLeak") - private static OAuthTokenConsumer sLoggerTokenConsumer; - - private static String sAccount; - /** * To be called once from the Application context singleton. Loads and initializes the native * code. Called on the UI thread. @@ -40,7 +27,6 @@ public static void loadLibrary(Context context) { ContextUtils.initApplicationContext(context.getApplicationContext()); JniOAuthTokenGetter.setContext(context); - sLoggerTokenConsumer = new OAuthTokenConsumer(context.getApplicationContext(), TOKEN_SCOPE); try { System.loadLibrary(LIBRARY_NAME); } catch (UnsatisfiedLinkError e) { @@ -50,39 +36,6 @@ nativeLoadNative(); } - public static void setAccountForLogging(String account) { - sAccount = account; - fetchAuthToken(); - } - - /** - * Fetch the OAuth token and feed it to the native interface. - */ - @CalledByNative - private static void fetchAuthToken() { - if (sAccount == null) { - // It is safe to ignore this request since setAccountForLogging() will be called later - // and will request the auth token. Logs will be queued up and sent once the auth token - // is set. - Log.w(TAG, "Account is not set before fetching the auth token."); - return; - } - sLoggerTokenConsumer.consume(sAccount, new OAuthTokenFetcher.Callback() { - @Override - public void onTokenFetched(String token) { - nativeOnAuthTokenFetched(token); - } - - @Override - public void onError(OAuthTokenFetcher.Error error) { - Log.e(TAG, "Failed to fetch auth token for native client."); - } - }); - } - /** Performs the native portion of the initialization. */ private static native void nativeLoadNative(); - - /** Notifies the native client with the new auth token */ - private static native void nativeOnAuthTokenFetched(String token); }
diff --git a/remoting/base/chromoting_event_log_writer.h b/remoting/base/chromoting_event_log_writer.h index d6802f72..edb2ee54 100644 --- a/remoting/base/chromoting_event_log_writer.h +++ b/remoting/base/chromoting_event_log_writer.h
@@ -13,7 +13,6 @@ public: virtual ~ChromotingEventLogWriter(){}; - virtual void SetAuthToken(const std::string& auth_token) = 0; virtual void Log(const ChromotingEvent& entry) = 0; };
diff --git a/remoting/base/oauth_token_getter.h b/remoting/base/oauth_token_getter.h index 80f9cbf..cd3eb58 100644 --- a/remoting/base/oauth_token_getter.h +++ b/remoting/base/oauth_token_getter.h
@@ -25,6 +25,7 @@ AUTH_ERROR, }; + // TODO(crbug.com/824488): Change to use base::OnceCallback. typedef base::Callback<void(Status status, const std::string& user_email, const std::string& access_token)>
diff --git a/remoting/base/telemetry_log_writer.cc b/remoting/base/telemetry_log_writer.cc index dea194a..2a46652 100644 --- a/remoting/base/telemetry_log_writer.cc +++ b/remoting/base/telemetry_log_writer.cc
@@ -14,36 +14,33 @@ namespace remoting { const int kMaxSendAttempts = 5; +constexpr char kAuthorizationHeaderPrefix[] = "Authorization:Bearer "; TelemetryLogWriter::TelemetryLogWriter( const std::string& telemetry_base_url, std::unique_ptr<UrlRequestFactory> request_factory, - const base::RepeatingClosure& auth_closure) + std::unique_ptr<OAuthTokenGetter> token_getter) : telemetry_base_url_(telemetry_base_url), request_factory_(std::move(request_factory)), - auth_closure_(auth_closure) { - thread_checker_.DetachFromThread(); + token_getter_(std::move(token_getter)) { + DETACH_FROM_THREAD(thread_checker_); + DCHECK(request_factory_); + DCHECK(token_getter_); } TelemetryLogWriter::~TelemetryLogWriter() { - DCHECK(thread_checker_.CalledOnValidThread()); -} - -void TelemetryLogWriter::SetAuthToken(const std::string& access_token) { - DCHECK(thread_checker_.CalledOnValidThread()); - access_token_ = access_token; - SendPendingEntries(); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); } void TelemetryLogWriter::Log(const ChromotingEvent& entry) { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); pending_entries_.push_back(entry); SendPendingEntries(); } void TelemetryLogWriter::SendPendingEntries() { - DCHECK(thread_checker_.CalledOnValidThread()); - if (request_ || pending_entries_.empty()) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + if (!sending_entries_.empty() || pending_entries_.empty()) { return; } @@ -64,11 +61,15 @@ LOG(ERROR) << "Failed to serialize log to JSON."; return; } - PostJsonToServer(json); + token_getter_->CallWithToken(base::BindRepeating( + &TelemetryLogWriter::PostJsonToServer, base::Unretained(this), json)); } -void TelemetryLogWriter::PostJsonToServer(const std::string& json) { - DCHECK(thread_checker_.CalledOnValidThread()); +void TelemetryLogWriter::PostJsonToServer(const std::string& json, + OAuthTokenGetter::Status status, + const std::string& user_email, + const std::string& access_token) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(!request_); net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("CRD_telemetry_log", R"( @@ -95,9 +96,7 @@ })"); request_ = request_factory_->CreateUrlRequest( UrlRequest::Type::POST, telemetry_base_url_, traffic_annotation); - if (!access_token_.empty()) { - request_->AddHeader("Authorization:Bearer " + access_token_); - } + request_->AddHeader(kAuthorizationHeaderPrefix + access_token); VLOG(1) << "Posting log to telemetry server: " << json; @@ -108,7 +107,7 @@ void TelemetryLogWriter::OnSendLogResult( const remoting::UrlRequest::Result& result) { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(request_); if (!result.success || result.status != net::HTTP_OK) { LOG(WARNING) << "Error occur when sending logs to the telemetry server, " @@ -128,15 +127,8 @@ << " log(s) to telemetry server."; } sending_entries_.clear(); - bool should_call_auth_closure = - result.status == net::HTTP_UNAUTHORIZED && !auth_closure_.is_null(); request_.reset(); // This may also destroy the result. - if (should_call_auth_closure) { - VLOG(1) << "Request is unauthorized. Trying to call the auth closure..."; - auth_closure_.Run(); - } else { - SendPendingEntries(); - } + SendPendingEntries(); } } // namespace remoting
diff --git a/remoting/base/telemetry_log_writer.h b/remoting/base/telemetry_log_writer.h index 36c9e27..2f644ce 100644 --- a/remoting/base/telemetry_log_writer.h +++ b/remoting/base/telemetry_log_writer.h
@@ -14,6 +14,7 @@ #include "base/values.h" #include "remoting/base/chromoting_event.h" #include "remoting/base/chromoting_event_log_writer.h" +#include "remoting/base/oauth_token_getter.h" #include "remoting/base/url_request.h" namespace remoting { @@ -27,19 +28,9 @@ // unless otherwise noted. class TelemetryLogWriter : public ChromotingEventLogWriter { public: - // |auth_closure| will be called when the request fails with unauthorized - // error code. The closure should call SetAccessToken to set the token. - // If the closure is null, the log writer will try to resend the logs - // immediately. - // TODO(yuweih): Pass in centralized OAuthTokenGetter. TelemetryLogWriter(const std::string& telemetry_base_url, std::unique_ptr<UrlRequestFactory> request_factory, - const base::RepeatingClosure& auth_closure); - - // "Authorization:Bearer {TOKEN}" will be added if access_token is not empty. - // After this function is called, the log writer will try to send out pending - // logs if the list is not empty. - void SetAuthToken(const std::string& access_token) override; + std::unique_ptr<OAuthTokenGetter> token_getter); // Push the log entry to the pending list and send out all the pending logs. void Log(const ChromotingEvent& entry) override; @@ -48,14 +39,17 @@ private: void SendPendingEntries(); - void PostJsonToServer(const std::string& json); + void PostJsonToServer(const std::string& json, + OAuthTokenGetter::Status status, + const std::string& user_email, + const std::string& access_token); void OnSendLogResult(const remoting::UrlRequest::Result& result); - base::ThreadChecker thread_checker_; + THREAD_CHECKER(thread_checker_); + std::string telemetry_base_url_; std::unique_ptr<UrlRequestFactory> request_factory_; - std::string access_token_; - base::RepeatingClosure auth_closure_; + std::unique_ptr<OAuthTokenGetter> token_getter_; std::unique_ptr<UrlRequest> request_; // Entries to be sent.
diff --git a/remoting/base/telemetry_log_writer_unittest.cc b/remoting/base/telemetry_log_writer_unittest.cc index d4b4f9b31..5c4348ef 100644 --- a/remoting/base/telemetry_log_writer_unittest.cc +++ b/remoting/base/telemetry_log_writer_unittest.cc
@@ -9,20 +9,35 @@ #include "base/containers/circular_deque.h" #include "base/macros.h" #include "base/memory/ptr_util.h" +#include "base/message_loop/message_loop.h" +#include "base/run_loop.h" #include "net/http/http_status_code.h" #include "remoting/base/chromoting_event.h" +#include "remoting/base/fake_oauth_token_getter.h" #include "remoting/base/url_request.h" #include "testing/gtest/include/gtest/gtest.h" namespace remoting { +namespace { + +constexpr char kFakeAccessToken[] = "access_token"; +constexpr char kAuthorizationHeaderPrefix[] = "Authorization:Bearer "; + class FakeUrlRequest : public UrlRequest { public: FakeUrlRequest(const std::string& expected_post, const UrlRequest::Result& returned_result) : expected_post_(expected_post), returned_result_(returned_result) {} - void Respond() { on_result_callback_.Run(returned_result_); } + void Respond() { + on_result_callback_.Run(returned_result_); + + // Responding to current request will trigger sending pending events. Call + // RunUntilIdle() to allow the new request to be created. See LogFakeEvent() + // below. + base::RunLoop().RunUntilIdle(); + } // UrlRequest overrides. void SetPostData(const std::string& content_type, @@ -31,7 +46,12 @@ EXPECT_EQ(post_data, expected_post_); } - void AddHeader(const std::string& value) override {} + void AddHeader(const std::string& value) override { + if (value.find(kAuthorizationHeaderPrefix) == 0) { + EXPECT_EQ(std::string(kAuthorizationHeaderPrefix) + kFakeAccessToken, + value); + } + } void Start(const OnResultCallback& on_result_callback) override { on_result_callback_ = on_result_callback; @@ -78,14 +98,18 @@ base::circular_deque<std::unique_ptr<UrlRequest>> expected_requests_; }; +} // namespace + class TelemetryLogWriterTest : public testing::Test { public: TelemetryLogWriterTest() : request_factory_(new FakeUrlRequestFactory()), - log_writer_("", - base::WrapUnique(request_factory_), - base::BindRepeating(&TelemetryLogWriterTest::SetAuth, - base::Unretained(this))) { + log_writer_( + "", + base::WrapUnique(request_factory_), + std::make_unique<FakeOAuthTokenGetter>(OAuthTokenGetter::SUCCESS, + "email", + kFakeAccessToken)) { success_result_.success = true; success_result_.status = 200; success_result_.response_body = "{}"; @@ -101,6 +125,9 @@ entry.SetInteger("id", id_); id_++; log_writer_.Log(entry); + + // It's an async process to create request to send all pending events. + base::RunLoop().RunUntilIdle(); } UrlRequest::Result success_result_; @@ -109,15 +136,9 @@ FakeUrlRequestFactory* request_factory_; // For peeking. No ownership. TelemetryLogWriter log_writer_; - int set_auth_count_ = 0; - private: - void SetAuth() { - set_auth_count_++; - log_writer_.SetAuthToken("some token"); - } - int id_ = 0; + base::MessageLoop message_loop_; }; // Test workflow: add request -> log event -> respond request. @@ -210,8 +231,6 @@ "{\"event\":[{\"id\":0}]}", success_result_); respond1.Run(); respond2.Run(); - - EXPECT_EQ(1, set_auth_count_); } } // namespace remoting
diff --git a/remoting/client/chromoting_client_runtime.cc b/remoting/client/chromoting_client_runtime.cc index 94d95840..1e2c7b5b 100644 --- a/remoting/client/chromoting_client_runtime.cc +++ b/remoting/client/chromoting_client_runtime.cc
@@ -13,6 +13,7 @@ #include "remoting/base/chromium_url_request.h" #include "remoting/base/telemetry_log_writer.h" #include "remoting/base/url_request_context_getter.h" +#include "remoting/client/oauth_token_getter_proxy.h" namespace { @@ -62,12 +63,6 @@ base::MessageLoop::TYPE_IO); url_requester_ = new URLRequestContextGetter(network_task_runner_, file_task_runner_); - - log_writer_ = std::make_unique<TelemetryLogWriter>( - kTelemetryBaseUrl, - std::make_unique<ChromiumUrlRequestFactory>(url_requester()), - base::BindRepeating(&ChromotingClientRuntime::RequestAuthTokenForLogger, - base::Unretained(this))); } ChromotingClientRuntime::~ChromotingClientRuntime() { @@ -85,21 +80,21 @@ } } -void ChromotingClientRuntime::SetDelegate( +void ChromotingClientRuntime::Init( ChromotingClientRuntime::Delegate* delegate) { + DCHECK(delegate); + DCHECK(!delegate_); delegate_ = delegate; + log_writer_ = std::make_unique<TelemetryLogWriter>( + kTelemetryBaseUrl, + std::make_unique<ChromiumUrlRequestFactory>(url_requester()), + CreateOAuthTokenGetter()); } -void ChromotingClientRuntime::RequestAuthTokenForLogger() { - if (delegate_) { - delegate_->RequestAuthTokenForLogger(); - } else { - DLOG(ERROR) << "ClientRuntime Delegate is null."; - } -} - -OAuthTokenGetter* ChromotingClientRuntime::token_getter() { - return delegate_->token_getter(); +std::unique_ptr<OAuthTokenGetter> +ChromotingClientRuntime::CreateOAuthTokenGetter() { + return std::make_unique<OAuthTokenGetterProxy>( + delegate_->oauth_token_getter(), ui_task_runner()); } } // namespace remoting
diff --git a/remoting/client/chromoting_client_runtime.h b/remoting/client/chromoting_client_runtime.h index 4b3eb64f..545448b 100644 --- a/remoting/client/chromoting_client_runtime.h +++ b/remoting/client/chromoting_client_runtime.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "net/url_request/url_request_context_getter.h" #include "remoting/base/auto_thread.h" #include "remoting/base/oauth_token_getter.h" @@ -40,21 +41,16 @@ // have been stopped. virtual void RuntimeDidShutdown() = 0; - // TODO(yuweih): Remove this once logger is using OAuthTokenGetter. - // RequestAuthTokenForLogger is called when the logger is requesting - // and auth token and the delegate is set. It is expected that the - // delegate will give the logger and auth token on the network thread like: - // (network thread): runtime->log_writer()->SetAuthToken(token) - virtual void RequestAuthTokenForLogger() = 0; - - // For fetching auth token. The implementation must allow being called from - // multiple threads. Use OAuthTokenGetterProxy when necessary. - virtual OAuthTokenGetter* token_getter() = 0; + // For fetching auth token. Called on the UI thread. + virtual base::WeakPtr<OAuthTokenGetter> oauth_token_getter() = 0; }; static ChromotingClientRuntime* GetInstance(); - void SetDelegate(ChromotingClientRuntime::Delegate* delegate); + // Must be called before calling any other methods on this object. + void Init(ChromotingClientRuntime::Delegate* delegate); + + std::unique_ptr<OAuthTokenGetter> CreateOAuthTokenGetter(); scoped_refptr<AutoThreadTaskRunner> network_task_runner() { return network_task_runner_; @@ -82,14 +78,10 @@ ChromotingEventLogWriter* log_writer() { return log_writer_.get(); } - OAuthTokenGetter* token_getter(); - private: ChromotingClientRuntime(); virtual ~ChromotingClientRuntime(); - void RequestAuthTokenForLogger(); - // Chromium code's connection to the app message loop. Once created the // MessageLoop will live for the life of the program. std::unique_ptr<base::MessageLoopForUI> ui_loop_; @@ -113,7 +105,7 @@ // For logging session stage changes and stats. std::unique_ptr<TelemetryLogWriter> log_writer_; - ChromotingClientRuntime::Delegate* delegate_; + ChromotingClientRuntime::Delegate* delegate_ = nullptr; friend struct base::DefaultSingletonTraits<ChromotingClientRuntime>;
diff --git a/remoting/client/chromoting_session.cc b/remoting/client/chromoting_session.cc index bcf98067..0e4615b 100644 --- a/remoting/client/chromoting_session.cc +++ b/remoting/client/chromoting_session.cc
@@ -168,6 +168,7 @@ // |signaling_| must outlive |client_|, so it must be declared above // |client_|. std::unique_ptr<XmppSignalStrategy> signaling_; + std::unique_ptr<OAuthTokenGetter> token_getter_; std::unique_ptr<ChromotingClient> client_; protocol::ThirdPartyTokenFetchedCallback third_party_token_fetched_callback_; @@ -482,6 +483,8 @@ net::ClientSocketFactory::GetDefaultFactory(), session_context_->runtime->url_requester(), xmpp_config)); + token_getter_ = session_context_->runtime->CreateOAuthTokenGetter(); + scoped_refptr<protocol::TransportContext> transport_context = new protocol::TransportContext( signaling_.get(), @@ -492,8 +495,7 @@ protocol::NetworkSettings::NAT_TRAVERSAL_FULL), protocol::TransportRole::CLIENT); transport_context->set_ice_config_url( - ServiceUrls::GetInstance()->ice_config_url(), - session_context_->runtime->token_getter()); + ServiceUrls::GetInstance()->ice_config_url(), token_getter_.get()); #if defined(ENABLE_WEBRTC_REMOTING_CLIENT) if (session_context_->info.flags.find("useWebrtc") != std::string::npos) { @@ -590,18 +592,8 @@ token, shared_secret); } -void ChromotingSession::ProvideSecret(const std::string& pin, - bool create_pairing, - const std::string& device_name) { - // TODO(nicholss): |pin| here is not used. Maybe there was an api refactor and - // this was not cleaned up. The auth pin providing mechanism seems to be call - // ProvideSecret, and then call the auth callback. When session moves to - // Connected state, this chromoing session calls RequestPairing based on - // create_pairing. - - if (create_pairing) { - RunCoreTaskOnNetworkThread(FROM_HERE, &Core::RequestPairing, device_name); - } +void ChromotingSession::RequestPairing(const std::string& device_name) { + RunCoreTaskOnNetworkThread(FROM_HERE, &Core::RequestPairing, device_name); } void ChromotingSession::SendMouseEvent(int x,
diff --git a/remoting/client/chromoting_session.h b/remoting/client/chromoting_session.h index a3e6414..6bcb3bb 100644 --- a/remoting/client/chromoting_session.h +++ b/remoting/client/chromoting_session.h
@@ -110,14 +110,8 @@ void HandleOnThirdPartyTokenFetched(const std::string& token, const std::string& shared_secret); - // Provides the user's PIN and resumes the host authentication attempt. Call - // on the UI thread once the user has finished entering this PIN into the UI, - // but only after the UI has been asked to provide a PIN (via FetchSecret()). - // TODO(yuweih): Rename this to RequestPairing(). PIN is provided by a - // completely different codepath. - void ProvideSecret(const std::string& pin, - bool create_pair, - const std::string& device_name); + // Requests pairing between the host and client for PIN-less authentication. + void RequestPairing(const std::string& device_name); // Moves the host's cursor to the specified coordinates, optionally with some // mouse button depressed. If |button| is BUTTON_UNDEFINED, no click is made.
diff --git a/remoting/client/client_telemetry_logger_unittest.cc b/remoting/client/client_telemetry_logger_unittest.cc index d58d1e2c..a78ad68 100644 --- a/remoting/client/client_telemetry_logger_unittest.cc +++ b/remoting/client/client_telemetry_logger_unittest.cc
@@ -59,9 +59,6 @@ // ChromotingEventLogWriter overrides. void Log(const ChromotingEvent& entry) override; - void SetAuthToken(const std::string& auth_token) override; - - const std::string& auth_token() const { return auth_token_; } private: base::circular_deque<ChromotingEvent> expected_events_; @@ -80,10 +77,6 @@ expected_events_.pop_front(); } -void FakeLogWriter::SetAuthToken(const std::string& auth_token) { - auth_token_ = auth_token; -} - class ClientTelemetryLoggerTest : public testing::Test { public: // testing::Test override.
diff --git a/remoting/client/gesture_interpreter.cc b/remoting/client/gesture_interpreter.cc index 32365b5..b3d6dfa 100644 --- a/remoting/client/gesture_interpreter.cc +++ b/remoting/client/gesture_interpreter.cc
@@ -29,7 +29,8 @@ scroll_animation_( kScrollFlingTimeConstant, base::Bind(&GestureInterpreter::ScrollWithoutAbortAnimations, - base::Unretained(this))) { + base::Unretained(this))), + weak_factory_(this) { viewport_.RegisterOnTransformationChangedCallback( base::Bind(&RendererProxy::SetTransformation, base::Unretained(renderer_)), @@ -175,6 +176,10 @@ viewport_.SetDesktopSize(width, height); } +base::WeakPtr<GestureInterpreter> GestureInterpreter::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + void GestureInterpreter::PanWithoutAbortAnimations(float translation_x, float translation_y) { if (viewport_.IsViewportReady() &&
diff --git a/remoting/client/gesture_interpreter.h b/remoting/client/gesture_interpreter.h index abe6871..d281b18 100644 --- a/remoting/client/gesture_interpreter.h +++ b/remoting/client/gesture_interpreter.h
@@ -7,6 +7,8 @@ #include <memory> +#include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "remoting/client/input/touch_input_strategy.h" #include "remoting/client/ui/desktop_viewport.h" #include "remoting/client/ui/fling_animation.h" @@ -77,6 +79,8 @@ void OnSurfaceSizeChanged(int width, int height); void OnDesktopSizeChanged(int width, int height); + base::WeakPtr<GestureInterpreter> GetWeakPtr(); + private: void PanWithoutAbortAnimations(float translation_x, float translation_y); @@ -110,9 +114,10 @@ FlingAnimation pan_animation_; FlingAnimation scroll_animation_; + base::WeakPtrFactory<GestureInterpreter> weak_factory_; + // GestureInterpreter is neither copyable nor movable. - GestureInterpreter(const GestureInterpreter&) = delete; - GestureInterpreter& operator=(const GestureInterpreter&) = delete; + DISALLOW_COPY_AND_ASSIGN(GestureInterpreter); }; } // namespace remoting
diff --git a/remoting/client/jni/jni_client.cc b/remoting/client/jni/jni_client.cc index 49ec4a1..b203599 100644 --- a/remoting/client/jni/jni_client.cc +++ b/remoting/client/jni/jni_client.cc
@@ -187,9 +187,8 @@ const JavaParamRef<jstring>& pin, jboolean createPair, const JavaParamRef<jstring>& deviceName) { - if (session_) { - session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin), createPair, - ConvertJavaStringToUTF8(env, deviceName)); + if (session_ && createPair) { + session_->RequestPairing(ConvertJavaStringToUTF8(env, deviceName)); } if (secret_fetcher_) {
diff --git a/remoting/client/jni/jni_oauth_token_getter.cc b/remoting/client/jni/jni_oauth_token_getter.cc index 5cb29d7..abeaad3 100644 --- a/remoting/client/jni/jni_oauth_token_getter.cc +++ b/remoting/client/jni/jni_oauth_token_getter.cc
@@ -44,8 +44,9 @@ delete callback; } -JniOAuthTokenGetter::JniOAuthTokenGetter() { +JniOAuthTokenGetter::JniOAuthTokenGetter() : weak_factory_(this) { DETACH_FROM_THREAD(thread_checker_); + weak_ptr_ = weak_factory_.GetWeakPtr(); } JniOAuthTokenGetter::~JniOAuthTokenGetter() { @@ -66,4 +67,8 @@ Java_JniOAuthTokenGetter_invalidateCache(env); } +base::WeakPtr<JniOAuthTokenGetter> JniOAuthTokenGetter::GetWeakPtr() { + return weak_ptr_; +} + } // namespace remoting
diff --git a/remoting/client/jni/jni_oauth_token_getter.h b/remoting/client/jni/jni_oauth_token_getter.h index 00ebf55e..bdb0381 100644 --- a/remoting/client/jni/jni_oauth_token_getter.h +++ b/remoting/client/jni/jni_oauth_token_getter.h
@@ -6,6 +6,7 @@ #define REMOTING_CLIENT_JNI_JNI_OAUTH_TOKEN_GETTER_ #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "remoting/base/oauth_token_getter.h" @@ -33,9 +34,13 @@ void CallWithToken(const TokenCallback& on_access_token) override; void InvalidateCache() override; + base::WeakPtr<JniOAuthTokenGetter> GetWeakPtr(); + private: THREAD_CHECKER(thread_checker_); + base::WeakPtr<JniOAuthTokenGetter> weak_ptr_; + base::WeakPtrFactory<JniOAuthTokenGetter> weak_factory_; DISALLOW_COPY_AND_ASSIGN(JniOAuthTokenGetter); };
diff --git a/remoting/client/jni/jni_runtime_delegate.cc b/remoting/client/jni/jni_runtime_delegate.cc index de330cd..c5fe59ba 100644 --- a/remoting/client/jni/jni_runtime_delegate.cc +++ b/remoting/client/jni/jni_runtime_delegate.cc
@@ -40,25 +40,7 @@ ChromotingClientRuntime* runtime = remoting::ChromotingClientRuntime::GetInstance(); JniRuntimeDelegate* delegate = remoting::JniRuntimeDelegate::GetInstance(); - runtime->SetDelegate(delegate); -} - -static void HandleAuthTokenOnNetworkThread(const std::string& token) { - ChromotingClientRuntime* runtime = - remoting::ChromotingClientRuntime::GetInstance(); - DCHECK(runtime->network_task_runner()->BelongsToCurrentThread()); - runtime->log_writer()->SetAuthToken(token); -} - -static void JNI_JniInterface_OnAuthTokenFetched( - JNIEnv* env, - const JavaParamRef<jclass>& clazz, - const JavaParamRef<jstring>& token) { - ChromotingClientRuntime* runtime = - remoting::ChromotingClientRuntime::GetInstance(); - runtime->network_task_runner()->PostTask( - FROM_HERE, base::Bind(&HandleAuthTokenOnNetworkThread, - ConvertJavaStringToUTF8(env, token))); + runtime->Init(delegate); } // JniRuntimeDelegate implementation. @@ -70,8 +52,7 @@ JniRuntimeDelegate::JniRuntimeDelegate() { runtime_ = ChromotingClientRuntime::GetInstance(); - token_getter_ = std::make_unique<OAuthTokenGetterProxy>( - std::make_unique<JniOAuthTokenGetter>(), runtime_->ui_task_runner()); + token_getter_ = std::make_unique<JniOAuthTokenGetter>(); } JniRuntimeDelegate::~JniRuntimeDelegate() { @@ -99,21 +80,8 @@ base::android::DetachFromVM(); } -void JniRuntimeDelegate::RequestAuthTokenForLogger() { - if (!runtime_->ui_task_runner()->BelongsToCurrentThread()) { - runtime_->ui_task_runner()->PostTask( - FROM_HERE, base::Bind(&JniRuntimeDelegate::RequestAuthTokenForLogger, - base::Unretained(this))); - return; - } - JNIEnv* env = base::android::AttachCurrentThread(); - - // TODO(nicholss): I do not like this method name, change it soon. - Java_JniInterface_fetchAuthToken(env); -} - -OAuthTokenGetter* JniRuntimeDelegate::token_getter() { - return token_getter_.get(); +base::WeakPtr<OAuthTokenGetter> JniRuntimeDelegate::oauth_token_getter() { + return token_getter_->GetWeakPtr(); } void JniRuntimeDelegate::DetachFromVmAndSignal(base::WaitableEvent* waiter) {
diff --git a/remoting/client/jni/jni_runtime_delegate.h b/remoting/client/jni/jni_runtime_delegate.h index 388a8cbcf..0516dd4 100644 --- a/remoting/client/jni/jni_runtime_delegate.h +++ b/remoting/client/jni/jni_runtime_delegate.h
@@ -25,6 +25,8 @@ namespace remoting { +class JniOAuthTokenGetter; + // JniRuntimeDelegate is a singleton that hooks into delegate role for // the ChromotingClientRuntime object. This class handles Android specific // integrations for the runtime. Proxies outgoing JNI calls from @@ -36,14 +38,10 @@ // we close. Its components are reused across |JniRuntimeDelegate|s. static JniRuntimeDelegate* GetInstance(); - // Fetch OAuth token for the telemetry logger. Call on UI thread. - void FetchAuthToken(); - // remoting::ChromotingClientRuntime::Delegate overrides. void RuntimeWillShutdown() override; void RuntimeDidShutdown() override; - void RequestAuthTokenForLogger() override; - OAuthTokenGetter* token_getter() override; + base::WeakPtr<OAuthTokenGetter> oauth_token_getter() override; private: JniRuntimeDelegate(); @@ -59,7 +57,7 @@ void DetachFromVmAndSignal(base::WaitableEvent* waiter); ChromotingClientRuntime* runtime_; - std::unique_ptr<OAuthTokenGetter> token_getter_; + std::unique_ptr<JniOAuthTokenGetter> token_getter_; friend struct base::DefaultSingletonTraits<JniRuntimeDelegate>;
diff --git a/remoting/client/oauth_token_getter_proxy.cc b/remoting/client/oauth_token_getter_proxy.cc index 100eea3..dccc32c4 100644 --- a/remoting/client/oauth_token_getter_proxy.cc +++ b/remoting/client/oauth_token_getter_proxy.cc
@@ -9,121 +9,63 @@ namespace remoting { -// Runs entriely on the |task_runner| thread. -class OAuthTokenGetterProxy::Core { - public: - explicit Core(std::unique_ptr<OAuthTokenGetter> token_getter); - ~Core(); +namespace { - void RequestToken( - const TokenCallback& on_access_token, - scoped_refptr<base::SingleThreadTaskRunner> original_task_runner); - - void ResolveCallback( - const TokenCallback& on_access_token, - scoped_refptr<base::SingleThreadTaskRunner> original_task_runner, - Status status, - const std::string& user_email, - const std::string& access_token); - - void InvalidateCache(); - - base::WeakPtr<Core> GetWeakPtr(); - - private: - THREAD_CHECKER(thread_checker_); - - std::unique_ptr<OAuthTokenGetter> token_getter_; - - base::WeakPtr<Core> weak_ptr_; - base::WeakPtrFactory<Core> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(Core); -}; - -OAuthTokenGetterProxy::Core::Core( - std::unique_ptr<OAuthTokenGetter> token_getter) - : token_getter_(std::move(token_getter)), weak_factory_(this) { - DETACH_FROM_THREAD(thread_checker_); - weak_ptr_ = weak_factory_.GetWeakPtr(); -} - -OAuthTokenGetterProxy::Core::~Core() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); -} - -void OAuthTokenGetterProxy::Core::RequestToken( - const TokenCallback& on_access_token, - scoped_refptr<base::SingleThreadTaskRunner> original_task_runner) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - token_getter_->CallWithToken( - base::Bind(&OAuthTokenGetterProxy::Core::ResolveCallback, weak_ptr_, - on_access_token, original_task_runner)); -} - -void OAuthTokenGetterProxy::Core::ResolveCallback( - const TokenCallback& on_access_token, +void ResolveCallback( + const OAuthTokenGetter::TokenCallback& on_access_token, scoped_refptr<base::SingleThreadTaskRunner> original_task_runner, - Status status, + OAuthTokenGetter::Status status, const std::string& user_email, const std::string& access_token) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - if (original_task_runner->BelongsToCurrentThread()) { - on_access_token.Run(status, user_email, access_token); + if (!original_task_runner->BelongsToCurrentThread()) { + original_task_runner->PostTask( + FROM_HERE, + base::BindOnce(on_access_token, status, user_email, access_token)); return; } - original_task_runner->PostTask( - FROM_HERE, base::Bind(on_access_token, status, user_email, access_token)); + on_access_token.Run(status, user_email, access_token); } -void OAuthTokenGetterProxy::Core::InvalidateCache() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - token_getter_->InvalidateCache(); -} - -base::WeakPtr<OAuthTokenGetterProxy::Core> -OAuthTokenGetterProxy::Core::GetWeakPtr() { - return weak_ptr_; -} - -// OAuthTokenGetterProxy +} // namespace OAuthTokenGetterProxy::OAuthTokenGetterProxy( - std::unique_ptr<OAuthTokenGetter> token_getter, + base::WeakPtr<OAuthTokenGetter> token_getter, scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : core_(new Core(std::move(token_getter))), task_runner_(task_runner) {} + : token_getter_(token_getter), task_runner_(task_runner) {} -OAuthTokenGetterProxy::~OAuthTokenGetterProxy() { - if (!task_runner_->BelongsToCurrentThread()) { - task_runner_->DeleteSoon(FROM_HERE, core_.release()); - } -} +OAuthTokenGetterProxy::~OAuthTokenGetterProxy() {} void OAuthTokenGetterProxy::CallWithToken( const OAuthTokenGetter::TokenCallback& on_access_token) { - scoped_refptr<base::SingleThreadTaskRunner> task_runner_to_reply = - base::ThreadTaskRunnerHandle::Get(); + if (!task_runner_->BelongsToCurrentThread()) { + auto task_runner_to_reply = base::ThreadTaskRunnerHandle::Get(); - if (task_runner_->BelongsToCurrentThread()) { - core_->RequestToken(on_access_token, task_runner_to_reply); + // TODO(crbug.com/824488): Change to base::BindOnce(). + auto reply_callback = base::BindRepeating(&ResolveCallback, on_access_token, + task_runner_to_reply); + task_runner_->PostTask(FROM_HERE, + base::BindOnce(&OAuthTokenGetter::CallWithToken, + token_getter_, reply_callback)); return; } - task_runner_->PostTask( - FROM_HERE, - base::Bind(&OAuthTokenGetterProxy::Core::RequestToken, - core_->GetWeakPtr(), on_access_token, task_runner_to_reply)); + if (token_getter_) { + token_getter_->CallWithToken(on_access_token); + } } void OAuthTokenGetterProxy::InvalidateCache() { - if (task_runner_->BelongsToCurrentThread()) { - core_->InvalidateCache(); + if (!task_runner_->BelongsToCurrentThread()) { + task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&OAuthTokenGetter::InvalidateCache, token_getter_)); return; } - task_runner_->PostTask( - FROM_HERE, base::Bind(&OAuthTokenGetterProxy::Core::InvalidateCache, - core_->GetWeakPtr())); + + if (token_getter_) { + token_getter_->InvalidateCache(); + } } } // namespace remoting
diff --git a/remoting/client/oauth_token_getter_proxy.h b/remoting/client/oauth_token_getter_proxy.h index aeb8d24..2fe3199a 100644 --- a/remoting/client/oauth_token_getter_proxy.h +++ b/remoting/client/oauth_token_getter_proxy.h
@@ -24,7 +24,7 @@ class OAuthTokenGetterProxy : public OAuthTokenGetter { public: OAuthTokenGetterProxy( - std::unique_ptr<OAuthTokenGetter> token_getter, + base::WeakPtr<OAuthTokenGetter> token_getter, scoped_refptr<base::SingleThreadTaskRunner> task_runner); ~OAuthTokenGetterProxy() override; @@ -33,9 +33,7 @@ void InvalidateCache() override; private: - class Core; - - std::unique_ptr<Core> core_; + base::WeakPtr<OAuthTokenGetter> token_getter_; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; DISALLOW_COPY_AND_ASSIGN(OAuthTokenGetterProxy);
diff --git a/remoting/client/oauth_token_getter_proxy_unittest.cc b/remoting/client/oauth_token_getter_proxy_unittest.cc index 840bd181..79376ae 100644 --- a/remoting/client/oauth_token_getter_proxy_unittest.cc +++ b/remoting/client/oauth_token_getter_proxy_unittest.cc
@@ -4,8 +4,10 @@ #include "remoting/client/oauth_token_getter_proxy.h" +#include "base/bind_helpers.h" #include "base/callback.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/threading/thread.h" @@ -17,9 +19,14 @@ namespace { +OAuthTokenGetter::TokenCallback GetDoNothingTokenCallback() { + return base::DoNothing::Repeatedly<OAuthTokenGetter::Status, + const std::string&, const std::string&>(); +} + class FakeOAuthTokenGetter : public OAuthTokenGetter { public: - FakeOAuthTokenGetter(base::OnceClosure on_destroyed); + FakeOAuthTokenGetter(); ~FakeOAuthTokenGetter() override; void ResolveCallback(Status status, @@ -32,25 +39,25 @@ void CallWithToken(const TokenCallback& on_access_token) override; void InvalidateCache() override; + base::WeakPtr<FakeOAuthTokenGetter> GetWeakPtr(); + private: TokenCallback on_access_token_; bool invalidate_cache_expected_ = false; - base::OnceClosure on_destroyed_; THREAD_CHECKER(thread_checker_); + base::WeakPtrFactory<FakeOAuthTokenGetter> weak_factory_; DISALLOW_COPY_AND_ASSIGN(FakeOAuthTokenGetter); }; -FakeOAuthTokenGetter::FakeOAuthTokenGetter(base::OnceClosure on_destroyed) - : on_destroyed_(std::move(on_destroyed)) { +FakeOAuthTokenGetter::FakeOAuthTokenGetter() : weak_factory_(this) { DETACH_FROM_THREAD(thread_checker_); } FakeOAuthTokenGetter::~FakeOAuthTokenGetter() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(!invalidate_cache_expected_); - std::move(on_destroyed_).Run(); } void FakeOAuthTokenGetter::ResolveCallback(Status status, @@ -79,6 +86,10 @@ invalidate_cache_expected_ = false; } +base::WeakPtr<FakeOAuthTokenGetter> FakeOAuthTokenGetter::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + } // namespace class OAuthTokenGetterProxyTest : public testing::Test { @@ -101,11 +112,19 @@ void ExpectInvalidateCache(); + void InvalidateTokenGetter(); + base::Thread runner_thread_{"runner_thread"}; - FakeOAuthTokenGetter* token_getter_; + std::unique_ptr<FakeOAuthTokenGetter> token_getter_; std::unique_ptr<OAuthTokenGetterProxy> proxy_; private: + struct TokenCallbackResult { + OAuthTokenGetter::Status status; + std::string user_email; + std::string access_token; + }; + void TestCallWithTokenImpl(OAuthTokenGetter::Status status, const std::string& user_email, const std::string& access_token); @@ -114,36 +133,24 @@ const std::string& user_email, const std::string& access_token); - struct TokenCallbackResult { - OAuthTokenGetter::Status status; - std::string user_email; - std::string access_token; - }; - std::unique_ptr<TokenCallbackResult> expected_callback_result_; - void OnTokenGetterDestroyed(); - base::MessageLoop main_loop_; DISALLOW_COPY_AND_ASSIGN(OAuthTokenGetterProxyTest); }; void OAuthTokenGetterProxyTest::SetUp() { - std::unique_ptr<FakeOAuthTokenGetter> owned_token_getter = - std::make_unique<FakeOAuthTokenGetter>( - base::BindOnce(&OAuthTokenGetterProxyTest::OnTokenGetterDestroyed, - base::Unretained(this))); - token_getter_ = owned_token_getter.get(); + token_getter_ = std::make_unique<FakeOAuthTokenGetter>(); runner_thread_.Start(); proxy_ = std::make_unique<OAuthTokenGetterProxy>( - std::move(owned_token_getter), runner_thread_.task_runner()); + token_getter_->GetWeakPtr(), runner_thread_.task_runner()); } void OAuthTokenGetterProxyTest::TearDown() { + InvalidateTokenGetter(); proxy_.reset(); runner_thread_.FlushForTesting(); - ASSERT_FALSE(token_getter_); ASSERT_FALSE(expected_callback_result_); } @@ -169,9 +176,17 @@ } void OAuthTokenGetterProxyTest::ExpectInvalidateCache() { + ASSERT_NE(nullptr, token_getter_.get()); runner_thread_.task_runner()->PostTask( FROM_HERE, base::BindOnce(&FakeOAuthTokenGetter::ExpectInvalidateCache, - base::Unretained(token_getter_))); + token_getter_->GetWeakPtr())); +} + +void OAuthTokenGetterProxyTest::InvalidateTokenGetter() { + if (token_getter_) { + runner_thread_.task_runner()->DeleteSoon(FROM_HERE, + token_getter_.release()); + } } void OAuthTokenGetterProxyTest::TestCallWithTokenImpl( @@ -187,8 +202,8 @@ base::Unretained(this))); runner_thread_.task_runner()->PostTask( FROM_HERE, base::BindOnce(&FakeOAuthTokenGetter::ResolveCallback, - base::Unretained(token_getter_), status, - user_email, access_token)); + token_getter_->GetWeakPtr(), status, user_email, + access_token)); } void OAuthTokenGetterProxyTest::OnTokenReceived( @@ -202,18 +217,6 @@ expected_callback_result_.reset(); } -void OAuthTokenGetterProxyTest::OnTokenGetterDestroyed() { - token_getter_ = nullptr; -} - -TEST_F(OAuthTokenGetterProxyTest, ProxyDeletedOnMainThread) { - // Default behavior verified in TearDown(). -} - -TEST_F(OAuthTokenGetterProxyTest, ProxyDeletedOnRunnerThread) { - runner_thread_.task_runner()->DeleteSoon(FROM_HERE, proxy_.release()); -} - TEST_F(OAuthTokenGetterProxyTest, CallWithTokenOnMainThread) { TestCallWithTokenOnMainThread(OAuthTokenGetter::Status::SUCCESS, "email1", "token1"); @@ -242,4 +245,41 @@ runner_thread_.FlushForTesting(); } +TEST_F( + OAuthTokenGetterProxyTest, + CallWithTokenOnMainThreadAfterTokenGetterDestroyed_callsSilentlyDropped) { + InvalidateTokenGetter(); + proxy_->CallWithToken(GetDoNothingTokenCallback()); + runner_thread_.FlushForTesting(); +} + +TEST_F( + OAuthTokenGetterProxyTest, + CallWithTokenOnRunnerThreadAfterTokenGetterDestroyed_callsSilentlyDropped) { + InvalidateTokenGetter(); + runner_thread_.task_runner()->PostTask( + FROM_HERE, base::BindOnce(&OAuthTokenGetterProxy::CallWithToken, + base::Unretained(proxy_.get()), + GetDoNothingTokenCallback())); + runner_thread_.FlushForTesting(); +} + +TEST_F( + OAuthTokenGetterProxyTest, + InvalidateCacheOnMainThreadAfterTokenGetterDestroyed_callsSilentlyDropped) { + InvalidateTokenGetter(); + proxy_->InvalidateCache(); + runner_thread_.FlushForTesting(); +} + +TEST_F( + OAuthTokenGetterProxyTest, + InvalidateCacheOnRunnerThreadAfterTokenGetterDestroyed_callsSilentlyDropped) { + InvalidateTokenGetter(); + runner_thread_.task_runner()->PostTask( + FROM_HERE, base::BindOnce(&OAuthTokenGetterProxy::InvalidateCache, + base::Unretained(proxy_.get()))); + runner_thread_.FlushForTesting(); +} + } // namespace remoting
diff --git a/remoting/ios/client_gestures.mm b/remoting/ios/client_gestures.mm index 1a75336de..47f85e4d 100644 --- a/remoting/ios/client_gestures.mm +++ b/remoting/ios/client_gestures.mm
@@ -42,7 +42,8 @@ UITapGestureRecognizer* _fourFingerTapRecognizer; __weak UIView* _view; - __weak RemotingClient* _client; + + base::WeakPtr<remoting::GestureInterpreter> _gestureInterpreter; } @end @@ -52,7 +53,7 @@ - (instancetype)initWithView:(UIView*)view client:(RemotingClient*)client { _view = view; - _client = client; + _gestureInterpreter = client.gestureInterpreter->GetWeakPtr(); _longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self @@ -141,23 +142,35 @@ // Resize the view of the desktop - Zoom in/out. This can occur during a Pan. - (IBAction)pinchGestureTriggered:(UIPinchGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + CGPoint pivot = [sender locationInView:_view]; - _client.gestureInterpreter->Zoom(pivot.x, pivot.y, sender.scale, - toGestureState([sender state])); + _gestureInterpreter->Zoom(pivot.x, pivot.y, sender.scale, + toGestureState([sender state])); sender.scale = 1.0; // reset scale so next iteration is a relative ratio } - (IBAction)tapGestureTriggered:(UITapGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + CGPoint touchPoint = [sender locationInView:_view]; - _client.gestureInterpreter->Tap(touchPoint.x, touchPoint.y); + _gestureInterpreter->Tap(touchPoint.x, touchPoint.y); } // Change position of the viewport. This can occur during a pinch or long press. - (IBAction)panGestureTriggered:(UIPanGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + if ([sender state] == UIGestureRecognizerStateChanged) { CGPoint translation = [sender translationInView:_view]; - _client.gestureInterpreter->Pan(translation.x, translation.y); + _gestureInterpreter->Pan(translation.x, translation.y); // Reset translation so next iteration is relative [sender setTranslation:CGPointZero inView:_view]; @@ -167,26 +180,34 @@ // Do fling on the viewport. This will happen at the end of the one-finger // panning. - (IBAction)flingGestureTriggered:(UIPanGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + if ([sender state] == UIGestureRecognizerStateEnded) { CGPoint velocity = [sender velocityInView:_view]; if (velocity.x != 0 || velocity.y != 0) { - _client.gestureInterpreter->OneFingerFling(velocity.x, velocity.y); + _gestureInterpreter->OneFingerFling(velocity.x, velocity.y); } } } // Handles the two finger scrolling gesture. - (IBAction)scrollGestureTriggered:(UIPanGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + if ([sender state] == UIGestureRecognizerStateEnded) { CGPoint velocity = [sender velocityInView:_view]; - _client.gestureInterpreter->ScrollWithVelocity(velocity.x, velocity.y); + _gestureInterpreter->ScrollWithVelocity(velocity.x, velocity.y); return; } CGPoint scrollPoint = [sender locationInView:_view]; CGPoint translation = [sender translationInView:_view]; - _client.gestureInterpreter->Scroll(scrollPoint.x, scrollPoint.y, - translation.x, translation.y); + _gestureInterpreter->Scroll(scrollPoint.x, scrollPoint.y, translation.x, + translation.y); // Reset translation so next iteration is relative [sender setTranslation:CGPointZero inView:_view]; @@ -194,22 +215,38 @@ // Click-Drag mouse operation. This can occur during a Pan. - (IBAction)longPressGestureTriggered:(UILongPressGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + CGPoint touchPoint = [sender locationInView:_view]; - _client.gestureInterpreter->Drag(touchPoint.x, touchPoint.y, - toGestureState([sender state])); + _gestureInterpreter->Drag(touchPoint.x, touchPoint.y, + toGestureState([sender state])); } - (IBAction)twoFingerTapGestureTriggered:(UITapGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + CGPoint touchPoint = [sender locationInView:_view]; - _client.gestureInterpreter->TwoFingerTap(touchPoint.x, touchPoint.y); + _gestureInterpreter->TwoFingerTap(touchPoint.x, touchPoint.y); } - (IBAction)threeFingerTapGestureTriggered:(UITapGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + CGPoint touchPoint = [sender locationInView:_view]; - _client.gestureInterpreter->ThreeFingerTap(touchPoint.x, touchPoint.y); + _gestureInterpreter->ThreeFingerTap(touchPoint.x, touchPoint.y); } - (IBAction)threeFingerPanGestureTriggered:(UIPanGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + if ([sender state] != UIGestureRecognizerStateEnded) { return; } @@ -227,6 +264,10 @@ // To trigger the menu. - (IBAction)fourFingerTapGestureTriggered: (UILongPressGestureRecognizer*)sender { + if (!_gestureInterpreter) { + return; + } + [_delegate menuShouldShow]; }
diff --git a/remoting/ios/facade/ios_client_runtime_delegate.h b/remoting/ios/facade/ios_client_runtime_delegate.h index f5f535c..a03c8967 100644 --- a/remoting/ios/facade/ios_client_runtime_delegate.h +++ b/remoting/ios/facade/ios_client_runtime_delegate.h
@@ -13,6 +13,8 @@ namespace remoting { +class IosOauthTokenGetter; + class IosClientRuntimeDelegate : public ChromotingClientRuntime::Delegate { public: IosClientRuntimeDelegate(); @@ -21,16 +23,12 @@ // remoting::ChromotingClientRuntime::Delegate overrides. void RuntimeWillShutdown() override; void RuntimeDidShutdown() override; - void RequestAuthTokenForLogger() override; - OAuthTokenGetter* token_getter() override; - - // Sets the access token. Should be called when the user switches accounts. - void SetAuthToken(const std::string& access_token); + base::WeakPtr<OAuthTokenGetter> oauth_token_getter() override; base::WeakPtr<IosClientRuntimeDelegate> GetWeakPtr(); private: - std::unique_ptr<OAuthTokenGetter> token_getter_; + std::unique_ptr<IosOauthTokenGetter> token_getter_; ChromotingClientRuntime* runtime_; base::WeakPtrFactory<IosClientRuntimeDelegate> weak_factory_;
diff --git a/remoting/ios/facade/ios_client_runtime_delegate.mm b/remoting/ios/facade/ios_client_runtime_delegate.mm index 653d403..aa2d0b1 100644 --- a/remoting/ios/facade/ios_client_runtime_delegate.mm +++ b/remoting/ios/facade/ios_client_runtime_delegate.mm
@@ -25,8 +25,7 @@ IosClientRuntimeDelegate::IosClientRuntimeDelegate() : weak_factory_(this) { runtime_ = ChromotingClientRuntime::GetInstance(); - token_getter_ = std::make_unique<OAuthTokenGetterProxy>( - std::make_unique<IosOauthTokenGetter>(), runtime_->ui_task_runner()); + token_getter_ = std::make_unique<IosOauthTokenGetter>(); } IosClientRuntimeDelegate::~IosClientRuntimeDelegate() {} @@ -41,55 +40,8 @@ // Nothing to do. } -void IosClientRuntimeDelegate::RequestAuthTokenForLogger() { - if (!runtime_->ui_task_runner()->BelongsToCurrentThread()) { - // TODO(yuweih): base::Unretained(this) looks suspicious here. Maybe we can - // use GetWeakPtr()? - runtime_->ui_task_runner()->PostTask( - FROM_HERE, - base::Bind(&IosClientRuntimeDelegate::RequestAuthTokenForLogger, - base::Unretained(this))); - return; - } - if ([RemotingService.instance.authentication.user isAuthenticated]) { - [RemotingService.instance.authentication - callbackWithAccessToken:^(RemotingAuthenticationStatus status, - NSString* userEmail, NSString* accessToken) { - if (status == RemotingAuthenticationStatusSuccess) { - // Set the new auth token for the log writer on the network thread. - SetAuthToken(base::SysNSStringToUTF8(accessToken)); - } else { - LOG(ERROR) << "Failed to fetch access token for log writer. (" - << status << ")"; - } - }]; - } -} - -OAuthTokenGetter* IosClientRuntimeDelegate::token_getter() { - return token_getter_.get(); -} - -void IosClientRuntimeDelegate::SetAuthToken(const std::string& access_token) { - if (runtime_->network_task_runner()->BelongsToCurrentThread()) { - runtime_->log_writer()->SetAuthToken(access_token); - return; - } - - runtime_->network_task_runner()->PostTask( - FROM_HERE, - base::Bind( - base::BindBlockArc(^(const std::string& token) { - // |token| need to be bound separately since the Objective-C block - // captures the reference without copying. - - // Using |runtime_| here will be unsafe since that will implicitly - // capture |this|, of which the lifetime is not managed by the - // block. - ChromotingClientRuntime::GetInstance()->log_writer()->SetAuthToken( - token); - }), - access_token)); +base::WeakPtr<OAuthTokenGetter> IosClientRuntimeDelegate::oauth_token_getter() { + return token_getter_->GetWeakPtr(); } base::WeakPtr<IosClientRuntimeDelegate> IosClientRuntimeDelegate::GetWeakPtr() {
diff --git a/remoting/ios/facade/ios_oauth_token_getter.h b/remoting/ios/facade/ios_oauth_token_getter.h index 7ac9e1a6..7ad1fa8 100644 --- a/remoting/ios/facade/ios_oauth_token_getter.h +++ b/remoting/ios/facade/ios_oauth_token_getter.h
@@ -6,13 +6,14 @@ #define REMOTING_IOS_FACADE_IOS_OAUTH_TOKEN_GETTER_H_ #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "remoting/base/oauth_token_getter.h" namespace remoting { // The OAuthTokenGetter implementation on iOS client that uses -// RemotingService.instance.authentication to authenticate. Depending on the -// RemotingAuthentication implementation, this class may be single-threaded. +// RemotingService.instance.authentication to authenticate. Please use it only +// on one thread. class IosOauthTokenGetter : public OAuthTokenGetter { public: IosOauthTokenGetter(); @@ -22,7 +23,11 @@ void CallWithToken(const TokenCallback& on_access_token) override; void InvalidateCache() override; + base::WeakPtr<IosOauthTokenGetter> GetWeakPtr(); + private: + base::WeakPtr<IosOauthTokenGetter> weak_ptr_; + base::WeakPtrFactory<IosOauthTokenGetter> weak_factory_; DISALLOW_COPY_AND_ASSIGN(IosOauthTokenGetter); };
diff --git a/remoting/ios/facade/ios_oauth_token_getter.mm b/remoting/ios/facade/ios_oauth_token_getter.mm index b6dfc63..1f60af2 100644 --- a/remoting/ios/facade/ios_oauth_token_getter.mm +++ b/remoting/ios/facade/ios_oauth_token_getter.mm
@@ -14,7 +14,9 @@ namespace remoting { -IosOauthTokenGetter::IosOauthTokenGetter() {} +IosOauthTokenGetter::IosOauthTokenGetter() : weak_factory_(this) { + weak_ptr_ = weak_factory_.GetWeakPtr(); +} IosOauthTokenGetter::~IosOauthTokenGetter() {} @@ -50,4 +52,8 @@ NOTIMPLEMENTED(); } +base::WeakPtr<IosOauthTokenGetter> IosOauthTokenGetter::GetWeakPtr() { + return weak_ptr_; +} + } // namespace remoting
diff --git a/remoting/ios/facade/remoting_service.mm b/remoting/ios/facade/remoting_service.mm index 8a8822f..43004d9 100644 --- a/remoting/ios/facade/remoting_service.mm +++ b/remoting/ios/facade/remoting_service.mm
@@ -74,7 +74,7 @@ _lastFetchFailureReason = HostListFetchFailureReasonNoFailure; _clientRuntimeDelegate = new remoting::IosClientRuntimeDelegate(); - [self runtime]->SetDelegate(_clientRuntimeDelegate); + [self runtime]->Init(_clientRuntimeDelegate); } return self; } @@ -175,12 +175,6 @@ if (user) { userInfo = [NSDictionary dictionaryWithObject:user forKey:kUserInfo]; [self requestHostListFetch]; - [_authentication - callbackWithAccessToken:^(RemotingAuthenticationStatus status, - NSString* userEmail, NSString* accessToken) { - _clientRuntimeDelegate->SetAuthToken( - base::SysNSStringToUTF8(accessToken)); - }]; } else { _hosts = nil; }
diff --git a/remoting/ios/session/remoting_client.mm b/remoting/ios/session/remoting_client.mm index f82a4d7..551d93e3 100644 --- a/remoting/ios/session/remoting_client.mm +++ b/remoting/ios/session/remoting_client.mm
@@ -210,15 +210,11 @@ - (void)hostSessionPinProvided:(NSNotification*)notification { NSString* pin = [[notification userInfo] objectForKey:kHostSessionPin]; NSString* name = UIDevice.currentDevice.name; - BOOL createPairing = [[[notification userInfo] + BOOL shouldCreatePairing = [[[notification userInfo] objectForKey:kHostSessionCreatePairing] boolValue]; - // TODO(nicholss): Look into refactoring ProvideSecret. It is mis-named and - // does not use pin. - if (_session) { - _session->ProvideSecret(base::SysNSStringToUTF8(pin), - (createPairing == YES), - base::SysNSStringToUTF8(name)); + if (_session && shouldCreatePairing) { + _session->RequestPairing(base::SysNSStringToUTF8(name)); } if (_secretFetchedCallback) {
diff --git a/remoting/resources/remoting_strings_bn.xtb b/remoting/resources/remoting_strings_bn.xtb index 0a02d39..86e6d03d 100644 --- a/remoting/resources/remoting_strings_bn.xtb +++ b/remoting/resources/remoting_strings_bn.xtb
@@ -292,7 +292,7 @@ <translation id="7672203038394118626">এই কম্পিউটারটিতে দূরবর্তী সংযোগ অক্ষম করা হয়েছে৷</translation> <translation id="7678209621226490279">ডক বাঁ দিকে করুন</translation> <translation id="7693372326588366043">হোস্টগুলির তালিকা রিফ্রেশ করুন</translation> -<translation id="7714222945760997814">এ বিষয়ে রিপোর্ট করুন</translation> +<translation id="7714222945760997814">এটির বিষয়ে রিপোর্ট করুন</translation> <translation id="7782471917492991422">দয়া করে আপনার কম্পিউটারের বিদ্যুত পরিচালনার সেটিং পরীক্ষা করুন এবং নিষ্ক্রিয় থাকাকালীন এটি যাতে স্লীপে কনফিগার না থাকে তা নিশ্চিত করুন৷</translation> <translation id="7810127880729796595">পরিসংখ্যান দেখান (সংযোগ: <ph name="QUALITY" />)</translation> <translation id="7836926030608666805">প্রয়োজনীয় কিছু উপাদান অনুপস্থিত আছে৷ আপনি Chrome-এর অতিসাম্প্রতিক সংস্করণটি ইনস্টল করেছেন কিনা দয়া করে তা নিশ্চিত করুন এবং আবার চেষ্টা করুন৷</translation>
diff --git a/remoting/resources/remoting_strings_de.xtb b/remoting/resources/remoting_strings_de.xtb index 30156b0..dbbcdca 100644 --- a/remoting/resources/remoting_strings_de.xtb +++ b/remoting/resources/remoting_strings_de.xtb
@@ -242,7 +242,7 @@ <translation id="6381670701864002291">Sonstige</translation> <translation id="6398765197997659313">Vollbildmodus beenden</translation> <translation id="6441316101718669559">Die Desktop-Integration wird auf dieser Plattform nicht unterstützt. Sie können die App weiterhin verwenden, allerdings ist die Nutzerfreundlichkeit beeinträchtigt.</translation> -<translation id="6502629188777329097">Sicherer Zugriff auf den Computer</translation> +<translation id="6502629188777329097">Zugriff auf Ihren Computer</translation> <translation id="652218476070540101">Die PIN für diesen Computer wird aktualisiert…</translation> <translation id="6527303717912515753">Teilen</translation> <translation id="6541219117979389420">Anwendungsprotokolle können private Informationen enthalten. Dabei kann es sich zum Beispiel um Ihre Identität, d. h. Ihre E-Mail-Adresse, und den Namen und die Eigenschaften von Dateien und Ordnern in Google Drive handeln.</translation>
diff --git a/services/device/generic_sensor/README.md b/services/device/generic_sensor/README.md index 583d858..7be265b 100644 --- a/services/device/generic_sensor/README.md +++ b/services/device/generic_sensor/README.md
@@ -71,8 +71,8 @@ | GYROSCOPE | TYPE_GYROSCOPE | in_anglvel | | SENSOR_TYPE_GYROMETER_3D | | MAGNETOMETER | TYPE_MAGNETIC_FIELD | in_magn | | SENSOR_TYPE_COMPASS_3D | | PRESSURE | | | | | -| ABSOLUTE_ORIENTATION_EULER_ANGLES | See below | | | SENSOR_TYPE_INCLINOMETER_3D | -| ABSOLUTE_ORIENTATION_QUATERNION | See below | | | SENSOR_TYPE_AGGREGATED_DEVICE_ORIENTATION | +| ABSOLUTE_ORIENTATION_EULER_ANGLES | See below | ACCELEROMETER and MAGNETOMETER (*) | | SENSOR_TYPE_INCLINOMETER_3D | +| ABSOLUTE_ORIENTATION_QUATERNION | See below | ABSOLUTE_ORIENTATION_EULER_ANGLES (*) | | SENSOR_TYPE_AGGREGATED_DEVICE_ORIENTATION | | RELATIVE_ORIENTATION_EULER_ANGLES | See below | ACCELEROMETER (*) | ACCELEROMETER (*) | | | RELATIVE_ORIENTATION_QUATERNION | TYPE_GAME_ROTATION_VECTOR | RELATIVE_ORIENTATION_EULER_ANGLES (*) | RELATIVE_ORIENTATION_EULER_ANGLES (*) | | @@ -103,6 +103,10 @@ Sensors are implemented by reading values from the IIO subsystem. The values in the "Linux" column of the table above are the prefix of the sysfs files Chrome searches for to provide data for a SensorType. The +ABSOLUTE_ORIENTATION_EULER_ANGLES sensor type is provided by interpreting the +value that can be read from the ACCELEROMETER and MAGNETOMETER. The +ABSOLUTE_ORIENTATION_QUATERNION sensor type is provided by interpreting the +value that can be read from the ABSOLUTE_ORIENTATION_EULER_ANGLES. The RELATIVE_ORIENTATION_EULER_ANGLES sensor type is provided by interpreting the value that can be read from the ACCELEROMETER. The RELATIVE_ORIENTATION_QUATERNION sensor type is provided by interpreting the
diff --git a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc index 845b032..ece47d0 100644 --- a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc +++ b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
@@ -751,4 +751,66 @@ EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); } +// Tests that ABSOLUTE_ORIENTATION_EULER_ANGLES sensor is successfully created. +TEST_F(PlatformSensorAndProviderLinuxTest, + CheckAbsoluteOrientationEulerAnglesSensor) { + double sensor_value[3] = {1, 2, 3}; + InitializeSupportedSensor( + SensorType::ACCELEROMETER, kAccelerometerFrequencyValue, + kAccelerometerOffsetValue, kAccelerometerScalingValue, sensor_value); + InitializeSupportedSensor( + SensorType::MAGNETOMETER, kMagnetometerFrequencyValue, + kMagnetometerOffsetValue, kMagnetometerScalingValue, sensor_value); + InitializeMockUdevMethods(sensors_dir_.GetPath()); + SetServiceStart(); + + auto sensor = CreateSensor(SensorType::ABSOLUTE_ORIENTATION_EULER_ANGLES); + EXPECT_TRUE(sensor); +} + +// Tests that ABSOLUTE_ORIENTATION_QUATERNION sensor is successfully created. +TEST_F(PlatformSensorAndProviderLinuxTest, + CheckAbsoluteOrientationQuaternionSensor) { + double sensor_value[3] = {1, 2, 3}; + InitializeSupportedSensor( + SensorType::ACCELEROMETER, kAccelerometerFrequencyValue, + kAccelerometerOffsetValue, kAccelerometerScalingValue, sensor_value); + InitializeSupportedSensor( + SensorType::MAGNETOMETER, kMagnetometerFrequencyValue, + kMagnetometerOffsetValue, kMagnetometerScalingValue, sensor_value); + InitializeMockUdevMethods(sensors_dir_.GetPath()); + SetServiceStart(); + + auto sensor = CreateSensor(SensorType::ABSOLUTE_ORIENTATION_QUATERNION); + EXPECT_TRUE(sensor); +} + +// Tests that RELATIVE_ORIENTATION_EULER_ANGLES sensor is successfully created. +TEST_F(PlatformSensorAndProviderLinuxTest, + CheckRelativeOrientationEulerAnglesSensor) { + double sensor_value[3] = {1, 2, 3}; + InitializeSupportedSensor( + SensorType::ACCELEROMETER, kAccelerometerFrequencyValue, + kAccelerometerOffsetValue, kAccelerometerScalingValue, sensor_value); + InitializeMockUdevMethods(sensors_dir_.GetPath()); + SetServiceStart(); + + auto sensor = CreateSensor(SensorType::RELATIVE_ORIENTATION_EULER_ANGLES); + EXPECT_TRUE(sensor); +} + +// Tests that RELATIVE_ORIENTATION_QUATERNION sensor is successfully created. +TEST_F(PlatformSensorAndProviderLinuxTest, + CheckRelativeOrientationQuaternionSensor) { + double sensor_value[3] = {1, 2, 3}; + InitializeSupportedSensor( + SensorType::ACCELEROMETER, kAccelerometerFrequencyValue, + kAccelerometerOffsetValue, kAccelerometerScalingValue, sensor_value); + InitializeMockUdevMethods(sensors_dir_.GetPath()); + SetServiceStart(); + + auto sensor = CreateSensor(SensorType::RELATIVE_ORIENTATION_QUATERNION); + EXPECT_TRUE(sensor); +} + } // namespace device
diff --git a/services/device/generic_sensor/platform_sensor_provider_linux.cc b/services/device/generic_sensor/platform_sensor_provider_linux.cc index 4746313..4f270d19 100644 --- a/services/device/generic_sensor/platform_sensor_provider_linux.cc +++ b/services/device/generic_sensor/platform_sensor_provider_linux.cc
@@ -13,6 +13,7 @@ #include "base/message_loop/message_loop.h" #include "base/task_runner_util.h" #include "base/threading/thread.h" +#include "services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.h" #include "services/device/generic_sensor/linear_acceleration_fusion_algorithm_using_accelerometer.h" #include "services/device/generic_sensor/linux/sensor_data_linux.h" #include "services/device/generic_sensor/orientation_quaternion_fusion_algorithm_using_euler_angles.h" @@ -26,6 +27,8 @@ bool IsFusionSensorType(mojom::SensorType type) { switch (type) { case mojom::SensorType::LINEAR_ACCELERATION: + case mojom::SensorType::ABSOLUTE_ORIENTATION_EULER_ANGLES: + case mojom::SensorType::ABSOLUTE_ORIENTATION_QUATERNION: case mojom::SensorType::RELATIVE_ORIENTATION_EULER_ANGLES: case mojom::SensorType::RELATIVE_ORIENTATION_QUATERNION: return true; @@ -252,6 +255,15 @@ fusion_algorithm = std::make_unique< LinearAccelerationFusionAlgorithmUsingAccelerometer>(); break; + case mojom::SensorType::ABSOLUTE_ORIENTATION_EULER_ANGLES: + fusion_algorithm = std::make_unique< + AbsoluteOrientationEulerAnglesFusionAlgorithmUsingAccelerometerAndMagnetometer>(); + break; + case mojom::SensorType::ABSOLUTE_ORIENTATION_QUATERNION: + fusion_algorithm = std::make_unique< + OrientationQuaternionFusionAlgorithmUsingEulerAngles>( + true /* absolute */); + break; case mojom::SensorType::RELATIVE_ORIENTATION_EULER_ANGLES: fusion_algorithm = std::make_unique< RelativeOrientationEulerAnglesFusionAlgorithmUsingAccelerometer>();
diff --git a/services/ui/public/cpp/gpu/context_provider_command_buffer.cc b/services/ui/public/cpp/gpu/context_provider_command_buffer.cc index fae6c98..91a9751 100644 --- a/services/ui/public/cpp/gpu/context_provider_command_buffer.cc +++ b/services/ui/public/cpp/gpu/context_provider_command_buffer.cc
@@ -19,6 +19,7 @@ #include "base/trace_event/memory_dump_manager.h" #include "components/viz/common/gpu/context_cache_controller.h" #include "gpu/command_buffer/client/gles2_cmd_helper.h" +#include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/client/gles2_trace_implementation.h" #include "gpu/command_buffer/client/gpu_switches.h" #include "gpu/command_buffer/client/implementation_base.h" @@ -29,7 +30,6 @@ #include "gpu/command_buffer/common/constants.h" #include "gpu/ipc/client/command_buffer_proxy_impl.h" #include "gpu/ipc/client/gpu_channel_host.h" -#include "gpu/skia_bindings/gles2_implementation_with_grcontext_support.h" #include "gpu/skia_bindings/grcontext_for_gles2_interface.h" #include "services/ui/public/cpp/gpu/command_buffer_metrics.h" #include "third_party/skia/include/core/SkTraceMemoryDump.h" @@ -144,7 +144,6 @@ const GURL& active_url, bool automatic_flushes, bool support_locking, - bool support_grcontext, const gpu::SharedMemoryLimits& memory_limits, const gpu::ContextCreationAttribs& attributes, ContextProviderCommandBuffer* shared_context_provider, @@ -155,7 +154,6 @@ active_url_(active_url), automatic_flushes_(automatic_flushes), support_locking_(support_locking), - support_grcontext_(support_grcontext), memory_limits_(memory_limits), attributes_(attributes), context_type_(type), @@ -268,7 +266,6 @@ if (attributes_.enable_raster_decoder) { DCHECK(attributes_.enable_raster_interface); DCHECK(!attributes_.enable_gles2_interface); - DCHECK(!support_grcontext_); // The raster helper writes the command buffer protocol. auto raster_helper = std::make_unique<gpu::raster::RasterCmdHelper>(command_buffer_.get()); @@ -319,22 +316,12 @@ // The GLES2Implementation exposes the OpenGLES2 API, as well as the // gpu::ContextSupport interface. constexpr bool support_client_side_arrays = false; - if (support_grcontext_) { - // GLES2ImplementationWithGrContextSupport adds a bit of overhead, so - // we only use it if grcontext_support was requested. - gles2_impl_ = std::make_unique< - skia_bindings::GLES2ImplementationWithGrContextSupport>( - gles2_helper.get(), share_group, transfer_buffer_.get(), - attributes_.bind_generates_resource, - attributes_.lose_context_when_out_of_memory, - support_client_side_arrays, command_buffer_.get()); - } else { - gles2_impl_ = std::make_unique<gpu::gles2::GLES2Implementation>( - gles2_helper.get(), share_group, transfer_buffer_.get(), - attributes_.bind_generates_resource, - attributes_.lose_context_when_out_of_memory, - support_client_side_arrays, command_buffer_.get()); - } + gles2_impl_ = std::make_unique<gpu::gles2::GLES2Implementation>( + gles2_helper.get(), share_group, transfer_buffer_.get(), + attributes_.bind_generates_resource, + attributes_.lose_context_when_out_of_memory, + support_client_side_arrays, command_buffer_.get()); + bind_result_ = gles2_impl_->Initialize(memory_limits_); if (bind_result_ != gpu::ContextResult::kSuccess) { DLOG(ERROR) << "Failed to initialize GLES2Implementation."; @@ -466,8 +453,6 @@ class GrContext* ContextProviderCommandBuffer::GrContext() { DCHECK(bind_tried_); DCHECK_EQ(bind_result_, gpu::ContextResult::kSuccess); - DCHECK(support_grcontext_); - DCHECK(ContextSupport()->HasGrContextSupport()); CheckValidThreadOrLockAcquired(); if (gr_context_) @@ -485,7 +470,6 @@ skia_bindings::GrContextForGLES2Interface:: DetermineCacheLimitsFromAvailableMemory(&max_resource_cache_bytes, &max_glyph_cache_texture_bytes); - gpu::gles2::GLES2Interface* gl_interface; if (trace_impl_) gl_interface = trace_impl_.get(); @@ -493,8 +477,8 @@ gl_interface = gles2_impl_.get(); gr_context_.reset(new skia_bindings::GrContextForGLES2Interface( - gl_interface, ContextSupport(), ContextCapabilities(), - max_resource_cache_bytes, max_glyph_cache_texture_bytes)); + gl_interface, ContextCapabilities(), max_resource_cache_bytes, + max_glyph_cache_texture_bytes)); cache_controller_->SetGrContext(gr_context_->get()); // If GlContext is already lost, also abandon the new GrContext. @@ -510,6 +494,15 @@ return cache_controller_.get(); } +void ContextProviderCommandBuffer::InvalidateGrContext(uint32_t state) { + if (gr_context_) { + DCHECK(bind_tried_); + DCHECK_EQ(bind_result_, gpu::ContextResult::kSuccess); + CheckValidThreadOrLockAcquired(); + gr_context_->ResetContext(state); + } +} + void ContextProviderCommandBuffer::SetDefaultTaskRunner( scoped_refptr<base::SingleThreadTaskRunner> default_task_runner) { DCHECK(!bind_tried_);
diff --git a/services/ui/public/cpp/gpu/context_provider_command_buffer.h b/services/ui/public/cpp/gpu/context_provider_command_buffer.h index b83e581c..49bd3de5 100644 --- a/services/ui/public/cpp/gpu/context_provider_command_buffer.h +++ b/services/ui/public/cpp/gpu/context_provider_command_buffer.h
@@ -66,7 +66,6 @@ const GURL& active_url, bool automatic_flushes, bool support_locking, - bool support_grcontext, const gpu::SharedMemoryLimits& memory_limits, const gpu::ContextCreationAttribs& attributes, ContextProviderCommandBuffer* shared_context_provider, @@ -86,6 +85,7 @@ gpu::ContextSupport* ContextSupport() override; class GrContext* GrContext() override; viz::ContextCacheController* CacheController() override; + void InvalidateGrContext(uint32_t state) override; base::Lock* GetLock() override; const gpu::Capabilities& ContextCapabilities() const override; const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override; @@ -141,7 +141,6 @@ const GURL active_url_; const bool automatic_flushes_; const bool support_locking_; - const bool support_grcontext_; const gpu::SharedMemoryLimits memory_limits_; const gpu::ContextCreationAttribs attributes_; const command_buffer_metrics::ContextType context_type_;
diff --git a/services/ui/public/cpp/gpu/gpu.cc b/services/ui/public/cpp/gpu/gpu.cc index b5757f21..3b7e40e 100644 --- a/services/ui/public/cpp/gpu/gpu.cc +++ b/services/ui/public/cpp/gpu/gpu.cc
@@ -282,7 +282,6 @@ constexpr bool automatic_flushes = false; constexpr bool support_locking = false; - constexpr bool support_grcontext = false; gpu::ContextCreationAttribs attributes; attributes.alpha_size = -1; @@ -297,7 +296,7 @@ std::move(gpu_channel), GetGpuMemoryBufferManager(), stream_id, stream_priority, gpu::kNullSurfaceHandle, GURL("chrome://gpu/MusContextFactory"), automatic_flushes, - support_locking, support_grcontext, gpu::SharedMemoryLimits(), attributes, + support_locking, gpu::SharedMemoryLimits(), attributes, shared_context_provider, command_buffer_metrics::MUS_CLIENT_CONTEXT); }
diff --git a/services/ui/public/interfaces/ime/BUILD.gn b/services/ui/public/interfaces/ime/BUILD.gn index 457116a..af735c6 100644 --- a/services/ui/public/interfaces/ime/BUILD.gn +++ b/services/ui/public/interfaces/ime/BUILD.gn
@@ -15,7 +15,6 @@ ] public_deps = [ - "//mojo/common:common_custom_types", "//mojo/public/mojom/base", "//ui/events/mojo:interfaces", "//ui/gfx/geometry/mojo",
diff --git a/services/ui/public/interfaces/ime/ime.mojom b/services/ui/public/interfaces/ime/ime.mojom index b4ff0a0..0157f71 100644 --- a/services/ui/public/interfaces/ime/ime.mojom +++ b/services/ui/public/interfaces/ime/ime.mojom
@@ -4,7 +4,7 @@ module ui.mojom; -import "mojo/common/text_direction.mojom"; +import "mojo/public/mojom/base/text_direction.mojom"; import "mojo/public/mojom/base/string16.mojom"; import "ui/events/mojo/event.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; @@ -119,7 +119,7 @@ // Initial details about |client| required by IMEDriver. TextInputType text_input_type; TextInputMode text_input_mode; - mojo.common.mojom.TextDirection text_direction; + mojo_base.mojom.TextDirection text_direction; int32 text_input_flags; gfx.mojom.Rect caret_bounds; };
diff --git a/services/viz/privileged/interfaces/compositing/renderer_settings.mojom b/services/viz/privileged/interfaces/compositing/renderer_settings.mojom index 1465900..1c91fd1 100644 --- a/services/viz/privileged/interfaces/compositing/renderer_settings.mojom +++ b/services/viz/privileged/interfaces/compositing/renderer_settings.mojom
@@ -18,5 +18,6 @@ bool enable_draw_occlusion; int32 slow_down_compositing_scale_factor; bool use_skia_renderer; + bool use_skia_deferred_display_list; bool allow_overlays; };
diff --git a/services/viz/privileged/interfaces/compositing/renderer_settings_struct_traits.cc b/services/viz/privileged/interfaces/compositing/renderer_settings_struct_traits.cc index 16a357bc..63b3f57 100644 --- a/services/viz/privileged/interfaces/compositing/renderer_settings_struct_traits.cc +++ b/services/viz/privileged/interfaces/compositing/renderer_settings_struct_traits.cc
@@ -26,6 +26,7 @@ out->slow_down_compositing_scale_factor = data.slow_down_compositing_scale_factor(); out->use_skia_renderer = data.use_skia_renderer(); + out->use_skia_deferred_display_list = data.use_skia_deferred_display_list(); out->allow_overlays = data.allow_overlays(); return true; }
diff --git a/services/viz/privileged/interfaces/compositing/renderer_settings_struct_traits.h b/services/viz/privileged/interfaces/compositing/renderer_settings_struct_traits.h index e2a739d..3d487406 100644 --- a/services/viz/privileged/interfaces/compositing/renderer_settings_struct_traits.h +++ b/services/viz/privileged/interfaces/compositing/renderer_settings_struct_traits.h
@@ -67,6 +67,11 @@ return input.use_skia_renderer; } + static bool use_skia_deferred_display_list( + const viz::RendererSettings& input) { + return input.use_skia_deferred_display_list; + } + static bool allow_overlays(const viz::RendererSettings& input) { return input.allow_overlays; }
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index cc2a6b35..889c3042b 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -216,6 +216,10 @@ #define GR_AA_TESSELLATOR_MAX_VERB_COUNT 10 +#ifndef SK_SUPPORT_LEGACY_AA_CHOICE +#define SK_SUPPORT_LEGACY_AA_CHOICE +#endif + ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/skia/ext/skia_trace_memory_dump_impl.cc b/skia/ext/skia_trace_memory_dump_impl.cc index ebdec805..a7aa6f7 100644 --- a/skia/ext/skia_trace_memory_dump_impl.cc +++ b/skia/ext/skia_trace_memory_dump_impl.cc
@@ -75,4 +75,10 @@ return request_level_; } +bool SkiaTraceMemoryDumpImpl::shouldDumpWrappedObjects() const { + // Chrome already dumps objects it imports into Skia. Avoid duplicate dumps + // by asking Skia not to dump them. + return false; +} + } // namespace skia
diff --git a/skia/ext/skia_trace_memory_dump_impl.h b/skia/ext/skia_trace_memory_dump_impl.h index 5ab5a2f..fa9baf1 100644 --- a/skia/ext/skia_trace_memory_dump_impl.h +++ b/skia/ext/skia_trace_memory_dump_impl.h
@@ -50,6 +50,7 @@ const char* dumpName, const SkDiscardableMemory& discardableMemoryObject) override; LevelOfDetail getRequestedDetails() const override; + bool shouldDumpWrappedObjects() const override; protected: base::trace_event::ProcessMemoryDump* process_memory_dump() {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 189be79..280b5a6 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -40,7 +40,7 @@ "device_type": "marlin" } ], - "hard_timeout": 960 + "hard_timeout": 1800 }, "test": "chrome_public_test_vr_apk" }, @@ -150,7 +150,7 @@ "device_type": "hammerhead" } ], - "hard_timeout": 960 + "hard_timeout": 1800 }, "test": "chrome_public_test_vr_apk" }, @@ -186,7 +186,7 @@ "device_type": "hammerhead" } ], - "hard_timeout": 960 + "hard_timeout": 1800 }, "test": "chrome_public_test_vr_apk" }, @@ -222,7 +222,7 @@ "device_type": "bullhead" } ], - "hard_timeout": 960 + "hard_timeout": 1800 }, "test": "chrome_public_test_vr_apk" }, @@ -3575,7 +3575,8 @@ "gtest_tests": [ { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.base_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.base_unittests.filter", + "--use-new-test-runner" ], "swarming": { "can_use_on_swarming_builders": true, @@ -3625,8 +3626,7 @@ }, { "args": [ - "--use-new-test-runner", - "-v" + "--use-new-test-runner" ], "swarming": { "can_use_on_swarming_builders": true, @@ -3640,7 +3640,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter", + "--use-new-test-runner" ], "swarming": { "can_use_on_swarming_builders": true, @@ -3653,6 +3654,9 @@ "test": "ipc_tests" }, { + "args": [ + "--use-new-test-runner" + ], "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -3680,7 +3684,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter", + "--use-new-test-runner" ], "swarming": { "can_use_on_swarming_builders": true,
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 6d0b3d9..5890556d0 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -11722,6 +11722,7 @@ "--test-launcher-bot-mode", "--test-launcher-jobs=1", "--gtest_filter=VrBrowserTest*", + "--enable-pixel-output-in-tests", "--gtest_also_run_disabled_tests" ], "name": "vr_browser_tests", @@ -12048,6 +12049,7 @@ "--test-launcher-bot-mode", "--test-launcher-jobs=1", "--gtest_filter=VrBrowserTest*", + "--enable-pixel-output-in-tests", "--gtest_also_run_disabled_tests" ], "name": "vr_browser_tests", @@ -12588,6 +12590,7 @@ "--test-launcher-bot-mode", "--test-launcher-jobs=1", "--gtest_filter=VrBrowserTest*", + "--enable-pixel-output-in-tests", "--gtest_also_run_disabled_tests" ], "name": "vr_browser_tests", @@ -13317,6 +13320,7 @@ "--test-launcher-bot-mode", "--test-launcher-jobs=1", "--gtest_filter=VrBrowserTest*", + "--enable-pixel-output-in-tests", "--gtest_also_run_disabled_tests" ], "name": "vr_browser_tests", @@ -14069,6 +14073,7 @@ "--test-launcher-bot-mode", "--test-launcher-jobs=1", "--gtest_filter=VrBrowserTest*", + "--enable-pixel-output-in-tests", "--gtest_also_run_disabled_tests" ], "name": "vr_browser_tests",
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json index 0f5763e..31f2a2b 100644 --- a/testing/buildbot/chromium.gpu.json +++ b/testing/buildbot/chromium.gpu.json
@@ -2439,6 +2439,7 @@ "--test-launcher-bot-mode", "--test-launcher-jobs=1", "--gtest_filter=VrBrowserTest*", + "--enable-pixel-output-in-tests", "--gtest_also_run_disabled_tests" ], "name": "vr_browser_tests", @@ -2876,6 +2877,7 @@ "--test-launcher-bot-mode", "--test-launcher-jobs=1", "--gtest_filter=VrBrowserTest*", + "--enable-pixel-output-in-tests", "--gtest_also_run_disabled_tests" ], "name": "vr_browser_tests",
diff --git a/testing/buildbot/chromium.lkgr.json b/testing/buildbot/chromium.lkgr.json index 37468f0..2f27f02 100644 --- a/testing/buildbot/chromium.lkgr.json +++ b/testing/buildbot/chromium.lkgr.json
@@ -90,10 +90,5 @@ "additional_compile_targets": [ "chromium_builder_asan" ] - }, - "Win SyzyASAN LKGR": { - "additional_compile_targets": [ - "chromium_builder_asan" - ] } }
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 6323a2e4..3e60dd76 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -1642,7 +1642,8 @@ }, { "swarming": { - "can_use_on_swarming_builders": true + "can_use_on_swarming_builders": true, + "shards": 4 }, "test": "content_browsertests" },
diff --git a/testing/buildbot/filters/mash.browser_tests.filter b/testing/buildbot/filters/mash.browser_tests.filter index 2d3757d..2811cb0b 100644 --- a/testing/buildbot/filters/mash.browser_tests.filter +++ b/testing/buildbot/filters/mash.browser_tests.filter
@@ -283,4 +283,6 @@ -MediaRouterIntegrationOneUABrowserTest.* -MediaRouterIntegrationOneUANoReceiverBrowserTest.* - +# Segfaults after massive recursion setting ash::kWindowStateTypeKey: +# crbug.com/824458 +-PresentationReceiverWindowViewBrowserTest.ChromeOSHardwareFullscreenButton
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index c032260..9ff52d2 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -187,6 +187,11 @@ }, }, # chromium.fyi + 'Fuchsia': { + 'args': [ + '--use-new-test-runner', + ], + }, 'Out of Process Profiling Mac': { 'swarming': { 'shards': 5, @@ -1165,6 +1170,12 @@ 'shards': 4, }, }, + 'Linux Chromium OS ASan LSan Tests (1)': { + # content_browsertests is slow on ASAN try bot. crbug.com/822461. + 'swarming': { + 'shards': 4, + } + }, 'Mac ASan 64 Tests (1)': { 'swarming': { 'shards': 2, @@ -1448,7 +1459,6 @@ 'Fuchsia': { 'args': [ '--use-new-test-runner', - '-v', # Useful for getting debug info and SCP throughput stats. ], }, }, @@ -2058,6 +2068,12 @@ '600', ], }, + # chromium.fyi + 'Fuchsia': { + 'args': [ + '--use-new-test-runner', + ], + }, }, }, 'jingle_unittests': { @@ -2233,6 +2249,14 @@ # chromium.fyi 'Fuchsia ARM64', ], + 'modifications': { + # chromium.fyi + 'Fuchsia': { + 'args': [ + '--use-new-test-runner', + ], + }, + }, }, 'message_center_unittests': { 'remove_from': [ @@ -2394,6 +2418,16 @@ }, }, }, + 'mojo_unittests': { + 'modifications': { + # chromium.fyi + 'Fuchsia': { + 'args': [ + '--use-new-test-runner', + ], + }, + }, + }, 'nacl_helper_nonsfi_unittests': { 'remove_from': [ # chromium.clang
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index f661656..0eb31e0a 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -58,7 +58,7 @@ 'device_type': 'hammerhead', }, ], - 'hard_timeout': 960, + 'hard_timeout': 1800, }, 'test': 'chrome_public_test_vr_apk', }, @@ -74,7 +74,7 @@ 'device_type': 'hammerhead', }, ], - 'hard_timeout': 960, + 'hard_timeout': 1800, }, 'test': 'chrome_public_test_vr_apk', }, @@ -90,7 +90,7 @@ 'device_type': 'bullhead', }, ], - 'hard_timeout': 960, + 'hard_timeout': 1800, }, 'test': 'chrome_public_test_vr_apk', }, @@ -106,7 +106,7 @@ 'device_type': 'marlin', }, ], - 'hard_timeout': 960, + 'hard_timeout': 1800, }, 'test': 'chrome_public_test_vr_apk', },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 104f6bee..26a8272d 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1606,11 +1606,6 @@ 'chromium_builder_asan', ], }, - 'Win SyzyASAN LKGR': { - 'additional_compile_targets': [ - 'chromium_builder_asan', - ], - }, }, }, {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 5b9fa970..c2acffa8 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1154,26 +1154,6 @@ ] } ], - "DisallowFetchForDocWrittenScriptsInMainFrame": [ - { - "platforms": [ - "android", - "chromeos", - "linux", - "mac", - "win" - ], - "experiments": [ - { - "name": "DocumentWriteScriptBlockGroup_20161208_Launch", - "params": { - "disallowFetchForDocWrittenScriptsInMainFrame": "false", - "disallowFetchForDocWrittenScriptsInMainFrameOnSlowConnections": "true" - } - } - ] - } - ], "DownloadHomeMoreButton": [ { "platforms": [
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index 7b21d31..d5c4807 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -1141,7 +1141,6 @@ crbug.com/591099 fast/borders/inline-mask-overlay-image-outset.html [ Failure ] crbug.com/591099 fast/borders/inline-mask-overlay-image.html [ Failure ] crbug.com/591099 fast/borders/outline-alpha-inline.html [ Failure ] -crbug.com/591099 fast/borders/rtl-border-05.html [ Failure ] crbug.com/714962 fast/borders/table-borders.html [ Failure ] crbug.com/591099 fast/box-decoration-break/box-decoration-break-rendering.html [ Failure ] crbug.com/591099 fast/box-shadow/basic-shadows.html [ Failure ] @@ -1388,7 +1387,6 @@ crbug.com/714962 fast/dom/empty-anchor-in-overflow-scroller.html [ Failure ] crbug.com/714962 fast/dom/inert/inert-inlines.html [ Failure ] crbug.com/591099 fast/dom/inner-text-first-letter.html [ Failure ] -crbug.com/591099 fast/dom/inner-text.html [ Failure ] crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-basic.html [ Failure ] crbug.com/714962 fast/dom/nodesFromRect/nodesFromRect-culled-inline-with-linebreak.html [ Failure ] crbug.com/714962 fast/dom/nodesFromRect/nodesFromRect-culled-inlines.html [ Failure ] @@ -1461,7 +1459,6 @@ crbug.com/591099 fast/gradients/list-item-gradient.html [ Failure ] crbug.com/591099 fast/gradients/radial-centered.html [ Failure ] crbug.com/591099 fast/gradients/unprefixed-list-item-gradient.html [ Failure ] -crbug.com/591099 fast/hidpi/broken-image-icon-hidpi.html [ Failure ] crbug.com/591099 fast/hidpi/image-set-list-style-image.html [ Failure ] crbug.com/591099 fast/hidpi/image-set-shape-outside.html [ Failure ] crbug.com/591099 fast/history/visited-link-hover-outline-color.html [ Failure ] @@ -1602,7 +1599,6 @@ crbug.com/591099 fast/multicol/dynamic/remove-spanner-in-content.html [ Failure ] crbug.com/591099 fast/multicol/dynamic/spanner-after-content-becomes-regular-block.html [ Failure ] crbug.com/591099 fast/multicol/dynamic/spanner-ancestor-becomes-spanner.html [ Failure ] -crbug.com/591099 fast/multicol/dynamic/spanner-becomes-float.html [ Failure ] crbug.com/591099 fast/multicol/dynamic/spanner-becomes-regular-block.html [ Failure ] crbug.com/591099 fast/multicol/dynamic/spanner-before-content-becomes-regular-block.html [ Failure ] crbug.com/591099 fast/multicol/dynamic/spanner-in-content-becomes-regular-block.html [ Failure ] @@ -2539,7 +2535,6 @@ crbug.com/591099 netinfo/estimate-multiple-frames.html [ Failure Pass ] crbug.com/591099 overflow/overflow-basic-002.html [ Pass ] crbug.com/591099 overflow/overflow-position-003.html [ Failure ] -crbug.com/714962 paint/inline/floating-inline.html [ Crash ] crbug.com/591099 paint/inline/focus-ring-under-absolute-with-relative-continuation.html [ Failure ] crbug.com/591099 paint/invalidation/4776765.html [ Failure ] crbug.com/591099 paint/invalidation/background/backgroundSizeRepaint.html [ Failure ] @@ -3002,7 +2997,6 @@ crbug.com/591099 tables/mozilla/bugs/bug23235.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug2479-3.html [ Failure ] crbug.com/714962 tables/mozilla/bugs/bug2479-4.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug26553.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug27038-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug2886-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug2962.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/MSANExpectations b/third_party/WebKit/LayoutTests/MSANExpectations index 52ec24d1..68ed6af5 100644 --- a/third_party/WebKit/LayoutTests/MSANExpectations +++ b/third_party/WebKit/LayoutTests/MSANExpectations
@@ -90,6 +90,7 @@ # Timing out consistenly on WebKit Linux Trusty MSAN crbug.com/798957 [ Linux ] http/tests/devtools/audits2/audits2-limited-run.js [ Skip ] crbug.com/798957 [ Linux ] http/tests/devtools/audits2/audits2-successful-run.js [ Skip ] +crbug.com/824455 [ Linux ] external/wpt/webaudio/idlharness.https.html [ Skip ] # Memory allocation hooks are disabled on ASAN/MSAN crbug.com/803276 inspector-protocol/memory/sampling-native-profile.js [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index 413bbcf..10ca6303 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -150548,6 +150548,11 @@ {} ] ], + "interfaces/webvtt.idl": [ + [ + {} + ] + ], "interfaces/webxr.idl": [ [ {} @@ -346923,7 +346928,7 @@ "support" ], "interfaces/storage.idl": [ - "fe2e879ca5662f3b1714404734fd033faf3268ec", + "7c3221be9fdf6be4965cf5aeca2063f93c2110d6", "support" ], "interfaces/touchevents.idl": [ @@ -346970,6 +346975,10 @@ "7b5749e1fece69552e0a8bfac7af401fac15394d", "support" ], + "interfaces/webvtt.idl": [ + "3e7ab31795b8339de3d6904f0d68dab68ca24148", + "support" + ], "interfaces/webxr.idl": [ "b1bbaa67765ce6eb20c39e6f2234912e4853e148", "support" @@ -376771,11 +376780,11 @@ "testharness" ], "webvtt/api/interfaces-expected.txt": [ - "503e97fd03cc6de1a1ea581f7926739037162a9f", + "ebae03a9d2159f3449a8a81ababf876d1c3f9fb4", "support" ], "webvtt/api/interfaces.html": [ - "3b4f42db6f608d1e89d2a3fab575e05da8a3d005", + "4e54c4fd00214446cfc392f30ab85edf22b3aece", "testharness" ], "webvtt/categories.json": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-scroll-snap/scroll-snap-type-proximity.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-scroll-snap/scroll-snap-type-proximity.html new file mode 100644 index 0000000..cfe990c --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-scroll-snap/scroll-snap-type-proximity.html
@@ -0,0 +1,80 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> +div { + position: absolute; + margin: 0px; +} +#scroller { + height: 400px; + width: 400px; + overflow: scroll; +} +#space { + width: 2000px; + height: 2000px; +} + +.snap { + width: 200px; + height: 200px; + background-color: blue; + scroll-snap-align: start; +} +#left-top { + left: 0px; + top: 0px; +} +#right-bottom { + left: 1000px; + top: 1000px; +} +</style> + +<div id="scroller"> + <div id="space"></div> + <div class="snap" id="left-top"></div> + <div class="snap" id="right-bottom"></div> +</div> + +<script> +var scroller = document.getElementById("scroller"); +var visible_x = 1000 - scroller.clientWidth; +var visible_y = 1000 - scroller.clientHeight; + +test(() => { + scroller.style.scrollSnapType = "both mandatory"; + scroller.scrollTo(0, 0); + assert_equals(scroller.scrollLeft, 0); + assert_equals(scroller.scrollTop, 0); + + scroller.scrollTo(visible_x + 10, visible_y + 10); + assert_equals(scroller.scrollLeft, 1000); + assert_equals(scroller.scrollTop, 1000); +}, "mandatory scroll-snap-type should snap as long as the element is visible."); + +test(() => { + scroller.style.scrollSnapType = "both proximity"; + scroller.scrollTo(0, 0); + assert_equals(scroller.scrollLeft, 0); + assert_equals(scroller.scrollTop, 0); + + scroller.scrollTo(visible_x + 10, visible_y + 10); + assert_equals(scroller.scrollLeft, visible_x + 10); + assert_equals(scroller.scrollTop, visible_y + 10); +}, "proximity scroll-snap-type shouldn't snap if the snap position is too far away."); + +test(() => { + scroller.style.scrollSnapType = "both proximity"; + scroller.scrollTo(0, 0); + assert_equals(scroller.scrollLeft, 0); + assert_equals(scroller.scrollTop, 0); + + scroller.scrollTo(995, 995); + assert_equals(scroller.scrollLeft, 1000); + assert_equals(scroller.scrollTop, 1000); +}, "proximity scroll-snap-type should snap if the snap position is close."); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-consume.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-consume.html index 24d127f..4946a4d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-consume.html +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-consume.html
@@ -31,6 +31,13 @@ }); } + function blobToTypeViaFetch(blob) { + var url = URL.createObjectURL(blob); + return fetch(url).then(function(response) { + return response.headers.get('Content-Type'); + }); + } + function responsePromise(body, responseInit) { return new Promise(function(resolve, reject) { resolve(new Response(body, responseInit)); @@ -75,15 +82,18 @@ return response.blob().then(function(bodyAsBlob) { assert_equals(bodyAsBlob.type, expectedType || "text/plain", "Blob body type should be computed from the response Content-Type"); - var promise = new Promise( function (resolve, reject) { - var reader = new FileReader(); - reader.onload = function(evt) { - resolve(reader.result) - }; - reader.onerror = function () { - reject("Blob's reader failed"); - }; - reader.readAsText(bodyAsBlob); + var promise = blobToTypeViaFetch(bodyAsBlob).then(function(type) { + assert_equals(type, expectedType || "text/plain", 'Type via blob URL'); + return new Promise( function (resolve, reject) { + var reader = new FileReader(); + reader.onload = function(evt) { + resolve(reader.result) + }; + reader.onerror = function () { + reject("Blob's reader failed"); + }; + reader.readAsText(bodyAsBlob); + }); }); return promise.then(function(body) { assert_equals(body, expectedBody, "Retrieve and verify response's body");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/storage.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/storage.idl index c4569035..cbaf9d0c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/storage.idl +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/storage.idl
@@ -1,3 +1,7 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content of this file was automatically extracted from the Storage spec. +// See https://storage.spec.whatwg.org/ + [SecureContext] interface mixin NavigatorStorage { readonly attribute StorageManager storage;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webvtt.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webvtt.idl new file mode 100644 index 0000000..d4603d1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webvtt.idl
@@ -0,0 +1,39 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content of this file was automatically extracted from the WebVTT spec. +// See https://w3c.github.io/webvtt/ + +enum AutoKeyword { "auto" }; +typedef (double or AutoKeyword) LineAndPositionSetting; +enum DirectionSetting { "" /* horizontal */, "rl", "lr" }; +enum LineAlignSetting { "start", "center", "end" }; +enum PositionAlignSetting { "line-left", "center", "line-right", "auto" }; +enum AlignSetting { "start", "center", "end", "left", "right" }; +[Exposed=Window, + Constructor(double startTime, double endTime, DOMString text)] +interface VTTCue : TextTrackCue { + attribute VTTRegion? region; + attribute DirectionSetting vertical; + attribute boolean snapToLines; + attribute LineAndPositionSetting line; + attribute LineAlignSetting lineAlign; + attribute LineAndPositionSetting position; + attribute PositionAlignSetting positionAlign; + attribute double size; + attribute AlignSetting align; + attribute DOMString text; + DocumentFragment getCueAsHTML(); +}; + +enum ScrollSetting { "" /* none */, "up" }; +[Exposed=Window, + Constructor] +interface VTTRegion { + attribute DOMString id; + attribute double width; + attribute unsigned long lines; + attribute double regionAnchorX; + attribute double regionAnchorY; + attribute double viewportAnchorX; + attribute double viewportAnchorY; + attribute ScrollSetting scroll; +};
diff --git a/third_party/WebKit/LayoutTests/http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/resource_TAO_cross_origin_redirect_chain.html similarity index 68% rename from third_party/WebKit/LayoutTests/http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html rename to third_party/WebKit/LayoutTests/external/wpt/resource-timing/resource_TAO_cross_origin_redirect_chain.html index f4cab26..af3d31e 100644 --- a/third_party/WebKit/LayoutTests/http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html +++ b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/resource_TAO_cross_origin_redirect_chain.html
@@ -5,16 +5,16 @@ <title>This test validates resource timing information for a timing allowed cross-origin redirect chain.</title> <link rel="author" title="Intel" href="http://www.intel.com/" /> <link rel="help" href="http://www.w3.org/TR/resource-timing/#performanceresourcetiming"/> -<script src="/w3c/resources/testharness.js"></script> -<script src="/w3c/resources/testharnessreport.js"></script> -<script src="/w3c/webperf/resources/webperftestharness.js"></script> -<script src="/w3c/webperf/resources/webperftestharnessextension.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webperftestharness.js"></script> +<script src="resources/webperftestharnessextension.js"></script> <script> setup({explicit_done: true}); test_namespace('getEntriesByName'); - const pageOrigin = '127.0.0.1:8000'; - const crossOrigin = 'localhost:8000'; + const pageOrigin = document.location.host; + const crossOrigin = 'www.' + pageOrigin; function onload_test() { @@ -35,12 +35,10 @@ <body> <iframe id="frameContext" src="" style="width: 250px; height: 250px;"></iframe> <script> - test_equals(document.location.host, pageOrigin, 'Starting document.location.hostname is correct (' + pageOrigin + ')'); - - let destUrl = 'http://' + crossOrigin + '/w3c/webperf/resources/multi_redirect.php?'; - destUrl += 'pageOrigin=' + 'http://' + pageOrigin; - destUrl += '&crossOrigin=' + 'http://' + crossOrigin; - destUrl += '&timingAllow=1'; + let destUrl = 'http://' + crossOrigin + '/resource-timing/resources/multi_redirect.py?'; + destUrl += 'page_origin=' + 'http://' + pageOrigin; + destUrl += '&cross_origin=' + 'http://' + crossOrigin; + destUrl += '&timing_allow=1'; const frameContext = document.getElementById('frameContext'); frameContext.onload = onload_test; frameContext.src = destUrl;
diff --git a/third_party/WebKit/LayoutTests/http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/resource_timing_cross_origin_redirect_chain.html similarity index 66% rename from third_party/WebKit/LayoutTests/http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html rename to third_party/WebKit/LayoutTests/external/wpt/resource-timing/resource_timing_cross_origin_redirect_chain.html index a81f734..2a7b2f7 100644 --- a/third_party/WebKit/LayoutTests/http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html +++ b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/resource_timing_cross_origin_redirect_chain.html
@@ -5,16 +5,16 @@ <title>This test validates resource timing information for a cross-origin redirect chain.</title> <link rel="author" title="Intel" href="http://www.intel.com/" /> <link rel="help" href="http://www.w3.org/TR/resource-timing/#performanceresourcetiming"/> -<script src="/w3c/resources/testharness.js"></script> -<script src="/w3c/resources/testharnessreport.js"></script> -<script src="/w3c/webperf/resources/webperftestharness.js"></script> -<script src="/w3c/webperf/resources/webperftestharnessextension.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webperftestharness.js"></script> +<script src="resources/webperftestharnessextension.js"></script> <script> setup({explicit_done: true}); test_namespace('getEntriesByName'); - const pageOrigin = '127.0.0.1:8000'; - const crossOrigin = 'localhost:8000'; + const pageOrigin = document.location.host; + const crossOrigin = 'www.' + pageOrigin; function onload_test() { @@ -35,12 +35,9 @@ <body> <iframe id="frameContext" src="" style="width: 250px; height: 250px;"></iframe> <script> - test_equals(document.location.host, pageOrigin, 'Starting document.location.hostname is correct (' + pageOrigin + ')'); - - let destUrl = 'http://' + crossOrigin + '/w3c/webperf/resources/multi_redirect.php?'; - destUrl += 'pageOrigin=' + 'http://' + pageOrigin; - destUrl += '&crossOrigin=' + 'http://' + crossOrigin; - destUrl += '&timingAllow=0'; + let destUrl = 'http://' + crossOrigin + '/resource-timing/resources/multi_redirect.py?'; + destUrl += 'page_origin=' + 'http://' + pageOrigin; + destUrl += '&cross_origin=' + 'http://' + crossOrigin; const frameContext = document.getElementById('frameContext'); frameContext.onload = onload_test; frameContext.src = destUrl;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resource-timing/resources/multi_redirect.py b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/resources/multi_redirect.py new file mode 100644 index 0000000..d1802a1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/resources/multi_redirect.py
@@ -0,0 +1,40 @@ +def main(request, response): + """Handler that causes multiple redirections. + The request has two mandatory and one optional query parameters: + page_origin - The page origin, used for redirection and to set TAO. This is a mandatory parameter. + cross_origin - The cross origin used to make this a cross-origin redirect. This is a mandatory parameter. + timing_allow - Whether TAO should be set or not in the redirect chain. This is an optional parameter. Default: not set. + Note that |step| is a parameter used internally for the multi-redirect. It's the step we're at in the redirect chain. + """ + step = 1 + if "step" in request.GET: + try: + step = int(request.GET.first("step")) + except ValueError: + pass + + page_origin = request.GET.first("page_origin") + cross_origin = request.GET.first("cross_origin") + timing_allow = "0" + if "timing_allow" in request.GET: + timing_allow = request.GET.first("timing_allow") + + redirect_url = "/resource-timing/resources/multi_redirect.py?" + redirect_url += "page_origin=" + page_origin + redirect_url += "&cross_origin=" + cross_origin + redirect_url += "&timing_allow=" + timing_allow + redirect_url += "&step=" + + if step == 1: + redirect_url = cross_origin + redirect_url + "2" + if timing_allow != "0": + response.headers.set("timing-allow-origin", page_origin) + elif step == 2: + redirect_url = page_origin + redirect_url + "3" + if timing_allow != "0": + response.headers.set("timing-allow-origin", page_origin) + else: + redirect_url = page_origin + "/resource-timing/resources/blank_page_green.htm" + + response.status = 302 + response.headers.set("Location", redirect_url)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt index 045bd48..18f59f7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt
@@ -5,5 +5,6 @@ FAIL insertDTMF() should throw InvalidStateError if transceiver.currentDirection is recvonly pc.addTransceiver is not a function FAIL insertDTMF() should throw InvalidStateError if transceiver.currentDirection is inactive pc.addTransceiver is not a function PASS insertDTMF() should set toneBuffer to provided tones normalized, with old tones overridden +PASS insertDTMF() after remove and close should reject Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https.html index e49a79e..383977c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https.html
@@ -162,4 +162,22 @@ }); }, 'insertDTMF() should set toneBuffer to provided tones normalized, with old tones overridden'); + promise_test(t => { + let dtmfSender; + let sender; + let pc = new RTCPeerConnection(); + return getTrackFromUserMedia('audio') + .then(([track, mediaStream]) => { + sender = pc.addTrack(track, mediaStream); + return pc.createOffer(); + }).then(offer => { + pc.setLocalDescription(offer); + dtmfSender = sender.dtmf; + pc.removeTrack(sender); + pc.close(); + assert_throws('InvalidStateError', () => + dtmfSender.insertDTMF('123')); + }); + }, 'insertDTMF() after remove and close should reject'); + </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt index fc1dd8bd..a3b921c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
@@ -1,5 +1,6 @@ This is a testharness.js-based test. -Found 73 tests; 69 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 74 tests; 70 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS webvtt interfaces. PASS VTTCue interface: existence and properties of interface object PASS VTTCue interface object length PASS VTTCue interface object name
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces.html b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces.html index 5e112da..5222256d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces.html
@@ -116,53 +116,23 @@ }; </script> -<script type=text/plain id=tested> -enum AutoKeyword { "auto" }; -typedef (double or AutoKeyword) LineAndPositionSetting; -enum DirectionSetting { "" /* horizontal */, "rl", "lr" }; -enum LineAlignSetting { "start", "center", "end" }; -enum PositionAlignSetting { "line-left", "center", "line-right", "auto" }; -enum AlignSetting { "start", "center", "end", "left", "right" }; -[Exposed=Window, - Constructor(double startTime, double endTime, DOMString text)] -interface VTTCue : TextTrackCue { - attribute VTTRegion? region; - attribute DirectionSetting vertical; - attribute boolean snapToLines; - attribute LineAndPositionSetting line; - attribute LineAlignSetting lineAlign; - attribute LineAndPositionSetting position; - attribute PositionAlignSetting positionAlign; - attribute double size; - attribute AlignSetting align; - attribute DOMString text; - DocumentFragment getCueAsHTML(); -}; - -enum ScrollSetting { "" /* none */, "up" }; -[Exposed=Window, - Constructor] -interface VTTRegion { - attribute DOMString id; - attribute double width; - attribute long lines; - attribute double regionAnchorX; - attribute double regionAnchorY; - attribute double viewportAnchorX; - attribute double viewportAnchorY; - attribute ScrollSetting scroll; -}; -</script> <script> "use strict"; -setup(function() { + +// https://w3c.github.io/webvtt/ + +promise_test(async () => { + const webvttIDL = await fetch('/interfaces/webvtt.idl').then(response => + response.text(), + ); var idlArray = new IdlArray(); - idlArray.add_untested_idls(document.getElementById("untested").textContent); - idlArray.add_idls(document.getElementById("tested").textContent); + idlArray.add_untested_idls(document.getElementById('untested').textContent); + idlArray.add_idls(webvttIDL); idlArray.add_objects({ VTTCue: ['new VTTCue(0, 0, "")'], VTTRegion: ['new VTTRegion()'], }); idlArray.test(); -}); + done(); +}, 'webvtt interfaces.'); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-worker-events-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-worker-events-expected.txt new file mode 100644 index 0000000..665335c --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-worker-events-expected.txt
@@ -0,0 +1,4 @@ +Tests that worker events are properly filtered in timeline. + +Got 2 worker metadata events +
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-worker-events.js b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-worker-events.js new file mode 100644 index 0000000..60a276de --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-worker-events.js
@@ -0,0 +1,37 @@ +// 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. + +(async function() { + TestRunner.addResult(`Tests that worker events are properly filtered in timeline.\n`); + await TestRunner.loadModule('performance_test_runner'); + await TestRunner.showPanel('timeline'); + await TestRunner.evaluateInPagePromise(` + // Save references to the worker objects to make sure they are not GC'ed. + var worker1; + var worker2; + + function startFirstWorker() + { + worker1 = new Worker("resources/worker.js"); + worker1.postMessage(""); + return new Promise((fulfill) => worker1.onmessage = fulfill); + } + + function startSecondWorker() + { + worker2 = new Worker("resources/worker.js"); + worker2.postMessage(""); + return new Promise((fulfill) => worker2.onmessage = fulfill); + } + `); + + await TestRunner.evaluateInPageAsync(`startFirstWorker()`); + await PerformanceTestRunner.invokeAsyncWithTimeline('startSecondWorker'); + + var workerMetadataEventCount = 0; + var allEvents = PerformanceTestRunner.timelineModel().inspectedTargetEvents(); + var workerEvents = allEvents.filter(e => e.name === TimelineModel.TimelineModel.DevToolsMetadataEvent.TracingSessionIdForWorker); + TestRunner.addResult(`Got ${workerEvents.length} worker metadata events`); + TestRunner.completeTest(); +})();
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/worker-events.js b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/worker-events.js index 066f0f99..4453d15d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/worker-events.js +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/worker-events.js
@@ -47,7 +47,6 @@ return; ++workerMetadataEventCount; - TestRunner.assertEquals(PerformanceTestRunner.timelineModel()._sessionId, event.args['data']['sessionId']); TestRunner.addResult('Got DevTools worker metadata event(' + workerMetadataEventCount + '): ' + event.name); } })();
diff --git a/third_party/WebKit/LayoutTests/http/tests/w3c/webperf/resources/multi_redirect.php b/third_party/WebKit/LayoutTests/http/tests/w3c/webperf/resources/multi_redirect.php deleted file mode 100644 index b9468f13..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/w3c/webperf/resources/multi_redirect.php +++ /dev/null
@@ -1,31 +0,0 @@ -<?php - $step = $_GET["step"] ? $_GET["step"] : 1; - $pageOrigin = $_GET["pageOrigin"]; - $crossOrigin = $_GET["crossOrigin"]; - $timingAllow = $_GET["timingAllow"] ? $_GET["timingAllow"] : 0; - $redirectURL = "/w3c/webperf/resources/multi_redirect.php?pageOrigin=$pageOrigin&crossOrigin=$crossOrigin&timingAllow=$timingAllow"; - - switch ($step) { - case 1: - $redirectURL = $crossOrigin . $redirectURL . "&step=2"; - if ($timingAllow != "0") - header("timing-allow-origin: $pageOrigin"); - break; - case 2: - $redirectURL = $pageOrigin . $redirectURL . "&step=3"; - if ($timingAllow != "0") - header("timing-allow-origin: $pageOrigin"); - break; - case 3: - $redirectURL = $pageOrigin . "/w3c/webperf/resources/blank_page_green.htm"; - - break; - default: - break; - } - - header("HTTP/1.1 302"); - header("Location: $redirectURL"); - sleep(1); - exit; -?>
diff --git a/third_party/WebKit/Source/core/fetch/FetchDataLoader.cpp b/third_party/WebKit/Source/core/fetch/FetchDataLoader.cpp index 72ee4a6..fd5118e9 100644 --- a/third_party/WebKit/Source/core/fetch/FetchDataLoader.cpp +++ b/third_party/WebKit/Source/core/fetch/FetchDataLoader.cpp
@@ -44,14 +44,13 @@ if (blob_handle) { DCHECK_NE(UINT64_MAX, blob_handle->size()); if (blob_handle->GetType() != mime_type_) { - mojom::blink::BlobPtr blob_clone = blob_handle->CloneBlobPtr(); - // A new BlobDataHandle is created to override the Blob's type. - // TODO(mek): It might be cleaner to create a new blob (referencing the - // old blob) rather than just a new BlobDataHandle with mime type not - // matching the type of the underlying blob. - client_->DidFetchDataLoadedBlobHandle(BlobDataHandle::Create( - blob_handle->Uuid(), mime_type_, blob_handle->size(), - blob_clone.PassInterface())); + // A new Blob is created to override the Blob's type. + auto blob_size = blob_handle->size(); + auto blob_data = BlobData::Create(); + blob_data->SetContentType(mime_type_); + blob_data->AppendBlob(std::move(blob_handle), 0, blob_size); + client_->DidFetchDataLoadedBlobHandle( + BlobDataHandle::Create(std::move(blob_data), blob_size)); } else { client_->DidFetchDataLoadedBlobHandle(std::move(blob_handle)); }
diff --git a/third_party/WebKit/Source/core/frame/Settings.json5 b/third_party/WebKit/Source/core/frame/Settings.json5 index d1fae93..773e651 100644 --- a/third_party/WebKit/Source/core/frame/Settings.json5 +++ b/third_party/WebKit/Source/core/frame/Settings.json5
@@ -814,7 +814,7 @@ // frame inserted via document.write, for users on slow connections. { name: "disallowFetchForDocWrittenScriptsInMainFrameOnSlowConnections", - initial: false, + initial: true, }, // Whether to disallow network fetches for parser blocking scripts in the main
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp index 77ecceca..05550a1 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp +++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
@@ -216,6 +216,7 @@ parent_frame_task_runner_.Clear(); callback_.Clear(); script_promise_resolver_.Clear(); + image_ = nullptr; } bool CanvasAsyncBlobCreator::EncodeImage(const double& quality) {
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp index 51f2345..3c6ea40 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
@@ -1255,10 +1255,10 @@ } std::unique_ptr<TracedValue> InspectorTracingSessionIdForWorkerEvent::Data( - const String& session_id, + LocalFrame* frame, WorkerThread* worker_thread) { std::unique_ptr<TracedValue> value = TracedValue::Create(); - value->SetString("sessionId", session_id); + value->SetString("frame", IdentifiersFactory::FrameId(frame)); value->SetString("workerId", IdentifiersFactory::IdFromToken( worker_thread->GetDevToolsWorkerToken())); value->SetDouble("workerThreadId", worker_thread->GetPlatformThreadId());
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h index 4108dfa..57cdb17 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h +++ b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h
@@ -449,8 +449,7 @@ } namespace InspectorTracingSessionIdForWorkerEvent { -std::unique_ptr<TracedValue> Data(const String& session_id, - WorkerThread*); +std::unique_ptr<TracedValue> Data(LocalFrame*, WorkerThread*); } namespace InspectorTracingStartedInFrame {
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.cpp index dbdb82a..2cbaef1 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.cpp
@@ -42,7 +42,10 @@ void InspectorTracingAgent::Restore() { state_->getString(TracingAgentState::kSessionId, &session_id_); - EmitMetadataEvents(); + if (IsStarted()) { + instrumenting_agents_->addInspectorTracingAgent(this); + EmitMetadataEvents(); + } } void InspectorTracingAgent::FrameStartedLoading(LocalFrame* frame, @@ -58,7 +61,16 @@ } void InspectorTracingAgent::DidStartWorker(WorkerInspectorProxy* proxy, bool) { - WriteTimelineStartedEventForWorker(proxy->GetWorkerThread()); + // For now we assume this is document. TODO(kinuko): Fix this. + DCHECK(proxy->GetExecutionContext()->IsDocument()); + LocalFrame* frame = ToDocument(proxy->GetExecutionContext())->GetFrame(); + if (proxy->GetWorkerThread() && frame && inspected_frames_->Contains(frame)) { + TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), + "TracingSessionIdForWorker", TRACE_EVENT_SCOPE_THREAD, + "data", + InspectorTracingSessionIdForWorkerEvent::Data( + frame, proxy->GetWorkerThread())); + } } void InspectorTracingAgent::start(Maybe<String> categories, @@ -105,24 +117,8 @@ TRACE_EVENT_SCOPE_THREAD, "data", InspectorTracingStartedInFrame::Data( session_id_, inspected_frames_->Root())); - for (WorkerInspectorProxy* proxy : WorkerInspectorProxy::AllProxies()) { - // For now we assume this is document. TODO(kinuko): Fix this. - DCHECK(proxy->GetExecutionContext()->IsDocument()); - Document* document = ToDocument(proxy->GetExecutionContext()); - if (proxy->GetWorkerThread() && document->GetFrame() && - inspected_frames_->Contains(document->GetFrame())) { - WriteTimelineStartedEventForWorker(proxy->GetWorkerThread()); - } - } -} - -void InspectorTracingAgent::WriteTimelineStartedEventForWorker( - WorkerThread* worker_thread) { - TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), - "TracingSessionIdForWorker", TRACE_EVENT_SCOPE_THREAD, - "data", - InspectorTracingSessionIdForWorkerEvent::Data( - session_id_, worker_thread)); + for (WorkerInspectorProxy* proxy : WorkerInspectorProxy::AllProxies()) + DidStartWorker(proxy, false); } void InspectorTracingAgent::RootLayerCleared() {
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.h b/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.h index c01fc32d..e82a43a 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.h
@@ -18,7 +18,6 @@ class InspectedFrames; class WorkerInspectorProxy; -class WorkerThread; class CORE_EXPORT InspectorTracingAgent final : public InspectorBaseAgent<protocol::Tracing::Metainfo> { @@ -62,7 +61,6 @@ void EmitMetadataEvents(); void InnerDisable(); bool IsStarted() const; - void WriteTimelineStartedEventForWorker(WorkerThread*); Client* client_; String session_id_;
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc index d4043b30..84f1fb4 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
@@ -959,12 +959,6 @@ std::make_unique<NGExclusionSpace>(*layout_result->ExclusionSpace()); } - // A line-box may have a list of floats which we add as children. - if (child.IsInline() && - (container_builder_.BfcOffset() || ConstraintSpace().FloatsBfcOffset())) { - AddPositionedFloats(layout_result->PositionedFloats()); - } - // We have special behaviour for an empty block which gets pushed down due to // clearance, see comment inside ComputeInflowPosition. bool empty_block_affected_by_clearance = false; @@ -1040,6 +1034,12 @@ std::make_unique<NGExclusionSpace>(*layout_result->ExclusionSpace()); } + // A line-box may have a list of floats which we add as children. + if (child.IsInline() && + (container_builder_.BfcOffset() || ConstraintSpace().FloatsBfcOffset())) { + AddPositionedFloats(layout_result->PositionedFloats()); + } + // We must have an actual fragment at this stage. DCHECK(layout_result->PhysicalFragment()); const auto& physical_fragment = *layout_result->PhysicalFragment();
diff --git a/third_party/WebKit/Source/core/page/scrolling/SnapCoordinator.cpp b/third_party/WebKit/Source/core/page/scrolling/SnapCoordinator.cpp index 7920ff88..57e95ec 100644 --- a/third_party/WebKit/Source/core/page/scrolling/SnapCoordinator.cpp +++ b/third_party/WebKit/Source/core/page/scrolling/SnapCoordinator.cpp
@@ -14,6 +14,11 @@ #include "platform/scroll/ScrollSnapData.h" namespace blink { +namespace { +// This is experimentally determined and corresponds to the UA decided +// parameter as mentioned in spec. +constexpr float kProximityRaio = 1.0 / 3.0; +} // namespace // TODO(sunyunjia): Move the static functions to an anonymous namespace. SnapCoordinator::SnapCoordinator() : snap_container_map_() {} @@ -114,10 +119,51 @@ snap_container_data.set_max_position( gfx::ScrollOffset(max_position.X(), max_position.Y())); + // Scroll-padding represents inward offsets from the corresponding edge of the + // scrollport. https://drafts.csswg.org/css-scroll-snap-1/#scroll-padding + // Scrollport is the visual viewport of the scroll container (through which + // the scrollable overflow region can be viewed) coincides with its padding + // box. https://drafts.csswg.org/css-overflow-3/#scrollport. So we use the + // LayoutRect of the padding box here. The coordinate is relative to the + // container's border box. + LayoutRect container_rect(snap_container.PaddingBoxRect()); + + const ComputedStyle* container_style = snap_container.Style(); + LayoutRectOutsets container_padding( + // The percentage of scroll-padding is different from that of normal + // padding, as scroll-padding resolves the percentage against + // corresponding dimension of the scrollport[1], while the normal padding + // resolves that against "width".[2,3] + // We use MinimumValueForLength here to ensure kAuto is resolved to + // LayoutUnit() which is the correct behavior for padding. + // [1] https://drafts.csswg.org/css-scroll-snap-1/#scroll-padding + // "relative to the corresponding dimension of the scroll container’s + // scrollport" + // [2] https://drafts.csswg.org/css-box/#padding-props + // [3] See for example LayoutBoxModelObject::ComputedCSSPadding where it + // uses |MinimumValueForLength| but against the "width". + MinimumValueForLength(container_style->ScrollPaddingTop(), + container_rect.Height()), + MinimumValueForLength(container_style->ScrollPaddingRight(), + container_rect.Width()), + MinimumValueForLength(container_style->ScrollPaddingBottom(), + container_rect.Height()), + MinimumValueForLength(container_style->ScrollPaddingLeft(), + container_rect.Width())); + container_rect.Contract(container_padding); + + if (snap_container_data.scroll_snap_type().strictness == + SnapStrictness::kProximity) { + LayoutSize size = container_rect.Size(); + size.Scale(kProximityRaio); + gfx::ScrollOffset range(size.Width().ToFloat(), size.Height().ToFloat()); + snap_container_data.set_proximity_range(range); + } + if (SnapAreaSet* snap_areas = snap_container.SnapAreas()) { for (const LayoutBox* snap_area : *snap_areas) { - snap_container_data.AddSnapAreaData( - CalculateSnapAreaData(*snap_area, snap_container, max_position)); + snap_container_data.AddSnapAreaData(CalculateSnapAreaData( + *snap_area, snap_container, container_rect, max_position)); } } snap_container_map_.Set(&snap_container, snap_container_data); @@ -313,78 +359,50 @@ SnapAreaData SnapCoordinator::CalculateSnapAreaData( const LayoutBox& snap_area, const LayoutBox& snap_container, + const LayoutRect& container_rect, const FloatPoint& max_position) { const ComputedStyle* container_style = snap_container.Style(); const ComputedStyle* area_style = snap_area.Style(); SnapAreaData snap_area_data; - // Scroll-padding represents inward offsets from the corresponding edge of the - // scrollport. https://drafts.csswg.org/css-scroll-snap-1/#scroll-padding - // Scrollport is the visual vieport of the scroll container (through which the - // scrollable overflow region can be viewed) coincides with its padding box. - // https://drafts.csswg.org/css-overflow-3/#scrollport - // So we use the LayoutRect of the padding box here. The coordinate is based - // on the container's border box. - LayoutRect container(snap_container.PaddingBoxRect()); - // We assume that the snap_container is the snap_area's ancestor in layout // tree, as the snap_container is found by walking up the layout tree in // FindSnapContainer(). Under this assumption, // snap_area.LocalToAncestorQuad() returns the snap_area's position relative // to its container's border box. And the |area| below represents the // snap_area rect in respect to the snap_container. - LayoutRect area(LayoutPoint(), LayoutSize(snap_area.OffsetWidth(), - snap_area.OffsetHeight())); - area = EnclosingLayoutRect( + LayoutRect area_rect(LayoutPoint(), LayoutSize(snap_area.OffsetWidth(), + snap_area.OffsetHeight())); + area_rect = EnclosingLayoutRect( snap_area - .LocalToAncestorQuad(FloatRect(area), &snap_container, + .LocalToAncestorQuad(FloatRect(area_rect), &snap_container, kUseTransforms | kTraverseDocumentBoundaries) .BoundingBox()); ScrollableArea* scrollable_area = ScrollableAreaForSnapping(snap_container); if (scrollable_area) { if (snap_container.IsLayoutView()) - area = snap_container.GetFrameView()->AbsoluteToDocument(area); + area_rect = snap_container.GetFrameView()->AbsoluteToDocument(area_rect); else - area.MoveBy(LayoutPoint(scrollable_area->ScrollPosition())); + area_rect.MoveBy(LayoutPoint(scrollable_area->ScrollPosition())); } - LayoutRectOutsets container_padding( - // The percentage of scroll-padding is different from that of normal - // padding, as scroll-padding resolves the percentage against - // corresponding dimension of the scrollport[1], while the normal padding - // resolves that against "width".[2,3] - // We use MinimumValueForLength here to ensure kAuto is resolved to - // LayoutUnit() which is the correct behavior for padding. - // [1] https://drafts.csswg.org/css-scroll-snap-1/#scroll-padding - // "relative to the corresponding dimension of the scroll container’s - // scrollport" - // [2] https://drafts.csswg.org/css-box/#padding-props - // [3] See for example LayoutBoxModelObject::ComputedCSSPadding where it - // uses |MinimumValueForLength| but against the "width". - MinimumValueForLength(container_style->ScrollPaddingTop(), - container.Height()), - MinimumValueForLength(container_style->ScrollPaddingRight(), - container.Width()), - MinimumValueForLength(container_style->ScrollPaddingBottom(), - container.Height()), - MinimumValueForLength(container_style->ScrollPaddingLeft(), - container.Width())); LayoutRectOutsets area_margin( area_style->ScrollMarginTop(), area_style->ScrollMarginRight(), area_style->ScrollMarginBottom(), area_style->ScrollMarginLeft()); - container.Contract(container_padding); - area.Expand(area_margin); + area_rect.Expand(area_margin); ScrollSnapAlign align = GetPhysicalAlignment(*area_style, *container_style); - snap_area_data.snap_position.set_x(CalculateSnapPosition( - align.alignment_inline, SearchAxis::kX, container, max_position, area)); - snap_area_data.snap_position.set_y(CalculateSnapPosition( - align.alignment_block, SearchAxis::kY, container, max_position, area)); + snap_area_data.snap_position.set_x( + CalculateSnapPosition(align.alignment_inline, SearchAxis::kX, + container_rect, max_position, area_rect)); + snap_area_data.snap_position.set_y( + CalculateSnapPosition(align.alignment_block, SearchAxis::kY, + container_rect, max_position, area_rect)); snap_area_data.snap_axis = ToSnapAxis(align); - snap_area_data.visible_region = GetVisibleRegion(container, area); + snap_area_data.visible_region = GetVisibleRegion(container_rect, area_rect); snap_area_data.must_snap = (area_style->ScrollSnapStop() == EScrollSnapStop::kAlways);
diff --git a/third_party/WebKit/Source/core/page/scrolling/SnapCoordinator.h b/third_party/WebKit/Source/core/page/scrolling/SnapCoordinator.h index 974a7a0..5b074bf 100644 --- a/third_party/WebKit/Source/core/page/scrolling/SnapCoordinator.h +++ b/third_party/WebKit/Source/core/page/scrolling/SnapCoordinator.h
@@ -45,6 +45,7 @@ // container. SnapAreaData CalculateSnapAreaData(const LayoutBox& snap_area, const LayoutBox& snap_container, + const LayoutRect& area_rect, const FloatPoint& max_position); // Called by LocalFrameView::PerformPostLayoutTasks(), so that the snap data
diff --git a/third_party/WebKit/Source/core/page/scrolling/SnapCoordinatorTest.cpp b/third_party/WebKit/Source/core/page/scrolling/SnapCoordinatorTest.cpp index c7f760dc..8f5bbb5 100644 --- a/third_party/WebKit/Source/core/page/scrolling/SnapCoordinatorTest.cpp +++ b/third_party/WebKit/Source/core/page/scrolling/SnapCoordinatorTest.cpp
@@ -308,6 +308,7 @@ EXPECT_EQ(expected.max_position().x(), actual.max_position().x()); \ EXPECT_EQ(expected.max_position().y(), actual.max_position().y()); \ EXPECT_EQ(expected.scroll_snap_type(), actual.scroll_snap_type()); \ + EXPECT_EQ(expected.proximity_range(), actual.proximity_range()); \ EXPECT_EQ(expected.size(), actual.size()); \ }
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp index edd561d..d1c7909 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -119,11 +119,6 @@ static_assert(sizeof(PaintLayer) == sizeof(SameSizeAsPaintLayer), "PaintLayer should stay small"); -bool IsReferenceClipPath(const ClipPathOperation* clip_operation) { - return clip_operation && - clip_operation->GetType() == ClipPathOperation::REFERENCE; -} - } // namespace using namespace HTMLNames; @@ -191,10 +186,9 @@ const ComputedStyle& style = GetLayoutObject().StyleRef(); if (style.HasFilter()) style.Filter().RemoveClient(*rare_data_->resource_info); - if (IsReferenceClipPath(style.ClipPath())) { - ToReferenceClipPathOperation(style.ClipPath()) - ->RemoveClient(*rare_data_->resource_info); - } + if (auto* reference_clip = + ToReferenceClipPathOperationOrNull(style.ClipPath())) + reference_clip->RemoveClient(*rare_data_->resource_info); rare_data_->resource_info->ClearLayer(); } if (GetLayoutObject().GetFrame()) { @@ -2935,19 +2929,16 @@ void PaintLayer::UpdateClipPath(const ComputedStyle* old_style, const ComputedStyle& new_style) { - ClipPathOperation* new_clip_operation = new_style.ClipPath(); - ClipPathOperation* old_clip_operation = - old_style ? old_style->ClipPath() : nullptr; - if (!new_clip_operation && !old_clip_operation) + ClipPathOperation* new_clip = new_style.ClipPath(); + ClipPathOperation* old_clip = old_style ? old_style->ClipPath() : nullptr; + if (!new_clip && !old_clip) return; const bool had_resource_info = ResourceInfo(); - if (IsReferenceClipPath(new_clip_operation)) { - ToReferenceClipPathOperation(new_clip_operation) - ->AddClient(EnsureResourceInfo()); - } - if (had_resource_info && IsReferenceClipPath(old_clip_operation)) { - ToReferenceClipPathOperation(old_clip_operation) - ->RemoveClient(*ResourceInfo()); + if (auto* reference_clip = ToReferenceClipPathOperationOrNull(new_clip)) + reference_clip->AddClient(EnsureResourceInfo()); + if (had_resource_info) { + if (auto* old_reference_clip = ToReferenceClipPathOperationOrNull(old_clip)) + old_reference_clip->RemoveClient(*ResourceInfo()); } }
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp index e8c23c5..d0944b56 100644 --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
@@ -339,6 +339,7 @@ ALWAYS_INLINE void UpdateCssClip(); ALWAYS_INLINE void UpdateClipPathClip(bool spv1_compositing_specific_pass); ALWAYS_INLINE void UpdateLocalBorderBoxContext(); + ALWAYS_INLINE bool NeedsOverflowControlsClip() const; ALWAYS_INLINE void UpdateOverflowControlsClip(); ALWAYS_INLINE void UpdateInnerBorderRadiusClip(); ALWAYS_INLINE void UpdateOverflowClip(); @@ -1047,11 +1048,11 @@ !IsPrintingRootLayoutView(object); } -static bool NeedsOverflowControlsClip(const LayoutObject& object) { - if (!object.HasOverflowClip()) +bool FragmentPaintPropertyTreeBuilder::NeedsOverflowControlsClip() const { + if (!object_.HasOverflowClip()) return false; - const auto& box = ToLayoutBox(object); + const auto& box = ToLayoutBox(object_); const auto* scrollable_area = box.GetScrollableArea(); IntRect scroll_controls_bounds = scrollable_area->ScrollCornerAndResizerRect(); @@ -1059,8 +1060,10 @@ scroll_controls_bounds.Unite(scrollbar->FrameRect()); if (const auto* scrollbar = scrollable_area->VerticalScrollbar()) scroll_controls_bounds.Unite(scrollbar->FrameRect()); - IntRect conservative_border_box_rect(IntPoint(), FlooredIntSize(box.Size())); - return !conservative_border_box_rect.Contains(scroll_controls_bounds); + auto pixel_snapped_border_box_rect = box.PixelSnappedBorderBoxRect( + ToLayoutSize(context_.current.paint_offset)); + pixel_snapped_border_box_rect.SetLocation(IntPoint()); + return !pixel_snapped_border_box_rect.Contains(scroll_controls_bounds); } static bool NeedsInnerBorderRadiusClip(const LayoutObject& object) { @@ -1101,7 +1104,7 @@ if (!NeedsPaintPropertyUpdate()) return; - if (NeedsOverflowControlsClip(object_)) { + if (NeedsOverflowControlsClip()) { // Clip overflow controls to the border box rect. properties_->UpdateOverflowControlsClip( context_.current.clip, context_.current.transform, @@ -2296,8 +2299,7 @@ NeedsFilter(object_) || NeedsCssClip(object_) || NeedsInnerBorderRadiusClip(object_) || NeedsOverflowClip(object_) || NeedsPerspective(object_) || NeedsSVGLocalToBorderBoxTransform(object_) || - NeedsScrollOrScrollTranslation(object_) || - NeedsOverflowControlsClip(object_); + NeedsScrollOrScrollTranslation(object_); // Need of fragmentation clip will be determined in CreateFragmentContexts(). if (!NeedsFragmentation()) {
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp index 3d2efb2..4b90351 100644 --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
@@ -5113,15 +5113,7 @@ const auto* properties2 = PaintPropertiesForElement("div2"); ASSERT_NE(nullptr, properties2); - EXPECT_NE(nullptr, properties2->OverflowControlsClip()); - const auto* overflow_controls_clip2 = properties2->OverflowControlsClip(); - if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) { - EXPECT_EQ(FloatRect(0, 0, 51, 50), - overflow_controls_clip2->ClipRect().Rect()); - } else { - EXPECT_EQ(FloatRect(0, 0, 50.5, 50), - overflow_controls_clip2->ClipRect().Rect()); - } + EXPECT_EQ(nullptr, properties2->OverflowControlsClip()); } TEST_P(PaintPropertyTreeBuilderTest, FragmentPaintOffsetUnderOverflowScroll) {
diff --git a/third_party/WebKit/Source/core/workers/WorkerThread.h b/third_party/WebKit/Source/core/workers/WorkerThread.h index 53c0d59ca..4936d55 100644 --- a/third_party/WebKit/Source/core/workers/WorkerThread.h +++ b/third_party/WebKit/Source/core/workers/WorkerThread.h
@@ -202,7 +202,11 @@ return nullptr; } - // Can be called on both the main thread and the worker thread. + // Returns a task runner bound to the per-global-scope scheduler's task queue. + // You don't have to care about the lifetime of the associated global scope + // and underlying thread. After the global scope is destroyed, queued tasks + // are discarded and PostTask on the returned task runner just fails. This + // function can be called on both the main thread and the worker thread. scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(TaskType type) { return global_scope_scheduler_->GetTaskRunner(type); }
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn index 647cd17..44d476a6 100644 --- a/third_party/WebKit/Source/devtools/BUILD.gn +++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -497,9 +497,11 @@ "front_end/profiler/HeapSnapshotProxy.js", "front_end/profiler/HeapSnapshotView.js", "front_end/profiler/HeapProfilerPanel.js", + "front_end/profiler/IsolateSelector.js", "front_end/profiler/module.json", "front_end/profiler/ProfileDataGrid.js", "front_end/profiler/ProfileHeader.js", + "front_end/profiler/profileLauncherView.css", "front_end/profiler/ProfileLauncherView.js", "front_end/profiler/ProfileType.js", "front_end/profiler/profilesPanel.css",
diff --git a/third_party/WebKit/Source/devtools/front_end/devtools_compatibility.js b/third_party/WebKit/Source/devtools/front_end/devtools_compatibility.js index 26b08ab4..e4ddb50 100644 --- a/third_party/WebKit/Source/devtools/front_end/devtools_compatibility.js +++ b/third_party/WebKit/Source/devtools/front_end/devtools_compatibility.js
@@ -581,9 +581,13 @@ * @override * @param {number} requestId * @param {string} fileSystemPath + * @param {string} excludedFolders */ - indexPath(requestId, fileSystemPath) { - DevToolsAPI.sendMessageToEmbedder('indexPath', [requestId, fileSystemPath], null); + indexPath(requestId, fileSystemPath, excludedFolders) { + // |excludedFolders| added in M67. For backward compatibility, + // pass empty array. + excludedFolders = excludedFolders || '[]'; + DevToolsAPI.sendMessageToEmbedder('indexPath', [requestId, fileSystemPath, excludedFolders], null); } /**
diff --git a/third_party/WebKit/Source/devtools/front_end/host/InspectorFrontendHost.js b/third_party/WebKit/Source/devtools/front_end/host/InspectorFrontendHost.js index 32c2d51..e45874162 100644 --- a/third_party/WebKit/Source/devtools/front_end/host/InspectorFrontendHost.js +++ b/third_party/WebKit/Source/devtools/front_end/host/InspectorFrontendHost.js
@@ -309,8 +309,9 @@ * @override * @param {number} requestId * @param {string} fileSystemPath + * @param {string} excludedFolders */ - indexPath(requestId, fileSystemPath) { + indexPath(requestId, fileSystemPath, excludedFolders) { } /**
diff --git a/third_party/WebKit/Source/devtools/front_end/host/InspectorFrontendHostAPI.js b/third_party/WebKit/Source/devtools/front_end/host/InspectorFrontendHostAPI.js index caa1d51..6c0bc59 100644 --- a/third_party/WebKit/Source/devtools/front_end/host/InspectorFrontendHostAPI.js +++ b/third_party/WebKit/Source/devtools/front_end/host/InspectorFrontendHostAPI.js
@@ -111,8 +111,9 @@ /** * @param {number} requestId * @param {string} fileSystemPath + * @param {string} excludedFolders */ - indexPath(requestId, fileSystemPath) {}, + indexPath(requestId, fileSystemPath, excludedFolders) {}, /** * @return {string}
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js index 81885d1..d400b7a 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/Main.js +++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -110,6 +110,7 @@ Runtime.experiments.register('colorContrastRatio', 'Color contrast ratio line in color picker', true); Runtime.experiments.register('emptySourceMapAutoStepping', 'Empty sourcemap auto-stepping'); Runtime.experiments.register('inputEventsOnTimelineOverview', 'Input events on Timeline overview', true); + Runtime.experiments.register('memoryLauncherViewV2', 'Memory profile launcher view V2'); Runtime.experiments.register('nativeHeapProfiler', 'Native memory sampling heap profiler', true); Runtime.experiments.register('networkSearch', 'Network search'); Runtime.experiments.register('oopifInlineDOM', 'OOPIF: inline DOM ', true);
diff --git a/third_party/WebKit/Source/devtools/front_end/persistence/IsolatedFileSystem.js b/third_party/WebKit/Source/devtools/front_end/persistence/IsolatedFileSystem.js index 1ad5b9c..c9f1110 100644 --- a/third_party/WebKit/Source/devtools/front_end/persistence/IsolatedFileSystem.js +++ b/third_party/WebKit/Source/devtools/front_end/persistence/IsolatedFileSystem.js
@@ -48,6 +48,8 @@ this._excludedFoldersSetting = Common.settings.createLocalSetting('workspaceExcludedFolders', {}); /** @type {!Set<string>} */ this._excludedFolders = new Set(this._excludedFoldersSetting.get()[path] || []); + /** @type {!Array<string>} */ + this._excludedEmbedderFolders = []; /** @type {!Set<string>} */ this._initialFilePaths = new Set(); @@ -173,8 +175,11 @@ const parentFolder = entry.fullPath.substring(1, lastSlash); this._initialGitFolders.add(parentFolder); } - if (this.isFileExcluded(entry.fullPath + '/')) + if (this.isFileExcluded(entry.fullPath + '/')) { + this._excludedEmbedderFolders.push( + Common.ParsedURL.urlToPlatformPath(this._path + entry.fullPath, Host.isWin())); continue; + } ++pendingRequests; this._requestEntries(entry.fullPath, boundInnerCallback); } @@ -604,7 +609,7 @@ indexContent(progress) { progress.setTotalWork(1); const requestId = this._manager.registerProgress(progress); - InspectorFrontendHost.indexPath(requestId, this._embedderPath); + InspectorFrontendHost.indexPath(requestId, this._embedderPath, JSON.stringify(this._excludedEmbedderFolders)); } };
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/IsolateSelector.js b/third_party/WebKit/Source/devtools/front_end/profiler/IsolateSelector.js new file mode 100644 index 0000000..f0b0b6c --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/profiler/IsolateSelector.js
@@ -0,0 +1,209 @@ +// 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. + +/** + * @implements {SDK.SDKModelObserver<!SDK.RuntimeModel>} + * @implements {UI.ListDelegate<!Profiler.IsolateSelector.ListItem>} + */ +Profiler.IsolateSelector = class extends UI.VBox { + constructor() { + super(true); + + /** @type {!UI.ListModel<!Profiler.IsolateSelector.ListItem>} */ + this._items = new UI.ListModel(); + /** @type {!UI.ListControl<!Profiler.IsolateSelector.ListItem>} */ + this._list = new UI.ListControl(this._items, this, UI.ListMode.NonViewport); + this.contentElement.appendChild(this._list.element); + + this.registerRequiredCSS('profiler/profileLauncherView.css'); + /** @type {!Map<!SDK.RuntimeModel, !Promise<string>>} */ + this._isolateByModel = new Map(); + /** @type {!Map<string, !Profiler.IsolateSelector.ListItem>} */ + this._itemByIsolate = new Map(); + + SDK.targetManager.observeModels(SDK.RuntimeModel, this); + SDK.targetManager.addEventListener(SDK.TargetManager.Events.NameChanged, this._targetChanged, this); + SDK.targetManager.addEventListener(SDK.TargetManager.Events.InspectedURLChanged, this._targetChanged, this); + } + + /** + * @override + * @param {!SDK.RuntimeModel} model + */ + modelAdded(model) { + this._modelAdded(model); + } + + /** + * @param {!SDK.RuntimeModel} model + */ + async _modelAdded(model) { + const isolatePromise = model.isolateId(); + this._isolateByModel.set(model, isolatePromise); + const isolate = await isolatePromise; + let item = this._itemByIsolate.get(isolate); + if (!item) { + item = new Profiler.IsolateSelector.ListItem(model); + const index = model.target() === SDK.targetManager.mainTarget() ? 0 : this._items.length; + this._items.insert(index, item); + this._itemByIsolate.set(isolate, item); + if (this._items.length === 1) + this._list.selectItem(item); + } else { + item.addModel(model); + } + this._update(); + } + + /** + * @override + * @param {!SDK.RuntimeModel} model + */ + modelRemoved(model) { + this._modelRemoved(model); + } + + /** + * @param {!SDK.RuntimeModel} model + */ + async _modelRemoved(model) { + const isolate = await this._isolateByModel.get(model); + this._isolateByModel.delete(model); + const item = this._itemByIsolate.get(isolate); + item.removeModel(model); + if (!item.models().length) { + this._items.remove(this._items.indexOf(item)); + this._itemByIsolate.delete(isolate); + } + this._update(); + } + + /** + * @param {!Common.Event} event + */ + async _targetChanged(event) { + const target = /** @type {!SDK.Target} */ (event.data); + const model = target.model(SDK.RuntimeModel); + const isolate = model && await this._isolateByModel.get(model); + const item = isolate && this._itemByIsolate.get(isolate); + if (item) + item.updateTitle(); + } + + /** + * @override + * @param {!Profiler.IsolateSelector.ListItem} item + * @return {!Element} + */ + createElementForItem(item) { + return item.element; + } + + /** + * @override + * @param {!Profiler.IsolateSelector.ListItem} item + * @return {number} + */ + heightForItem(item) { + } + + /** + * @override + * @param {!Profiler.IsolateSelector.ListItem} item + * @return {boolean} + */ + isItemSelectable(item) { + return true; + } + + /** + * @override + * @param {?Profiler.IsolateSelector.ListItem} from + * @param {?Profiler.IsolateSelector.ListItem} to + * @param {?Element} fromElement + * @param {?Element} toElement + */ + selectedItemChanged(from, to, fromElement, toElement) { + if (fromElement) + fromElement.classList.remove('selected'); + if (toElement) + toElement.classList.add('selected'); + const model = to && to.models()[0]; + UI.context.setFlavor(SDK.HeapProfilerModel, model && model.heapProfilerModel()); + UI.context.setFlavor(SDK.CPUProfilerModel, model && model.target().model(SDK.CPUProfilerModel)); + } + + _update() { + this._list.invalidateRange(0, this._items.length); + } +}; + +Profiler.IsolateSelector.ListItem = class { + /** + * @param {!SDK.RuntimeModel} model + */ + constructor(model) { + /** @type {!Set<!SDK.RuntimeModel>} */ + this._models = new Set([model]); + this.element = createElementWithClass('div', 'profile-isolate-item hbox'); + this._heapDiv = this.element.createChild('div', 'profile-isolate-item-heap'); + this._nameDiv = this.element.createChild('div', 'profile-isolate-item-name'); + this._updateTimer = null; + this.updateTitle(); + this._updateStats(); + } + + /** + * @param {!SDK.RuntimeModel} model + */ + addModel(model) { + this._models.add(model); + this.updateTitle(); + } + + /** + * @param {!SDK.RuntimeModel} model + */ + removeModel(model) { + this._models.delete(model); + this.updateTitle(); + if (this._models.size) + return; + clearTimeout(this._updateTimer); + } + + /** + * @return {!Array<!SDK.RuntimeModel>} + */ + models() { + return Array.from(this._models); + } + + async _updateStats() { + const heapStats = await this._models.values().next().value.heapUsage(); + if (!heapStats) + return; + this._heapDiv.textContent = + `${Number.bytesToString(heapStats.usedSize)} / ${Number.bytesToString(heapStats.totalSize)}`; + const heapStatsUpdateIntervalMs = 2000; + this._updateTimer = setTimeout(() => this._updateStats(), heapStatsUpdateIntervalMs); + } + + updateTitle() { + /** @type {!Map<string, number>} */ + const modelCountByName = new Map(); + for (const model of this._models.values()) { + const target = model.target(); + const name = target.decorateLabel(target.name() || ls`(empty)`); + const parsedURL = new Common.ParsedURL(target.inspectedURL()); + const domain = parsedURL.isValid ? parsedURL.domain() : ''; + const title = domain ? `${domain}: ${name}` : name; + modelCountByName.set(title, (modelCountByName.get(title) || 0) + 1); + } + const titles = []; + for (const [name, count] of modelCountByName) + titles.push(count > 1 ? `${name} (${count})` : name); + this._nameDiv.textContent = titles.join(', '); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileLauncherView.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileLauncherView.js index 5610e14e..a6772adc 100644 --- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileLauncherView.js +++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileLauncherView.js
@@ -43,10 +43,15 @@ this._contentElement = this.element.createChild('div', 'profile-launcher-view-content'); this._innerContentElement = this._contentElement.createChild('div'); const controlDiv = this._contentElement.createChild('div', 'hbox profile-launcher-control'); - const targetDiv = controlDiv.createChild('div', 'hbox profile-launcher-target'); - targetDiv.createChild('div').textContent = Common.UIString('Target:'); - const targetsSelect = targetDiv.createChild('select', 'chrome-select'); - new Profiler.TargetsComboBoxController(targetsSelect, targetDiv); + if (Runtime.experiments.isEnabled('memoryLauncherViewV2')) { + const targetDiv = controlDiv.createChild('div', 'hbox profile-launcher-target-list'); + new Profiler.IsolateSelector().show(targetDiv); + } else { + const targetDiv = controlDiv.createChild('div', 'hbox profile-launcher-target'); + targetDiv.createChild('div').textContent = Common.UIString('Target:'); + const targetsSelect = targetDiv.createChild('select', 'chrome-select'); + new Profiler.TargetsComboBoxController(targetsSelect, targetDiv); + } this._controlButton = UI.createTextButton('', this._controlButtonClicked.bind(this), 'profile-launcher-button', true /* primary */); this._contentElement.appendChild(this._controlButton);
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/module.json b/third_party/WebKit/Source/devtools/front_end/profiler/module.json index 7e6d7328..e7fbac6 100644 --- a/third_party/WebKit/Source/devtools/front_end/profiler/module.json +++ b/third_party/WebKit/Source/devtools/front_end/profiler/module.json
@@ -105,12 +105,14 @@ "HeapSnapshotGridNodes.js", "HeapSnapshotView.js", "HeapProfilerPanel.js", + "IsolateSelector.js", "ProfileLauncherView.js", "ProfileTypeRegistry.js", "TargetsComboBoxController.js" ], "resources": [ "heapProfiler.css", + "profileLauncherView.css", "profilesPanel.css", "profilesSidebarTree.css" ]
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/profileLauncherView.css b/third_party/WebKit/Source/devtools/front_end/profiler/profileLauncherView.css new file mode 100644 index 0000000..4a65c162 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/profiler/profileLauncherView.css
@@ -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. + */ + +.profile-isolate-item { + padding: 5px; + border-left: 2px solid transparent; +} + +.profile-isolate-item:hover { + background-color: hsla(0, 0%, 0%, 0.05); +} + +.profile-isolate-item.selected { + border-color: #4285f4; + background-color: #4285f420; +} + +.profile-isolate-item > div { + flex-shrink: 0; + margin-left: 9px; +} + +.profile-isolate-item-heap { + width: 120px; +}
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/profilesPanel.css b/third_party/WebKit/Source/devtools/front_end/profiler/profilesPanel.css index 5fa65a3..7bf89a853 100644 --- a/third_party/WebKit/Source/devtools/front_end/profiler/profilesPanel.css +++ b/third_party/WebKit/Source/devtools/front_end/profiler/profilesPanel.css
@@ -131,6 +131,13 @@ min-width: 110px; } +.profile-launcher-target-list { + width: 100%; + height: 150px; + margin-bottom: 10px; + border: 1px solid #ddd; +} + .profile-launcher-target { align-items: baseline; } @@ -196,9 +203,9 @@ } .profile-launcher-button { - margin-top: 10px; - margin-right: 8px; - min-width: 110px; + min-width: 120px; + height: 28px; + margin: 8px 16px 8px 0; } .cpu-profile-flame-chart-overview-container {
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js index da0eee02..c981c19 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js
@@ -317,6 +317,21 @@ } /** + * @return {!Promise<string>} + */ + async isolateId() { + return (await this._agent.getIsolateId()) || this.target().id(); + } + + /** + * @return {!Promise<?{usedSize: number, totalSize: number}>} + */ + async heapUsage() { + const result = await this._agent.invoke_getHeapUsage({}); + return result[Protocol.Error] ? null : result; + } + + /** * @param {!Protocol.Runtime.RemoteObject} payload * @param {!Object=} hints */
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineModel.js b/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineModel.js index b6927aa..a28932e 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineModel.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineModel.js
@@ -183,8 +183,16 @@ const endTime = i + 1 < length ? metadataEvents.page[i + 1].startTime : Infinity; this._legacyCurrentPage = metaEvent.args['data'] && metaEvent.args['data']['page']; for (const thread of process.sortedThreads()) { - if (thread.name() === TimelineModel.TimelineModel.WorkerThreadName) { - const workerMetaEvent = metadataEvents.workers.find(e => e.args['data']['workerThreadId'] === thread.id()); + if (thread.name() === TimelineModel.TimelineModel.WorkerThreadName || + thread.name() === TimelineModel.TimelineModel.WorkerThreadNameLegacy) { + const workerMetaEvent = metadataEvents.workers.find(e => { + if (e.args['data']['workerThreadId'] !== thread.id()) + return false; + // This is to support old traces. + if (e.args['data']['sessionId'] === this._sessionId) + return true; + return !!this._pageFrames.get(TimelineModel.TimelineModel.eventFrameId(e)); + }); if (!workerMetaEvent) continue; const workerId = workerMetaEvent.args['data']['workerId']; @@ -262,7 +270,7 @@ } const result = { page: pageDevToolsMetadataEvents.filter(checkSessionId).sort(SDK.TracingModel.Event.compareStartTime), - workers: workersDevToolsMetadataEvents.filter(checkSessionId).sort(SDK.TracingModel.Event.compareStartTime) + workers: workersDevToolsMetadataEvents.sort(SDK.TracingModel.Event.compareStartTime) }; if (mismatchingIds.size) { Common.console.error( @@ -1237,7 +1245,8 @@ }; TimelineModel.TimelineModel.MainThreadName = 'main'; -TimelineModel.TimelineModel.WorkerThreadName = 'DedicatedWorker Thread'; +TimelineModel.TimelineModel.WorkerThreadName = 'DedicatedWorker thread'; +TimelineModel.TimelineModel.WorkerThreadNameLegacy = 'DedicatedWorker Thread'; TimelineModel.TimelineModel.RendererMainThreadName = 'CrRendererMain'; /** @@ -1283,7 +1292,8 @@ * @return {boolean} */ isWorker() { - return this.name === TimelineModel.TimelineModel.WorkerThreadName; + return this.name === TimelineModel.TimelineModel.WorkerThreadName || + this.name === TimelineModel.TimelineModel.WorkerThreadNameLegacy; } };
diff --git a/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp b/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp index 3ac2d80..79d03dd 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp +++ b/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp
@@ -167,6 +167,15 @@ return false; } + if (origin->Protocol() != url::kHttpScheme && + origin->Protocol() != url::kHttpsScheme) { + resolver->Reject(DOMException::Create( + kNotAllowedError, + "Public-key credentials are only available to secure HTTP or HTTPS " + "origins. See https://crbug.com/824383")); + return false; + } + DCHECK_NE(origin->Protocol(), url::kAboutScheme); DCHECK_NE(origin->Protocol(), url::kFileScheme);
diff --git a/third_party/WebKit/Source/modules/webdatabase/Database.h b/third_party/WebKit/Source/modules/webdatabase/Database.h index 13dc743..a3c6c239 100644 --- a/third_party/WebKit/Source/modules/webdatabase/Database.h +++ b/third_party/WebKit/Source/modules/webdatabase/Database.h
@@ -184,9 +184,9 @@ scoped_refptr<const SecurityOrigin> database_thread_security_origin_; Member<DatabaseContext> database_context_; // Associated with m_executionContext. - // TaskRunnerHelper::get is not thread-safe, so we save SingleThreadTaskRunner - // for TaskType::DatabaseAccess for later use as the constructor runs in the - // main thread. + // ExecutionContext::GetTaskRunner() is not thread-safe, so we save + // SingleThreadTaskRunner for TaskType::DatabaseAccess for later use as the + // constructor runs in the main thread. scoped_refptr<base::SingleThreadTaskRunner> database_task_runner_; String name_;
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLContextAttributeHelpers.cpp b/third_party/WebKit/Source/modules/webgl/WebGLContextAttributeHelpers.cpp index 0871d55..332fa9fb 100644 --- a/third_party/WebKit/Source/modules/webgl/WebGLContextAttributeHelpers.cpp +++ b/third_party/WebKit/Source/modules/webgl/WebGLContextAttributeHelpers.cpp
@@ -32,8 +32,7 @@ Platform::ContextAttributes result; result.fail_if_major_performance_caveat = attrs.fail_if_major_performance_caveat; - result.context_type = web_gl_version == 2 ? Platform::kWebGL2ContextType - : Platform::kWebGL1ContextType; + result.web_gl_version = web_gl_version; if (support_own_offscreen_surface) { // Only ask for alpha/depth/stencil/antialias if we may be using the default // framebuffer. They are not needed for standard offscreen rendering.
diff --git a/third_party/WebKit/Source/platform/graphics/CanvasResource.cpp b/third_party/WebKit/Source/platform/graphics/CanvasResource.cpp index 90181a7c..fef5cef 100644 --- a/third_party/WebKit/Source/platform/graphics/CanvasResource.cpp +++ b/third_party/WebKit/Source/platform/graphics/CanvasResource.cpp
@@ -208,6 +208,7 @@ const GLenum target = GL_TEXTURE_RECTANGLE_ARB; gl->BindTexture(target, texture_id_); gl->BindTexImage2DCHROMIUM(target, image_id_); + gr->resetContext(kTextureBinding_GrGLBackendState); } CanvasResource_GpuMemoryBuffer::~CanvasResource_GpuMemoryBuffer() { @@ -244,6 +245,7 @@ if (!context_provider_wrapper_ || !image_id_) return; auto gl = context_provider_wrapper_->ContextProvider()->ContextGL(); + auto gr = context_provider_wrapper_->ContextProvider()->GetGrContext(); if (gl && texture_id_) { GLenum target = TextureTarget(); gl->BindTexture(target, texture_id_); @@ -251,6 +253,9 @@ gl->DestroyImageCHROMIUM(image_id_); gl->DeleteTextures(1, &texture_id_); gl->BindTexture(target, 0); + if (gr) { + gr->resetContext(kTextureBinding_GrGLBackendState); + } } image_id_ = 0; texture_id_ = 0;
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp index 2b69ce7..b8dc89a 100644 --- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp +++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
@@ -496,11 +496,19 @@ std::unique_ptr<viz::SingleReleaseCallback>* out_release_callback) { ScopedStateRestorer scoped_state_restorer(this); + // This can be null if the context is lost before the first call to + // grContext(). + GrContext* gr_context = ContextProvider()->GetGrContext(); + viz::TransferableResource transferable_resource; std::unique_ptr<viz::SingleReleaseCallback> release_callback; - constexpr bool force_gpu_result = true; - if (!PrepareTransferableResourceInternal( - &transferable_resource, &release_callback, force_gpu_result)) { + bool success = false; + if (gr_context) { + bool force_gpu_result = true; + success = PrepareTransferableResourceInternal( + &transferable_resource, &release_callback, force_gpu_result); + } + if (!success) { // If we can't get a mailbox, return an transparent black ImageBitmap. // The only situation in which this could happen is when two or more calls // to transferToImageBitmap are made back-to-back, or when the context gets
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h index ed6c0ad..5490af0 100644 --- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h +++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h
@@ -41,6 +41,7 @@ // Not used by WebGL code. GrContext* GetGrContext() override { return nullptr; } + void InvalidateGrContext(uint32_t state) override {} bool BindToCurrentThread() override { return false; } const gpu::Capabilities& GetCapabilities() const override { return capabilities_;
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/GraphicsContext3DUtils.cpp b/third_party/WebKit/Source/platform/graphics/gpu/GraphicsContext3DUtils.cpp index 9b381029..011b9296 100644 --- a/third_party/WebKit/Source/platform/graphics/gpu/GraphicsContext3DUtils.cpp +++ b/third_party/WebKit/Source/platform/graphics/gpu/GraphicsContext3DUtils.cpp
@@ -74,6 +74,10 @@ gl->BindTexture(GL_TEXTURE_2D, 0); gl->ProduceTextureDirectCHROMIUM(texture_id, out_mailbox.name); image->getTexture()->textureParamsModified(); + + // We changed bound textures in ProduceTextureDirectCHROMIUM, so reset the + // GrContext. + gr->resetContext(kTextureBinding_GrGLBackendState); } void GraphicsContext3DUtils::RemoveCachedMailbox(GrTexture* gr_texture) {
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/SharedGpuContext.cpp b/third_party/WebKit/Source/platform/graphics/gpu/SharedGpuContext.cpp index 8084144..0f67ced 100644 --- a/third_party/WebKit/Source/platform/graphics/gpu/SharedGpuContext.cpp +++ b/third_party/WebKit/Source/platform/graphics/gpu/SharedGpuContext.cpp
@@ -55,8 +55,8 @@ DCHECK(IsMainThread()); Platform::ContextAttributes context_attributes; + context_attributes.web_gl_version = 1; // GLES2 context_attributes.enable_raster_interface = true; - context_attributes.support_grcontext = true; *gpu_compositing_disabled = Platform::Current()->IsGpuCompositingDisabled(); if (*gpu_compositing_disabled && only_if_gpu_compositing) {
diff --git a/third_party/WebKit/Source/platform/graphics/test/FakeWebGraphicsContext3DProvider.h b/third_party/WebKit/Source/platform/graphics/test/FakeWebGraphicsContext3DProvider.h index 8821411..975f334 100644 --- a/third_party/WebKit/Source/platform/graphics/test/FakeWebGraphicsContext3DProvider.h +++ b/third_party/WebKit/Source/platform/graphics/test/FakeWebGraphicsContext3DProvider.h
@@ -27,6 +27,9 @@ ~FakeWebGraphicsContext3DProvider() override = default; GrContext* GetGrContext() override { return gr_context_.get(); } + void InvalidateGrContext(uint32_t state) override { + gr_context_->resetContext(state); + } const gpu::Capabilities& GetCapabilities() const override { return capabilities_;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.h b/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.h index 5727642..47ca4d3 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.h +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.h
@@ -30,7 +30,7 @@ // Returns a task runner that is suitable with the given task type. This can // be called from any thread. // - // This must be called only from TaskRunnerHelper::Get(). + // This must be called only from WorkerThread::GetTaskRunner(). scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(TaskType) const; // TODO(nhiroki): Add mechanism to throttle/suspend tasks in response to the
diff --git a/third_party/WebKit/public/platform/Platform.h b/third_party/WebKit/public/platform/Platform.h index bfa2d20..5b3980e 100644 --- a/third_party/WebKit/public/platform/Platform.h +++ b/third_party/WebKit/public/platform/Platform.h
@@ -518,15 +518,9 @@ // GPU ---------------------------------------------------------------- // - enum ContextType { - kWebGL1ContextType, // WebGL 1.0 context, use only for WebGL canvases - kWebGL2ContextType, // WebGL 2.0 context, use only for WebGL canvases - kGLES2ContextType, // GLES 2.0 context, default, good for using skia - kGLES3ContextType, // GLES 3.0 context - }; struct ContextAttributes { bool fail_if_major_performance_caveat = false; - ContextType context_type = kGLES2ContextType; + unsigned web_gl_version = 0; // Offscreen contexts usually share a surface for the default frame buffer // since they aren't rendering to it. Setting any of the following // attributes causes creation of a custom surface owned by the context. @@ -535,12 +529,8 @@ bool support_antialias = false; bool support_stencil = false; - // Offscreen contexts created for WebGL should not need the RasterInterface - // or GrContext. If either of these are set to false, it will not be - // possible to use the corresponding interface for the lifetime of the - // context. + // Offscreen contexts created for WebGL should not need the RasterInterface. bool enable_raster_interface = false; - bool support_grcontext = false; }; struct GraphicsInfo { unsigned vendor_id = 0;
diff --git a/third_party/WebKit/public/platform/WebGraphicsContext3DProvider.h b/third_party/WebKit/public/platform/WebGraphicsContext3DProvider.h index 1ee8711..27ea98b5 100644 --- a/third_party/WebKit/public/platform/WebGraphicsContext3DProvider.h +++ b/third_party/WebKit/public/platform/WebGraphicsContext3DProvider.h
@@ -61,6 +61,7 @@ virtual gpu::gles2::GLES2Interface* ContextGL() = 0; virtual bool BindToCurrentThread() = 0; virtual GrContext* GetGrContext() = 0; + virtual void InvalidateGrContext(uint32_t state) = 0; virtual const gpu::Capabilities& GetCapabilities() const = 0; virtual const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const = 0; // Creates a viz::GLHelper after first call and returns that instance. This
diff --git a/third_party/WebKit/public/platform/WebThread.h b/third_party/WebKit/public/platform/WebThread.h index 62af04d..acf64da 100644 --- a/third_party/WebKit/public/platform/WebThread.h +++ b/third_party/WebKit/public/platform/WebThread.h
@@ -77,12 +77,12 @@ virtual void DidProcessTask() = 0; }; - // DEPRECATED: Returns a WebTaskRunner bound to the underlying scheduler's + // DEPRECATED: Returns a task runner bound to the underlying scheduler's // default task queue. // // Default scheduler task queue does not give scheduler enough freedom to // manage task priorities and should not be used. - // Use TaskRunnerHelper::Get instead (crbug.com/624696). + // Use ExecutionContext::GetTaskRunner instead (crbug.com/624696). virtual scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() const { return nullptr; }
diff --git a/third_party/blink/tools/move_blink_source.py b/third_party/blink/tools/move_blink_source.py index 4f04492..eb19e71 100755 --- a/third_party/blink/tools/move_blink_source.py +++ b/third_party/blink/tools/move_blink_source.py
@@ -43,12 +43,15 @@ TYPEMAP = 6 BLINK_BUILD_PY = 7 LAYOUT_TESTS_WITH_MOJOM = 8 + BLINK_DEPS = 9 @staticmethod def detect(path): slash_dir, basename = os.path.split(path) slash_dir = slash_dir.replace(os.path.sep, '/') if basename == 'DEPS': + if 'third_party/WebKit' in path: + return FileType.BLINK_DEPS return FileType.DEPS if basename == 'OWNERS': return FileType.OWNERS @@ -402,6 +405,16 @@ return content return self._update_basename(content) + def _update_blink_deps(self, content): + original_content = content + content = re.sub('(?<=[-+!])public', 'third_party/blink/public', content) + content = re.sub('(?<=[-+!])(bindings|controller|core|modules|platform)', + 'third_party/blink/renderer/\\1', content) + content = content.replace('third_party/WebKit', 'third_party/blink') + if original_content == content: + return content + return self._update_basename(content) + def _update_mojom(self, content): content = content.replace('third_party/WebKit/public', 'third_party/blink/public') content = content.replace('third_party/WebKit/common', 'third_party/blink/common') @@ -456,6 +469,8 @@ _log.info("Skip //DEPS") continue content = self._update_deps(content) + elif file_type == FileType.BLINK_DEPS: + content = self._update_blink_deps(content) elif file_type == FileType.MOJOM: content = self._update_mojom(content) elif file_type == FileType.TYPEMAP:
diff --git a/tools/binary_size/libsupersize/apkanalyzer.py b/tools/binary_size/libsupersize/apkanalyzer.py new file mode 100644 index 0000000..f25ca6e --- /dev/null +++ b/tools/binary_size/libsupersize/apkanalyzer.py
@@ -0,0 +1,150 @@ +# 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. + +"""Runs apkanalyzer to parse dex files in an apk. + +Assumes that apk_path.mapping and apk_path.jar.info is available. +""" + +import os +import subprocess +import zipfile + +import models +import path_util + + +_TOTAL_NODE_NAME = '<TOTAL>' +_DEX_PATH_COMPONENT = 'prebuilt' + + +def _ParseJarInfoFile(file_name): + with open(file_name, 'r') as info: + source_map = dict() + for line in info: + package_path, file_path = line.strip().split(',', 1) + source_map[package_path] = file_path + return source_map + + +def _LoadSourceMap(apk_name, output_directory): + apk_jar_info_name = apk_name + '.jar.info' + jar_info_path = os.path.join( + output_directory, 'size-info', apk_jar_info_name) + return _ParseJarInfoFile(jar_info_path) + + +def _RunApkAnalyzer(apk_path, output_directory): + args = [path_util.GetApkAnalyzerPath(output_directory), 'dex', 'packages', + '--defined-only', apk_path] + mapping_path = apk_path + '.mapping' + if os.path.exists(mapping_path): + args.extend(['--proguard-mappings', mapping_path]) + output = subprocess.check_output(args) + data = [] + for line in output.splitlines(): + vals = line.split() + # We want to name these columns so we know exactly which is which. + # pylint: disable=unused-variable + node_type, state, defined_methods, referenced_methods, size, name = ( + vals[0], vals[1], vals[2], vals[3], vals[4], vals[5:]) + data.append((' '.join(name), int(size))) + return data + + +def _ExpectedDexTotalSize(apk_path): + dex_total = 0 + with zipfile.ZipFile(apk_path) as z: + for zip_info in z.infolist(): + if not zip_info.filename.endswith('.dex'): + continue + dex_total += zip_info.file_size + return dex_total + + +# VisibleForTesting +def UndoHierarchicalSizing(data): + """Subtracts child node sizes from parent nodes. + + Note that inner classes + should be considered as siblings rather than child nodes. + + Example nodes: + [ + ('<TOTAL>', 37), + ('org', 30), + ('org.chromium', 25), + ('org.chromium.ClassA', 14), + ('org.chromium.ClassA void methodA()', 10), + ('org.chromium.ClassA$Proxy', 8), + ] + + Processed nodes: + [ + ('<TOTAL>', 7), + ('org', 5), + ('org.chromium', 3), + ('org.chromium.ClassA', 4), + ('org.chromium.ClassA void methodA()', 10), + ('org.chromium.ClassA$Proxy', 8), + ] + """ + num_nodes = len(data) + nodes = [] + + def process_node(start_idx): + assert start_idx < num_nodes, 'Attempting to parse beyond data array.' + name, size = data[start_idx] + total_child_size = 0 + next_idx = start_idx + 1 + name_len = len(name) + while next_idx < num_nodes: + next_name = data[next_idx][0] + if name == _TOTAL_NODE_NAME or ( + next_name.startswith(name) and next_name[name_len] in '. '): + # Child node + child_next_idx, child_node_size = process_node(next_idx) + next_idx = child_next_idx + total_child_size += child_node_size + else: + # Sibling or higher nodes + break + node_size = size - total_child_size + nodes.append((name, node_size)) + return next_idx, size + + idx = 0 + while idx < num_nodes: + idx = process_node(idx)[0] + return nodes + + +def CreateDexSymbols(apk_path, output_directory): + apk_name = os.path.basename(apk_path) + source_map = _LoadSourceMap(apk_name, output_directory) + nodes = UndoHierarchicalSizing(_RunApkAnalyzer(apk_path, output_directory)) + dex_expected_size = _ExpectedDexTotalSize(apk_path) + total_node_size = sum(map(lambda x: x[1], nodes)) + assert dex_expected_size >= total_node_size, ( + 'Node size too large, check for node processing errors.') + # We have 1+MB of just ids for methods, strings + id_metadata_overhead_size = dex_expected_size - total_node_size + symbols = [] + for name, node_size in nodes: + package = name.split(' ')[0] + class_path = package.split('$')[0] + source_path = source_map.get(class_path, '') + if source_path: + object_path = package + elif package == _TOTAL_NODE_NAME: + name = '* Unattributed Dex' + object_path = os.path.join(apk_name, _DEX_PATH_COMPONENT) + node_size += id_metadata_overhead_size + else: + object_path = os.path.join( + apk_name, _DEX_PATH_COMPONENT, *package.split('.')) + # TODO(wnwen): Split into .dex.methods. + symbols.append(models.Symbol(models.SECTION_DEX, node_size, + full_name=name, object_path=object_path, source_path=source_path)) + return symbols
diff --git a/tools/binary_size/libsupersize/apkanalyzer_test.py b/tools/binary_size/libsupersize/apkanalyzer_test.py new file mode 100755 index 0000000..bd36e7b2 --- /dev/null +++ b/tools/binary_size/libsupersize/apkanalyzer_test.py
@@ -0,0 +1,87 @@ +#!/usr/bin/env python +# Copyright 2018 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import unittest + +import apkanalyzer + + +class ApkAnalyzerTest(unittest.TestCase): + def assertEqualLists(self, list1, list2): + self.assertEqual(set(list1), set(list2)) + + def testUndoHierarchicalSizing_Empty(self): + data = [] + nodes = apkanalyzer.UndoHierarchicalSizing(data) + self.assertEqual(0, len(nodes)) + + def testUndoHierarchicalSizing_TotalSingleRootNode(self): + data = [ + ('<TOTAL>', 5), + ] + nodes = apkanalyzer.UndoHierarchicalSizing(data) + # No changes expected since there are no child nodes. + self.assertEqualLists(data, nodes) + + def testUndoHierarchicalSizing_TotalSizeMinusChildNode(self): + data = [ + ('<TOTAL>', 10), + ('child1', 7), + ] + nodes = apkanalyzer.UndoHierarchicalSizing(data) + self.assertEqualLists([ + ('<TOTAL>', 3), + ('child1', 7), + ], nodes) + + def testUndoHierarchicalSizing_SiblingAnonymousClass(self): + data = [ + ('class1', 10), + ('class1$inner', 8), + ] + nodes = apkanalyzer.UndoHierarchicalSizing(data) + # No change in size expected since these should be siblings. + self.assertEqualLists(data, nodes) + + def testUndoHierarchicalSizing_MethodsShouldBeChildNodes(self): + data = [ + ('class1', 10), + ('class1 method', 8), + ] + nodes = apkanalyzer.UndoHierarchicalSizing(data) + self.assertEqualLists([ + ('class1', 2), + ('class1 method', 8), + ], nodes) + + def testUndoHierarchicalSizing_ClassIsChildNodeOfPackage(self): + data = [ + ('package1', 10), + ('package1.class1', 3), + ] + nodes = apkanalyzer.UndoHierarchicalSizing(data) + self.assertEqualLists([ + ('package1', 7), + ('package1.class1', 3), + ], nodes) + + def testUndoHierarchicalSizing_TotalIncludesAllPackages(self): + data = [ + ('<TOTAL>', 10), + ('package1', 3), + ('package2', 4), + ('package3', 2), + ] + nodes = apkanalyzer.UndoHierarchicalSizing(data) + self.assertEqualLists([ + ('<TOTAL>', 1), + ('package1', 3), + ('package2', 4), + ('package3', 2), + ], nodes) + + +if __name__ == '__main__': + unittest.main()
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py index 45fba505..f822def 100644 --- a/tools/binary_size/libsupersize/archive.py +++ b/tools/binary_size/libsupersize/archive.py
@@ -19,6 +19,7 @@ import tempfile import zipfile +import apkanalyzer import concurrent import demangle import describe @@ -99,9 +100,10 @@ found_prefixes = set() for symbol in raw_symbols: full_name = symbol.full_name - if full_name.startswith('*'): - # See comment in _CalculatePadding() about when this - # can happen. + + # See comment in _CalculatePadding() about when this can happen. Don't + # process names for non-native sections. + if full_name.startswith('*') or not symbol.IsNative(): symbol.template_name = full_name symbol.name = full_name continue @@ -149,6 +151,7 @@ # Strip out return type, and split out name, template_name. # Function parsing also applies to non-text symbols. E.g. Function statics. + # TODO(wnwen): Dex methods might want this processing. symbol.full_name, symbol.template_name, symbol.name = ( function_signature.Parse(full_name)) @@ -199,7 +202,13 @@ logging.info('Looking up source paths from ninja files') for symbol in raw_symbols: object_path = symbol.object_path - if object_path: + if symbol.IsDex(): + symbol.generated_source, symbol.source_path = _NormalizeSourcePath( + symbol.source_path) + elif symbol.IsOther(): + # TODO(wnwen): Add source mapping for other symbols. + pass + elif object_path: # We don't have source info for prebuilt .a files. if not os.path.isabs(object_path) and not object_path.startswith('..'): source_path = source_mapper.FindSourceForPath(object_path) @@ -457,7 +466,7 @@ symbol.padding = symbol.size continue if (symbol.address <= 0 or prev_symbol.address <= 0 or - symbol.IsPak() or prev_symbol.IsPak()): + not symbol.IsNative() or not prev_symbol.IsNative()): continue if symbol.address == prev_symbol.address: @@ -793,19 +802,29 @@ return section_sizes +def _ParseDexSymbols(section_sizes, apk_path, output_directory): + symbols = apkanalyzer.CreateDexSymbols(apk_path, output_directory) + prev = section_sizes.setdefault(models.SECTION_DEX, 0) + section_sizes[models.SECTION_DEX] = prev + sum(s.size for s in symbols) + return symbols + + def _ParseApkOtherSymbols(section_sizes, apk_path): + apk_name = os.path.basename(apk_path) apk_symbols = [] zip_info_total = 0 with zipfile.ZipFile(apk_path) as z: for zip_info in z.infolist(): zip_info_total += zip_info.compress_size - # Skip shared library and pak files as they are already accounted for. + # Skip shared library, pak, and dex files as they are accounted for. if (zip_info.filename.endswith('.so') + or zip_info.filename.endswith('.dex') or zip_info.filename.endswith('.pak')): continue + path = os.path.join(apk_name, 'other', zip_info.filename) apk_symbols.append(models.Symbol( models.SECTION_OTHER, zip_info.compress_size, - full_name=zip_info.filename)) + object_path=path, full_name=os.path.basename(zip_info.filename))) overhead_size = os.path.getsize(apk_path) - zip_info_total zip_overhead_symbol = models.Symbol( models.SECTION_OTHER, overhead_size, full_name='Overhead: APK file') @@ -910,6 +929,8 @@ knobs) section_sizes, elf_overhead_size = _ParseApkElfSectionSize( section_sizes, metadata, apk_elf_result) + raw_symbols.extend( + _ParseDexSymbols(section_sizes, apk_path, output_directory)) raw_symbols.extend(_ParseApkOtherSymbols(section_sizes, apk_path)) elif pak_files and pak_info_file: pak_symbols_by_id = _FindPakSymbolsFromFiles(
diff --git a/tools/binary_size/libsupersize/models.py b/tools/binary_size/libsupersize/models.py index 5ac5dd5..02fb888 100644 --- a/tools/binary_size/libsupersize/models.py +++ b/tools/binary_size/libsupersize/models.py
@@ -49,6 +49,7 @@ SECTION_DATA = '.data' SECTION_DATA_REL_RO = '.data.rel.ro' SECTION_DATA_REL_RO_LOCAL = '.data.rel.ro.local' +SECTION_DEX = '.dex' SECTION_OTHER = '.other' SECTION_PAK_NONTRANSLATED = '.pak.nontranslated' SECTION_PAK_TRANSLATIONS = '.pak.translations' @@ -75,6 +76,7 @@ SECTION_DATA: 'd', SECTION_DATA_REL_RO_LOCAL: 'R', SECTION_DATA_REL_RO: 'R', + SECTION_DEX: 'x', SECTION_OTHER: 'o', SECTION_PAK_NONTRANSLATED: 'P', SECTION_PAK_TRANSLATIONS: 'p', @@ -89,6 +91,7 @@ ('R', SECTION_DATA_REL_RO), ('d', SECTION_DATA), ('b', SECTION_BSS), + ('x', SECTION_DEX), ('p', SECTION_PAK_TRANSLATIONS), ('P', SECTION_PAK_NONTRANSLATED), ('o', SECTION_OTHER), @@ -276,9 +279,17 @@ def IsBss(self): return self.section_name == SECTION_BSS + def IsDex(self): + return self.section_name == SECTION_DEX + + def IsOther(self): + return self.section_name == SECTION_OTHER + def IsPak(self): - return (self.section_name == SECTION_PAK_TRANSLATIONS or - self.section_name == SECTION_PAK_NONTRANSLATED) + return self.section_name in PAK_SECTIONS + + def IsNative(self): + return self.section_name in NATIVE_SECTIONS def IsGroup(self): return False
diff --git a/tools/binary_size/libsupersize/path_util.py b/tools/binary_size/libsupersize/path_util.py index ab2ff1c..63d1043d 100644 --- a/tools/binary_size/libsupersize/path_util.py +++ b/tools/binary_size/libsupersize/path_util.py
@@ -94,11 +94,9 @@ 'Release+Asserts', 'bin', 'llvm-') else: # Auto-detect from build_vars.txt - build_vars_path = os.path.join(output_directory, 'build_vars.txt') - if os.path.exists(build_vars_path): - with open(build_vars_path) as f: - build_vars = dict(l.rstrip().split('=', 1) for l in f if '=' in l) - tool_prefix = build_vars['android_tool_prefix'] + build_vars = _LoadBuildVars(output_directory) + tool_prefix = build_vars.get('android_tool_prefix') + if tool_prefix: ret = os.path.normpath(os.path.join(output_directory, tool_prefix)) # Maintain a trailing '/' if needed. if tool_prefix.endswith(os.path.sep): @@ -128,6 +126,14 @@ raise Exception('Bad --%s. Path not found: %s' % (self._name, full_path)) +def _LoadBuildVars(output_directory): + build_vars_path = os.path.join(output_directory, 'build_vars.txt') + if os.path.exists(build_vars_path): + with open(build_vars_path) as f: + return dict(l.rstrip().split('=', 1) for l in f if '=' in l) + return dict() + + def FromSrcRootRelative(path): ret = os.path.relpath(os.path.join(SRC_ROOT, path)) # Need to maintain a trailing /. @@ -154,6 +160,13 @@ return tool_prefix + 'nm' +def GetApkAnalyzerPath(output_directory): + build_vars = _LoadBuildVars(output_directory) + return os.path.normpath(os.path.join( + output_directory, build_vars['android_sdk_root'], 'tools', 'bin', + 'apkanalyzer')) + + def GetObjDumpPath(tool_prefix): return tool_prefix + 'objdump'
diff --git a/tools/binary_size/libsupersize/template/D3SymbolTreeMap.js b/tools/binary_size/libsupersize/template/D3SymbolTreeMap.js index e7d3b6f..b65617f 100644 --- a/tools/binary_size/libsupersize/template/D3SymbolTreeMap.js +++ b/tools/binary_size/libsupersize/template/D3SymbolTreeMap.js
@@ -76,8 +76,9 @@ 'd': '.data and .data.*', 'r': '.rodata', 't': '.text', - 'v': 'Vtable entry', + 'v': 'Vtable Entry', '!': 'Generated Symbols (typeinfo, thunks, etc)', + 'x': 'Dex Entries', 'p': 'Locale Pak Entries', 'P': 'Non-Locale Pak Entries', 'o': 'Other Entries', @@ -108,9 +109,10 @@ 'rgb(128,177,211)', 'rgb(255,237,111)', 'rgb(204,235,197)', + 'rgb(255,111,111)', 'rgb(93,156,110)', 'rgb(61,109,55)', - 'rgb(255,111,111)', + 'rgb(150,100,111)', ] D3SymbolTreeMap._initColorMap = function() {
diff --git a/tools/binary_size/libsupersize/template/index.html b/tools/binary_size/libsupersize/template/index.html index 81a9e70..f52752d 100644 --- a/tools/binary_size/libsupersize/template/index.html +++ b/tools/binary_size/libsupersize/template/index.html
@@ -24,7 +24,7 @@ var treemap; var filterChanging = false; var savedSettings = {}; -var NUM_SYMBOL_TYPES = 9; +var NUM_SYMBOL_TYPES = 10; function init() { if (window.metadata !== undefined && window.metadata.subtitle) { @@ -443,9 +443,10 @@ <br><span class='swatch' id='swatch_3'> </span><input checked type='checkbox' id='check_3' value='t'>Code (.text) <br><span class='swatch' id='swatch_4'> </span><input checked type='checkbox' id='check_4' value='v'>Vtable entries <br><span class='swatch' id='swatch_5'> </span><input checked type='checkbox' id='check_5' value='!'>Generated Symbols (typeinfo, thunks, etc) - <br><span class='swatch' id='swatch_6'> </span><input checked type='checkbox' id='check_6' value='p'>Locale Pak Entries - <br><span class='swatch' id='swatch_7'> </span><input checked type='checkbox' id='check_7' value='P'>Non-Locale Pak Entries - <br><span class='swatch' id='swatch_8'> </span><input type='checkbox' id='check_8' value='o'>Other Entries + <br><span class='swatch' id='swatch_6'> </span><input checked type='checkbox' id='check_6' value='x'>Dex entries + <br><span class='swatch' id='swatch_7'> </span><input checked type='checkbox' id='check_7' value='p'>Locale Pak Entries + <br><span class='swatch' id='swatch_8'> </span><input checked type='checkbox' id='check_8' value='P'>Non-Locale Pak Entries + <br><span class='swatch' id='swatch_9'> </span><input type='checkbox' id='check_9' value='o'>Other Entries </td> </tr> <tr><td style='text-align: center; white-space: nowrap; padding-top: 1em;'>
diff --git a/tools/binary_size/libsupersize/testdata/Console.golden b/tools/binary_size/libsupersize/testdata/Console.golden index e4019cbc..e4b6002 100644 --- a/tools/binary_size/libsupersize/testdata/Console.golden +++ b/tools/binary_size/libsupersize/testdata/Console.golden
@@ -2,7 +2,7 @@ Entering interactive Python shell. Quick reference: SizeInfo: metadata, native_symbols, pak_symbols, raw_symbols, section_sizes, size_path, symbols -Symbol: FlagsString, IsBss, IsDelta, IsGeneratedByToolchain, IsGroup, IsPak, IsStringLiteral, IterLeafSymbols, address, aliases, end_address, flags, full_name, generated_source, is_anonymous, name, num_aliases, object_path, padding, padding_pss, pss, pss_without_padding, section, section_name, size, size_without_padding, source_path, template_name +Symbol: FlagsString, IsBss, IsDelta, IsDex, IsGeneratedByToolchain, IsGroup, IsNative, IsOther, IsPak, IsStringLiteral, IterLeafSymbols, address, aliases, end_address, flags, full_name, generated_source, is_anonymous, name, num_aliases, object_path, padding, padding_pss, pss, pss_without_padding, section, section_name, size, size_without_padding, source_path, template_name SymbolGroup (extends Symbol): CountUniqueSymbols, Filter, GroupedBy, GroupedByAliases, GroupedByFullName, GroupedByName, GroupedByPath, GroupedBySectionName, Inverted, IterUniqueSymbols, SetName, Sorted, SortedByAddress, SortedByCount, SortedByName, WhereAddressInRange, WhereFullNameMatches, WhereGeneratedByToolchain, WhereHasAnyAttribution, WhereHasPath, WhereInSection, WhereIsGroup, WhereIsNative, WhereIsPak, WhereIsTemplate, WhereMatches, WhereNameMatches, WhereObjectPathMatches, WherePathMatches, WherePssBiggerThan, WhereSizeBiggerThan, WhereSourceIsGenerated, WhereSourcePathMatches, WhereTemplateNameMatches, index, is_sorted
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 3f58e75..8cfe5223 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -368,7 +368,6 @@ 'UBSan vptr Release': 'ubsan_vptr_edge_release_bot', 'Win ASan Release Media': 'asan_fuzzer_v8_heap_chrome_with_codecs_release_bot_x86', 'Win ASan Release': 'asan_fuzzer_v8_heap_release_bot', - 'Win SyzyASAN LKGR': 'syzyasan_no_pch_release_x86', }, 'chromium.mac': { @@ -735,7 +734,6 @@ 'win_chromium_compile_dbg_ng': 'debug_trybot_x86_minimal_symbols', 'win_chromium_compile_rel_ng': 'gpu_tests_release_trybot_x86_minimal_symbols', 'win_chromium_dbg_ng': 'debug_trybot_x86_minimal_symbols', - 'win_chromium_syzyasan_rel': 'syzyasan_no_pch_release_x86', 'win_chromium_x64_rel_ng': 'release_trybot_minimal_symbols', 'win_clang': 'win_clang_release_bot', 'win-msvc-rel': 'win_msvc_release_bot_compile_only', @@ -1649,14 +1647,6 @@ 'release_bot', 'x86', 'minimal_symbols', 'no_clang', 'use_cxx11', ], - 'syzyasan_no_pch_release_x86': [ - 'syzyasan', 'no_pch', 'release', 'x86', - # The SyzyASAN build may default dcheck_always_on to true to produce - # official builds with DCHECK on. To counter this, the flag is fixed - # here. For details see https://crbug.com/596231#c71. - 'disable_dcheck_always_on', - ], - 'tsan_disable_nacl_debug_bot': [ 'tsan', 'disable_nacl', 'debug_bot', ], @@ -1900,10 +1890,6 @@ 'gn_args': 'dcheck_always_on=true', }, - 'disable_dcheck_always_on': { - 'gn_args': 'dcheck_always_on=false', - }, - 'debug': { 'gn_args': 'is_debug=true', }, @@ -2164,11 +2150,6 @@ 'gn_args': 'use_system_libdrm=true use_system_minigbm=true', }, - 'syzyasan': { - # TODO(thakis): Figure out SyzyASan + clang story. - 'gn_args': 'is_syzyasan=true is_clang=false', - }, - 'thin_lto': { 'gn_args': 'use_thin_lto=true', },
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 054a99ec..f1dfebd 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -25919,9 +25919,11 @@ <int value="-1486198877" label="VrIconInDaydreamHome:disabled"/> <int value="-1482730792" label="stop-in-background:enabled"/> <int value="-1482685863" label="enable-request-tablet-site"/> + <int value="-1481990501" label="Windows10CustomTitlebar:disabled"/> <int value="-1480926949" label="MaterialDesignBookmarks:enabled"/> <int value="-1480866718" label="ash-disable-login-dim-and-blur"/> <int value="-1478876902" label="disable-permission-action-reporting"/> + <int value="-1476930281" label="Windows10CustomTitlebar:enabled"/> <int value="-1473668019" label="token-binding:disabled"/> <int value="-1473136627" label="enable-web-payments"/> <int value="-1471021059" @@ -27078,7 +27080,6 @@ <int value="1369449914" label="SysInternals:disabled"/> <int value="1371092708" label="disable-desktop-capture-picker-old-ui"/> <int value="1371907429" label="enable-wallet-card-import"/> - <int value="1372199493" label="windows10-custom-titlebar"/> <int value="1372680885" label="enable-mtp-write-support"/> <int value="1373777956" label="disable-threaded-gpu-rasterization"/> <int value="1376437124" label="show-cert-link"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 2a8da3c..6a39644 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -48064,6 +48064,9 @@ </histogram> <histogram name="Net.QuicSession.SentConnectivityProbe" enum="Boolean"> + <obsolete> + Deprecated 03/2018 as crbug.com/817496 is resolved. + </obsolete> <owner>zhongyi@chromium.org</owner> <summary> The number of times the connection sends connectivity probe to the peer. @@ -72003,6 +72006,18 @@ </summary> </histogram> +<histogram name="Renderer.Hung.Duration" units="ms"> + <owner>avi@chromium.org</owner> + <summary> + The length of time render processes are hung, in milliseconds. Note that + because technically speaking render processes are "hung" from the + moment an input event is sent to them until the moment that they return an + ACK, only hangs of minimum length 5s are recorded. Note that this combines + measurements from both renderer processes that recover on their own, and + render processes that are killed. + </summary> +</histogram> + <histogram name="Renderer.Hung.MobileInfoBar.UserEvent" enum="MobileHungRendererInfoBarEvent"> <owner>dfalcantara@chromium.org</owner>
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index a723f54f..66ebed8 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -389,3 +389,10 @@ # Benchmark: loading.desktop.network_service crbug.com/723783 [ Win ] loading.desktop.network_service/Orange [ Skip ] crbug.com/752611 [ Linux ] loading.desktop.network_service/uol.com.br [ Skip ] +crbug.com/805115 [ All ] loading.desktop.network_service/Ynet [ Skip ] +crbug.com/805115 [ All ] loading.desktop.network_service/Leboncoin [ Skip ] +crbug.com/805115 [ All ] loading.desktop.network_service/Rambler [ Skip ] +crbug.com/805115 [ All ] loading.desktop.network_service/2ch [ Skip ] +crbug.com/805115 [ All ] loading.desktop.network_service/goo.ne.jp [ Skip ] +crbug.com/805115 [ All ] loading.desktop.network_service/MLB [ Skip ] +crbug.com/805115 [ All ] loading.desktop.network_service/FDA [ Skip ]
diff --git a/ui/app_list/app_list_features.cc b/ui/app_list/app_list_features.cc index 17f0338c..046ff63 100644 --- a/ui/app_list/app_list_features.cc +++ b/ui/app_list/app_list_features.cc
@@ -29,10 +29,6 @@ return enabled; } -bool IsFullscreenAppListEnabled() { - return true; -} - bool IsPlayStoreAppSearchEnabled() { // Not using local static variable to allow tests to change this value. return base::FeatureList::IsEnabled(kEnablePlayStoreAppSearch);
diff --git a/ui/app_list/app_list_features.h b/ui/app_list/app_list_features.h index 5ab2da9..443d9526 100644 --- a/ui/app_list/app_list_features.h +++ b/ui/app_list/app_list_features.h
@@ -31,7 +31,6 @@ bool APP_LIST_EXPORT IsAnswerCardEnabled(); bool APP_LIST_EXPORT IsBackgroundBlurEnabled(); -bool APP_LIST_EXPORT IsFullscreenAppListEnabled(); bool APP_LIST_EXPORT IsPlayStoreAppSearchEnabled(); std::string APP_LIST_EXPORT AnswerServerUrl(); std::string APP_LIST_EXPORT AnswerServerQuerySuffix();
diff --git a/ui/app_list/views/app_list_main_view_unittest.cc b/ui/app_list/views/app_list_main_view_unittest.cc index 89cfc730..7cfa968 100644 --- a/ui/app_list/views/app_list_main_view_unittest.cc +++ b/ui/app_list/views/app_list_main_view_unittest.cc
@@ -12,7 +12,6 @@ #include "base/timer/timer.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/app_list/app_list_features.h" #include "ui/app_list/app_list_switches.h" #include "ui/app_list/test/app_list_test_model.h" #include "ui/app_list/test/app_list_test_view_delegate.h" @@ -82,9 +81,7 @@ views::ViewsTestBase::SetUp(); // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (app_list::features::IsFullscreenAppListEnabled()) - return; - +#if 0 delegate_.reset(new AppListTestViewDelegate); main_view_ = new AppListMainView(delegate_.get(), nullptr); main_view_->SetPaintToLayer(); @@ -107,19 +104,18 @@ views::Widget::InitParams::TRANSLUCENT_WINDOW; search_box_widget_->Init(search_box_widget_params); search_box_widget_->SetContentsView(search_box_view_); +#endif } void TearDown() override { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (app_list::features::IsFullscreenAppListEnabled()) { - views::ViewsTestBase::TearDown(); - return; - } - + views::ViewsTestBase::TearDown(); +#if 0 main_widget_->Close(); views::ViewsTestBase::TearDown(); delegate_.reset(); +#endif } // |point| is in |grid_view|'s coordinates. @@ -257,12 +253,9 @@ } // namespace // Tests changing the AppListModel when switching profiles. -TEST_F(AppListMainViewTest, ModelChanged) { +TEST_F(AppListMainViewTest, DISABLED_ModelChanged) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - delegate_->GetTestModel()->PopulateApps(kInitialItems); EXPECT_EQ(kInitialItems, RootViewModel()->view_size()); @@ -277,12 +270,9 @@ } // Tests that mouse hovering over an app item highlights it -TEST_F(AppListMainViewTest, MouseHoverToHighlight) { +TEST_F(AppListMainViewTest, DISABLED_MouseHoverToHighlight) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - delegate_->GetTestModel()->PopulateApps(2); main_widget_->Show(); @@ -309,12 +299,9 @@ } // Tests that tap gesture on app item highlights it -TEST_F(AppListMainViewTest, TapGestureToHighlight) { +TEST_F(AppListMainViewTest, DISABLED_TapGestureToHighlight) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - delegate_->GetTestModel()->PopulateApps(1); main_widget_->Show(); @@ -336,12 +323,9 @@ // Tests dragging an item out of a single item folder and drop it at the last // slot. -TEST_F(AppListMainViewTest, DragLastItemFromFolderAndDropAtLastSlot) { +TEST_F(AppListMainViewTest, DISABLED_DragLastItemFromFolderAndDropAtLastSlot) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - AppListItemView* folder_item_view = CreateAndOpenSingleItemFolder(); const gfx::Rect first_slot_tile = folder_item_view->bounds(); @@ -384,12 +368,9 @@ // Tests dragging an item out of a single item folder and dropping it onto the // page switcher. Regression test for http://crbug.com/415530/. -TEST_F(AppListMainViewTest, DragReparentItemOntoPageSwitcher) { +TEST_F(AppListMainViewTest, DISABLED_DragReparentItemOntoPageSwitcher) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - // Number of apps to populate. Should provide more than 1 page of apps (6*4 = // 24). const int kNumApps = 30; @@ -428,12 +409,9 @@ // Test that an interrupted drag while reparenting an item from a folder, when // canceled via the root grid, correctly forwards the cancelation to the drag // ocurring from the folder. -TEST_F(AppListMainViewTest, MouseDragItemOutOfFolderWithCancel) { +TEST_F(AppListMainViewTest, DISABLED_MouseDragItemOutOfFolderWithCancel) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - CreateAndOpenSingleItemFolder(); AppListItemView* dragged = StartDragForReparent(0); @@ -456,12 +434,9 @@ // Test that dragging an app out of a single item folder and reparenting it // back into its original folder results in a cancelled reparent. This is a // regression test for http://crbug.com/429083. -TEST_F(AppListMainViewTest, ReparentSingleItemOntoSelf) { +TEST_F(AppListMainViewTest, DISABLED_ReparentSingleItemOntoSelf) { // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - // Add a folder with 1 item. AppListItemView* folder_item_view = CreateAndOpenSingleItemFolder(); std::string folder_id = folder_item_view->item()->id();
diff --git a/ui/app_list/views/app_list_view_unittest.cc b/ui/app_list/views/app_list_view_unittest.cc index b45117e..6733e80 100644 --- a/ui/app_list/views/app_list_view_unittest.cc +++ b/ui/app_list/views/app_list_view_unittest.cc
@@ -22,7 +22,6 @@ #include "base/test/scoped_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/app_list/app_list_constants.h" -#include "ui/app_list/app_list_features.h" #include "ui/app_list/pagination_model.h" #include "ui/app_list/test/app_list_test_model.h" #include "ui/app_list/test/app_list_test_view_delegate.h" @@ -1669,58 +1668,6 @@ EXPECT_EQ(expected, delegate_->GetModel()->state()); } -// Tests that the start page view operates correctly. -TEST_F(AppListViewTest, StartPageTest) { - Initialize(0, false, false); - // TODO(newcomer): this test needs to be reevaluated for the fullscreen app - // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - -#if 0 - EXPECT_FALSE(view_->GetWidget()->IsVisible()); - EXPECT_EQ(-1, GetPaginationModel()->total_pages()); - AppListTestModel* model = delegate_->GetTestModel(); - model->PopulateApps(3); - - Show(); - - AppListMainView* main_view = view_->app_list_main_view(); - StartPageView* start_page_view = - main_view->contents_view()->start_page_view(); - // Checks on the main view. - EXPECT_NO_FATAL_FAILURE(CheckView(main_view)); - EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view())); - EXPECT_NO_FATAL_FAILURE(CheckView(start_page_view)); - - // Show the start page view. - EXPECT_TRUE(SetAppListState(ash::AppListState::kStateStart)); - gfx::Size view_size(view_->GetPreferredSize()); - - // Hiding and showing the search box should not affect the app list's - // preferred size. This is a regression test for http://crbug.com/386912. - EXPECT_EQ(view_size.ToString(), view_->GetPreferredSize().ToString()); - - // Check tiles hide and show on deletion and addition. - EXPECT_TRUE(SetAppListState(ash::AppListState::kStateStart)); - model->results()->Add(std::make_unique<TestStartPageSearchResult>()); - start_page_view->UpdateForTesting(); - EXPECT_EQ(1u, GetVisibleViews(start_page_view->tile_views())); - model->results()->DeleteAll(); - start_page_view->UpdateForTesting(); - EXPECT_EQ(0u, GetVisibleViews(start_page_view->tile_views())); - - // Tiles should not update when the start page is not active but should be - // correct once the start page is shown. - EXPECT_TRUE(SetAppListState(ash::AppListState::kStateApps)); - model->results()->Add(std::make_unique<TestStartPageSearchResult>()); - start_page_view->UpdateForTesting(); - EXPECT_EQ(0u, GetVisibleViews(start_page_view->tile_views())); - EXPECT_TRUE(SetAppListState(ash::AppListState::kStateStart)); - EXPECT_EQ(1u, GetVisibleViews(start_page_view->tile_views())); -#endif -} - // Tests switching rapidly between multiple pages of the launcher. TEST_F(AppListViewTest, PageSwitchingAnimationTest) { Initialize(0, false, false); @@ -1751,13 +1698,10 @@ } // Tests that the correct views are displayed for showing search results. -TEST_F(AppListViewTest, SearchResultsTest) { +TEST_F(AppListViewTest, DISABLED_SearchResultsTest) { Initialize(0, false, false); // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - EXPECT_FALSE(view_->GetWidget()->IsVisible()); EXPECT_EQ(-1, GetPaginationModel()->total_pages()); AppListTestModel* model = delegate_->GetTestModel(); @@ -1819,13 +1763,10 @@ } // Tests that the back button navigates through the app list correctly. -TEST_F(AppListViewTest, BackTest) { +TEST_F(AppListViewTest, DISABLED_BackTest) { Initialize(0, false, false); // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - EXPECT_FALSE(view_->GetWidget()->IsVisible()); EXPECT_EQ(-1, GetPaginationModel()->total_pages()); @@ -1876,13 +1817,10 @@ } // Tests that the correct views are displayed for showing search results. -TEST_F(AppListViewTest, AppListOverlayTest) { +TEST_F(AppListViewTest, DISABLED_AppListOverlayTest) { Initialize(0, false, false); // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - Show(); AppListMainView* main_view = view_->app_list_main_view(); @@ -1901,13 +1839,10 @@ // Tests that even if initialize is called again with a different initial page, // that different initial page is respected. -TEST_F(AppListViewTest, MultiplePagesReinitializeOnInputPage) { +TEST_F(AppListViewTest, DISABLED_MultiplePagesReinitializeOnInputPage) { Initialize(0, false, false); // TODO(newcomer): this test needs to be reevaluated for the fullscreen app // list (http://crbug.com/759779). - if (features::IsFullscreenAppListEnabled()) - return; - delegate_->GetTestModel()->PopulateApps(kInitialItems); // Show and close the widget once.
diff --git a/ui/base/ui_base_switches.cc b/ui/base/ui_base_switches.cc index 7383138..c8d658d 100644 --- a/ui/base/ui_base_switches.cc +++ b/ui/base/ui_base_switches.cc
@@ -14,6 +14,9 @@ // based overlay display path. const char kDisableMacOverlays[] = "disable-mac-overlays"; +// Disable animations for showing and hiding modal dialogs. +const char kDisableModalAnimations[] = "disable-modal-animations"; + // Disable use of cross-process CALayers to display content directly from the // GPU process on Mac. const char kDisableRemoteCoreAnimation[] = "disable-remote-core-animation"; @@ -97,6 +100,11 @@ // Red: Overdrawn four or more times. const char kShowOverdrawFeedback[] = "show-overdraw-feedback"; +// Use Skia Deferred Display List, with this option, SkiaRenderer will record +// frames to Skia DDLs and play them back on the GPU thread. This flag is only +// be effective with --use-skia-renderer. +const char kUseSkiaDeferredDisplayList[] = "use-skia-deferred-display-list"; + // Use SkiaRenderer instead of GLRenderer for direct rendering. const char kUseSkiaRenderer[] = "use-skia-renderer";
diff --git a/ui/base/ui_base_switches.h b/ui/base/ui_base_switches.h index 1d459b0..22a9f498 100644 --- a/ui/base/ui_base_switches.h +++ b/ui/base/ui_base_switches.h
@@ -15,6 +15,7 @@ #if defined(OS_MACOSX) && !defined(OS_IOS) UI_BASE_EXPORT extern const char kDisableAVFoundationOverlays[]; UI_BASE_EXPORT extern const char kDisableMacOverlays[]; +UI_BASE_EXPORT extern const char kDisableModalAnimations[]; UI_BASE_EXPORT extern const char kDisableRemoteCoreAnimation[]; UI_BASE_EXPORT extern const char kShowMacOverlayBorders[]; #endif @@ -40,6 +41,7 @@ UI_BASE_EXPORT extern const char kTopChromeMDMaterialTouchOptimized[]; UI_BASE_EXPORT extern const char kTopChromeMDMaterialRefresh[]; UI_BASE_EXPORT extern const char kUIDisablePartialSwap[]; +UI_BASE_EXPORT extern const char kUseSkiaDeferredDisplayList[]; UI_BASE_EXPORT extern const char kUseSkiaRenderer[]; // Test related.
diff --git a/ui/base/win/direct_manipulation.cc b/ui/base/win/direct_manipulation.cc index 93d370d..98b6ca5f 100644 --- a/ui/base/win/direct_manipulation.cc +++ b/ui/base/win/direct_manipulation.cc
@@ -99,6 +99,8 @@ DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_X | DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_Y | DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_INERTIA | + DIRECTMANIPULATION_CONFIGURATION_RAILS_X | + DIRECTMANIPULATION_CONFIGURATION_RAILS_Y | DIRECTMANIPULATION_CONFIGURATION_SCALING; hr = viewport_->ActivateConfiguration(configuration);
diff --git a/ui/compositor/test/in_process_context_provider.cc b/ui/compositor/test/in_process_context_provider.cc index 0495880..8c72225 100644 --- a/ui/compositor/test/in_process_context_provider.cc +++ b/ui/compositor/test/in_process_context_provider.cc
@@ -139,6 +139,7 @@ gpu::gles2::GLES2Interface* InProcessContextProvider::ContextGL() { CheckValidThreadOrLockAcquired(); + return context_->GetImplementation(); } @@ -165,8 +166,8 @@ skia_bindings::GrContextForGLES2Interface::DefaultCacheLimitsForTests( &max_resource_cache_bytes, &max_glyph_cache_texture_bytes); gr_context_.reset(new skia_bindings::GrContextForGLES2Interface( - ContextGL(), ContextSupport(), ContextCapabilities(), - max_resource_cache_bytes, max_glyph_cache_texture_bytes)); + ContextGL(), ContextCapabilities(), max_resource_cache_bytes, + max_glyph_cache_texture_bytes)); cache_controller_->SetGrContext(gr_context_->get()); return gr_context_->get(); @@ -177,6 +178,13 @@ return cache_controller_.get(); } +void InProcessContextProvider::InvalidateGrContext(uint32_t state) { + CheckValidThreadOrLockAcquired(); + + if (gr_context_) + gr_context_->ResetContext(state); +} + base::Lock* InProcessContextProvider::GetLock() { if (!support_locking_) return nullptr;
diff --git a/ui/compositor/test/in_process_context_provider.h b/ui/compositor/test/in_process_context_provider.h index de44457..431002e7 100644 --- a/ui/compositor/test/in_process_context_provider.h +++ b/ui/compositor/test/in_process_context_provider.h
@@ -63,6 +63,7 @@ gpu::ContextSupport* ContextSupport() override; class GrContext* GrContext() override; viz::ContextCacheController* CacheController() override; + void InvalidateGrContext(uint32_t state) override; base::Lock* GetLock() override; void AddObserver(viz::ContextLostObserver* obs) override; void RemoveObserver(viz::ContextLostObserver* obs) override;
diff --git a/ui/display/manager/chromeos/display_utils_unittest.cc b/ui/display/manager/chromeos/display_utils_unittest.cc index cbdbc1e..0eeb386e0 100644 --- a/ui/display/manager/chromeos/display_utils_unittest.cc +++ b/ui/display/manager/chromeos/display_utils_unittest.cc
@@ -52,9 +52,18 @@ ManagedDisplayMode mode(gfx::Size(size, size), 60, false, true, 1.f, 1.f); const std::vector<double> zoom_values = GetDisplayZoomFactors(mode); EXPECT_EQ(zoom_values.size(), kNumOfZoomFactors); - for (std::size_t j = 0; j < kNumOfZoomFactors; j++) + for (std::size_t j = 0; j < kNumOfZoomFactors; j++) { EXPECT_NEAR(zoom_values[j], pair.second[j], 0.001); + // Display pref stores the zoom value only upto 2 decimal places. This + // check ensures that the expected precision is only upto 2 decimal + // points. Before changing this line please ensure that you have updated + // chromeos/display/display_prefs.cc + int percentage_value = std::round(zoom_values[j] * 100.f); + float fractional_value = static_cast<float>(percentage_value) / 100.f; + EXPECT_NEAR(zoom_values[j], fractional_value, 0.0001f); + } + const int effective_minimum_width_possible = size / zoom_values.back(); const int effective_maximum_width_possible = size * zoom_values.front();
diff --git a/ui/display/manager/display_manager.cc b/ui/display/manager/display_manager.cc index 5a92b5e..40aa6f58 100644 --- a/ui/display/manager/display_manager.cc +++ b/ui/display/manager/display_manager.cc
@@ -606,7 +606,7 @@ // Different resolutions allow different zoom factors to be set in the // UI. To avoid confusion in the UI, reset the zoom factor to 1.0. - display_zoom_factors_[display_id] = 1.f; + display_info_[display_id].set_zoom_factor(1.f); break; } if (info.device_scale_factor() != display_mode.device_scale_factor()) { @@ -673,7 +673,7 @@ display_modes_[display_id] = mode; } - display_zoom_factors_[display_id] = display_zoom_factor; + display_info_[display_id].set_zoom_factor(display_zoom_factor); } bool DisplayManager::GetActiveModeForDisplayId(int64_t display_id, @@ -1493,8 +1493,11 @@ void DisplayManager::UpdateZoomFactor(int64_t display_id, float zoom_factor) { DCHECK(zoom_factor > 0); DCHECK_NE(display_id, kInvalidDisplayId); + auto iter = display_info_.find(display_id); + if (iter == display_info_.end()) + return; - display_zoom_factors_[display_id] = zoom_factor; + iter->second.set_zoom_factor(zoom_factor); for (const auto& display : active_display_list_) { if (display.id() == display_id) { @@ -1505,14 +1508,6 @@ } #endif -float DisplayManager::GetZoomFactorForDisplay(int64_t display_id) const { - // If there is no entry for the given display id, then the zoom factor is - // still at its default level of 100% zoom. - if (!base::ContainsKey(display_zoom_factors_, display_id)) - return 1.f; - return display_zoom_factors_.at(display_id); -} - void DisplayManager::SetDefaultMultiDisplayModeForCurrentDisplays( MultiDisplayMode mode) { DCHECK_NE(MIRRORING, mode); @@ -1619,10 +1614,11 @@ if (!GetActiveModeForDisplayId(display_id, &display_mode)) return false; const std::vector<double> zooms = GetDisplayZoomFactors(display_mode); - const double current_display_zoom = - base::ContainsKey(display_zoom_factors_, display_id) - ? display_zoom_factors_[display_id] - : 1.f; + auto iter = display_info_.find(display_id); + if (iter == display_info_.end()) + return false; + + const double current_display_zoom = iter->second.zoom_factor(); // Find the index of |current_display_zoom| in |zooms|. The nearest value is // used if the exact match is not found. @@ -1642,7 +1638,7 @@ if (next_zoom_idx < 0 || next_zoom_idx >= zooms.size()) return false; - display_zoom_factors_[display_id] = zooms[next_zoom_idx]; + iter->second.set_zoom_factor(zooms[next_zoom_idx]); UpdateDisplays(); return true; #else @@ -1652,10 +1648,11 @@ void DisplayManager::ResetDisplayZoom(int64_t display_id) { DCHECK(!IsInUnifiedMode()); - if (!base::ContainsKey(display_zoom_factors_, display_id)) + auto iter = display_info_.find(display_id); + if (iter == display_info_.end()) return; - if (std::abs(display_zoom_factors_[display_id] - 1.f) > 0.001) { - display_zoom_factors_[display_id] = 1.f; + if (std::abs(iter->second.zoom_factor() - 1.f) > 0.001) { + iter->second.set_zoom_factor(1.f); UpdateDisplays(); } } @@ -2026,9 +2023,6 @@ gfx::Rect bounds_in_native(display_info.size_in_pixel()); float device_scale_factor = display_info.GetEffectiveDeviceScaleFactor(); - // Apply the zoom factor for the display. - device_scale_factor *= GetZoomFactorForDisplay(id); - // Simply set the origin to (0,0). The primary display's origin is // always (0,0) and the bounds of non-primary display(s) will be updated // in |UpdateNonPrimaryDisplayBoundsForLayout| called in |UpdateDisplay|.
diff --git a/ui/display/manager/display_manager.h b/ui/display/manager/display_manager.h index 98dfdeb0..6de527a 100644 --- a/ui/display/manager/display_manager.h +++ b/ui/display/manager/display_manager.h
@@ -445,8 +445,6 @@ base::Optional<TouchDeviceIdentifier> touch_device_identifier); void UpdateZoomFactor(int64_t display_id, float zoom_factor); #endif - // Returns the zoom foactor for the display identified by |display_id|. - float GetZoomFactorForDisplay(int64_t display_id) const; // Sets/gets default multi display mode. void SetDefaultMultiDisplayModeForCurrentDisplays(MultiDisplayMode mode); @@ -617,9 +615,6 @@ // Selected display modes for displays. Key is the displays' ID. std::map<int64_t, ManagedDisplayMode> display_modes_; - // Zoom level for each display. - std::map<int64_t, float> display_zoom_factors_; - // When set to true, the host window's resize event updates the display's // size. This is set to true when running on desktop environment (for // debugging) so that resizing the host window will update the display
diff --git a/ui/display/manager/managed_display_info.cc b/ui/display/manager/managed_display_info.cc index 50177e42..ff3c119c 100644 --- a/ui/display/manager/managed_display_info.cc +++ b/ui/display/manager/managed_display_info.cc
@@ -267,6 +267,7 @@ device_scale_factor_(1.0f), device_dpi_(kDpi96), overscan_insets_in_dip_(0, 0, 0, 0), + zoom_factor_(1.f), configured_ui_scale_(1.0f), native_(false), is_aspect_preserving_scaling_(false), @@ -284,6 +285,7 @@ device_scale_factor_(1.0f), device_dpi_(kDpi96), overscan_insets_in_dip_(0, 0, 0, 0), + zoom_factor_(1.f), configured_ui_scale_(1.0f), native_(false), is_aspect_preserving_scaling_(false), @@ -345,6 +347,7 @@ overscan_insets_in_dip_ = native_info.overscan_insets_in_dip_; rotations_ = native_info.rotations_; + zoom_factor_ = native_info.zoom_factor_; configured_ui_scale_ = native_info.configured_ui_scale_; } @@ -362,10 +365,10 @@ float ManagedDisplayInfo::GetEffectiveDeviceScaleFactor() const { if (Display::IsInternalDisplayId(id_) && device_scale_factor_ == 1.25f) - return (configured_ui_scale_ == 0.8f) ? 1.25f : 1.0f; + return ((configured_ui_scale_ == 0.8f) ? 1.25f : 1.0f) * zoom_factor_; if (device_scale_factor_ == configured_ui_scale_) - return 1.0f; - return device_scale_factor_; + return zoom_factor_; + return device_scale_factor_ * zoom_factor_; } float ManagedDisplayInfo::GetEffectiveUIScale() const { @@ -400,7 +403,7 @@ } gfx::Insets ManagedDisplayInfo::GetOverscanInsetsInPixel() const { - return overscan_insets_in_dip_.Scale(device_scale_factor_); + return overscan_insets_in_dip_.Scale(device_scale_factor_ * zoom_factor_); } void ManagedDisplayInfo::SetManagedDisplayModes( @@ -423,9 +426,9 @@ std::string result = base::StringPrintf( "ManagedDisplayInfo[%lld] native bounds=%s, size=%s, device-scale=%g, " - "overscan=%s, rotation=%d, ui-scale=%g, touchscreen=%s, ", + "display-zoom=%g, overscan=%s, rotation=%d, ui-scale=%g, touchscreen=%s", static_cast<long long int>(id_), bounds_in_native_.ToString().c_str(), - size_in_pixel_.ToString().c_str(), device_scale_factor_, + size_in_pixel_.ToString().c_str(), device_scale_factor_, zoom_factor_, overscan_insets_in_dip_.ToString().c_str(), rotation_degree, configured_ui_scale_, touch_support_ == Display::TouchSupport::AVAILABLE
diff --git a/ui/display/manager/managed_display_info.h b/ui/display/manager/managed_display_info.h index 54aa051d..f09dd59 100644 --- a/ui/display/manager/managed_display_info.h +++ b/ui/display/manager/managed_display_info.h
@@ -147,6 +147,9 @@ float device_scale_factor() const { return device_scale_factor_; } void set_device_scale_factor(float scale) { device_scale_factor_ = scale; } + float zoom_factor() const { return zoom_factor_; } + void set_zoom_factor(float zoom_factor) { zoom_factor_ = zoom_factor; } + // Gets/Sets the device DPI of the display. float device_dpi() const { return device_dpi_; } void set_device_dpi(float dpi) { device_dpi_ = dpi; } @@ -297,6 +300,11 @@ gfx::Size size_in_pixel_; gfx::Insets overscan_insets_in_dip_; + // The zoom level currently applied to the display. This value is appended + // multiplicatively to the device scale factor to get the effecting scaling + // for a display. + float zoom_factor_; + // The pixel scale of the display. This is used to simply expand (or shrink) // the desktop over the native display resolution (useful in HighDPI display). // Note that this should not be confused with the device scale factor, which
diff --git a/ui/latency/BUILD.gn b/ui/latency/BUILD.gn index 093ad755..49055f2 100644 --- a/ui/latency/BUILD.gn +++ b/ui/latency/BUILD.gn
@@ -16,6 +16,8 @@ "latency_info.h", "latency_tracker.cc", "latency_tracker.h", + "windowed_analyzer.cc", + "windowed_analyzer.h", ] deps = [ @@ -46,6 +48,7 @@ "histograms_test_common.h", "histograms_unittest.cc", "latency_info_unittest.cc", + "windowed_analyzer_unittest.cc", ] deps = [
diff --git a/ui/latency/fixed_point.h b/ui/latency/fixed_point.h index b7724a4..7e36bc9 100644 --- a/ui/latency/fixed_point.h +++ b/ui/latency/fixed_point.h
@@ -21,7 +21,8 @@ // kFixedPointRootMultiplier is used to shift the bits before taking the square // root and undoing that shift after squaring in the SMR calculation. -constexpr int64_t kFixedPointRootMultiplier{1LL << 32}; +constexpr int kFixedPointRootShift = 32; +constexpr int64_t kFixedPointRootMultiplier{1LL << kFixedPointRootShift}; // We need a huge range to accumulate values for RMS calculations, which // need double the range internally compared to the range we are targeting @@ -53,6 +54,15 @@ uint32_t ls32b{0}; }; +// Convenience function overloads for AsDouble, to help with templated code. +inline double AsDouble(const Accumulator96b& value) { + return value.ToDouble(); +} + +inline double AsDouble(double value) { + return value; +} + } // namespace frame_metrics } // namespace ui
diff --git a/ui/latency/windowed_analyzer.cc b/ui/latency/windowed_analyzer.cc new file mode 100644 index 0000000..9473f57 --- /dev/null +++ b/ui/latency/windowed_analyzer.cc
@@ -0,0 +1,140 @@ +// 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 "ui/latency/windowed_analyzer.h" + +namespace ui { + +void FrameRegionResult::AsValueInto( + base::trace_event::TracedValue* state) const { + state->SetDouble("value", value); + state->SetDouble("start", window_begin.since_origin().InMillisecondsF()); + state->SetDouble("duration", (window_end - window_begin).InMillisecondsF()); +} + +namespace frame_metrics { + +WindowedAnalyzer::WindowedAnalyzer( + const WindowedAnalyzerClient* client, + const SharedWindowedAnalyzerClient* shared_client) + : client_(client), shared_client_(shared_client) { + window_queue_.reserve(shared_client->max_window_size); +} + +WindowedAnalyzer::~WindowedAnalyzer() = default; + +void WindowedAnalyzer::AddSample(uint32_t value, + uint32_t weight, + uint64_t weighted_value, + uint64_t weighted_root, + const Accumulator96b& weighted_square) { + DCHECK_GT(weight, 0u); + DCHECK_EQ(weighted_value, static_cast<uint64_t>(weight) * value); + + // Remove old values from the accumulators. + if (window_queue_.size() >= shared_client_->max_window_size) { + const uint32_t old_value = window_queue_.front().value; + const uint32_t old_weight = window_queue_.front().weight; + window_queue_.pop_front(); + + // Re-calculate some of the old values here. Although squared and root are + // passed in, we've only stored the original value to reduce memory usage. + total_weight_ -= old_weight; + accumulator_ -= static_cast<uint64_t>(old_weight) * old_value; + // Casting the whole rhs is important to ensure rounding happens at a place + // equivalent to when it was added. + root_accumulator_ -= static_cast<uint64_t>( + old_weight * + std::sqrt(static_cast<uint64_t>(old_value) << kFixedPointRootShift)); + square_accumulator_.Subtract(Accumulator96b(old_value, old_weight)); + } + + // Verify overflow isn't an issue. + // square_accumulator_ has DCHECKs internally, so we don't worry about + // checking that here. + DCHECK_LT(weighted_value, + std::numeric_limits<decltype(accumulator_)>::max() - accumulator_); + DCHECK_LT(weighted_root, + std::numeric_limits<decltype(root_accumulator_)>::max() - + root_accumulator_); + DCHECK_LT(weight, std::numeric_limits<decltype(total_weight_)>::max() - + total_weight_); + + window_queue_.push_back({value, weight}); + total_weight_ += weight; + accumulator_ += weighted_value; + root_accumulator_ += weighted_root; + square_accumulator_.Add(weighted_square); + if (window_queue_.size() >= shared_client_->max_window_size) { + bool initialize_results = !results_; + if (initialize_results) + results_.emplace(); + UpdateWorst(accumulator_, &results_->mean, initialize_results); + UpdateWorst(root_accumulator_, &results_->root, initialize_results); + UpdateWorst(square_accumulator_, &results_->square, initialize_results); + } +} + +FrameRegionResult WindowedAnalyzer::WorstMean() const { + FrameRegionResult result; + if (results_) { + result = results_->mean; + } else { + UpdateWorst(accumulator_, &result, true); + } + result.value = client_->TransformResult(result.value); + return result; +} + +FrameRegionResult WindowedAnalyzer::WorstRMS() const { + FrameRegionResult result; + if (results_) { + result = results_->square; + } else { + UpdateWorst(square_accumulator_, &result, true); + } + result.value = client_->TransformResult(std::sqrt(result.value)); + return result; +} + +FrameRegionResult WindowedAnalyzer::WorstSMR() const { + FrameRegionResult result; + if (results_) { + result = results_->root; + } else { + UpdateWorst(root_accumulator_, &result, true); + } + result.value = client_->TransformResult((result.value * result.value) / + kFixedPointRootMultiplier); + return result; +} + +void WindowedAnalyzer::AsValueInto( + base::trace_event::TracedValue* state) const { + FrameRegionResult region; + + region = WorstMean(); + state->BeginDictionary("worst_mean"); + region.AsValueInto(state); + state->EndDictionary(); + + region = WorstSMR(); + state->BeginDictionary("worst_smr"); + region.AsValueInto(state); + state->EndDictionary(); + + region = WorstRMS(); + state->BeginDictionary("worst_rms"); + region.AsValueInto(state); + state->EndDictionary(); +} + +void WindowedAnalyzer::ResetWorstValues() { + // Reset the worst windows, but not the current window history so that we + // don't lose coverage at the reset boundaries. + results_.reset(); +} + +} // namespace frame_metrics +} // namespace ui
diff --git a/ui/latency/windowed_analyzer.h b/ui/latency/windowed_analyzer.h new file mode 100644 index 0000000..1c0786a --- /dev/null +++ b/ui/latency/windowed_analyzer.h
@@ -0,0 +1,143 @@ +// 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_LATENCY_WINDOWED_ANALYZER_H_ +#define UI_LATENCY_WINDOWED_ANALYZER_H_ + +#include <cstdint> + +#include "base/containers/circular_deque.h" +#include "base/macros.h" +#include "base/optional.h" +#include "base/time/time.h" +#include "base/trace_event/trace_event_argument.h" +#include "ui/latency/fixed_point.h" + +namespace ui { + +// FrameRegionResult encodes window of time where a metric was worst. +// The |sample_count| is the number of samples/frames within the time window +// used to calculate the result. It is reported in case the client wants to +// assess the confidence of the result. +struct FrameRegionResult { + double value = 0; + size_t sample_count = 0; + base::TimeTicks window_begin; + base::TimeTicks window_end; + + void AsValueInto(base::trace_event::TracedValue* state) const; +}; + +namespace frame_metrics { + +// Client delegates that are specific to each WindowedAnalyzer. +class WindowedAnalyzerClient { + public: + // The WorstMean,RMS,SMR methods will give TransformResult() a chance to + // modify the results via this delegate. + // This can be used to undo any tranformations applied to values added + // to AddSample, such as conversions to fixed point. + virtual double TransformResult(double result) const = 0; + + // TODO(brianderson): Replace WindowedAnalyzer::window_queue_ with a client + // interface here. All latency derived metrics should be able to share a + // common history of values. http://crbug.com/822054 +}; + +// Client delegates that can be shared by multiple WindowedAnalyzers. +// Tracks the current window of time that can be stored as the worst +// window of time if a metric detects it as such. +struct SharedWindowedAnalyzerClient { + // Maximum window size in number of samples. + size_t max_window_size; + + // Current window of time for the samples being added. + base::TimeTicks window_begin; + base::TimeTicks window_end; +}; + +// Detects the worst windows of time for a metric. +// Tracks the current values of the current window of time for the +// mean, RMS, and SMR of a single metric. It maintains a history +// of the recent samples and, for each new sample, updates it's accumulators +// using the oldest and newest samples, without looking at any of the other +// samples in between. +class WindowedAnalyzer { + public: + WindowedAnalyzer(const WindowedAnalyzerClient* client, + const SharedWindowedAnalyzerClient* shared_client); + virtual ~WindowedAnalyzer(); + + // Callers of AddSample will already have calculated weighted values to + // track cumulative results, so just let them pass in the values here + // rather than re-calculating them. + void AddSample(uint32_t value, + uint32_t weight, + uint64_t weighted_value, + uint64_t weighted_root, + const Accumulator96b& weighted_square); + + // Returns the worst regions encountered so far. + FrameRegionResult WorstMean() const; + FrameRegionResult WorstRMS() const; + FrameRegionResult WorstSMR() const; + + void AsValueInto(base::trace_event::TracedValue* state) const; + + void ResetWorstValues(); + + protected: + struct QueueEntry { + uint32_t value = 0; + uint32_t weight = 0; + }; + + // Updates the result with the current value, if it is worse than the + // value in |result| or if |initialize| is true. + template <typename AccumulatorT> + void UpdateWorst(const AccumulatorT& accumulator, + FrameRegionResult* result, + bool initialize) const { + double current_mean = AsDouble(accumulator) / total_weight_; + if (initialize || current_mean > result->value) { + result->value = current_mean; + result->sample_count = window_queue_.size(); + result->window_begin = shared_client_->window_begin; + result->window_end = shared_client_->window_end; + } + } + + const WindowedAnalyzerClient* const client_; + const SharedWindowedAnalyzerClient* const shared_client_; + + // We need to maintain a history of values so we can + // remove old samples from the accumulators. + base::circular_deque<QueueEntry> window_queue_; + + uint64_t total_weight_ = 0; + uint64_t accumulator_ = 0; + uint64_t root_accumulator_ = 0; + Accumulator96b square_accumulator_; + + // Internal results that track the worst region so far. + // The time region is stored correctly, however the results are intermediate + // and must be adjusted by result_transform_ and fixed_point_multipler before + // exposure to the client. Furthermore, RMS needs to square root the result + // and SMR needs to square the result. + struct InternalResults { + FrameRegionResult mean; + FrameRegionResult root; + FrameRegionResult square; + }; + // Optional since they aren't valid until we've seen enough samples. + // This delay prevents the first couple samples from dominating the result. + base::Optional<InternalResults> results_; + + DISALLOW_COPY_AND_ASSIGN(WindowedAnalyzer); +}; + +} // namespace frame_metrics +} // namespace ui + +#endif // UI_LATENCY_WINDOWED_ANALYZER_H_
diff --git a/ui/latency/windowed_analyzer_unittest.cc b/ui/latency/windowed_analyzer_unittest.cc new file mode 100644 index 0000000..5c6bd87 --- /dev/null +++ b/ui/latency/windowed_analyzer_unittest.cc
@@ -0,0 +1,542 @@ +// 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 "ui/latency/windowed_analyzer.h" + +#include "base/time/time.h" +#include "testing/gtest/include/gtest/gtest.h" + +// Some convenience macros for checking expected error. +#define EXPECT_ABS_LT(a, b) EXPECT_LT(std::abs(a), std::abs(b)) +#define EXPECT_ABS_LE(a, b) EXPECT_LE(std::abs(a), std::abs(b)) +#define EXPECT_NEAR_SMR(expected, actual, weight) \ + EXPECT_NEAR(expected, actual, MaxErrorSMR(expected, weight)) + +namespace ui { +namespace frame_metrics { +namespace { + +// A simple client to verify it is actually used. +class TestWindowedAnalyzerClient : public WindowedAnalyzerClient { + public: + double TransformResult(double result) const override { + return result * result_scale; + } + + static constexpr double result_scale = 2.0; +}; + +// The WindowedAnalyzer expects the caller to give it some precomputed values, +// even though they are redundant. Precompute them with a helper function to +// remove boilerplate. +template <typename AnalyzerType> +void AddSamplesHelper(AnalyzerType* analyzer, + uint64_t value, + uint64_t weight, + size_t iterations) { + DCHECK_LE(value, std::numeric_limits<uint32_t>::max()); + DCHECK_LE(weight, std::numeric_limits<uint32_t>::max()); + uint64_t weighted_value = weight * value; + uint64_t weighted_root = weight * std::sqrt(value << kFixedPointRootShift); + Accumulator96b weighted_square(value, weight); + for (size_t i = 0; i < iterations; i++) { + analyzer->AddSample(value, weight, weighted_value, weighted_root, + weighted_square); + } +} + +// Moves the |shared_client|'s window forward in time by 1 microsecond and +// adds all of the elements in |values| multipled by kFixedPointMultiplier. +template <typename AnalyzerType> +void AddPatternHelper(SharedWindowedAnalyzerClient* shared_client, + AnalyzerType* analyzer, + const std::vector<uint32_t>& values, + const uint32_t weight) { + for (auto i : values) { + shared_client->window_begin += base::TimeDelta::FromMicroseconds(1); + shared_client->window_end += base::TimeDelta::FromMicroseconds(1); + AddSamplesHelper(analyzer, i * kFixedPointMultiplier, weight, 1); + } +} + +// Same as AddPatternHelper, but uses each value (+1) as its own weight. +// The "Cubed" name comes from the fact that the squared_accumulator +// for the RMS will effectively be a "cubed accumulator". +template <typename AnalyzerType> +void AddCubedPatternHelper(SharedWindowedAnalyzerClient* shared_client, + AnalyzerType* analyzer, + const std::vector<uint32_t>& values) { + for (auto i : values) { + shared_client->window_begin += base::TimeDelta::FromMicroseconds(1); + shared_client->window_end += base::TimeDelta::FromMicroseconds(1); + // weight is i+1 to avoid divide by zero. + AddSamplesHelper(analyzer, i, i + 1, 1); + } +} + +// Mean and RMS can be exact for most values, however SMR loses a bit of +// precision internally when accumulating the roots. Make sure the SMR +// precision is at least within .5 (i.e. rounded to the nearest integer +// properly), or 8 decimal places if that is less precise. +// When used with kFixedPointMultiplier, this gives us a total precision of +// between ~5 and ~13 decimal places. +// The precicion should be even better when the sample's |weight| > 1 since +// the implementation should only do any rounding after scaling by weight. +double MaxErrorSMR(double expected_value, uint64_t weight) { + return std::max(.5, 1e-8 * expected_value / weight); +} + +// Verify that the worst values for Mean, SMR, and RMS are all the same if +// every value added is the same. Makes for a nice sanity check. +TEST(FrameMetricsWindowedAnalyzerTest, AllResultsTheSame) { + // For this test, we don't care about the timeline, so just keep it constant. + TestWindowedAnalyzerClient client; + SharedWindowedAnalyzerClient shared_client{ + 60, base::TimeTicks(), + base::TimeTicks() + base::TimeDelta::FromSeconds(1)}; + + // Try adding a single sample vs. multiple samples. + for (size_t samples : {1u, 100u}) { + // A power of 2 sweep for both the value and weight dimensions. + for (uint64_t value = 1; value < 0x100000000; value *= 2) { + // Adding too many samples can result in overflow when multiplied by the + // weight. Divide by samples to avoid overflow. + for (uint64_t weight = 1; weight < 0x100000000 / samples; weight *= 2) { + WindowedAnalyzer analyzer(&client, &shared_client); + AddSamplesHelper(&analyzer, value, weight, samples); + uint64_t expected_value = + value * TestWindowedAnalyzerClient::result_scale; + EXPECT_EQ(analyzer.WorstMean().value, expected_value) + << value << " x " << weight; + EXPECT_EQ(analyzer.WorstRMS().value, expected_value) + << value << " x " << weight; + EXPECT_NEAR_SMR(analyzer.WorstSMR().value, expected_value, weight) + << value << " x " << weight; + } + } + } + + // All min/max combinations of value and weight. + for (uint64_t value : {0u, 0xFFFFFFFFu}) { + for (uint64_t weight : {1u, 0xFFFFFFFFu}) { + const size_t kSamplesToAdd = weight == 1 ? 100 : 1; + WindowedAnalyzer analyzer(&client, &shared_client); + AddSamplesHelper(&analyzer, value, weight, kSamplesToAdd); + + // TestWindowedAnalyzerClient scales the result by 2. + uint64_t expected_value = + value * TestWindowedAnalyzerClient::result_scale; + // Makes sure our precision is good enough. + EXPECT_EQ(analyzer.WorstMean().value, expected_value) + << value << " x " << weight; + EXPECT_EQ(analyzer.WorstRMS().value, expected_value) + << value << " x " << weight; + EXPECT_NEAR_SMR(analyzer.WorstSMR().value, expected_value, weight) + << value << " x " << weight; + } + } +} + +// Verify that the worst values and their time regions are properly tracked +// seperately for mean, SMR, and RMS. +TEST(FrameMetricsWindowedAnalyzerTest, AllResultsDifferent) { + const size_t kMaxWindowSize = 6; // Same as the pattern length. + const uint32_t kSampleWeight = 100; + + TestWindowedAnalyzerClient client; + SharedWindowedAnalyzerClient shared_client{ + kMaxWindowSize, base::TimeTicks(), + base::TimeTicks() + base::TimeDelta::FromSeconds(1)}; + WindowedAnalyzer analyzer(&client, &shared_client); + + // Used to "clear" all the windowed accumulators. + const std::vector<uint32_t> pattern_clear = {0, 0, 0, 0, 0, 0}; + // Worst mean pattern: mean of 3, smr of 1.5, rms of ~4.2. + const std::vector<uint32_t> pattern_max_mean = {0, 6, 0, 6, 0, 6}; + double expected_worst_mean = + 3 * kFixedPointMultiplier * TestWindowedAnalyzerClient::result_scale; + // Lots of small janks maximizes the SMR. + // Worst SMR pattern: mean of 2, smr of 2, rms of 2. + const std::vector<uint32_t> pattern_max_smr = {2, 2, 2, 2, 2, 2}; + double expected_worst_smr = + 2 * kFixedPointMultiplier * TestWindowedAnalyzerClient::result_scale; + // A few big janks dominate RMS. + // Worst RMS pattern: Mean of 2, smr of ~.3, rms of ~4.9 + const std::vector<uint32_t> pattern_max_rms = {0, 0, 0, 0, 0, 12}; + double expected_worst_rms = std::sqrt((12 * 12) / 6) * kFixedPointMultiplier * + TestWindowedAnalyzerClient::result_scale; + + AddPatternHelper(&shared_client, &analyzer, pattern_clear, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_max_mean, kSampleWeight); + SharedWindowedAnalyzerClient worst_mean_client = shared_client; + + AddPatternHelper(&shared_client, &analyzer, pattern_clear, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_max_smr, kSampleWeight); + SharedWindowedAnalyzerClient worst_smr_client = shared_client; + + AddPatternHelper(&shared_client, &analyzer, pattern_clear, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_max_rms, kSampleWeight); + SharedWindowedAnalyzerClient worst_rms_client = shared_client; + + // If there is a tie, the first window detected wins. + // This can go wrong if there's any accumulation of error because the + // values added aren't exactly the same as the values removed. + // This only catches accumulation of error in one direction, so isn't + // thorough, but it does help improve coverage. + AddPatternHelper(&shared_client, &analyzer, pattern_clear, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_max_mean, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_clear, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_max_smr, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_clear, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_max_rms, kSampleWeight); + AddPatternHelper(&shared_client, &analyzer, pattern_clear, kSampleWeight); + + FrameRegionResult worst_mean = analyzer.WorstMean(); + EXPECT_DOUBLE_EQ(expected_worst_mean, worst_mean.value); + EXPECT_EQ(worst_mean_client.window_begin, worst_mean.window_begin); + EXPECT_EQ(worst_mean_client.window_end, worst_mean.window_end); + + FrameRegionResult worst_smr = analyzer.WorstSMR(); + EXPECT_NEAR_SMR(expected_worst_smr, worst_smr.value, kSampleWeight); + EXPECT_EQ(worst_smr_client.window_begin, worst_smr.window_begin); + EXPECT_EQ(worst_smr_client.window_end, worst_smr.window_end); + + FrameRegionResult worst_rms = analyzer.WorstRMS(); + EXPECT_DOUBLE_EQ(expected_worst_rms, worst_rms.value); + EXPECT_EQ(worst_rms_client.window_begin, worst_rms.window_begin); + EXPECT_EQ(worst_rms_client.window_end, worst_rms.window_end); +} + +// Verify that the worst values and their time regions are properly tracked +// even before a full window's worth is available. +TEST(FrameMetricsWindowedAnalyzerTest, SmallSampleSize) { + const size_t kMaxWindowSize = 6; // Bigger than the pattern length. + const uint32_t kSampleWeight = 100; + + TestWindowedAnalyzerClient client; + SharedWindowedAnalyzerClient shared_client{ + kMaxWindowSize, base::TimeTicks(), + base::TimeTicks() + base::TimeDelta::FromSeconds(1)}; + WindowedAnalyzer analyzer(&client, &shared_client); + + const std::vector<uint32_t> pattern_short = {2, 2, 2}; + double expected_initial_value = + 2 * kFixedPointMultiplier * TestWindowedAnalyzerClient::result_scale; + AddPatternHelper(&shared_client, &analyzer, pattern_short, kSampleWeight); + SharedWindowedAnalyzerClient short_client = shared_client; + + FrameRegionResult worst_mean = analyzer.WorstMean(); + EXPECT_DOUBLE_EQ(expected_initial_value, worst_mean.value); + EXPECT_EQ(short_client.window_begin, worst_mean.window_begin); + EXPECT_EQ(short_client.window_end, worst_mean.window_end); + + FrameRegionResult worst_smr = analyzer.WorstSMR(); + EXPECT_NEAR_SMR(expected_initial_value, worst_smr.value, kSampleWeight); + EXPECT_EQ(short_client.window_begin, worst_smr.window_begin); + EXPECT_EQ(short_client.window_end, worst_smr.window_end); + + FrameRegionResult worst_rms = analyzer.WorstRMS(); + EXPECT_DOUBLE_EQ(expected_initial_value, worst_rms.value); + EXPECT_EQ(short_client.window_begin, worst_rms.window_begin); + EXPECT_EQ(short_client.window_end, worst_rms.window_end); +} + +// Verify that a few bad values at the start don't dominate the result. +TEST(FrameMetricsWindowedAnalyzerTest, BadFirstSamples) { + const size_t kMaxWindowSize = 6; + const uint32_t kSampleWeight = 100; + FrameRegionResult worst_mean, worst_smr, worst_rms; + + TestWindowedAnalyzerClient client; + SharedWindowedAnalyzerClient shared_client{ + kMaxWindowSize, base::TimeTicks(), + base::TimeTicks() + base::TimeDelta::FromSeconds(1)}; + WindowedAnalyzer analyzer(&client, &shared_client); + + // The 7's at the start will dominate the result if the implemenationd + // doesn't only start remembering the worst values after receiving at least + // a window's worth of samples. + const std::vector<uint32_t> pattern_short = {7, 7}; + double expected_initial_value = + 7 * kFixedPointMultiplier * TestWindowedAnalyzerClient::result_scale; + AddPatternHelper(&shared_client, &analyzer, pattern_short, kSampleWeight); + SharedWindowedAnalyzerClient short_client = shared_client; + + worst_mean = analyzer.WorstMean(); + EXPECT_DOUBLE_EQ(expected_initial_value, worst_mean.value); + EXPECT_EQ(short_client.window_begin, worst_mean.window_begin); + EXPECT_EQ(short_client.window_end, worst_mean.window_end); + + worst_smr = analyzer.WorstSMR(); + EXPECT_NEAR_SMR(expected_initial_value, worst_smr.value, kSampleWeight); + EXPECT_EQ(short_client.window_begin, worst_smr.window_begin); + EXPECT_EQ(short_client.window_end, worst_smr.window_end); + + worst_rms = analyzer.WorstRMS(); + EXPECT_DOUBLE_EQ(expected_initial_value, worst_rms.value); + EXPECT_EQ(short_client.window_begin, worst_rms.window_begin); + EXPECT_EQ(short_client.window_end, worst_rms.window_end); + + // Clear the window. + const std::vector<uint32_t> pattern_clear = {0, 0, 0, 0, 0, 0}; + AddPatternHelper(&shared_client, &analyzer, pattern_clear, kSampleWeight); + + // Make sure a new worst window with results less than 7 is detected. + const std::vector<uint32_t> pattern_long = {6, 6, 6, 6, 6, 6}; + double expected_final_value = + 6 * kFixedPointMultiplier * TestWindowedAnalyzerClient::result_scale; + AddPatternHelper(&shared_client, &analyzer, pattern_long, kSampleWeight); + SharedWindowedAnalyzerClient long_client = shared_client; + + worst_mean = analyzer.WorstMean(); + EXPECT_DOUBLE_EQ(expected_final_value, worst_mean.value); + EXPECT_EQ(long_client.window_begin, worst_mean.window_begin); + EXPECT_EQ(long_client.window_end, worst_mean.window_end); + + worst_smr = analyzer.WorstSMR(); + EXPECT_NEAR_SMR(expected_final_value, worst_smr.value, kSampleWeight); + EXPECT_EQ(long_client.window_begin, worst_smr.window_begin); + EXPECT_EQ(long_client.window_end, worst_smr.window_end); + + worst_rms = analyzer.WorstRMS(); + EXPECT_DOUBLE_EQ(expected_final_value, worst_rms.value); + EXPECT_EQ(long_client.window_begin, worst_rms.window_begin); + EXPECT_EQ(long_client.window_end, worst_rms.window_end); +} + +// Verify ResetAccumulators is continuous across the reset boundary. +TEST(FrameMetricsWindowedAnalyzerTest, ResetWorstValues) { + const size_t kMaxWindowSize = 6; // Same as the pattern length. + const uint32_t kSampleWeight = 100; + FrameRegionResult worst_mean, worst_smr, worst_rms; + + TestWindowedAnalyzerClient client; + SharedWindowedAnalyzerClient shared_client{ + kMaxWindowSize, base::TimeTicks(), + base::TimeTicks() + base::TimeDelta::FromSeconds(1)}; + WindowedAnalyzer analyzer(&client, &shared_client); + + // Start off with the worst pattern. + const std::vector<uint32_t> pattern1 = {9, 9, 9, 9, 9, 9}; + double expected_initial_value = + 9 * kFixedPointMultiplier * TestWindowedAnalyzerClient::result_scale; + AddPatternHelper(&shared_client, &analyzer, pattern1, kSampleWeight); + SharedWindowedAnalyzerClient initial_client = shared_client; + + worst_mean = analyzer.WorstMean(); + EXPECT_DOUBLE_EQ(expected_initial_value, worst_mean.value); + EXPECT_EQ(initial_client.window_begin, worst_mean.window_begin); + EXPECT_EQ(initial_client.window_end, worst_mean.window_end); + + worst_smr = analyzer.WorstSMR(); + EXPECT_NEAR_SMR(expected_initial_value, worst_smr.value, kSampleWeight); + EXPECT_EQ(initial_client.window_begin, worst_smr.window_begin); + EXPECT_EQ(initial_client.window_end, worst_smr.window_end); + + worst_rms = analyzer.WorstRMS(); + EXPECT_DOUBLE_EQ(expected_initial_value, worst_rms.value); + EXPECT_EQ(initial_client.window_begin, worst_rms.window_begin); + EXPECT_EQ(initial_client.window_end, worst_rms.window_end); + + // The 4's below will affect the window, even after a reset, but + // won't affect the current worst values. + const std::vector<uint32_t> pattern2 = {4, 4, 4, 4, 4, 4}; + AddPatternHelper(&shared_client, &analyzer, pattern2, kSampleWeight); + + worst_mean = analyzer.WorstMean(); + EXPECT_DOUBLE_EQ(expected_initial_value, worst_mean.value); + EXPECT_EQ(initial_client.window_begin, worst_mean.window_begin); + EXPECT_EQ(initial_client.window_end, worst_mean.window_end); + + worst_smr = analyzer.WorstSMR(); + EXPECT_NEAR_SMR(expected_initial_value, worst_smr.value, kSampleWeight); + EXPECT_EQ(initial_client.window_begin, worst_smr.window_begin); + EXPECT_EQ(initial_client.window_end, worst_smr.window_end); + + worst_rms = analyzer.WorstRMS(); + EXPECT_DOUBLE_EQ(expected_initial_value, worst_rms.value); + EXPECT_EQ(initial_client.window_begin, worst_rms.window_begin); + EXPECT_EQ(initial_client.window_end, worst_rms.window_end); + + // Reset the worst value. This should not destroy sample history or + // any accumulators. + analyzer.ResetWorstValues(); + + // The first 4 below will be included with the previous 4's to detect an + // entire window of results, even though we've reset the worst values. + const std::vector<uint32_t> pattern3 = {4}; + double expected_final_value = + 4 * kFixedPointMultiplier * TestWindowedAnalyzerClient::result_scale; + AddPatternHelper(&shared_client, &analyzer, pattern3, kSampleWeight); + SharedWindowedAnalyzerClient final_client = shared_client; + + // Add a window of 1's here to verify it does not affect the window of 4's. + const std::vector<uint32_t> pattern4 = {1, 1, 1, 1, 1, 1}; + AddPatternHelper(&shared_client, &analyzer, pattern4, kSampleWeight); + + worst_mean = analyzer.WorstMean(); + EXPECT_DOUBLE_EQ(expected_final_value, worst_mean.value); + EXPECT_EQ(final_client.window_begin, worst_mean.window_begin); + EXPECT_EQ(final_client.window_end, worst_mean.window_end); + + worst_smr = analyzer.WorstSMR(); + EXPECT_NEAR_SMR(expected_final_value, worst_smr.value, kSampleWeight); + EXPECT_EQ(final_client.window_begin, worst_smr.window_begin); + EXPECT_EQ(final_client.window_end, worst_smr.window_end); + + worst_rms = analyzer.WorstRMS(); + EXPECT_DOUBLE_EQ(expected_final_value, worst_rms.value); + EXPECT_EQ(final_client.window_begin, worst_rms.window_begin); + EXPECT_EQ(final_client.window_end, worst_rms.window_end); +} + +// WindowedAnalyzerNaive is a version of WindowedAnalyzer that doesn't use +// fixed point math and can accumulate error. This is used to verify patterns +// that accumulate error without fixed point math, so we can then verify those +// patterns don't result in acculated error in the actual implementation. +class WindowedAnalyzerNaive { + public: + WindowedAnalyzerNaive(size_t max_window_size) + : max_window_size_(max_window_size) {} + + void AddSample(uint32_t value, + uint32_t weight, + uint64_t weighted_value, + uint64_t weighted_root, + const Accumulator96b& weighted_square) { + if (history_.size() >= max_window_size_) { + Sample old = history_.front(); + history_.pop_front(); + naive_accumulator_ -= static_cast<double>(old.weight) * old.value; + naive_root_accumulator_ -= + static_cast<double>(old.weight) * std::sqrt(old.value); + naive_square_accumulator_ -= + static_cast<double>(old.weight) * old.value * old.value; + naive_total_weight_ -= old.weight; + } + + history_.push_back({value, weight}); + naive_accumulator_ += static_cast<double>(weight) * value; + naive_root_accumulator_ += static_cast<double>(weight) * std::sqrt(value); + naive_square_accumulator_ += static_cast<double>(weight) * value * value; + naive_total_weight_ += weight; + } + + struct Sample { + uint32_t value; + uint32_t weight; + }; + + const size_t max_window_size_; + double naive_accumulator_ = 0; + double naive_root_accumulator_ = 0; + double naive_square_accumulator_ = 0; + double naive_total_weight_ = 0; + base::circular_deque<Sample> history_; +}; + +// A version of the WindowedAnalyzer that allows us to inspect the internal +// state for testing purposes. +class TestWindowedAnalyzer : public WindowedAnalyzer { + public: + TestWindowedAnalyzer(const WindowedAnalyzerClient* client, + const SharedWindowedAnalyzerClient* shared_client) + : WindowedAnalyzer(client, shared_client) {} + ~TestWindowedAnalyzer() override {} + + double CurrentAccumulator() { return accumulator_; } + double CurrentRootAccumulator() { return root_accumulator_; } + double CurrentSquareAccumulator() { return square_accumulator_.ToDouble(); } +}; + +// This test verifies that it's easy to blow the dynamic range of a floating +// point accumulator with a particular pattern. Then it verifies that same +// pattern does not result in error in the actual implementation. +void TestNoAccumulatedPrecisionError(uint32_t big_value, + uint32_t small_value, + double naive_root_error_floor, + double naive_square_error_floor) { + const size_t kRuns = 1000; + const size_t kMaxWindowSize = 6; // Same as the pattern length. + const std::vector<uint32_t> pattern_clear = {0, 0, 0, 0, 0, 0}; + const std::vector<uint32_t> pattern_bad = {big_value, small_value, + small_value, small_value, + small_value, small_value}; + + // Set up the actual WindowedAnalyzer implementation. + TestWindowedAnalyzerClient client_impl; + SharedWindowedAnalyzerClient shared_client_impl{ + kMaxWindowSize, base::TimeTicks(), + base::TimeTicks() + base::TimeDelta::FromSeconds(1)}; + TestWindowedAnalyzer analyzer_impl(&client_impl, &shared_client_impl); + + // Set up the naive WindowedAnalyzer implementation. + SharedWindowedAnalyzerClient shared_client_naive{ + kMaxWindowSize, base::TimeTicks(), + base::TimeTicks() + base::TimeDelta::FromSeconds(1)}; + WindowedAnalyzerNaive analyzer_naive(kMaxWindowSize); + + // Verify error keeps accumulating each time the bad pattern is applied. + // Note: We don't expect error in the mean accumulator since the values added + // are already truncated to whole integers before being passed in via + // AddSamples(). + double naive_root_accumulator_prev = 0; + double naive_square_accumulator_prev = 0; + for (size_t i = 1; i <= kRuns; i++) { + AddCubedPatternHelper(&shared_client_naive, &analyzer_naive, pattern_bad); + AddCubedPatternHelper(&shared_client_naive, &analyzer_naive, pattern_clear); + EXPECT_EQ(0, analyzer_naive.naive_accumulator_); + EXPECT_ABS_LT(naive_root_accumulator_prev, + analyzer_naive.naive_root_accumulator_); + EXPECT_ABS_LT(naive_square_accumulator_prev, + analyzer_naive.naive_square_accumulator_); + naive_root_accumulator_prev = analyzer_naive.naive_root_accumulator_; + naive_square_accumulator_prev = analyzer_naive.naive_square_accumulator_; + } + // Verify naive error is bigger than some threshold after kRuns. + EXPECT_ABS_LE(naive_root_error_floor * kRuns, + analyzer_naive.naive_root_accumulator_); + EXPECT_ABS_LE(naive_square_error_floor * kRuns, + analyzer_naive.naive_square_accumulator_); + + // Verify actual implementation has no error. + for (size_t i = 1; i <= kRuns; i++) { + AddCubedPatternHelper(&shared_client_impl, &analyzer_impl, pattern_bad); + AddCubedPatternHelper(&shared_client_impl, &analyzer_impl, pattern_clear); + EXPECT_EQ(0, analyzer_impl.CurrentAccumulator()); + EXPECT_EQ(0, analyzer_impl.CurrentRootAccumulator()); + EXPECT_EQ(0, analyzer_impl.CurrentSquareAccumulator()); + } +} + +// This is a synthetic example that is just outside the dynamic range of a +// double accumulator. Doubles have 53 significand bits. When cubed, the +// difference between the small and big values below require just over 53 bits. +TEST(FrameMetricsWindowedAnalyzerTest, NoAccumulatedPrecisionErrorBasic) { + constexpr uint32_t big = 1 << 19; + constexpr uint32_t small = 2; + TestNoAccumulatedPrecisionError(big, small, 5e-8, 60); +} + +// This is a more realistic scenario with orders of magnitude we are likely +// to see in actual data. The error is small, but can become significant over +// time. +TEST(FrameMetricsWindowedAnalyzerTest, NoAccumulatedPrecisionErrorBig) { + constexpr uint32_t big = 1 * base::TimeTicks::kMicrosecondsPerSecond; + constexpr uint32_t small = 1 * base::TimeTicks::kMicrosecondsPerMillisecond; + TestNoAccumulatedPrecisionError(big, small, 7e-8, 256); +} + +// This is a scenario with orders of magnitude that we can see in our data, +// but that will be rare. Even after a single bad pattern, the error is +// significant. +TEST(FrameMetricsWindowedAnalyzerTest, NoAccumulatedPrecisionErrorBigger) { + constexpr uint32_t big = 20 * base::TimeTicks::kMicrosecondsPerSecond; + constexpr uint32_t small = 1 * base::TimeTicks::kMicrosecondsPerMillisecond; + TestNoAccumulatedPrecisionError(big, small, 2e-5, 1e6); +} + +} // namespace +} // namespace frame_metrics +} // namespace ui
diff --git a/ui/message_center/public/cpp/notification.cc b/ui/message_center/public/cpp/notification.cc index 0d4df7a7..06e1d23 100644 --- a/ui/message_center/public/cpp/notification.cc +++ b/ui/message_center/public/cpp/notification.cc
@@ -61,7 +61,7 @@ RichNotificationData::~RichNotificationData() = default; -Notification::Notification() = default; +Notification::Notification() : serial_number_(g_next_serial_number++) {} Notification::Notification(NotificationType type, const std::string& id, @@ -83,8 +83,6 @@ notifier_id_(notifier_id), optional_fields_(optional_fields), serial_number_(g_next_serial_number++), - shown_as_popup_(false), - is_read_(false), delegate_(std::move(delegate)) {} Notification::Notification(const std::string& id, const Notification& other)
diff --git a/ui/message_center/public/cpp/notification.h b/ui/message_center/public/cpp/notification.h index 4a8cdd91d..e46692d 100644 --- a/ui/message_center/public/cpp/notification.h +++ b/ui/message_center/public/cpp/notification.h
@@ -506,8 +506,8 @@ // TODO(estade): these book-keeping fields should be moved into // NotificationList. unsigned serial_number_; - bool shown_as_popup_; // True if this has been shown as a popup. - bool is_read_; // True if this has been seen in the message center. + bool shown_as_popup_ = false; // True if this has been shown as a popup. + bool is_read_ = false; // True if this has been seen in the message center. // A proxy object that allows access back to the JavaScript object that // represents the notification, for firing events.
diff --git a/ui/message_center/views/message_popup_collection_unittest.cc b/ui/message_center/views/message_popup_collection_unittest.cc index 648894a..ed2c9ea 100644 --- a/ui/message_center/views/message_popup_collection_unittest.cc +++ b/ui/message_center/views/message_popup_collection_unittest.cc
@@ -18,7 +18,6 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/display/display.h" #include "ui/events/event.h" #include "ui/events/event_constants.h" @@ -30,8 +29,6 @@ #include "ui/message_center/fake_message_center.h" #include "ui/message_center/public/cpp/message_center_constants.h" #include "ui/message_center/views/desktop_popup_alignment_delegate.h" -#include "ui/message_center/views/message_view.h" -#include "ui/message_center/views/slide_out_controller.h" #include "ui/message_center/views/toast_contents_view.h" #include "ui/views/test/views_test_base.h" #include "ui/views/widget/widget.h" @@ -102,8 +99,6 @@ protected: MessagePopupCollection* collection() { return collection_.get(); } - int GetDeferCounter() { return collection_->defer_counter_; } - size_t GetToastCounts() { return collection_->toasts_.size(); } @@ -144,15 +139,6 @@ return NULL; } - void SlideOutToast(const std::string& id) { - ui::ScopedAnimationDurationScaleMode zero_duration_scope( - ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); - ui::GestureEventDetails details(ui::ET_SCROLL_FLING_START, 1000.0f, 0.f); - ui::GestureEvent event(0, 0, ui::EF_NONE, ui::EventTimeForNow(), details); - static_cast<MessageView*>(GetToast(id)->child_at(0)) - ->slide_out_controller_.OnGestureEvent(&event); - } - std::string AddNotification() { std::string id = base::IntToString(id_++); std::unique_ptr<Notification> notification = std::make_unique<Notification>( @@ -836,18 +822,5 @@ } #endif -TEST_F(MessagePopupCollectionTest, RemoveBySlide) { - std::string id = AddNotification(); - WaitForTransitionsDone(); - EXPECT_EQ(0, GetDeferCounter()); - EXPECT_EQ(1u, GetToastCounts()); - - SlideOutToast(id); - WaitForTransitionsDone(); - - EXPECT_EQ(0, GetDeferCounter()); - EXPECT_EQ(0u, GetToastCounts()); -} - } // namespace test } // namespace message_center
diff --git a/ui/message_center/views/message_view.cc b/ui/message_center/views/message_view.cc index afdfd5cc..e3a8cf84 100644 --- a/ui/message_center/views/message_view.cc +++ b/ui/message_center/views/message_view.cc
@@ -284,7 +284,7 @@ notification_id_, true /* mark_notification_as_read */); } else { MessageCenter::Get()->RemoveNotification(notification_id_, - false /* by_user */); + true /* by_user */); } }
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc index de661e98..7cfd083 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
@@ -117,11 +117,6 @@ [](const OverlayPlane& l, const OverlayPlane& r) { return l.z_order < r.z_order; }); - if (pending_planes.front().z_order < 0) { - std::move(callback).Run(gfx::SwapResult::SWAP_FAILED, - gfx::PresentationFeedback()); - return false; - } scoped_refptr<PageFlipRequest> page_flip_request = new PageFlipRequest(crtc_controllers_.size(), std::move(callback));
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc index afc1acf..7bb100e 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
@@ -218,7 +218,7 @@ EXPECT_EQ(2, drm_->get_overlay_flip_call_count()); } -TEST_F(HardwareDisplayControllerTest, RejectUnderlays) { +TEST_F(HardwareDisplayControllerTest, AcceptUnderlays) { ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( new ui::MockScanoutBuffer(kDefaultModeSize)), base::kInvalidPlatformFile); @@ -237,7 +237,8 @@ controller_->SchedulePageFlip( planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, base::Unretained(this))); - EXPECT_EQ(gfx::SwapResult::SWAP_FAILED, last_swap_result_); + drm_->RunCallbacks(); + EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); EXPECT_EQ(1, page_flips_); }
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb index b886fb6..0278c30 100644 --- a/ui/strings/translations/ui_strings_vi.xtb +++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -7,7 +7,7 @@ <translation id="1169783199079129864">{MINUTES,plural, =1{1 phút}other{# phút}}</translation> <translation id="1243314992276662751">Tải lên</translation> <translation id="1293699935367580298">Thoát</translation> -<translation id="1306549533752902673">ỨNG DỤNG ĐƯỢC ĐỀ XUẤT</translation> +<translation id="1306549533752902673">ỨNG DỤNG ĐỀ XUẤT</translation> <translation id="1368832886055348810">Trái sang Phải</translation> <translation id="1398853756734560583">Phóng to</translation> <translation id="1413622004203049571">Tắt thông báo từ <ph name="NOTIFIER_NAME" /></translation> @@ -169,7 +169,7 @@ <translation id="9044832324875206639">{SECONDS,plural, =1{1 giây}other{# giây}}</translation> <translation id="9059834730836941392">Thu gọn thông báo</translation> <translation id="9150735707954472829">Tab</translation> -<translation id="9161053988251441839">ỨNG DỤNG ĐƯỢC ĐỀ XUẤT</translation> +<translation id="9161053988251441839">ỨNG DỤNG ĐỀ XUẤT</translation> <translation id="9170848237812810038">H&oàn tác</translation> <translation id="932327136139879170">Trang chủ</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index f5db821..8ecb7bea 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -8,6 +8,7 @@ #include <utility> +#include "base/command_line.h" #import "base/mac/bind_objc_block.h" #include "base/mac/foundation_util.h" #include "base/mac/scoped_nsobject.h" @@ -16,6 +17,7 @@ #include "components/crash/core/common/crash_key.h" #import "ui/base/cocoa/constrained_window/constrained_window_animation.h" #import "ui/base/cocoa/window_size_constants.h" +#include "ui/base/ui_base_switches.h" #include "ui/gfx/font_list.h" #import "ui/gfx/mac/coordinate_conversion.h" #import "ui/gfx/mac/nswindow_frame_controls.h" @@ -46,6 +48,11 @@ namespace views { namespace { +bool AreModalAnimationsEnabled() { + return !base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableModalAnimations); +} + NSInteger StyleMaskForParams(const Widget::InitParams& params) { // If the Widget is modal, it will be displayed as a sheet. This works best if // it has NSTitledWindowMask. For example, with NSBorderlessWindowMask, the @@ -365,7 +372,8 @@ } // For other modal types, animate the close. - if (bridge_->animate() && delegate_->IsModal()) { + if (bridge_->animate() && AreModalAnimationsEnabled() && + delegate_->IsModal()) { [ViewsNSWindowCloseAnimator closeWindowWithAnimation:window]; return; }
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index 8a128820..c42176e9 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -1110,9 +1110,9 @@ gfx::Point cursor_location(location); gfx::Point cursor_root_location(root_location); - ui::MouseWheelEvent wheel_event(offset, cursor_location, cursor_root_location, - base::TimeTicks::Now(), ui::EF_NONE, - ui::EF_PRECISION_SCROLLING_DELTA); + ui::MouseWheelEvent wheel_event( + offset, cursor_location, cursor_root_location, base::TimeTicks::Now(), + ui::EF_PRECISION_SCROLLING_DELTA, ui::EF_NONE); delegate_->HandleMouseEvent(wheel_event); }
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js index 9f7376bb..009b505 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_config.js +++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -1169,6 +1169,9 @@ /** @private */ getPropertiesToSet_: function() { var propertiesToSet = Object.assign({}, this.configProperties_); + // Do not set AutoConnect by default, the connection manager will set + // it to true on a successful connection. + CrOnc.setTypeProperty(propertiesToSet, 'AutoConnect', undefined); if (this.guid) propertiesToSet.GUID = this.guid; var eap = this.getEap_(propertiesToSet);
diff --git a/ui/webui/resources/cr_elements/chromeos/network/cr_onc_types.js b/ui/webui/resources/cr_elements/chromeos/network/cr_onc_types.js index 207a9c43..bab6ac8 100644 --- a/ui/webui/resources/cr_elements/chromeos/network/cr_onc_types.js +++ b/ui/webui/resources/cr_elements/chromeos/network/cr_onc_types.js
@@ -499,7 +499,8 @@ * @param {!chrome.networkingPrivate.NetworkConfigProperties} properties * The ONC property dictionary to modify. * @param {string} key The property key which may be nested, e.g. 'Foo.Bar'. - * @param {!CrOnc.NetworkPropertyType} value The property value to set. + * @param {!CrOnc.NetworkPropertyType|undefined} value The property value to + * set. If undefined the property will be removed. */ CrOnc.setProperty = function(properties, key, value) { while (true) { @@ -512,7 +513,10 @@ properties = properties[keyComponent]; key = key.substr(index + 1); } - properties[key] = value; + if (value === undefined) + delete properties[key]; + else + properties[key] = value; }; /** @@ -520,7 +524,8 @@ * @param {!chrome.networkingPrivate.NetworkConfigProperties} properties The * ONC properties to set. properties.Type must be set already. * @param {string} key The type property key, e.g. 'AutoConnect'. - * @param {!CrOnc.NetworkPropertyType} value The property value to set. + * @param {!CrOnc.NetworkPropertyType|undefined} value The property value to + * set. If undefined the property will be removed. */ CrOnc.setTypeProperty = function(properties, key, value) { if (properties.Type == undefined) {
diff --git a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html index 97bb3cc6..f1beac3 100644 --- a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html +++ b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html
@@ -12,12 +12,16 @@ :host { align-items: center; align-self: stretch; + display: block; + flex: 1; + } + + :host > button { background: none; border: none; color: inherit; cursor: pointer; display: flex; - flex: 1; font-family: inherit; font-size: 100%; /* Specifically for Mac OSX, harmless elsewhere. */ line-height: 154%; /* 20px. */ @@ -25,6 +29,7 @@ min-height: var(--cr-section-min-height); outline: none; padding: 0 var(--cr-section-padding); + width: 100%; } :host([disabled]) { @@ -70,15 +75,17 @@ font-weight: 400; } </style> - <div id="outer" noSubLabel$="[[!subLabel]]"> - <div id="labelWrapper" hidden="[[!label]]"> - <div id="label" class="label">[[label]]</div> - <div id="subLabel" class="secondary label">[[subLabel]]</div> + <button disabled="[[disabled]]"> + <div id="outer" noSubLabel$="[[!subLabel]]"> + <div id="labelWrapper" hidden="[[!label]]"> + <div id="label" class="label">[[label]]</div> + <div id="subLabel" class="secondary label">[[subLabel]]</div> + </div> + <slot></slot> + <div id="icon" class$="cr-icon [[iconClass]]" aria-hidden="true"> + </div> </div> - <slot></slot> - <div id="icon" class$="cr-icon [[iconClass]]" aria-hidden="true"> - </div> - </div> + </button> </template> <script src="cr_link_row.js"></script> </dom-module>
diff --git a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.js b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.js index c8f16a67..b9400812 100644 --- a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.js +++ b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.js
@@ -12,7 +12,6 @@ */ Polymer({ is: 'cr-link-row', - extends: 'button', behaviors: [Polymer.PaperRippleBehavior], @@ -26,6 +25,11 @@ /* Value used for noSubLabel attribute. */ value: '', }, + + disabled: { + type: Boolean, + reflectToAttribute: true, + }, }, listeners: {
diff --git a/ui/wm/core/window_util.cc b/ui/wm/core/window_util.cc index 264ea83..d8cbfdc 100644 --- a/ui/wm/core/window_util.cc +++ b/ui/wm/core/window_util.cc
@@ -131,11 +131,6 @@ window->SetProperty( aura::client::kShowStateKey, window->GetProperty(aura::client::kPreMinimizedShowStateKey)); - // Clear the property only when the window is actually unminimized. - if (window->GetProperty(aura::client::kShowStateKey) != - ui::SHOW_STATE_MINIMIZED) { - window->ClearProperty(aura::client::kPreMinimizedShowStateKey); - } } aura::Window* GetActivatableWindow(aura::Window* window) {