diff --git a/BUILD.gn b/BUILD.gn index 86ecdbdd..a149772 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -749,6 +749,7 @@ "//webrunner:archive_sources", "//webrunner:webrunner_unittests", "//webrunner/net_http:http_pkg", + "//webrunner/net_http:http_service_tests", ] }
diff --git a/DEPS b/DEPS index c38bccf..40bd777 100644 --- a/DEPS +++ b/DEPS
@@ -110,11 +110,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': '0c583af06d50cf3a11a39f5804eccdeefd74fc02', + 'skia_revision': '60ad17593c936432927f779e1904da7af1996a7b', # 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': '9d59bf5f48d68b1f6114c2e90c5bb34233d64218', + 'v8_revision': '67ed04489ebf72582ef8f7dd5eeb9d1c369e1afa', # 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. @@ -122,7 +122,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': 'c4765aa782676fd7afb47dff626f57f69534e76f', + 'angle_revision': 'e4c64c3dc862eaff1239cc0378f8eb5cc8103cda', # 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. @@ -134,7 +134,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': 'ec885bad72ef8bae21270d235ae5029ef2bdc134', + 'pdfium_revision': '1ee77bd42da61a91900e669f21d7041c1b8bc3c9', # 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. @@ -170,7 +170,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '1922eb00bbd96108cc21a72e4286d0f913e0e317', + 'catapult_revision': 'cedb2de8832ddfbf4273138a072fa4ed1345fb47', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -328,7 +328,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'f6c357a1718718a576e1b57ef97c8d165b728068', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'd57bd2777a261d3503c745fa5a7e080f9523a676', 'condition': 'checkout_ios', }, @@ -610,7 +610,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '364a0d6bd98c50464e9c3e9d93e06834c27dc84a', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '91031585f0fd75ae7d46dfd6eae5dbfebf7f47a1', 'condition': 'checkout_linux', }, @@ -635,7 +635,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c1e6594df5801603668f4dcea4473c78b08c9223', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '93277a7fc8ef8ad9b5e2f774ea6e2e91c8ed3c9b', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -964,7 +964,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '3f3d4308509c4c837d7c81d9124d44da1e7159e3', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '80c79964c79672ceb2d524a05d8c5cb035b0eac9', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78', @@ -1116,7 +1116,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6d2f3f4cb8bac1f7c4a945c73d07a33df74f22f9', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '78416b6e1851f86a2091b0e06bb906731faa98e5', + Var('webrtc_git') + '/src.git' + '@' + 'aad5d36f95f1285137506e1c31fb96b15e80d4b2', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1147,7 +1147,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@2ec8dc1f8ab8da9b7e74a5826e6d9265b1441e57', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bf9c8d4c233ac64fadeb833af1113478b90d9108', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/tools/cts_config/expected_failure_on_bot.json b/android_webview/tools/cts_config/expected_failure_on_bot.json index 13b84e86..2676171e 100644 --- a/android_webview/tools/cts_config/expected_failure_on_bot.json +++ b/android_webview/tools/cts_config/expected_failure_on_bot.json
@@ -23,6 +23,12 @@ "_bug_id": "crbug.com/777393" } ], + "android.webkit.cts.WebViewClientTest": [ + { + "name": "testShouldOverrideUrlLoadingOnCreateWindow", + "_bug_id": "crbug.com/896857" + } + ], "android.webkit.cts.WebChromeClientTest": [ { "name": "testOnJsBeforeUnloadIsCalled",
diff --git a/ash/app_list/home_launcher_gesture_handler.cc b/ash/app_list/home_launcher_gesture_handler.cc index 5ba8f9f..6bfa337 100644 --- a/ash/app_list/home_launcher_gesture_handler.cc +++ b/ash/app_list/home_launcher_gesture_handler.cc
@@ -42,7 +42,7 @@ // The animation speed at which the window moves when a window is acitvated from // the shelf, or deacitvated via home launcher button minimize. constexpr base::TimeDelta kActivationChangedAnimationDurationMs = - base::TimeDelta::FromMilliseconds(600); + base::TimeDelta::FromMilliseconds(350); // The velocity the app list or shelf must be dragged in order to transition to // the next state regardless of where the gesture ends, measured in DIPs/event. @@ -421,7 +421,8 @@ settings->SetTransitionDuration(IsDragInProgress() ? kAnimationDurationMs : kActivationChangedAnimationDurationMs); - settings->SetTweenType(gfx::Tween::LINEAR); + settings->SetTweenType(IsDragInProgress() ? gfx::Tween::LINEAR + : gfx::Tween::FAST_OUT_SLOW_IN); settings->SetPreemptionStrategy( ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc index 1863ab2..bf456fd 100644 --- a/ash/app_list/views/app_list_item_view.cc +++ b/ash/app_list/views/app_list_item_view.cc
@@ -138,8 +138,7 @@ std::unique_ptr<ui::Layer> old_layer = views::View::RecreateLayer(); // ui::Layer::Clone() does not copy mask layer, so set it explicitly here. - if (mask_corner_radius_ != 0 || !mask_insets_.IsEmpty()) - SetRoundedRectMaskLayer(mask_corner_radius_, mask_insets_); + SetRoundedRectMaskLayer(mask_corner_radius_, mask_insets_); return old_layer; } @@ -163,7 +162,7 @@ std::unique_ptr<ui::LayerOwner> icon_mask_; // The corner radius of mask layer. - int mask_corner_radius_ = 0; + int mask_corner_radius_; // The insets of the mask layer. gfx::Insets mask_insets_; @@ -199,10 +198,8 @@ if (is_new_style_launcher_enabled_ && is_folder_) { // Set background blur for folder icon and use mask layer to clip it into - // circle. Note that blur is only enabled in tablet mode to improve dragging - // smoothness. - if (apps_grid_view_->IsTabletMode()) - SetBackgroundBlurEnabled(true); + // circle. + icon_->layer()->SetBackgroundBlur(AppListConfig::instance().blur_radius()); icon_->SetRoundedRectMaskLayer( AppListConfig::instance().folder_icon_radius(), gfx::Insets(AppListConfig::instance().folder_icon_insets())); @@ -748,12 +745,6 @@ dragged_view_hover_animation_->Hide(); } -void AppListItemView::SetBackgroundBlurEnabled(bool enabled) { - DCHECK(is_folder_); - icon_->layer()->SetBackgroundBlur( - enabled ? AppListConfig::instance().blur_radius() : 0); -} - void AppListItemView::AnimationProgressed(const gfx::Animation* animation) { if (is_folder_) { // Animate the folder icon via changing mask layer's corner radius and
diff --git a/ash/app_list/views/app_list_item_view.h b/ash/app_list/views/app_list_item_view.h index fdf2997..f29c586 100644 --- a/ash/app_list/views/app_list_item_view.h +++ b/ash/app_list/views/app_list_item_view.h
@@ -131,9 +131,6 @@ void OnDraggedViewEnter(); void OnDraggedViewExit(); - // Enables background blur for folder icon if |enabled| is true. - void SetBackgroundBlurEnabled(bool enabled); - private: class IconImageView;
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc index 14e09ee9..2714e4f 100644 --- a/ash/app_list/views/app_list_view.cc +++ b/ash/app_list/views/app_list_view.cc
@@ -1162,7 +1162,6 @@ is_tablet_mode_ = started; search_box_view_->OnTabletModeChanged(started); search_model_->SetTabletMode(started); - GetAppsContainerView()->OnTabletModeChanged(started); if (is_home_launcher_enabled_) { if (!started) {
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc index 0462b618..9fffa38 100644 --- a/ash/app_list/views/apps_container_view.cc +++ b/ash/app_list/views/apps_container_view.cc
@@ -209,12 +209,6 @@ } } -void AppsContainerView::OnTabletModeChanged(bool started) { - if (suggestion_chip_container_view_) - suggestion_chip_container_view_->OnTabletModeChanged(started); - apps_grid_view_->OnTabletModeChanged(started); -} - gfx::Size AppsContainerView::CalculatePreferredSize() const { if (is_new_style_launcher_enabled_) return contents_view_->GetPreferredSize();
diff --git a/ash/app_list/views/apps_container_view.h b/ash/app_list/views/apps_container_view.h index 23f334b..6f9c836c 100644 --- a/ash/app_list/views/apps_container_view.h +++ b/ash/app_list/views/apps_container_view.h
@@ -69,9 +69,6 @@ // Updates y position and opacity of the items in this view during dragging. void UpdateYPositionAndOpacity(); - // Called when tablet mode starts and ends. - void OnTabletModeChanged(bool started); - // views::View overrides: gfx::Size CalculatePreferredSize() const override; void Layout() override;
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index fbb3e61..da29611 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -471,15 +471,6 @@ } } -void AppsGridView::OnTabletModeChanged(bool started) { - // Enable/Disable folder icons's background blur based on tablet mode. - for (int i = 0; i < view_model_.view_size(); ++i) { - auto* item_view = view_model_.view_at(i); - if (item_view->item()->is_folder()) - item_view->SetBackgroundBlurEnabled(started); - } -} - void AppsGridView::SetModel(AppListModel* model) { if (model_) model_->RemoveObserver(this); @@ -2032,10 +2023,6 @@ return view_model_.view_at(last_index); } -bool AppsGridView::IsTabletMode() const { - return contents_view_->app_list_view()->is_tablet_mode(); -} - void AppsGridView::StartDragAndDropHostDrag(const gfx::Point& grid_location) { // When a drag and drop host is given, the item can be dragged out of the app // list window. In that case a proxy widget needs to be used. @@ -2060,8 +2047,7 @@ drag_and_drop_host_->CreateDragIconProxyByLocationWithNoAnimation( drag_view_->GetIconBoundsInScreen().origin(), drag_view_->GetIconImage(), drag_view_, kDragAndDropProxyScale * GetTransform().Scale2d().x(), - is_new_style_launcher_enabled_ && drag_view_->item()->is_folder() && - IsTabletMode() + is_new_style_launcher_enabled_ && drag_view_->item()->is_folder() ? AppListConfig::instance().blur_radius() : 0);
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h index 3e53f4c..049df8f 100644 --- a/ash/app_list/views/apps_grid_view.h +++ b/ash/app_list/views/apps_grid_view.h
@@ -119,9 +119,6 @@ // used to trap focus within the folder when it is opened. void DisableFocusForShowingActiveFolder(bool disabled); - // Called when tablet mode starts and ends. - void OnTabletModeChanged(bool started); - // Sets |model| to use. Note this does not take ownership of |model|. void SetModel(AppListModel* model); @@ -257,9 +254,6 @@ // Returns the last app list item view in the selected page in the folder. AppListItemView* GetCurrentPageLastItemViewInFolder(); - // Returns true if tablet mode is active. - bool IsTabletMode() const; - // Return the view model. views::ViewModelT<AppListItemView>* view_model() { return &view_model_; }
diff --git a/ash/app_list/views/expand_arrow_view.cc b/ash/app_list/views/expand_arrow_view.cc index 4b359749..9bb3e13 100644 --- a/ash/app_list/views/expand_arrow_view.cc +++ b/ash/app_list/views/expand_arrow_view.cc
@@ -113,7 +113,10 @@ animation_->SetTweenType(gfx::Tween::LINEAR); animation_->SetSlideDuration(kCycleDurationInMs * 2 + kCycleIntervalInMs); ResetHintingAnimation(); - ScheduleHintingAnimation(true); + // When side shelf or tablet mode is enabled, the peeking launcher won't be + // shown, so the hint animation is unnecessary. + if (!app_list_view_->is_side_shelf() && !app_list_view_->is_tablet_mode()) + ScheduleHintingAnimation(true); } ExpandArrowView::~ExpandArrowView() = default; @@ -325,7 +328,9 @@ void ExpandArrowView::AnimationEnded(const gfx::Animation* /*animation*/) { ResetHintingAnimation(); - if (!button_pressed_) + // Only reschedule hinting animation if app list is not fullscreen. Once the + // user has made the app_list fullscreen, a hint to do so is no longer needed + if (!app_list_view_->is_fullscreen()) ScheduleHintingAnimation(false); }
diff --git a/ash/app_list/views/search_result_suggestion_chip_view.cc b/ash/app_list/views/search_result_suggestion_chip_view.cc index d537846..84a738dc 100644 --- a/ash/app_list/views/search_result_suggestion_chip_view.cc +++ b/ash/app_list/views/search_result_suggestion_chip_view.cc
@@ -38,11 +38,7 @@ SearchResultSuggestionChipView::SearchResultSuggestionChipView( AppListViewDelegate* view_delegate) - : view_delegate_(view_delegate), weak_ptr_factory_(this) { - suggestion_chip_view_ = new SuggestionChipView( - app_list::SuggestionChipView::Params(), /* listener */ this); - AddChildView(suggestion_chip_view_); -} + : view_delegate_(view_delegate), weak_ptr_factory_(this) {} SearchResultSuggestionChipView::~SearchResultSuggestionChipView() { SetSearchResult(nullptr); @@ -59,7 +55,6 @@ if (item_) item_->AddObserver(this); - SetVisible(!!item_); UpdateSuggestionChipView(); } @@ -110,15 +105,19 @@ } void SearchResultSuggestionChipView::UpdateSuggestionChipView() { - if (!item_) { - suggestion_chip_view_->SetIcon(gfx::ImageSkia()); - suggestion_chip_view_->SetText(base::string16()); - suggestion_chip_view_->SetAccessibleName(base::string16()); + if (!item_) return; - } - suggestion_chip_view_->SetIcon(item_->chip_icon()); - suggestion_chip_view_->SetText(item_->title()); + if (suggestion_chip_view_) { + suggestion_chip_view_->SetIcon(item_->chip_icon()); + suggestion_chip_view_->SetText(item_->title()); + } else { + app_list::SuggestionChipView::Params params; + params.text = item_->title(); + params.icon = item_->chip_icon(); + suggestion_chip_view_ = new SuggestionChipView(params, /* listener */ this); + AddChildView(suggestion_chip_view_); + } base::string16 accessible_name = item_->title(); if (item_->id() == app_list::kInternalAppIdContinueReading) {
diff --git a/ash/app_list/views/suggestion_chip_container_view.cc b/ash/app_list/views/suggestion_chip_container_view.cc index 93026a1e..c2297c2 100644 --- a/ash/app_list/views/suggestion_chip_container_view.cc +++ b/ash/app_list/views/suggestion_chip_container_view.cc
@@ -42,13 +42,6 @@ kChipSpacing)); layout_manager->set_main_axis_alignment( views::BoxLayout::MainAxisAlignment::MAIN_AXIS_ALIGNMENT_CENTER); - - for (size_t i = 0; i < static_cast<size_t>(kNumStartPageTiles); ++i) { - SearchResultSuggestionChipView* chip = - new SearchResultSuggestionChipView(view_delegate_); - chip->SetIndexInSuggestionChipContainer(i); - suggestion_chip_views_.emplace_back(chip); - } } SuggestionChipContainerView::~SuggestionChipContainerView() = default; @@ -57,20 +50,29 @@ if (IgnoreUpdateAndLayout()) return num_results(); + // Clear all current suggestion chips. + for (size_t i = 0; i < suggestion_chip_views_.size(); ++i) + delete suggestion_chip_views_[i]; + suggestion_chip_views_.clear(); + std::vector<SearchResult*> display_results = SearchModel::FilterSearchResultsByDisplayType( results(), ash::SearchResultDisplayType::kRecommendation, /*excludes=*/{}, kNumStartPageTiles); - // Update search results here, but wait until layout to add them as child - // views when we know this view's bounds. - for (size_t i = 0; i < static_cast<size_t>(kNumStartPageTiles); ++i) { - suggestion_chip_views_[i]->SetSearchResult( - i < display_results.size() ? display_results[i] : nullptr); + // Create a suggestion chip for each search result, but wait until layout to + // add them as child views when we know this view's bounds. + for (size_t i = 0; i < display_results.size(); ++i) { + auto* result = display_results[i]; + SearchResultSuggestionChipView* chip = + new SearchResultSuggestionChipView(view_delegate_); + chip->SetSearchResult(result); + chip->SetIndexInSuggestionChipContainer(i); + suggestion_chip_views_.emplace_back(chip); } Layout(); - return std::min(kNumStartPageTiles, static_cast<int>(display_results.size())); + return suggestion_chip_views_.size(); } const char* SuggestionChipContainerView::GetClassName() const { @@ -86,14 +88,11 @@ int total_width = 0; const int max_width = GetContentsBounds().width(); for (auto* chip : suggestion_chip_views_) { - if (!chip->result()) + const int chip_width = chip->GetPreferredSize().width(); + if (chip_width + total_width > max_width) break; - const gfx::Size size = chip->CalculatePreferredSize(); - if (size.width() + total_width > max_width) - break; - chip->SetSize(size); AddChildView(chip); - total_width += (total_width == 0 ? 0 : kChipSpacing) + size.width(); + total_width += (total_width == 0 ? 0 : kChipSpacing) + chip_width; } views::View::Layout(); @@ -127,12 +126,6 @@ chip->suggestion_chip_view()->SetEnabled(!disabled); } -void SuggestionChipContainerView::OnTabletModeChanged(bool started) { - // Enable/Disable chips' background blur based on tablet mode. - for (auto* chip : suggestion_chip_views_) - chip->suggestion_chip_view()->SetBackgroundBlurEnabled(started); -} - bool SuggestionChipContainerView::IgnoreUpdateAndLayout() const { // Ignore update and layout when this view is not shown. const ash::AppListState state = contents_view_->GetActiveState();
diff --git a/ash/app_list/views/suggestion_chip_container_view.h b/ash/app_list/views/suggestion_chip_container_view.h index 1ce59ce..14f33a2 100644 --- a/ash/app_list/views/suggestion_chip_container_view.h +++ b/ash/app_list/views/suggestion_chip_container_view.h
@@ -34,9 +34,6 @@ // trap focus within the folder when it is opened. void DisableFocusForShowingActiveFolder(bool disabled); - // Called when tablet mode starts and ends. - void OnTabletModeChanged(bool started); - private: // Returns true if update and layout should be ignored. bool IgnoreUpdateAndLayout() const;
diff --git a/ash/app_list/views/suggestion_chip_view.cc b/ash/app_list/views/suggestion_chip_view.cc index 50a9d59c..08944cf1 100644 --- a/ash/app_list/views/suggestion_chip_view.cc +++ b/ash/app_list/views/suggestion_chip_view.cc
@@ -67,37 +67,27 @@ SetFocusBehavior(FocusBehavior::ALWAYS); SetInkDropMode(InkDropHostView::InkDropMode::ON); - // Set background blur for the chip and use mask layer to clip it into - // rounded rect. - if (!assistant_style_) - SetBackgroundBlurEnabled(false); + if (!assistant_style_) { + // Set background blur for the chip and use mask layer to clip it into + // rounded rect. + SetPaintToLayer(); + layer()->SetFillsBoundsOpaquely(false); + layer()->SetBackgroundBlur(kBlurRadius); + SetRoundedRectMaskLayer(kPreferredHeightDip / 2); + } InitLayout(params); } SuggestionChipView::~SuggestionChipView() = default; -void SuggestionChipView::SetBackgroundBlurEnabled(bool enabled) { - DCHECK(!assistant_style_); - - // Background blur is enabled if and only if layer exists. - if (!!layer() == enabled) - return; - - if (!enabled) { - DestroyLayer(); - return; - } - - SetPaintToLayer(); - layer()->SetFillsBoundsOpaquely(false); - layer()->SetBackgroundBlur(kBlurRadius); - SetRoundedRectMaskLayer(kPreferredHeightDip / 2); -} - gfx::Size SuggestionChipView::CalculatePreferredSize() const { const int preferred_width = views::View::CalculatePreferredSize().width(); - return gfx::Size(preferred_width, kPreferredHeightDip); + return gfx::Size(preferred_width, GetHeightForWidth(preferred_width)); +} + +int SuggestionChipView::GetHeightForWidth(int width) const { + return kPreferredHeightDip; } void SuggestionChipView::ChildVisibilityChanged(views::View* child) { @@ -233,7 +223,7 @@ void SuggestionChipView::SetText(const base::string16& text) { text_view_->SetText(text); if (!assistant_style_) { - gfx::Size size = text_view_->CalculatePreferredSize(); + gfx::Size size = text_view_->GetPreferredSize(); size.set_width(std::min(kAppListMaxTextWidth, size.width())); text_view_->SetPreferredSize(size); }
diff --git a/ash/app_list/views/suggestion_chip_view.h b/ash/app_list/views/suggestion_chip_view.h index f169685..7642e349 100644 --- a/ash/app_list/views/suggestion_chip_view.h +++ b/ash/app_list/views/suggestion_chip_view.h
@@ -42,12 +42,10 @@ SuggestionChipView(const Params& params, views::ButtonListener* listener); ~SuggestionChipView() override; - // Enables background blur for folder icon if |enabled| is true. - void SetBackgroundBlurEnabled(bool enabled); - // views::View: gfx::Size CalculatePreferredSize() const override; void ChildVisibilityChanged(views::View* child) override; + int GetHeightForWidth(int width) const override; void OnPaintBackground(gfx::Canvas* canvas) override; void OnFocus() override; void OnBlur() override;
diff --git a/ash/assistant/assistant_ui_controller.cc b/ash/assistant/assistant_ui_controller.cc index eed37365..7f68d29 100644 --- a/ash/assistant/assistant_ui_controller.cc +++ b/ash/assistant/assistant_ui_controller.cc
@@ -418,12 +418,18 @@ const gfx::Rect screen_bounds = container_view_->GetWidget()->GetWindowBoundsInScreen(); + const gfx::Rect keyboard_bounds = + keyboard::KeyboardController::Get()->GetWorkspaceOccludedBounds(); - // Pressed events outside our widget bounds should result in hiding of - // Assistant UI. This event does not fire during a Metalayer session so we - // needn't enforce logic to prevent hiding when using the stylus. - if (!screen_bounds.Contains(screen_location)) + // Pressed events outside our widget bounds should result in hiding of the + // Assistant UI. The exception to this rule is if the user is interacting + // with the virtual keyboard in which case we should not dismiss Assistant UI. + // Note that this event does not fire during a Metalayer session so we needn't + // enforce logic to prevent hiding when using the stylus. + if (!screen_bounds.Contains(screen_location) && + !keyboard_bounds.Contains(screen_location)) { HideUi(AssistantSource::kUnspecified); + } } void AssistantUiController::UpdateUsableWorkArea(aura::Window* root_window) {
diff --git a/ash/assistant/ui/main_stage/assistant_main_stage.cc b/ash/assistant/ui/main_stage/assistant_main_stage.cc index 4d1bc53..cff71fff 100644 --- a/ash/assistant/ui/main_stage/assistant_main_stage.cc +++ b/ash/assistant/ui/main_stage/assistant_main_stage.cc
@@ -502,6 +502,12 @@ const ui::CallbackLayerAnimationObserver& observer) { // The exited active query view will always be the first child of its parent. delete query_layout_container_->child_at(0); + + // TODO(https://crbug.com/896079): Remove this when view.cc handles the + // event notification. + query_layout_container_->NotifyAccessibilityEvent( + ax::mojom::Event::kChildrenChanged, false); + UpdateTopPadding(); // Return false to prevent the observer from destroying itself.
diff --git a/ash/assistant/ui/main_stage/assistant_query_view.cc b/ash/assistant/ui/main_stage/assistant_query_view.cc index cd89944c..b910aed 100644 --- a/ash/assistant/ui/main_stage/assistant_query_view.cc +++ b/ash/assistant/ui/main_stage/assistant_query_view.cc
@@ -10,6 +10,8 @@ #include "ash/assistant/model/assistant_query.h" #include "ash/assistant/ui/assistant_ui_constants.h" #include "base/strings/utf_string_conversions.h" +#include "ui/accessibility/ax_enums.mojom.h" +#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/layout/box_layout.h" namespace ash { @@ -37,6 +39,7 @@ AssistantQueryView::AssistantQueryView() { InitLayout(); + GetViewAccessibility().OverrideRole(ax::mojom::Role::kHeading); } AssistantQueryView::~AssistantQueryView() = default;
diff --git a/ash/keyboard/ash_keyboard_controller.cc b/ash/keyboard/ash_keyboard_controller.cc index a838052..a7e93a9 100644 --- a/ash/keyboard/ash_keyboard_controller.cc +++ b/ash/keyboard/ash_keyboard_controller.cc
@@ -13,10 +13,10 @@ #include "ui/gfx/geometry/rect.h" #include "ui/keyboard/keyboard_controller.h" #include "ui/keyboard/keyboard_ui.h" +#include "ui/keyboard/keyboard_util.h" using keyboard::mojom::KeyboardConfig; using keyboard::mojom::KeyboardConfigPtr; -using keyboard::mojom::KeyboardEnableFlag; namespace ash { @@ -41,7 +41,7 @@ } void AshKeyboardController::EnableKeyboard() { - if (!keyboard_controller_->IsKeyboardEnableRequested()) + if (!keyboard::IsKeyboardEnabled()) return; if (keyboard_controller_->IsEnabled()) { @@ -103,34 +103,11 @@ keyboard_controller_->UpdateKeyboardConfig(*keyboard_config); } -void AshKeyboardController::IsKeyboardEnabled( - IsKeyboardEnabledCallback callback) { - std::move(callback).Run(keyboard_controller_->IsEnabled()); -} - -void AshKeyboardController::SetEnableFlag(KeyboardEnableFlag flag) { - bool was_enabled = keyboard_controller_->IsEnabled(); - keyboard_controller_->SetEnableFlag(flag); - UpdateEnableFlag(was_enabled); -} - -void AshKeyboardController::ClearEnableFlag(KeyboardEnableFlag flag) { - bool was_enabled = keyboard_controller_->IsEnabled(); - keyboard_controller_->ClearEnableFlag(flag); - UpdateEnableFlag(was_enabled); -} - -void AshKeyboardController::ReloadKeyboard() { - // Test IsKeyboardEnableRequested in case of an unlikely edge case where this - // is called while after the enable state changed to disabled (in which case - // we do not want to override the requested state). - if (keyboard_controller_->IsKeyboardEnableRequested()) - EnableKeyboard(); -} - void AshKeyboardController::OnSessionStateChanged( session_manager::SessionState state) { - if (!keyboard_controller_->IsKeyboardEnableRequested()) + // NOTE: keyboard::IsKeyboardEnabled() is false in mash, but may not be in + // unit tests. crbug.com/646565. + if (!keyboard::IsKeyboardEnabled()) return; switch (state) { @@ -159,15 +136,6 @@ keyboard_controller_.get()); } -void AshKeyboardController::UpdateEnableFlag(bool was_enabled) { - bool is_enabled = keyboard_controller_->IsKeyboardEnableRequested(); - if (is_enabled && !was_enabled) { - EnableKeyboard(); - } else if (!is_enabled && was_enabled) { - DisableKeyboard(); - } -} - void AshKeyboardController::OnKeyboardConfigChanged() { KeyboardConfigPtr config = KeyboardConfig::New(keyboard_controller_->keyboard_config());
diff --git a/ash/keyboard/ash_keyboard_controller.h b/ash/keyboard/ash_keyboard_controller.h index 1a08083..0e3c350 100644 --- a/ash/keyboard/ash_keyboard_controller.h +++ b/ash/keyboard/ash_keyboard_controller.h
@@ -57,15 +57,11 @@ void DestroyVirtualKeyboard(); // mojom::KeyboardController: + void AddObserver( + mojom::KeyboardControllerObserverAssociatedPtrInfo observer) override; void GetKeyboardConfig(GetKeyboardConfigCallback callback) override; void SetKeyboardConfig( keyboard::mojom::KeyboardConfigPtr keyboard_config) override; - void IsKeyboardEnabled(IsKeyboardEnabledCallback callback) override; - void SetEnableFlag(keyboard::mojom::KeyboardEnableFlag flag) override; - void ClearEnableFlag(keyboard::mojom::KeyboardEnableFlag flag) override; - void ReloadKeyboard() override; - void AddObserver( - mojom::KeyboardControllerObserverAssociatedPtrInfo observer) override; // SessionObserver: void OnSessionStateChanged(session_manager::SessionState state) override; @@ -82,10 +78,6 @@ // Ensures that the keyboard controller is activated for the primary window. void ActivateKeyboard(); - // Called whenever the enable flags may have changed the enabled state from - // |was_enabled|. If changed, enables or disables the keyboard. - void UpdateEnableFlag(bool was_enabled); - // keyboard::KeyboardControllerObserver void OnKeyboardConfigChanged() override; void OnKeyboardVisibilityStateChanged(bool is_visible) override;
diff --git a/ash/keyboard/ash_keyboard_controller_unittest.cc b/ash/keyboard/ash_keyboard_controller_unittest.cc index 2421fa51..dce6539 100644 --- a/ash/keyboard/ash_keyboard_controller_unittest.cc +++ b/ash/keyboard/ash_keyboard_controller_unittest.cc
@@ -6,18 +6,17 @@ #include <memory> #include "ash/public/interfaces/keyboard_controller.mojom.h" -#include "ash/shell.h" -#include "ash/test/ash_test_base.h" #include "base/run_loop.h" #include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/associated_binding.h" #include "services/service_manager/public/cpp/connector.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/keyboard/keyboard_controller.h" +#include "ui/keyboard/keyboard_ui.h" +#include "ui/keyboard/test/keyboard_test_util.h" using keyboard::mojom::KeyboardConfig; using keyboard::mojom::KeyboardConfigPtr; -using keyboard::mojom::KeyboardEnableFlag; namespace ash { @@ -33,23 +32,22 @@ ~TestObserver() override = default; // mojom::KeyboardControllerObserver: - void OnKeyboardEnabledChanged(bool enabled) override { - if (!enabled) - ++destroyed_count_; - } + void OnKeyboardEnabledChanged(bool enabled) override {} void OnKeyboardVisibilityChanged(bool visible) override {} void OnKeyboardVisibleBoundsChanged(const gfx::Rect& bounds) override {} void OnKeyboardConfigChanged(KeyboardConfigPtr config) override { config_ = *config; } - KeyboardConfig config_; - int destroyed_count_ = 0; + const KeyboardConfig& config() const { return config_; } + void set_config(const KeyboardConfig& config) { config_ = config; } private: mojo::AssociatedBinding<ash::mojom::KeyboardControllerObserver> keyboard_controller_observer_binding_{this}; + KeyboardConfig config_; + DISALLOW_COPY_AND_ASSIGN(TestObserver); }; @@ -61,15 +59,6 @@ test_observer_ = std::make_unique<TestObserver>(keyboard_controller_.get()); } - ~TestClient() = default; - - bool GetIsEnabled() { - keyboard_controller_->IsKeyboardEnabled(base::BindOnce( - &TestClient::OnIsKeyboardEnabled, base::Unretained(this))); - keyboard_controller_.FlushForTesting(); - return is_enabled_; - } - void GetKeyboardConfig() { keyboard_controller_->GetKeyboardConfig(base::BindOnce( &TestClient::OnGetKeyboardConfig, base::Unretained(this))); @@ -81,30 +70,11 @@ keyboard_controller_.FlushForTesting(); } - void SetEnableFlag(KeyboardEnableFlag flag) { - keyboard_controller_->SetEnableFlag(flag); - keyboard_controller_.FlushForTesting(); - } - - void ClearEnableFlag(KeyboardEnableFlag flag) { - keyboard_controller_->ClearEnableFlag(flag); - keyboard_controller_.FlushForTesting(); - } - - void ReloadKeyboard() { - keyboard_controller_->ReloadKeyboard(); - keyboard_controller_.FlushForTesting(); - } - + int got_keyboard_config_count() const { return got_keyboard_config_count_; } + const KeyboardConfig& keyboard_config() const { return keyboard_config_; } TestObserver* test_observer() const { return test_observer_.get(); } - bool is_enabled_ = false; - int got_keyboard_config_count_ = 0; - KeyboardConfig keyboard_config_; - private: - void OnIsKeyboardEnabled(bool enabled) { is_enabled_ = enabled; } - void OnGetKeyboardConfig(KeyboardConfigPtr config) { ++got_keyboard_config_count_; keyboard_config_ = *config; @@ -112,15 +82,27 @@ mojom::KeyboardControllerPtr keyboard_controller_; std::unique_ptr<TestObserver> test_observer_; + + int got_keyboard_config_count_ = 0; + KeyboardConfig keyboard_config_; }; -class AshKeyboardControllerTest : public AshTestBase { +class AshKeyboardControllerTest : public testing::Test { public: - AshKeyboardControllerTest() = default; + AshKeyboardControllerTest() + : scoped_task_environment_( + base::test::ScopedTaskEnvironment::MainThreadType::DEFAULT, + base::test::ScopedTaskEnvironment::ExecutionMode::QUEUED) {} ~AshKeyboardControllerTest() override = default; void SetUp() override { - AshTestBase::SetUp(); + ash_keyboard_controller_ = std::make_unique<AshKeyboardController>( + nullptr /* session_controller */); + // Call SetupUI() so that observer methods get called. + auto test_ui = + std::make_unique<keyboard::TestKeyboardUI>(nullptr /* input_method */); + ash_keyboard_controller_->keyboard_controller()->EnableKeyboard( + std::move(test_ui), nullptr /* delegate */); // Create a local service manager connector to handle requests to // mojom::KeyboardController. @@ -136,28 +118,29 @@ base::RunLoop().RunUntilIdle(); test_client_ = std::make_unique<TestClient>(connector_.get()); - - // Set the initial observer config to the client (default) config. - test_client_->test_observer()->config_ = test_client()->keyboard_config_; } void TearDown() override { test_client_.reset(); - AshTestBase::TearDown(); + keyboard_controller()->DisableKeyboard(); + ash_keyboard_controller_.reset(); } void AddKeyboardControllerBinding(mojo::ScopedMessagePipeHandle handle) { - Shell::Get()->ash_keyboard_controller()->BindRequest( + ash_keyboard_controller_->BindRequest( mojom::KeyboardControllerRequest(std::move(handle))); } keyboard::KeyboardController* keyboard_controller() { - return Shell::Get()->ash_keyboard_controller()->keyboard_controller(); + return ash_keyboard_controller_->keyboard_controller(); } TestClient* test_client() { return test_client_.get(); } private: + base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<service_manager::Connector> connector_; + + std::unique_ptr<AshKeyboardController> ash_keyboard_controller_; std::unique_ptr<TestClient> test_client_; DISALLOW_COPY_AND_ASSIGN(AshKeyboardControllerTest); @@ -167,67 +150,27 @@ TEST_F(AshKeyboardControllerTest, GetKeyboardConfig) { test_client()->GetKeyboardConfig(); - EXPECT_EQ(1, test_client()->got_keyboard_config_count_); + EXPECT_EQ(1, test_client()->got_keyboard_config_count()); } TEST_F(AshKeyboardControllerTest, SetKeyboardConfig) { - // Enable the keyboard so that config changes trigger observer events. - test_client()->SetEnableFlag(KeyboardEnableFlag::kExtensionEnabled); - test_client()->GetKeyboardConfig(); - EXPECT_EQ(1, test_client()->got_keyboard_config_count_); + EXPECT_EQ(1, test_client()->got_keyboard_config_count()); KeyboardConfigPtr config = - KeyboardConfig::New(test_client()->keyboard_config_); + KeyboardConfig::New(test_client()->keyboard_config()); // Set the observer config to the client (default) config. - test_client()->test_observer()->config_ = *config; + test_client()->test_observer()->set_config(*config); - // Change the keyboard config. + // Test that the config changes. bool old_auto_complete = config->auto_complete; config->auto_complete = !config->auto_complete; test_client()->SetKeyboardConfig(std::move(config)); - - // Test that the config changes. test_client()->GetKeyboardConfig(); - EXPECT_NE(old_auto_complete, test_client()->keyboard_config_.auto_complete); + EXPECT_NE(old_auto_complete, test_client()->keyboard_config().auto_complete); // Test that the test observer received the change. EXPECT_NE(old_auto_complete, - test_client()->test_observer()->config_.auto_complete); -} - -TEST_F(AshKeyboardControllerTest, Enabled) { - EXPECT_FALSE(test_client()->GetIsEnabled()); - // Enable the keyboard. - test_client()->SetEnableFlag(KeyboardEnableFlag::kExtensionEnabled); - EXPECT_TRUE(test_client()->GetIsEnabled()); - - // Set the enable override to disable the keyboard. - test_client()->SetEnableFlag(KeyboardEnableFlag::kPolicyDisabled); - EXPECT_FALSE(test_client()->GetIsEnabled()); - - // Clear the enable override; should enable the keyboard. - test_client()->ClearEnableFlag(KeyboardEnableFlag::kPolicyDisabled); - EXPECT_TRUE(test_client()->GetIsEnabled()); -} - -TEST_F(AshKeyboardControllerTest, ReloadKeyboard) { - EXPECT_EQ(0, test_client()->test_observer()->destroyed_count_); - - // Enable the keyboard. - test_client()->SetEnableFlag(KeyboardEnableFlag::kExtensionEnabled); - EXPECT_EQ(0, test_client()->test_observer()->destroyed_count_); - - // Enable the keyboard again; this should not reload the keyboard. - test_client()->SetEnableFlag(KeyboardEnableFlag::kExtensionEnabled); - EXPECT_EQ(0, test_client()->test_observer()->destroyed_count_); - - // Reload the keyboard. This should destroy the previous keyboard window. - test_client()->ReloadKeyboard(); - EXPECT_EQ(1, test_client()->test_observer()->destroyed_count_); - - // Disable the keyboard. The keyboard window should be destroyed. - test_client()->ClearEnableFlag(KeyboardEnableFlag::kExtensionEnabled); - EXPECT_EQ(2, test_client()->test_observer()->destroyed_count_); + test_client()->test_observer()->config().auto_complete); } } // namespace ash
diff --git a/ash/keyboard/virtual_keyboard_controller_unittest.cc b/ash/keyboard/virtual_keyboard_controller_unittest.cc index 921d6da..cd875a67 100644 --- a/ash/keyboard/virtual_keyboard_controller_unittest.cc +++ b/ash/keyboard/virtual_keyboard_controller_unittest.cc
@@ -24,8 +24,7 @@ #include "ui/events/devices/input_device.h" #include "ui/events/devices/touchscreen_device.h" #include "ui/keyboard/keyboard_switches.h" - -using keyboard::mojom::KeyboardEnableFlag; +#include "ui/keyboard/keyboard_util.h" namespace ash { @@ -35,6 +34,10 @@ return Shell::Get()->ash_keyboard_controller()->virtual_keyboard_controller(); } +keyboard::KeyboardController* GetKeyboardController() { + return keyboard::KeyboardController::Get(); +} + } // namespace class VirtualKeyboardControllerTest : public AshTestBase { @@ -46,10 +49,15 @@ AshTestBase::SetUp(); ws::InputDeviceClientTestApi().SetKeyboardDevices({}); ws::InputDeviceClientTestApi().SetTouchscreenDevices({}); - keyboard_controller_ = keyboard::KeyboardController::Get(); } void TearDown() override { + // Ensure keyboard is reset for the next test. + keyboard::SetAccessibilityKeyboardEnabled(false); + keyboard::SetKeyboardEnabledFromShelf(false); + keyboard::SetTouchKeyboardEnabled(false); + keyboard::SetRequestedKeyboardState(keyboard::KEYBOARD_STATE_AUTO); + // Ensure inputs devices are reset for the next test. ws::InputDeviceClientTestApi().SetKeyboardDevices({}); ws::InputDeviceClientTestApi().SetTouchscreenDevices({}); @@ -80,8 +88,6 @@ focusable_window->Focus(); } - keyboard::KeyboardController* keyboard_controller_ = nullptr; - private: DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardControllerTest); }; @@ -135,7 +141,7 @@ client.last_keyset_); // Simulate the keyboard hiding. - if (keyboard_controller_->HasObserver(GetVirtualKeyboardController())) { + if (GetKeyboardController()->HasObserver(GetVirtualKeyboardController())) { GetVirtualKeyboardController()->OnKeyboardHidden( false /* is_temporary_hide */); } @@ -160,33 +166,30 @@ Shell::Get()->ime_controller()->SetClient(client.CreateInterfacePtr()); // Should show the keyboard by enabling it temporarily. - EXPECT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); - EXPECT_FALSE( - keyboard_controller_->IsEnableFlagSet(KeyboardEnableFlag::kShelfEnabled)); + EXPECT_FALSE(keyboard::IsKeyboardEnabled()); + EXPECT_FALSE(keyboard::GetKeyboardEnabledFromShelf()); GetVirtualKeyboardController()->ForceShowKeyboardWithKeyset( chromeos::input_method::mojom::ImeKeyset::kEmoji); Shell::Get()->ime_controller()->FlushMojoForTesting(); - EXPECT_TRUE( - keyboard_controller_->IsEnableFlagSet(KeyboardEnableFlag::kShelfEnabled)); - EXPECT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + EXPECT_TRUE(keyboard::GetKeyboardEnabledFromShelf()); + EXPECT_TRUE(keyboard::IsKeyboardEnabled()); // Keyset should be emoji. EXPECT_EQ(chromeos::input_method::mojom::ImeKeyset::kEmoji, client.last_keyset_); // Simulate the keyboard hiding. - if (keyboard_controller_->HasObserver(GetVirtualKeyboardController())) { + if (GetKeyboardController()->HasObserver(GetVirtualKeyboardController())) { GetVirtualKeyboardController()->OnKeyboardHidden( false /* is_temporary_hide */); } base::RunLoop().RunUntilIdle(); // The keyboard should still be disabled again. - EXPECT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); - EXPECT_FALSE( - keyboard_controller_->IsEnableFlagSet(KeyboardEnableFlag::kShelfEnabled)); + EXPECT_FALSE(keyboard::IsKeyboardEnabled()); + EXPECT_FALSE(keyboard::GetKeyboardEnabledFromShelf()); // Keyset should be reset to none. Shell::Get()->ime_controller()->FlushMojoForTesting(); @@ -205,25 +208,23 @@ chromeos::input_method::mojom::ImeKeyset::kEmoji); Shell::Get()->ime_controller()->FlushMojoForTesting(); - EXPECT_TRUE( - keyboard_controller_->IsEnableFlagSet(KeyboardEnableFlag::kShelfEnabled)); - EXPECT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + EXPECT_TRUE(keyboard::GetKeyboardEnabledFromShelf()); + EXPECT_TRUE(keyboard::IsKeyboardEnabled()); // Keyset should be emoji. EXPECT_EQ(chromeos::input_method::mojom::ImeKeyset::kEmoji, client.last_keyset_); // Simulate the keyboard hiding temporarily. - if (keyboard_controller_->HasObserver(GetVirtualKeyboardController())) { + if (GetKeyboardController()->HasObserver(GetVirtualKeyboardController())) { GetVirtualKeyboardController()->OnKeyboardHidden( true /* is_temporary_hide */); } base::RunLoop().RunUntilIdle(); // The keyboard should still be enabled. - EXPECT_TRUE( - keyboard_controller_->IsEnableFlagSet(KeyboardEnableFlag::kShelfEnabled)); - EXPECT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + EXPECT_TRUE(keyboard::GetKeyboardEnabledFromShelf()); + EXPECT_TRUE(keyboard::IsKeyboardEnabled()); // Keyset should still be emoji. EXPECT_EQ(chromeos::input_method::mojom::ImeKeyset::kEmoji, @@ -282,13 +283,13 @@ keyboard_devices.push_back(ui::InputDevice( 1, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "keyboard")); ws::InputDeviceClientTestApi().SetKeyboardDevices(keyboard_devices); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); // Remove the internal keyboard. Virtual keyboard should now show. ws::InputDeviceClientTestApi().SetKeyboardDevices({}); - EXPECT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + EXPECT_TRUE(keyboard::IsKeyboardEnabled()); // Replug in the internal keyboard. Virtual keyboard should hide. ws::InputDeviceClientTestApi().SetKeyboardDevices(keyboard_devices); - EXPECT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + EXPECT_FALSE(keyboard::IsKeyboardEnabled()); } TEST_F(VirtualKeyboardControllerAutoTest, DisabledIfNoTouchScreen) { @@ -298,10 +299,10 @@ ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_USB, "Touchscreen", gfx::Size(800, 600), 0)); ws::InputDeviceClientTestApi().SetTouchscreenDevices(devices); - EXPECT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + EXPECT_TRUE(keyboard::IsKeyboardEnabled()); // Remove touchscreen. Keyboard should hide. ws::InputDeviceClientTestApi().SetTouchscreenDevices({}); - EXPECT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + EXPECT_FALSE(keyboard::IsKeyboardEnabled()); } TEST_F(VirtualKeyboardControllerAutoTest, SuppressedIfExternalKeyboardPresent) { @@ -314,26 +315,26 @@ keyboard_devices.push_back( ui::InputDevice(1, ui::InputDeviceType::INPUT_DEVICE_USB, "keyboard")); ws::InputDeviceClientTestApi().SetKeyboardDevices(keyboard_devices); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); ASSERT_TRUE(notified()); ASSERT_TRUE(IsVirtualKeyboardSuppressed()); // Toggle show keyboard. Keyboard should be visible. ResetObserver(); GetVirtualKeyboardController()->ToggleIgnoreExternalKeyboard(); - ASSERT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_TRUE(keyboard::IsKeyboardEnabled()); ASSERT_TRUE(notified()); ASSERT_TRUE(IsVirtualKeyboardSuppressed()); // Toggle show keyboard. Keyboard should be hidden. ResetObserver(); GetVirtualKeyboardController()->ToggleIgnoreExternalKeyboard(); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); ASSERT_TRUE(notified()); ASSERT_TRUE(IsVirtualKeyboardSuppressed()); // Remove external keyboard. Should be notified that the keyboard is not // suppressed. ResetObserver(); ws::InputDeviceClientTestApi().SetKeyboardDevices({}); - ASSERT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_TRUE(keyboard::IsKeyboardEnabled()); ASSERT_TRUE(notified()); ASSERT_FALSE(IsVirtualKeyboardSuppressed()); } @@ -348,7 +349,7 @@ keyboards.push_back( ui::InputDevice(3, ui::InputDeviceType::INPUT_DEVICE_USB, "keyboard")); ws::InputDeviceClientTestApi().SetKeyboardDevices(keyboards); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); } // Tests tablet mode interaction without disabling the internal keyboard. @@ -362,13 +363,13 @@ keyboard_devices.push_back(ui::InputDevice( 1, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "Keyboard")); ws::InputDeviceClientTestApi().SetKeyboardDevices(keyboard_devices); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); // Toggle tablet mode on. TabletModeControllerTestApi().EnterTabletMode(); - ASSERT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_TRUE(keyboard::IsKeyboardEnabled()); // Toggle tablet mode off. TabletModeControllerTestApi().LeaveTabletMode(false); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); } // Tests that keyboard gets suppressed in tablet mode. @@ -386,19 +387,19 @@ ws::InputDeviceClientTestApi().SetKeyboardDevices(keyboard_devices); // Toggle tablet mode on. TabletModeControllerTestApi().EnterTabletMode(); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); ASSERT_TRUE(notified()); ASSERT_TRUE(IsVirtualKeyboardSuppressed()); // Toggle show keyboard. Keyboard should be visible. ResetObserver(); GetVirtualKeyboardController()->ToggleIgnoreExternalKeyboard(); - ASSERT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_TRUE(keyboard::IsKeyboardEnabled()); ASSERT_TRUE(notified()); ASSERT_TRUE(IsVirtualKeyboardSuppressed()); // Toggle show keyboard. Keyboard should be hidden. ResetObserver(); GetVirtualKeyboardController()->ToggleIgnoreExternalKeyboard(); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); ASSERT_TRUE(notified()); ASSERT_TRUE(IsVirtualKeyboardSuppressed()); // Remove external keyboard. Should be notified that the keyboard is not @@ -406,12 +407,12 @@ ResetObserver(); keyboard_devices.pop_back(); ws::InputDeviceClientTestApi().SetKeyboardDevices(keyboard_devices); - ASSERT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_TRUE(keyboard::IsKeyboardEnabled()); ASSERT_TRUE(notified()); ASSERT_FALSE(IsVirtualKeyboardSuppressed()); // Toggle tablet mode oFF. TabletModeControllerTestApi().LeaveTabletMode(false); - ASSERT_FALSE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_FALSE(keyboard::IsKeyboardEnabled()); } class VirtualKeyboardControllerAlwaysEnabledTest @@ -443,7 +444,7 @@ keyboard_devices.push_back( ui::InputDevice(1, ui::InputDeviceType::INPUT_DEVICE_USB, "keyboard")); ws::InputDeviceClientTestApi().SetKeyboardDevices(keyboard_devices); - ASSERT_TRUE(keyboard_controller_->IsKeyboardEnableRequested()); + ASSERT_TRUE(keyboard::IsKeyboardEnabled()); } // Test for http://crbug.com/297858. |MoveKeyboardToTouchableDisplay| should @@ -460,7 +461,7 @@ GetVirtualKeyboardController()->MoveKeyboardToTouchableDisplay(); - EXPECT_EQ(GetPrimaryRootWindow(), keyboard_controller_->GetRootWindow()); + EXPECT_EQ(GetPrimaryRootWindow(), GetKeyboardController()->GetRootWindow()); } // Test for http://crbug.com/297858. |MoveKeyboardToTouchableDisplay| should @@ -478,7 +479,7 @@ GetVirtualKeyboardController()->MoveKeyboardToTouchableDisplay(); - EXPECT_EQ(GetSecondaryRootWindow(), keyboard_controller_->GetRootWindow()); + EXPECT_EQ(GetSecondaryRootWindow(), GetKeyboardController()->GetRootWindow()); } // Test for http://crbug.com/303429. |MoveKeyboardToTouchableDisplay| should @@ -499,7 +500,7 @@ GetVirtualKeyboardController()->MoveKeyboardToTouchableDisplay(); - EXPECT_EQ(GetSecondaryRootWindow(), keyboard_controller_->GetRootWindow()); + EXPECT_EQ(GetSecondaryRootWindow(), GetKeyboardController()->GetRootWindow()); } // Test for http://crbug.com/303429. |MoveKeyboardToTouchableDisplay| should @@ -523,7 +524,7 @@ CreateFocusedTestWindowInRootWindow(GetPrimaryRootWindow()); GetVirtualKeyboardController()->MoveKeyboardToTouchableDisplay(); - EXPECT_EQ(GetSecondaryRootWindow(), keyboard_controller_->GetRootWindow()); + EXPECT_EQ(GetSecondaryRootWindow(), GetKeyboardController()->GetRootWindow()); } // Test for http://crbug.com/303429. |MoveKeyboardToTouchableDisplay| should @@ -548,12 +549,12 @@ // Focus on secondary display. CreateFocusedTestWindowInRootWindow(GetSecondaryRootWindow()); GetVirtualKeyboardController()->MoveKeyboardToTouchableDisplay(); - EXPECT_EQ(GetSecondaryRootWindow(), keyboard_controller_->GetRootWindow()); + EXPECT_EQ(GetSecondaryRootWindow(), GetKeyboardController()->GetRootWindow()); // Focus on primary display. CreateFocusedTestWindowInRootWindow(GetPrimaryRootWindow()); GetVirtualKeyboardController()->MoveKeyboardToTouchableDisplay(); - EXPECT_EQ(GetPrimaryRootWindow(), keyboard_controller_->GetRootWindow()); + EXPECT_EQ(GetPrimaryRootWindow(), GetKeyboardController()->GetRootWindow()); } // Test for http://crbug.com/303429. |MoveKeyboardToDisplay| should move @@ -574,11 +575,11 @@ // Move to primary display. GetVirtualKeyboardController()->MoveKeyboardToDisplay(GetPrimaryDisplay()); - EXPECT_EQ(GetPrimaryRootWindow(), keyboard_controller_->GetRootWindow()); + EXPECT_EQ(GetPrimaryRootWindow(), GetKeyboardController()->GetRootWindow()); // Move to secondary display. GetVirtualKeyboardController()->MoveKeyboardToDisplay(GetSecondaryDisplay()); - EXPECT_EQ(GetSecondaryRootWindow(), keyboard_controller_->GetRootWindow()); + EXPECT_EQ(GetSecondaryRootWindow(), GetKeyboardController()->GetRootWindow()); } } // namespace ash
diff --git a/ash/public/interfaces/keyboard_controller.mojom b/ash/public/interfaces/keyboard_controller.mojom index 505ada0..68d8381 100644 --- a/ash/public/interfaces/keyboard_controller.mojom +++ b/ash/public/interfaces/keyboard_controller.mojom
@@ -6,13 +6,11 @@ import "ui/gfx/geometry/mojo/geometry.mojom"; import "ui/keyboard/public/keyboard_config.mojom"; -import "ui/keyboard/public/keyboard_enable_flag.mojom"; interface KeyboardControllerObserver { - // Called when the keyboard is enabled or disabled. If ReloadKeyboard() is - // called or other code enables the keyboard while already enabled, this will - // be called twice, once when the keyboard is disabled and again when it is - // re-enabled. + // Called when the keyboard is enabled or disabled. If the keyboard is enabled + // while already enabled, this will be called twice, once when the keyboard is + // disabled and again when it is re-enabled. OnKeyboardEnabledChanged(bool is_enabled); // Called when the virtual keyboard configuration changes. @@ -33,20 +31,6 @@ // Sets the current keyboard configuration. SetKeyboardConfig(keyboard.mojom.KeyboardConfig config); - // Returns whether the virtual keyboard has been enabled. - IsKeyboardEnabled() => (bool enabled); - - // Sets the provided keyboard enable flag. If the computed enabled state - // changes, enables or disables the keyboard to match the new state. - SetEnableFlag(keyboard.mojom.KeyboardEnableFlag flag); - - // Clears the privided keyboard enable flag. If the computed enabled state - // changes, enables or disables the keyboard to match the new state. - ClearEnableFlag(keyboard.mojom.KeyboardEnableFlag flag); - - // Reloads the virtual keyboard if it is enabled. - ReloadKeyboard(); - // Adds a KeyboardControllerObserver. AddObserver(associated KeyboardControllerObserver observer); };
diff --git a/ash/shelf/shelf_button.cc b/ash/shelf/shelf_button.cc index 85be282..c446ff9 100644 --- a/ash/shelf/shelf_button.cc +++ b/ash/shelf/shelf_button.cc
@@ -214,25 +214,28 @@ cc::PaintFlags flags; // Active and running indicators look a little different in the new UI. flags.setColor(active_ ? kIndicatorColorActive : kIndicatorColorRunning); - float indicator_width; - float indicator_height; - gfx::PointF origin; + flags.setAntiAlias(true); + flags.setStrokeCap(cc::PaintFlags::Cap::kRound_Cap); + flags.setStrokeJoin(cc::PaintFlags::Join::kRound_Join); + flags.setStrokeWidth(kStatusIndicatorThickness); + flags.setStyle(cc::PaintFlags::kStroke_Style); + float stroke_length = + active_ ? kStatusIndicatorActiveSize : kStatusIndicatorRunningSize; + gfx::PointF start; + gfx::PointF end; if (horizontal_shelf_) { - indicator_width = - active_ ? kStatusIndicatorActiveSize : kStatusIndicatorRunningSize; - indicator_height = kStatusIndicatorThickness; + start = gfx::PointF(center.x() - stroke_length / 2, center.y()); + end = start; + end.Offset(stroke_length, 0); } else { - indicator_width = kStatusIndicatorThickness; - indicator_height = - active_ ? kStatusIndicatorActiveSize : kStatusIndicatorRunningSize; + start = gfx::PointF(center.x(), center.y() - stroke_length / 2); + end = start; + end.Offset(0, stroke_length); } - origin = gfx::PointF(center.x() - indicator_width / 2, - center.y() - indicator_height / 2); - canvas->DrawRect( - gfx::ScaleRect( - gfx::RectF(origin, gfx::SizeF(indicator_width, indicator_height)), - dsf), - flags); + gfx::Path path; + path.moveTo(start.x() * dsf, start.y() * dsf); + path.lineTo(end.x() * dsf, end.y() * dsf); + canvas->DrawPath(path, flags); } // ShelfButtonAnimation::Observer
diff --git a/ash/shelf/shelf_constants.h b/ash/shelf/shelf_constants.h index f1edaeb..6a764e7c 100644 --- a/ash/shelf/shelf_constants.h +++ b/ash/shelf/shelf_constants.h
@@ -85,7 +85,7 @@ constexpr int kOverflowButtonCornerRadiusOldUi = 2; // The distance between the edge of the shelf and the status indicators. -constexpr int kStatusIndicatorOffsetFromShelfEdge = 2; +constexpr int kStatusIndicatorOffsetFromShelfEdge = 1; // The direction of the focus cycling. enum CycleDirection { CYCLE_FORWARD, CYCLE_BACKWARD };
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index aaef75e9..bb88d9d 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -251,6 +251,7 @@ <translation id="5537725057119320332">Cast</translation> <translation id="5548285847212963613">The extension "<ph name="EXTENSION_NAME" />" can help connect to this network.</translation> <translation id="554893713779400387">Toggle dictation</translation> +<translation id="5554214597676791969">To sign back in, enter your password</translation> <translation id="5571066253365925590">Bluetooth enabled</translation> <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation> <translation id="5600837773213129531">Press Ctrl + Alt + Z to disable spoken feedback.</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 527cbd8..068b3f8 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -154,6 +154,7 @@ <translation id="3454224730401036106">आपका कनेक्शन ज़्यादा सुरक्षित नेटवर्क पर स्विच कर दिया गया है</translation> <translation id="3477079411857374384">Control-Shift-Space</translation> <translation id="3510164367642747937">माउस कर्सर को हाइलाइट करें</translation> +<translation id="3510503721818156981">Chromebook एक नए फ़ोन से जुड़ गया है</translation> <translation id="3513798432020909783"><ph name="MANAGER_EMAIL" /> खाता संभालते हैं</translation> <translation id="3573179567135747900">"<ph name="FROM_LOCALE" />" में पुन: बदलें (फिर से आरंभ करने की आवश्यकता है)</translation> <translation id="3595596368722241419">बैटरी पूर्ण</translation> @@ -198,6 +199,7 @@ <translation id="4331809312908958774">Chrome OS</translation> <translation id="4338109981321384717">आवर्धक ग्लास</translation> <translation id="4351433414020964307">Assistant सेवा लोड हो रही है...</translation> +<translation id="435527878592612277">अपनी फ़ोटो चुनें</translation> <translation id="4378551569595875038">कनेक्ट हो रहा है...</translation> <translation id="4379531060876907730">ये आपके स्टाइलस टूल हैं</translation> <translation id="4421231901400348175">आपकी स्क्रीन का नियंत्रण दूरस्थ सहायक के द्वारा <ph name="HELPER_NAME" /> से शेयर किया जा रहा है.</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 07d84ab..2c7a4b21 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -251,6 +251,7 @@ <translation id="5537725057119320332">Prenášať</translation> <translation id="5548285847212963613">Rozšírenie <ph name="EXTENSION_NAME" /> vám môže pomôcť pripojiť sa k tejto sieti.</translation> <translation id="554893713779400387">Prepnúť diktovanie</translation> +<translation id="5554214597676791969">Ak sa chcete znova prihlásiť, zadajte heslo</translation> <translation id="5571066253365925590">Rozhranie Bluetooth je povolené</translation> <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation> <translation id="5600837773213129531">Hovorenú spätnú väzbu zakážete kombináciou klávesov Ctrl+Alt+Z.</translation>
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc index f6b3e90..ecb51b9 100644 --- a/ash/system/unified/unified_system_tray_view.cc +++ b/ash/system/unified/unified_system_tray_view.cc
@@ -195,9 +195,14 @@ FocusSearch::AnchoredDialogPolicy can_go_into_anchored_dialog, views::FocusTraversable** focus_traversable, views::View** focus_traversable_view) override { + // Initial view that is focused when first time Tab or Shift-Tab is pressed. + views::View* default_start_view = + search_direction == FocusSearch::SearchDirection::kForwards + ? view_->system_tray_container_ + : view_->notification_hidden_view_; return views::FocusSearch::FindNextFocusableView( - starting_view ? starting_view : view_->system_tray_container_, - search_direction, traversal_direction, + starting_view ? starting_view : default_start_view, search_direction, + traversal_direction, starting_view ? check_starting_view : StartingViewPolicy::kCheckStartingView, can_go_into_anchored_dialog, focus_traversable, focus_traversable_view); @@ -276,8 +281,8 @@ // |system_tray_container_|, but we have to complete the cycle by setting // |message_center_view_| next to |detailed_view_container_|. // Also, SetNextFocusableView does not support loop as mentioned in the doc, - // we have to set null to |message_center_view_|. - message_center_view->SetNextFocusableView(nullptr); + // we have to set null to |notification_hidden_view_|. + notification_hidden_view_->SetNextFocusableView(nullptr); detailed_view_container_->SetNextFocusableView(message_center_view); top_shortcuts_view_->SetExpandedAmount(expanded_amount_);
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py index b705d0b..fb19445 100755 --- a/build/android/apk_operations.py +++ b/build/android/apk_operations.py
@@ -910,16 +910,17 @@ args.__dict__.setdefault('apk_path', None) args.__dict__.setdefault('incremental_json', None) - if self.supports_incremental: - incremental_apk_path = None - if args.incremental_json and not args.non_incremental: - with open(args.incremental_json) as f: - install_dict = json.load(f) - incremental_apk_path = os.path.join( - args.output_directory, install_dict['apk_path']) - if not os.path.exists(incremental_apk_path): - incremental_apk_path = None + incremental_apk_path = None + if args.incremental_json and not (self.supports_incremental and + args.non_incremental): + with open(args.incremental_json) as f: + install_dict = json.load(f) + incremental_apk_path = os.path.join(args.output_directory, + install_dict['apk_path']) + if not os.path.exists(incremental_apk_path): + incremental_apk_path = None + if self.supports_incremental: if args.incremental and args.non_incremental: self._parser.error('Must use only one of --incremental and ' '--non-incremental') @@ -935,13 +936,13 @@ self._parser.error('Both incremental and non-incremental apks exist. ' 'Select using --incremental or --non-incremental') - if ((self.needs_apk_path and not self.is_bundle) or args.apk_path - or (self.supports_incremental and args.incremental_json)): - if self.supports_incremental and incremental_apk_path: + if ((self.needs_apk_path and not self.is_bundle) or args.apk_path or + incremental_apk_path): + if args.apk_path: + self.apk_helper = apk_helper.ToHelper(args.apk_path) + elif incremental_apk_path: self.install_dict = install_dict self.apk_helper = apk_helper.ToHelper(incremental_apk_path) - elif args.apk_path: - self.apk_helper = apk_helper.ToHelper(args.apk_path) else: self._parser.error('Apk is not built.')
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index e12b4a2d..b4e1c968 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -1579,6 +1579,10 @@ ] } + if (!is_android && !is_chromeos) { + public_deps += [ "//chrome/browser/resources:onboarding_welcome_resources" ] + } + if (enable_extensions) { public_deps += [ "//chrome/browser/resources:extensions_resources",
diff --git a/chrome/android/java/res/drawable-hdpi/ic_error_grey800_24dp_filled.png b/chrome/android/java/res/drawable-hdpi/ic_error_grey800_24dp_filled.png new file mode 100644 index 0000000..bf2b62a8 --- /dev/null +++ b/chrome/android/java/res/drawable-hdpi/ic_error_grey800_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/ic_error_white_24dp_filled.png b/chrome/android/java/res/drawable-hdpi/ic_error_white_24dp_filled.png new file mode 100644 index 0000000..fa6ac05 --- /dev/null +++ b/chrome/android/java/res/drawable-hdpi/ic_error_white_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/ic_error_grey800_24dp_filled.png b/chrome/android/java/res/drawable-mdpi/ic_error_grey800_24dp_filled.png new file mode 100644 index 0000000..37100ae --- /dev/null +++ b/chrome/android/java/res/drawable-mdpi/ic_error_grey800_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/ic_error_white_24dp_filled.png b/chrome/android/java/res/drawable-mdpi/ic_error_white_24dp_filled.png new file mode 100644 index 0000000..d9506cb --- /dev/null +++ b/chrome/android/java/res/drawable-mdpi/ic_error_white_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_error_grey800_24dp_filled.png b/chrome/android/java/res/drawable-xhdpi/ic_error_grey800_24dp_filled.png new file mode 100644 index 0000000..9e085ed --- /dev/null +++ b/chrome/android/java/res/drawable-xhdpi/ic_error_grey800_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_error_white_24dp_filled.png b/chrome/android/java/res/drawable-xhdpi/ic_error_white_24dp_filled.png new file mode 100644 index 0000000..a5826be7 --- /dev/null +++ b/chrome/android/java/res/drawable-xhdpi/ic_error_white_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_error_grey800_24dp_filled.png b/chrome/android/java/res/drawable-xxhdpi/ic_error_grey800_24dp_filled.png new file mode 100644 index 0000000..66c931f --- /dev/null +++ b/chrome/android/java/res/drawable-xxhdpi/ic_error_grey800_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_error_white_24dp_filled.png b/chrome/android/java/res/drawable-xxhdpi/ic_error_white_24dp_filled.png new file mode 100644 index 0000000..99bfbe8 --- /dev/null +++ b/chrome/android/java/res/drawable-xxhdpi/ic_error_white_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_error_grey800_24dp_filled.png b/chrome/android/java/res/drawable-xxxhdpi/ic_error_grey800_24dp_filled.png new file mode 100644 index 0000000..8acc442 --- /dev/null +++ b/chrome/android/java/res/drawable-xxxhdpi/ic_error_grey800_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_error_white_24dp_filled.png b/chrome/android/java/res/drawable-xxxhdpi/ic_error_white_24dp_filled.png new file mode 100644 index 0000000..b1aae4d4 --- /dev/null +++ b/chrome/android/java/res/drawable-xxxhdpi/ic_error_white_24dp_filled.png Binary files differ
diff --git a/chrome/android/java/res/layout/contextual_suggestions_card_modern.xml b/chrome/android/java/res/layout/contextual_suggestions_card_modern.xml index a5f55d9..7dec5a1c 100644 --- a/chrome/android/java/res/layout/contextual_suggestions_card_modern.xml +++ b/chrome/android/java/res/layout/contextual_suggestions_card_modern.xml
@@ -5,9 +5,9 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" style="@style/SuggestionCardModern" + android:background="@drawable/hairline_border_card_background" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/snippets_padding">
diff --git a/chrome/android/java/res/layout/os_version_unsupported_preference.xml b/chrome/android/java/res/layout/os_version_unsupported_preference.xml new file mode 100644 index 0000000..da81d15 --- /dev/null +++ b/chrome/android/java/res/layout/os_version_unsupported_preference.xml
@@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<!-- Layout for a preference with a title and a compound drawable below. --> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/PreferenceLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <TextView + android:id="@android:id/title" + style="@style/PreferenceTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/os_version_title" /> + + <TextView + android:id="@android:id/summary" + style="@style/PreferenceSummary" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + <TextView + android:id="@+id/os_deprecation_warning" + style="@style/PreferenceSummary" + android:layout_marginTop="7dp" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:layout_gravity="center_vertical" + android:text="@string/deprecation_warning" + android:drawablePadding="30dp" + android:drawableEnd="@drawable/exclamation_triangle" + android:layout_marginEnd="17dp" + android:visibility="gone" /> +</LinearLayout>
diff --git a/chrome/android/java/res/layout/toolbar_tablet.xml b/chrome/android/java/res/layout/toolbar_tablet.xml index 1ec3e2f..e4aacfc 100644 --- a/chrome/android/java/res/layout/toolbar_tablet.xml +++ b/chrome/android/java/res/layout/toolbar_tablet.xml
@@ -68,7 +68,7 @@ android:contentDescription="@string/accessibility_toolbar_btn_tabswitcher_toggle_default" android:visibility="gone" /> - <FrameLayout + <org.chromium.chrome.browser.toolbar.MenuButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/menu_button_wrapper" > @@ -78,6 +78,7 @@ style="@style/ToolbarMenuButtonTablet" android:src="@drawable/ic_more_vert_black_24dp" android:contentDescription="@string/accessibility_toolbar_btn_menu" + android:layout_gravity="center" app:tint="@color/dark_mode_tint" /> <ImageView @@ -86,8 +87,9 @@ android:src="@drawable/badge_update_dark" tools:ignore="ContentDescription" android:importantForAccessibility="no" + android:layout_gravity="center" android:visibility="invisible" /> - </FrameLayout> + </org.chromium.chrome.browser.toolbar.MenuButton> </LinearLayout> </org.chromium.chrome.browser.toolbar.ToolbarTablet>
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml index c7e7409..077aeee 100644 --- a/chrome/android/java/res/values-v17/styles.xml +++ b/chrome/android/java/res/values-v17/styles.xml
@@ -207,9 +207,6 @@ <item name="android:paddingEnd">8dp</item> </style> <style name="PreferenceLayout" parent="PreferenceLayoutBase" /> - <style name="DeprecationWarningPreferenceTheme" parent="PreferencesTheme"> - <item name="android:textAppearance">@style/BlackBodyDefault</item> - </style> <style name="PreferenceSpinnerItem"> <item name="android:textAppearance">@style/TextAppearance.PreferenceMediumText</item> </style>
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml index 0f9cd9c..2d7ab74 100644 --- a/chrome/android/java/res/values/ids.xml +++ b/chrome/android/java/res/values/ids.xml
@@ -78,9 +78,10 @@ <item type="id" name="contextmenu_open_in_browser_id" /> <!-- Link Group --> - <item type="id" name="contextmenu_open_in_other_window" /> <item type="id" name="contextmenu_open_in_new_tab" /> <item type="id" name="contextmenu_open_in_incognito_tab" /> + <item type="id" name="contextmenu_open_in_other_window" /> + <item type="id" name="contextmenu_open_in_ephemeral_tab" /> <item type="id" name="contextmenu_copy_link_address" /> <item type="id" name="contextmenu_copy_link_text" /> <item type="id" name="contextmenu_save_link_as" />
diff --git a/chrome/android/java/res/xml/about_chrome_preferences.xml b/chrome/android/java/res/xml/about_chrome_preferences.xml index 5b8de44f..e1ddc30 100644 --- a/chrome/android/java/res/xml/about_chrome_preferences.xml +++ b/chrome/android/java/res/xml/about_chrome_preferences.xml
@@ -7,7 +7,7 @@ <Preference android:key="application_version" android:title="@string/application_version_title" /> - <Preference + <org.chromium.chrome.browser.preferences.AboutChromePreferenceOSVersion android:key="os_version" android:title="@string/os_version_title" /> <Preference
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index b74518f..ce7cca3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -2074,9 +2074,8 @@ /** * Callback after UpdateMenuItemHelper#checkForUpdateOnBackgroundThread is complete. - * @param updateAvailable Whether an update is available. */ - public void onCheckForUpdate(boolean updateAvailable) { + public void onCheckForUpdate() { if (UpdateMenuItemHelper.getInstance().shouldShowToolbarBadge(this)) { mToolbarManager.showAppMenuUpdateBadge(); mCompositorViewHolder.requestRender();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java index 72a447f..bef70fe1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -230,6 +230,7 @@ public static final String INFLATE_TOOLBAR_ON_BACKGROUND_THREAD = "BackgroundToolbarInflation"; public static final String INTEREST_FEED_CONTENT_SUGGESTIONS = "InterestFeedContentSuggestions"; public static final String LANGUAGES_PREFERENCE = "LanguagesPreference"; + public static final String JELLY_BEAN_SUPPORTED = "JellyBeanSupported"; public static final String LONG_PRESS_BACK_FOR_HISTORY = "LongPressBackForHistory"; public static final String SEARCH_ENGINE_PROMO_EXISTING_DEVICE = "SearchEnginePromo.ExistingDevice";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java index 4ed78b96..7542c321 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
@@ -68,17 +68,26 @@ public static final String DISABLE_LOFI_SNACKBAR = "disable-lo-fi-snackbar"; /** - * Forces the update menu item to show. + * Forces the update state to be set to the given state if the value is {@link + * org.chromium.chrome.browser.omaha.UpdateMenuItemHelper#NONE_SWITCH_VALUE}, {@link + * org.chromium.chrome.browser.omaha.UpdateMenuItemHelper#UPDATE_AVAILABLE_SWITCH_VALUE}, + * {@link + * org.chromium.chrome.browser.omaha.UpdateMenuItemHelper#UNSUPPORTED_OS_VERSION_SWITCH_VALUE}. */ - public static final String FORCE_SHOW_UPDATE_MENU_ITEM = "force-show-update-menu-item"; + public static final String FORCE_UPDATE_MENU_UPDATE_TYPE = "force-update-menu-type"; /** - * Forces the update menu badge to show. + * Forces the update menu badge to show. This requires the update type to be valid as well. + * + * @see #FORCE_UPDATE_MENU_UPDATE_TYPE */ public static final String FORCE_SHOW_UPDATE_MENU_BADGE = "force-show-update-menu-badge"; /** - * Sets the market URL for Chrome for use in testing. + * Sets the market URL for Chrome for use in testing. This requires setting {@link + * #FORCE_UPDATE_MENU_UPDATE_TYPE} to {@link + * org.chromium.chrome.browser.omaha.UpdateMenuItemHelper#UPDATE_AVAILABLE_SWITCH_VALUE}. + * @see #FORCE_UPDATE_MENU_UPDATE_TYPE */ public static final String MARKET_URL_FOR_TESTING = "market-url-for-testing";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SingleTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/SingleTabActivity.java index 675910d..14c5fe6c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/SingleTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/SingleTabActivity.java
@@ -136,5 +136,5 @@ } @Override - public void onCheckForUpdate(boolean updateAvailable) {} + public void onCheckForUpdate() {} }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java index d366028..4e1a3b5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
@@ -197,13 +197,8 @@ holder = (CustomMenuItemViewHolder) convertView.getTag(); } setupStandardMenuItemViewHolder(holder, convertView, item); - String summary = UpdateMenuItemHelper.getInstance().getMenuItemSummaryText( - mInflater.getContext()); - if (TextUtils.isEmpty(summary)) { - holder.summary.setVisibility(View.GONE); - } else { - holder.summary.setText(summary); - } + UpdateMenuItemHelper.getInstance().decorateMenuItemViews( + mInflater.getContext(), holder.text, holder.image, holder.summary); break; } case MenuItemType.THREE_BUTTON:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java index c0dc9d65..7a699d1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
@@ -23,48 +23,52 @@ */ public class ChromeContextMenuItem implements ContextMenuItem { @IntDef({Item.OPEN_IN_NEW_CHROME_TAB, Item.OPEN_IN_CHROME_INCOGNITO_TAB, - Item.OPEN_IN_BROWSER_ID, Item.OPEN_IN_OTHER_WINDOW, Item.OPEN_IN_NEW_TAB, - Item.OPEN_IN_INCOGNITO_TAB, Item.COPY_LINK_ADDRESS, Item.COPY_LINK_TEXT, - Item.SAVE_LINK_AS, Item.LOAD_ORIGINAL_IMAGE, Item.SAVE_IMAGE, Item.OPEN_IMAGE, - Item.OPEN_IMAGE_IN_NEW_TAB, Item.SEARCH_BY_IMAGE, Item.CALL, Item.SEND_MESSAGE, - Item.ADD_TO_CONTACTS, Item.COPY, Item.SAVE_VIDEO, Item.OPEN_IN_CHROME, - Item.BROWSER_ACTIONS_OPEN_IN_BACKGROUND, Item.BROWSER_ACTIONS_OPEN_IN_INCOGNITO_TAB, - Item.BROWSER_ACTION_SAVE_LINK_AS, Item.BROWSER_ACTIONS_COPY_ADDRESS}) + Item.OPEN_IN_BROWSER_ID, Item.OPEN_IN_NEW_TAB, Item.OPEN_IN_INCOGNITO_TAB, + Item.OPEN_IN_OTHER_WINDOW, Item.OPEN_IN_EPHEMERAL_TAB, Item.COPY_LINK_ADDRESS, + Item.COPY_LINK_TEXT, Item.SAVE_LINK_AS, Item.LOAD_ORIGINAL_IMAGE, Item.SAVE_IMAGE, + Item.OPEN_IMAGE, Item.OPEN_IMAGE_IN_NEW_TAB, Item.SEARCH_BY_IMAGE, Item.CALL, + Item.SEND_MESSAGE, Item.ADD_TO_CONTACTS, Item.COPY, Item.SAVE_VIDEO, + Item.OPEN_IN_CHROME, Item.BROWSER_ACTIONS_OPEN_IN_BACKGROUND, + Item.BROWSER_ACTIONS_OPEN_IN_INCOGNITO_TAB, Item.BROWSER_ACTION_SAVE_LINK_AS, + Item.BROWSER_ACTIONS_COPY_ADDRESS}) @Retention(RetentionPolicy.SOURCE) public @interface Item { // Values are numerated from 0 and can't have gaps. + // The menu and string IDs below must be kept in sync with this list. // Custom Tab Group int OPEN_IN_NEW_CHROME_TAB = 0; int OPEN_IN_CHROME_INCOGNITO_TAB = 1; int OPEN_IN_BROWSER_ID = 2; // Link Group - int OPEN_IN_OTHER_WINDOW = 3; - int OPEN_IN_NEW_TAB = 4; - int OPEN_IN_INCOGNITO_TAB = 5; - int COPY_LINK_ADDRESS = 6; - int COPY_LINK_TEXT = 7; - int SAVE_LINK_AS = 8; + int OPEN_IN_NEW_TAB = 3; + int OPEN_IN_INCOGNITO_TAB = 4; + int OPEN_IN_OTHER_WINDOW = 5; + int OPEN_IN_EPHEMERAL_TAB = 6; + int COPY_LINK_ADDRESS = 7; + int COPY_LINK_TEXT = 8; + int SAVE_LINK_AS = 9; // Image Group - int LOAD_ORIGINAL_IMAGE = 9; - int SAVE_IMAGE = 10; - int OPEN_IMAGE = 11; - int OPEN_IMAGE_IN_NEW_TAB = 12; - int SEARCH_BY_IMAGE = 13; + int LOAD_ORIGINAL_IMAGE = 10; + int SAVE_IMAGE = 11; + int OPEN_IMAGE = 12; + int OPEN_IMAGE_IN_NEW_TAB = 13; + int SEARCH_BY_IMAGE = 14; // Message Group - int CALL = 14; - int SEND_MESSAGE = 15; - int ADD_TO_CONTACTS = 16; - int COPY = 17; + int CALL = 15; + int SEND_MESSAGE = 16; + int ADD_TO_CONTACTS = 17; + int COPY = 18; // Video Group - int SAVE_VIDEO = 18; + int SAVE_VIDEO = 19; // Other - int OPEN_IN_CHROME = 19; + int OPEN_IN_CHROME = 20; // Browser Action Items - int BROWSER_ACTIONS_OPEN_IN_BACKGROUND = 20; - int BROWSER_ACTIONS_OPEN_IN_INCOGNITO_TAB = 21; - int BROWSER_ACTION_SAVE_LINK_AS = 22; - int BROWSER_ACTIONS_COPY_ADDRESS = 23; - int NUM_ENTRIES = 24; + int BROWSER_ACTIONS_OPEN_IN_BACKGROUND = 21; + int BROWSER_ACTIONS_OPEN_IN_INCOGNITO_TAB = 22; + int BROWSER_ACTION_SAVE_LINK_AS = 23; + int BROWSER_ACTIONS_COPY_ADDRESS = 24; + // ALWAYS UPDATE! + int NUM_ENTRIES = 25; } /** @@ -74,9 +78,10 @@ R.id.contextmenu_open_in_new_chrome_tab, // Item.OPEN_IN_NEW_CHROME_TAB R.id.contextmenu_open_in_chrome_incognito_tab, // Item.OPEN_IN_CHROME_INCOGNITO_TAB R.id.contextmenu_open_in_browser_id, // Item.OPEN_IN_BROWSER_ID - R.id.contextmenu_open_in_other_window, // Item.OPEN_IN_OTHER_WINDOW R.id.contextmenu_open_in_new_tab, // Item.OPEN_IN_NEW_TAB R.id.contextmenu_open_in_incognito_tab, // Item.OPEN_IN_INCOGNITO_TAB + R.id.contextmenu_open_in_other_window, // Item.OPEN_IN_OTHER_WINDOW + R.id.contextmenu_open_in_ephemeral_tab, // Item.OPEN_IN_EPHEMERAL_TAB R.id.contextmenu_copy_link_address, // Item.COPY_LINK_ADDRESS R.id.contextmenu_copy_link_text, // Item.COPY_LINK_TEXT R.id.contextmenu_save_link_as, // Item.SAVE_LINK_AS @@ -104,9 +109,10 @@ R.string.contextmenu_open_in_new_chrome_tab, // Item.OPEN_IN_NEW_CHROME_TAB: R.string.contextmenu_open_in_chrome_incognito_tab, // Item.OPEN_IN_CHROME_INCOGNITO_TAB: 0, // Item.OPEN_IN_BROWSER_ID is not handled by this mapping. - R.string.contextmenu_open_in_other_window, // Item.OPEN_IN_OTHER_WINDOW: R.string.contextmenu_open_in_new_tab, // Item.OPEN_IN_NEW_TAB: R.string.contextmenu_open_in_incognito_tab, // Item.OPEN_IN_INCOGNITO_TAB: + R.string.contextmenu_open_in_other_window, // Item.OPEN_IN_OTHER_WINDOW: + R.string.contextmenu_open_in_ephemeral_tab, // Item.OPEN_IN_EPHEMERAL_TAB: R.string.contextmenu_copy_link_address, // Item.COPY_LINK_ADDRESS: R.string.contextmenu_copy_link_text, // Item.COPY_LINK_TEXT: R.string.contextmenu_save_link, // Item.SAVE_LINK_AS:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java index 5bea6ea..8b8f199a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -17,6 +17,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item; +import org.chromium.chrome.browser.experiments.EphemeralTab; import org.chromium.chrome.browser.firstrun.FirstRunStatus; import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; @@ -67,8 +68,10 @@ } static class ContextMenuUma { - // Note: these values must match the ContextMenuOption enum in histograms.xml. - @IntDef({Action.OPEN_IN_NEW_TAB, Action.OPEN_IN_INCOGNITO_TAB, Action.COPY_LINK_ADDRESS, + // Note: these values must match the ContextMenuOption enum in enums.xml. + // Only add values to the end, right before NUM_ENTRIES! + @IntDef({ + Action.OPEN_IN_NEW_TAB, Action.OPEN_IN_INCOGNITO_TAB, Action.COPY_LINK_ADDRESS, Action.COPY_EMAIL_ADDRESS, Action.COPY_LINK_TEXT, Action.SAVE_LINK, Action.SAVE_IMAGE, Action.OPEN_IMAGE, Action.OPEN_IMAGE_IN_NEW_TAB, Action.SEARCH_BY_IMAGE, Action.LOAD_ORIGINAL_IMAGE, Action.SAVE_VIDEO, @@ -76,7 +79,8 @@ Action.ADD_TO_CONTACTS, Action.CALL, Action.SEND_TEXT_MESSAGE, Action.COPY_PHONE_NUMBER, Action.OPEN_IN_NEW_CHROME_TAB, Action.OPEN_IN_CHROME_INCOGNITO_TAB, Action.OPEN_IN_BROWSER, Action.OPEN_IN_CHROME, - Action.SHARE_LINK}) + Action.SHARE_LINK, Action.OPEN_IN_EPHEMERAL_TAB, + }) @Retention(RetentionPolicy.SOURCE) public @interface Action { int OPEN_IN_NEW_TAB = 0; @@ -103,10 +107,11 @@ int OPEN_IN_BROWSER = 35; int OPEN_IN_CHROME = 36; int SHARE_LINK = 37; - int NUM_ENTRIES = 38; + int OPEN_IN_EPHEMERAL_TAB = 38; + int NUM_ENTRIES = 39; } - // Note: these values must match the ContextMenuSaveLinkType enum in histograms.xml. + // Note: these values must match the ContextMenuSaveLinkType enum in enums.xml. // Only add new values at the end, right before NUM_TYPES. We depend on these specific // values in UMA histograms. @IntDef({Type.UNKNOWN, Type.TEXT, Type.IMAGE, Type.AUDIO, Type.VIDEO, Type.PDF}) @@ -121,7 +126,7 @@ int NUM_ENTRIES = 6; } - // Note: these values must match the ContextMenuSaveImage enum in histograms.xml. + // Note: these values must match the ContextMenuSaveImage enum in enums.xml. // Only add new values at the end, right before NUM_ENTRIES. @IntDef({TypeSaveImage.LOADED, TypeSaveImage.FETCHED_LOFI, TypeSaveImage.NOT_DOWNLOADABLE, TypeSaveImage.DISABLED_AND_IS_NOT_IMAGE_PARAM, @@ -253,6 +258,9 @@ if (mDelegate.isOpenInOtherWindowSupported()) { linkTab.add(new ChromeContextMenuItem(Item.OPEN_IN_OTHER_WINDOW)); } + if (EphemeralTab.isCapable()) { + linkTab.add(new ChromeContextMenuItem(Item.OPEN_IN_EPHEMERAL_TAB)); + } } if (!MailTo.isMailTo(params.getLinkUrl()) && !UrlUtilities.isTelScheme(params.getLinkUrl())) { @@ -398,15 +406,18 @@ @Override public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams params, int itemId) { - if (itemId == R.id.contextmenu_open_in_other_window) { - ContextMenuUma.record(params, ContextMenuUma.Action.OPEN_IN_OTHER_WINDOW); - mDelegate.onOpenInOtherWindow(params.getUrl(), params.getReferrer()); - } else if (itemId == R.id.contextmenu_open_in_new_tab) { + if (itemId == R.id.contextmenu_open_in_new_tab) { ContextMenuUma.record(params, ContextMenuUma.Action.OPEN_IN_NEW_TAB); mDelegate.onOpenInNewTab(params.getUrl(), params.getReferrer()); } else if (itemId == R.id.contextmenu_open_in_incognito_tab) { ContextMenuUma.record(params, ContextMenuUma.Action.OPEN_IN_INCOGNITO_TAB); mDelegate.onOpenInNewIncognitoTab(params.getUrl()); + } else if (itemId == R.id.contextmenu_open_in_other_window) { + ContextMenuUma.record(params, ContextMenuUma.Action.OPEN_IN_OTHER_WINDOW); + mDelegate.onOpenInOtherWindow(params.getUrl(), params.getReferrer()); + } else if (itemId == R.id.contextmenu_open_in_ephemeral_tab) { + ContextMenuUma.record(params, ContextMenuUma.Action.OPEN_IN_EPHEMERAL_TAB); + mDelegate.onOpenInEphemeralTab(params.getUrl(), params.getReferrer()); } else if (itemId == R.id.contextmenu_open_image) { ContextMenuUma.record(params, ContextMenuUma.Action.OPEN_IMAGE); mDelegate.onOpenImageUrl(params.getSrcUrl(), params.getReferrer());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemDelegate.java index 8069902..05ab1b8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemDelegate.java
@@ -169,7 +169,7 @@ /** * Called when the {@code url} should be opened in a new Chrome tab from CCT. - * @param url The URL to open. + * @param linkUrl The URL to open. * @param isIncognito true if the {@code url} should be opened in a new incognito tab. */ void onOpenInNewChromeTabFromCCT(String linkUrl, boolean isIncognito); @@ -184,4 +184,11 @@ * @param url The URL to open. */ void onOpenInDefaultBrowser(String url); + + /** + * Called when the {@code url} should be opened in an Ephemeral tab with the same incognito + * state as the current {@link Tab}. + * @param url The URL to open. + */ + void onOpenInEphemeralTab(String url, Referrer referrer); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index cf87004..5684d4b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -1359,8 +1359,7 @@ } @Override - public void onCheckForUpdate(boolean updateAvailable) { - } + public void onCheckForUpdate() {} /** * @return The {@link CustomTabIntentDataProvider} for this {@link CustomTabActivity}. For test
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java index 4dcdd495..1ba9cee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
@@ -1129,6 +1129,15 @@ } /** + * Returns |true| if the offline item is not null and has already been viewed by the user. + * @param offlineItem The offline item to check. + * @return true if the item is valid has been viewed by the user. + */ + public static boolean isOfflineItemViewed(OfflineItem offlineItem) { + return offlineItem != null && offlineItem.lastAccessedTimeMs > offlineItem.completionTimeMs; + } + + /** * Given two timestamps, calculates if both occur on the same date. * @return True if they belong in the same day. False otherwise. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java index 4ada65b..fd5ac68 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java
@@ -36,7 +36,6 @@ import org.chromium.components.offline_items_collection.ContentId; import org.chromium.components.offline_items_collection.OfflineContentProvider; import org.chromium.components.offline_items_collection.OfflineItem; -import org.chromium.components.offline_items_collection.OfflineItemFilter; import org.chromium.components.offline_items_collection.OfflineItemState; import org.chromium.components.variations.VariationsAssociatedData; @@ -817,17 +816,34 @@ } private void recordOfflineItemCountHistograms() { - int[] itemCounts = new int[OfflineItemFilter.FILTER_BOUNDARY]; - for (DownloadHistoryItemWrapper item : mOfflineItems) { - OfflineItemWrapper offlineItem = (OfflineItemWrapper) item; - if (offlineItem.isOffTheRecord()) continue; - itemCounts[offlineItem.getOfflineItemFilter()]++; + int offlinePageCount = 0; + int viewedOfflinePageCount = 0; + int prefetchedOfflinePageCount = 0; + int viewedPrefetchedOfflinePageCount = 0; + + for (DownloadHistoryItemWrapper itemWrapper : mOfflineItems) { + if (itemWrapper.isOffTheRecord()) continue; + OfflineItemWrapper offlineItemWrapper = (OfflineItemWrapper) itemWrapper; + boolean hasBeenViewed = DownloadUtils.isOfflineItemViewed(offlineItemWrapper.getItem()); + if (offlineItemWrapper.isSuggested()) { + prefetchedOfflinePageCount++; + if (hasBeenViewed) viewedPrefetchedOfflinePageCount++; + } else { + offlinePageCount++; + if (hasBeenViewed) viewedOfflinePageCount++; + } } - // TODO(shaktisahu): UMA for initial counts of offline pages, regular downloads and download - // file types and file extensions. - RecordHistogram.recordCountHistogram("Android.DownloadManager.InitialCount.OfflinePage", - itemCounts[OfflineItemFilter.FILTER_PAGE]); + RecordHistogram.recordCountHistogram( + "Android.DownloadManager.InitialCount.OfflinePage", offlinePageCount); + RecordHistogram.recordCountHistogram( + "Android.DownloadManager.InitialCount.Viewed.OfflinePage", viewedOfflinePageCount); + RecordHistogram.recordCountHistogram( + "Android.DownloadManager.InitialCount.PrefetchedOfflinePage", + prefetchedOfflinePageCount); + RecordHistogram.recordCountHistogram( + "Android.DownloadManager.InitialCount.Viewed.PrefetchedOfflinePage", + viewedPrefetchedOfflinePageCount); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/experiments/EphemeralTab.java b/chrome/android/java/src/org/chromium/chrome/browser/experiments/EphemeralTab.java new file mode 100644 index 0000000..a5d7bff7 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/experiments/EphemeralTab.java
@@ -0,0 +1,33 @@ +// 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.experiments; + +import org.chromium.chrome.browser.ChromeFeatureList; +import org.chromium.content_public.common.Referrer; + +/** + * Manages an Ephemeral Tab, which allows a "sneak peek" at a linked page using the Overlay Panel. + */ +public class EphemeralTab { + /** @return whether this feature is currently capable of being used. */ + public static boolean isCapable() { + // TODO(donnd): check if all the conditions are right to support an Overlay. + return isEnabled(); + } + + /** + * Called when an Open operation needs to be taken. + * @param url The URL of the page to open. + * @param referrer The current {@link Referrer}. + * @param isIncognito Whether the Overlay should use Incognito. + */ + public static void onOpen(String url, Referrer referrer, boolean isIncognito) { + // TODO(donnd): Implement. + } + + /** @return Whether this feature is enabled. */ + private static boolean isEnabled() { + return ChromeFeatureList.isEnabled(ChromeFeatureList.EPHEMERAL_TAB); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java index ba10a86..30824b39 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java
@@ -13,16 +13,24 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.os.StatFs; +import android.support.annotation.IntDef; +import android.support.annotation.Nullable; import android.text.TextUtils; import android.view.View; import android.view.animation.LinearInterpolator; +import android.widget.TextView; import com.google.android.gms.common.GooglePlayServicesUtil; +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.BuildInfo; import org.chromium.base.CommandLine; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; @@ -32,45 +40,75 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.appmenu.AppMenu; +import org.chromium.chrome.browser.appmenu.AppMenuItemIcon; +import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.util.ConversionUtils; import org.chromium.components.variations.VariationsAssociatedData; import org.chromium.ui.interpolators.BakedBezierInterpolator; import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** - * Contains logic for whether the update menu item should be shown, whether the update toolbar badge - * should be shown, and UMA logging for the update menu item. + * Contains logic related to displaying app menu badge and a special menu item for information + * related to updates. + * + * It supports displaying a badge and item for whether an update is available, and a different + * badge and menu item if the Android OS version Chrome is currently running on is unsupported. + * + * It also has logic for logging usage of the update menu item to UMA. + * + * For manually testing this functionality, use the following switches: + * - {@link ChromeSwitches#FORCE_UPDATE_MENU_UPDATE_TYPE} (required) + * - {@link ChromeSwitches#FORCE_SHOW_UPDATE_MENU_BADGE} (optional) + * - {@link ChromeSwitches#MARKET_URL_FOR_TESTING} (optional) */ public class UpdateMenuItemHelper { - private static final String TAG = "UpdateMenuItemHelper"; + @IntDef({UpdateMenuItemHelper.UpdateType.UNKNOWN, UpdateMenuItemHelper.UpdateType.NONE, + UpdateMenuItemHelper.UpdateType.UPDATE_AVAILABLE, + UpdateMenuItemHelper.UpdateType.UNSUPPORTED_OS_VERSION}) + @Retention(RetentionPolicy.SOURCE) + public @interface UpdateType { + int UNKNOWN = 0; + int NONE = 1; + int UPDATE_AVAILABLE = 2; + int UNSUPPORTED_OS_VERSION = 3; + } + private static final String NONE_SWITCH_VALUE = "none"; + private static final String UPDATE_AVAILABLE_SWITCH_VALUE = "update_available"; + private static final String UNSUPPORTED_OS_VERSION_SWITCH_VALUE = "unsupported_os_version"; + + private static final String TAG = "UpdateMenuItemHelper"; // VariationsAssociatedData configs private static final String FIELD_TRIAL_NAME = "UpdateMenuItem"; private static final String ENABLED_VALUE = "true"; private static final String CUSTOM_SUMMARY = "custom_summary"; - private static final String MIN_REQUIRED_STORAGE_MB = "min_required_storage_for_update_mb"; + private static final String MIN_REQUIRED_STORAGE_MB = "min_required_storage_for_update_mb"; // UMA constants for logging whether the menu item was clicked. private static final int ITEM_NOT_CLICKED = 0; private static final int ITEM_CLICKED_INTENT_LAUNCHED = 1; private static final int ITEM_CLICKED_INTENT_FAILED = 2; - private static final int ITEM_CLICKED_BOUNDARY = 3; + private static final int ITEM_CLICKED_BOUNDARY = 3; // UMA constants for logging whether Chrome was updated after the menu item was clicked. private static final int UPDATED = 0; private static final int NOT_UPDATED = 1; - private static final int UPDATED_BOUNDARY = 2; + private static final int UPDATED_BOUNDARY = 2; private static UpdateMenuItemHelper sInstance; + private static Object sGetInstanceLock = new Object(); // Whether OmahaClient has already been checked for an update. private boolean mAlreadyCheckedForUpdates; - // Whether an update is available. - private boolean mUpdateAvailable; + // The current state of whether an update is available or whether it ever will be + // (unsupported OS). + private @UpdateType int mUpdateType; // URL to direct the user to when Omaha detects a newer version available. private String mUpdateUrl; @@ -81,6 +119,12 @@ // The latest Chrome version available if OmahaClient.isNewerVersionAvailable() returns true. private String mLatestVersion; + // If the current OS version is unsupported, and we show the menu badge, and then the user + // clicks the badge and sees the unsupported message, we store the current version to a + // preference and cache it here. This preference is read on startup to ensure we only show + // the unsupported message once per version. + private String mLatestUnsupportedVersionPreference; + /** * @return The {@link UpdateMenuItemHelper} instance. */ @@ -88,16 +132,97 @@ synchronized (UpdateMenuItemHelper.sGetInstanceLock) { if (sInstance == null) { sInstance = new UpdateMenuItemHelper(); - String testMarketUrl = getStringParamValue(ChromeSwitches.MARKET_URL_FOR_TESTING); - if (!TextUtils.isEmpty(testMarketUrl)) { - sInstance.mUpdateUrl = testMarketUrl; - } } return sInstance; } } /** + * Decorates a menu item with the appropriate styling depending on the current update type. + * + * @param context The current context. + * @param title The title view. + * @param image The image view. + * @param summary The summary view. + */ + public void decorateMenuItemViews( + Context context, TextView title, AppMenuItemIcon image, TextView summary) { + switch (getUpdateType()) { + case UpdateType.UPDATE_AVAILABLE: + title.setText(context.getString(R.string.menu_update)); + title.setTextColor(Color.RED); + + String customSummary = getStringParamValue(CUSTOM_SUMMARY); + if (TextUtils.isEmpty(customSummary)) { + summary.setText( + context.getResources().getString(R.string.menu_update_summary_default)); + } else { + summary.setText(customSummary); + } + + image.setImageResource(R.drawable.badge_update_dark); + break; + case UpdateType.UNSUPPORTED_OS_VERSION: + title.setText(R.string.menu_update_unsupported); + title.setTextColor(ApiCompatibilityUtils.getColor( + context.getResources(), R.color.default_text_color)); + + summary.setText(R.string.menu_update_unsupported_summary_default); + + image.setImageResource(R.drawable.ic_error_grey800_24dp_filled); + break; + case UpdateType.NONE: + // Intentional fall through. + case UpdateType.UNKNOWN: + // Intentional fall through. + default: + break; + } + } + + /** + * @param resources The resources to use for lookup. + * @return The dark drawable for the badge. + */ + @Nullable + public Drawable getDarkBadgeDrawable(Resources resources) { + switch (getUpdateType()) { + case UpdateType.UPDATE_AVAILABLE: + return ApiCompatibilityUtils.getDrawable(resources, R.drawable.badge_update_dark); + case UpdateType.UNSUPPORTED_OS_VERSION: + return ApiCompatibilityUtils.getDrawable( + resources, R.drawable.ic_error_grey800_24dp_filled); + case UpdateType.NONE: + // Intentional fall through. + case UpdateType.UNKNOWN: + // Intentional fall through. + default: + return null; + } + } + + /** + * @param resources The resources to use for lookup. + * @return The light drawable for the badge. + */ + @Nullable + public Drawable getLightBadgeDrawable(Resources resources) { + switch (getUpdateType()) { + case UpdateType.UPDATE_AVAILABLE: + return ApiCompatibilityUtils.getDrawable(resources, R.drawable.badge_update_light); + case UpdateType.UNSUPPORTED_OS_VERSION: + return ApiCompatibilityUtils.getDrawable( + resources, R.drawable.ic_error_white_24dp_filled); + case UpdateType.NONE: + // Intentional fall through. + case UpdateType.UNKNOWN: + // Intentional fall through. + default: + return null; + } + } + + /** * Checks if the {@link OmahaClient} knows about an update. * @param activity The current {@link ChromeActivity}. */ @@ -106,7 +231,7 @@ if (mAlreadyCheckedForUpdates) { if (activity.isActivityDestroyed()) return; - activity.onCheckForUpdate(mUpdateAvailable); + activity.onCheckForUpdate(); return; } @@ -115,21 +240,73 @@ new AsyncTask<Void>() { @Override protected Void doInBackground() { + if (setForcedUpdateData()) return null; + if (VersionNumberGetter.isNewerVersionAvailable(activity)) { mUpdateUrl = MarketURLGetter.getMarketUrl(activity); mLatestVersion = VersionNumberGetter.getInstance().getLatestKnownVersion(activity); - mUpdateAvailable = checkForSufficientStorage(); - } else { - mUpdateAvailable = false; + boolean hasSufficientStorage = checkForSufficientStorage(); + mUpdateType = + hasSufficientStorage ? UpdateType.UPDATE_AVAILABLE : UpdateType.NONE; + // If a new version is available, we should later possibly show the OS not + // supported badge, so we need to clear the preference for now. + ChromePreferenceManager.getInstance().removeKey( + ChromePreferenceManager.LATEST_UNSUPPORTED_VERSION); + return null; } + + if (!VersionNumberGetter.isCurrentOsVersionSupported()) { + mUpdateType = UpdateType.UNSUPPORTED_OS_VERSION; + mLatestUnsupportedVersionPreference = + ChromePreferenceManager.getInstance().readString( + ChromePreferenceManager.LATEST_UNSUPPORTED_VERSION, null); + return null; + } + + mUpdateType = UpdateType.NONE; return null; } + /** + * @return true if all the update related data should be forced to specific values. + */ + private boolean setForcedUpdateData() { + String forcedUpdateType = + getStringParamValue(ChromeSwitches.FORCE_UPDATE_MENU_UPDATE_TYPE); + if (TextUtils.isEmpty(forcedUpdateType)) return false; + + switch (forcedUpdateType) { + case NONE_SWITCH_VALUE: + mUpdateType = UpdateType.NONE; + break; + case UPDATE_AVAILABLE_SWITCH_VALUE: + mUpdateType = UpdateType.UPDATE_AVAILABLE; + String testMarketUrl = + getStringParamValue(ChromeSwitches.MARKET_URL_FOR_TESTING); + if (!TextUtils.isEmpty(testMarketUrl)) mUpdateUrl = testMarketUrl; + break; + case UNSUPPORTED_OS_VERSION_SWITCH_VALUE: + mUpdateType = UpdateType.UNSUPPORTED_OS_VERSION; + // Even in the forced case, ensure that it is possible to read and write + // the pref, since the FORCE_SHOW_UPDATE_MENU_BADGE might not be set. + mLatestUnsupportedVersionPreference = + ChromePreferenceManager.getInstance().readString( + ChromePreferenceManager.LATEST_UNSUPPORTED_VERSION, null); + break; + default: + // If the forced parameter or variation is set, but invalid, we should still + // early out of the calculation. This enables testing of the no-op state. + mUpdateType = UpdateType.UNKNOWN; + break; + } + return true; + } + @Override protected void onPostExecute(Void result) { if (activity.isActivityDestroyed()) return; - activity.onCheckForUpdate(mUpdateAvailable); + activity.onCheckForUpdate(); recordUpdateHistogram(); } } @@ -147,19 +324,22 @@ } /** - * @param activity The current {@link ChromeActivity}. + * @param context The current context. * @return Whether the update menu item should be shown. */ - public boolean shouldShowMenuItem(ChromeActivity activity) { - if (getBooleanParam(ChromeSwitches.FORCE_SHOW_UPDATE_MENU_ITEM)) { - return true; + public boolean shouldShowMenuItem(Context context) { + switch (getUpdateType()) { + case UpdateType.UPDATE_AVAILABLE: + return isGooglePlayStoreAvailable(context); + case UpdateType.UNSUPPORTED_OS_VERSION: + return true; + case UpdateType.NONE: + // Intentional fall through. + case UpdateType.UNKNOWN: + // Intentional fall through. + default: + return false; } - - if (!isGooglePlayStoreAvailable(activity)) { - return false; - } - - return updateAvailable(activity); } private static boolean isGooglePlayStoreAvailable(Context context) { @@ -173,40 +353,33 @@ } /** - * @param context The current {@link Context}. - * @return The string to use for summary text or the empty string if no summary should be shown. - */ - public String getMenuItemSummaryText(Context context) { - String customSummary = getStringParamValue(CUSTOM_SUMMARY); - if (!TextUtils.isEmpty(customSummary)) { - return customSummary; - } - - return context.getResources().getString(R.string.menu_update_summary_default); - } - - /** - * @param activity The current {@link ChromeActivity}. + * @param context The current context. * @return Whether the update badge should be shown in the toolbar. */ - public boolean shouldShowToolbarBadge(ChromeActivity activity) { - if (getBooleanParam(ChromeSwitches.FORCE_SHOW_UPDATE_MENU_BADGE)) { - return true; - } + public boolean shouldShowToolbarBadge(Context context) { + if (getBooleanParam(ChromeSwitches.FORCE_SHOW_UPDATE_MENU_BADGE)) return true; - if (!isGooglePlayStoreAvailable(activity)) { - return false; - } + switch (getUpdateType()) { + case UpdateType.UPDATE_AVAILABLE: + if (!isGooglePlayStoreAvailable(context)) return false; + // The badge is hidden if the update menu item has been clicked until there is an + // even newer version of Chrome available. + String latestVersionWhenClicked = + PrefServiceBridge.getInstance().getLatestVersionWhenClickedUpdateMenuItem(); + return !TextUtils.equals(latestVersionWhenClicked, mLatestVersion); + case UpdateType.UNSUPPORTED_OS_VERSION: + // We should show the badge if the user has not opened the menu. + if (mLatestUnsupportedVersionPreference == null) return true; - // The badge is hidden if the update menu item has been clicked until there is an - // even newer version of Chrome available. - String latestVersionWhenClicked = - PrefServiceBridge.getInstance().getLatestVersionWhenClickedUpdateMenuItem(); - if (TextUtils.equals(latestVersionWhenClicked, mLatestVersion)) { - return false; + // In case the user has been upgraded since last time they tapped the toolbar badge + // we should show the badge again. + String currentlyUsedVersion = BuildInfo.getInstance().versionName; + return !TextUtils.equals(mLatestUnsupportedVersionPreference, currentlyUsedVersion); + case UpdateType.NONE: // Intentional fall through. + case UpdateType.UNKNOWN: // Intentional fall through. + default: + return false; } - - return updateAvailable(activity); } /** @@ -214,6 +387,7 @@ * @param activity The current {@link ChromeActivity}. */ public void onMenuItemClicked(ChromeActivity activity) { + if (mUpdateType != UpdateType.UPDATE_AVAILABLE) return; if (mUpdateUrl == null) return; // If the update menu item is showing because it was forced on through about://flags @@ -254,6 +428,25 @@ } /** + * Called when the user clicks the app menu button while the unsupported OS badge is showing. + */ + public void onMenuButtonClicked() { + if (mUpdateType != UpdateType.UNSUPPORTED_OS_VERSION) return; + + // If we have already stored the current version to a preference, no need to store it again, + // unless their Chrome version has changed. + String currentlyUsedVersion = BuildInfo.getInstance().versionName; + if (mLatestUnsupportedVersionPreference != null + && mLatestUnsupportedVersionPreference.equals(currentlyUsedVersion)) { + return; + } + + ChromePreferenceManager.getInstance().writeString( + ChromePreferenceManager.LATEST_UNSUPPORTED_VERSION, currentlyUsedVersion); + mLatestUnsupportedVersionPreference = currentlyUsedVersion; + } + + /** * Creates an {@link AnimatorSet} for showing the update badge that is displayed on top * of the app menu button. * @@ -339,13 +532,12 @@ return set; } - private boolean updateAvailable(ChromeActivity activity) { - if (!mAlreadyCheckedForUpdates) { - checkForUpdateOnBackgroundThread(activity); - return false; - } - - return mUpdateAvailable; + /** + * @return The current {@link UpdateType}. Will be {@link UpdateType#UNKNOWN} until it has been + * fetched on a background thread. + */ + public @UpdateType int getUpdateType() { + return mUpdateType; } private void recordItemClickedHistogram(int action) { @@ -357,7 +549,8 @@ if (PrefServiceBridge.getInstance().getClickedUpdateMenuItem()) { RecordHistogram.recordEnumeratedHistogram( "GoogleUpdate.MenuItem.ActionTakenAfterItemClicked", - mUpdateAvailable ? NOT_UPDATED : UPDATED, UPDATED_BOUNDARY); + mUpdateType == UpdateType.UPDATE_AVAILABLE ? NOT_UPDATED : UPDATED, + UPDATED_BOUNDARY); PrefServiceBridge.getInstance().setClickedUpdateMenuItem(false); } } @@ -383,6 +576,7 @@ * @param paramName The name of the parameter (or command-line switch) to get a value for. * @return The command-line flag value if present, or the param is value if present. */ + @Nullable private static String getStringParamValue(String paramName) { String value = CommandLine.getInstance().getSwitchValue(paramName); if (TextUtils.isEmpty(value)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java index f5431d56..0bcacf3f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java
@@ -6,10 +6,12 @@ import android.content.Context; import android.content.SharedPreferences; +import android.os.Build; import org.chromium.base.BuildInfo; import org.chromium.base.ThreadUtils; import org.chromium.base.VisibleForTesting; +import org.chromium.chrome.browser.ChromeFeatureList; /** * Stubbed class for getting version numbers from the rest of Chrome. Override the functions for @@ -91,6 +93,19 @@ } /** + * @return Whether the current Android OS version is supported. + */ + public static boolean isCurrentOsVersionSupported() { + // By default, only Android KitKat and above is supported. + int oldestSupportedVersion = Build.VERSION_CODES.KITKAT; + + if (ChromeFeatureList.isEnabled(ChromeFeatureList.JELLY_BEAN_SUPPORTED)) { + oldestSupportedVersion = Build.VERSION_CODES.JELLY_BEAN; + } + return Build.VERSION.SDK_INT >= oldestSupportedVersion; + } + + /** * Checks if we know about a newer version available than the one we're using. This does not * actually fire any requests over to the server: it just checks the version we stored the last * time we talked to the Omaha server.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java index 8e81875..28a82b7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java
@@ -18,7 +18,6 @@ import org.chromium.chrome.browser.toolbar.ToolbarActionModeCallback; import org.chromium.chrome.browser.toolbar.ToolbarDataProvider; import org.chromium.chrome.browser.widget.ScrimView; -import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.ui.base.WindowAndroid; /** @@ -84,12 +83,6 @@ ToolbarDataProvider getToolbarDataProvider(); /** - * Set the bottom sheet for Chrome Home. - * @param sheet The bottom sheet for Chrome Home if it exists. - */ - void setBottomSheet(BottomSheet sheet); - - /** * Initialize controls that will act as hooks to various functions. * @param windowDelegate {@link WindowDelegate} that will provide {@link Window} related info. * @param windowAndroid {@link WindowAndroid} that is used by the owning {@link Activity}.
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 28ba5223..80ede28 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
@@ -61,7 +61,6 @@ import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.widget.ScrimView; import org.chromium.chrome.browser.widget.ScrimView.ScrimParams; -import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.PageTransition; @@ -90,9 +89,6 @@ protected View mUrlBar; private final boolean mIsTablet; - /** A handle to the bottom sheet for chrome home. */ - protected BottomSheet mBottomSheet; - protected UrlBarCoordinator mUrlCoordinator; protected AutocompleteCoordinator mAutocompleteCoordinator; @@ -196,11 +192,6 @@ } @Override - public BottomSheet getBottomSheet() { - return mBottomSheet; - } - - @Override public View getAnchorView() { return getRootView().findViewById(R.id.toolbar); } @@ -562,11 +553,6 @@ } @Override - public void setBottomSheet(BottomSheet sheet) { - mBottomSheet = sheet; - } - - @Override public void addUrlFocusChangeListener(UrlFocusChangeListener listener) { mUrlFocusChangeListeners.addObserver(listener); } @@ -621,10 +607,7 @@ */ @Override public int getUrlContainerMarginEnd() { - // When Chrome Home is enabled, the URL actions container slides out of view during the - // URL defocus animation. Adding margin during this animation creates a hole. - boolean addMarginForActionsContainer = - mBottomSheet == null || !mUrlFocusChangeInProgress || isUrlBarFocused(); + boolean addMarginForActionsContainer = !mUrlFocusChangeInProgress || isUrlBarFocused(); int urlContainerMarginEnd = 0; if (addMarginForActionsContainer) { @@ -983,12 +966,7 @@ loadUrlParams.setInputStartTimestamp(inputStart); } - // If the bottom sheet exists, route the navigation through it instead of the tab. - if (mBottomSheet != null) { - mBottomSheet.loadUrl(loadUrlParams, currentTab.isIncognito()); - } else { - currentTab.loadUrl(loadUrlParams); - } + currentTab.loadUrl(loadUrlParams); RecordUserAction.record("MobileOmniboxUse"); } LocaleManager.getInstance().recordLocaleBasedSearchMetrics(false, url, transition);
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 f4946aa..4e1df66 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,8 +16,6 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.WindowDelegate; import org.chromium.chrome.browser.ntp.NewTabPage; -import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; -import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver; /** * A location bar implementation specific for smaller/phone screens. @@ -138,22 +136,16 @@ }, KEYBOARD_HIDE_DELAY_MS); // Convert the keyboard back to resize mode (delay the change for an arbitrary amount // of time in hopes the keyboard will be completely hidden before making this change). - // If Chrome Home is enabled, it will handle its own mode changes. - if (mBottomSheet == null) { - setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE, true); - } + setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE, true); mUrlActionContainer.setVisibility(GONE); } else { - // If Chrome Home is enabled, it will handle its own mode changes. - if (mBottomSheet == null) { - setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN, false); - } + setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN, false); getWindowAndroid().getKeyboardDelegate().showKeyboard(mUrlBar); } setUrlFocusChangeInProgress(false); NewTabPage ntp = getToolbarDataProvider().getNewTabPageForCurrentTab(); - if (hasFocus && ntp != null && ntp.isLocationBarShownInNTP() && mBottomSheet == null) { + if (hasFocus && ntp != null && ntp.isLocationBarShownInNTP()) { updateFadingBackgroundView(true, true); } } @@ -196,26 +188,4 @@ delegate.setWindowSoftInputMode(softInputMode); } } - - @Override - public void setBottomSheet(BottomSheet sheet) { - super.setBottomSheet(sheet); - - sheet.addObserver(new EmptyBottomSheetObserver() { - @Override - public void onSheetStateChanged(@BottomSheet.SheetState int state) { - switch (state) { - case BottomSheet.SheetState.FULL: - setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN, false); - break; - case BottomSheet.SheetState.PEEK: - setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE, true); - break; - default: - setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING, false); - } - } - }); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsList.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsList.java index 1aee95a..58c1270 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsList.java
@@ -22,7 +22,6 @@ import org.chromium.chrome.browser.WindowDelegate; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxResultsAdapter.OmniboxResultItem; import org.chromium.chrome.browser.util.ViewUtils; -import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import java.util.ArrayList; @@ -64,10 +63,6 @@ @Nullable View getAlignmentView(); - /** Return the bottom sheet for the containing UI to be used in sizing. */ - @Nullable - BottomSheet getBottomSheet(); - /** Return the delegate used to interact with the Window. */ WindowDelegate getWindowDelegate(); @@ -265,11 +260,7 @@ mEmbedder.getWindowDelegate().getWindowVisibleDisplayFrame(mTempRect); int decorHeight = mEmbedder.getWindowDelegate().getDecorViewHeight(); - int additionalHeightForBottomNavMenu = mEmbedder.getBottomSheet() != null - ? mEmbedder.getBottomSheet().getToolbarShadowHeight() - : 0; - int availableViewportHeight = - Math.min(mTempRect.height(), decorHeight) + additionalHeightForBottomNavMenu; + int availableViewportHeight = Math.min(mTempRect.height(), decorHeight); int availableListHeight = availableViewportHeight - anchorBottomRelativeToContent; // The suggestions should consume all available space in Modern on phone. int desiredHeight = !mEmbedder.isTablet() ? availableListHeight
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java index 85af88c..38bacd9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java
@@ -14,6 +14,7 @@ import android.content.DialogInterface; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.support.v4.view.animation.FastOutLinearInInterpolator; import android.support.v4.view.animation.LinearOutSlowInInterpolator; import android.view.Gravity; @@ -27,6 +28,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; +import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.widget.AlwaysDismissedDialog; import org.chromium.chrome.browser.widget.animation.AnimatorProperties; @@ -71,16 +73,26 @@ mDialog.setOnDismissListener(dismissListener); mDialog.addContentView(mFullContainer, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - Window dialogWindow = mDialog.getWindow(); dialogWindow.setGravity(Gravity.CENTER); dialogWindow.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + setVisibleStatusBarIconColor(dialogWindow); mAnimatorTranslation = activity.getResources().getDimensionPixelSize(R.dimen.payments_ui_translation); } + /** + * Makes sure that the color of the icons in the status bar makes the icons visible. + * @param window The window whose status bar icon color is being set. + */ + /* package */ static void setVisibleStatusBarIconColor(Window window) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; + ApiCompatibilityUtils.setStatusBarIconColor(window.getDecorView().getRootView(), + !ColorUtils.shouldUseLightForegroundOnBackground(window.getStatusBarColor())); + } + /** @param bottomSheetView The view to show in the bottom sheet. */ /* package */ void addBottomSheetView(View bottomSheetView) { FrameLayout.LayoutParams bottomSheetParams =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java index 6e03467..d9477992 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -401,8 +401,11 @@ mEditorDialog = new EditorDialog(activity, sEditorObserverForTest, /*deleteRunnable =*/null); + DimmingDialog.setVisibleStatusBarIconColor(mEditorDialog.getWindow()); + mCardEditorDialog = new EditorDialog(activity, sEditorObserverForTest, /*deleteRunnable =*/null); + DimmingDialog.setVisibleStatusBarIconColor(mCardEditorDialog.getWindow()); // Allow screenshots of the credit card number in Canary, Dev, and developer builds. if (ChromeVersionInfo.isBetaBuild() || ChromeVersionInfo.isStableBuild()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferenceOSVersion.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferenceOSVersion.java new file mode 100644 index 0000000..ba5c625 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferenceOSVersion.java
@@ -0,0 +1,36 @@ +// 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.preferences; + +import android.content.Context; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.omaha.VersionNumberGetter; + +/** + * Preference specifically made for the Android OS version. It supports displaying a warning when + * the current OS version is unsupported. + */ +public class AboutChromePreferenceOSVersion extends Preference { + /** + * Constructor for inflating from XML. + */ + public AboutChromePreferenceOSVersion(Context context, AttributeSet attrs) { + super(context, attrs); + setLayoutResource(R.layout.os_version_unsupported_preference); + } + + @Override + protected void onBindView(View view) { + super.onBindView(view); + // Show additional information only if the OS version is not supported. + if (VersionNumberGetter.isCurrentOsVersionSupported()) return; + + view.findViewById(R.id.os_deprecation_warning).setVisibility(View.VISIBLE); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java index 20b5935..4fa81920 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java
@@ -4,16 +4,13 @@ package org.chromium.chrome.browser.preferences; -import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; -import android.os.Build; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; import android.text.format.DateUtils; -import android.view.ContextThemeWrapper; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeVersionInfo; @@ -30,24 +27,12 @@ private static final String PREF_OS_VERSION = "os_version"; private static final String PREF_LEGAL_INFORMATION = "legal_information"; - @SuppressLint("ObsoleteSdkInt") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActivity().setTitle(R.string.prefs_about_chrome); PreferenceUtils.addPreferencesFromResource(this, R.xml.about_chrome_preferences); - // TODO(crbug.com/635567): Fix this properly. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { - ChromeBasePreference deprecationWarning = new ChromeBasePreference( - new ContextThemeWrapper(getActivity(), - R.style.DeprecationWarningPreferenceTheme)); - deprecationWarning.setOrder(-1); - deprecationWarning.setTitle(R.string.deprecation_warning); - deprecationWarning.setIcon(R.drawable.exclamation_triangle); - getPreferenceScreen().addPreference(deprecationWarning); - } - PrefServiceBridge prefServiceBridge = PrefServiceBridge.getInstance(); AboutVersionStrings versionStrings = prefServiceBridge.getAboutVersionStrings(); Preference p = findPreference(PREF_APPLICATION_VERSION);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java index 69e4791..d9ad21ac 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.preferences; import android.content.SharedPreferences; +import android.support.annotation.Nullable; import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.crash.MinidumpUploadService.ProcessType; @@ -223,6 +224,14 @@ public static final String ACCESSIBILITY_TAB_SWITCHER = "accessibility_tab_switcher"; /** + * When the user is shown a badge that the current Android OS version is unsupported, and they + * tap it to display the menu (which has additional information), we store the current version + * of Chrome to this preference to ensure we only show the badge once. The value is cleared + * if the Chrome version later changes. + */ + public static final String LATEST_UNSUPPORTED_VERSION = "android_os_unsupported_chrome_version"; + + /** * Deprecated keys for Chrome Home. */ private static final String CHROME_HOME_USER_ENABLED_KEY = "chrome_home_user_enabled"; @@ -562,18 +571,29 @@ * @param key The name of the preference to modify. * @param value The new value for the preference. */ - private void writeString(String key, String value) { + public void writeString(String key, String value) { SharedPreferences.Editor ed = mSharedPreferences.edit(); ed.putString(key, value); ed.apply(); } /** + * Reads the given String value from the named shared preference. + * + * @param key The name of the preference to return. + * @param defaultValue The default value to return if there's no value stored. + * @return The value of the preference if stored; defaultValue otherwise. + */ + public String readString(String key, @Nullable String defaultValue) { + return mSharedPreferences.getString(key, defaultValue); + } + + /** * Removes the shared preference entry. * * @param key The key of the preference to remove. */ - private void removeKey(String key) { + public void removeKey(String key) { SharedPreferences.Editor ed = mSharedPreferences.edit(); ed.remove(key); ed.apply();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java index 228eed5..a1880e1b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
@@ -21,6 +21,7 @@ import org.chromium.chrome.browser.contextmenu.ContextMenuItemDelegate; import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.download.ChromeDownloadDelegate; +import org.chromium.chrome.browser.experiments.EphemeralTab; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.preferences.PrefServiceBridge; @@ -287,6 +288,11 @@ IntentUtils.safeStartActivity(mTab.getActivity(), intent); } + @Override + public void onOpenInEphemeralTab(String url, Referrer referrer) { + EphemeralTab.onOpen(url, referrer, isIncognito()); + } + /** * Checks if spdy proxy is enabled for input url. * @param url Input url to check for spdy setting.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarCoordinator.java index 28efe5c1..37b2647 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarCoordinator.java
@@ -153,14 +153,14 @@ * Show the update badge over the bottom toolbar's app menu. */ public void showAppMenuUpdateBadge() { - mMenuButton.setUpdateBadgeVisibility(true); + mMenuButton.setUpdateBadgeVisibilityIfValidState(true); } /** * Remove the update badge. */ public void removeAppMenuUpdateBadge() { - mMenuButton.setUpdateBadgeVisibility(false); + mMenuButton.setUpdateBadgeVisibilityIfValidState(false); } /** @@ -179,8 +179,11 @@ mMediator.setToolbarSwipeLayout(layout); } - public View getMenuButton() { - return mMenuButton.getMenuButton(); + /** + * @return The wrapper for the app menu button. + */ + public MenuButton getMenuButtonWrapper() { + return mMenuButton; } public void setIncognito(boolean isIncognito) { @@ -189,6 +192,7 @@ final ColorStateList tint = isIncognito ? mLightModeTint : mDarkModeTint; mTabSwitcherButtonCoordinator.setTint(tint); mMenuButton.setTint(tint); + mMenuButton.setUseLightDrawables(isIncognito); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java index 628051c..70d37a76 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java
@@ -6,13 +6,16 @@ import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.drawable.Drawable; import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; +import android.widget.ImageView; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; +import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; /** * The overflow menu button. @@ -22,7 +25,8 @@ private AppCompatImageButton mMenuImageButton; /** The view for the update badge. */ - private View mUpdateBadgeView; + private ImageView mUpdateBadgeView; + private boolean mUseLightDrawables; public MenuButton(Context context, AttributeSet attrs) { super(context, attrs); @@ -49,10 +53,54 @@ } /** - * @param visible Whether the update badge should be visible. + * Sets the update badge to visible if the update state requires it. + * + * Also updates the visuals to the correct type for the case where {@link + * #setUseLightDrawables(boolean)} was invoked before the update state was known. This is the + * case on startup when the bottom toolbar is in use. + * + * @param visible Whether the update badge should be visible. Always sets visibility to GONE + * if the update type does not require a badge. + * TODO(crbug.com/865801): Clean this up when MenuButton and UpdateMenuItemHelper is MVCed. */ - void setUpdateBadgeVisibility(boolean visible) { - mUpdateBadgeView.setVisibility(visible ? View.VISIBLE : View.GONE); + void setUpdateBadgeVisibilityIfValidState(boolean visible) { + switch (UpdateMenuItemHelper.getInstance().getUpdateType()) { + case UpdateMenuItemHelper.UpdateType.UPDATE_AVAILABLE: + // Intentional fall through. + case UpdateMenuItemHelper.UpdateType.UNSUPPORTED_OS_VERSION: + mUpdateBadgeView.setVisibility(visible ? View.VISIBLE : View.GONE); + updateImageResources(); + break; + case UpdateMenuItemHelper.UpdateType.NONE: + // Intentional fall through. + case UpdateMenuItemHelper.UpdateType.UNKNOWN: + // Intentional fall through. + default: + mUpdateBadgeView.setVisibility(View.GONE); + break; + } + } + + /** + * Sets the visual type of update badge to use (if any). + * @param useLightDrawables Whether the light drawable should be used. + */ + void setUseLightDrawables(boolean useLightDrawables) { + mUseLightDrawables = useLightDrawables; + updateImageResources(); + } + + void updateImageResources() { + Drawable drawable; + if (mUseLightDrawables) { + drawable = UpdateMenuItemHelper.getInstance().getLightBadgeDrawable( + mUpdateBadgeView.getResources()); + } else { + drawable = UpdateMenuItemHelper.getInstance().getDarkBadgeDrawable( + mUpdateBadgeView.getResources()); + } + if (drawable == null) return; + mUpdateBadgeView.setImageDrawable(drawable); } /** @@ -62,7 +110,31 @@ return mUpdateBadgeView.getVisibility() == View.VISIBLE; } - View getMenuButton() { + void updateContentDescription() { + if (isShowingAppMenuUpdateBadge()) { + switch (UpdateMenuItemHelper.getInstance().getUpdateType()) { + case UpdateMenuItemHelper.UpdateType.UPDATE_AVAILABLE: + setContentDescription(getResources().getString( + R.string.accessibility_toolbar_btn_menu_update)); + break; + case UpdateMenuItemHelper.UpdateType.UNSUPPORTED_OS_VERSION: + setContentDescription(getResources().getString( + R.string.accessibility_toolbar_btn_menu_os_version_unsupported)); + break; + case UpdateMenuItemHelper.UpdateType.NONE: + // Intentional fall through. + case UpdateMenuItemHelper.UpdateType.UNKNOWN: + // Intentional fall through. + default: + break; + } + } else { + setContentDescription( + getResources().getString(R.string.accessibility_toolbar_btn_menu)); + } + } + + AppCompatImageButton getImageButton() { return mMenuImageButton; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar.java index 1c2b8b2..c021eb4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar.java
@@ -9,7 +9,6 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.widget.ScrimView; -import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; /** * An interface for outside packages to interact with ToolbarLayout. Other than for testing purposes @@ -51,13 +50,6 @@ void setTextureCaptureMode(boolean textureMode); /** - * Set the {@link BottomSheet} for triggering animations. This can be null if Chrome Home is - * disabled. - * @param sheet The {@link BottomSheet}. - */ - void setBottomSheet(BottomSheet sheet); - - /** * @return Whether a dirty check for invalidation makes sense at this time. */ boolean isReadyForTextureCapture();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java index 7250526..5d2ebd8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java
@@ -46,7 +46,6 @@ import org.chromium.chrome.browser.widget.PulseDrawable; import org.chromium.chrome.browser.widget.ScrimView; import org.chromium.chrome.browser.widget.ToolbarProgressBar; -import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.ui.UiUtils; @@ -61,11 +60,11 @@ private final int[] mTempPosition = new int[2]; /** - * The ImageButton view that represents the menu button. + * The app menu button. */ protected AppCompatImageButton mMenuButton; private ImageView mMenuBadge; - private View mMenuButtonWrapper; + private MenuButton mMenuButtonWrapper; private AppMenuButtonHelper mAppMenuButtonHelper; protected final ColorStateList mDarkModeTint; @@ -814,6 +813,7 @@ @Override public void showAppMenuUpdateBadge() { mShowMenuBadge = true; + mMenuButtonWrapper.updateImageResources(); } @Override @@ -826,10 +826,10 @@ if (mMenuBadge == null) return; boolean wasShowingMenuBadge = mShowMenuBadge; mShowMenuBadge = false; - setMenuButtonContentDescription(false); + setMenuButtonContentDescription(); if (!animate || !wasShowingMenuBadge) { - mMenuBadge.setVisibility(View.GONE); + mMenuButtonWrapper.setUpdateBadgeVisibilityIfValidState(false); return; } @@ -889,10 +889,10 @@ * bitmap. */ protected void setAppMenuUpdateBadgeToVisible(boolean animate) { - if (mMenuBadge == null || mMenuButton == null) return; - setMenuButtonContentDescription(true); + if (mMenuBadge == null || mMenuButton == null || mMenuButtonWrapper == null) return; + setMenuButtonContentDescription(); if (!animate || mIsMenuBadgeAnimationRunning) { - mMenuBadge.setVisibility(View.VISIBLE); + mMenuButtonWrapper.setUpdateBadgeVisibilityIfValidState(true); return; } @@ -934,9 +934,8 @@ * @param useLightDrawable Whether the light drawable should be used. */ protected void setAppMenuUpdateBadgeDrawable(boolean useLightDrawable) { - if (mMenuBadge == null) return; - mMenuBadge.setImageResource(useLightDrawable ? R.drawable.badge_update_light - : R.drawable.badge_update_dark); + if (mMenuButtonWrapper == null) return; + mMenuButtonWrapper.setUseLightDrawables(useLightDrawable); } /** @@ -965,22 +964,12 @@ /** * Sets the content description for the menu button. - * @param isUpdateBadgeVisible Whether the update menu badge is visible. */ - protected void setMenuButtonContentDescription(boolean isUpdateBadgeVisible) { - if (mMenuButton == null) return; - if (isUpdateBadgeVisible) { - mMenuButton.setContentDescription(getResources().getString( - R.string.accessibility_toolbar_btn_menu_update)); - } else { - mMenuButton.setContentDescription(getResources().getString( - R.string.accessibility_toolbar_btn_menu)); - } + protected void setMenuButtonContentDescription() { + if (mMenuButtonWrapper == null) return; + mMenuButtonWrapper.updateContentDescription(); } - @Override - public void setBottomSheet(BottomSheet sheet) {} - /** * Sets the current TabModelSelector so the toolbar can pass it into buttons that need access to * it.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 13615f1c..4dd1afb0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -63,6 +63,7 @@ import org.chromium.chrome.browser.ntp.IncognitoNewTabPage; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.QueryInOmnibox; import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener; @@ -239,7 +240,7 @@ mActivity = activity; mActionBarDelegate = new ViewShiftingActionBarDelegate(activity, controlContainer); - mToolbarModel = new ToolbarModel(activity, activity.getBottomSheet()); + mToolbarModel = new ToolbarModel(activity); mControlContainer = controlContainer; assert mControlContainer != null; mUrlFocusChangedCallback = urlFocusChangedCallback; @@ -270,9 +271,6 @@ setMenuDelegatePhone(menuDelegate); toolbar.setPaintInvalidator(invalidator); - if (mActivity.getBottomSheet() != null) { - toolbar.setBottomSheet(mActivity.getBottomSheet()); - } mActionModeController.setTabStripHeight(toolbar.getTabStripHeight()); mLocationBar = mToolbar.getLocationBar(); mLocationBar.setToolbarDataProvider(mToolbarModel); @@ -639,12 +637,24 @@ public void onOverviewModeStartedShowing(boolean showToolbar) { mToolbar.setTabSwitcherMode(true, showToolbar, false); updateButtonStatus(); + + // For top toolbar we depend on animations instead. + if (mBottomToolbarCoordinator == null) return; + MenuButton menuButton = mBottomToolbarCoordinator.getMenuButtonWrapper(); + if (menuButton == null) return; + menuButton.setUpdateBadgeVisibilityIfValidState(false); } @Override public void onOverviewModeStartedHiding(boolean showToolbar, boolean delayAnimation) { mToolbar.setTabSwitcherMode(false, showToolbar, delayAnimation); updateButtonStatus(); + + // For top toolbar we depend on animations instead. + if (mBottomToolbarCoordinator == null) return; + MenuButton menuButton = mBottomToolbarCoordinator.getMenuButtonWrapper(); + if (menuButton == null) return; + menuButton.setUpdateBadgeVisibilityIfValidState(true); } @Override @@ -1049,7 +1059,9 @@ * @return The view containing the pop up menu button. */ public View getMenuButton() { - if (mBottomToolbarCoordinator != null) return mBottomToolbarCoordinator.getMenuButton(); + if (mBottomToolbarCoordinator != null) { + return mBottomToolbarCoordinator.getMenuButtonWrapper().getImageButton(); + } if (mToolbar != null) return mToolbar.getMenuButton(); return null; } @@ -1236,13 +1248,20 @@ setUrlBarFocus(false); } - if (mControlsVisibilityDelegate == null) return; - if (isVisible) { - mFullscreenMenuToken = - mControlsVisibilityDelegate.showControlsPersistentAndClearOldToken( - mFullscreenMenuToken); - } else { - mControlsVisibilityDelegate.releasePersistentShowingToken(mFullscreenMenuToken); + if (mControlsVisibilityDelegate != null) { + if (isVisible) { + mFullscreenMenuToken = + mControlsVisibilityDelegate.showControlsPersistentAndClearOldToken( + mFullscreenMenuToken); + } else { + mControlsVisibilityDelegate.releasePersistentShowingToken( + mFullscreenMenuToken); + } + } + + MenuButton menuButton = getMenuButtonWrapper(); + if (isVisible && menuButton != null && menuButton.isShowingAppMenuUpdateBadge()) { + UpdateMenuItemHelper.getInstance().onMenuButtonClicked(); } } @@ -1275,6 +1294,18 @@ }); } + @Nullable + private MenuButton getMenuButtonWrapper() { + if (mBottomToolbarCoordinator != null) { + return mBottomToolbarCoordinator.getMenuButtonWrapper(); + } + + if (mToolbar == null) return null; + View menuButtonWrapper = mToolbar.getMenuButtonWrapper(); + if (menuButtonWrapper instanceof MenuButton) return (MenuButton) menuButtonWrapper; + return null; + } + /** * Set the delegate that will handle updates from toolbar driven state changes. * @param menuDelegatePhone The menu delegate to be updated (only applicable to phones).
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java index a99bd75..4068d96 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java
@@ -32,7 +32,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.UrlUtilities; -import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.components.dom_distiller.core.DomDistillerService; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.security_state.ConnectionSecurityLevel; @@ -47,7 +46,6 @@ */ public class ToolbarModel implements ToolbarDataProvider { private final Context mContext; - private final BottomSheet mBottomSheet; private Tab mTab; private boolean mIsIncognito; @@ -59,11 +57,9 @@ /** * Default constructor for this class. * @param context The Context used for styling the toolbar visuals. - * @param bottomSheet The {@link BottomSheet} for the activity displaying this toolbar. */ - public ToolbarModel(Context context, @Nullable BottomSheet bottomSheet) { + public ToolbarModel(Context context) { mContext = context; - mBottomSheet = bottomSheet; mPrimaryColor = ColorUtils.getDefaultThemeColor(context.getResources(), false); } @@ -303,7 +299,7 @@ @Override public boolean isUsingBrandColor() { - return mIsUsingBrandColor && mBottomSheet == null; + return mIsUsingBrandColor; } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java index 89904b3..db98ce1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
@@ -64,6 +64,7 @@ import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.ntp.NewTabPage; +import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.LocationBarPhone; import org.chromium.chrome.browser.partnercustomizations.HomepageManager; @@ -1839,7 +1840,7 @@ view.setVisibility(browsingViewsVisibility); } if (mShowMenuBadge) { - setMenuButtonContentDescription(mTabSwitcherState == STATIC_TAB); + setMenuButtonContentDescription(); } updateProgressBarVisibility(); @@ -2907,13 +2908,17 @@ } private void setTabSwitcherAnimationMenuBadgeDrawable() { - mTabSwitcherAnimationMenuBadgeDarkDrawable = ApiCompatibilityUtils.getDrawable( - getResources(), R.drawable.badge_update_dark); + Drawable darkDrawable = + UpdateMenuItemHelper.getInstance().getDarkBadgeDrawable(this.getResources()); + Drawable lightDrawable = + UpdateMenuItemHelper.getInstance().getLightBadgeDrawable(this.getResources()); + if (darkDrawable == null || lightDrawable == null) return; + + mTabSwitcherAnimationMenuBadgeDarkDrawable = darkDrawable; mTabSwitcherAnimationMenuBadgeDarkDrawable.mutate(); ((BitmapDrawable) mTabSwitcherAnimationMenuBadgeDarkDrawable).setGravity(Gravity.CENTER); - mTabSwitcherAnimationMenuBadgeLightDrawable = ApiCompatibilityUtils.getDrawable( - getResources(), R.drawable.badge_update_light); + mTabSwitcherAnimationMenuBadgeLightDrawable = lightDrawable; mTabSwitcherAnimationMenuBadgeLightDrawable.mutate(); ((BitmapDrawable) mTabSwitcherAnimationMenuBadgeLightDrawable).setGravity(Gravity.CENTER); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java index f3f5f24..950692c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java
@@ -517,7 +517,7 @@ mLocationBar.getContainerView().setVisibility(View.INVISIBLE); if (mShowMenuBadge) { getMenuBadge().setVisibility(View.GONE); - setMenuButtonContentDescription(false); + setMenuButtonContentDescription(); } } else { mIsInTabSwitcherMode = false;
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 742f51f..85a8113 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1416,7 +1416,7 @@ Operating system </message> <message name="IDS_DEPRECATION_WARNING" desc="Warning about Chrome updates no longer being supported"> - Chrome updates are no longer supported for this version of Android. + Chrome updates are no longer supported for this version of Android </message> <!-- Account management UI strings. --> @@ -2062,6 +2062,10 @@ <message name="IDS_CONTEXTMENU_OPEN_IN_CHROME_PRIVATE_TAB" desc="Context sensitive menu item to open the selected link in a Chrome private tab from Chrome Custom Tab. [CHAR-LIMIT=30]"> Open in private tab </message> + <message name="IDS_CONTEXTMENU_OPEN_IN_EPHEMERAL_TAB" desc="Context-sensitive menu item to open a quick preview of the selected link. In English we're currently calling this 'Sneak peek' which implies that it's a quick preview without commitment (to making a new Tab). The selected link will open in an overlay panel on top of the current tab which will go away easily too. [CHAR-LIMIT=30]"> + Sneak peek + </message> + <!-- Swipe refresh --> <message name="IDS_ACCESSIBILITY_SWIPE_REFRESH" desc="Content description for the swipe refresh action."> Refreshing page @@ -2929,6 +2933,12 @@ <message name="IDS_MENU_UPDATE_SUMMARY_DEFAULT" desc="Summary string for update menu item explaining that a newer version of Chrome is available. [CHAR-LIMIT=30]"> Newer version is available </message> + <message name="IDS_MENU_UPDATE_UNSUPPORTED" desc="Menu item for when Chrome can not be updated. [CHAR-LIMIT=24]"> + Chrome can’t update + </message> + <message name="IDS_MENU_UPDATE_UNSUPPORTED_SUMMARY_DEFAULT" desc="Summary string for update menu item explaining that the Android version on the device is unsupported. [CHAR-LIMIT=30]"> + Android version is unsupported + </message> <message name="IDS_MENU_MOVE_TO_OTHER_WINDOW" desc="Menu item for moving the current tab into the other window. [CHAR-LIMIT=27]"> Move to other window </message> @@ -3181,6 +3191,9 @@ <message name="IDS_ACCESSIBILITY_TOOLBAR_BTN_MENU_UPDATE" desc="Content description for the menu button when it is covered by the update icon that is displayed when a newer version of Chrome is available."> Update available. More options </message> + <message name="IDS_ACCESSIBILITY_TOOLBAR_BTN_MENU_OS_VERSION_UNSUPPORTED" desc="Content description for the menu button when it is covered by the warning icon that is displayed when the current Android OS version is unsupported."> + Chrome can’t update. More options + </message> <message name="IDS_ACCESSIBILITY_TOOLBAR_BTN_SEARCH_ACCELERATOR" desc="Content description for the search accelerator button"> Search </message>
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 7f3b2b5..ea8b0cb 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -792,7 +792,6 @@ <translation id="723171743924126238">ምስሎችን ይምረጡ</translation> <translation id="7243308994586599757">አማራጮች ከማያ ገጹ ግርጌ አጠገብ ይገኛሉ</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ተመርጠዋል</translation> -<translation id="7251326866581677552">ከአንዳንድ ጣቢያዎች ታግደዋል</translation> <translation id="7253272406652746122">በመሣሪያዎ ቅንብሮች መተግበሪያ ውስጥ ካለው የመለያዎች ገጽ ሆነው የGoogle መለያ ያክሉ።</translation> <translation id="7274013316676448362">የታገደ ጣቢያ</translation> <translation id="729975465115245577">የእርስዎ መሣሪያ የይለፍ ቃላት ፋይሉን የሚያከማችበት መተግበሪያ የለውም።</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 49e6177..ebc7133 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">لا يتوفَّر محتوى هنا</translation> <translation id="2414886740292270097">داكن</translation> <translation id="2416359993254398973">يحتاج Chrome إلى إذن لاستخدام الكاميرا لموقع الويب هذا.</translation> -<translation id="24241740415720680">صفحة بسيطة مقدمَّة من Google</translation> <translation id="2426805022920575512">اختيار حساب آخر</translation> <translation id="2433507940547922241">المظهر</translation> <translation id="2434158240863470628">اكتمل التنزيل <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">أتمحو سعة تخزين الموقع؟</translation> <translation id="385051799172605136">الرجوع إلى الوراء</translation> <translation id="3859306556332390985">الانتقال للأمام</translation> -<translation id="3860879523841717702">صفحة بسيطة مقدَّمة من Google. انقر لتحميل الصفحة الأصلية.</translation> <translation id="3868004864571585162">ملفات تعريف الارتباط وتراخيص الوسائط وبيانات الموقع الإلكتروني</translation> <translation id="3894427358181296146">إضافة مجلد</translation> <translation id="3895926599014793903">فرض تفعيل التكبير/التصغير</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">إيقاف التحديث</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />الحصول على مساعدة<ph name="END_LINK" /> أثناء البحث عن الأجهزة…</translation> <translation id="4943872375798546930">لا نتائج</translation> -<translation id="4956867391417827202">حظر الإعلانات من المواقع الإلكترونية التي تعرض إعلانات متداخلة أو مضلِّلة</translation> <translation id="4958708863221495346">يشارك <ph name="URL_OF_THE_CURRENT_TAB" /> شاشتك</translation> <translation id="4961334780091921942">كلمات المرور والسجلّ والمزيد على كل الأجهزة</translation> <translation id="4961700429721424617">أنت بصدد الخروج من حساب تتم إدارته من خلال <ph name="MANAGED_DOMAIN" />. سيؤدي ذلك إلى حذف بيانات Chrome من هذا الجهاز، ولكن ستظل البيانات في حسابك في Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">تحديد الصور</translation> <translation id="7243308994586599757">الخيارات المتاحة بالقرب من الجزء السفلي من الشاشة</translation> <translation id="7250468141469952378">تم اختيار <ph name="ITEM_COUNT" /> عنصراً</translation> -<translation id="7251326866581677552">تم الحظر من بعض المواقع</translation> <translation id="7253272406652746122">أضف حساب Google من صفحة "الحسابات" في تطبيق إعدادات جهازك.</translation> <translation id="7274013316676448362">الموقع المحظور</translation> <translation id="729975465115245577">لا يتضمن جهازك تطبيقًا لتخزين ملف كلمات المرور.</translation> <translation id="7302081693174882195">التفاصيل: تم الترتيب بحسب مقدار البيانات المحفوظة</translation> <translation id="7333031090786104871">لا تزال عملية إضافة موقع الويب السابق جارية</translation> -<translation id="7335671571918306053">صفحة بسيطة مقدَّمة من Google. انقر على زر التحميل الأصلي لتحميل الصفحة الأصلية.</translation> <translation id="7352939065658542140">فيديو</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{مشاركة عنصر واحد محدد}zero{مشاركة # عنصر محدد}two{مشاركة عنصرين (#) محددين}few{مشاركة # عناصر محددة}many{مشاركة # عنصرًا محددًا}other{مشاركة # عنصر محدد}}</translation> <translation id="7359002509206457351">الوصول إلى طرق الدفع</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 5ae337c..d3d4dcd 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Тук няма съдържание</translation> <translation id="2414886740292270097">Тъмно</translation> <translation id="2416359993254398973">Chrome се нуждае от разрешение за достъп до камерата ви за този сайт.</translation> -<translation id="24241740415720680">Олекотена страница, предоставена от Google</translation> <translation id="2426805022920575512">Избиране на друг профил</translation> <translation id="2433507940547922241">Облик</translation> <translation id="2434158240863470628">Изтеглянето завърши <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Изчистване на данните?</translation> <translation id="385051799172605136">Назад</translation> <translation id="3859306556332390985">Придвижване напред</translation> -<translation id="3860879523841717702">Олекотена страница, предоставена от Google. Докоснете за зареждане на оригиналната.</translation> <translation id="3868004864571585162">„Бисквитки“, лицензи за мултимедия и данни за сайтове</translation> <translation id="3894427358181296146">Добавяне на папка</translation> <translation id="3895926599014793903">Принудително активиране на промяната на мащаба</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Спиране на опресняването</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Получете помощ<ph name="END_LINK" />, докато се сканира за устройства…</translation> <translation id="4943872375798546930">Няма резултати</translation> -<translation id="4956867391417827202">Блокиране на рекламите от сайтове, на които се показват натрапчиви или подвеждащи реклами</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> споделя екрана ви</translation> <translation id="4961334780091921942">Вашите пароли, история и др. на всички устройства</translation> <translation id="4961700429721424617">Излизате от профил, управляван от <ph name="MANAGED_DOMAIN" />. Данните ви в Chrome ще се изтрият от това устройство, но ще останат в профила ви в Google.</translation> @@ -810,13 +807,11 @@ <translation id="723171743924126238">Избиране на изображения</translation> <translation id="7243308994586599757">Опциите са в долната част на екрана</translation> <translation id="7250468141469952378">Избрани: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Блокиране за някои сайтове</translation> <translation id="7253272406652746122">Добавете профил в Google от страницата „Профили“ в приложението Настройки на устройството ви.</translation> <translation id="7274013316676448362">Блокиран сайт</translation> <translation id="729975465115245577">На устройството ви няма приложение за съхраняване на файла с паролите.</translation> <translation id="7302081693174882195">Подробности: сортирани по количество спестени данни</translation> <translation id="7333031090786104871">Още се добавя предишният сайт</translation> -<translation id="7335671571918306053">Олекотена страница, предоставена от Google. Докоснете съответния бутон за зареждане на оригиналната.</translation> <translation id="7352939065658542140">ВИДЕОКЛИП</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Споделяне на 1 избран елемент}other{Споделяне на # избрани елемента}}</translation> <translation id="7359002509206457351">Достъп до начините на плащане</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 4302c88..8939d68 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">No hi ha contingut</translation> <translation id="2414886740292270097">Fosc</translation> <translation id="2416359993254398973">Per visitar aquest lloc web, Chrome necessita permís per accedir a la teva càmera.</translation> -<translation id="24241740415720680">Pàgina en mode bàsic oferida per Google</translation> <translation id="2426805022920575512">Tria un altre compte</translation> <translation id="2433507940547922241">Aparença</translation> <translation id="2434158240863470628">Baixada finalitzada <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Esborrar emmagatz. lloc?</translation> <translation id="385051799172605136">Enrere</translation> <translation id="3859306556332390985">Avança</translation> -<translation id="3860879523841717702">Pàgina en mode bàsic oferida per Google. Toca per carregar l'original.</translation> <translation id="3868004864571585162">Galetes, llicències per a recursos multimèdia i dades de llocs web</translation> <translation id="3894427358181296146">Afegiu una carpeta</translation> <translation id="3895926599014793903">Força l'activació del zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Deixa d'actualitzar</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtén ajuda<ph name="END_LINK" /> mentre se cerquen dispositius…</translation> <translation id="4943872375798546930">No hi ha resultats</translation> -<translation id="4956867391417827202">Bloqueja els anuncis de llocs web que mostren publicitat intrusiva o enganyosa</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> comparteix la teva pantalla</translation> <translation id="4961334780091921942">Les contrasenyes, l'historial i altres elements en tots els dispositius</translation> <translation id="4961700429721424617">Estàs tancant la sessió d'un compte gestionat per <ph name="MANAGED_DOMAIN" />. Se suprimiran les teves dades de Chrome en aquest dispositiu, però continuaran al teu compte de Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Selecciona imatges</translation> <translation id="7243308994586599757">Opcions disponibles a la part inferior de la pantalla</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> elements seleccionats</translation> -<translation id="7251326866581677552">S'ha bloquejat en alguns llocs web</translation> <translation id="7253272406652746122">Afegeix un compte de Google des de la pàgina Comptes de l'aplicació Configuració del dispositiu.</translation> <translation id="7274013316676448362">Lloc bloquejat</translation> <translation id="729975465115245577">El dispositiu no té cap aplicació per emmagatzemar el fitxer de contrasenyes.</translation> <translation id="7302081693174882195">Detalls: files ordenades per quantitat de dades estalviades</translation> <translation id="7333031090786104871">Encara s'hi està afegint el lloc anterior</translation> -<translation id="7335671571918306053">Pàgina en mode bàsic oferida per Google. Toca el botó Carrega la versió original per carregar la pàgina original.</translation> <translation id="7352939065658542140">VÍDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Comparteix 1 element seleccionat}other{Comparteix # elements seleccionats}}</translation> <translation id="7359002509206457351">Accedeix a les formes de pagament</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 d3d5c23..e80e3f2a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Zde není žádný obsah</translation> <translation id="2414886740292270097">Tmavé</translation> <translation id="2416359993254398973">Chrome pro tento web potřebuje oprávnění k přístupu k fotoaparátu.</translation> -<translation id="24241740415720680">Zjednodušená stránka poskytnutá společností Google</translation> <translation id="2426805022920575512">Vybrat jiný účet</translation> <translation id="2433507940547922241">Vzhled</translation> <translation id="2434158240863470628">Stažení bylo dokončeno <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Vymazat úložiště webů?</translation> <translation id="385051799172605136">Zpět</translation> <translation id="3859306556332390985">Přetočit dopředu</translation> -<translation id="3860879523841717702">Zjednodušená stránka poskytnutá společností Google. Klepnutím načtete původní stránku.</translation> <translation id="3868004864571585162">Cookies, licence k médiím a data webů</translation> <translation id="3894427358181296146">Přidat složku</translation> <translation id="3895926599014793903">Vynutit aktivaci přiblížení</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Zastavit obnovování</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Nápověda<ph name="END_LINK" /> k vyhledávání zařízení…</translation> <translation id="4943872375798546930">Žádné výsledky</translation> -<translation id="4956867391417827202">Blokovat reklamy na webech, které zobrazují rušivé nebo zavádějící reklamy</translation> <translation id="4958708863221495346">Stránka <ph name="URL_OF_THE_CURRENT_TAB" /> sdílí vaši obrazovku</translation> <translation id="4961334780091921942">Vaše hesla, historie a další údaje na všech zařízeních</translation> <translation id="4961700429721424617">Odhlašujete se z účtu, který je spravován doménou <ph name="MANAGED_DOMAIN" />. Touto akcí svá data prohlížeče Chrome smažete z tohoto zařízení, ve vašem účtu Google však zůstanou.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Vyberte fotky</translation> <translation id="7243308994586599757">Možnosti jsou k dispozici ve spodní části obrazovky</translation> <translation id="7250468141469952378">Vybráno: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Blokováno na všech webech</translation> <translation id="7253272406652746122">Přidejte účet Google ze stránky Účty v aplikaci Nastavení svého zařízení.</translation> <translation id="7274013316676448362">Blokovaný web</translation> <translation id="729975465115245577">V zařízení není žádná aplikace, pomocí které by soubor s hesly bylo možné uložit.</translation> <translation id="7302081693174882195">Podrobnosti: Seřazeno podle množství uspořených dat</translation> <translation id="7333031090786104871">Předchozí web se stále přidává</translation> -<translation id="7335671571918306053">Zjednodušená stránka poskytnutá společností Google. Původní stránku načtete klepnutím na tlačítko k načtení původní verze.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Sdílet 1 vybranou položku}few{Sdílet # vybrané položky}many{Sdílet # vybrané položky}other{Sdílet # vybraných položek}}</translation> <translation id="7359002509206457351">Poskytnout přístup k platební metodám</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 859c1850..83cca65 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Der er intet indhold her</translation> <translation id="2414886740292270097">Mørk</translation> <translation id="2416359993254398973">Chrome skal have tilladelse til at bruge dit kamera på dette website.</translation> -<translation id="24241740415720680">Lite-side leveret af Google</translation> <translation id="2426805022920575512">Vælg en anden konto</translation> <translation id="2433507940547922241">Udseende</translation> <translation id="2434158240863470628">Downloaden er gennemført <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Vil du rydde websitelagerpladsen?</translation> <translation id="385051799172605136">Tilbage</translation> <translation id="3859306556332390985">Spol fremad</translation> -<translation id="3860879523841717702">Lite-side leveret af Google. Tryk for at indlæse originalen.</translation> <translation id="3868004864571585162">Cookies, medielicenser og websitedata</translation> <translation id="3894427358181296146">Tilføj mappe</translation> <translation id="3895926599014793903">Tving aktivering af zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Stop med at opdatere</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Få hjælp<ph name="END_LINK" />, mens der scannes efter enheder…</translation> <translation id="4943872375798546930">Ingen resultater</translation> -<translation id="4956867391417827202">Bloker annoncer fra websites, der viser påtrængende eller vildledende annoncer</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> deler din skærm</translation> <translation id="4961334780091921942">Dine adgangskoder, din historik og meget mere på alle enheder</translation> <translation id="4961700429721424617">Du er ved at logge ud af en konto, der administreres af <ph name="MANAGED_DOMAIN" />. Denne handling sletter dine Chrome-data fra denne enhed, men dine data forbliver på din Google-konto.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Vælg billeder</translation> <translation id="7243308994586599757">Du finder indstillingerne nederst på skærmen</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> er markeret</translation> -<translation id="7251326866581677552">Blokeret fra nogle websites</translation> <translation id="7253272406652746122">Tilføj en Google-konto fra siden Konti i appen Indstillinger på din enhed.</translation> <translation id="7274013316676448362">Blokeret website</translation> <translation id="729975465115245577">Der er ikke nogen app på din enhed, hvor filen med adgangskoder kan gemmes.</translation> <translation id="7302081693174882195">Oplysninger: Sorteret efter mængden af sparede data</translation> <translation id="7333031090786104871">Det forrige website er stadig ved at blive tilføjet</translation> -<translation id="7335671571918306053">Lite-side leveret af Google. Tryk på knappen Indlæs original for at indlæse den originale side.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Del 1 valgt element}one{Del # valgt element}other{Del # valgte elementer}}</translation> <translation id="7359002509206457351">Adgang til betalingsmetoder</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 3a62e5eb..496e6b0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Keine Inhalte vorhanden</translation> <translation id="2414886740292270097">Dunkel</translation> <translation id="2416359993254398973">Chrome benötigt für diese Website die Berechtigung, auf Ihre Kamera zuzugreifen.</translation> -<translation id="24241740415720680">Lite-Modus-Seite von Google bereitgestellt</translation> <translation id="2426805022920575512">Anderes Konto auswählen</translation> <translation id="2433507940547922241">Darstellung</translation> <translation id="2434158240863470628">Download abgeschlossen <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Websitespeicher löschen?</translation> <translation id="385051799172605136">Zurück</translation> <translation id="3859306556332390985">Nach vorne navigieren</translation> -<translation id="3860879523841717702">Lite-Modus-Seite von Google bereitgestellt. Zum Laden der Originalseite tippen.</translation> <translation id="3868004864571585162">Cookies, Medienlizenzen und Websitedaten</translation> <translation id="3894427358181296146">Ordner hinzufügen</translation> <translation id="3895926599014793903">Zoom zwingend aktivieren</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Aktualisierung anhalten</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Hilfe aufrufen<ph name="END_LINK" />, während nach Geräten gesucht wird…</translation> <translation id="4943872375798546930">Keine Ergebnisse</translation> -<translation id="4956867391417827202">Werbung auf Websites blockieren, die aufdringliche oder irreführende Werbung anzeigen</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> hat Ihren Bildschirm freigegeben</translation> <translation id="4961334780091921942">Ihre Passwörter, Ihr Verlauf und mehr auf allen Geräten</translation> <translation id="4961700429721424617">Sie melden sich von einem Konto ab, das von <ph name="MANAGED_DOMAIN" /> verwaltet wird. Dadurch werden Ihre Chrome-Daten von diesem Gerät gelöscht, bleiben jedoch in Ihrem Google-Konto erhalten.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Bilder auswählen</translation> <translation id="7243308994586599757">Optionen unten auf dem Bildschirm verfügbar</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ausgewählt</translation> -<translation id="7251326866581677552">Auf einigen Websites blockiert</translation> <translation id="7253272406652746122">Fügen Sie ein Google-Konto über die Seite "Konten" der App "Einstellungen" Ihres Geräts hinzu.</translation> <translation id="7274013316676448362">Blockierte Website</translation> <translation id="729975465115245577">Auf Ihrem Gerät befindet sich keine App zum Speichern der Passwortdatei.</translation> <translation id="7302081693174882195">Details: Nach der Menge der gespeicherten Daten sortiert</translation> <translation id="7333031090786104871">Vorherige Website wird noch hinzugefügt</translation> -<translation id="7335671571918306053">Lite-Modus-Seite von Google bereitgestellt. Zum Laden der Originalseite auf die Schaltfläche "Original laden" tippen.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{1 ausgewähltes Element teilen}other{# ausgewählte Elemente teilen}}</translation> <translation id="7359002509206457351">Auf Zahlungsmethoden zugreifen</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 83f37250..71deb88 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Δεν υπάρχει περιεχόμενο εδώ</translation> <translation id="2414886740292270097">Σκούρο</translation> <translation id="2416359993254398973">Το Chrome χρειάζεται άδεια, για να αποκτήσει πρόσβαση στην κάμερα για αυτόν τον ιστότοπο.</translation> -<translation id="24241740415720680">Σελίδα Lite από την Google</translation> <translation id="2426805022920575512">Επιλογή άλλου λογαριασμού</translation> <translation id="2433507940547922241">Εμφάνιση</translation> <translation id="2434158240863470628">Η λήψη ολοκληρώθηκε <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Διαγ.αποθ.χώρου ιστότ.;</translation> <translation id="385051799172605136">Πίσω</translation> <translation id="3859306556332390985">Αναζήτηση προς τα εμπρός</translation> -<translation id="3860879523841717702">Η σελίδα Lite παρέχεται από την Google. Πατήστε για φόρτωση της αρχικής σελίδας.</translation> <translation id="3868004864571585162">Cookie, άδειες πολυμέσων και δεδομένα ιστοτόπων</translation> <translation id="3894427358181296146">Προσθήκη φακέλου…</translation> <translation id="3895926599014793903">Αναγκαστική ενεργοποίηση εστίασης</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Διακοπή ανανέωσης</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Λήψη βοήθειας<ph name="END_LINK" /> κατά τη σάρωση για συσκευές…</translation> <translation id="4943872375798546930">Δεν υπάρχουν αποτελέσματα</translation> -<translation id="4956867391417827202">Αποκλεισμός διαφημίσεων από ιστότοπους που εμφανίζουν παρεμβατικές ή παραπλανητικές διαφημίσεις</translation> <translation id="4958708863221495346">Η καρτέλα <ph name="URL_OF_THE_CURRENT_TAB" /> μοιράζεται την οθόνη σας.</translation> <translation id="4961334780091921942">Οι κωδικοί πρόσβασης, το ιστορικό και πολλά άλλα σε όλες τις συσκευές</translation> <translation id="4961700429721424617">Πρόκειται να αποσυνδεθείτε από έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="MANAGED_DOMAIN" />. Αυτή η ενέργεια θα διαγράψει τα δεδομένα σας στο Chrome από αυτήν τη συσκευή, αλλά θα διατηρηθούν στον Λογαριασμό σας Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Επιλέξτε εικόνες</translation> <translation id="7243308994586599757">Διαθέσιμες επιλογές κοντά κάτω μέρος της οθόνης</translation> <translation id="7250468141469952378">Επιλέχθηκαν <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Αποκλεισμός από ορισμένους ιστοτόπους</translation> <translation id="7253272406652746122">Προσθέστε έναν Λογαριασμό Google από τη σελίδα "Λογαριασμοί" της εφαρμογής Ρυθμίσεις της συσκευής σας.</translation> <translation id="7274013316676448362">Αποκλεισμένος ιστότοπος</translation> <translation id="729975465115245577">Η συσκευή σας δεν διαθέτει κάποια εφαρμογή για την αποθήκευση του αρχείου κωδικών πρόσβασης.</translation> <translation id="7302081693174882195">Λεπτομέρειες: Ταξινομήθηκαν βάσει του όγκου των δεδομένων που αποθηκεύτηκαν</translation> <translation id="7333031090786104871">Η προσθήκη του προηγούμενου ιστοτόπου δεν έχει ολοκληρωθεί</translation> -<translation id="7335671571918306053">Η σελίδα Lite παρέχεται από την Google. Πατήστε το κουμπί φόρτωσης αρχικής για φόρτωση της αρχικής σελίδας.</translation> <translation id="7352939065658542140">ΒΙΝΤΕΟ</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Κοινοποίηση 1 επιλεγμένου στοιχείου}other{Κοινοποίηση # επιλεγμένων στοιχείων}}</translation> <translation id="7359002509206457351">Πρόσβαση σε τρόπους πληρωμής</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 32df4ab..7179e65 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
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">No content here</translation> <translation id="2414886740292270097">Dark</translation> <translation id="2416359993254398973">Chrome needs permission to access your camera for this site.</translation> -<translation id="24241740415720680">Lite page delivered by Google</translation> <translation id="2426805022920575512">Choose another account</translation> <translation id="2433507940547922241">Appearance</translation> <translation id="2434158240863470628">Download complete <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -298,6 +297,7 @@ <translation id="3295602654194328831">Hide info</translation> <translation id="3298243779924642547">Lite</translation> <translation id="3303414029551471755">Proceed to download the content?</translation> +<translation id="3306398118552023113">This app is running in Chrome</translation> <translation id="3328801116991980348">Site information</translation> <translation id="3341058695485821946">See how much data you've saved</translation> <translation id="3350687908700087792">Close all incognito tabs</translation> @@ -310,6 +310,7 @@ <translation id="3398320232533725830">Open the bookmarks manager</translation> <translation id="3414952576877147120">Size:</translation> <translation id="3443221991560634068">Reload the current page</translation> +<translation id="3445014427084483498">Just now</translation> <translation id="3452612588551937789">Sign in with your Google Account to get your bookmarks, history, passwords and other settings on all your devices.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d file downloaded}other{%1$d files downloaded}}</translation> <translation id="3492207499832628349">New incognito tab</translation> @@ -353,7 +354,6 @@ <translation id="3822502789641063741">Clear site storage?</translation> <translation id="385051799172605136">Back</translation> <translation id="3859306556332390985">Seek forward</translation> -<translation id="3860879523841717702">Lite page delivered by Google. Tap to load the original.</translation> <translation id="3868004864571585162">Cookies, media licences and site data</translation> <translation id="3894427358181296146">Add folder</translation> <translation id="3895926599014793903">Force enable zoom</translation> @@ -363,6 +363,7 @@ <translation id="3950820424414687140">Sign in</translation> <translation id="395206256282351086">Search and site suggestions disabled</translation> <translation id="3955193568934677022">Allow sites to play protected content (recommended)</translation> +<translation id="3963007978381181125">Passphrase encryption doesn’t include payment methods and addresses from Google Pay. Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, you'll need to reset sync. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation> <translation id="3967822245660637423">Download complete</translation> <translation id="397583555483684758">Sync has stopped working</translation> <translation id="3976396876660209797">Remove and recreate this shortcut</translation> @@ -401,7 +402,9 @@ <translation id="4195643157523330669">Open in new tab</translation> <translation id="4198423547019359126">No available download locations</translation> <translation id="4209895695669353772">To get personalised content suggested by Google, turn on sync</translation> +<translation id="4225719675976901337">No content found</translation> <translation id="4226663524361240545">Notifications may vibrate the device</translation> +<translation id="423219824432660969">Encrypt synced data with Google password as of <ph name="TIME" /></translation> <translation id="4242533952199664413">Open settings</translation> <translation id="4243710787042215766">Open in private tab</translation> <translation id="424864128008805179">Sign out of Chrome?</translation> @@ -471,6 +474,9 @@ <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 download complete.}other{# downloads complete.}}</translation> <translation id="4766369052440583386">Data Saver is on</translation> <translation id="4797039098279997504">Touch to return to <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="4802417911091824046">Passphrase encryption doesn’t include payment methods and addresses from Google Pay. + +To change this setting, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /></translation> <translation id="4807098396393229769">Name on card</translation> <translation id="4807963036345170158">Data Saver is off</translation> <translation id="4816465935029283692">Data types</translation> @@ -482,6 +488,7 @@ <translation id="4874967477260347223">Media Licenses</translation> <translation id="4875775213178255010">Content Suggestions</translation> <translation id="4878404682131129617">Establishing a tunnel via proxy server failed</translation> +<translation id="4880127995492972015">Translate…</translation> <translation id="4881695831933465202">Open</translation> <translation id="488187801263602086">Rename file</translation> <translation id="4882831918239250449">Control how your browsing history is used to personalise Search, ads and more</translation> @@ -492,7 +499,6 @@ <translation id="4913169188695071480">Stop refreshing</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Get help<ph name="END_LINK" /> while scanning for devices…</translation> <translation id="4943872375798546930">No results</translation> -<translation id="4956867391417827202">Block ads from sites that show intrusive or misleading ads</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> is sharing your screen</translation> <translation id="4961334780091921942">Your passwords, history & more on all devices</translation> <translation id="4961700429721424617">You are signing out of an account managed by <ph name="MANAGED_DOMAIN" />. This will delete your Chrome data from this device, but your data will remain in your Google account.</translation> @@ -741,6 +747,7 @@ <translation id="6738867403308150051">Downloading…</translation> <translation id="6746124502594467657">Move down</translation> <translation id="6766622839693428701">Swipe down to close.</translation> +<translation id="6766758767654711248">Tap to go to site</translation> <translation id="6768277682697012280">Installing AR module...</translation> <translation id="6776813977906306442">Download videos to watch later using the Download button</translation> <translation id="6782111308708962316">Prevent third-party websites from saving and reading cookie data</translation> @@ -809,13 +816,11 @@ <translation id="723171743924126238">Select images</translation> <translation id="7243308994586599757">Options available near bottom of the screen</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selected</translation> -<translation id="7251326866581677552">Blocked from some sites</translation> <translation id="7253272406652746122">Add a Google account from the Accounts page in your device’s Settings app.</translation> <translation id="7274013316676448362">Blocked site</translation> <translation id="729975465115245577">Your device doesn’t have an app to store the passwords file.</translation> <translation id="7302081693174882195">Details: Sorted by amount of data saved</translation> <translation id="7333031090786104871">Still adding previous site</translation> -<translation id="7335671571918306053">Lite page delivered by Google. Tap the load original button to load the original page.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Share 1 selected item}other{Share # selected items}}</translation> <translation id="7359002509206457351">Access payment methods</translation> @@ -959,6 +964,7 @@ <translation id="8441146129660941386">Seek backward</translation> <translation id="8445448999790540984">Can’t export passwords</translation> <translation id="8447861592752582886">Revoke device permission</translation> +<translation id="8461694314515752532">Encrypt synced data with your own sync passphrase</translation> <translation id="8477071352266846533">Sync off for <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">Available offline</translation> @@ -1003,10 +1009,12 @@ <translation id="8748850008226585750">Contents hidden</translation> <translation id="8751914237388039244">Select an image</translation> <translation id="8788968922598763114">Reopen the last closed tab</translation> +<translation id="8801436777607969138">Block JavaScript for a specific site.</translation> <translation id="8812260976093120287">On some websites, you can pay with above supported payment apps on your device.</translation> <translation id="8816439037877937734"><ph name="APP_NAME" /> will open in Chrome. By continuing, you agree to Chrome's <ph name="BEGIN_LINK1" />Terms of Service<ph name="END_LINK1" /> and <ph name="BEGIN_LINK2" />Privacy Notice<ph name="END_LINK2" />, and the <ph name="BEGIN_LINK3" />Privacy Notice for Google Accounts Managed with Family Link<ph name="END_LINK3" />.</translation> <translation id="8820817407110198400">Bookmarks</translation> <translation id="8823704566850948458">Suggest password...</translation> +<translation id="8833831881926404480">A site is sharing your screen</translation> <translation id="883806473910249246">An error occurred while downloading the content.</translation> <translation id="8840953339110955557">This page may differ from the online version.</translation> <translation id="8847988622838149491">USB</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 ee6c915..c724403 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
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Aquí no hay contenido</translation> <translation id="2414886740292270097">Oscuro</translation> <translation id="2416359993254398973">Chrome necesita permiso para acceder a tu cámara para este sitio.</translation> -<translation id="24241740415720680">Google proporcionó la página básica</translation> <translation id="2426805022920575512">Seleccionar otra cuenta</translation> <translation id="2433507940547922241">Diseño</translation> <translation id="2434158240863470628">Se completó la descarga <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">¿Borrar el almacenamiento de sitios?</translation> <translation id="385051799172605136">Atrás</translation> <translation id="3859306556332390985">Buscar más adelante</translation> -<translation id="3860879523841717702">Google proporcionó la página básica. Presiona para cargar la versión original.</translation> <translation id="3868004864571585162">Cookies, licencias de medios y datos de sitios</translation> <translation id="3894427358181296146">Agregar carpeta</translation> <translation id="3895926599014793903">Forzar habilitación de zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Detener actualización</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /> mientras se buscan dispositivos…</translation> <translation id="4943872375798546930">Sin resultados</translation> -<translation id="4956867391417827202">Bloquear anuncios de sitios que muestran anuncios intrusivos o engañosos</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está compartiendo tu pantalla</translation> <translation id="4961334780091921942">Tus contraseñas, historial y más en todos los dispositivos</translation> <translation id="4961700429721424617">Estás saliendo de una cuenta administrada por <ph name="MANAGED_DOMAIN" />. Esta acción borrará tus datos de Chrome en este dispositivo, pero permanecerán en tu cuenta de Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Seleccionar imágenes</translation> <translation id="7243308994586599757">Opciones disponibles junto a la parte inferior de la pantalla</translation> <translation id="7250468141469952378">Elementos seleccionados: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Bloqueados de algunos sitios</translation> <translation id="7253272406652746122">Agrega una cuenta de Google desde la página Cuentas en la app de Configuración del dispositivo.</translation> <translation id="7274013316676448362">Sitio bloqueado</translation> <translation id="729975465115245577">Tu dispositivo no tiene una app que pueda almacenar el archivo de contraseñas.</translation> <translation id="7302081693174882195">Detalles: Ordenados por cantidad de datos ahorrados</translation> <translation id="7333031090786104871">Aún se está agregando el sitio anterior</translation> -<translation id="7335671571918306053">Google proporcionó la página básica. Presiona el botón para cargar la página original.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Comparte 1 elemento seleccionado}other{Comparte # elementos seleccionados}}</translation> <translation id="7359002509206457351">Acceder a formas de pago</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 dab3fbd..d129f24 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">No hay contenido</translation> <translation id="2414886740292270097">Oscuro</translation> <translation id="2416359993254398973">Chrome necesita permiso para acceder a la cámara en este sitio web.</translation> -<translation id="24241740415720680">Página básica ofrecida por Google</translation> <translation id="2426805022920575512">Elegir otra cuenta</translation> <translation id="2433507940547922241">Aspecto</translation> <translation id="2434158240863470628">Descarga completa <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">¿Borrar almacenamiento web?</translation> <translation id="385051799172605136">Atrás</translation> <translation id="3859306556332390985">Buscar hacia delante</translation> -<translation id="3860879523841717702">Página básica ofrecida por Google. Toca para cargar la original.</translation> <translation id="3868004864571585162">Cookies, licencias de contenido multimedia y datos de sitios web</translation> <translation id="3894427358181296146">Añadir carpeta</translation> <translation id="3895926599014793903">Forzar zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Dejar de actualizar</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /> mientras se buscan dispositivos…</translation> <translation id="4943872375798546930">Sin resultados</translation> -<translation id="4956867391417827202">Bloquea anuncios invasivos o engañosos de los sitios web que los muestran</translation> <translation id="4958708863221495346">Estás compartiendo tu pantalla a través de <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="4961334780091921942">Tus contraseñas, tu historial y mucho más en todos tus dispositivos</translation> <translation id="4961700429721424617">Estás cerrando sesión en una cuenta gestionada por <ph name="MANAGED_DOMAIN" />. Tus datos de Chrome se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Seleccionar imágenes</translation> <translation id="7243308994586599757">Opciones disponibles cerca de la parte inferior de la pantalla</translation> <translation id="7250468141469952378">Elementos seleccionados: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Bloqueados en algunos sitios web</translation> <translation id="7253272406652746122">Añade una cuenta de Google desde la sección Cuentas de la aplicación de ajustes de tu dispositivo.</translation> <translation id="7274013316676448362">Sitio web bloqueado</translation> <translation id="729975465115245577">Tu dispositivo no tiene ninguna aplicación para almacenar el archivo de contraseñas.</translation> <translation id="7302081693174882195">Detalles: ordenados por cantidad de datos ahorrados</translation> <translation id="7333031090786104871">Aún se está añadiendo el sitio web anterior</translation> -<translation id="7335671571918306053">Página básica ofrecida por Google. Si quieres ver la original, toca el botón para cargarla.</translation> <translation id="7352939065658542140">VÍDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Compartir 1 elemento seleccionado}other{Compartir # elementos seleccionados}}</translation> <translation id="7359002509206457351">Acceso a métodos de pago</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 6fc89bc..0551f6e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">محتوایی موجود نیست</translation> <translation id="2414886740292270097">تاریک</translation> <translation id="2416359993254398973">Chrome به مجوز دسترسی به دوربین برای این سایت نیاز دارد.</translation> -<translation id="24241740415720680">صفحه سادهشده توسط Google ارائه شده است</translation> <translation id="2426805022920575512">انتخاب حسابی دیگر</translation> <translation id="2433507940547922241">شکل ظاهری</translation> <translation id="2434158240863470628">بارگیری کامل شد <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">فضای ذخیره سایت پاک شود؟</translation> <translation id="385051799172605136">بازگشت</translation> <translation id="3859306556332390985">جستجو به جلو</translation> -<translation id="3860879523841717702">صفحه سادهشده توسط Google ارائه شده است. برای بارگیری صفحه اصلی ضربه بزنید.</translation> <translation id="3868004864571585162">کوکیها، مجوزهای رسانه و دادههای سایت</translation> <translation id="3894427358181296146">افزودن پوشه</translation> <translation id="3895926599014793903">فعال کردن اجباری بزرگنمایی</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">توقف تازهسازی</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />دریافت راهنمایی<ph name="END_LINK" /> درحین اسکن دستگاهها…</translation> <translation id="4943872375798546930">نتیجهای پیدا نشد</translation> -<translation id="4956867391417827202">آگهی سایتهایی که آگهیهای مزاحم یا گمراهکننده نشان میدهند مسدود میشود</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> درحال اشتراکگذاری صفحه شما است</translation> <translation id="4961334780091921942">گذرواژهها، سابقه و موارد دیگر در همه دستگاهها</translation> <translation id="4961700429721424617">هماکنون از حسابی که توسط <ph name="MANAGED_DOMAIN" /> مدیریت میشود، خارج میشوید. با این کار دادههای Chrome شما از این دستگاه حذف میشود اما همچنان در حساب Google شما باقی میماند.</translation> @@ -808,13 +805,11 @@ <translation id="723171743924126238">انتخاب تصاویر</translation> <translation id="7243308994586599757">گزینهها در نزدیک پایین صفحه نمایش در دسترس هستند</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> مورد انتخاب شد</translation> -<translation id="7251326866581677552">در برخی از سایتها مسدود شد</translation> <translation id="7253272406652746122">از صفحه «حسابها» در برنامه «تنظیمات» دستگاه، یک حساب Google اضافه کنید.</translation> <translation id="7274013316676448362">سایت مسدودشده</translation> <translation id="729975465115245577">دستگاه شما برنامهای برای ذخیره فایل گذرواژهها ندارد.</translation> <translation id="7302081693174882195">جزئیات: مرتبشده براساس مقدار داده صرفهجوییشده</translation> <translation id="7333031090786104871">همچنان درحال افزودن سایت قبلی</translation> -<translation id="7335671571918306053">صفحه سادهشده توسط Google ارائه شده است. برای بارگیری صفحه اصلی روی دکمه بارگیری صفحه اصلی ضربه بزنید.</translation> <translation id="7352939065658542140">ویدیو</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{اشتراکگذاری ۱ مورد انتخابشده}one{اشتراکگذاری # مورد انتخابشده}other{اشتراکگذاری # مورد انتخابشده}}</translation> <translation id="7359002509206457351">دسترسی به روشهای پرداخت</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 00f3d99..2c41526 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Ei sisältöä</translation> <translation id="2414886740292270097">Tumma</translation> <translation id="2416359993254398973">Chrome tarvitsee oikeuden käyttää kameraasi tällä sivustolla.</translation> -<translation id="24241740415720680">Googlen tarjoama yksinkertaistettu sivu</translation> <translation id="2426805022920575512">Valitse toinen tili</translation> <translation id="2433507940547922241">Ulkonäkö</translation> <translation id="2434158240863470628">Lataus valmis <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Poistetaanko tiedot?</translation> <translation id="385051799172605136">Edellinen</translation> <translation id="3859306556332390985">Kelaa eteenpäin</translation> -<translation id="3860879523841717702">Googlen tarjoama yksinkertaistettu sivu. Lataa alkuperäinen napauttamalla.</translation> <translation id="3868004864571585162">Evästeet, medialisenssit ja sivustodata</translation> <translation id="3894427358181296146">Lisää kansio</translation> <translation id="3895926599014793903">Ota zoomaus käyttöön</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Lopeta päivittäminen</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Tutustu ohjeisiin<ph name="END_LINK" /> laitteiden skannauksen aikana…</translation> <translation id="4943872375798546930">Ei tuloksia</translation> -<translation id="4956867391417827202">Estä häiritseviä mainoksia näyttävien sivustojen mainokset</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> jakaa näyttösi.</translation> <translation id="4961334780091921942">Salasanasi, historiasi ja paljon muuta kaikilla laitteilla</translation> <translation id="4961700429721424617">Olet kirjautumassa ulos verkkotunnuksen <ph name="MANAGED_DOMAIN" /> hallinnoimalta tililtä. Chrome-tietosi poistetaan tältä laitteelta, mutta tietosi säilyvät Google-tililläsi.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Valitse kuvat</translation> <translation id="7243308994586599757">Asetukset löytyvät näytön alalaidasta.</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> valittu</translation> -<translation id="7251326866581677552">Joidenkin sivustojen mainokset estetty</translation> <translation id="7253272406652746122">Lisää Google-tili laitteen Asetukset-sovelluksen Tilit-sivulla.</translation> <translation id="7274013316676448362">Estetty sivusto</translation> <translation id="729975465115245577">Laitteella ei ole sovellusta, johon salasanatiedoston voisi tallentaa.</translation> <translation id="7302081693174882195">Lisätiedot: Lajiteltu säästetyn datan mukaan</translation> <translation id="7333031090786104871">Edellisen sivuston lisääminen kesken</translation> -<translation id="7335671571918306053">Googlen tarjoama yksinkertaistettu sivu. Valitse Lataa alkuperäinen, jos haluat ladata alkuperäisen sivun.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Jaa 1 valittu kohde}other{Jaa # valittua kohdetta}}</translation> <translation id="7359002509206457351">Pääsy maksutapoihin</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 4546a3f..c09272e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Walang content dito</translation> <translation id="2414886740292270097">Madilim</translation> <translation id="2416359993254398973">Kailangan ng Chrome ng pahintulot na i-access ang iyong camera para sa site na ito.</translation> -<translation id="24241740415720680">Lite na page na hatid ng Google</translation> <translation id="2426805022920575512">Pumili ng ibang account</translation> <translation id="2433507940547922241">Hitsura</translation> <translation id="2434158240863470628">Tapos nang mag-download <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">I-clear ang storage ng site?</translation> <translation id="385051799172605136">Bumalik</translation> <translation id="3859306556332390985">Maghanap nang pasulong</translation> -<translation id="3860879523841717702">Lite na page na hatid ng Google. Mag-tap para i-load ang orihinal.</translation> <translation id="3868004864571585162">Cookies, mga lisensya ng media, at data ng site</translation> <translation id="3894427358181296146">Magdagdag ng folder</translation> <translation id="3895926599014793903">Puwersahang i-enable ang zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Ihinto ang pag-refresh</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Humingi ng tulong<ph name="END_LINK" /> habang nag-ii-scan ng mga device…</translation> <translation id="4943872375798546930">Walang mga resulta</translation> -<translation id="4956867391417827202">I-block ang mga ad mula sa mga site na nagpapakita ng mga nakakasagabal o nakakapanlinlang na ad</translation> <translation id="4958708863221495346">Ibinabahagi ng <ph name="URL_OF_THE_CURRENT_TAB" /> ang iyong screen</translation> <translation id="4961334780091921942">Ang iyong mga password, history, at higit pa sa lahat ng device</translation> <translation id="4961700429721424617">Nagsa-sign out ka sa account na pinamamahalaan ng <ph name="MANAGED_DOMAIN" />. Ide-delete nito ang data mo sa Chrome mula sa device na ito, ngunit mananatili ang data mo sa iyong Google account.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Pumili ng mga larawan</translation> <translation id="7243308994586599757">May mga opsyon malapit sa ibaba ng screen</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ang napili</translation> -<translation id="7251326866581677552">Naka-block sa ilang site</translation> <translation id="7253272406652746122">Magdagdag ng Google Account mula sa page na Mga Account sa app na Mga Setting ng iyong device.</translation> <translation id="7274013316676448362">Naka-block na site</translation> <translation id="729975465115245577">Walang app sa iyong device upang ma-store ang file ng mga password.</translation> <translation id="7302081693174882195">Mga detalye: Pinagbukud-bukod ayon sa laki ng natipid na data</translation> <translation id="7333031090786104871">Nagdaragdag pa rin ng nakaraang site</translation> -<translation id="7335671571918306053">Lite na page na hatid ng Google. I-tap ang button na i-load ang orihinal para i-load ang orihinal na page.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Ibahagi ang 1 piniling item}one{Ibahagi ang # piniling item}other{Ibahagi ang # na piniling item}}</translation> <translation id="7359002509206457351">I-access ang mga paraan ng pagbabayad</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 ba0e779..696e3ef1 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Pas de contenu ici</translation> <translation id="2414886740292270097">Foncé</translation> <translation id="2416359993254398973">Chrome a besoin de votre autorisation pour accéder à votre appareil photo pour ce site.</translation> -<translation id="24241740415720680">Page simplifiée diffusée par Google</translation> <translation id="2426805022920575512">Sélectionner un autre compte</translation> <translation id="2433507940547922241">Apparence</translation> <translation id="2434158240863470628">Téléchargement terminé <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Suppr. données de site ?</translation> <translation id="385051799172605136">Retour</translation> <translation id="3859306556332390985">Avance rapide</translation> -<translation id="3860879523841717702">Page simplifiée diffusée par Google. Appuyez pour charger la page originale.</translation> <translation id="3868004864571585162">Cookies, licences multimédias et données de sites</translation> <translation id="3894427358181296146">Ajouter un dossier</translation> <translation id="3895926599014793903">Forcer l'activation du zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Ne plus actualiser</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtenir de l'aide<ph name="END_LINK" /> lors de la recherche d'appareils…</translation> <translation id="4943872375798546930">Aucun résultat</translation> -<translation id="4956867391417827202">Bloquer les annonces des sites qui affichent des annonces intrusives ou trompeuses</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> partage votre écran.</translation> <translation id="4961334780091921942">Vos mots de passe, votre historique et plus encore sur tous les appareils</translation> <translation id="4961700429721424617">Vous vous déconnectez d'un compte géré par <ph name="MANAGED_DOMAIN" />. Cette opération entraînera la suppression de vos données Chrome de cet appareil, mais celles-ci seront conservées dans votre compte Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Sélectionner des images</translation> <translation id="7243308994586599757">Options disponibles au bas de l'écran</translation> <translation id="7250468141469952378">Nombre d'éléments sélectionnés : <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Bloqué sur certains sites</translation> <translation id="7253272406652746122">Ajoutez un compte Google depuis la page "Comptes" dans l'application "Paramètres" de votre appareil.</translation> <translation id="7274013316676448362">Site bloqué</translation> <translation id="729975465115245577">Aucune application n'est installée sur votre appareil pour stocker le fichier de mots de passe.</translation> <translation id="7302081693174882195">Détails : tri effectué par volume de données enregistrées</translation> <translation id="7333031090786104871">L'ajout du site précédent est toujours en cours</translation> -<translation id="7335671571918306053">Page simplifiée diffusée par Google. Appuyez sur le bouton "Charger le site d'origine" pour charger la page d'origine.</translation> <translation id="7352939065658542140">VIDÉO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Partager 1 élément sélectionné}one{Partager # élément sélectionné}other{Partager # éléments sélectionnés}}</translation> <translation id="7359002509206457351">Accéder aux modes de paiement</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 9673f0d..2b3ea736 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -10,6 +10,7 @@ <translation id="1067922213147265141">Google की दूसरी सेवाएंं</translation> <translation id="1068672505746868501"><ph name="SOURCE_LANGUAGE" /> भाषा के पेज का कभी भी अनुवाद न करें</translation> <translation id="1080790410959514870">आप <ph name="DOMAIN_NAME" /> द्वारा प्रबंधित खाते से प्रस्थान कर रहे हैं. इससे इस डिवाइस पर संग्रहित Chrome डेटा हट जाएगा, लेकिन डेटा आपके Google खाते में बना रहेगा.</translation> +<translation id="1099080783256647258">'डेटा बचाने का टूल' चालू होने पर, Chrome पेज लोड होने की गति बढ़ाने और Google के सर्वर इस्तेमाल करता है. जो पेज खास तौर पर धीमे हैं उन पर, 'डेटा बचाने का टूल' पेज को फिर से लिखकर सिर्फ़ ज़रूरी सामग्री लोड कर देता है. 'डेटा बचाने का टूल' 'गुप्त मोड' में लोड किए गए पेज ऑप्टिमाइज़ नहीं करता है.</translation> <translation id="1105960400813249514">स्क्रीन कैप्चर</translation> <translation id="1111673857033749125">आपके अन्य डिवाइस पर सहेजे गए बुकमार्क यहां दिखाई देंगे.</translation> <translation id="1113597929977215864">सरल बनाया गया व्यू दिखाएं</translation> @@ -70,7 +71,9 @@ <translation id="1445680696957526815">Chrome के घटक एक-दूसरे से असंगत हैं. संभवत: Chrome अपग्रेड हो रहा है, कृपया कुछ ही देर में पुन: प्रयास करें. यदि समस्या बनी रहती है, तो Chrome को अनइंस्टॉल करके और पुन: इंस्टॉल करके देखें.</translation> <translation id="1446450296470737166">MIDI डिवाइस के पूर्ण नियंत्रण की अनुमति दें</translation> <translation id="145097072038377568">Android सेटिंग में बंद कर दिया गया है</translation> +<translation id="1469898724493126466">वेब की सबसे अच्छी जानकारी ढूंढी जा रही है.</translation> <translation id="1477626028522505441">सर्वर संबधी समस्याओं के कारण <ph name="FILE_NAME" /> डाउनलोड विफल रहा.</translation> +<translation id="1501480321619201731">समूह मिटाएं</translation> <translation id="1506061864768559482">खोज इंजन</translation> <translation id="1513352483775369820">बुकमार्क और वेब इतिहास</translation> <translation id="1513858653616922153">पासवर्ड हटाएं</translation> @@ -107,6 +110,7 @@ <translation id="1779089405699405702">चित्र डीकोडर</translation> <translation id="1782483593938241562">खत्म होने की तारीख: <ph name="DATE" /></translation> <translation id="1792959175193046959">डिफ़ॉल्ट डाउनलोड स्थान किसी भी समय बदलें</translation> +<translation id="1796971354271036388">वीआर मॉड्यूल इंस्टॉल किया जा रहा है...</translation> <translation id="1807246157184219062">हल्का</translation> <translation id="1821253160463689938">आपकी पसंद याद रखने के लिए कुकी का इस्तेमाल करती है, भले ही आप उन पेजों पर नहीं जाते</translation> <translation id="1829244130665387512">पेज में ढूंढें</translation> @@ -143,6 +147,7 @@ <translation id="2021896219286479412">पूरी स्क्रीन के साइट नियंत्रण</translation> <translation id="2038563949887743358">अनुरोध डेस्कटॉप साइट चालू करें</translation> <translation id="2045104531052923016"><ph name="GIGABYTES" /> जीबी अन्य ऐप्लिकेशन</translation> +<translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="2063713494490388661">खोजने के लिए टैप करें</translation> <translation id="2079545284768500474">वापस लाएं</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> में से <ph name="RESULT_NUMBER" /> परिणाम</translation> @@ -222,6 +227,7 @@ <translation id="2647434099613338025">भाषा जोड़ें</translation> <translation id="2650751991977523696">फ़ाइल दोबारा डाउनलोड करें?</translation> <translation id="2653659639078652383">सबमिट करें</translation> +<translation id="2671423594960767771">समूह शेयर करें</translation> <translation id="2677748264148917807">छोड़ें</translation> <translation id="2704606927547763573">कॉपी किया गया</translation> <translation id="2707726405694321444">पेज रीफ्रेश करें</translation> @@ -231,6 +237,7 @@ <translation id="2744248271121720757">झटपट खोजने या मिलती-जुलती कार्रवाइयां देखने के लिए किसी शब्द पर टैप करें</translation> <translation id="2762000892062317888">अभी-अभी</translation> <translation id="2777555524387840389"><ph name="SECONDS" /> सेकंड शेष</translation> +<translation id="2779651927720337254">डाउनलोड नहीं हो सका</translation> <translation id="2781151931089541271">1 सेकंड शेष</translation> <translation id="2803478378562657435">सेव किए हुए पासवर्ड और पासवर्ड के विकल्प दिखाए जा रहे हैं</translation> <translation id="2810645512293415242">डेटा बचाने और तेज़ी से लोड करने के लिए आसान बनाया गया पेज.</translation> @@ -315,6 +322,7 @@ <translation id="3557336313807607643">संपर्कों में जोड़ें</translation> <translation id="3568688522516854065">अपने दूसरे डिवाइस से अपने टैब पाने के लिए, साइन इन करें और 'सिंक करें' को चालू करें</translation> <translation id="3587482841069643663">सभी</translation> +<translation id="358794129225322306">किसी साइट को अपने आप एक से ज़्यादा फ़ाइलें लोड करने की मंज़ूरी दें.</translation> <translation id="3590487821116122040">ऐसी 'साइट मेमोरी' जो Chrome के हिसाब से ज़रूरी नहीं है (जैसे कि ऐसी साइट जिनमें कोई भी सेटिंग नहीं सेव की गई है या जिन पर आप अक्सर नहीं जाते हैं)</translation> <translation id="3599863153486145794">प्रवेश किए हुए सभी डिवाइसों से इतिहास साफ़ कर देता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation> <translation id="3600792891314830896">आवाज़ चलाने वाली साइटों की आवाज़ बंद करें</translation> @@ -401,6 +409,7 @@ <translation id="4269820728363426813">लिंक पते को कॉपी करें</translation> <translation id="4275663329226226506">मीडिया</translation> <translation id="4278390842282768270">अनुमति है</translation> +<translation id="429312253194641664">किसी साइट पर मीडिया चल रहा है</translation> <translation id="4307992518367153382">आधारभूत बातें</translation> <translation id="4351244548802238354">संवाद बंद करें</translation> <translation id="4378154925671717803">फ़ोन</translation> @@ -466,6 +475,7 @@ <translation id="4837753911714442426">पेज प्रिंट करने के विकल्प खोलें</translation> <translation id="4842092870884894799">पासवर्ड जेनरेशन पॉपअप दिखाया जा रहा है</translation> <translation id="4850886885716139402">देखें</translation> +<translation id="4857347795080810417">वीआर मॉड्यूल इंस्टॉल हो गया है</translation> <translation id="4860895144060829044">कॉल करें</translation> <translation id="4874967477260347223">मीडिया लाइसेंस</translation> <translation id="4875775213178255010">सामग्री के सुझाव</translation> @@ -605,6 +615,7 @@ <translation id="5833397272224757657">आप जिन साइटों पर जाते हैं उनकी सामग्री के साथ ही ब्राउज़र गतिविधि और इंटरैक्शन का इस्तेमाल आपके मनमुताबिक बनाने के लिए करता है</translation> <translation id="5833984609253377421">लिंक शेयर करें</translation> <translation id="584427517463557805">चुना गया निजी टैब</translation> +<translation id="5853623416121554550">रोका गया</translation> <translation id="5854790677617711513">30 दिनों से ज़्यादा पुराना</translation> <translation id="5858741533101922242">Chrome, ब्लूटूथ एडाप्टर को चालू नहीं कर सका</translation> <translation id="5860033963881614850">बंद</translation> @@ -696,6 +707,7 @@ <translation id="6545017243486555795">सभी डेटा साफ़ करें</translation> <translation id="6560414384669816528">Sogou से खोजें</translation> <translation id="6566259936974865419">Chrome ने आपके <ph name="GIGABYTES" /> जीबी की बचत की</translation> +<translation id="6567212464587185774">60% तक कम डेटा का इस्तेमाल करें और वेब की गति तेज़ करें.</translation> <translation id="6573096386450695060">हमेशा मंज़ूरी दें</translation> <translation id="6573431926118603307">आपके द्वारा अपने अन्य डिवाइस पर खोले गए टैब यहां दिखाई देंगे.</translation> <translation id="6575643671698722332">रीसेट विफल रहा. डिवाइस ऑनलाइन होना सुनिश्चित करें और पुन: प्रयास करें.</translation> @@ -719,6 +731,7 @@ <translation id="6697492270171225480">जब कोई पेज मिल नहीं पा रहा हो तो मिलते-जुलते पेज के सुझाव दिखाएं</translation> <translation id="6697947395630195233">Chrome को इस साइट से आपका स्थान शेयर करने के लिए आपके स्थान का एक्सेस चाहिए.</translation> <translation id="6698801883190606802">समन्वयित डेटा प्रबंधित करें</translation> +<translation id="6699370405921460408">Google के सर्वर उन पेज को ऑप्टिमाइज़ करेंगे जिन पर आप जाते हैं.</translation> <translation id="6709133671862442373">समाचार</translation> <translation id="6710213216561001401">पिछला</translation> <translation id="6712388303105732168">'इसी तरह के और भी' बटन का इस्तेमाल करके Google के ज़रिए ऐसी ही और भी चीज़ें देखें</translation> @@ -730,6 +743,7 @@ <translation id="6782111308708962316">तृतीय पक्ष वेबसाइट को कुकी डेटा सहेजने और पढ़ने से रोकें</translation> <translation id="6790428901817661496">चलाएं</translation> <translation id="679325081238418596">अपने बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग अपने सभी डिवाइस पर प्राप्त करें</translation> +<translation id="6818926723028410516">आइटम चुनें</translation> <translation id="6820607729870073286">आपके पास कोई सहेजी गई वेबसाइट सेटिंग नहीं है.</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6831043979455480757">अनुवाद करें</translation> @@ -792,7 +806,6 @@ <translation id="723171743924126238">फ़ोटो चुनें</translation> <translation id="7243308994586599757">विकल्प स्क्रीन के नीचे उपलब्ध हैं</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> चुने गए</translation> -<translation id="7251326866581677552">कुछ साइटों से ब्लॉक है</translation> <translation id="7253272406652746122">अपने डिवाइस के सेटिंग ऐप्लिकेशन में खाते पेज से कोई Google खाता जोड़ें.</translation> <translation id="7274013316676448362">अवरोधित साइट</translation> <translation id="729975465115245577">आपके डिवाइस में पासवर्ड फ़ाइल को संग्रहित करने वाला कोई ऐप्लिकेशन नहीं है.</translation> @@ -906,6 +919,7 @@ <translation id="8084114998886531721">सहेजा गया पासवर्ड</translation> <translation id="8087000398470557479">यह सामग्री <ph name="DOMAIN_NAME" /> की है जिसे Google के द्वारा वितरित किया गया है.</translation> <translation id="8103578431304235997">गुप्त टैब</translation> +<translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8105951947646329362">मिलते-जुलते पेज सुझाएं</translation> <translation id="8109613176066109935">अपने सभी डिवाइस पर अपने बुकमार्क पाने के लिए, 'सिंक करें' को चालू करें</translation> <translation id="8116925261070264013">आवाज़ बंद की गई</translation> @@ -932,6 +946,7 @@ <translation id="8349013245300336738">इस्तेमाल किए गए डेटा की मात्रा के हिसाब से क्रम में लगाएं</translation> <translation id="8372893542064058268">किसी विशिष्ट साइट के लिए पृष्ठभूमि समन्वयन की अनुमति दें.</translation> <translation id="8374821112118309944">आपको TalkBack को अधिक नए वर्शन से अपडेट करना होगा.</translation> +<translation id="8380167699614421159">इस साइट में तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं</translation> <translation id="8393700583063109961">संदेश भेजें</translation> <translation id="8413126021676339697">संपूर्ण इतिहास दिखाएं</translation> <translation id="8428213095426709021">सेटिंग</translation> @@ -940,6 +955,7 @@ <translation id="8445448999790540984">पासवर्ड निर्यात नहीं कर सकते</translation> <translation id="8447861592752582886">डिवाइस अनुमति निरस्त करें</translation> <translation id="8477071352266846533"><ph name="SYNC_ACCOUNT_USER_NAME" /> के लिए सिंक करना बंद करें</translation> +<translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">ऑफ़लाइन उपलब्ध है</translation> <translation id="8489271220582375723">इतिहास पेज खोलें</translation> <translation id="8493948351860045254">स्थान खाली करें</translation> @@ -954,6 +970,7 @@ <translation id="851751545965956758">साइटों को डिवाइसों से कनेक्ट करने से ब्लॉक करें</translation> <translation id="8523928698583292556">संग्रहित पासवर्ड हटाएं</translation> <translation id="854522910157234410">यह पेज खोलें</translation> +<translation id="8555322348396635979">ओह! कोई गड़बड़ी हुई. कृपया अपना कनेक्शन देखें.</translation> <translation id="8558485628462305855">'बढ़ी हुई वास्तविकता' की सामग्री देखने के लिए, ARCore अपडेट करें</translation> <translation id="8559990750235505898">अन्य भाषाओं में पेज का अनुवाद करना ऑफ़र करें</translation> <translation id="8562452229998620586">सहेजे गए पासवर्ड यहां दिखाई देंगे.</translation> @@ -993,6 +1010,7 @@ <translation id="8853345339104747198"><ph name="TAB_TITLE" />, टैब</translation> <translation id="885701979325669005">मेमोरी</translation> <translation id="8901170036886848654">कोई बुकमार्क नहीं मिला</translation> +<translation id="8905378131945614900">वीआर मॉड्यूल इंस्टॉल नहीं किया जा सका</translation> <translation id="8909135823018751308">शेयर करें…</translation> <translation id="8912362522468806198">Google खाता</translation> <translation id="8920114477895755567">अभिभावकों के विवरण की प्रतीक्षा कर रहे हैं.</translation> @@ -1001,6 +1019,7 @@ <translation id="8942627711005830162">अन्य विंडो में खोलें</translation> <translation id="8951232171465285730">Chrome ने आपके <ph name="MEGABYTES" /> एमबी की बचत की</translation> <translation id="8959122750345127698">मार्गदर्शक तक नहीं पहुंचा जा सकता: <ph name="URL" /></translation> +<translation id="8965591936373831584">डाउनलोड बाकी है</translation> <translation id="8972098258593396643">डिफ़ॉल्ट फ़ोल्डर में डाउनलोड करें?</translation> <translation id="8979405271719829084">बाद में देखने के लिए वीडियो डाउनलोड करें</translation> <translation id="8981454092730389528">Google गतिविधि नियंत्रण</translation> @@ -1027,6 +1046,7 @@ <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> <translation id="9137013805542155359">मूल दिखाएं</translation> <translation id="9139068048179869749">साइट को नोटिफ़िकेशन भेजने देने से पहले अनुमति लेना आवश्यक बनाएं (अनुशंसित)</translation> +<translation id="9139318394846604261">शॉपिंग</translation> <translation id="9155898266292537608">आप किसी शब्द पर बस एक टैप करके भी खोज सकते हैं</translation> <translation id="9188680907066685419">प्रबंधित खाते से प्रस्थान करें</translation> <translation id="9204836675896933765">1 फ़ाइल बची है</translation> @@ -1040,6 +1060,7 @@ <translation id="945632385593298557">अपना माइक्रोफ़ोन एक्सेस करें</translation> <translation id="951339005376969845">मौजूदा डेटा हटाएं. आप <ph name="FROM_ACCOUNT" /> पर वापस जाकर उसे पुनर्प्राप्त कर सकते हैं.</translation> <translation id="95817756606698420">चीन में खोज करने के लिए Chrome, <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> का उपयोग कर सकता है. आप इसे <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में बदल सकते हैं.</translation> +<translation id="965817943346481315">अगर साइट तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं, तो उन्हें ब्लॉक करें (सुझाव)</translation> <translation id="970715775301869095"><ph name="MINUTES" /> मिनट शेष</translation> <translation id="974555521953189084">समन्वयन शुरू करने के लिए अपना पासफ़्रेज़ डालें</translation> <translation id="981121421437150478">ऑफ़लाइन</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 114eabdf..c5806a3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Ovdje nema sadržaja</translation> <translation id="2414886740292270097">Tamno</translation> <translation id="2416359993254398973">Chrome treba dopuštenje za pristup fotoaparatu za ovu web-lokaciju.</translation> -<translation id="24241740415720680">Jednostavnu stranicu pruža Google</translation> <translation id="2426805022920575512">Odaberi drugi račun</translation> <translation id="2433507940547922241">Prikaz</translation> <translation id="2434158240863470628">Preuzimanje je dovršeno: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Izbrisati pohranu?</translation> <translation id="385051799172605136">Natrag</translation> <translation id="3859306556332390985">Traži unaprijed</translation> -<translation id="3860879523841717702">Jednostavnu stranicu pruža Google. Dodirnite da biste učitali izvornu stranicu.</translation> <translation id="3868004864571585162">Kolačići, medijske licence i podaci web-lokacija</translation> <translation id="3894427358181296146">Dodavanje mape</translation> <translation id="3895926599014793903">Prisilno omogućavanje zumiranja</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Zaustavi osvježavanje</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Potražite pomoć<ph name="END_LINK" /> tijekom traženja uređaja…</translation> <translation id="4943872375798546930">Nema rezultata</translation> -<translation id="4956867391417827202">Blokiraj oglase s web-lokacija koje prikazuju ometajuće ili obmanjujuće oglase</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> dijeli vaš zaslon</translation> <translation id="4961334780091921942">Vaše zaporke, povijest i drugo na svim uređajima</translation> <translation id="4961700429721424617">Odjavljujete se s računa kojim upravlja <ph name="MANAGED_DOMAIN" />. Vaši podaci u Chromeu izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Odaberite slike</translation> <translation id="7243308994586599757">Opcije dostupne pri dnu zaslona</translation> <translation id="7250468141469952378">Odabrano: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Blokirano na nekim web-lokacijama</translation> <translation id="7253272406652746122">Dodajte Google račun putem stranice Računi u aplikaciji Postavke na uređaju.</translation> <translation id="7274013316676448362">Blokirana web-lokacija</translation> <translation id="729975465115245577">Vaš uređaj nema aplikaciju za spremanje datoteke zaporki.</translation> <translation id="7302081693174882195">Pojedinosti: poredano prema količini ušteđenih podataka</translation> <translation id="7333031090786104871">I dalje se dodaje prethodna web-lokacija</translation> -<translation id="7335671571918306053">Jednostavnu stranicu pruža Google. Dodirnite gumb Učitaj izvornu stranicu da biste učitali izvornu stranicu.</translation> <translation id="7352939065658542140">VIDEOZAPIS</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Dijeljenje 1 odabrane stavke}one{Dijeljenje # odabrane stavke}few{Dijeljenje # odabrane stavke}other{Dijeljenje # odabranih stavki}}</translation> <translation id="7359002509206457351">Pristup načinima plaćanja</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 2d1645a9..d89161a6 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Itt nincs semmi</translation> <translation id="2414886740292270097">Sötét</translation> <translation id="2416359993254398973">A Chrome számára engedély szükséges, hogy hozzáférjen a kamerához ennél a webhelynél.</translation> -<translation id="24241740415720680">Egyszerű oldal a Google-tól</translation> <translation id="2426805022920575512">Másik fiók választása</translation> <translation id="2433507940547922241">Megjelenés</translation> <translation id="2434158240863470628">Letöltés befejezve <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Törli a webhely tárhelyét?</translation> <translation id="385051799172605136">Vissza</translation> <translation id="3859306556332390985">Ugrás előre</translation> -<translation id="3860879523841717702">Egyszerű oldal a Google-tól. Koppintással betöltheti az eredetit.</translation> <translation id="3868004864571585162">Cookie-k, médialicencek és webhelyadatok</translation> <translation id="3894427358181296146">Mappa hozzáadása</translation> <translation id="3895926599014793903">Nagyítás/kicsinyítés kényszerített engedélyezése</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Frissítés leállítása</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Kérjen segítséget<ph name="END_LINK" />, miközben eszközöket keresünk…</translation> <translation id="4943872375798546930">Nincs találat</translation> -<translation id="4956867391417827202">Hirdetések letiltása a tolakodó és félrevezető hirdetéseket megjelenítő webhelyeken</translation> <translation id="4958708863221495346">A(z) <ph name="URL_OF_THE_CURRENT_TAB" /> webhely megosztja az Ön képernyőjét</translation> <translation id="4961334780091921942">Jelszavai, előzményei (és még sok más) valamennyi eszközén</translation> <translation id="4961700429721424617">Kijelentkezik egy <ph name="MANAGED_DOMAIN" /> által felügyelt fiókból. Ezzel törli az eszközön található Chrome-adatokat, amelyek azonban Google-fiókjában megmaradnak.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Képek kiválasztása</translation> <translation id="7243308994586599757">A beállítások a képernyő alsó részén találhatók</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> elem kiválasztva</translation> -<translation id="7251326866581677552">Letiltva egyes webhelyeknél</translation> <translation id="7253272406652746122">Adjon hozzá Google-fiókot az eszköz Beállítások alkalmazásának Fiókok oldalán.</translation> <translation id="7274013316676448362">Letiltott oldal</translation> <translation id="729975465115245577">Az eszközön nincs olyan alkalmazás, amely tárolni tudja a jelszavakat tartalmazó fájlt.</translation> <translation id="7302081693174882195">Részletek: Megtakarított adatmennyiség szerinti rendezés</translation> <translation id="7333031090786104871">Az előző webhely hozzáadása még folyamatban van</translation> -<translation id="7335671571918306053">Egyszerű oldal a Google-tól. Az Eredeti betöltése gombra koppintva betöltheti az eredeti oldalt.</translation> <translation id="7352939065658542140">VIDEÓ</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{1 kijelölt elem megosztása}other{# kijelölt elem megosztása}}</translation> <translation id="7359002509206457351">Hozzáférés a fizetési módokhoz</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 f25d773..3e4b8fa 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Tidak ada konten di sini</translation> <translation id="2414886740292270097">Gelap</translation> <translation id="2416359993254398973">Chrome memerlukan izin akses ke kamera untuk situs ini.</translation> -<translation id="24241740415720680">Halaman ringan yang ditampilkan oleh Google</translation> <translation id="2426805022920575512">Pilih akun lain</translation> <translation id="2433507940547922241">Tampilan</translation> <translation id="2434158240863470628">Download selesai <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Kosongkan penyimpanan situs?</translation> <translation id="385051799172605136">Mundur</translation> <translation id="3859306556332390985">Cari maju</translation> -<translation id="3860879523841717702">Halaman ringan yang ditampilkan oleh Google. Tap untuk memuat versi asli.</translation> <translation id="3868004864571585162">Cookie, lisensi media, dan data situs</translation> <translation id="3894427358181296146">Tambah folder</translation> <translation id="3895926599014793903">Memaksa pengaktifan zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Hentikan refresh</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Dapatkan bantuan<ph name="END_LINK" /> saat memindai perangkat…</translation> <translation id="4943872375798546930">Tidak ada hasil</translation> -<translation id="4956867391417827202">Blokir iklan dari situs yang menampilkan iklan yang mengganggu atau menyesatkan</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> berbagi layar Anda</translation> <translation id="4961334780091921942">Sandi, histori dan lainnya di semua perangkat</translation> <translation id="4961700429721424617">Anda akan keluar dari akun yang dikelola oleh <ph name="MANAGED_DOMAIN" />. Tindakan ini akan menghapus data Chrome dari perangkat ini, namun data tetap tersedia di Akun Google Anda.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Pilih gambar</translation> <translation id="7243308994586599757">Opsi terdapat di dekat bagian bawah layar</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> dipilih</translation> -<translation id="7251326866581677552">Diblokir dari beberapa situs</translation> <translation id="7253272406652746122">Tambahkan Akun Google dari halaman Akun di aplikasi Setelan pada perangkat.</translation> <translation id="7274013316676448362">Situs yang diblokir</translation> <translation id="729975465115245577">Perangkat Anda tidak memiliki aplikasi untuk menyimpan file sandi.</translation> <translation id="7302081693174882195">Detail: Diurutkan menurut jumlah kuota yang dihemat</translation> <translation id="7333031090786104871">Masih menambahkan situs sebelumnya</translation> -<translation id="7335671571918306053">Halaman ringan yang ditampilkan oleh Google. Tap tombol muat versi asli untuk memuat halaman asli.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Bagikan 1 item yang dipilih}other{Bagikan # item yang dipilih}}</translation> <translation id="7359002509206457351">Akses metode pembayaran</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 8adac73b..b588014 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Nessun contenuto presente</translation> <translation id="2414886740292270097">Scuro</translation> <translation id="2416359993254398973">Per questo sito Chrome ha bisogno dell'autorizzazione ad accedere alla fotocamera.</translation> -<translation id="24241740415720680">Pagina Lite offerta da Google</translation> <translation id="2426805022920575512">Scegli un altro account</translation> <translation id="2433507940547922241">Aspetto</translation> <translation id="2434158240863470628">Download completato: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Cancellare memoria usata da siti?</translation> <translation id="385051799172605136">Indietro</translation> <translation id="3859306556332390985">Posiziona avanti</translation> -<translation id="3860879523841717702">Pagina Lite offerta da Google. Tocca per caricare l'originale.</translation> <translation id="3868004864571585162">Cookie, licenze multimediali e dati dei siti</translation> <translation id="3894427358181296146">Aggiungi cartella</translation> <translation id="3895926599014793903">Attivazione forzata dello zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Interrompi aggiornamento</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Richiedi assistenza<ph name="END_LINK" /> durante la ricerca di dispositivi…</translation> <translation id="4943872375798546930">Nessun risultato</translation> -<translation id="4956867391417827202">Blocca annunci da siti che mostrano annunci invasivi o fuorvianti</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> sta condividendo il tuo schermo</translation> <translation id="4961334780091921942">Le tue password, la tua cronologia e altro su tutti i tuoi dispositivi</translation> <translation id="4961700429721424617">Stai per uscire da un account gestito da <ph name="MANAGED_DOMAIN" />. I dati di Chrome verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo account Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Seleziona immagini</translation> <translation id="7243308994586599757">Opzioni disponibili nella parte inferiore dello schermo</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> elementi selezionati</translation> -<translation id="7251326866581677552">Bloccati su alcuni siti</translation> <translation id="7253272406652746122">Aggiungi un account Google dalla pagina Account nell'app Impostazioni del dispositivo.</translation> <translation id="7274013316676448362">Sito bloccato</translation> <translation id="729975465115245577">Il tuo dispositivo non ha un'app per archiviare il file di password.</translation> <translation id="7302081693174882195">Dettagli: ordinati per quantità di dati salvati</translation> <translation id="7333031090786104871">Aggiunta del sito precedente ancora in corso</translation> -<translation id="7335671571918306053">Pagina Lite offerta da Google. Tocca il pulsante Carica originale per caricare la pagina originale.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Condividi 1 elemento selezionato}other{Condividi # elementi selezionati}}</translation> <translation id="7359002509206457351">Accedi ai metodi di pagamento</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 23b200e..3b194366 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">אין כאן תוכן</translation> <translation id="2414886740292270097">כהה</translation> <translation id="2416359993254398973">Chrome זקוק להרשאה גישה אל המצלמה בשביל האתר הזה.</translation> -<translation id="24241740415720680">גרסת Lite של הדף נוצרה על ידי Google</translation> <translation id="2426805022920575512">בחירת חשבון אחר</translation> <translation id="2433507940547922241">מראה</translation> <translation id="2434158240863470628">ההורדה הושלמה <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">למחוק נתוני אתר מהאחסון?</translation> <translation id="385051799172605136">חזור</translation> <translation id="3859306556332390985">הרץ קדימה</translation> -<translation id="3860879523841717702">גרסת Lite של הדף נוצרה על ידי Google. אפשר להקיש כדי לטעון את הגרסה המקורית.</translation> <translation id="3868004864571585162">קובצי Cookie, רישיונות מדיה ונתוני אתרים</translation> <translation id="3894427358181296146">הוספת תיקייה</translation> <translation id="3895926599014793903">אלץ הפעלת שינוי מרחק מתצוגה</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">הפסק לרענן</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />קבל עזרה<ph name="END_LINK" /> בזמן חיפוש התקנים…</translation> <translation id="4943872375798546930">אין תוצאות</translation> -<translation id="4956867391417827202">חסימת מודעות מאתרים שמוצגות בהם מודעות מפריעות או מטעות</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> משתף את המסך שלך</translation> <translation id="4961334780091921942">גישה אל הסיסמאות, ההיסטוריה ונתונים נוספים בכל המכשירים</translation> <translation id="4961700429721424617">אתה יוצא מחשבון המנוהל על-ידי <ph name="MANAGED_DOMAIN" />. פעולה זו תמחק את הנתונים שלך ב-Chrome מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">בחר תמונות</translation> <translation id="7243308994586599757">אפשרויות הזמינות באזור החלק התחתון של המסך</translation> <translation id="7250468141469952378">נבחרו <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">חסומות באתרים מסוימים</translation> <translation id="7253272406652746122">הוסף חשבון Google מהדף 'חשבונות' שבאפליקציית ההגדרות של המכשיר.</translation> <translation id="7274013316676448362">אתר חסום</translation> <translation id="729975465115245577">אין במכשיר אפליקציה לאחסון קובץ הסיסמאות.</translation> <translation id="7302081693174882195">פרטים: מיון לפי נפח הנתונים שנחסכו</translation> <translation id="7333031090786104871">עדיין מוסיף את האתר הקודם</translation> -<translation id="7335671571918306053">גרסת Lite של הדף נוצרה על ידי Google. אפשר להקיש על לחצן טעינת המקור כדי לטעון את הדף המקורי.</translation> <translation id="7352939065658542140">סרטון</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{שתף פריט אחד שנבחר}two{שתף # פריטים שנבחרו}many{שתף # פריטים שנבחרו}other{שתף # פריטים שנבחרו}}</translation> <translation id="7359002509206457351">גישה לאמצעי תשלום</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 ecc34f04..0bf1657 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -792,7 +792,6 @@ <translation id="723171743924126238">画像を選択</translation> <translation id="7243308994586599757">画面の下の方にオプションがあります</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> 件選択されています</translation> -<translation id="7251326866581677552">一部のサイトでブロックされています</translation> <translation id="7253272406652746122">端末の設定アプリのアカウント ページで Google アカウントを追加してください。</translation> <translation id="7274013316676448362">ブロック中のサイト</translation> <translation id="729975465115245577">お使いの端末にはパスワード ファイルを保存するためのアプリがインストールされていません。</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 9312975..4bfb6d45 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">콘텐츠 없음</translation> <translation id="2414886740292270097">어두운</translation> <translation id="2416359993254398973">Chrome이 이 사이트에서 카메라에 액세스하려면 권한이 필요합니다.</translation> -<translation id="24241740415720680">Google에서 제공하는 라이트 페이지입니다.</translation> <translation id="2426805022920575512">다른 계정 선택</translation> <translation id="2433507940547922241">모양</translation> <translation id="2434158240863470628">다운로드 완료: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">사이트 저장공간을 삭제하시겠습니까?</translation> <translation id="385051799172605136">뒤로</translation> <translation id="3859306556332390985">앞으로 탐색</translation> -<translation id="3860879523841717702">Google에서 제공하는 라이트 페이지입니다. 원본 페이지를 로드하려면 탭하세요.</translation> <translation id="3868004864571585162">쿠키, 미디어 라이선스, 사이트 데이터</translation> <translation id="3894427358181296146">폴더 추가</translation> <translation id="3895926599014793903">확대/축소 강제 사용</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">새로고침 중지</translation> <translation id="4915549754973153784">기기를 검색할 때 <ph name="BEGIN_LINK" />도움말 보기<ph name="END_LINK" />...</translation> <translation id="4943872375798546930">검색결과가 없습니다.</translation> -<translation id="4956867391417827202">방해가 되거나 사용자를 현혹하는 광고를 표시하는 사이트에서 광고가 차단됨</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" />에서 내 화면을 공유하는 중입니다.</translation> <translation id="4961334780091921942">모든 기기의 비밀번호, 방문 기록 등</translation> <translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃합니다. 이렇게 하면 내 Chrome 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">이미지 선택</translation> <translation id="7243308994586599757">화면 하단에서 옵션 선택 가능</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" />개 선택됨</translation> -<translation id="7251326866581677552">일부 사이트에서 차단됨</translation> <translation id="7253272406652746122">기기 설정 앱의 계정 페이지에서 Google 계정을 추가하세요.</translation> <translation id="7274013316676448362">차단된 사이트</translation> <translation id="729975465115245577">기기에 비밀번호 파일을 저장할 수 있는 앱이 없습니다.</translation> <translation id="7302081693174882195">세부정보: 저장된 데이터 양에 따라 정렬</translation> <translation id="7333031090786104871">아직 이전 사이트 추가 중</translation> -<translation id="7335671571918306053">Google에서 제공하는 라이트 페이지입니다. 원본 페이지를 로드하려면 원본 로드 버튼을 탭하세요.</translation> <translation id="7352939065658542140">동영상</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{선택한 1개 항목 공유}other{선택한 #개 항목 공유}}</translation> <translation id="7359002509206457351">결제 수단 액세스</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 a9fbb6ca..f846db78 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Čia nėra jokio turinio</translation> <translation id="2414886740292270097">Tamsi</translation> <translation id="2416359993254398973">„Chrome“ reikia leidimo, kad galėtų naudoti jūsų fotoaparatą šioje svetainėje.</translation> -<translation id="24241740415720680">Supaprastintasis puslapis, kurį teikia „Google“</translation> <translation id="2426805022920575512">Pasirinkti kitą paskyrą</translation> <translation id="2433507940547922241">Išvaizda</translation> <translation id="2434158240863470628">Atsisiųsta: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Išvalyti svet. saugyklą?</translation> <translation id="385051799172605136">Grįžti</translation> <translation id="3859306556332390985">Eiti pirmyn</translation> -<translation id="3860879523841717702">Supaprastintasis puslapis, kurį teikia „Google“. Palieskite, kad būtų įkeltas pradinis puslapis.</translation> <translation id="3868004864571585162">Slapukai, medijos licencijos ir svetainių duomenys</translation> <translation id="3894427358181296146">Aplanko pridėjimas</translation> <translation id="3895926599014793903">Priverstinai įgalinti mastelio keitimą</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Sustabdyti atnaujinimą</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Gaukite pagalbos<ph name="END_LINK" />, kol ieškoma įrenginių…</translation> <translation id="4943872375798546930">Rezultatų nėra</translation> -<translation id="4956867391417827202">Blokuojami skelbimai iš svetainių, kuriose rodomi nepageidaujami arba klaidinantys skelbimai</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> bendrina jūsų ekrano vaizdą</translation> <translation id="4961334780091921942">Slaptažodžiai, istorija ir daugiau visuose jūsų įrenginiuose</translation> <translation id="4961700429721424617">Atsijungiate nuo paskyros, kurią tvarko „<ph name="MANAGED_DOMAIN" />“. „Chrome“ duomenys bus ištrinti iš šio įrenginio, bet liks „Google“ paskyroje.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Pasirinkti vaizdus</translation> <translation id="7243308994586599757">Parinktys pasiekiamos netoli ekrano apačios</translation> <translation id="7250468141469952378">Pasirinkta: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Užblokuota iš kelių svetainių</translation> <translation id="7253272406652746122">Pridėkite „Google“ paskyrą iš įrenginio Nustatymų programos puslapio „Paskyros“.</translation> <translation id="7274013316676448362">Užblokuota svetainė</translation> <translation id="729975465115245577">Įrenginyje nėra slaptažodžių failo saugojimo programos.</translation> <translation id="7302081693174882195">Išsami informacija: surūšiuota pagal išsaugotų duomenų kiekį</translation> <translation id="7333031090786104871">Vis dar pridedama ankstesnė svetainė</translation> -<translation id="7335671571918306053">Supaprastintasis puslapis, kurį teikia „Google“. Palieskite mygtuką „Įkelti pradinį“, kad būtų įkeltas pradinis puslapis.</translation> <translation id="7352939065658542140">VAIZDO ĮRAŠAS</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Bendrinti 1 pasirinktą elementą}one{Bendrinti # pasirinktą elementą}few{Bendrinti # pasirinktus elementus}many{Bendrinti # pasirinkto elemento}other{Bendrinti # pasirinktų elementų}}</translation> <translation id="7359002509206457351">Prieiga prie mokėjimo metodų</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 770f8faa..c6bb21d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Nav satura</translation> <translation id="2414886740292270097">Tumšs</translation> <translation id="2416359993254398973">Pārlūkam Chrome ir nepieciešama atļauja piekļūt jūsu kamerai šajā vietnē.</translation> -<translation id="24241740415720680">Vienkāršota lapa, ko nodrošina Google</translation> <translation id="2426805022920575512">Izvēlēties citu kontu</translation> <translation id="2433507940547922241">Izskats</translation> <translation id="2434158240863470628">Lejupielāde pabeigta: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Vai notīrīt vietnes krātuvi?</translation> <translation id="385051799172605136">Atpakaļ</translation> <translation id="3859306556332390985">Pārtīt uz priekšu</translation> -<translation id="3860879523841717702">Vienkāršota lapa, ko nodrošina Google. Pieskarieties, lai ielādētu sākotnējo lapu.</translation> <translation id="3868004864571585162">Sīkfaili, multivides licences un vietņu dati</translation> <translation id="3894427358181296146">Mapes pievienošana</translation> <translation id="3895926599014793903">Tālummaiņas piespiedu iespējošana</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Pārtraukt atsvaidzināšanu</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Saņemiet palīdzību<ph name="END_LINK" />, meklējot ierīces…</translation> <translation id="4943872375798546930">Nav rezultātu</translation> -<translation id="4956867391417827202">Bloķēt reklāmas no vietnēm, kurās tiek rādītas traucējošas vai maldinošas reklāmas</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> kopīgo jūsu ekrānu</translation> <translation id="4961334780091921942">Jūsu paroles, vēstures un cita informācijas sinhronizēšana visās jūsu ierīcēs</translation> <translation id="4961700429721424617">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="MANAGED_DOMAIN" />. Izrakstoties jūsu Chrome dati tiks dzēsti no šīs ierīces, taču tie paliks jūsu Google kontā.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Atlasīt attēlus</translation> <translation id="7243308994586599757">Opcijas, kas pieejamas ekrāna apakšējā daļā</translation> <translation id="7250468141469952378">Atlasīti vienumi: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Bloķētas dažās vietnēs.</translation> <translation id="7253272406652746122">Pievienojiet Google kontu no lapas Konti savas ierīces lietotnē Iestatījumi.</translation> <translation id="7274013316676448362">Bloķēta vietne</translation> <translation id="729975465115245577">Ierīcē nav lietotnes, kurā uzglabāt paroļu failu.</translation> <translation id="7302081693174882195">Detalizēta informācija: kārtota pēc ietaupīto datu apjoma</translation> <translation id="7333031090786104871">Joprojām notiek iepriekšējās vietnes pievienošana</translation> -<translation id="7335671571918306053">Vienkāršota lapa, ko nodrošina Google. Pieskarieties pogai Ielādēt sākotnējo, lai ielādētu sākotnējo lapu.</translation> <translation id="7352939065658542140">VIDEOKLIPS</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Kopīgot 1 atlasīto vienumu}zero{Kopīgot # atlasītos vienumus}one{Kopīgot # atlasīto vienumu}other{Kopīgot # atlasītos vienumus}}</translation> <translation id="7359002509206457351">Piekļuve maksājumu veidiem</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 0323f2c..424f9b2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Geen content hier</translation> <translation id="2414886740292270097">Donker</translation> <translation id="2416359993254398973">Chrome heeft toegangsrechten voor je camera nodig voor deze site.</translation> -<translation id="24241740415720680">Lite-pagina geleverd door Google</translation> <translation id="2426805022920575512">Een ander account kiezen</translation> <translation id="2433507940547922241">Vormgeving</translation> <translation id="2434158240863470628">Download voltooid <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Site-opslag wissen?</translation> <translation id="385051799172605136">Vorige</translation> <translation id="3859306556332390985">Vooruit zoeken</translation> -<translation id="3860879523841717702">Lite-pagina geleverd door Google. Tik om de originele pagina te laden.</translation> <translation id="3868004864571585162">Cookies, medialicenties en sitegegevens</translation> <translation id="3894427358181296146">Map toevoegen</translation> <translation id="3895926599014793903">Zoom inschakelen forceren</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Vernieuwen stopzetten</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Hulp<ph name="END_LINK" /> bij het zoeken naar apparaten…</translation> <translation id="4943872375798546930">Geen resultaten</translation> -<translation id="4956867391417827202">Advertenties blokkeren van sites die opdringerige of misleidende advertenties weergeven</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> heeft toegang tot je scherm</translation> <translation id="4961334780091921942">Je wachtwoorden, geschiedenis en meer op al je apparaten</translation> <translation id="4961700429721424617">Je logt uit van een account dat wordt beheerd door <ph name="MANAGED_DOMAIN" />. Hierdoor worden je Chrome-gegevens verwijderd van dit apparaat. Je gegevens blijven echter opgeslagen in je Google-account.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Afbeeldingen selecteren</translation> <translation id="7243308994586599757">Opties beschikbaar onder aan het scherm</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> geselecteerd</translation> -<translation id="7251326866581677552">Geblokkeerd voor bepaalde sites</translation> <translation id="7253272406652746122">Voeg een Google-account toe via de pagina Accounts in de app Instellingen van je apparaat.</translation> <translation id="7274013316676448362">Geblokkeerde site</translation> <translation id="729975465115245577">Je apparaat bevat geen app om het wachtwoordbestand in op te slaan.</translation> <translation id="7302081693174882195">Details: gesorteerd op de hoeveelheid bespaarde data</translation> <translation id="7333031090786104871">Nog steeds bezig met toevoegen van vorige site</translation> -<translation id="7335671571918306053">Lite-pagina geleverd door Google. Tik om de knop 'Origineel laden' om de originele pagina te laden.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{1 geselecteerd item delen}other{# geselecteerde items delen}}</translation> <translation id="7359002509206457351">Toegang tot betaalmethoden</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 3798353c..90d14ad 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Ikke noe innhold her</translation> <translation id="2414886740292270097">Mørk</translation> <translation id="2416359993254398973">Chrome trenger tilgang til kameraet ditt for dette nettstedet.</translation> -<translation id="24241740415720680">Forenklet versjon av siden levert av Google</translation> <translation id="2426805022920575512">Velg en annen konto</translation> <translation id="2433507940547922241">Utseende</translation> <translation id="2434158240863470628">Nedlasting fullført <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Slette nettstedslagring?</translation> <translation id="385051799172605136">Tilbake</translation> <translation id="3859306556332390985">Spol fremover</translation> -<translation id="3860879523841717702">Forenklet versjon av siden levert av Google. Trykk for å laste inn den opprinnelige siden.</translation> <translation id="3868004864571585162">Informasjonskapsler, medielisenser og nettstedsdata</translation> <translation id="3894427358181296146">Legg til en mappe</translation> <translation id="3895926599014793903">Tving zoom på</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Slutt å laste inn på nytt</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Få hjelp<ph name="END_LINK" /> mens du skanner etter enheter …</translation> <translation id="4943872375798546930">Ingen resultater</translation> -<translation id="4956867391417827202">Blokkér annonser fra nettsteder som ofte viser forstyrrende eller villedende annonser</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> deler skjermen din</translation> <translation id="4961334780091921942">Passordene dine, loggen din med mer på alle enheter</translation> <translation id="4961700429721424617">Du logger av en konto som administreres av <ph name="MANAGED_DOMAIN" />. Dette fører til at Chrome-dataene dine slettes fra denne enheten. De fortsetter imidlertid å være lagret i Google-kontoen din.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Velg bilder</translation> <translation id="7243308994586599757">Du finner alternativer ved bunnen av skjermen</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> er valgt</translation> -<translation id="7251326866581677552">Blokkert på noen nettsteder</translation> <translation id="7253272406652746122">Legg til en Google-konto på Kontoer-siden i Innstillinger-appen på enheten din.</translation> <translation id="7274013316676448362">Blokkert nettsted</translation> <translation id="729975465115245577">Enheten din har ingen app som kan lagre passordfilen.</translation> <translation id="7302081693174882195">Informasjon: Sortert etter mengden data som er lagret</translation> <translation id="7333031090786104871">Holder fortsatt på å legge til det forrige nettstedet</translation> -<translation id="7335671571918306053">Forenklet versjon av siden levert av Google. Trykk på last inn original-knappen for å laste inn den opprinnelige siden.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Del 1 valgt element}other{Del # valgte elementer}}</translation> <translation id="7359002509206457351">Gå til betalingsmåter</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 508a4ff..e1c2e30 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Nic tu nie ma</translation> <translation id="2414886740292270097">Ciemny</translation> <translation id="2416359993254398973">Chrome potrzebuje uprawnień dostępu do aparatu na tej stronie.</translation> -<translation id="24241740415720680">Lżejsza wersja strony dostarczona przez Google</translation> <translation id="2426805022920575512">Wybierz inne konto</translation> <translation id="2433507940547922241">Wygląd</translation> <translation id="2434158240863470628">Ukończono pobieranie <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Wyczyścić dane witryn?</translation> <translation id="385051799172605136">Wstecz</translation> <translation id="3859306556332390985">Przewiń do przodu</translation> -<translation id="3860879523841717702">Lżejsza wersja strony dostarczona przez Google. Kliknij, by załadować oryginał.</translation> <translation id="3868004864571585162">Pliki cookie, licencje multimediów i dane witryn</translation> <translation id="3894427358181296146">Dodaj folder</translation> <translation id="3895926599014793903">Wymuś powiększenie</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Zatrzymaj odświeżanie</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Pomoc<ph name="END_LINK" /> w trakcie wyszukiwania urządzeń…</translation> <translation id="4943872375798546930">Brak wyników</translation> -<translation id="4956867391417827202">Blokowanie reklam na stronach, które wyświetlają reklamy uciążliwe lub wprowadzające w błąd</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> udostępnia Twój ekran</translation> <translation id="4961334780091921942">Twoje hasła, historia i inne dane na wszystkich Twoich urządzeniach</translation> <translation id="4961700429721424617">Wylogowujesz się z konta, którym zarządza <ph name="MANAGED_DOMAIN" />. Spowoduje to usunięcie danych Chrome z tego urządzenia, ale pozostaną one na Twoim koncie Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Wybierz zdjęcia</translation> <translation id="7243308994586599757">Opcje dostępne u dołu ekranu</translation> <translation id="7250468141469952378">Wybrano <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Blokowane na niektórych stronach</translation> <translation id="7253272406652746122">Otwórz aplikację Ustawienia na urządzeniu, przejdź na stronę Konta i dodaj konto Google.</translation> <translation id="7274013316676448362">Zablokowana witryna</translation> <translation id="729975465115245577">Na urządzeniu nie ma aplikacji umożliwiającej zapisanie pliku z hasłami.</translation> <translation id="7302081693174882195">Szczegóły: posortowane według zaoszczędzonych danych</translation> <translation id="7333031090786104871">Nadal dodaję poprzednią stronę</translation> -<translation id="7335671571918306053">Lżejsza wersja strony dostarczona przez Google. Kliknij przycisk Załaduj oryginał, by załadować oryginalną stronę.</translation> <translation id="7352939065658542140">FILM</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Udostępnij 1 wybrany element}few{Udostępnij # wybrane elementy}many{Udostępnij # wybranych elementów}other{Udostępnij # wybranego elementu}}</translation> <translation id="7359002509206457351">Dostęp do form płatności</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 4334665a..7103285 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
@@ -10,7 +10,7 @@ <translation id="1067922213147265141">Outros serviços do Google</translation> <translation id="1068672505746868501">Nunca traduzir páginas em <ph name="SOURCE_LANGUAGE" /></translation> <translation id="1080790410959514870">Você está se desconectando de uma conta gerenciada por <ph name="DOMAIN_NAME" />. Essa ação excluirá os dados do Google Chrome armazenados neste dispositivo, mas os dados permanecerão na sua Conta do Google.</translation> -<translation id="1099080783256647258">Quando a Economia de dados está ativada, o Chrome usa os servidores do Google para acelerar e compactar os carregamentos de páginas. Em páginas especialmente lentas, a Economia de dados reescreve a página para carregar apenas o conteúdo essencial. Essa extensão não otimiza as páginas carregadas no modo de navegação anônima.</translation> +<translation id="1099080783256647258">Quando a Economia de dados está ativada, o Chrome usa os servidores do Google para acelerar e compactar os carregamentos de páginas. Em páginas especialmente lentas, a Economia de dados reescreve a página para carregar apenas o conteúdo essencial. Esse recurso não otimiza as páginas carregadas no modo de navegação anônima.</translation> <translation id="1105960400813249514">Captura de tela</translation> <translation id="1111673857033749125">Favoritos salvos nos seus outros dispositivos serão exibidos aqui.</translation> <translation id="1113597929977215864">Mostrar visualização simplificada</translation> @@ -195,7 +195,6 @@ <translation id="2414672073755873541">Não há conteúdo aqui</translation> <translation id="2414886740292270097">Escuro</translation> <translation id="2416359993254398973">O Chrome precisa de permissão para este site acessar sua câmera.</translation> -<translation id="24241740415720680">Página Lite exibida pelo Google</translation> <translation id="2426805022920575512">Escolher outra conta</translation> <translation id="2433507940547922241">Aparência</translation> <translation id="2434158240863470628">Download concluído <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Limpar armaz. de sites?</translation> <translation id="385051799172605136">Voltar</translation> <translation id="3859306556332390985">Avançar</translation> -<translation id="3860879523841717702">Página Lite exibida pelo Google. Toque para carregar a original.</translation> <translation id="3868004864571585162">Cookies, licenças de mídia e dados do site</translation> <translation id="3894427358181296146">Adicionar pasta</translation> <translation id="3895926599014793903">Forçar zoom</translation> @@ -411,7 +409,7 @@ <translation id="4269820728363426813">Copiar endereço do link</translation> <translation id="4275663329226226506">Mídia</translation> <translation id="4278390842282768270">Permitido</translation> -<translation id="429312253194641664">Um site está reproduzindo mídia</translation> +<translation id="429312253194641664">Um site está com mídia aberta</translation> <translation id="4307992518367153382">Básicas</translation> <translation id="4351244548802238354">Fechar caixa de diálogo</translation> <translation id="4378154925671717803">Telefone</translation> @@ -493,7 +491,6 @@ <translation id="4913169188695071480">Parar de atualizar</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Receber ajuda<ph name="END_LINK" /> ao procurar dispositivos…</translation> <translation id="4943872375798546930">Nenhum resultado</translation> -<translation id="4956867391417827202">Bloquear anúncios de sites que mostram anúncios invasivos ou enganosos</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está compartilhando sua tela</translation> <translation id="4961334780091921942">Suas senhas, histórico e muito mais em todos os dispositivos</translation> <translation id="4961700429721424617">Você está saindo de uma conta gerenciada por <ph name="MANAGED_DOMAIN" />. Os dados do Chrome serão excluídos desse dispositivo, mas permanecerão na sua Conta do Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Selecionar imagens</translation> <translation id="7243308994586599757">Opções disponíveis perto da parte inferior da tela</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> itens selecionados</translation> -<translation id="7251326866581677552">Bloqueados em alguns sites</translation> <translation id="7253272406652746122">Adicione uma Conta do Google na página de "Contas" do app "Config." do seu dispositivo.</translation> <translation id="7274013316676448362">Site bloqueado</translation> <translation id="729975465115245577">Seu dispositivo não tem um app para armazenar o arquivo de senhas.</translation> <translation id="7302081693174882195">Detalhes: classificados pela quantidade de dados economizados</translation> <translation id="7333031090786104871">Ainda adicionando o site anterior</translation> -<translation id="7335671571918306053">Página Lite exibida pelo Google. Toque no botão "Carregar original" para carregar a página original.</translation> <translation id="7352939065658542140">VÍDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Compartilhar 1 item selecionado}one{Compartilhar # item selecionado}other{Compartilhar # itens selecionados}}</translation> <translation id="7359002509206457351">Acessar formas de pagamento</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 493eed8..9ee5be99 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
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Não existe conteúdo aqui.</translation> <translation id="2414886740292270097">Escuro</translation> <translation id="2416359993254398973">O Chrome necessita de autorização de acesso à câmara para este site.</translation> -<translation id="24241740415720680">Página em modo lite fornecida pela Google</translation> <translation id="2426805022920575512">Selecionar outra conta</translation> <translation id="2433507940547922241">Aspeto</translation> <translation id="2434158240863470628">Transferência concluída: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Limpar armazenamento do site?</translation> <translation id="385051799172605136">Anterior</translation> <translation id="3859306556332390985">Procurar para a frente</translation> -<translation id="3860879523841717702">Página em modo lite fornecida pela Google. Toque para carregar o original.</translation> <translation id="3868004864571585162">Cookies, licenças de multimédia e dados do site</translation> <translation id="3894427358181296146">Adicionar pasta</translation> <translation id="3895926599014793903">Forçar ativação do zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Parar a atualização</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obter ajuda<ph name="END_LINK" /> enquanto procura dispositivos…</translation> <translation id="4943872375798546930">Nenhum resultado</translation> -<translation id="4956867391417827202">Bloquear anúncios de sites que apresentam anúncios intrusivos ou enganadores</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está a partilhar o seu ecrã</translation> <translation id="4961334780091921942">As suas palavras-passe, histórico e muito mais em todos os dispositivos.</translation> <translation id="4961700429721424617">Está a terminar sessão numa conta gerida por <ph name="MANAGED_DOMAIN" />. Esta ação elimina os seus dados do Chrome deste dispositivo, embora permaneçam na Conta Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Selecionar imagens</translation> <translation id="7243308994586599757">Opções disponíveis junto à parte inferior do ecrã</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selecionado(s).</translation> -<translation id="7251326866581677552">Bloqueados em alguns sites</translation> <translation id="7253272406652746122">Adicione uma Conta Google na página Contas na aplicação Definições do dispositivo.</translation> <translation id="7274013316676448362">Site bloqueado</translation> <translation id="729975465115245577">O dispositivo não tem uma aplicação para armazenar o ficheiro de palavras-passe.</translation> <translation id="7302081693174882195">Detalhes: ordenado por quantidade de dados guardados</translation> <translation id="7333031090786104871">Ainda a adicionar o site anterior…</translation> -<translation id="7335671571918306053">Página em modo lite fornecida pela Google. Toque no botão Carregar original para carregar a página original.</translation> <translation id="7352939065658542140">VÍDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Partilhar 1 item selecionado}other{Partilhar # itens selecionados}}</translation> <translation id="7359002509206457351">Aceder aos métodos de pagamento</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 8bf4658b..748c0b3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Nu există conținut aici</translation> <translation id="2414886740292270097">Întunecat</translation> <translation id="2416359993254398973">Chrome are nevoie de permisiune ca să acceseze camera foto pentru acest site.</translation> -<translation id="24241740415720680">Pagină Lite oferită de Google</translation> <translation id="2426805022920575512">Alege alt cont</translation> <translation id="2433507940547922241">Aspect</translation> <translation id="2434158240863470628">Descărcare finalizată <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Ștergi stocarea site-urilor?</translation> <translation id="385051799172605136">Înapoi</translation> <translation id="3859306556332390985">Derulează înainte</translation> -<translation id="3860879523841717702">Pagină Lite oferită de Google. Atinge pentru a încărca versiunea originală.</translation> <translation id="3868004864571585162">Cookie-uri, licențe media și date privind site-urile</translation> <translation id="3894427358181296146">Adaugă un dosar</translation> <translation id="3895926599014793903">Forțează activarea zoomului</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Oprește actualizarea</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obține ajutor<ph name="END_LINK" /> în timp ce se caută dispozitive…</translation> <translation id="4943872375798546930">Nu există rezultate</translation> -<translation id="4956867391417827202">Blochează anunțurile de la site-urile care afișează anunțuri deranjante sau înșelătoare</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> accesează conținutul de pe ecran</translation> <translation id="4961334780091921942">Parolele, istoricul și alte date, pe toate dispozitivele</translation> <translation id="4961700429721424617">Te deconectezi de la un cont gestionat de <ph name="MANAGED_DOMAIN" />. Astfel, se vor șterge datele Chrome de pe acest dispozitiv, dar datele vor rămâne în Contul Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Selectează imagini</translation> <translation id="7243308994586599757">Opțiuni disponibile în partea de jos a ecranului</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selectate</translation> -<translation id="7251326866581677552">Blocate pe anumite site-uri</translation> <translation id="7253272406652746122">Adaugă un Cont Google din pagina Conturi din aplicația Setări a dispozitivului.</translation> <translation id="7274013316676448362">Site blocat</translation> <translation id="729975465115245577">Dispozitivul nu are o aplicație pentru stocarea fișierului parolelor.</translation> <translation id="7302081693174882195">Detalii: sortate după volumul de date salvate</translation> <translation id="7333031090786104871">Încă se adaugă site-ul anterior</translation> -<translation id="7335671571918306053">Pagină Lite oferită de Google. Atinge butonul Încarcă versiunea originală pentru a încărca pagina originală.</translation> <translation id="7352939065658542140">VIDEOCLIP</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Trimite un element selectat}few{Trimite # elemente selectate}other{Trimite # de elemente selectate}}</translation> <translation id="7359002509206457351">Acces la metodele de plată</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 f29684a..72d04e64 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Нет контента</translation> <translation id="2414886740292270097">Темный</translation> <translation id="2416359993254398973">Для этого сайта Chrome запрашивает разрешение на доступ к камере.</translation> -<translation id="24241740415720680">Lite-версия страницы получена с помощью Google</translation> <translation id="2426805022920575512">Сменить аккаунт</translation> <translation id="2433507940547922241">Внешний вид</translation> <translation id="2434158240863470628">Скачивание завершено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Удалить данные сайтов?</translation> <translation id="385051799172605136">Назад</translation> <translation id="3859306556332390985">Перемотать вперед</translation> -<translation id="3860879523841717702">Lite-версия страницы получена с помощью Google. Нажмите, чтобы загрузить оригинал.</translation> <translation id="3868004864571585162">Файлы cookie, медиалицензии и данные сайтов</translation> <translation id="3894427358181296146">Добавление папки</translation> <translation id="3895926599014793903">Принудительно изменять масштаб</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Остановить обновление</translation> <translation id="4915549754973153784">Поиск устройств… <ph name="BEGIN_LINK" />Справка<ph name="END_LINK" /></translation> <translation id="4943872375798546930">Нет результатов</translation> -<translation id="4956867391417827202">Блокировать объявления на сайтах, которые показывают навязчивую или вводящую в заблуждение рекламу</translation> <translation id="4958708863221495346">Сайту <ph name="URL_OF_THE_CURRENT_TAB" /> предоставлен доступ к вашему экрану</translation> <translation id="4961334780091921942">Пароли, история действий и другая информация на всех устройствах</translation> <translation id="4961700429721424617">Вы выходите из аккаунта, которым управляет администратор домена <ph name="MANAGED_DOMAIN" />. Обратите внимание, что данные Chrome будут удалены с устройства, но сохранятся в аккаунте Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Выберите изображения</translation> <translation id="7243308994586599757">Доступные параметры указаны в нижней части экрана</translation> <translation id="7250468141469952378">Выбрано: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Заблокировано на определенных сайтах</translation> <translation id="7253272406652746122">Добавьте аккаунт Google в настройках устройства (раздел "Аккаунты").</translation> <translation id="7274013316676448362">Заблокированный сайт</translation> <translation id="729975465115245577">На устройстве не установлено приложение для хранения файлов паролей.</translation> <translation id="7302081693174882195">Сортировка по объему сэкономленного трафика</translation> <translation id="7333031090786104871">Предыдущий сайт ещё не добавлен</translation> -<translation id="7335671571918306053">Lite-версия страницы получена с помощью Google. Чтобы загрузить оригинал, нажмите соответствующую кнопку.</translation> <translation id="7352939065658542140">ВИДЕО</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Поделиться 1 выбранным объектом}one{Поделиться # выбранным объектом}few{Поделиться # выбранными объектами}many{Поделиться # выбранными объектами}other{Поделиться # выбранного объекта}}</translation> <translation id="7359002509206457351">Доступ к способам оплаты</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 80fb6b0..3066712 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Nie je tu žiadny obsah</translation> <translation id="2414886740292270097">Tmavý režim</translation> <translation id="2416359993254398973">Chrome potrebuje povolenie pre tento web na prístup k vášmu fotoaparátu.</translation> -<translation id="24241740415720680">Zjednodušenú verziu stránky poskytol Google</translation> <translation id="2426805022920575512">Vybrať iný účet</translation> <translation id="2433507940547922241">Vzhľad</translation> <translation id="2434158240863470628">Sťahovanie bolo dokončené <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -298,6 +297,7 @@ <translation id="3295602654194328831">Skryť informácie</translation> <translation id="3298243779924642547">Zjednoduš.</translation> <translation id="3303414029551471755">Pokračovať a stiahnuť obsah?</translation> +<translation id="3306398118552023113">Táto aplikácia je spustená v Chrome</translation> <translation id="3328801116991980348">Informácie o stránkach</translation> <translation id="3341058695485821946">Zistite, koľko dát ste ušetrili</translation> <translation id="3350687908700087792">Zavrieť všetky karty inkognito</translation> @@ -310,6 +310,7 @@ <translation id="3398320232533725830">Otvorenie správcu záložiek</translation> <translation id="3414952576877147120">Veľkosť:</translation> <translation id="3443221991560634068">Opätovné načítanie aktuálnej stránky</translation> +<translation id="3445014427084483498">Práve teraz</translation> <translation id="3452612588551937789">Prihláste sa pomocou účtu Google a získajte záložky, históriu, heslá a ďalšie nastavenia na všetkých svojich zariadeniach.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Bol stiahnutý %1$d súbor}few{Boli stiahnuté %1$d súbory}many{%1$d files downloaded}other{Bolo stiahnutých %1$d súborov}}</translation> <translation id="3492207499832628349">Nová karta inkognito</translation> @@ -353,7 +354,6 @@ <translation id="3822502789641063741">Vymazať úložisko webu?</translation> <translation id="385051799172605136">Naspäť</translation> <translation id="3859306556332390985">Pretočiť dopredu</translation> -<translation id="3860879523841717702">Zjednodušenú verziu stránky poskytol Google. Pôvodnú verziu načítate klepnutím.</translation> <translation id="3868004864571585162">Súbory cookie, licencie médií a údaje webov</translation> <translation id="3894427358181296146">Pridanie priečinka</translation> <translation id="3895926599014793903">Vynútiť povolenie priblíženia</translation> @@ -363,6 +363,7 @@ <translation id="3950820424414687140">Prihlásiť sa</translation> <translation id="395206256282351086">Návrhy vyhľadávania a webov sú deaktivované</translation> <translation id="3955193568934677022">Povoliť webom prehrávať chránený obsah (odporúčané)</translation> +<translation id="3963007978381181125">Šifrovanie prístupovej frázy nezahŕňa spôsoby platby a adresy zo služby Google Pay. Šifrované údaje si môže prečítať iba používateľ s prístupovou frázou. Prístupová fráza sa neodosiela do Googlu ani sa v ňom neuchováva. Ak ju zabudnete alebo chcete toto nastavenie zmeniť, budete musieť resetovať synchronizáciu. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="3967822245660637423">Sťahovanie dokončené</translation> <translation id="397583555483684758">Synchronizácia prestala fungovať</translation> <translation id="3976396876660209797">Odstráňte túto skratku a znova ju vytvorte</translation> @@ -401,7 +402,9 @@ <translation id="4195643157523330669">Otvoriť na novej karte</translation> <translation id="4198423547019359126">Nie sú k dispozícii žiadne umiestnenia stiahnutých súborov</translation> <translation id="4209895695669353772">Ak chcete získavať prispôsobený obsah navrhnutý Googlom, zapnite synchronizáciu</translation> +<translation id="4225719675976901337">Nenašiel sa žiadny obsah</translation> <translation id="4226663524361240545">Upozornenia môžu pri prijatí na zariadení spustiť vibrovanie</translation> +<translation id="423219824432660969">Šifrovať synchronizované údaje heslom Google od <ph name="TIME" /></translation> <translation id="4242533952199664413">Otvoriť nastavenia</translation> <translation id="4243710787042215766">Otvoriť na súkromnej karte</translation> <translation id="424864128008805179">Odhlásiť sa z prehliadača Chrome?</translation> @@ -471,6 +474,9 @@ <translation id="4763829664323285145">{FILE_COUNT,plural, =1{Dokončilo sa sťahovanie 1 položky.}few{Dokončilo sa sťahovanie # položiek.}many{# downloads complete.}other{Dokončilo sa sťahovanie # položiek.}}</translation> <translation id="4766369052440583386">Šetrič dát je zapnutý</translation> <translation id="4797039098279997504">Klepnutím sa vrátite na kartu <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="4802417911091824046">Šifrovanie prístupovej frázy nezahŕňa spôsoby platby a adresy zo služby Google Pay. + +Ak chcete toto nastavenie zmeniť, <ph name="BEGIN_LINK" />resetujte synchronizáciu<ph name="END_LINK" /></translation> <translation id="4807098396393229769">Meno na karte</translation> <translation id="4807963036345170158">Šetrič dát je vypnutý</translation> <translation id="4816465935029283692">Typy údajov</translation> @@ -482,6 +488,7 @@ <translation id="4874967477260347223">Licencie médií</translation> <translation id="4875775213178255010">Návrhy obsahu</translation> <translation id="4878404682131129617">Vytvorenie tunela prostredníctvom proxy servera zlyhalo</translation> +<translation id="4880127995492972015">Preložiť…</translation> <translation id="4881695831933465202">Otvoriť</translation> <translation id="488187801263602086">Premenovanie súboru</translation> <translation id="4882831918239250449">Ovládajte, ako sa pomocou histórie prehliadania prispôsobuje Vyhľadávanie, reklamy a ďalší obsah</translation> @@ -492,7 +499,6 @@ <translation id="4913169188695071480">Zastaviť obnovovanie</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Získajte pomoc<ph name="END_LINK" /> s vyhľadávaním zariadení…</translation> <translation id="4943872375798546930">Žiadne výsledky</translation> -<translation id="4956867391417827202">Blokovať reklamy z webov, ktoré zobrazujú obťažujúce alebo zavádzajúce reklamy</translation> <translation id="4958708863221495346">Web <ph name="URL_OF_THE_CURRENT_TAB" /> zdieľa vašu obrazovku</translation> <translation id="4961334780091921942">Vaše heslá, história a ďalší obsah vo všetkých zariadeniach</translation> <translation id="4961700429721424617">Odhlasujete sa z účtu spravovaného doménou <ph name="MANAGED_DOMAIN" />. Týmto odstránite údaje Chromu z tohto zariadenia, avšak zostanú naďalej vo vašom účte Google.</translation> @@ -741,6 +747,7 @@ <translation id="6738867403308150051">Sťahuje sa...</translation> <translation id="6746124502594467657">Presunúť nadol</translation> <translation id="6766622839693428701">Zatvorte potiahnutím dole.</translation> +<translation id="6766758767654711248">Kliknutím prejdite na web</translation> <translation id="6768277682697012280">Inštaluje sa modul RR…</translation> <translation id="6776813977906306442">Stiahnite si videá pomocou tlačidla Stiahnuť a pozrite si ich neskôr</translation> <translation id="6782111308708962316">Brániť webom tretích strán ukladať a čítať dáta súborov cookie</translation> @@ -809,13 +816,11 @@ <translation id="723171743924126238">Výber obrázkov</translation> <translation id="7243308994586599757">Možnosti sú k dispozícii v dolnej časti obrazovky</translation> <translation id="7250468141469952378">Vybrané: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Blokovanie reklám z niektorých webov</translation> <translation id="7253272406652746122">Pridajte účet Google zo stránky Účty v aplikácii Nastavenia na vašom zariadení.</translation> <translation id="7274013316676448362">Blokovaný web</translation> <translation id="729975465115245577">Vaše zariadenie nemá aplikáciu na uloženie súboru s heslami.</translation> <translation id="7302081693174882195">Podrobnosti: zoradené podľa množstva ušetrených dát</translation> <translation id="7333031090786104871">Pridávanie predchádzajúceho webu stále prebieha</translation> -<translation id="7335671571918306053">Zjednodušenú verziu stránky poskytol Google. Ak chcete načítať pôvodnú verziu, klepnite na tlačidlo Načítať pôvodnú stránku.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Zdieľať 1 vybranú položku}few{Zdieľať # vybrané položky}many{Zdieľať # vybranej položky}other{Zdieľať # vybraných položiek}}</translation> <translation id="7359002509206457351">Poskytnúť prístup k spôsobom platby</translation> @@ -959,6 +964,7 @@ <translation id="8441146129660941386">Pretočiť dozadu</translation> <translation id="8445448999790540984">Heslá sa nepodarilo exportovať</translation> <translation id="8447861592752582886">Odvolať povolenie pre zariadenie</translation> +<translation id="8461694314515752532">Šifrovať synchronizované údaje pomocou vlastnej prístupovej frázy synchronizácie</translation> <translation id="8477071352266846533">Synchronizácia účtu <ph name="SYNC_ACCOUNT_USER_NAME" /> je vypnutá</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">K dispozícii offline</translation> @@ -1003,10 +1009,12 @@ <translation id="8748850008226585750">Obsah je skrytý</translation> <translation id="8751914237388039244">Vyberte obrázok</translation> <translation id="8788968922598763114">Opätovné otvorenie poslednej zavretej karty</translation> +<translation id="8801436777607969138">Zablokujte JavaScript pre konkrétny web.</translation> <translation id="8812260976093120287">Na niektorých weboch môžete platiť pomocou podporovaných platobných aplikácií na zariadení.</translation> <translation id="8816439037877937734"><ph name="APP_NAME" /> sa otvorí v Chrome. Pokračovaním vyjadrujete súhlas so <ph name="BEGIN_LINK1" />zmluvnými podmienkami<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />oznámením o ochrane súkromia<ph name="END_LINK2" /> Chromu, ako aj <ph name="BEGIN_LINK3" />oznámením o ochrane súkromia pre účty Google spravované pomocou aplikácie Family Link<ph name="END_LINK3" />.</translation> <translation id="8820817407110198400">Záložky</translation> <translation id="8823704566850948458">Navrhnúť heslo…</translation> +<translation id="8833831881926404480">Nejaký web zdieľa vašu obrazovku</translation> <translation id="883806473910249246">Pri sťahovaní obsahu sa vyskytla chyba.</translation> <translation id="8840953339110955557">Táto stránka sa môže líšiť od online verzie.</translation> <translation id="8847988622838149491">USB</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 4cf5e5f..48611ed0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Tu ni vsebine</translation> <translation id="2414886740292270097">Temno</translation> <translation id="2416359993254398973">Chrome potrebuje dovoljenje za dostop do fotoaparata za to spletno mesto.</translation> -<translation id="24241740415720680">Stran v osnovnem načinu, ki jo je prikazal Google</translation> <translation id="2426805022920575512">Izberi drug račun</translation> <translation id="2433507940547922241">Videz</translation> <translation id="2434158240863470628">Prenos je končan <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Izbris pod. spl. mesta?</translation> <translation id="385051799172605136">Nazaj</translation> <translation id="3859306556332390985">Išči naprej</translation> -<translation id="3860879523841717702">Stran v osnovnem načinu, ki jo je prikazal Google. Dotaknite se, če želite naložiti izvirno stran.</translation> <translation id="3868004864571585162">Piškotki, predstavnostne licence in podatki spletnih mest</translation> <translation id="3894427358181296146">Dodajanje mape</translation> <translation id="3895926599014793903">Vsili povečavo</translation> @@ -491,7 +489,6 @@ <translation id="4913169188695071480">Ustavitev osveževanja</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Poiščite pomoč<ph name="END_LINK" /> med iskanjem naprav …</translation> <translation id="4943872375798546930">Ni rezultatov</translation> -<translation id="4956867391417827202">Blokiranje oglasov spletnih mest, ki prikazujejo vsiljive ali zavajajoče oglase</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> dostopa do vašega zaslona</translation> <translation id="4961334780091921942">Gesla, zgodovina in drugi podatki v vseh vaših napravah</translation> <translation id="4961700429721424617">Odjavili se boste iz računa, ki ga upravlja <ph name="MANAGED_DOMAIN" />. S tem boste iz te naprave izbrisali podatke v Chromu, vendar bodo vaši podatki še vedno na voljo v Google Računu.</translation> @@ -808,13 +805,11 @@ <translation id="723171743924126238">Izberite slike</translation> <translation id="7243308994586599757">Možnosti so na voljo pri dnu zaslona</translation> <translation id="7250468141469952378">Št. izbranih: <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Blokirano na nekaterih spletnih mestih</translation> <translation id="7253272406652746122">Na strani za račune v aplikaciji Nastavitve dodajte Google Račun.</translation> <translation id="7274013316676448362">Blokirano spletno mesto</translation> <translation id="729975465115245577">V napravi ni aplikacije za shranjevanje datoteke z gesli.</translation> <translation id="7302081693174882195">Podrobnosti: razvrščeno po količini prihranjenih podatkov</translation> <translation id="7333031090786104871">Dodajanje prejšnjega spletnega mesta še vedno poteka</translation> -<translation id="7335671571918306053">Stran v osnovnem načinu, ki jo je prikazal Google. Dotaknite se gumba za nalaganje izvirne strani, če želite naložiti izvirno stran.</translation> <translation id="7352939065658542140">VIDEOPOSNETEK</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Delitev 1 izbranega elementa z drugimi}one{Delitev # izbranega elementa z drugimi}two{Delitev # izbranih elementov z drugimi}few{Delitev # izbranih elementov z drugimi}other{Delitev # izbranih elementov z drugimi}}</translation> <translation id="7359002509206457351">Dostop do plačilnih sredstev</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 01ced7b..264e3b9c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Овде нема садржаја</translation> <translation id="2414886740292270097">Тамнa</translation> <translation id="2416359993254398973">Chrome тражи дозволу да приступи камери за овај сајт.</translation> -<translation id="24241740415720680">Поједностављену страницу пружа Google</translation> <translation id="2426805022920575512">Изаберите други налог</translation> <translation id="2433507940547922241">Изглед</translation> <translation id="2434158240863470628">Преузимање је завршено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Бришете меморију сајта?</translation> <translation id="385051799172605136">Назад</translation> <translation id="3859306556332390985">Премотај унапред</translation> -<translation id="3860879523841717702">Поједностављену страницу пружа Google. Додирните да бисте учитали првобитну страницу.</translation> <translation id="3868004864571585162">Колачићи, лиценце за медије и подаци о сајтовима</translation> <translation id="3894427358181296146">Додајте директоријум</translation> <translation id="3895926599014793903">Принудно омогући зумирање</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Заустави освежавање</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Потражите помоћ<ph name="END_LINK" /> док скенирате уређаје…</translation> <translation id="4943872375798546930">Нема резултата</translation> -<translation id="4956867391417827202">Блокирају се огласи са сајтова који приказују огласе који ометају активности или обмањујуће огласе</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> дели екран</translation> <translation id="4961334780091921942">Лозинке, историја и други садржај са свих уређаја</translation> <translation id="4961700429721424617">Одјављујете се са налога којим управља <ph name="MANAGED_DOMAIN" />. Тако бришете Chrome податке са овог уређаја, али ће подаци остати на Google налогу.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Изаберите слике</translation> <translation id="7243308994586599757">Опције су доступне у дну екрана</translation> <translation id="7250468141469952378">Изабрали сте <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Блокирано са неких сајтова</translation> <translation id="7253272406652746122">Додајте Google налог са странице Налози у апликацији Подешавања на уређају.</translation> <translation id="7274013316676448362">Сајт је блокиран</translation> <translation id="729975465115245577">Уређај нема апликацију за чување датотеке са лозинкама.</translation> <translation id="7302081693174882195">Детаљи: сортирано према количини уштеђених података</translation> <translation id="7333031090786104871">Још увек додајемо претходни сајт</translation> -<translation id="7335671571918306053">Поједностављену страницу пружа Google. Додирните дугме Учитај првобитну страницу да бисте учитали првобитну страницу.</translation> <translation id="7352939065658542140">ВИДЕО</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Дели 1 изабрану ставку}one{Дели # изабрану ставку}few{Дели # изабране ставке}other{Дели # изабраних ставки}}</translation> <translation id="7359002509206457351">Приступ начинима плаћања</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 94bb1757..8f8f9d7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Här finns ingenting</translation> <translation id="2414886740292270097">Mörk</translation> <translation id="2416359993254398973">Du behöver ge Chrome behörighet att använda kameran på den här webbplatsen.</translation> -<translation id="24241740415720680">Lite-sida via Google</translation> <translation id="2426805022920575512">Välj ett annat konto</translation> <translation id="2433507940547922241">Utseende</translation> <translation id="2434158240863470628">Nedladdningen är klar<ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Rensa webbplatslagring?</translation> <translation id="385051799172605136">Bakåt</translation> <translation id="3859306556332390985">Sök framåt</translation> -<translation id="3860879523841717702">Lite-sida via Google. Tryck för att läsa in originalet.</translation> <translation id="3868004864571585162">Cookies, medielicenser och webbplatsdata</translation> <translation id="3894427358181296146">Lägg till mapp</translation> <translation id="3895926599014793903">Tvinga aktivering av zoom</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Sluta uppdatera</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Få hjälp<ph name="END_LINK" /> under sökningen efter enheter …</translation> <translation id="4943872375798546930">Inga resultat</translation> -<translation id="4956867391417827202">Blockera annonser från webbplatser där påträngande eller vilseledande annonser visas</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> delar skärmen</translation> <translation id="4961334780091921942">Samma lösenord, historik med mera på alla dina enheter</translation> <translation id="4961700429721424617">Du håller på att logga ut från ett konto som hanteras av <ph name="MANAGED_DOMAIN" />. Åtgärden raderar din data i Chrome från den här enheten, men den finns kvar i Google-kontot.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Välj bilder</translation> <translation id="7243308994586599757">Alternativ visas nära skärmens nedre kant</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> har valts</translation> -<translation id="7251326866581677552">Blockeras från vissa webbplatser</translation> <translation id="7253272406652746122">Lägg till ett Google-konto från kontosidan i appen Inställningar på enheten.</translation> <translation id="7274013316676448362">Blockerad webbplats</translation> <translation id="729975465115245577">Det finns ingen app som kan spara lösenordsfilen på enheten.</translation> <translation id="7302081693174882195">Mer information: Sorterad efter databesparing</translation> <translation id="7333031090786104871">Processen pågår fortfarande för den förra webbplatsen</translation> -<translation id="7335671571918306053">Lite-sida via Google. Tryck på knappen Läs in original för att läsa in ursprungssidan.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Dela 1 markerat objekt}other{Dela # markerade objekt}}</translation> <translation id="7359002509206457351">Åtkomst till betalningsmetoder</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 fcd7e5e..b13d244d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Hakuna maudhui hapa</translation> <translation id="2414886740292270097">Giza</translation> <translation id="2416359993254398973">Ruhusu Chrome ifikie kamera yako ya tovuti hii.</translation> -<translation id="24241740415720680">Ukurasa mwepesi umewasilishwa na Google</translation> <translation id="2426805022920575512">Chagua akaunti nyingine</translation> <translation id="2433507940547922241">Sura</translation> <translation id="2434158240863470628">Upakuaji umekamilika <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Ungependa kufuta hifadhi ya tovuti?</translation> <translation id="385051799172605136">Nyuma</translation> <translation id="3859306556332390985">Peleka mbele</translation> -<translation id="3860879523841717702">Ukurasa mwepesi umewasilishwa na Google. Gusa ili upakie ukurasa halisi.</translation> <translation id="3868004864571585162">Vidakuzi, leseni za vyombo vya habari na data ya tovuti</translation> <translation id="3894427358181296146">Ongeza folda</translation> <translation id="3895926599014793903">Lazimisha kuwasha ukuzaji</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Acha kuonyesha upya</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Pata usaidizi<ph name="END_LINK" /> huku ukitafuta vifaa...</translation> <translation id="4943872375798546930">Hakuna matokeo yoyote yaliyopatikana</translation> -<translation id="4956867391417827202">Zuia matangazo kutoka kwenye tovuti zinazoonyesha matangazo yanayopotosha au yanayokatiza huduma</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> inashiriki skrini yako</translation> <translation id="4961334780091921942">Manenosiri yako, historia na zaidi katika vifaa vyote</translation> <translation id="4961700429721424617">Unaondoka kwenye akaunti inayodhibitiwa na <ph name="MANAGED_DOMAIN" />. Hatua hii itafuta data yako ya Chrome kwenye kifaa hiki, lakini data yako itasalia katika akaunti yako ya Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Chagua picha</translation> <translation id="7243308994586599757">Chaguo zinapatikana karibu na sehemu ya chini ya skrini</translation> <translation id="7250468141469952378">Imechagua <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Imezuiwa kwenye baadhi ya tovuti</translation> <translation id="7253272406652746122">Ongeza Akaunti ya Google kutoka kwenye ukurasa wa Akaunti katika programu ya Mipangilio ya kifaa chako.</translation> <translation id="7274013316676448362">Tovuti imezuiwa</translation> <translation id="729975465115245577">Kifaa chako hakina programu ya kuhifadhi faili ya manenosiri.</translation> <translation id="7302081693174882195">Maelezo: Imepangwa kulingana na kiasi cha data kilichookolewa</translation> <translation id="7333031090786104871">Bado inaongeza tovuti ya awali</translation> -<translation id="7335671571918306053">Ukurasa mwepesi umewasilishwa na Google. Gusa kitufe cha 'pakia halisi' ili upakie ukurasa halisi.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Shiriki kipengee 1 kilichochaguliwa}other{Shiriki vipengee # vilivyochaguliwa}}</translation> <translation id="7359002509206457351">Ufikiaji wa njia za kulipa</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 c9db0c6..8097d80 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">ไม่มีเนื้อหาที่นี่</translation> <translation id="2414886740292270097">มืด</translation> <translation id="2416359993254398973">Chrome ต้องการสิทธิ์เข้าถึงกล้องถ่ายรูปของคุณสำหรับไซต์นี้</translation> -<translation id="24241740415720680">หน้าเวอร์ชัน Lite แสดงโดย Google</translation> <translation id="2426805022920575512">เลือกบัญชีอื่น</translation> <translation id="2433507940547922241">ลักษณะที่ปรากฏ</translation> <translation id="2434158240863470628">ดาวน์โหลดเสร็จสมบูรณ์ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">ล้างพื้นที่เก็บข้อมูลเว็บไซต์ไหม</translation> <translation id="385051799172605136">กลับ</translation> <translation id="3859306556332390985">ไปข้างหน้า</translation> -<translation id="3860879523841717702">หน้าเวอร์ชัน Lite แสดงโดย Google แตะเพื่อโหลดต้นฉบับ</translation> <translation id="3868004864571585162">คุกกี้ ใบอนุญาตสื่อ และข้อมูลเว็บไซต์</translation> <translation id="3894427358181296146">เพิ่มโฟลเดอร์</translation> <translation id="3895926599014793903">บังคับให้เปิดใช้การซูม</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">หยุดรีเฟรช</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />รับความช่วยเหลือ<ph name="END_LINK" />ระหว่างการค้นหาอุปกรณ์…</translation> <translation id="4943872375798546930">ไม่มีผลการค้นหา</translation> -<translation id="4956867391417827202">บล็อกโฆษณาในเว็บไซต์ที่แสดงโฆษณาที่แทรกหรือทำให้เข้าใจผิด</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> กำลังแชร์หน้าจอของคุณ</translation> <translation id="4961334780091921942">รหัสผ่าน ประวัติการเข้าชม และอื่นๆ ในอุปกรณ์ทุกเครื่อง</translation> <translation id="4961700429721424617">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="MANAGED_DOMAIN" /> การออกจากระบบจะลบข้อมูล Chrome ออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">เลือกภาพ</translation> <translation id="7243308994586599757">มีตัวเลือกอยู่ทางด้านล่างของหน้าจอ</translation> <translation id="7250468141469952378">เลือกไว้ <ph name="ITEM_COUNT" /> รายการ</translation> -<translation id="7251326866581677552">บล็อกจากบางไซต์</translation> <translation id="7253272406652746122">เพิ่มบัญชี Google จากหน้า "บัญชี" ในแอปการตั้งค่าของอุปกรณ์</translation> <translation id="7274013316676448362">เว็บไซต์ที่ถูกบล็อก</translation> <translation id="729975465115245577">อุปกรณ์ของคุณไม่มีแอปไว้จัดเก็บไฟล์รหัสผ่าน</translation> <translation id="7302081693174882195">รายละเอียด: จัดเรียงตามปริมาณเน็ตมือถือที่ประหยัดได้</translation> <translation id="7333031090786104871">ยังเพิ่มไซต์ก่อนหน้าอยู่</translation> -<translation id="7335671571918306053">หน้าเวอร์ชัน Lite แสดงโดย Google แตะปุ่มโหลดต้นฉบับเพื่อโหลดหน้าต้นฉบับ</translation> <translation id="7352939065658542140">วิดีโอ</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{แชร์ 1 รายการที่เลือก}other{แชร์ # รายการที่เลือก}}</translation> <translation id="7359002509206457351">เข้าถึงวิธีการชำระเงิน</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 d1c73cb..1e05297 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Burada içerik yok</translation> <translation id="2414886740292270097">Koyu</translation> <translation id="2416359993254398973">Chrome'un bu sitede kameranıza erişmesi için izin gerekiyor.</translation> -<translation id="24241740415720680">Google tarafından sunulan basit sayfa</translation> <translation id="2426805022920575512">Başka hesap seç</translation> <translation id="2433507940547922241">Görünüm</translation> <translation id="2434158240863470628">İndirme işlemi tamamlandı <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Site depo. silinsin mi?</translation> <translation id="385051799172605136">Geri</translation> <translation id="3859306556332390985">İleriye doğru git</translation> -<translation id="3860879523841717702">Google tarafından sunulan basit sayfa. Sayfanın orijinalini yüklemek için dokunun.</translation> <translation id="3868004864571585162">Çerezler, medya lisansları ve site verileri</translation> <translation id="3894427358181296146">Klasör ekleyin</translation> <translation id="3895926599014793903">Yakınlaştırmayı etkinleştirmeye zorla</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Yenilemeyi durdur</translation> <translation id="4915549754973153784">Cihazlar taranırken <ph name="BEGIN_LINK" />yardım alın<ph name="END_LINK" />…</translation> <translation id="4943872375798546930">Sonuç yok</translation> -<translation id="4956867391417827202">Araya giren veya yanıltıcı reklamlar gösteren sitelerden reklamları engelle</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> ekranınızı paylaşıyor</translation> <translation id="4961334780091921942">Tüm cihazlardaki şifreleriniz, geçmişiniz ve diğer öğeler</translation> <translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapatıyorsunuz. Bu işlemle Chrome verileriniz bu cihazdan silinir, ancak Google Hesabınızda kalmaya devam eder.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Resim seç</translation> <translation id="7243308994586599757">Sayfanın altına yakın bir yerde kullanılabilen seçenekler</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> öğe seçildi</translation> -<translation id="7251326866581677552">Bazı sitelerde engellendi</translation> <translation id="7253272406652746122">Cihazınızın Ayarlar uygulamasındaki Hesaplar sayfasından bir Google Hesabı ekleyin.</translation> <translation id="7274013316676448362">Engellenmiş site</translation> <translation id="729975465115245577">Cihazınızda şifreler dosyasını depolayacak bir uygulama yok.</translation> <translation id="7302081693174882195">Ayrıntılar: Tasarruf edilen veri miktarına göre sıralı</translation> <translation id="7333031090786104871">Önceki siteyi ekleme işlemi devam ediyor.</translation> -<translation id="7335671571918306053">Google tarafından sunulan basit sayfa. Sayfanın orijinalini yüklemek için orijinali yükle düğmesine dokunun.</translation> <translation id="7352939065658542140">VİDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{1 seçili öğeyi paylaş}other{# seçili öğeyi paylaş}}</translation> <translation id="7359002509206457351">Ödeme yöntemlerine erişme</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 02901f32..51a53f2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Немає вмісту</translation> <translation id="2414886740292270097">Темна</translation> <translation id="2416359993254398973">Chrome потрібні дозволи, щоб використовувати камеру на цьому сайті.</translation> -<translation id="24241740415720680">Спрощена сторінка, показана Google</translation> <translation id="2426805022920575512">Вибрати інший обліковий запис</translation> <translation id="2433507940547922241">Зовнішній вигляд</translation> <translation id="2434158240863470628">Завантажено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Видалити дані сайтів?</translation> <translation id="385051799172605136">Назад</translation> <translation id="3859306556332390985">Далі</translation> -<translation id="3860879523841717702">Спрощена сторінка, показана Google. Натисніть, щоб завантажити оригінал.</translation> <translation id="3868004864571585162">Файли сookie, ліцензії медіа-вмісту й дані із сайтів</translation> <translation id="3894427358181296146">Додати папку</translation> <translation id="3895926599014793903">Примусово ввімкнути масштабування</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Припинити оновлення</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Довідка<ph name="END_LINK" /> під час пошуку пристроїв…</translation> <translation id="4943872375798546930">Не знайдено жодного результату</translation> -<translation id="4956867391417827202">Блокувати рекламу на сайтах, які показують нав’язливі чи оманливі оголошення</translation> <translation id="4958708863221495346">Сторінка <ph name="URL_OF_THE_CURRENT_TAB" /> показує ваш екран</translation> <translation id="4961334780091921942">Ваші паролі, історія тощо на всіх пристроях</translation> <translation id="4961700429721424617">Ви виходите з облікового запису, зареєстрованого в домені <ph name="MANAGED_DOMAIN" />. Дані Chrome буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Вибрати зображення</translation> <translation id="7243308994586599757">Опції можна знайти внизу екрана</translation> <translation id="7250468141469952378">Вибрано <ph name="ITEM_COUNT" /></translation> -<translation id="7251326866581677552">Заблоковано на деяких сайтах</translation> <translation id="7253272406652746122">Додайте обліковий запис Google зі сторінки "Облікові записи" в додатку Налаштування на пристрої.</translation> <translation id="7274013316676448362">Заблокований сайт</translation> <translation id="729975465115245577">На пристрої немає додатка для зберігання файлу з паролями.</translation> <translation id="7302081693174882195">Деталі: відсортовано за кількістю заощадженого трафіку</translation> <translation id="7333031090786104871">Попередній сайт ще додається</translation> -<translation id="7335671571918306053">Спрощена сторінка, показана Google. Натисніть відповідну кнопку, щоб завантажити оригінал.</translation> <translation id="7352939065658542140">ВІДЕО</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Поділитись 1 вибраним елементом}one{Поділитися # вибраним елементом}few{Поділитися # вибраними елементами}many{Поділитися # вибраними елементами}other{Поділитися # вибраного елемента}}</translation> <translation id="7359002509206457351">Отримати доступ до способів оплати</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 cf47cce..dfdd17be 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">Không có nội dung nào ở đây</translation> <translation id="2414886740292270097">Tối</translation> <translation id="2416359993254398973">Chrome cần có quyền truy cập máy ảnh của bạn cho trang web này.</translation> -<translation id="24241740415720680">Trang phiên bản rút gọn do Google cung cấp</translation> <translation id="2426805022920575512">Chọn một tài khoản khác</translation> <translation id="2433507940547922241">Hình thức</translation> <translation id="2434158240863470628">Quá trình tải xuống hoàn tất <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">Xóa bộ nhớ trang web?</translation> <translation id="385051799172605136">Quay lại</translation> <translation id="3859306556332390985">Tìm kiếm tiến</translation> -<translation id="3860879523841717702">Trang phiên bản rút gọn do Google cung cấp. Nhấn để tải trang gốc.</translation> <translation id="3868004864571585162">Cookie, giấy phép phương tiện và dữ liệu trang web</translation> <translation id="3894427358181296146">Thêm thư mục</translation> <translation id="3895926599014793903">Buộc bật thu phóng</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">Ngừng làm mới</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Nhận trợ giúp<ph name="END_LINK" /> trong khi quét tìm thiết bị…</translation> <translation id="4943872375798546930">Không tìm thấy kết quả nào</translation> -<translation id="4956867391417827202">Chặn quảng cáo từ các trang web hiển thị quảng cáo xâm nhập hoặc quảng cáo gây hiểu nhầm</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> đang chia sẻ màn hình của bạn</translation> <translation id="4961334780091921942">Mật khẩu, lịch sử và nhiều nội dung khác của bạn trên tất cả các thiết bị</translation> <translation id="4961700429721424617">Bạn đang đăng xuất khỏi tài khoản do <ph name="MANAGED_DOMAIN" /> quản lý. Thao tác này sẽ xóa dữ liệu Chrome khỏi thiết bị này nhưng dữ liệu sẽ vẫn còn trong Tài khoản Google của bạn.</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">Chọn hình ảnh</translation> <translation id="7243308994586599757">Có các tùy chọn ở gần cuối màn hình</translation> <translation id="7250468141469952378">Đã chọn <ph name="ITEM_COUNT" /> mục</translation> -<translation id="7251326866581677552">Đã chặn khỏi một số trang web</translation> <translation id="7253272406652746122">Thêm Tài khoản Google từ trang Tài khoản trong ứng dụng Cài đặt trên thiết bị của bạn.</translation> <translation id="7274013316676448362">Trang web bị chặn</translation> <translation id="729975465115245577">Thiết bị của bạn không có ứng dụng để lưu trữ tệp mật khẩu.</translation> <translation id="7302081693174882195">Thông tin chi tiết: Sắp xếp theo lượng dữ liệu đã tiết kiệm được</translation> <translation id="7333031090786104871">Vẫn đang thêm trang web trước</translation> -<translation id="7335671571918306053">Trang phiên bản rút gọn do Google cung cấp. Nhấn vào nút tải bản gốc để tải trang gốc.</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Chia sẻ 1 mục đã chọn}other{Chia sẻ # mục đã chọn}}</translation> <translation id="7359002509206457351">Truy cập vào phương thức thanh toán</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 e52ccc2a..0e433c6 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
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">此处没有任何内容</translation> <translation id="2414886740292270097">深色调</translation> <translation id="2416359993254398973">Chrome 需要获得相应权限,才能允许此网站使用您的摄像头。</translation> -<translation id="24241740415720680">由 Google 提供的精简版网页</translation> <translation id="2426805022920575512">选择其他帐号</translation> <translation id="2433507940547922241">外观</translation> <translation id="2434158240863470628">下载完成 <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">要清除网站存储数据吗?</translation> <translation id="385051799172605136">后退</translation> <translation id="3859306556332390985">前进</translation> -<translation id="3860879523841717702">由 Google 提供的精简版网页。点按即可加载原始网页。</translation> <translation id="3868004864571585162">Cookie、媒体许可和网站数据</translation> <translation id="3894427358181296146">添加文件夹</translation> <translation id="3895926599014793903">强制启用缩放功能</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">停止刷新</translation> <translation id="4915549754973153784">正在搜寻设备…<ph name="BEGIN_LINK" />获取帮助<ph name="END_LINK" /></translation> <translation id="4943872375798546930">找不到结果</translation> -<translation id="4956867391417827202">禁止会展示侵扰性或误导性广告的网站显示广告</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> 正在共享您的屏幕</translation> <translation id="4961334780091921942">您所有设备上的密码、历史记录等信息</translation> <translation id="4961700429721424617">您正要退出由 <ph name="MANAGED_DOMAIN" /> 管理的帐号。退出后,您的 Chrome 数据将从这台设备上删除,但仍会保留在您的 Google 帐号中。</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">选择图片</translation> <translation id="7243308994586599757">选项在靠近屏幕底部的位置</translation> <translation id="7250468141469952378">已选择 <ph name="ITEM_COUNT" /> 项</translation> -<translation id="7251326866581677552">已阻止在部分网站中显示广告</translation> <translation id="7253272406652746122">请在设备的“设置”应用中,通过“帐号”页面添加 Google 帐号。</translation> <translation id="7274013316676448362">禁止访问的网站</translation> <translation id="729975465115245577">您的设备上没有可以存储密码文件的应用。</translation> <translation id="7302081693174882195">详细信息:按已节省的数据流量排序</translation> <translation id="7333031090786104871">仍在添加先前的网站</translation> -<translation id="7335671571918306053">由 Google 提供的精简版网页。点按“加载原始网站”按钮即可加载原始网页。</translation> <translation id="7352939065658542140">视频</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{分享 1 个所选项}other{分享 # 个所选项}}</translation> <translation id="7359002509206457351">查询付款方式</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 c7b0e4d..0c2a8644 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
@@ -195,7 +195,6 @@ <translation id="2414672073755873541">這裡沒有任何內容</translation> <translation id="2414886740292270097">深色</translation> <translation id="2416359993254398973">Chrome 需要相關權限,才能讓這個網站使用你的攝影機。</translation> -<translation id="24241740415720680">由 Google 提供的精簡版網頁</translation> <translation id="2426805022920575512">選擇其他帳戶</translation> <translation id="2433507940547922241">外觀</translation> <translation id="2434158240863470628">下載完成 <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> @@ -353,7 +352,6 @@ <translation id="3822502789641063741">要清除網站儲存的資料嗎?</translation> <translation id="385051799172605136">返回</translation> <translation id="3859306556332390985">快轉到特定的播放時間點</translation> -<translation id="3860879523841717702">由 Google 提供的精簡版網頁。輕觸即可載入原始網頁。</translation> <translation id="3868004864571585162">Cookie、媒體授權和網站資料</translation> <translation id="3894427358181296146">新增資料夾</translation> <translation id="3895926599014793903">強制啟用縮放功能</translation> @@ -492,7 +490,6 @@ <translation id="4913169188695071480">停止重新整理</translation> <translation id="4915549754973153784"><ph name="BEGIN_LINK" />查看說明<ph name="END_LINK" />。正在掃描裝置…</translation> <translation id="4943872375798546930">沒有結果</translation> -<translation id="4956867391417827202">如果網站顯示侵入性或誤導性廣告,就封鎖廣告</translation> <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> 正在共用你的畫面。</translation> <translation id="4961334780091921942">你所有裝置上的密碼、歷史記錄和其他設定</translation> <translation id="4961700429721424617">您即將登出由 <ph name="MANAGED_DOMAIN" /> 所管理的帳戶。系統會將您的 Chrome 資料從這個裝置上刪除,但繼續保留在您的 Google 帳戶中。</translation> @@ -809,13 +806,11 @@ <translation id="723171743924126238">選取圖片</translation> <translation id="7243308994586599757">選項在接近畫面底部的位置</translation> <translation id="7250468141469952378">已選取 <ph name="ITEM_COUNT" /> 個項目</translation> -<translation id="7251326866581677552">封鎖部分網站的廣告</translation> <translation id="7253272406652746122">在裝置的「設定」應用程式中,透過「帳戶」頁面新增 Google 帳戶。</translation> <translation id="7274013316676448362">已封鎖網站</translation> <translation id="729975465115245577">你的裝置沒有可儲存密碼檔案的應用程式。</translation> <translation id="7302081693174882195">詳細資料:依儲存資料量排序</translation> <translation id="7333031090786104871">仍在新增先前的網站</translation> -<translation id="7335671571918306053">由 Google 提供的精簡版網頁。輕觸載入原始網頁按鈕即可瀏覽原始網頁。</translation> <translation id="7352939065658542140">影片</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{分享 1 個選取的項目}other{分享 # 個選取的項目}}</translation> <translation id="7359002509206457351">存取付款方式</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 8a0ec97..f16dfe2 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -575,6 +575,7 @@ "java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java", "java/src/org/chromium/chrome/browser/download/ui/SpaceDisplay.java", "java/src/org/chromium/chrome/browser/engagement/SiteEngagementService.java", + "java/src/org/chromium/chrome/browser/experiments/EphemeralTab.java", "java/src/org/chromium/chrome/browser/explore_sites/CategoryCardAdapter.java", "java/src/org/chromium/chrome/browser/explore_sites/CategoryCardViewHolderFactory.java", "java/src/org/chromium/chrome/browser/explore_sites/ExperimentalExploreSitesCategoryTileView.java", @@ -1188,6 +1189,7 @@ "java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java", "java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java", "java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java", + "java/src/org/chromium/chrome/browser/preferences/AboutChromePreferenceOSVersion.java", "java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java", "java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java", "java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java index 0919498..4eea767 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
@@ -67,7 +67,7 @@ private Integer mSecurityLevel; public TestToolbarModel() { - super(ContextUtils.getApplicationContext(), null /* bottomSheet */); + super(ContextUtils.getApplicationContext()); initializeWithNative(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarModelTest.java index 6625caa..c95ac3fe 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarModelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarModelTest.java
@@ -118,7 +118,7 @@ private String mUrl; public TestToolbarModel() { - super(ContextUtils.getApplicationContext(), null /* bottomSheet */); + super(ContextUtils.getApplicationContext()); initializeWithNative(); Tab tab = new Tab(0, false, null) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java index 3108b6f..8a4bc19 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
@@ -118,7 +118,7 @@ } @Test - @DisableFeatures(ChromeFeatureList.CUSTOM_CONTEXT_MENU) + @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testHttpLink() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(0, PAGE_URL, LINK_URL, @@ -156,7 +156,7 @@ } @Test - @EnableFeatures(ChromeFeatureList.CUSTOM_CONTEXT_MENU) + @EnableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testHttpLinkWithCustomContextMenu() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(0, PAGE_URL, LINK_URL, @@ -175,8 +175,9 @@ initializePopulator(ChromeContextMenuPopulator.ContextMenuMode.NORMAL); int[] expected2 = {R.id.contextmenu_open_in_new_tab, R.id.contextmenu_open_in_incognito_tab, - R.id.contextmenu_open_in_other_window, R.id.contextmenu_copy_link_address, - R.id.contextmenu_save_link_as, R.id.contextmenu_share_link}; + R.id.contextmenu_open_in_other_window, R.id.contextmenu_open_in_ephemeral_tab, + R.id.contextmenu_copy_link_address, R.id.contextmenu_save_link_as, + R.id.contextmenu_share_link}; checkMenuOptions(contextMenuParams, expected2); initializePopulator(ChromeContextMenuPopulator.ContextMenuMode.CUSTOM_TAB); @@ -191,7 +192,7 @@ } @Test - @DisableFeatures(ChromeFeatureList.CUSTOM_CONTEXT_MENU) + @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testMailLink() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = @@ -230,7 +231,7 @@ } @Test - @DisableFeatures(ChromeFeatureList.CUSTOM_CONTEXT_MENU) + @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testTelLink() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = @@ -270,7 +271,7 @@ } @Test - @DisableFeatures(ChromeFeatureList.CUSTOM_CONTEXT_MENU) + @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testVideoLink() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(WebContextMenuMediaType.VIDEO, @@ -310,7 +311,7 @@ } @Test - @DisableFeatures(ChromeFeatureList.CUSTOM_CONTEXT_MENU) + @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testImageLoFi() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(WebContextMenuMediaType.IMAGE, @@ -344,7 +345,7 @@ } @Test - @DisableFeatures(ChromeFeatureList.CUSTOM_CONTEXT_MENU) + @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testImageHiFi() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(WebContextMenuMediaType.IMAGE, @@ -379,7 +380,7 @@ } @Test - @DisableFeatures(ChromeFeatureList.CUSTOM_CONTEXT_MENU) + @DisableFeatures({ChromeFeatureList.CUSTOM_CONTEXT_MENU, ChromeFeatureList.EPHEMERAL_TAB}) public void testHttpLinkWithImageHiFi() { FirstRunStatus.setFirstRunFlowComplete(false); ContextMenuParams contextMenuParams = new ContextMenuParams(WebContextMenuMediaType.IMAGE,
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 04c0fe62..9035036 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-72.0.3583.0_rc-r1.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-72.0.3584.0_rc-r1.afdo.bz2 \ No newline at end of file
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParamsTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParamsTest.java index 515d993..a509c07 100644 --- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParamsTest.java +++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParamsTest.java
@@ -67,6 +67,34 @@ } /* + * Test that {@link HostBrowserLauncherParams#createWebShareTargetUriString()} can handle + * the case where both values in every pair are null. + */ + @Test + public void testCreateWebShareTargetUriStringAllNull() { + ArrayList<Pair<String, String>> params = new ArrayList<>(); + params.add(new Pair<>(null, null)); + params.add(new Pair<>(null, null)); + String uri = HostBrowserLauncherParams.createWebShareTargetUriString( + "https://www.chromium.org/wst", params); + Assert.assertEquals("https://www.chromium.org/wst", uri); + } + + /* + * Test that {@link HostBrowserLauncherParams#createWebShareTargetUriString()} can handle + * the cases where some keys in all pair are null. + */ + @Test + public void testCreateWebShareTargetUriStringAllNullWithSomeElementNotNull() { + ArrayList<Pair<String, String>> params = new ArrayList<>(); + params.add(new Pair<>("a", null)); + params.add(new Pair<>(null, "b")); + String uri = HostBrowserLauncherParams.createWebShareTargetUriString( + "https://www.chromium.org/wst", params); + Assert.assertEquals("https://www.chromium.org/wst", uri); + } + + /* * Test that {@link HostBrowserLauncherParams#createWebShareTargetUriString()} handles replacing * the query string of an action url with an existing query. */
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java index fb5c188..340aab27 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java
@@ -128,7 +128,11 @@ Uri shareUri = Uri.parse(action); Uri.Builder builder = shareUri.buildUpon(); // Uri.Builder uses %20 rather than + for spaces, the spec requires +. - builder.encodedQuery(queryBuilder.build().toString().replace("%20", "+").substring(1)); + String queryString = queryBuilder.build().toString(); + if (TextUtils.isEmpty(queryString)) { + return action; + } + builder.encodedQuery(queryString.replace("%20", "+").substring(1)); return builder.build().toString(); }
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 775b978..ffbe7fb 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -98,6 +98,7 @@ <translation id="1137673463384776352">Open link in <ph name="APP" /></translation> <translation id="1140351953533677694">Access your Bluetooth and Serial devices</translation> <translation id="1140610710803014750">To get your bookmarks on all your devices, sign in and turn on sync.</translation> +<translation id="1140746652461896221">Block content on any page that you visit</translation> <translation id="1143142264369994168">Certificate Signer</translation> <translation id="1145292499998999162">Plug-in blocked</translation> <translation id="1145532888383813076">Search your device, apps and web.</translation> @@ -374,6 +375,7 @@ <translation id="1526560967942511387">Untitled Document</translation> <translation id="1529116897397289129">Saved cards will appear here</translation> <translation id="1529891865407786369">Power source</translation> +<translation id="1529899284660134226">Manage shared files and folders</translation> <translation id="1530838837447122178">Open mouse and touchpad device settings</translation> <translation id="1531004739673299060">Application Window</translation> <translation id="15373452373711364">Large mouse cursor</translation> @@ -515,6 +517,7 @@ <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> <translation id="1731911755844941020">Sending request...</translation> <translation id="1732215134274276513">Unpin Tabs</translation> +<translation id="1733383495376208985">Encrypt synced data with your own <ph name="BEGIN_LINK" />sync passphrase<ph name="END_LINK" />. This doesn't include payment methods and addresses from Google Pay.</translation> <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> may not be able to keep itself updated</translation> <translation id="1736419249208073774">Explore</translation> <translation id="1736827427463982819">Shut down Linux (Beta)</translation> @@ -943,6 +946,7 @@ <translation id="2378075407703503998"><ph name="SELCTED_FILE_COUNT" /> files selected</translation> <translation id="237828693408258535">Translate this page?</translation> <translation id="2378982052244864789">Select the extension directory.</translation> +<translation id="2379232090534544565">A site is accessing audio and video input</translation> <translation id="2379281330731083556">Print using system dialogue... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Ask before sending (recommended)</translation> <translation id="2384436799579181135">An error has occurred. Please check your printer and try again.</translation> @@ -956,6 +960,8 @@ <translation id="2408955596600435184">Enter your PIN</translation> <translation id="241082044617551207">Unknown plug-in</translation> <translation id="2413749388954403953">Change the bookmarks user interface</translation> +<translation id="241727068219398187">Data was encrypted with your Google password as of + <ph name="TIME" />. This doesn't include payment methods and addresses from Google Pay.</translation> <translation id="2419706071571366386">For security, sign out when your computer isn't being used.</translation> <translation id="2422426094670600218"><unnamed></translation> <translation id="2423578206845792524">Sa&ve image as...</translation> @@ -1306,6 +1312,7 @@ <translation id="2925966894897775835">Sheets</translation> <translation id="2926085873880284723">Restore default shortcuts</translation> <translation id="2927017729816812676">Cache Storage</translation> +<translation id="2932085390869194046">Suggest password...</translation> <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Account for kids)</translation> <translation id="2932483646085333864">Sign out then sign in again to start sync</translation> <translation id="2932883381142163287">Report abuse</translation> @@ -1342,6 +1349,7 @@ <translation id="2993517869960930405">App Info</translation> <translation id="2994669386200004489">Couldn't back up <ph name="FILE_NAME" /></translation> <translation id="299483336428448530">Installed by your parent.</translation> +<translation id="2996286169319737844">Data is encrypted with your sync passphrase. This doesn't include payment methods and addresses from Google Pay.</translation> <translation id="3002017044809397427">Found your <ph name="PHONE_TYPE" />. But Smart Lock only works on devices with Android 5.0 and up. <a>Learn more</a></translation> <translation id="3003144360685731741">Preferred networks</translation> <translation id="3003623123441819449">CSS Cache</translation> @@ -1463,6 +1471,7 @@ <translation id="316854673539778496">To get all your extensions on all your devices, sign in and turn on sync.</translation> <translation id="3169472444629675720">Discover</translation> <translation id="3170072451822350649">You may also skip signing in and <ph name="LINK_START" />browse as Guest<ph name="LINK_END" />.</translation> +<translation id="3172045848207518317">A site is accessing video input</translation> <translation id="3177909033752230686">Page language:</translation> <translation id="3182749001423093222">Spell check</translation> <translation id="3183139917765991655">Profile Importer</translation> @@ -1643,6 +1652,7 @@ <translation id="3461266716147554923"><ph name="URL" /> wants to see text and images copied to the clipboard</translation> <translation id="3462311546193741693">Signs you out of most sites. You'll stay signed in to your Google Account so that your synced data can be cleared.</translation> <translation id="3462413494201477527">Cancel account setup?</translation> +<translation id="3464012987031883895">A site is accessing audio input</translation> <translation id="346431825526753">This is an account for kids managed by <ph name="CUSTODIAN_EMAIL" />.</translation> <translation id="3466147780910026086">Scanning your media device...</translation> <translation id="3467267818798281173">Ask Google for suggestions</translation> @@ -2029,6 +2039,7 @@ <translation id="3994878504415702912">&Zoom</translation> <translation id="3995138139523574647">USB-C device (right-hand-side back port)</translation> <translation id="4002066346123236978">Title</translation> +<translation id="4002440992267487163">Pin setup</translation> <translation id="40027638859996362">Word move</translation> <translation id="4005817994523282006">Time zone detection method</translation> <translation id="4008291085758151621">Site information is not available in VR</translation> @@ -2259,6 +2270,7 @@ <translation id="4412698727486357573">Help Centre</translation> <translation id="44141919652824029">Allow '<ph name="APP_NAME" />' to get the list of your attached USB devices?</translation> <translation id="4414232939543644979">New &Incognito Window</translation> +<translation id="4415245286584082850">No devices found. Open a help centre article in a new tab.</translation> <translation id="4415748029120993980">SECG elliptic curve secp384r1 (aka NIST P-384)</translation> <translation id="4416582610654027550">Type a valid URL</translation> <translation id="4419409365248380979">Always allow <ph name="HOST" /> to set cookies</translation> @@ -2323,6 +2335,7 @@ <translation id="452039078290142656">unknown devices from <ph name="VENDOR_NAME" /></translation> <translation id="4522570452068850558">Details</translation> <translation id="4522600456902129422">Continue allowing this site to see the clipboard</translation> +<translation id="4525382759303819021">Get the latest updates and recommendations on Play Store apps</translation> <translation id="4530494379350999373">Origin</translation> <translation id="4533985347672295764">CPU Time</translation> <translation id="4534661889221639075">Try again.</translation> @@ -2459,6 +2472,7 @@ <translation id="4733082559415072992"><ph name="URL" /> wants to use your device's location</translation> <translation id="4733793249294335256">Location</translation> <translation id="4734518477988699048">Input value is invalid.</translation> +<translation id="4735265153267957659">Enter your password to enable Smart Lock. Next time, your phone will unlock your <ph name="DEVICE_TYPE" />. Turn off Smart Lock in Settings.</translation> <translation id="473546211690256853">This account is managed by <ph name="DOMAIN" /></translation> <translation id="4737715515457435632">Please connect to a network</translation> <translation id="473775607612524610">Update</translation> @@ -2479,6 +2493,7 @@ <translation id="4762718786438001384">Device disk space critically low</translation> <translation id="4763408175235639573">The following cookies were set when you viewed this page</translation> <translation id="4763830802490665879">Cookies from multiple sites will be cleared on exit.</translation> +<translation id="4765582662863429759">Allows Android Messages to relay texts from your phone to your Chromebook</translation> <translation id="4768332406694066911">You have certificates from these organisations that identify you</translation> <translation id="4772404146526168240">Both screens</translation> <translation id="4776917500594043016">Password for <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -3028,6 +3043,7 @@ <translation id="554517032089923082">GTC</translation> <translation id="5546865291508181392">Find</translation> <translation id="5551573675707792127">Keyboard and text input</translation> +<translation id="5552059560155071882">CUPS IPP Parser</translation> <translation id="5553089923092577885">Certificate Policy Mappings</translation> <translation id="5554489410841842733">This icon will be visible when the extension can act on the current page.</translation> <translation id="5554720593229208774">Email Certification Authority</translation> @@ -3190,8 +3206,10 @@ <translation id="5787146423283493983">Key Agreement</translation> <translation id="5788127256798019331">Play files</translation> <translation id="5788367137662787332">Sorry, at least one partition on the device <ph name="DEVICE_LABEL" /> could not be mounted.</translation> +<translation id="5793339252089865437">If you download the update over your mobile network, it could result in overage charges.</translation> <translation id="5794414402486823030">Always open with system viewer</translation> <translation id="5794786537412027208">Quit all Chrome Apps</translation> +<translation id="5799508265798272974">Linux Virtual Machine: <ph name="LINUX_VM_NAME" /></translation> <translation id="5800020978570554460">Destination file was truncated or removed since last download.</translation> <translation id="5801568494490449797">Preferences</translation> <translation id="5804241973901381774">Permissions</translation> @@ -3866,6 +3884,7 @@ <translation id="6805038906417219576">OK</translation> <translation id="6805647936811177813">Please sign in to <ph name="TOKEN_NAME" /> to import client certificate from <ph name="HOST_NAME" />.</translation> <translation id="680572642341004180">Enable RLZ tracking on <ph name="SHORT_PRODUCT_OS_NAME" />.</translation> +<translation id="6806699711453372963">Manage Linux sharing</translation> <translation id="6807889908376551050">Show All...</translation> <translation id="6810613314571580006">Automatically sign in to websites using stored credentials. When the feature is disabled, you will be asked for confirmation every time before signing in to a website.</translation> <translation id="6810768462515084623">Oops! Looks like your password has expired. Please renew it on another device and try again.</translation> @@ -3937,6 +3956,7 @@ <translation id="6921709132208495314">Stop using data on this page</translation> <translation id="6922128026973287222">Save data and browse faster using Google Data Saver. Click to learn more.</translation> <translation id="6923132443355966645">Scroll/Click</translation> +<translation id="6923633482430812883">Error mounting share. Please check that the file server that you are connecting to supports SMBv2 or later.</translation> <translation id="6930242544192836755">Duration</translation> <translation id="6934241953272494177">Scanning your media device… <ph name="LINE_BREAK1" /> @@ -4055,6 +4075,7 @@ <translation id="7093434536568905704">GTK+</translation> <translation id="7093866338626856921">Exchange data with the devices named: <ph name="HOSTNAMES" /></translation> <translation id="7096406577040705016">Toggle Fullscreen Magnifier</translation> +<translation id="7096857570999173890">You can use your PIN to unlock your device when you are signed out.</translation> <translation id="7098389117866926363">USB-C device (left port in the back)</translation> <translation id="7098447629416471489">Other saved search engines will appear here</translation> <translation id="7099337801055912064">Can’t load large PPD. Maximum size is 250 KB.</translation> @@ -4749,6 +4770,8 @@ <translation id="8117620576188476503">Manage connections, updates and settings with the status tray. To get here by keyboard, press Alt + Shift + S.</translation> <translation id="8118362518458010043">Disabled by Chrome. This extension may be unsafe.</translation> <translation id="8118860139461251237">Manage your downloads</translation> +<translation id="8123590694679414600">Data was encrypted with your sync passphrase on + <ph name="TIME" />. This doesn't include payment methods and addresses from Google Pay.</translation> <translation id="81238879832906896">Yellow and white flower</translation> <translation id="8124313775439841391">Managed ONC</translation> <translation id="813082847718468539">View site information</translation> @@ -5156,6 +5179,7 @@ <translation id="8758418656925882523">Enable dictation (speak to type)</translation> <translation id="8759408218731716181">Can't set up multiple sign-in</translation> <translation id="8759753423332885148">Learn more.</translation> +<translation id="8762886931014513155">Your <ph name="DEVICE_TYPE" /> needs an update</translation> <translation id="8767621466733104912">Automatically update Chrome for all users</translation> <translation id="8770406935328356739">Extension root directory</translation> <translation id="8770507190024617908">Manage People</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 2724b7b..6a9f1075 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -616,7 +616,7 @@ <translation id="1875387611427697908">આ ફક્ત <ph name="CHROME_WEB_STORE" />માંથી જ ઉમેરી શકાશે</translation> <translation id="1877520246462554164">પ્રમાણીકરણ ટોકન મેળવવામાં નિષ્ફળ થયાં. કૃપા કરીને ફરીથી પ્રયાસ કરવા સાઇન આઉટ કરો પછી ફરીથી સાઇન ઇન કરો.</translation> <translation id="1878302395768190018">Chrome સેટિંગમાં તમે આને કોઈપણ સમયે કસ્ટમાઇઝ કરી શકો છો</translation> -<translation id="1879000426787380528">તરીકે સાઇન ઇન કરો</translation> +<translation id="1879000426787380528">આ એકાઉન્ટથી સાઇન ઇન કરો</translation> <translation id="1880905663253319515">પ્રમાણપત્ર "<ph name="CERTIFICATE_NAME" />" કાઢી નાખીએ?</translation> <translation id="1886996562706621347">પ્રોટોકૉલ્સ માટે ડિફૉલ્ટ હેન્ડલર્સ બનવા માટે સાઇટને પૂછવાની મંજૂરી આપો (ભલામણ કરેલ)</translation> <translation id="1887442540531652736">સાઇન-ઇનમાં ભૂલ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 692312ad..8aea814 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -15,6 +15,7 @@ <translation id="1016566241875885511">अतिरिक्त जानकारी (वैकल्पिक)</translation> <translation id="1017280919048282932">शब्दकोश में &जोड़ें</translation> <translation id="1018656279737460067">रद्द</translation> +<translation id="1023873740278604399">अपने फ़िंगरप्रिंट के सभी अलग-अलग हिस्सों को जोड़ने के लिए अपनी उंगली को धीरे से हिलाएं.</translation> <translation id="1026822031284433028">चित्र लोड करें</translation> <translation id="1029317248976101138">ज़ूम</translation> <translation id="1030706264415084469"><ph name="URL" /> आपके डिवाइस पर हमेशा के लिए बड़ी मात्रा में डेटा संग्रहीत करना चाहता है</translation> @@ -62,6 +63,7 @@ <translation id="1085697365578766383">वर्चुअल मशीन शुरू करने में गड़बड़ी हुई. कृपया फिर से कोशिश करें.</translation> <translation id="1089439967362294234">पासवर्ड बदलें</translation> <translation id="1090126737595388931">कोई पृष्ठभूमि ऐप्स चालू नहीं है</translation> +<translation id="1090918500949388876">स्क्रीन चालू होने पर कभी भी "OK Google" बोलें और अपनी Assistant सेवा एक्सेस करें</translation> <translation id="1091767800771861448">छोड़ने के लिए ESCAPE दबाएं (केवल गैर-आधिकारिक बिल्ड).</translation> <translation id="1093457606523402488">दृश्यमान नेटवर्क:</translation> <translation id="1094607894174825014">पढ़ें या लिखें संचालन का अनुरोध किसी अमान्य ऑफ़सेट के साथ इस पर किया गया था: "<ph name="DEVICE_NAME" />".</translation> @@ -87,6 +89,7 @@ <translation id="1123187597739372905">सिंक सेटिंग दिखाएं</translation> <translation id="1124772482545689468">उपयोगकर्ता</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> जैसा लगता है (मूल)</translation> +<translation id="1127216846847548354">बोलकर चालू करना</translation> <translation id="1128109161498068552">किसी भी साइट को MIDI डिवाइस को एक्सेस करने के लिए सिस्टम अनन्य संदेशों का उपयोग न करने दें.</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">खोज इंजन संपादित करें</translation> @@ -415,6 +418,7 @@ <translation id="1598233202702788831">आपके व्यवस्थापक के द्वारा अपडेट अक्षम किए गए हैं</translation> <translation id="1600857548979126453">पेज डीबगर बैकएंड तक पहुंचें</translation> <translation id="1601560923496285236">लागू करें</translation> +<translation id="1603300902586586390">Linux ऐप्लिकेशन को $1 फ़ाइलें खोलने दें.</translation> <translation id="1603914832182249871">(गुप्त)</translation> <translation id="1607139524282324606">प्रविष्टि हटाएं</translation> <translation id="1608626060424371292">इस उपयोगकर्ता को हटाएं</translation> @@ -479,6 +483,7 @@ <translation id="1680849702532889074">आपका Linux ऐप्लिकेशन इंस्टॉल करते समय कोई गड़बड़ी हुई.</translation> <translation id="16815041330799488">साइटों को क्लिपबोर्ड पर कॉपी किए गए लेख और इमेज न देखने दें</translation> <translation id="1682548588986054654">नई &गुप्त विंडो</translation> +<translation id="1683850629661177840">'लाइट मोड' में अब सभी पेज तेज़ी से ब्राउज़ किए जा सकते हैं. इनमें HTTPS भी शामिल हैं.</translation> <translation id="168715261339224929">अपने सभी डिवाइस पर अपने बुकमार्क पाने के लिए, सिंक चालू करें.</translation> <translation id="1688867105868176567">'साइट डेटा' हटाएं?</translation> <translation id="1688935057616748272">कोई अक्षर लिखें</translation> @@ -574,6 +579,7 @@ <translation id="1818007989243628752"><ph name="USERNAME" /> का पासवर्ड मिटाएं</translation> <translation id="1818913467757368489">लॉग अपलोड हो रहा है.</translation> <translation id="1819721979226826163">ऐप्लिकेशन सूचनाएं > Google Play सेवाएं पर टैप करें.</translation> +<translation id="1820028137326691631">एडमिन का दिया हुआ पासवर्ड डालें</translation> <translation id="1826516787628120939">जाँच की जा रही है</translation> <translation id="1828378091493947763">यह प्लग इन इस डिवाइस पर समर्थित नहीं है</translation> <translation id="1828901632669367785">सिस्टम डॉयलॉग का उपयोग करके प्रिंट करें…</translation> @@ -608,11 +614,13 @@ <translation id="1865769994591826607">केवल समान-साइट कनेक्शन</translation> <translation id="186612162884103683">"<ph name="EXTENSION" />" चेक किए गए स्थानों में चित्रों, वीडियो, और ध्वनि फ़ाइलों को पढ़ और लिख सकता है.</translation> <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> आपकी स्थापना पूर्ण करने के लिए तैयार है</translation> +<translation id="1868193363684582383">"Ok Google"</translation> <translation id="1871615898038944731">आपका <ph name="DEVICE_TYPE" /> अप टू डेट है</translation> <translation id="1875312262568496299">शुरू करें</translation> <translation id="1875387611427697908">इसे केवल <ph name="CHROME_WEB_STORE" /> से ही जोड़ा जा सकता है</translation> <translation id="1877520246462554164">प्रमाणीकरण टोकन नहीं पा सके. दोबारा कोशिश करने के लिए कृपया साइन आउट करें उसके बाद फिर से साइन इन करें.</translation> <translation id="1878302395768190018">आप किसी भी समय Chrome सेटिंग में जाकर इसे अपनी पसंद के मुताबिक बना सकते हैं</translation> +<translation id="1879000426787380528">इस रूप में साइन इन करें</translation> <translation id="1880905663253319515">प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" हटाएं?</translation> <translation id="1886996562706621347">साइटों को प्रोटोकॉल के लिए डिफ़ॉल्ट हैंडलर बनने के लिए पूछने देने की अनुमति दें (सुझाव)</translation> <translation id="1887442540531652736">साइन-इन गड़बड़ी</translation> @@ -820,11 +828,13 @@ <translation id="220858061631308971">कृपया इस पिन कोड को "<ph name="DEVICE_NAME" />" पर दर्ज करें:</translation> <translation id="2209593327042758816">अलमारी आइटम 2</translation> <translation id="2212126039311489237">सिस्टम संवाद का इस्तेमाल करके प्रिंट करें</translation> +<translation id="2214884991347062907">पासवर्ड गलत है. फिर से कोशिश करें</translation> <translation id="2217501013957346740">कोई नाम बनाएं -</translation> <translation id="2218019600945559112">माउस और टचपैड</translation> <translation id="2218320521449013367">जिस समय Chrome नुकसान पहुंचाने वाला सॉफ़्टवेयर हटा रहा था, तब कोई गड़बड़ी हुई</translation> <translation id="2218515861914035131">सादे टेक्स्ट के रूप में चिपकाएं</translation> <translation id="221872881068107022">उलट स्क्रोलिंग</translation> +<translation id="2220409419896228519">अपने पसंदीदा Google ऐप्लिकेशन के बुकमार्क जोड़ें</translation> <translation id="2220529011494928058">किसी समस्या की रिपोर्ट करें</translation> <translation id="2220572644011485463">पिन या पासवर्ड</translation> <translation id="2224444042887712269">यह सेटिंग <ph name="OWNER_EMAIL" /> से संबंधित है.</translation> @@ -927,6 +937,7 @@ <translation id="2367972762794486313">ऐप्स दिखाएं</translation> <translation id="2369536625682139252">कुकी को छोड़कर, <ph name="SITE" /> का स्टोर किया हुआ सारा डेटा मिटा दिया जाएगा.</translation> <translation id="2371076942591664043">&पू्र्ण होने पर खोलें</translation> +<translation id="2375406435414127095">अपने फ़ोन से जोड़ें</translation> <translation id="2377319039870049694">'सूची की तरह देखें' पर स्विच करें</translation> <translation id="2377667304966270281">हार्ड फ़ॉल्ट</translation> <translation id="2378075407703503998"><ph name="SELCTED_FILE_COUNT" /> फ़ाइलें चयनित</translation> @@ -1180,6 +1191,7 @@ <translation id="2749881179542288782">वर्तनी के साथ व्याकरण की जाँच करें</translation> <translation id="2751739896257479635">EAP चरण 2 प्रमाणीकरण</translation> <translation id="2755367719610958252">एक्सेस-योग्यता सुविधाएं प्रबंधित करें</translation> +<translation id="2755628026949580719">अगर आपकी 'सुरक्षा चाबी' सूची में नहीं है, तो चाबी पर दिए गए बटन को पांच सेकंड तक दबाकर रखें.</translation> <translation id="275662540872599901">स्क्रीन बंद है</translation> <translation id="2761898608071930085">किसी दूसरे खाते का इस्तेमाल करें</translation> <translation id="2762441749940182211">कैमरा ब्लॉक किया गया है</translation> @@ -1245,6 +1257,7 @@ <translation id="2850124913210091882">बैक अप लें</translation> <translation id="2850541429955027218">थीम जोड़ें</translation> <translation id="2853916256216444076">$1 वीडियो</translation> +<translation id="2859806420264540918">इस साइट में तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं.</translation> <translation id="2860150991415616761">बहुत लंबा समय (4 सेकंड)</translation> <translation id="2861301611394761800">सिस्टम अपडेट पूर्ण. कृपया सिस्टम फिर से प्रारंभ करें.</translation> <translation id="2861941300086904918">नेटिव क्लाइंट सुरक्षा प्रबंधक</translation> @@ -1455,6 +1468,7 @@ <translation id="3182749001423093222">वर्तनी परीक्षण</translation> <translation id="3183139917765991655">प्रोफ़ाइल आयातकर्ता</translation> <translation id="3184560914950696195">$1 पर नहीं सहेजी जा सकती. संपादित चित्र, डाउनलोड फ़ोल्डर में सहेजी जाएंगी.</translation> +<translation id="3186202398303525187">Linux ऐप्लिकेशन को $1 खोलने दें.</translation> <translation id="3188257591659621405">मेरी फ़ाइलें</translation> <translation id="3188465121994729530">गतिशील औसत</translation> <translation id="3190558889382726167">पासवर्ड सहेजा गया</translation> @@ -1635,6 +1649,7 @@ <translation id="3467267818798281173">सुझावों के लिए Google से पूछें</translation> <translation id="3468275649641751422">कोई वीडियो या ऑडियो फ़ाइल स्ट्रीम करें</translation> <translation id="3468522857997926824"><ph name="FILE_COUNT" /> फ़ोटो का <ph name="BEGIN_LINK" />Google डिस्क<ph name="END_LINK" /> में बैक अप लिया गया</translation> +<translation id="3468999815377931311">Android फ़ोन</translation> <translation id="3470442499439619530">इस उपयोगकर्ता को हटाएं</translation> <translation id="3470502288861289375">कॉपी किया जा रहा है...</translation> <translation id="3473479545200714844">स्क्रीन आवर्द्धक</translation> @@ -1659,6 +1674,7 @@ <translation id="3495660573538963482">Google Assistant सेटिंग</translation> <translation id="3496213124478423963">ज़ूम आउट</translation> <translation id="3505030558724226696">डिवाइस एक्सेस निरस्त करें</translation> +<translation id="3506093155988721483">अपनी Assistant सेवा चालू करते समय कीबोर्ड के बजाय आवाज़ का इस्तेमाल करें</translation> <translation id="3507421388498836150">"<ph name="EXTENSION_NAME" />" के लिए वर्तमान अनुमतियां</translation> <translation id="3507547268929739059">Chromebook के लिए Linux ऐप्लिकेशन हटाएं</translation> <translation id="3507888235492474624">ब्लूटूथ डिवाइस के लिए दोबारा स्कैन करें</translation> @@ -1801,6 +1817,7 @@ <translation id="370415077757856453">JavaScript को ब्लॉक किया गया</translation> <translation id="3704331259350077894">कार्रवाई का अंत</translation> <translation id="3705722231355495246">-</translation> +<translation id="3706463572498736864">हर शीट पर मौजूद पेज की संख्या</translation> <translation id="370665806235115550">लोड हो रही हैं...</translation> <translation id="3709244229496787112">डाउनलोड पूर्ण होने से पहले ही ब्राउज़र बंद हो गया था.</translation> <translation id="3711895659073496551">निलंबित</translation> @@ -2207,6 +2224,7 @@ <translation id="4345587454538109430">कॉन्फ़िगर करें...</translation> <translation id="4348766275249686434">त्रुटियां एकत्रित करें</translation> <translation id="4350019051035968019">इस डिवाइस को उस डोमेन पर नामांकित नहीं किया जा सकता जिससे आपका खाता संबंधित है क्योंकि डिवाइस को भिन्न डोमेन द्वारा प्रबंधित करने के लिए चिह्नित किया गया है.</translation> +<translation id="435527878592612277">अपनी फ़ोटो चुनें</translation> <translation id="4356334633973342967">या अपना स्वयं का ड्राइवर निर्दिष्ट करें:</translation> <translation id="4358353773267946514"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /></translation> <translation id="4359408040881008151">निर्भर एक्सटेंशन के कारण इंस्टॉल किया गया.</translation> @@ -2267,10 +2285,12 @@ <translation id="4448844063988177157">वाई-फ़ाई नेटवर्क खोज रहा है...</translation> <translation id="4449996769074858870">यह टैब ऑडियो चला रहा है.</translation> <translation id="4450974146388585462">निदान करें</translation> +<translation id="4451757071857432900">उन साइटों पर ब्लॉक है जिन पर तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं (सुझाव)</translation> <translation id="4453946976636652378"><ph name="SEARCH_ENGINE_NAME" /> पर खोजें या कोई यूआरएल लिखें</translation> <translation id="4462159676511157176">कस्टम नाम सर्वर</translation> <translation id="4467100756425880649">Chrome वेब स्टोर गैलरी</translation> <translation id="4467101674048705704"><ph name="FOLDER_NAME" /> विस्तृत करें</translation> +<translation id="4469477701382819144">उन साइटों पर ब्लॉक है जिन पर तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं</translation> <translation id="447252321002412580">Chrome के फ़ीचर और परफ़ॉर्मेंस को बेहतर बनाने में सहायता करें</translation> <translation id="4472575034687746823">आरंभ करें</translation> <translation id="4474155171896946103">सभी टैब बुकमार्क करें...</translation> @@ -2520,6 +2540,7 @@ <translation id="486635084936119914">कुछ निश्चित फ़ाइल प्रकारों को डाउनलोड करने के बाद उन्हें अपने आप खोलें</translation> <translation id="4869142322204669043">Google उन साइटों की सामग्री जिन पर आप जाते हैं और आपकी ब्राउज़िंग गतिविधि और इंटरैक्शन का इस्तेमाल <ph name="IDS_SHORT_PRODUCT_NAME" /> को और अनुवाद, खोज और विज्ञापनों जैसी दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए कर सकता है.</translation> <translation id="48704129375571883">अतिरिक्त सुविधाएं जोड़ें</translation> +<translation id="4870758487381879312">कॉन्फ़िगरेशन की जानकारी पाने के लिए एडमिन का दिया हुआ पासवर्ड डालें</translation> <translation id="4870903493621965035">कोई भी युग्मित डिवाइस नहीं</translation> <translation id="4871210892959306034">$एक केबी</translation> <translation id="4871308555310586478">Chrome वेब स्टोर से नहीं.</translation> @@ -2689,9 +2710,11 @@ <translation id="5108967062857032718">सेटिंग - Android ऐप्लिकेशन निकालें</translation> <translation id="5109044022078737958">मिया</translation> <translation id="5111692334209731439">&बुकमार्क प्रबंधक</translation> +<translation id="5112009661904384591">Linux के साथ फ़ाइलें शेयर करें</translation> <translation id="5112577000029535889">&डेवलपर टूल</translation> <translation id="5113739826273394829">अगर आप इस आइकॉन पर क्लिक करते हैं तो, आप इस <ph name="DEVICE_TYPE" /> को मैन्युअल रूप से लॉक कर लेंगे. अगली बार, अनलॉक करने के लिए आपको अपना पासवर्ड डालना होगा.</translation> <translation id="5115309401544567011">कृपया अपने <ph name="DEVICE_TYPE" /> को पावर स्रोत में प्लग करें.</translation> +<translation id="5115338116365931134">एसएसओ (SSO)</translation> <translation id="5116628073786783676">इस रूप में ऑडियो स&हेजें...</translation> <translation id="5117427536932535467">थीम और वॉलपेपर</translation> <translation id="5117625797180141189"><ph name="DOCUMENT_NAME" /> को सफलतापूर्वक प्रिंट किया गया</translation> @@ -2713,6 +2736,7 @@ <translation id="514575469079499857">जगह तय करने के लिए अपने आईपी पते का इस्तेमाल करें (डिफ़ॉल्ट)</translation> <translation id="5150254825601720210">Netscape प्रमाणपत्र SSL सर्वर नाम</translation> <translation id="5151354047782775295">डिस्क स्पेस खाली करें अन्यथा चयनित डेटा अपने आप हट जाएगा</translation> +<translation id="5153234146675181447">फ़ोन को भूल जाएं</translation> <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" /> के लिए अतिरिक्त सेटिंग</translation> <translation id="5154176924561037127">F8</translation> <translation id="5154702632169343078">विषय</translation> @@ -2861,6 +2885,7 @@ <translation id="5352285283572729470">यह सेटिंग प्रबंधित है</translation> <translation id="5353252989841766347">Chrome से पासवर्ड निर्यात करें</translation> <translation id="5355097969896547230">फिर से खोजें</translation> +<translation id="5355099869024327351">Assistant को आपको सूचनाएं दिखाने दें</translation> <translation id="5355926466126177564">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने यह बदल दिया है कि जब आप खोज वाली पट्टी से खोजते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> <translation id="5358764674931277">फ़्रेम दर</translation> <translation id="5360150013186312835">टूलबार में दिखाएं</translation> @@ -2974,6 +2999,7 @@ <translation id="5513242761114685513">प्रसंग मेनू</translation> <translation id="5516183516694518900">अपने बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग को अपने सभी डिवाइस पर पाने के लिए अपने Google खाते से Chrome में प्रवेश करें.</translation> <translation id="551752069230578406">अपने खाते में प्रिंटर जोड़ना - इसमें कुछ समय लग सकता है...</translation> +<translation id="5517879053351788087">अपनी उंगली से सेंसर को छुएं. वह आपके Chromebook के किनारे पर है.</translation> <translation id="5518219166343146486">जब कोई साइट क्लिपबोर्ड पर कॉपी किए गए लेख और इमेज देखना चाहे, तो इसके लिए पूछें</translation> <translation id="5518584115117143805">ईमेल सुरक्षित तरीका प्रमाणपत्र</translation> <translation id="5521078259930077036">क्या यह वही मुख्यपृष्ठ है जिसकी आप अपेक्षा कर रहे थे?</translation> @@ -3025,6 +3051,7 @@ <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation> <translation id="5582839680698949063">मुख्य मेनू</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584088138253955452">उपयोगकर्ता नाम सेव करें?</translation> <translation id="5585118885427931890">बुकमार्क फ़ोल्डर नहीं बना सका.</translation> <translation id="558563010977877295">विशिष्ट पेज या पेजों का समूह खोलें</translation> <translation id="5585912436068747822">फ़ॉर्मेटिंग विफल रही</translation> @@ -3263,6 +3290,7 @@ <translation id="5925147183566400388">प्रमाणन अभ्यास कथन पॉइंटर</translation> <translation id="592880897588170157">PDF फ़ाइलों को Chrome में अपने आप खोलने के बजाय उन्हें डाउनलोड करें</translation> <translation id="5931146425219109062">आप जिन वेबसाइट पर जाते हैं, उन पर मौजूद अपना सभी डेटा पढ़ें और बदलें</translation> +<translation id="5932224571077948991">साइट में तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं</translation> <translation id="5932881020239635062">सीरियल</translation> <translation id="5933376509899483611">समय क्षेत्र</translation> <translation id="5938002010494270685">सुरक्षा बेहतर बनाने की सुविधा मौजूद है</translation> @@ -3326,6 +3354,7 @@ <translation id="6029292188939175871">[<ph name="FINGERPRINT_NAME" />] मिटाएं बटन</translation> <translation id="6029587122245504742">सबसे धीमा</translation> <translation id="6032912588568283682">फ़ाइल सिस्टम</translation> +<translation id="6038929619733116134">अगर साइट में तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई दें तो उन्हें ब्लॉक करें</translation> <translation id="6039651071822577588">नेटवर्क गुण शब्दकोश दूषित</translation> <translation id="604001903249547235">क्लाउड बैकअप</translation> <translation id="6040143037577758943">बंद करें</translation> @@ -3336,6 +3365,7 @@ <translation id="6042308850641462728">अधिक</translation> <translation id="6043317578411397101"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> के साथ Chrome टैब को शेयर कर रहा है.</translation> <translation id="6044805581023976844"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> के साथ Chrome टैब और ऑडियो शेयर कर रहा है.</translation> +<translation id="6045021379489914695">आपका Chromebook और Android फ़ोन साथ मिलकर बेहतर काम करते हैं. उन्हें आपस में जोड़ें ताकि आप अपने कंप्यूटर से मैसेज (एसएमएस) भेज सकें, अपना इंटरनेट कनेक्शन शेयर कर सकें और अपने Chromebook को अपने फ़ोन से अनलॉक कर सकें.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="6049004884579590341">पूरी स्क्रीन से बाहर निकलने के लिए |<ph name="ACCELERATOR" />| दबाकर रखें</translation> <translation id="6049065490165456785">आंतरिक कैमरे का फ़ोटो</translation> <translation id="6051354611314852653">ओह! सिस्टम इस डिवाइस के लिए API (एपीआई) एक्सेस की मंज़ूरी नहीं दे सका.</translation> @@ -3578,6 +3608,7 @@ <translation id="641081527798843608">विषय मिलान</translation> <translation id="641105183165925463">$एक एमबी</translation> <translation id="6412931879992742813">नई गुप्त विंडो</translation> +<translation id="6415900369006735853">अपने फ़ोन पर इंटरनेट चालू करें</translation> <translation id="6417265370957905582">Google Assistant</translation> <translation id="6418160186546245112"><ph name="IDS_SHORT_PRODUCT_NAME" /> के पहले से इंस्टॉल किए गए संस्करण पर वापस लाना</translation> <translation id="6418481728190846787">सभी ऐप्स की एक्सेस स्थायी रूप से निकालें</translation> @@ -3682,6 +3713,7 @@ <translation id="656293578423618167">फ़ाइल पथ या नाम बहुत बड़ा है. कृपया छोटे नाम के साथ या किसी अन्य स्थान पर सहेजें.</translation> <translation id="656398493051028875">"<ph name="FILENAME" />" हटा रहा है...</translation> <translation id="6567688344210276845">पेज कार्रवाई के लिए '<ph name="ICON" />' आइकॉन लोड नहीं किया जा सका.</translation> +<translation id="6571979863037191371">अपने फ़ोन को अपने Chromebook से डिसकनेक्ट करें. अब वे अपने आप नहीं जुड़ेंगे.</translation> <translation id="657402800789773160">&यह पेज फिर से लोड करें</translation> <translation id="6577284282025554716">डाउनलोड रोका गया: <ph name="FILE_NAME" /></translation> <translation id="6578664922716508575">सिंक किए गए पासवर्ड अपने Google उपयोगकर्ता नाम और पासवर्ड से एन्क्रिप्ट करें</translation> @@ -3867,6 +3899,7 @@ <translation id="6853388645642883916">अपडेटर निष्क्रिय</translation> <translation id="68541483639528434">अन्य टैब बंद करें</translation> <translation id="6856623341093082836">अपनी टचस्क्रीन की सटीकता सेट करें और एडजस्ट करें</translation> +<translation id="6857699260879628349">कॉन्फ़िगरेशन की जानकारी पाएं</translation> <translation id="6860097299815761905">प्रॉक्सी सेटिंग...</translation> <translation id="6860427144121307915">टैब में खोलें</translation> <translation id="6862635236584086457">इस फ़ोल्डर में सहेजी गई सभी फ़ाइलों का अपने आप ऑनलाइन बैकअप लिया जाता है</translation> @@ -3919,6 +3952,7 @@ <translation id="6950627417367801484">ऐप्लिकेशन बहाल करें</translation> <translation id="6950943362443484797">हम आपके लिए वह ऐप्लिकेशन इंस्टॉल करेंगे</translation> <translation id="6951153907720526401">भुगतान हैंडलर</translation> +<translation id="6953878494808481632">मिलती-जुलती जानकारी</translation> <translation id="6955446738988643816">पॉपअप का निरीक्षण करें</translation> <translation id="6957231940976260713">सेवा का नाम</translation> <translation id="696203921837389374">मोबाइल डेटा पर समन्वयन सक्षम करें</translation> @@ -4132,6 +4166,7 @@ <translation id="7256710573727326513">टैब में खोलें</translation> <translation id="725758059478686223">प्रिंटिंग सेवा</translation> <translation id="7257666756905341374">कॉपी बनाया और चिपकाया जाने वाला डेटा पढ़ें</translation> +<translation id="7258619945375359543">Assistant को अपनी स्क्रीन पर मौजूद सामग्री के आधार पर सुझाव देने दें</translation> <translation id="7258697411818564379">आपका पिन जोड़ दिया गया है</translation> <translation id="7262004276116528033">यह प्रवेश सेवा <ph name="SAML_DOMAIN" /> द्वारा होस्ट की गई है</translation> <translation id="7268365133021434339">टैब बंद करें</translation> @@ -4196,6 +4231,7 @@ <translation id="7360233684753165754"><ph name="PRINTER_NAME" /> पर <ph name="PAGE_NUMBER" /> पेज हैं</translation> <translation id="7361039089383199231">$1 बाइट</translation> <translation id="7361297102842600584"><ph name="PLUGIN_NAME" /> चलाने के लिए राइट-क्लिक करें</translation> +<translation id="7361537270840348817">अपने फ़ोन को अपने Chromebook से डिसकनेक्ट करें</translation> <translation id="7364796246159120393">फ़ाइल चुनें</translation> <translation id="7366415735885268578">साइट जोड़ें</translation> <translation id="7366909168761621528">ब्राउज़िंग डेटा</translation> @@ -4229,6 +4265,7 @@ <translation id="7416362041876611053">अज्ञात नेटवर्क गड़बड़ी.</translation> <translation id="7417705661718309329">Google मैप</translation> <translation id="741906494724992817">इस ऐप्स के लिए किसी विशेष अनुमति की आवश्यकता नहीं है.</translation> +<translation id="7419433794191666278">अपने Chromebook को अपने फ़ोन से जोड़ें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="7421925624202799674">पेज का स्रोत &देखें</translation> <translation id="7422192691352527311">प्राथमिकताएं...</translation> <translation id="7423098979219808738">पहले पूछें</translation> @@ -4701,6 +4738,7 @@ <translation id="8093359998839330381"><ph name="PLUGIN_NAME" /> जवाब नहीं दे रहा है</translation> <translation id="80974698889265265">पिन का मिलान नहीं हो रहा है</translation> <translation id="8101987792947961127">अगली बार रीबूट करने पर पावरवॉश आवश्यक है</translation> +<translation id="8102159139658438129">अपने जुड़े हुए फ़ोन के विकल्प देखने के लिए <ph name="LINK_BEGIN" />सेटिंग<ph name="LINK_END" /> पर जाएं</translation> <translation id="8104696615244072556">अपने <ph name="IDS_SHORT_PRODUCT_NAME" /> डिवाइस को पावरवॉश करें और पिछले वर्ज़न पर वापस लौटें.</translation> <translation id="8105368624971345109">बंद करें</translation> <translation id="8106045200081704138">मुझसे शेयर किया गया</translation> @@ -5002,6 +5040,7 @@ <translation id="8605428685123651449">SQLite मेमोरी</translation> <translation id="8606726445206553943">अपने MIDI डिवाइस का उपयोग करें</translation> <translation id="8609465669617005112">ऊपर जाएं</translation> +<translation id="8610103157987623234">फ़ॉर्मेट गलत है, कृपया फिर से कोशिश करें</translation> <translation id="8615618338313291042">गुप्त ऐप्स : <ph name="APP_NAME" /></translation> <translation id="8618141719844947886">सिंक नहीं हो रहा है</translation> <translation id="8619892228487928601"><ph name="CERTIFICATE_NAME" />: <ph name="ERROR" /></translation> @@ -5172,6 +5211,7 @@ <translation id="8846141544112579928">कीबोर्ड खोजा जा रहा है...</translation> <translation id="8846319957959474018">बुकमार्क के ज़रिए आसानी से ऐप्लिकेशन खोलें</translation> <translation id="8847988622838149491">USB</translation> +<translation id="8848561196844274665">जब आप अपने डिवाइस जोड़ते हैं, तब आप सहमति देते हैं कि आपका Chromebook ये काम कर सकता है:</translation> <translation id="8859057652521303089">अपनी भाषा चुनें:</translation> <translation id="8859174528519900719">सबफ़्रेम: <ph name="SUBFRAME_SITE" /></translation> <translation id="8860454412039442620">Excel स्प्रैडशीट</translation> @@ -5230,6 +5270,7 @@ <translation id="8944964446326379280"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> के साथ कोई विंडो शेयर कर रहा है.</translation> <translation id="8946359700442089734">डीबग करने वाली सुविधाएं इस <ph name="IDS_SHORT_PRODUCT_NAME" /> डिवाइस पर पूरी तरह सक्षम नहीं की गई थीं.</translation> <translation id="894871326938397531">गुप्त मोड छोड़ें?</translation> +<translation id="8952774786254665439">प्रिंटर के बेहतर विकल्प</translation> <translation id="895347679606913382">प्रारंभ कर रहा है...</translation> <translation id="8954952943849489823">ले जाना विफल रहा, अप्रत्याशित गड़बड़ी: $1</translation> <translation id="895586998699996576">$1 चित्र</translation> @@ -5367,6 +5408,7 @@ <translation id="9137916601698928395">लिंक को <ph name="USER" /> के रूप में खोलें</translation> <translation id="9138978632494473300">निम्न स्थानों के लिए शॉर्टकट जोड़ें:</translation> <translation id="9140067245205650184">आप एक काम नहीं करने वाले विशेषता फ़्लैग का इस्तेमाल कर रहे हैं: <ph name="BAD_FLAG" />. स्थिरता और सुरक्षा पर इससे फ़र्क पड़ेगा.</translation> +<translation id="9147304170847707004">पुष्टि करने का तरीका</translation> <translation id="9147392381910171771">&विकल्प</translation> <translation id="9148058034647219655">बाहर निकलें</translation> <translation id="9148116311817999634">सुरक्षा के लिए स्क्रीन लॉक सेट करें</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 8782608..ee46d248 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -418,7 +418,7 @@ <translation id="1598233202702788831">As atualizações foram desativadas pelo seu administrador.</translation> <translation id="1600857548979126453">Acessar back-end do depurador de página</translation> <translation id="1601560923496285236">Aplicar</translation> -<translation id="1603300902586586390">Permita que apps do Linux abram arquivos $1.</translation> +<translation id="1603300902586586390">Permita que apps do Linux abram $1 arquivos.</translation> <translation id="1603914832182249871">(Modo anônimo)</translation> <translation id="1607139524282324606">Limpar entrada</translation> <translation id="1608626060424371292">Remover este usuário</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index eac6040..860568f55 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -98,6 +98,7 @@ <translation id="1137673463384776352">Otvoriť odkaz v aplikácii <ph name="APP" /></translation> <translation id="1140351953533677694">Mať prístup k zariadeniam pripojeným cez Bluetooth a sériový port</translation> <translation id="1140610710803014750">Ak chcete získať záložky vo všetkých zariadeniach, prihláste sa a zapnite synchronizáciu.</translation> +<translation id="1140746652461896221">Blokovať obsah všetkých navštívených stránok</translation> <translation id="1143142264369994168">Podpisovateľ certifikátu</translation> <translation id="1145292499998999162">Doplnok je blokovaný</translation> <translation id="1145532888383813076">Vyhľadávajte v zariadení, aplikáciách a na webe.</translation> @@ -374,6 +375,7 @@ <translation id="1526560967942511387">Dokument bez názvu</translation> <translation id="1529116897397289129">Tu sa zobrazia uložené karty</translation> <translation id="1529891865407786369">Zdroj napájania</translation> +<translation id="1529899284660134226">Spravovať zdieľané súbory a priečinky</translation> <translation id="1530838837447122178">Otvoriť nastavenia myši a touchpadu</translation> <translation id="1531004739673299060">Okno aplikácie</translation> <translation id="15373452373711364">Veľký kurzor myši</translation> @@ -515,6 +517,7 @@ <translation id="1731589410171062430">Celkom: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> <translation id="1731911755844941020">Posielanie požiadavky...</translation> <translation id="1732215134274276513">Odopnúť karty</translation> +<translation id="1733383495376208985">Šifrovať synchronizované údaje pomocou vlastnej <ph name="BEGIN_LINK" />prístupovej frázy synchronizácie<ph name="END_LINK" />. Nezahŕňa to spôsoby platby ani adresy zo služby Google Pay.</translation> <translation id="1734824808160898225">Prehliadač <ph name="PRODUCT_NAME" /> sa sám nemusí pravidelne aktualizovať</translation> <translation id="1736419249208073774">Preskúmať</translation> <translation id="1736827427463982819">Vypnúť Linux (beta)</translation> @@ -944,6 +947,7 @@ <translation id="2378075407703503998">Počet vybratých súborov: <ph name="SELCTED_FILE_COUNT" /></translation> <translation id="237828693408258535">Preložiť túto stránku?</translation> <translation id="2378982052244864789">Vybrať adresár rozšírenia.</translation> +<translation id="2379232090534544565">Nejaký web má prístup k zvukovému vstupu a vstupu videa</translation> <translation id="2379281330731083556">Tlačiť pomocou dialógového okna systému... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Spýtať sa pred odoslaním (odporúčané)</translation> <translation id="2384436799579181135">Vyskytla sa chyba. Skontrolujte tlačiareň a skúste to znova.</translation> @@ -957,6 +961,7 @@ <translation id="2408955596600435184">Zadajte kód PIN</translation> <translation id="241082044617551207">Neznámy doplnok</translation> <translation id="2413749388954403953">Zmeniť používateľské rozhranie záložiek</translation> +<translation id="241727068219398187">Údaje boli <ph name="TIME" /> zašifrované pomocou vášho hesla Google. Nezahŕňa to spôsoby platby ani adresy zo služby Google Pay.</translation> <translation id="2419706071571366386">Keď počítač nepoužívate, z bezpečnostných dôvodov sa odhláste.</translation> <translation id="2422426094670600218"><bez názvu></translation> <translation id="2423578206845792524">Uložiť &obrázok ako...</translation> @@ -1307,6 +1312,7 @@ <translation id="2925966894897775835">Tabuľky</translation> <translation id="2926085873880284723">Obnoviť predvolené skratky</translation> <translation id="2927017729816812676">Úložisko vyrovnávacej pamäte</translation> +<translation id="2932085390869194046">Navrhnúť heslo…</translation> <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (detský účet)</translation> <translation id="2932483646085333864">Ak chcete spustiť synchronizáciu, odhláste sa a potom sa znova prihláste</translation> <translation id="2932883381142163287">Nahlásiť zneužitie</translation> @@ -1343,6 +1349,7 @@ <translation id="2993517869960930405">Informácie o aplikácii</translation> <translation id="2994669386200004489"><ph name="FILE_NAME" /> sa nepodarilo zálohovať</translation> <translation id="299483336428448530">Nainštalované vaším rodičom</translation> +<translation id="2996286169319737844">Údaje sú šifrované pomocou vašej prístupovej frázy synchronizácie. Nezahŕňa to spôsoby platby ani adresy zo služby Google Pay.</translation> <translation id="3002017044809397427">Našli sme vaše zariadenie <ph name="PHONE_TYPE" />. Funkcia Smart Lock však funguje iba na zariadeniach s Androidom verzie 5.0 a novšej. <a>Ďalšie informácie</a></translation> <translation id="3003144360685731741">Preferované siete</translation> <translation id="3003623123441819449">Vyrovnávacia pamäť CSS</translation> @@ -1464,6 +1471,7 @@ <translation id="316854673539778496">Ak chcete získať svoje rozšírenia vo všetkých zariadeniach, prihláste sa a zapnite synchronizáciu.</translation> <translation id="3169472444629675720">Discover</translation> <translation id="3170072451822350649">Môžete tiež preskočiť prihlásenie a <ph name="LINK_START" />prehliadať ako hosť<ph name="LINK_END" />.</translation> +<translation id="3172045848207518317">Nejaký web má prístup k vstupu videa</translation> <translation id="3177909033752230686">Jazyk stránky:</translation> <translation id="3182749001423093222">Kontrola pravopisu</translation> <translation id="3183139917765991655">Profile Importer</translation> @@ -1644,6 +1652,7 @@ <translation id="3461266716147554923">Web <ph name="URL" /> chce získať prístup k textu a obrázkom pridaným do schránky</translation> <translation id="3462311546193741693">Odhlási vás z väčšiny webov, ale nie z účtu Google, takže sa synchronizované dáta budú dať vymazať.</translation> <translation id="3462413494201477527">Zrušiť založenie účtu?</translation> +<translation id="3464012987031883895">Nejaký web má prístup k zvukovému vstupu</translation> <translation id="346431825526753">Toto je detský účet spravovaný používateľom <ph name="CUSTODIAN_EMAIL" />.</translation> <translation id="3466147780910026086">Prehľadáva sa mediálne zariadenie...</translation> <translation id="3467267818798281173">Žiadať návrhy od spoločnosti Google</translation> @@ -2030,6 +2039,7 @@ <translation id="3994878504415702912">&Lupa</translation> <translation id="3995138139523574647">zariadenia USB-C (port vpravo vzadu)</translation> <translation id="4002066346123236978">Názov</translation> +<translation id="4002440992267487163">Nastavenie kódu PIN</translation> <translation id="40027638859996362">Presunutie slova</translation> <translation id="4005817994523282006">Metóda zisťovania časového pásma</translation> <translation id="4008291085758151621">Informácie o webe nie sú v režime VR k dispozícii</translation> @@ -2260,6 +2270,7 @@ <translation id="4412698727486357573">Centrum pomoci</translation> <translation id="44141919652824029">Povoliť aplikácii <ph name="APP_NAME" /> získať zoznam pripojených zariadení USB?</translation> <translation id="4414232939543644979">Nové okno &inkognito</translation> +<translation id="4415245286584082850">Nenašli sa žiadne zariadenia. Otvorte článok centra pomoci na novej karte.</translation> <translation id="4415748029120993980">Eliptická krivka SECG secp384r1 (známa tiež ako NIST P-384)</translation> <translation id="4416582610654027550">Zadajte platnú webovú adresu</translation> <translation id="4419409365248380979">Vždy povoliť prehliadaču <ph name="HOST" /> nastavovať súbory cookie</translation> @@ -2324,6 +2335,7 @@ <translation id="452039078290142656">neznáme zariadenia od dodávateľa <ph name="VENDOR_NAME" /></translation> <translation id="4522570452068850558">Podrobnosti</translation> <translation id="4522600456902129422">Tomuto webu aj naďalej povoľovať zobrazenie schránky</translation> +<translation id="4525382759303819021">Získavať najaktuálnejšie informácie a odporúčania týkajúce sa aplikácií Obchodu Play</translation> <translation id="4530494379350999373">Pôvod</translation> <translation id="4533985347672295764">Čas využitia procesora</translation> <translation id="4534661889221639075">Skúste to znova.</translation> @@ -2460,6 +2472,7 @@ <translation id="4733082559415072992"><ph name="URL" /> chce použiť polohu vášho zariadenia</translation> <translation id="4733793249294335256">Umiestnenie</translation> <translation id="4734518477988699048">Hodnota vstupu je neplatná.</translation> +<translation id="4735265153267957659">Aktivujte Smart Lock zadaním hesla. Zariadenie <ph name="DEVICE_TYPE" /> nabudúce odomknete telefónom. Smart Lock vypnete v Nastaveniach.</translation> <translation id="473546211690256853">Tento účet spravuje doména <ph name="DOMAIN" />.</translation> <translation id="4737715515457435632">Pripojte sa k sieti</translation> <translation id="473775607612524610">Aktualizovať</translation> @@ -2480,6 +2493,7 @@ <translation id="4762718786438001384">Kritický nedostatok miesta na disku zariadenia</translation> <translation id="4763408175235639573">Počas zobrazenia tejto stránky boli nastavené nasledujúce súbory cookie</translation> <translation id="4763830802490665879">Súbory cookie z viacerých webových stránok budú vymazané pri ukončení relácie.</translation> +<translation id="4765582662863429759">Umožňuje Správam pre Android prenášať textové správy z vášho telefónu do Chromebooku</translation> <translation id="4768332406694066911">Máte certifikáty z týchto organizácií, ktoré vás identifikujú</translation> <translation id="4772404146526168240">Obe obrazovky</translation> <translation id="4776917500594043016">Heslo pre účet <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -3029,6 +3043,7 @@ <translation id="554517032089923082">GTC</translation> <translation id="5546865291508181392">Nájsť</translation> <translation id="5551573675707792127">Klávesnica a textový vstup</translation> +<translation id="5552059560155071882">Analyzátor CUPS IPP</translation> <translation id="5553089923092577885">Priraďovanie politiky certifikátu</translation> <translation id="5554489410841842733">Táto ikona sa zobrazí, keď bude môcť dané rozšírenie na aktuálnej stránke realizovať akcie.</translation> <translation id="5554720593229208774">E-mailová certifikačná autorita</translation> @@ -3191,8 +3206,10 @@ <translation id="5787146423283493983">Odsúhlasenie kľúča</translation> <translation id="5788127256798019331">Súbory Play</translation> <translation id="5788367137662787332">Je nám ľúto, ale nepodarilo sa pripojiť minimálne jeden oddiel zariadenia <ph name="DEVICE_LABEL" />.</translation> +<translation id="5793339252089865437">Ak stiahnete aktualizáciu cez mobilnú sieť, môže to viesť k vyšším účtovaným poplatkom.</translation> <translation id="5794414402486823030">Vždy otvárať pomocou systémového zobrazovača</translation> <translation id="5794786537412027208">Ukončiť všetky aplikácie Chrome</translation> +<translation id="5799508265798272974">Virtuálny počítač so systémom Linux: <ph name="LINUX_VM_NAME" /></translation> <translation id="5800020978570554460">Cieľový súbor bol od posledného stiahnutia upravený alebo odstránený.</translation> <translation id="5801568494490449797">Predvoľby</translation> <translation id="5804241973901381774">Povolenia</translation> @@ -3867,6 +3884,7 @@ <translation id="6805038906417219576">OK</translation> <translation id="6805647936811177813">Ak chcete importovať certifikát klienta z adresy <ph name="HOST_NAME" />, prihláste sa do <ph name="TOKEN_NAME" />.</translation> <translation id="680572642341004180">Povoliť v aplikácii <ph name="SHORT_PRODUCT_OS_NAME" /> sledovanie RLZ.</translation> +<translation id="6806699711453372963">Správa zdieľania v systéme Linux</translation> <translation id="6807889908376551050">Zobraziť všetky...</translation> <translation id="6810613314571580006">Prihlasovať sa na weby automaticky pomocou uložených poverení. Keď je táto funkcia zakázaná, zobrazí sa pred každým prihlásením na web výzva s potvrdením.</translation> <translation id="6810768462515084623">Ojoj, platnosť hesla zrejme vypršala. Obnovte ho v inom zariadení a skúste to znova.</translation> @@ -3938,6 +3956,7 @@ <translation id="6921709132208495314">Prestať používať dáta na tejto stránke</translation> <translation id="6922128026973287222">Ukladajte údaje a prehliadajte rýchlejšie pomocou funkcie Šetrič Dát Google. Kliknutím získate ďalšie informácie.</translation> <translation id="6923132443355966645">Posunúť/kliknúť</translation> +<translation id="6923633482430812883">Pri pripájaní zdieľaného súboru sa vyskytla chyba. Skontrolujte, či server, ku ktorému sa pripájate, podporuje protokol SMBv2 alebo novší.</translation> <translation id="6930242544192836755">Trvanie</translation> <translation id="6934241953272494177">Prehľadáva sa vaše mediálne zariadenie... <ph name="LINE_BREAK1" /> @@ -4056,6 +4075,7 @@ <translation id="7093434536568905704">GTK+</translation> <translation id="7093866338626856921">Vymieňať údaje so zariadeniami s nasledujúcimi názvami: <ph name="HOSTNAMES" /></translation> <translation id="7096406577040705016">Prepnúť lupu na celú obrazovku</translation> +<translation id="7096857570999173890">Pomocou kódu PIN môžete po odhlásení odomknúť zariadenie.</translation> <translation id="7098389117866926363">Zariadenie USB-C (ľavý port vzadu)</translation> <translation id="7098447629416471489">Tu sa zobrazia ďalšie uložené vyhľadávače</translation> <translation id="7099337801055912064">Súbor PPD sa nedá načítať, pretože je príliš veľký. Maximálna veľkosť je 250 kB.</translation> @@ -4750,6 +4770,7 @@ <translation id="8117620576188476503">Spravujte pripojenia, aktualizácie a nastavenia pomocou stavového panela. Ak sem chcete prejsť pomocou klávesnice, stlačte klávesy Alt + Shift + S.</translation> <translation id="8118362518458010043">Zakázané Chromom. Toto rozšírenie môže byť nebezpečné.</translation> <translation id="8118860139461251237">Spravovať sťahovanie</translation> +<translation id="8123590694679414600">Údaje boli <ph name="TIME" /> zašifrované pomocou vašej prístupovej frázy synchronizácie. Nezahŕňa to spôsoby platby ani adresy zo služby Google Pay.</translation> <translation id="81238879832906896">Žltý a biely kvet</translation> <translation id="8124313775439841391">Spravovaná konfigurácia ONC</translation> <translation id="813082847718468539">Zobraziť informácie o stránkach</translation> @@ -5157,6 +5178,7 @@ <translation id="8758418656925882523">Povoliť diktovanie (písanie hlasom)</translation> <translation id="8759408218731716181">Nie je možné nastaviť viacnásobné prihlásenie</translation> <translation id="8759753423332885148">Prečítajte si viac informácií.</translation> +<translation id="8762886931014513155">Zariadenie <ph name="DEVICE_TYPE" /> potrebuje aktualizáciu</translation> <translation id="8767621466733104912">Automaticky aktualizovať Chrome pre všetkých používateľov</translation> <translation id="8770406935328356739">Koreňový adresár rozšírenia</translation> <translation id="8770507190024617908">Spravovať ľudí</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index a1a94aa..4f7ed80 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1187,7 +1187,7 @@ <translation id="2749881179542288782">Провери граматику и правопис</translation> <translation id="2751739896257479635">EAP потврда идентитета 2. фазе:</translation> <translation id="2755367719610958252">Управљај функцијама приступачности</translation> -<translation id="2755628026949580719">Ако безбедносни кључ није наведен, притискајте дугме на кључу најмање 5 секунди.</translation> +<translation id="2755628026949580719">Ако безбедносни кључ није наведен, притисните и држите дугме на кључу најмање 5 секунди.</translation> <translation id="275662540872599901">екран је искључен</translation> <translation id="2761898608071930085">Користите други налог</translation> <translation id="2762441749940182211">Камера је блокирана</translation> @@ -1670,7 +1670,7 @@ <translation id="3495660573538963482">Подешавања Google помоћника</translation> <translation id="3496213124478423963">Умањи</translation> <translation id="3505030558724226696">Опозови приступ уређају</translation> -<translation id="3506093155988721483">Користите говор уместо тастатуре када покрећете Помоћника</translation> +<translation id="3506093155988721483">Користите говор уместо тастатуре када покрећете Помоћник</translation> <translation id="3507421388498836150">Тренутне дозволе за „<ph name="EXTENSION_NAME" />“</translation> <translation id="3507547268929739059">Уклоните Linux апликације за Chromebook</translation> <translation id="3507888235492474624">Поново скенирајте Bluetooth уређаје</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 66f310c8..7a75f1b 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -7,7 +7,7 @@ <translation id="1007408791287232274">పరికరాలను లోడ్ చేయడం సాధ్యపడలేదు.</translation> <translation id="1008186147501209563">బుక్మార్క్లను ఎగుమతి చేయండి</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{పేజీ ప్రతిస్పందించడం లేదు}other{పేజీలు ప్రతిస్పందించడం లేదు}}</translation> -<translation id="1012794136286421601">మీ డాక్స్, షీట్లు, స్లయిడ్లు మరియు డ్రాయింగ్ల ఫైల్లు సమకాలీకరించబడుతున్నాయి. వీటిని ఆన్లైన్ లేదా ఆఫ్లైన్లో ప్రాప్యత చేయడానికి Google డిస్క్ అనువర్తనాన్ని తెరవండి.</translation> +<translation id="1012794136286421601">మీ డాక్స్, షీట్లు, స్లయిడ్లు మరియు డ్రాయింగ్ల ఫైల్లు సమకాలీకరించబడుతున్నాయి. వీటిని ఆన్లైన్ లేదా ఆఫ్లైన్లో యాక్సెస్ చేయడానికి Google డిస్క్ యాప్ను తెరవండి.</translation> <translation id="1012876632442809908">USB-C పరికరం (ముందువైపు పోర్ట్)</translation> <translation id="1013707859758800957">ఈ పేజీలో అమలు కావడానికి శాండ్బాక్స్ చేయని ప్లగిన్ అనుమతించబడింది.</translation> <translation id="1015318665228971643">ఫోల్డర్ పేరును సవరించండి</translation> @@ -559,7 +559,7 @@ <translation id="1794791083288629568">ఈ సమస్యను పరిష్కరించడంలో మాకు సహాయం చేయడానికి అభిప్రాయాన్ని పంపుతుంది.</translation> <translation id="1795214765651529549">క్లాసిక్ను ఉపయోగించు</translation> <translation id="1799071797295057738">"<ph name="EXTENSION_NAME" />" పొడిగింపు స్వయంచాలకంగా నిలిపివేయబడింది.</translation> -<translation id="180035236176489073">ఈ ఫైల్లను ప్రాప్యత చేయడానికి మీరు తప్పనిసరిగా ఆన్లైన్లో ఉండాలి.</translation> +<translation id="180035236176489073">ఈ ఫైల్లను యాక్సెస్ చేయడానికి మీరు తప్పనిసరిగా ఆన్లైన్లో ఉండాలి.</translation> <translation id="1802687198411089702">పేజీ ప్రతిస్పందించడం లేదు. మీరు దాని కోసం వేచి ఉండవచ్చు లేదా మూసివేయవచ్చు.</translation> <translation id="1802931390041703523">ఈ పేజీలో ఫ్లాష్ బ్లాక్ చేయబడింది</translation> <translation id="1805738995123446102">నేపథ్య ట్యాబ్ మీ మైక్రోఫోన్ని ఉపయోగిస్తోంది</translation> @@ -713,7 +713,7 @@ <translation id="2028997212275086731">RAR ఆర్కైవ్</translation> <translation id="2034346955588403444">మరో WiFi నెట్వర్క్ని జోడించు</translation> <translation id="203574396658008164">లాక్ స్క్రీన్ నుండి విషయ సేకరణను ప్రారంభించండి</translation> -<translation id="2040460856718599782">అయ్యో! మిమ్మల్ని ప్రామాణీకరించడానికి ప్రయత్నిస్తున్నప్పుడు ఏదో తప్పు జరిగింది. దయచేసి మీ సైన్-ఇన్ ప్రమాణాలను ఒకటికి రెండుసార్లు తనిఖీ చేసుకుని మళ్లీ ప్రయత్నించండి.</translation> +<translation id="2040460856718599782">అయ్యో! మిమ్మల్ని ప్రమాణీకరించడానికి ప్రయత్నిస్తున్నప్పుడు ఏదో తప్పు జరిగింది. దయచేసి మీ సైన్-ఇన్ ప్రమాణాలను ఒకటికి రెండుసార్లు తనిఖీ చేసుకుని మళ్లీ ప్రయత్నించండి.</translation> <translation id="2043818754674261542">ఈ <ph name="DEVICE_TYPE" />ని అన్లాక్ చేయడానికి ఫోన్ను ఉంచాల్సిన దూరం</translation> <translation id="204497730941176055">Microsoft సర్టిఫికెట్ టెంప్లేట్ పేరు</translation> <translation id="2045117674524495717">కీబోర్డ్ షార్ట్కట్ హెల్పర్</translation> @@ -1106,7 +1106,7 @@ <translation id="2631498379019108537">అరలో ఇన్పుట్ ఎంపికలను చూపు</translation> <translation id="2633199387167390344"><ph name="NAME" /> డిస్క్ ఖాళీలో <ph name="USAGE" /> MBని ఉపయోగిస్తున్నారు.</translation> <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />"ను తీసివేయాలా?</translation> -<translation id="263325223718984101"><ph name="PRODUCT_NAME" /> వ్యవస్థాపనను పూర్తి చేయలేక పోయింది, కానీ దీని డిస్క్ చిత్రం నుండి అమలు చేయడానికి కొనసాగుతుంది.</translation> +<translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ఇన్స్టాల్ చేయడం పూర్తికాలేదు, కాని డిస్క్ చిత్రం నుండి రన్ అవడం కొనసాగుతుంది.</translation> <translation id="2635276683026132559">సంతకం చేస్తోంది</translation> <translation id="2636625531157955190">చిత్రాన్ని Chrome ప్రాప్యత చేయడం సాధ్యపడదు.</translation> <translation id="2638087589890736295">సమకాలీకరణను ప్రారంభించడానికి రహస్య పదబంధం అవసరం</translation> @@ -1395,7 +1395,7 @@ <translation id="3061707000357573562">ప్యాచ్ సేవ</translation> <translation id="3065041951436100775">ట్యాబ్ మూసివేత అభిప్రాయం.</translation> <translation id="3067198179881736288">యాప్ని ఇన్స్టాల్ చేయాలా?</translation> -<translation id="3067198360141518313">ఈ ప్లగ్ఇన్ని అమలు చెయ్యి</translation> +<translation id="3067198360141518313">ఈ ప్లగ్ఇన్ని అమలు చేయి</translation> <translation id="3071624960923923138">మీరు కొత్త ట్యాబ్ను తెరవడానికి ఇక్కడ క్లిక్ చేయవచ్చు</translation> <translation id="3074037959626057712">మీరు సైన్ ఇన్ చేసి, సింక్ను ఆన్ చేసారు</translation> <translation id="3075874217500066906">పవర్వాష్ ప్రక్రియను మొదలుపెట్టడానికి పునఃప్రారంభించడం అవసరం. పునఃప్రారంభించిన తర్వాత మీరు కొనసాగించాలనుకుంటున్నారో లేదో నిర్ధారించమని మిమ్మల్ని అడగడం జరుగుతుంది.</translation> @@ -1590,7 +1590,7 @@ <translation id="3378630551672149129">సైన్ ఇన్ చేయండి, ఇన్పుట్ అంశాలతో పరస్పర చర్య చేయడానికి ట్యాబ్ కీని నొక్కండి</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> వ్యవస్థాపించబడుతుంది.</translation> <translation id="3380365263193509176">తెలియని లోపం</translation> -<translation id="3382073616108123819">అయ్యో! ఈ పరికరం కోసం పరికర ఐడెంటిఫైయర్లను నిశ్చయించడంలో సిస్టమ్ విఫలమైంది.</translation> +<translation id="3382073616108123819">అయ్యో! ఈ పరికరం కోసం పరికర ఐడెంటిఫైయర్లను నిర్ణయించడంలో సిస్టమ్ విఫలమైంది.</translation> <translation id="338583716107319301">విభాగిని</translation> <translation id="3389312115541230716">విధి పట్టీలో <ph name="SMALL_PRODUCT_LOGO" /> చిహ్నాన్ని కుడి క్లిక్ చేయండి</translation> <translation id="3391716558283801616">ట్యాబ్ 7</translation> @@ -1799,7 +1799,7 @@ <translation id="3678156199662914018">పొడిగింపు: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">మీ అభిప్రాయం తెలియజేసినందుకు ధన్యవాదాలు. మీరు ప్రస్తుతం ఆఫ్లైన్లో ఉన్నారు, మీ నివేదిక తర్వాత పంపబడుతుంది.</translation> <translation id="3683023058278427253">మేము మీ డొమైన్ కోసం బహుళ లైసెన్స్ రకాలను కనుగొన్నాము. దయచేసి కొనసాగడానికి ఒకదాన్ని ఎంచుకోండి.</translation> -<translation id="3683524264665795342"><ph name="APP_NAME" /> స్క్రీన్ భాగస్వామ్య అభ్యర్థన</translation> +<translation id="3683524264665795342"><ph name="APP_NAME" /> స్క్రీన్ షేరింగ్ అభ్యర్థన</translation> <translation id="3685122418104378273">మొబైల్ డేటాను ఉపయోగిస్తున్నప్పుడు Google డిస్క్ సమకాలీకరణ డిఫాల్ట్గా నిలిపివేయబడుతుంది.</translation> <translation id="368789413795732264">ఫైల్ను వ్రాయడానికి ప్రయత్నించడంలో లోపం జరిగింది: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">మీరు అప్లికేషన్లో తెరిచే ఫైల్లు మరియు ఫోల్డర్లలో వ్రాయండి</translation> @@ -2108,7 +2108,7 @@ <translation id="4120817667028078560">పథం చాలా పొడవుగా ఉంది</translation> <translation id="4121428309786185360">గడువు ముగిసేది</translation> <translation id="412730574613779332">స్పాండెక్స్</translation> -<translation id="412940972494182898">ఈ సారికి ఫ్లాష్ని అమలు చేయి</translation> +<translation id="412940972494182898">ఈసారికి ఫ్లాష్ని అమలు చేయి</translation> <translation id="4130199216115862831">పరికరం లాగ్</translation> <translation id="4130207949184424187">ఈ పొడిగింపు మీరు ఓమ్నిపెట్టె నుండి శోధించేటప్పుడు చూపబడే పేజీని మార్చింది.</translation> <translation id="413121957363593859">భాగాలు</translation> @@ -2151,7 +2151,7 @@ <translation id="4208390505124702064"><ph name="SITE_NAME" />లో శోధించు</translation> <translation id="4209092469652827314">పెద్దది</translation> <translation id="4209464433672152343">ముద్రించడం కోసం పత్రాలను సిద్ధం చేయడానికి అవి <ph name="BEGIN_LINK_HELP" />Googleకు పంపబడతాయి<ph name="END_LINK_HELP" />. <ph name="BEGIN_LINK_DASHBOARD" />Google మేఘ ముద్రణ డాష్బోర్డ్<ph name="END_LINK_DASHBOARD" />లో మీ ప్రింటర్లు మరియు ప్రింటర్ చరిత్రను చూడండి, సవరించండి మరియు నిర్వహించండి.</translation> -<translation id="421017592316736757">ఈ ఫైల్ను ప్రాప్యత చేయడానికి మీరు తప్పనిసరిగా ఆన్లైన్లో ఉండాలి.</translation> +<translation id="421017592316736757">ఈ ఫైల్ను యాక్సెస్ చేయడానికి మీరు తప్పనిసరిగా ఆన్లైన్లో ఉండాలి.</translation> <translation id="421182450098841253"> &బుక్మార్క్ల బార్ను చూపు</translation> <translation id="42126664696688958">ఎగుమతి చేయి</translation> <translation id="42137655013211669">సర్వర్ ఈ వనరుకు ప్రాప్యతను నిషేధించింది.</translation> @@ -2221,7 +2221,7 @@ <translation id="4336032328163998280">కాపీ ఆపరేషన్ విఫలమైంది. <ph name="ERROR_MESSAGE" /></translation> <translation id="4336979451636460645">నెట్వర్క్ లాగ్ల కోసం, దీన్ని చూడండి: <ph name="DEVICE_LOG_LINK" /></translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> "<ph name="EXTENSION_NAME" />" అనువర్తనంతో కమ్యూనికేట్ చేయాలనుకుంటోంది</translation> -<translation id="4342311272543222243">అయ్యో, TPM లోపం.</translation> +<translation id="4342311272543222243">అయ్యో, TPM ఎర్రర్.</translation> <translation id="4345587454538109430">కన్ఫిగర్ చెయ్యి...</translation> <translation id="4348766275249686434">లోపాలను సేకరించు</translation> <translation id="4350019051035968019">ఈ పరికరాన్ని మీ ఖాతా చెందిన డొమైన్కు నమోదు చేయడం సాధ్యపడదు ఎందుకంటే పరికరం వేరే డొమైన్ ద్వారా నిర్వహించబడేలా గుర్తించబడింది.</translation> @@ -2964,7 +2964,7 @@ <translation id="5458998536542739734">లాక్ స్క్రీన్ గమనికలు</translation> <translation id="5463275305984126951"><ph name="LOCATION" /> యొక్క స్థానం</translation> <translation id="5463856536939868464">దాచిపెట్టిన బుక్మార్క్లు ఉన్న మెను</translation> -<translation id="5464632865477611176">ఈ సమయాన్ని అమలు చెయ్యి</translation> +<translation id="5464632865477611176">ఈ సమయాన్ని అమలు చేయి</translation> <translation id="5465662442746197494">సహాయం కావాలా?</translation> <translation id="5469954281417596308">బుక్మార్క్ నిర్వాహికి</translation> <translation id="5471768120198416576">హలో! నేను మీ వచనం నుండి ప్రసంగం వాయిస్ని.</translation> @@ -3230,7 +3230,7 @@ <ph name="BEGIN_LINK_HELP" />మరింత తెలుసుకోండి<ph name="END_LINK_HELP" /></translation> <translation id="5851063901794976166">ఇక్కడ చూడటానికి ఏమీ లేదు...</translation> <translation id="5851868085455377790">జారీ చేసినవారు</translation> -<translation id="5852112051279473187">అయ్యో! ఈ పరికరాన్ని నమోదు చేస్తున్నపుడు ఏదో తప్పిదం జరిగింది. దయచేసి మరల ప్రయత్నించండి లేదా మీ మద్దతు ప్రతినిధిని సంప్రదించండి.</translation> +<translation id="5852112051279473187">అయ్యో! ఈ పరికరాన్ని నమోదు చేస్తున్నపుడు ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ప్రయత్నించండి లేదా మీ మద్దతు ప్రతినిధిని సంప్రదించండి.</translation> <translation id="5852137567692933493">పునఃప్రారంభించి, పవర్వాష్ చేయి</translation> <translation id="5854912040170951372">స్లైస్</translation> <translation id="5855119960719984315">విండోను మార్చు</translation> @@ -3246,7 +3246,7 @@ <translation id="5862109781435984885">అరలో స్టైలస్ సాధనాలను చూపుతుంది</translation> <translation id="5863445608433396414">డీబగ్గింగ్ లక్షణాలను ప్రారంభించు</translation> <translation id="5864471791310927901">DHCP లుక్అప్ విఫలమైంది</translation> -<translation id="586567932979200359">మీరు దాని డిస్క్ చిత్రం నుండి <ph name="PRODUCT_NAME" />ను అమలు చేస్తున్నారు. దీన్ని మీ కంప్యూటర్లో వ్యవస్థాపించడం వల్ల మిమ్మల్ని దీన్ని డిస్క్ చిత్రం లేకుండా అమలు చేయనిస్తుంది మరియు ఇది తాజాగా ఉంచబడుతుందని నిర్ధారిస్తుంది.</translation> +<translation id="586567932979200359">మీరు <ph name="PRODUCT_NAME" /> డిస్క్ చిత్రం నుండి దాన్ని అమలు చేస్తున్నారు. మీ కంప్యూటర్లో దీన్ని ఇన్స్టాల్ చేయడం వలన డిస్క్ చిత్రం లేకుండా దాన్ని అమలు చేయడానికి మీరు అనుమతించబడతారు మరియు ఇది తాజాగా ఉంటుందని హామీ పొందుతారు.</translation> <translation id="5866557323934807206">భవిష్యత్ సందర్శనల కోసం ఈ సెట్టింగ్లను క్లియర్ చెయ్యి</translation> <translation id="5866840822086176774">చాలా బలంగా ఉంది</translation> <translation id="5867841422488265304">వెబ్ చిరునామాను వెతకండి లేదా టైప్ చేయండి</translation> @@ -3369,7 +3369,7 @@ <translation id="6045021379489914695">మీ Chromebook మరియు Android ఫోన్ కలిసి మెరుగ్గా పని చేస్తాయి. మీ కంప్యూటర్ నుండి వచన సందేశాలను పంపడానికి, మీ ఇంటర్నెట్ కనెక్షన్ను షేర్ చేయడానికి, అలాగే మీ ఫోన్తో మీ Chromebookను అన్లాక్ చేయడానికి వాటిని కనెక్ట్ చేయండి.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="6049004884579590341">పూర్తి స్క్రీన్ నుండి నిష్క్రమించడానికి |<ph name="ACCELERATOR" />|ని నొక్కి, పట్టుకోండి</translation> <translation id="6049065490165456785">అంతర్గత కెమెరా నుండి ఫోటో</translation> -<translation id="6051354611314852653">అయ్యో! ఈ పరికరం కోసం API యాక్సెస్ను ప్రామాణీకరించడంలో సిస్టమ్ విఫలమైంది.</translation> +<translation id="6051354611314852653">అయ్యో! ఈ పరికరం కోసం API యాక్సెస్ను ప్రమాణీకరించడంలో సిస్టమ్ విఫలమైంది.</translation> <translation id="6052976518993719690">SSL ధృవీకరణ అధికారం</translation> <translation id="6053401458108962351">&బ్రౌజింగ్ డేటాను క్లియర్ చెయ్యి...</translation> <translation id="6055171183283175969">మీరు నమోదు చేసిన పాస్వర్డ్ తప్పు.</translation> @@ -3868,7 +3868,7 @@ <translation id="6805647936811177813">దయచేసి <ph name="HOST_NAME" /> నుండి క్లయింట్ ప్రమాణపత్రాన్ని దిగుమతి చెయ్యడానికి <ph name="TOKEN_NAME" />కి సైన్ ఇన్ చెయ్యండి.</translation> <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME" />లో RLZ ట్రాకింగ్ను ప్రారంభించు.</translation> <translation id="6807889908376551050">అన్నీ చూపు...</translation> -<translation id="6810613314571580006">నిల్వ చేసిన ఆధారాలను ఉపయోగించి స్వయంచాలకంగా వెబ్సైట్లకు సైన్ ఇన్ చేస్తుంది. లక్షణాన్ని నిలిపివేసినప్పుడు, మీరు వెబ్సైట్కు సైన్ ఇన్ చేసే ప్రతిసారి నిర్ధారణ కోసం మిమ్మల్ని అడుగుతుంది.</translation> +<translation id="6810613314571580006">నిల్వ చేసిన ఆధారాలను ఉపయోగించి ఆటోమేటిక్గా వెబ్సైట్లకు సైన్ ఇన్ చేస్తుంది. లక్షణాన్ని నిలిపివేసినప్పుడు, మీరు వెబ్సైట్కు సైన్ ఇన్ చేసే ప్రతిసారి నిర్ధారణ కోసం మిమ్మల్ని అడుగుతుంది.</translation> <translation id="6810768462515084623">అయ్యో! మీ పాస్వర్డ్ గడువు ముగిసింది. దయచేసి మరో పరికరంలో దానిని పునరుద్ధరించి, ఆపై మళ్లీ ప్రయత్నించండి.</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> రూట్గా రన్ చేయలేదు.</translation> <translation id="6812841287760418429">మార్పులను ఉంచు</translation> @@ -3903,7 +3903,7 @@ <translation id="6857699260879628349">కాన్ఫిగరేషన్ సమాచారాన్ని పొందండి</translation> <translation id="6860097299815761905">ప్రాక్సీ సెట్టింగ్లు...</translation> <translation id="6860427144121307915">ట్యాబ్లో తెరువు</translation> -<translation id="6862635236584086457">ఈ ఫోల్డర్లో సేవ్ చేసిన అన్ని ఫైల్లు ఆన్లైన్లో స్వయంచాలకంగా బ్యాకప్ చేయబడతాయి</translation> +<translation id="6862635236584086457">ఈ ఫోల్డర్లో సేవ్ చేసిన అన్ని ఫైల్లు ఆన్లైన్లో ఆటోమేటిక్గా బ్యాకప్ చేయబడతాయి</translation> <translation id="6865313869410766144">స్వీయపూర్తి ఫారమ్ డేటా</translation> <translation id="6865708901122695652">WebRTC ఈవెంట్ లాగ్లు (<ph name="WEBRTC_EVENT_LOG_COUNT" />)</translation> <translation id="686664946474413495">రంగు ఉష్ణోగ్రత</translation> @@ -4222,7 +4222,7 @@ <translation id="7341834142292923918">ఈ సైట్కు యాక్సెస్ కోరుతోంది</translation> <translation id="7345706641791090287">మీ పాస్వర్డ్ను నిర్ధారించండి</translation> <translation id="7346909386216857016">సరే, అర్థమైంది</translation> -<translation id="7347751611463936647">ఈ పొడిగింపును ఉపయోగించడానికి, "<ph name="EXTENSION_KEYWORD" />" టైప్ చేసి, ఆపై టాబ్ చేసి, ఆపై మీ ఆదేశం లేదా శోధనను టైప్ చెయ్యండి.</translation> +<translation id="7347751611463936647">ఈ ఎక్స్టెన్షన్ను ఉపయోగించడానికి, "<ph name="EXTENSION_KEYWORD" />", తర్వాత TAB, ఆపై మీ ఆదేశం లేదా శోధనని టైప్ చేయండి.</translation> <translation id="7348093485538360975">ఆన్-స్క్రీన్ కీబోర్డ్</translation> <translation id="7352651011704765696">ఏదో తప్పు జరిగింది</translation> <translation id="735361434055555355">Linuxను ఇన్స్టాల్ చేస్తోంది...</translation> @@ -4252,7 +4252,7 @@ <translation id="7388222713940428051">అతిథి విండోని తెరువు</translation> <translation id="7392118418926456391">వైరస్ను స్కాన్ చేయడంలో విఫలమైంది</translation> <translation id="7392915005464253525">మూ&సిన విండోని మళ్ళీ తెరువు</translation> -<translation id="7396845648024431313">సిస్టమ్ ఆరంభంలో <ph name="APP_NAME" /> ఆరంభించబడుతుంది మరియు మీరు అన్ని <ph name="PRODUCT_NAME" /> విండోలని మూసినపుడు నేపథ్యంలో రన్ చేయడం కొనసాగుతుంది.</translation> +<translation id="7396845648024431313"><ph name="APP_NAME" /> సిస్టమ్ ప్రారంభంలో ప్రారంభమవుతుంది మరియు మీరు అన్ని ఇతర <ph name="PRODUCT_NAME" /> విండోలను మూసివేసిన తర్వాత కూడా నేపథ్యంలో అమలవడం కొనసాగుతుంది.</translation> <translation id="7400418766976504921">URL</translation> <translation id="740083207982962331">దయచేసి మీ Chromebox పునఃప్రారంభించబడుతున్నప్పుడు వేచి ఉండండి...</translation> <translation id="7400839060291901923">మీ <ph name="PHONE_NAME" />లో కనెక్షన్ని సెటప్ చేయండి</translation> @@ -4325,7 +4325,7 @@ <translation id="7506541170099744506">మీ <ph name="DEVICE_TYPE" /> ఎంటర్ప్రైజ్ నిర్వహణ కోసం విజయవంతంగా నమోదు చేయబడింది.</translation> <translation id="7507930499305566459">స్థితి ప్రతిస్పందన సర్టిఫికెట్</translation> <translation id="7508545000531937079">స్లయిడ్ ప్రదర్శన</translation> -<translation id="7513029293694390567">నిల్వ చేసిన ఆధారాలను ఉపయోగించి స్వయంచాలకంగా వెబ్సైట్లకు సైన్ ఇన్ చేస్తుంది. దీన్ని నిలిపివేస్తే, మీరు వెబ్సైట్కు సైన్ ఇన్ చేసే ప్రతిసారి నిర్ధారణ కోసం మిమ్మల్ని అడుగుతుంది.</translation> +<translation id="7513029293694390567">నిల్వ చేసిన ఆధారాలను ఉపయోగించి ఆటోమేటిక్గా వెబ్సైట్లకు సైన్ ఇన్ చేస్తుంది. దీన్ని నిలిపివేస్తే, మీరు వెబ్సైట్కు సైన్ ఇన్ చేసే ప్రతిసారి నిర్ధారణ కోసం మిమ్మల్ని అడుగుతుంది.</translation> <translation id="7515154058529101840"><ph name="BEGIN_PARAGRAPH1" />స్థానాన్ని కనుగొనడంలో యాప్లకు సహాయపడండి. యాప్ల కోసం స్థానాన్ని మెరుగుపరచడంలో సహాయపడటం కోసం Google యొక్క స్థాన సేవని ఉపయోగించండి. Google అప్పుడప్పుడు స్థాన డేటాని సేకరించవచ్చు మరియు స్థాన ఖచ్చితత్వం మరియు స్థానం ఆధారిత సేవలను మెరుగుపరచడం కోసం ఈ డేటాని అనామకంగా ఉపయోగించవచ్చు.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />మీ పరికరం యొక్క స్థానాన్ని అంచనా వేయడం కోసం Wi-Fi, మొబైల్ నెట్వర్క్లు మరియు సెన్సార్ల వంటి మూలాధారాలను Google స్థాన సేవ ఉపయోగిస్తుంది. మీ పరికరం యొక్క స్థాన సేవ ఆన్లో ఉన్నప్పుడు ఈ సేవ యాక్టివ్గా ఉంటుంది.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />మీ పరికరంలోని ప్రధాన స్థాన సెట్టింగ్ని ఆఫ్ చేయడం ద్వారా మీరు స్థానాన్ని ఆఫ్ చేయవచ్చు. మీరు స్థాన సెట్టింగ్లలో స్థానం కోసం Wi-Fi, మొబైల్ నెట్వర్క్లు మరియు సెన్సార్లను కూడా ఆఫ్ చేయవచ్చు.<ph name="END_PARAGRAPH3" /></translation> @@ -4766,7 +4766,7 @@ <translation id="8152091997436726702">ప్రింటర్ నమోదుకు గడువు ముగిసింది. ప్రింటర్ను నమోదు చేయడానికి, మీరు తప్పనిసరిగా ప్రింటర్లో నమోదును నిర్ధారించాలి.</translation> <translation id="8153607920959057464">ఈ ఫైల్ని ప్రదర్శించడం సాధ్యం కాలేదు.</translation> <translation id="8154790740888707867">ఫైల్ లేదు</translation> -<translation id="815491593104042026">అయ్యో! ఇది సురక్షితం కాని URL (<ph name="BLOCKED_URL" />)ని ఉపయోగించే విధంగా కాన్ఫిగర్ చేయబడినందున ప్రామాణీకరణ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి.</translation> +<translation id="815491593104042026">అయ్యో! ఇది సురక్షితం కాని URL (<ph name="BLOCKED_URL" />)ని ఉపయోగించే విధంగా కాన్ఫిగర్ చేయబడినందున ప్రమాణీకరణ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి.</translation> <translation id="8157939133946352716">7x5</translation> <translation id="816055135686411707">లోపం సెట్టింగ్ ప్రమాణపత్ర నమ్మకం</translation> <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation> @@ -4880,7 +4880,7 @@ <translation id="8343956361364550006">ఉత్తమ శ్రేణి వీడియో లేదా యానిమేషన్ కోసం అధిక బ్యాండ్విడ్త్ను ఉపయోగించండి. నెమ్మది కనెక్షన్లు గల ఇతర వ్యక్తులు మీ కంటెంట్ను చూడలేకపోవచ్చు.</translation> <translation id="8349826889576450703">లాంచర్</translation> -<translation id="8351419472474436977">ఈ పొడిగింపు మీ ప్రాక్సీ సెట్టింగ్లను దాని నియంత్రణలోకి తీసుకుంది, అది మీరు ఆన్లైన్లో ఏదైనా చేస్తుంటే దాన్ని మార్చడం, అంతరాయం కలిగించడం లేదా రహస్యంగా గమనించడం వంటివి చేయగలదని దీనర్థం. ఈ మార్పు ఎందుకు సంభవించిందో మీకు ఖచ్చితంగా తెలియలేదంటే బహుశా మీరు దాన్ని కోరుకొని ఉండకపోవచ్చు.</translation> +<translation id="8351419472474436977">ఈ ఎక్స్టెన్షన్ మీ ప్రాక్సీ సెట్టింగ్లను దాని నియంత్రణలోకి తీసుకుంది, అది మీరు ఆన్లైన్లో ఏదైనా చేస్తుంటే దాన్ని మార్చడం, అంతరాయం కలిగించడం లేదా రహస్యంగా గమనించడం వంటివి చేయగలదని దీనర్థం. ఈ మార్పు ఎందుకు సంభవించిందో మీకు ఖచ్చితంగా తెలియలేదంటే బహుశా మీరు దాన్ని కోరుకొని ఉండకపోవచ్చు.</translation> <translation id="8352772353338965963">బహుళ సైన్ ఇన్ కోసం ఖాతాను జోడించండి. అన్ని సైన్ ఇన్ చేసిన ఖాతాలను పాస్వర్డ్ లేకుండానే యాక్సెస్ చేయవచ్చు, కనుక ఈ ఫీచర్ని విశ్వసనీయ ఖాతాలతో మాత్రమే ఉపయోగించాలి.</translation> <translation id="8353683614194668312">ఇది వీటిని చేయగలదు:</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> @@ -4975,7 +4975,7 @@ <translation id="8487700953926739672">ఆఫ్లైన్లో అందుబాటు</translation> <translation id="8490896350101740396">క్రింది కియోస్క్ అనువర్తనాలు "<ph name="UPDATED_APPS" />" నవీకరించబడ్డాయి. దయచేసి నవీకరణ ప్రాసెస్ను పూర్తి చేయడానికి పరికరాన్ని రీబూట్ చేయండి.</translation> <translation id="8493236660459102203">మైక్రోఫోన్:</translation> -<translation id="8496717697661868878">ఈ ప్లగ్ఇన్ని అమలు చెయ్యి</translation> +<translation id="8496717697661868878">ఈ ప్లగ్ఇన్ని అమలు చేయి</translation> <translation id="8497219075884839166">Windows వినియోగాలు</translation> <translation id="8498214519255567734">కాంతి తక్కువగా ఉన్నప్పుడు మీ స్క్రీన్ని చూడటం లేదా చదవడాన్ని సులభతరం చేస్తుంది</translation> <translation id="8498395510292172881">Chromeలో చదవడం కొనసాగించండి</translation> @@ -5170,7 +5170,7 @@ <translation id="8784626084144195648">బిన్ చేయబడిన సగటు</translation> <translation id="8785622406424941542">స్టైలస్</translation> <translation id="8787254343425541995">భాగస్వామ్య నెట్వర్క్లకు ప్రాక్సీలను అనుమతించండి</translation> -<translation id="8791534160414513928">మీ బ్రౌజింగ్ ట్రాఫిక్కు తోడుగా ‘ట్రాక్ చేయవద్దు’ అభ్యర్థనను పంపండి</translation> +<translation id="8791534160414513928">మీ బ్రౌజింగ్ రద్దీతో ‘ట్రాక్ చేయవద్దు’ అభ్యర్థనను పంపండి</translation> <translation id="8794025342371547160">పరిమితం చేయబడిన IP</translation> <translation id="879413103056696865">హాట్స్పాట్ ఆన్లో ఉన్నప్పుడు, మీ <ph name="PHONE_NAME" /> ఇలా చేస్తుంది:</translation> <translation id="8795916974678578410">క్రొత్త విండో</translation> @@ -5418,7 +5418,7 @@ <translation id="9154418932169119429">ఈ చిత్రం ఆఫ్లైన్లో అందుబాటులో లేదు.</translation> <translation id="91568222606626347">సత్వరమార్గాన్ని సృష్టించు...</translation> <translation id="9157697743260533322">వినియోగదారులందరి కోసం స్వయంచాలక నవీకరణలను సెటప్ చేయడం విఫలమైంది (ప్రీఫ్లయిట్ ప్రారంభ లోపం: <ph name="ERROR_NUMBER" />)</translation> -<translation id="9158715103698450907">అయ్యో! ప్రామాణీకరణ సమయంలో నెట్వర్క్ కమ్యూనికేషన్ సమస్య సంభవించింది. దయచేసి మీ నెట్వర్క్ కనెక్షన్ను తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి.</translation> +<translation id="9158715103698450907">అయ్యో! ప్రమాణీకరణ సమయంలో నెట్వర్క్ కమ్యూనికేషన్ సమస్య సంభవించింది. దయచేసి మీ నెట్వర్క్ కనెక్షన్ను తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి.</translation> <translation id="916501514001398070">సిస్టమ్ డేటాని పంపండి. ఈ పరికరం ప్రస్తుతం సమస్య విశ్లేషణ మరియు పరికర మరియు యాప్ వినియోగ డేటాని ఆటోమేటిక్గా Googleకి పంపుతోంది. ఈ సెట్టింగ్ని యజమాని ప్రారంభించారు. మీరు అదనపు వెబ్ & యాప్ కార్యకలాపాన్ని ఆన్ చేసి ఉంటే, ఈ సమాచారం మీ ఖాతాలో నిల్వ చేయబడుతుంది, కనుక మీరు నా కార్యకలాపంలో దీనిని నిర్వహించవచ్చు. <ph name="BEGIN_LINK1" />మరింత తెలుసుకోండి<ph name="END_LINK1" /></translation> <translation id="916607977885256133">చిత్రంలో చిత్రం</translation> <translation id="9168436347345867845">దీనిని తర్వాత చేయి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 72194c6..317dac4 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -418,7 +418,7 @@ <translation id="1598233202702788831">ผู้ดูแลระบบปิดใช้การอัปเดต</translation> <translation id="1600857548979126453">เข้าถึงแบ็คเอนด์เครื่องซ่อมแซมหน้าเว็บ</translation> <translation id="1601560923496285236">นำไปใช้</translation> -<translation id="1603300902586586390">อนุญาตให้แอป Linux เปิดไฟล์ $1</translation> +<translation id="1603300902586586390">อนุญาตให้แอป Linux เปิดไฟล์ $1 รายการ</translation> <translation id="1603914832182249871">(โหมดไม่ระบุตัวตน)</translation> <translation id="1607139524282324606">ล้างรายการ</translation> <translation id="1608626060424371292">ลบผู้ใช้รายนี้</translation> @@ -3714,7 +3714,7 @@ <translation id="656293578423618167">เส้นทางหรือชื่อของไฟล์ยาวเกินไป โปรดบันทึกด้วยชื่อที่สั้นกว่านี้หรือบันทึกลงในตำแหน่งอื่น</translation> <translation id="656398493051028875">กำลังลบ "<ph name="FILENAME" />"...</translation> <translation id="6567688344210276845">ไม่สามารถโหลดไอคอน "<ph name="ICON" />" เพื่อให้เกิดการทำงานบนหน้าเว็บ</translation> -<translation id="6571979863037191371">ยกเลิกการเชื่อมต่อกับ Chromebook อุปกรณ์ทั้งสองจะไม่เชื่อมต่อกันโดยอัตโนมัติอีกต่อไป</translation> +<translation id="6571979863037191371">ยกเลิกการเชื่อมต่อโทรศัพท์กับ Chromebook อุปกรณ์ทั้งสองจะไม่เชื่อมต่อกันโดยอัตโนมัติอีกต่อไป</translation> <translation id="657402800789773160">&โหลดหน้านี้ใหม่</translation> <translation id="6577284282025554716">ยกเลิกการดาวน์โหลดแล้ว: <ph name="FILE_NAME" /></translation> <translation id="6578664922716508575">เข้ารหัสลับรหัสผ่านที่ซิงค์ด้วยชื่อผู้ใช้และรหัสผ่าน Google ของคุณ</translation> @@ -5212,7 +5212,7 @@ <translation id="8846141544112579928">กำลังค้นหาแป้นพิมพ์...</translation> <translation id="8846319957959474018">เปิดแอปได้ง่ายๆ ด้วยบุ๊กมาร์ก</translation> <translation id="8847988622838149491">USB</translation> -<translation id="8848561196844274665">เมื่อคุณเชื่อมต่ออุปกรณ์ คุณยอมรับว่า Chromebook ทำสิ่งต่อไปนี้ได้</translation> +<translation id="8848561196844274665">เมื่อเชื่อมต่ออุปกรณ์ คุณยอมรับว่า Chromebook ทำสิ่งต่อไปนี้ได้</translation> <translation id="8859057652521303089">เลือกภาษาที่ต้องการ:</translation> <translation id="8859174528519900719">เฟรมย่อย: <ph name="SUBFRAME_SITE" /></translation> <translation id="8860454412039442620">สเปรดชีต Excel</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index c8433efb..5bcc650 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -223,6 +223,7 @@ <translation id="7106741999175697885">Task Manager - Google Chrome</translation> <translation id="7164397146364144019">You can help make Chrome safer and easier to use by automatically reporting details of possible security incidents to Google.</translation> <translation id="7242029209006116544">You are signing in with a managed account and giving its administrator control over your Google Chrome profile. Your Chrome data, such as your apps, bookmarks, history, passwords and other settings will become permanently tied to <ph name="USER_NAME" />. You will be able to delete this data via the Google Accounts Dashboard, but you will not be able to associate this data with another account. You can optionally create a new profile to keep your existing Chrome data separate. <ph name="LEARN_MORE" /></translation> +<translation id="7296210096911315575">Important use and safety information</translation> <translation id="7308322188646931570">Chrome needs storage access to download files</translation> <translation id="7330164299247909639">Authentication certificate failed. Please sign in to Google Chrome again as <ph name="USER_NAME" />, or contact your administrator for more information. <ph name="ADDITIONAL_EXPLANATION" /></translation> <translation id="7339898014177206373">New window</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 686f771..910d213 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -221,6 +221,7 @@ <translation id="7106741999175697885">Správca úloh – Google Chrome</translation> <translation id="7164397146364144019">Automatickým nahlasovaním podrobností o možných bezpečnostných problémoch môžete prispieť k zvýšeniu zabezpečenia prehliadača Chrome a k zjednodušeniu jeho používania.</translation> <translation id="7242029209006116544">Prihlasujete sa pomocou spravovaného účtu a jeho správcovi dávate kontrolu nad vaším profilom prehliadača Chrome. Vaše údaje prehliadača Chrome, ako sú aplikácie, záložky, história, heslá a iné nastavenia, sa natrvalo priradia k účtu <ph name="USER_NAME" />. Tieto údaje budete môcť odstrániť len pomocou panela Dashboard v Účtoch Google, ale nebudete ich môcť priradiť k inému účtu. Ak chcete, aby boli existujúce údaje prehliadača Chrome oddelené, môžete vytvoriť nový profil. <ph name="LEARN_MORE" /></translation> +<translation id="7296210096911315575">Dôležité informácie o používaní a zabezpečení</translation> <translation id="7308322188646931570">Chrome potrebuje na sťahovanie súborov prístup k úložisku</translation> <translation id="7330164299247909639">Certifikát na overenie totožnosti zlyhal. Prihláste sa znova do prehliadača Google Chrome ako <ph name="USER_NAME" /> alebo kontaktujte správcu a požiadajte ho o ďalšie informácie. <ph name="ADDITIONAL_EXPLANATION" /></translation> <translation id="7339898014177206373">Nové okno</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index cdb73d5..91fc451 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -433,6 +433,16 @@ switches::kChromeHomeSwipeLogicType, "velocity"}, }; +const FeatureEntry::Choice kForceUpdateMenuTypeChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kUpdateMenuTypeNone, switches::kForceUpdateMenuType, + "none"}, + {flag_descriptions::kUpdateMenuTypeUpdateAvailable, + switches::kForceUpdateMenuType, "update_available"}, + {flag_descriptions::kUpdateMenuTypeUnsupportedOSVersion, + switches::kForceUpdateMenuType, "unsupported_os_version"}, +}; + const FeatureEntry::FeatureParam kCCTModuleCache_ZeroMinutes[] = { {"cct_module_cache_time_limit_ms", "0"}}; const FeatureEntry::FeatureParam kCCTModuleCache_OneMinute[] = { @@ -2618,9 +2628,9 @@ flag_descriptions::kEnableImageCaptureAPIDescription, kOsAll, FEATURE_VALUE_TYPE(features::kImageCaptureAPI)}, #if defined(OS_ANDROID) - {"force-show-update-menu-item", flag_descriptions::kUpdateMenuItemName, - flag_descriptions::kUpdateMenuItemDescription, kOsAndroid, - SINGLE_VALUE_TYPE(switches::kForceShowUpdateMenuItem)}, + {"force-update-menu-type", flag_descriptions::kUpdateMenuTypeName, + flag_descriptions::kUpdateMenuTypeDescription, kOsAndroid, + MULTI_VALUE_TYPE(kForceUpdateMenuTypeChoices)}, {"update-menu-item-custom-summary", flag_descriptions::kUpdateMenuItemCustomSummaryName, flag_descriptions::kUpdateMenuItemCustomSummaryDescription, kOsAndroid,
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index 9fb2244b..2f31c8c 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -117,6 +117,7 @@ &kHorizontalTabSwitcherAndroid, &kImprovedA2HS, &kInflateToolbarOnBackgroundThread, + &kJellyBeanSupported, &kLanguagesPreference, &kLongPressBackForHistory, &kModalPermissionDialogView, @@ -331,6 +332,9 @@ const base::Feature kInflateToolbarOnBackgroundThread{ "BackgroundToolbarInflation", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kJellyBeanSupported{"JellyBeanSupported", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kLanguagesPreference{"LanguagesPreference", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index 12b0171..f9104a9 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -58,6 +58,7 @@ extern const base::Feature kHorizontalTabSwitcherAndroid; extern const base::Feature kImprovedA2HS; extern const base::Feature kInflateToolbarOnBackgroundThread; +extern const base::Feature kJellyBeanSupported; extern const base::Feature kLanguagesPreference; extern const base::Feature kLongPressBackForHistory; extern const base::Feature kModalPermissionDialogView;
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 523debb..8ba39a1 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -61,41 +61,6 @@ <structure name="IDR_DICE_WELCOME_BROWSER_PROXY_JS" file="resources\welcome\dice_welcome\welcome_browser_proxy.js" type="chrome_html" preprocess="true"/> <structure name="IDR_DICE_WELCOME_APP_HTML" file="resources\welcome\dice_welcome\welcome_app.html" type="chrome_html" preprocess="true"/> <structure name="IDR_DICE_WELCOME_APP_JS" file="resources\welcome\dice_welcome\welcome_app.js" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_LANDING_VIEW_HTML" file="resources\welcome\onboarding_welcome\landing_view.html" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_LANDING_VIEW_JS" file="resources\welcome\onboarding_welcome\landing_view.js" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_NAVIGATION_BEHAVIOR_HTML" file="resources\welcome\onboarding_welcome\navigation_behavior.html" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_NAVIGATION_BEHAVIOR_JS" file="resources\welcome\onboarding_welcome\navigation_behavior.js" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SIGNIN_VIEW_HTML" file="resources\welcome\onboarding_welcome\signin_view.html" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SIGNIN_VIEW_JS" file="resources\welcome\onboarding_welcome\signin_view.js" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_APP_HTML" file="resources\welcome\onboarding_welcome\welcome_app.html" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_APP_JS" file="resources\welcome\onboarding_welcome\welcome_app.js" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_BROWSER_PROXY_HTML" file="resources\welcome\onboarding_welcome\welcome_browser_proxy.html" type="chrome_html"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_BROWSER_PROXY_JS" file="resources\welcome\onboarding_welcome\welcome_browser_proxy.js" type="chrome_html"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_CSS" file="resources\welcome\onboarding_welcome\welcome.css" type="chrome_html" preprocess="true"/> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_HTML" file="resources\welcome\onboarding_welcome\welcome.html" type="chrome_html" preprocess="true"/> - <!-- NUX files --> - <structure name="IDR_NUX_EMAIL_CHOOSER_HTML" file="resources\welcome\onboarding_welcome\email\email_chooser.html" type="chrome_html" /> - <structure name="IDR_NUX_EMAIL_CHOOSER_JS" file="resources\welcome\onboarding_welcome\email\email_chooser.js" type="chrome_html" /> - <structure name="IDR_NUX_EMAIL_HTML" file="resources\welcome\onboarding_welcome\email\nux_email.html" type="chrome_html" /> - <structure name="IDR_NUX_EMAIL_JS" file="resources\welcome\onboarding_welcome\email\nux_email.js" type="chrome_html" /> - <structure name="IDR_NUX_EMAIL_PROXY_HTML" file="resources\welcome\onboarding_welcome\email\nux_email_proxy.html" type="chrome_html" /> - <structure name="IDR_NUX_EMAIL_PROXY_JS" file="resources\welcome\onboarding_welcome\email\nux_email_proxy.js" type="chrome_html" /> - <structure name="IDR_NUX_GOOGLE_APPS_HTML" file="resources\welcome\onboarding_welcome\google_apps\nux_google_apps.html" type="chrome_html" /> - <structure name="IDR_NUX_GOOGLE_APPS_JS" file="resources\welcome\onboarding_welcome\google_apps\nux_google_apps.js" type="chrome_html" /> - <structure name="IDR_NUX_GOOGLE_APPS_PROXY_HTML" file="resources\welcome\onboarding_welcome\google_apps\nux_google_apps_proxy.html" type="chrome_html" /> - <structure name="IDR_NUX_GOOGLE_APPS_PROXY_JS" file="resources\welcome\onboarding_welcome\google_apps\nux_google_apps_proxy.js" type="chrome_html" /> - <structure name="IDR_NUX_GOOGLE_APPS_CHOOSER_HTML" file="resources\welcome\onboarding_welcome\google_apps\apps_chooser.html" type="chrome_html" /> - <structure name="IDR_NUX_GOOGLE_APPS_CHOOSER_JS" file="resources\welcome\onboarding_welcome\google_apps\apps_chooser.js" type="chrome_html" /> - <structure name="IDR_NUX_SET_AS_DEFAULT_HTML" file="resources\welcome\onboarding_welcome\set_as_default\nux_set_as_default.html" type="chrome_html" /> - <structure name="IDR_NUX_SET_AS_DEFAULT_JS" file="resources\welcome\onboarding_welcome\set_as_default\nux_set_as_default.js" type="chrome_html" /> - <structure name="IDR_NUX_SET_AS_DEFAULT_PROXY_HTML" file="resources\welcome\onboarding_welcome\set_as_default\nux_set_as_default_proxy.html" type="chrome_html" /> - <structure name="IDR_NUX_SET_AS_DEFAULT_PROXY_JS" file="resources\welcome\onboarding_welcome\set_as_default\nux_set_as_default_proxy.js" type="chrome_html" /> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ACTION_LINK_STYLE_JS" file="resources\welcome\onboarding_welcome\shared\action_link_style.js" type="chrome_html" /> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ACTION_LINK_STYLE_CSS_HTML" file="resources\welcome\onboarding_welcome\shared\action_link_style_css.html" type="chrome_html" /> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ONBOARDING_BACKGROUND_HTML" file="resources\welcome\onboarding_welcome\shared\onboarding_background.html" type="chrome_html" /> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ONBOARDING_BACKGROUND_JS" file="resources\welcome\onboarding_welcome\shared\onboarding_background.js" type="chrome_html" /> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_CHOOSER_SHARED_CSS" file="resources\welcome\onboarding_welcome\shared\chooser_shared_css.html" type="chrome_html" /> - <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_I18N_SETUP_HTML" file="resources\welcome\onboarding_welcome\shared\i18n_setup.html" type="chrome_html" /> </if> <if expr="is_win"> <structure name="IDR_WELCOME_WIN10_CSS" file="resources\welcome\welcome_win10.css" type="chrome_html" />
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc index 4f36cdd..dd21d18b 100644 --- a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc +++ b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc
@@ -35,6 +35,9 @@ bool capture) { extensions::ExtensionHost* host = chromeos::GetAccessibilityExtensionHost( extension_misc::kChromeVoxExtensionId); + if (!host) + return; + // Listen for any unhandled keyboard events from ChromeVox's background page // when capturing keys to reinject. host->host_contents()->SetDelegate(capture ? this : nullptr); @@ -47,6 +50,9 @@ std::unique_ptr<ui::Event> event) { extensions::ExtensionHost* host = chromeos::GetAccessibilityExtensionHost( extension_misc::kChromeVoxExtensionId); + if (!host) + return; + // Forward the event to ChromeVox's background page. chromeos::ForwardMouseToExtension(*(event->AsMouseEvent()), host); }
diff --git a/chrome/browser/chromeos/accessibility/switch_access_event_handler.cc b/chrome/browser/chromeos/accessibility/switch_access_event_handler.cc index c9b9cde..f4f704b 100644 --- a/chrome/browser/chromeos/accessibility/switch_access_event_handler.cc +++ b/chrome/browser/chromeos/accessibility/switch_access_event_handler.cc
@@ -51,6 +51,9 @@ const ui::KeyEvent& event) { extensions::ExtensionHost* host = GetAccessibilityExtensionHost(extension_misc::kSwitchAccessExtensionId); + if (!host) + return; + ForwardKeyToExtension(event, host); }
diff --git a/chrome/browser/chromeos/arc/input_method_manager/DEPS b/chrome/browser/chromeos/arc/input_method_manager/DEPS index ea113443..ec55aaa 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/DEPS +++ b/chrome/browser/chromeos/arc/input_method_manager/DEPS
@@ -1,7 +1,6 @@ specific_include_rules = { - # TODO(mash): Remove. http://crbug.com/890677 - "arc_input_method_manager_service_unittest\.cc": [ - "+ash/keyboard/ash_keyboard_controller.h", + # TODO(mash): Fix this. https://crbug.com/890677 + "arc_input_method_manager_service\.cc": [ "+ash/shell.h", ], }
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc index b3642845..c1161de 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <utility> +#include "ash/shell.h" #include "base/logging.h" #include "base/memory/singleton.h" #include "base/stl_util.h" @@ -15,7 +16,6 @@ #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_bridge_impl.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/ash/chrome_keyboard_controller_client.h" #include "chrome/browser/ui/ash/tablet_mode_client.h" #include "chrome/browser/ui/ash/tablet_mode_client_observer.h" #include "chrome/common/pref_names.h" @@ -29,6 +29,7 @@ #include "ui/base/ime/chromeos/input_method_util.h" #include "ui/base/ime/ime_bridge.h" #include "ui/base/ime/input_method_observer.h" +#include "ui/keyboard/keyboard_util.h" namespace arc { @@ -69,16 +70,6 @@ NOTREACHED() << "There is no enabled non-ARC IME."; } -void SetKeyboardDisabled(bool disabled) { - if (disabled) { - ChromeKeyboardControllerClient::Get()->SetEnableFlag( - keyboard::mojom::KeyboardEnableFlag::kAndroidDisabled); - } else { - ChromeKeyboardControllerClient::Get()->ClearEnableFlag( - keyboard::mojom::KeyboardEnableFlag::kAndroidDisabled); - } -} - // Singleton factory for ArcInputMethodManagerService class ArcInputMethodManagerServiceFactory : public internal::ArcBrowserContextKeyedServiceFactoryBase< @@ -417,13 +408,24 @@ return; SwitchImeTo(state->GetCurrentInputMethod().id()); + // ash::Shell is not created in the unit tests. + if (!ash::Shell::HasInstance()) + return; + const bool was_enabled = keyboard::IsKeyboardEnabled(); if (chromeos::extension_ime_util::IsArcIME( state->GetCurrentInputMethod().id())) { // Disable fallback virtual keyboard while Android IME is activated. - SetKeyboardDisabled(true); + keyboard::SetKeyboardShowOverride( + keyboard::KEYBOARD_SHOW_OVERRIDE_DISABLED); + if (was_enabled) + ash::Shell::Get()->DisableKeyboard(); } else { // Stop overriding virtual keyboard availability. - SetKeyboardDisabled(false); + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_NONE); + // If the device is still in tablet mode, virtual keyboard may be enabled. + const bool is_enabled = keyboard::IsKeyboardEnabled(); + if (!was_enabled && is_enabled) + ash::Shell::Get()->EnableKeyboard(); } }
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc index 215e5da..9ee37f7 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -9,18 +9,13 @@ #include <utility> #include <vector> -#include "ash/keyboard/ash_keyboard_controller.h" -#include "ash/public/interfaces/constants.mojom.h" -#include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "base/macros.h" #include "base/memory/scoped_refptr.h" -#include "base/run_loop.h" #include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" -#include "chrome/browser/ui/ash/chrome_keyboard_controller_client.h" #include "chrome/browser/ui/ash/tablet_mode_client.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_profile.h" @@ -29,8 +24,6 @@ #include "components/arc/test/test_browser_context.h" #include "components/crx_file/id_util.h" #include "content/public/test/test_browser_thread_bundle.h" -#include "content/public/test/test_service_manager_context.h" -#include "services/service_manager/public/cpp/connector.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/ime/chromeos/extension_ime_util.h" #include "ui/base/ime/chromeos/mock_input_method_manager.h" @@ -38,6 +31,8 @@ #include "ui/base/ime/ime_bridge.h" #include "ui/base/ime/mock_ime_input_context_handler.h" #include "ui/base/ime/mock_input_method.h" +#include "ui/keyboard/keyboard_controller.h" +#include "ui/keyboard/keyboard_util.h" namespace arc { namespace { @@ -254,25 +249,8 @@ input_method_manager_ = new TestInputMethodManager(); chromeos::input_method::InputMethodManager::Initialize( input_method_manager_); - profile_ = std::make_unique<TestingProfile>(); tablet_mode_client_ = std::make_unique<TabletModeClient>(); - - // Create a local service manager connector to handle requests to - // ash::mojom::CrosDisplayConfigController. - service_manager::mojom::ConnectorRequest request; - connector_ = service_manager::Connector::Create(&request); - service_manager::Connector::TestApi test_api(connector_.get()); - test_api.OverrideBinderForTesting( - service_manager::Identity(ash::mojom::kServiceName), - ash::mojom::KeyboardController::Name_, - base::BindRepeating( - &ArcInputMethodManagerServiceTest::AddKeyboardControllerBinding, - base::Unretained(this))); - // Provide the local connector to ChromeKeyboardControllerClient. - chrome_keyboard_controller_client_ = - std::make_unique<ChromeKeyboardControllerClient>(connector_.get()); - chrome_keyboard_controller_client_->set_profile_for_test(profile_.get()); - + profile_ = std::make_unique<TestingProfile>(); service_ = ArcInputMethodManagerService::GetForBrowserContextForTesting( profile_.get()); test_bridge_ = new TestInputMethodManagerBridge(); @@ -280,17 +258,10 @@ base::WrapUnique(test_bridge_)); } - void AddKeyboardControllerBinding(mojo::ScopedMessagePipeHandle handle) { - ash::Shell::Get()->ash_keyboard_controller()->BindRequest( - ash::mojom::KeyboardControllerRequest(std::move(handle))); - } - void TearDown() override { test_bridge_ = nullptr; service_->Shutdown(); profile_.reset(nullptr); - chrome_keyboard_controller_client_.reset(); - connector_.reset(); tablet_mode_client_.reset(nullptr); chromeos::input_method::InputMethodManager::Shutdown(); ui::IMEBridge::Shutdown(); @@ -298,15 +269,12 @@ } private: - content::TestServiceManagerContext service_manager_context_; - std::unique_ptr<service_manager::Connector> connector_; std::unique_ptr<ArcServiceManager> arc_service_manager_; std::unique_ptr<TestingProfile> profile_; std::unique_ptr<TabletModeClient> tablet_mode_client_; - std::unique_ptr<ChromeKeyboardControllerClient> - chrome_keyboard_controller_client_; TestInputMethodManager* input_method_manager_ = nullptr; TestInputMethodManagerBridge* test_bridge_ = nullptr; // Owned by |service_| + ArcInputMethodManagerService* service_ = nullptr; DISALLOW_COPY_AND_ASSIGN(ArcInputMethodManagerServiceTest); @@ -888,25 +856,19 @@ service()->InputMethodChanged(imm(), profile(), false /* show_message */); // Enable Chrome OS virtual keyboard - auto* client = ChromeKeyboardControllerClient::Get(); - client->ClearEnableFlag( - keyboard::mojom::KeyboardEnableFlag::kAndroidDisabled); - client->SetEnableFlag(keyboard::mojom::KeyboardEnableFlag::kTouchEnabled); - client->FlushForTesting(); - base::RunLoop().RunUntilIdle(); // Allow observers to fire and process. - ASSERT_TRUE(client->is_keyboard_enabled()); + keyboard::SetTouchKeyboardEnabled(true); + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_NONE); + ASSERT_TRUE(keyboard::IsKeyboardEnabled()); // It's disabled when the ARC IME is activated. imm()->state()->SetActiveInputMethod(arc_ime_id); service()->InputMethodChanged(imm(), profile(), false); - client->FlushForTesting(); - EXPECT_FALSE(client->is_keyboard_enabled()); + EXPECT_FALSE(keyboard::IsKeyboardEnabled()); // It's re-enabled when the ARC IME is deactivated. imm()->state()->SetActiveInputMethod(component_extension_ime_id); service()->InputMethodChanged(imm(), profile(), false); - client->FlushForTesting(); - EXPECT_TRUE(client->is_keyboard_enabled()); + EXPECT_TRUE(keyboard::IsKeyboardEnabled()); } TEST_F(ArcInputMethodManagerServiceTest, ShowVirtualKeyboard) {
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 4d1f0ac6..aea6a58 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -765,8 +765,7 @@ // loading the default profile). keyboard::InitializeKeyboardResources(); chrome_keyboard_controller_client_ = - std::make_unique<ChromeKeyboardControllerClient>( - content::ServiceManagerConnection::GetForProcess()->GetConnector()); + std::make_unique<ChromeKeyboardControllerClient>(); if (lock_screen_apps::StateController::IsEnabled()) { lock_screen_apps_state_controller_ =
diff --git a/chrome/browser/chromeos/drive/download_handler.cc b/chrome/browser/chromeos/drive/download_handler.cc index 4482b430..19403ad 100644 --- a/chrome/browser/chromeos/drive/download_handler.cc +++ b/chrome/browser/chromeos/drive/download_handler.cc
@@ -19,9 +19,6 @@ #include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/chromeos/drive/file_system_util.h" #include "chrome/browser/chromeos/drive/write_on_cache_file.h" -#include "chrome/browser/download/download_core_service.h" -#include "chrome/browser/download/download_core_service_factory.h" -#include "chrome/browser/download/download_history.h" #include "components/drive/chromeos/file_system_interface.h" #include "components/drive/drive.pb.h" #include "content/public/browser/browser_task_traits.h" @@ -120,13 +117,8 @@ if (!drive_tmp_download_path.IsParent(download->GetTargetFilePath())) return false; - DownloadCoreService* download_core_service = - DownloadCoreServiceFactory::GetForBrowserContext( - content::DownloadItemUtils::GetBrowserContext(download)); - DownloadHistory* download_history = - download_core_service->GetDownloadHistory(); - - return download_history && download_history->WasRestoredFromHistory(download); + return download->GetDownloadCreationType() == + download::DownloadItem::TYPE_HISTORY_IMPORT; } // Returns an empty string |mime_type| was too generic that can be a result of
diff --git a/chrome/browser/chromeos/login/DEPS b/chrome/browser/chromeos/login/DEPS index e6d48d4..c9d8f8e 100644 --- a/chrome/browser/chromeos/login/DEPS +++ b/chrome/browser/chromeos/login/DEPS
@@ -8,6 +8,10 @@ ] specific_include_rules = { + # TODO(mash): Fix. https://crbug.com/648733 + "app_launch_controller\.cc": [ + "+ash/shell.h", + ], "login_browsertest\.cc": [ "+ash/system/status_area_widget.h", "+ash/system/unified/unified_system_tray.h",
diff --git a/chrome/browser/chromeos/login/app_launch_controller.cc b/chrome/browser/chromeos/login/app_launch_controller.cc index c98f4ba..70ff76d 100644 --- a/chrome/browser/chromeos/login/app_launch_controller.cc +++ b/chrome/browser/chromeos/login/app_launch_controller.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/login/app_launch_controller.h" #include "ash/public/cpp/ash_features.h" +#include "ash/shell.h" #include "base/bind.h" #include "base/callback.h" #include "base/files/file_path.h" @@ -30,7 +31,6 @@ #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/ash/chrome_keyboard_controller_client.h" #include "chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chromeos/settings/cros_settings_names.h" @@ -42,6 +42,7 @@ #include "extensions/common/features/feature_session_type.h" #include "net/base/network_change_notifier.h" #include "ui/base/ui_base_features.h" +#include "ui/keyboard/keyboard_util.h" namespace chromeos { @@ -320,7 +321,13 @@ profile_->InitChromeOSPreferences(); // Reset virtual keyboard to use IME engines in app profile early. - ChromeKeyboardControllerClient::Get()->ReloadKeyboard(); + if (!features::IsUsingWindowService()) { + if (keyboard::IsKeyboardEnabled()) + ash::Shell::Get()->EnableKeyboard(); + } else { + // TODO(xiyuan): Update with mash VK work http://crbug.com/648733 + NOTIMPLEMENTED(); + } kiosk_profile_loader_.reset(); startup_app_launcher_.reset(
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc index 8e3a7eea..c376705 100644 --- a/chrome/browser/download/chrome_download_manager_delegate.cc +++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -51,7 +51,6 @@ #include "chrome/common/pref_names.h" #include "chrome/common/safe_browsing/file_type_policies.h" #include "chrome/grit/generated_resources.h" -#include "components/download/database/in_progress/in_progress_cache_impl.h" #include "components/download/public/common/download_interrupt_reasons.h" #include "components/download/public/common/download_item.h" #include "components/pref_registry/pref_registry_syncable.h"
diff --git a/chrome/browser/download/download_history.cc b/chrome/browser/download/download_history.cc index 5aa915cf..4133edc 100644 --- a/chrome/browser/download/download_history.cc +++ b/chrome/browser/download/download_history.cc
@@ -91,11 +91,6 @@ PersistenceState state() const { return state_; } void SetState(PersistenceState s) { state_ = s; } - bool was_restored_from_history() const { return was_restored_from_history_; } - void set_was_restored_from_history(bool value) { - was_restored_from_history_ = value; - } - // This allows DownloadHistory::OnDownloadUpdated() to see what changed in a // DownloadItem if anything, in order to prevent writing to the database // unnecessarily. It is nullified when the item is no longer in progress in @@ -114,7 +109,6 @@ PersistenceState state_ = NOT_PERSISTED; std::unique_ptr<history::DownloadRow> info_; - bool was_restored_from_history_ = false; DISALLOW_COPY_AND_ASSIGN(DownloadHistoryData); }; @@ -290,19 +284,6 @@ observers_.RemoveObserver(observer); } -bool DownloadHistory::WasRestoredFromHistory( - const download::DownloadItem* download) const { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - const DownloadHistoryData* data = DownloadHistoryData::Get(download); - - // The OnDownloadCreated handler sets the was_restored_from_history flag when - // resetting the loading_id_. So one of the two conditions below will hold for - // a download restored from history even if the caller of this method is - // racing with our OnDownloadCreated handler. - return (data && data->was_restored_from_history()) || - download->GetId() == loading_id_; -} - void DownloadHistory::QueryCallback(std::unique_ptr<InfoVector> infos) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); // ManagerGoingDown() may have happened before the history loaded. @@ -584,7 +565,6 @@ download::DownloadItem* item) { DownloadHistoryData* data = DownloadHistoryData::Get(item); data->SetState(DownloadHistoryData::PERSISTED); - data->set_was_restored_from_history(true); loading_id_ = download::DownloadItem::kInvalidId; }
diff --git a/chrome/browser/download/download_history.h b/chrome/browser/download/download_history.h index 9e110dda..76e8d72 100644 --- a/chrome/browser/download/download_history.h +++ b/chrome/browser/download/download_history.h
@@ -93,14 +93,6 @@ void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); - // Returns true if the download was restored from history. Safe to call from - // within a DownloadManager::Observer::OnDownloadCreated handler and can be - // used to distinguish between downloads that were created due to new requests - // vs. downloads that were created due to being restored from history. Note - // that the return value is only reliable for downloads that were restored by - // this specific DownloadHistory instance. - bool WasRestoredFromHistory(const download::DownloadItem* item) const; - private: // Callback from |history_| containing all entries in the downloads database // table.
diff --git a/chrome/browser/download/download_history_unittest.cc b/chrome/browser/download/download_history_unittest.cc index fede8f9..d19b48a 100644 --- a/chrome/browser/download/download_history_unittest.cc +++ b/chrome/browser/download/download_history_unittest.cc
@@ -259,11 +259,7 @@ void CallOnDownloadCreated(size_t index) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (!pre_on_create_handler_.is_null()) - pre_on_create_handler_.Run(&item(index)); manager_observer()->OnDownloadCreated(&manager(), &item(index)); - if (!post_on_create_handler_.is_null()) - post_on_create_handler_.Run(&item(index)); } void CallOnDownloadCreatedInOrder() { @@ -320,18 +316,6 @@ history_->ExpectDownloadsRemoved(ids); } - void ExpectDownloadsRestoredFromHistory(bool expected_value) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - pre_on_create_handler_ = - base::Bind(&DownloadHistoryTest::CheckDownloadWasRestoredFromHistory, - base::Unretained(this), - expected_value); - post_on_create_handler_ = - base::Bind(&DownloadHistoryTest::CheckDownloadWasRestoredFromHistory, - base::Unretained(this), - expected_value); - } - void AddAllDownloads( content::DownloadManager::DownloadVector* download_vector) { for (size_t i = 0; i < items_.size(); ++i) @@ -431,6 +415,11 @@ Return(download::DownloadItem::TARGET_DISPOSITION_OVERWRITE)); EXPECT_CALL(item(index), IsSavePackageDownload()) .WillRepeatedly(Return(false)); + EXPECT_CALL(item(index), GetDownloadCreationType()) + .WillRepeatedly( + Return(state == download::DownloadItem::IN_PROGRESS + ? download::DownloadItem::TYPE_ACTIVE_DOWNLOAD + : download::DownloadItem::TYPE_HISTORY_IMPORT)); EXPECT_CALL(manager(), GetDownload(info->id)) .WillRepeatedly(Return(&item(index))); EXPECT_CALL(item(index), IsTemporary()).WillRepeatedly(Return(false)); @@ -451,12 +440,6 @@ } private: - void CheckDownloadWasRestoredFromHistory(bool expected_value, - download::MockDownloadItem* item) { - ASSERT_TRUE(download_history_.get()); - EXPECT_EQ(expected_value, download_history_->WasRestoredFromHistory(item)); - } - content::TestBrowserThreadBundle test_browser_thread_bundle_; std::vector<std::unique_ptr<StrictMockDownloadItem>> items_; std::unique_ptr<content::MockDownloadManager> manager_; @@ -464,8 +447,6 @@ std::unique_ptr<DownloadHistory> download_history_; content::DownloadManager::Observer* manager_observer_ = nullptr; size_t download_created_index_ = 0; - DownloadItemCallback pre_on_create_handler_; - DownloadItemCallback post_on_create_handler_; DISALLOW_COPY_AND_ASSIGN(DownloadHistoryTest); }; @@ -549,54 +530,6 @@ download_history()->RemoveObserver(&observer); } -// Test that WasRestoredFromHistory accurately identifies downloads that were -// created from history, even during an OnDownloadCreated() handler. -TEST_F(DownloadHistoryTest, DownloadHistoryTest_WasRestoredFromHistory_True) { - // This sets DownloadHistoryTest to call DH::WasRestoredFromHistory() both - // before and after DH::OnDownloadCreated() is called. At each call, the - // expected return value is |true| since the download was restored from - // history. - ExpectDownloadsRestoredFromHistory(true); - - // Construct a DownloadHistory with a single history download. This results in - // DownloadManager::CreateDownload() being called for the restored download. - // The above test expectation should verify that the value of - // WasRestoredFromHistory is correct for this download. - history::DownloadRow info; - InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"), "http://example.com/bar.pdf", - "http://example.com/referrer.html", - download::DownloadItem::COMPLETE, &info); - std::unique_ptr<InfoVector> infos(new InfoVector()); - infos->push_back(info); - CreateDownloadHistory(std::move(infos)); - - EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0))); -} - -// Test that WasRestoredFromHistory accurately identifies downloads that were -// not created from history. -TEST_F(DownloadHistoryTest, DownloadHistoryTest_WasRestoredFromHistory_False) { - // This sets DownloadHistoryTest to call DH::WasRestoredFromHistory() both - // before and after DH::OnDownloadCreated() is called. At each call, the - // expected return value is |true| since the download was restored from - // history. - ExpectDownloadsRestoredFromHistory(false); - - // Create a DownloadHistory with no history downloads. No - // DownloadManager::CreateDownload() calls are expected. - CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); - - // Notify DownloadHistory that a new download was created. The above test - // expecation should verify that WasRestoredFromHistory is correct for this - // download. - history::DownloadRow info; - InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"), "http://example.com/bar.pdf", - "http://example.com/referrer.html", - download::DownloadItem::COMPLETE, &info); - CallOnDownloadCreated(0); - ExpectDownloadCreated(info); -} - // Test creating an item, saving it to the database, changing it, saving it // back, removing it. TEST_F(DownloadHistoryTest, DownloadHistoryTest_Create) {
diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/download/download_item_model.cc index 7fa866a..faf7a2f 100644 --- a/chrome/browser/download/download_item_model.cc +++ b/chrome/browser/download/download_item_model.cc
@@ -342,8 +342,9 @@ // DownloadManager. // * There are other UI activities that need to be performed. E.g. if the // download was initiated from a new tab, then that tab should be closed. - return download_->GetDownloadType() != - download::DownloadItem::DownloadType::TYPE_HISTORY_IMPORT || + return download_->GetDownloadCreationType() != + download::DownloadItem::DownloadCreationType:: + TYPE_HISTORY_IMPORT || download_->GetState() == download::DownloadItem::IN_PROGRESS; }
diff --git a/chrome/browser/download/download_ui_controller_unittest.cc b/chrome/browser/download/download_ui_controller_unittest.cc index 45f2da4..9b9d1ffb 100644 --- a/chrome/browser/download/download_ui_controller_unittest.cc +++ b/chrome/browser/download/download_ui_controller_unittest.cc
@@ -250,7 +250,7 @@ EXPECT_CALL(*item, GetMimeType()).WillRepeatedly(Return(std::string())); EXPECT_CALL(*item, GetURL()).WillRepeatedly(ReturnRefOfCopy(GURL())); EXPECT_CALL(*item, IsTemporary()).WillRepeatedly(Return(false)); - EXPECT_CALL(*item, GetDownloadType()) + EXPECT_CALL(*item, GetDownloadCreationType()) .WillRepeatedly(Return(download::DownloadItem::TYPE_ACTIVE_DOWNLOAD)); content::DownloadItemUtils::AttachInfo(item.get(), browser_context(), nullptr); @@ -335,7 +335,7 @@ GURL url; std::unique_ptr<MockDownloadItem> item = CreateMockInProgressDownload(); - EXPECT_CALL(*item, GetDownloadType()) + EXPECT_CALL(*item, GetDownloadCreationType()) .WillRepeatedly(Return(download::DownloadItem::TYPE_HISTORY_IMPORT)); EXPECT_CALL(*item, GetState()) .WillRepeatedly(Return(download::DownloadItem::INTERRUPTED));
diff --git a/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc b/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc index 243ca6e..b6e9120 100644 --- a/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc +++ b/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
@@ -219,6 +219,7 @@ input_context.auto_capitalize = (input_method_private::AutoCapitalizeType) ConvertInputContextAutoCapitalize(context); input_context.spell_check = ConvertInputContextSpellCheck(context); + input_context.has_been_password = ConvertHasBeenPassword(context); input_context.should_do_learning = context.should_do_learning; input_context.focus_reason = input_method_private::ParseFocusReason( ConvertInputContextFocusReason(context)); @@ -342,6 +343,11 @@ return ImeObserver::ConvertInputContextSpellCheck(input_context); } + bool ConvertHasBeenPassword( + ui::IMEEngineHandlerInterface::InputContext input_context) { + return input_context.flags & ui::TEXT_INPUT_FLAG_HAS_BEEN_PASSWORD; + } + DISALLOW_COPY_AND_ASSIGN(ImeObserverChromeOS); };
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc index 2b06129..e070944 100644 --- a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc +++ b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -55,6 +55,20 @@ return feature + (enabled ? "-enabled" : "-disabled"); } +keyboard::KeyboardState getKeyboardStateEnum( + keyboard_api::KeyboardState state) { + switch (state) { + case keyboard_api::KEYBOARD_STATE_ENABLED: + return keyboard::KEYBOARD_STATE_ENABLED; + case keyboard_api::KEYBOARD_STATE_DISABLED: + return keyboard::KEYBOARD_STATE_DISABLED; + case keyboard_api::KEYBOARD_STATE_AUTO: + case keyboard_api::KEYBOARD_STATE_NONE: + return keyboard::KEYBOARD_STATE_AUTO; + } + return keyboard::KEYBOARD_STATE_AUTO; +} + } // namespace namespace extensions { @@ -118,7 +132,8 @@ // This reloads virtual keyboard even if it exists. This ensures virtual // keyboard gets the correct state of the hotrod keyboard through // chrome.virtualKeyboardPrivate.getKeyboardConfig. - ChromeKeyboardControllerClient::Get()->ReloadKeyboard(); + if (keyboard::IsKeyboardEnabled()) + ash::Shell::Get()->EnableKeyboard(); } bool ChromeVirtualKeyboardDelegate::LockKeyboard(bool state) { @@ -220,23 +235,17 @@ } bool ChromeVirtualKeyboardDelegate::SetRequestedKeyboardState(int state_enum) { - using keyboard::mojom::KeyboardEnableFlag; - auto* client = ChromeKeyboardControllerClient::Get(); - keyboard_api::KeyboardState state = - static_cast<keyboard_api::KeyboardState>(state_enum); - switch (state) { - case keyboard_api::KEYBOARD_STATE_ENABLED: - client->SetEnableFlag(KeyboardEnableFlag::kExtensionEnabled); - break; - case keyboard_api::KEYBOARD_STATE_DISABLED: - client->SetEnableFlag(KeyboardEnableFlag::kExtensionDisabled); - break; - case keyboard_api::KEYBOARD_STATE_AUTO: - case keyboard_api::KEYBOARD_STATE_NONE: - client->ClearEnableFlag(KeyboardEnableFlag::kExtensionDisabled); - client->ClearEnableFlag(KeyboardEnableFlag::kExtensionEnabled); - break; - } + keyboard::KeyboardState keyboard_state = getKeyboardStateEnum( + static_cast<keyboard_api::KeyboardState>(state_enum)); + bool was_enabled = keyboard::IsKeyboardEnabled(); + keyboard::SetRequestedKeyboardState(keyboard_state); + bool is_enabled = keyboard::IsKeyboardEnabled(); + if (was_enabled == is_enabled) + return true; + if (is_enabled) + ash::Shell::Get()->EnableKeyboard(); + else + ash::Shell::Get()->DisableKeyboard(); return true; } @@ -376,7 +385,8 @@ // keyboard gets the correct state through // chrome.virtualKeyboardPrivate.getKeyboardConfig. // TODO(oka): Extension should reload on it's own by receiving event - ChromeKeyboardControllerClient::Get()->ReloadKeyboard(); + if (keyboard::IsKeyboardEnabled()) + ash::Shell::Get()->EnableKeyboard(); } return update; }
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 7c44174..a798dc2 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -1522,10 +1522,9 @@ // A callback allow waiting for responses to complete with an expected status // and given content. auto make_browser_request = - [this](network::mojom::URLLoaderFactory* url_loader_factory, - const GURL& url, - const base::Optional<std::string>& expected_response, - int expected_net_code) { + [](network::mojom::URLLoaderFactory* url_loader_factory, const GURL& url, + const base::Optional<std::string>& expected_response, + int expected_net_code) { auto request = std::make_unique<network::ResourceRequest>(); request->url = url;
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 77bfc78..3500e126 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2696,7 +2696,8 @@ const char kUpdateMenuBadgeName[] = "Force show update menu badge"; const char kUpdateMenuBadgeDescription[] = - "When enabled, an update badge will be shown on the app menu button."; + "When enabled, a badge will be shown on the app menu button if the update " + "type is Update Available or Unsupported OS Version."; const char kUpdateMenuItemCustomSummaryDescription[] = "When this flag and the force show update menu item flag are enabled, a " @@ -2704,10 +2705,14 @@ const char kUpdateMenuItemCustomSummaryName[] = "Update menu item custom summary"; -const char kUpdateMenuItemName[] = "Force show update menu item"; -const char kUpdateMenuItemDescription[] = - R"*(When enabled, an "Update Chrome" item will be shown in the app )*" - R"*(menu.)*"; +const char kUpdateMenuTypeName[] = + "Forces the update menu type to a specific type"; +const char kUpdateMenuTypeDescription[] = + "When set, forces the update type to be a specific one, which impacts " + "the app menu badge and menu item for updates."; +const char kUpdateMenuTypeNone[] = "None"; +const char kUpdateMenuTypeUpdateAvailable[] = "Update Available"; +const char kUpdateMenuTypeUnsupportedOSVersion[] = "Unsupported OS Version"; const char kVrBrowsingTabsViewName[] = "VR browsing tabs view"; const char kVrBrowsingTabsViewDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 4cba0a6..d46cf0f 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1634,8 +1634,11 @@ extern const char kUpdateMenuItemCustomSummaryDescription[]; extern const char kUpdateMenuItemCustomSummaryName[]; -extern const char kUpdateMenuItemName[]; -extern const char kUpdateMenuItemDescription[]; +extern const char kUpdateMenuTypeName[]; +extern const char kUpdateMenuTypeDescription[]; +extern const char kUpdateMenuTypeNone[]; +extern const char kUpdateMenuTypeUpdateAvailable[]; +extern const char kUpdateMenuTypeUnsupportedOSVersion[]; extern const char kVrBrowsingTabsViewName[]; extern const char kVrBrowsingTabsViewDescription[];
diff --git a/chrome/browser/net/spdyproxy/data_reduction_proxy_browsertest.cc b/chrome/browser/net/spdyproxy/data_reduction_proxy_browsertest.cc index 9541f9a..380ba004 100644 --- a/chrome/browser/net/spdyproxy/data_reduction_proxy_browsertest.cc +++ b/chrome/browser/net/spdyproxy/data_reduction_proxy_browsertest.cc
@@ -2,17 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <tuple> + #include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/metrics/subprocess_metrics_provider.h" +#include "chrome/browser/page_load_metrics/page_load_metrics_test_waiter.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_test_utils.h" +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" @@ -21,6 +25,7 @@ #include "components/prefs/pref_service.h" #include "content/public/test/browser_test_utils.h" #include "net/dns/mock_host_resolver.h" +#include "net/test/embedded_test_server/controllable_http_response.h" #include "net/test/embedded_test_server/default_handlers.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" @@ -88,11 +93,17 @@ features::kDataReductionProxyRobustConnection, {{params::GetMissingViaBypassParamName(), "true"}, {"warmup_fetch_callback_enabled", "true"}}); - ASSERT_TRUE(embedded_test_server()->Start()); + ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); InProcessBrowserTest::SetUp(); } void SetUpOnMainThread() override { + // Make sure the favicon doesn't mess with the tests. + favicon_catcher_ = + std::make_unique<net::test_server::ControllableHttpResponse>( + embedded_test_server(), "/favicon.ico"); + embedded_test_server()->StartAcceptingConnections(); + host_resolver()->AddRule(kMockHost, "127.0.0.1"); EnableDataSaver(true); } @@ -127,6 +138,7 @@ base::test::ScopedFeatureList scoped_feature_list_; base::test::ScopedFeatureList param_feature_list_; net::EmbeddedTestServer secure_proxy_check_server_; + std::unique_ptr<net::test_server::ControllableHttpResponse> favicon_catcher_; }; class DataReductionProxyBrowsertest : public DataReductionProxyBrowsertestBase { @@ -204,6 +216,28 @@ EXPECT_EQ(GetBody(), kDummyBody); } +IN_PROC_BROWSER_TEST_F(DataReductionProxyBrowsertest, UMAMetricsRecorded) { + base::HistogramTester histogram_tester; + + // Make sure we wait for timing information. + page_load_metrics::PageLoadMetricsTestWaiter waiter( + browser()->tab_strip_model()->GetActiveWebContents()); + waiter.AddPageExpectation( + page_load_metrics::PageLoadMetricsTestWaiter::TimingField::kFirstPaint); + + // Proxy will be used, so it shouldn't matter if the host cannot be resolved. + ui_test_utils::NavigateToURL(browser(), GURL("http://does.not.resolve/echo")); + waiter.Wait(); + + SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); + histogram_tester.ExpectUniqueSample("DataReductionProxy.ProxySchemeUsed", + ProxyScheme::PROXY_SCHEME_HTTP, 1); + histogram_tester.ExpectTotalCount( + "PageLoad.Clients.DataReductionProxy.PaintTiming." + "NavigationToFirstContentfulPaint", + 1); +} + class DataReductionProxyFallbackBrowsertest : public DataReductionProxyBrowsertest { public: @@ -414,11 +448,14 @@ } class DataReductionProxyWarmupURLBrowsertest - : public DataReductionProxyBrowsertestBase, - public testing::WithParamInterface<ProxyServer_ProxyScheme> { + : public ::testing::WithParamInterface< + std::tuple<ProxyServer_ProxyScheme, bool>>, + public DataReductionProxyBrowsertestBase { public: DataReductionProxyWarmupURLBrowsertest() - : primary_server_(GetTestServerType()), + : via_header_(std::get<1>(GetParam()) ? "1.1 Chrome-Compression-Proxy" + : "bad"), + primary_server_(GetTestServerType()), secondary_server_(GetTestServerType()) {} void SetUpCommandLine(base::CommandLine* command_line) override { @@ -431,14 +468,36 @@ net::HostPortPair secondary_host_port_pair = secondary_server_.host_port_pair(); std::string config = EncodeConfig(CreateConfig( - kSessionKey, 1000, 0, GetParam(), primary_host_port_pair.host(), - primary_host_port_pair.port(), ProxyServer::UNSPECIFIED_TYPE, - GetParam(), secondary_host_port_pair.host(), - secondary_host_port_pair.port(), ProxyServer::CORE, 0.5f, false)); + kSessionKey, 1000, 0, std::get<0>(GetParam()), + primary_host_port_pair.host(), primary_host_port_pair.port(), + ProxyServer::UNSPECIFIED_TYPE, std::get<0>(GetParam()), + secondary_host_port_pair.host(), secondary_host_port_pair.port(), + ProxyServer::CORE, 0.5f, false)); command_line->AppendSwitchASCII( switches::kDataReductionProxyServerClientConfig, config); } + // Retries fetching |histogram_name| until it contains at least |count| + // samples. + void RetryForHistogramUntilCountReached( + base::HistogramTester* histogram_tester, + const std::string& histogram_name, + size_t count) { + base::RunLoop().RunUntilIdle(); + for (size_t attempt = 0; attempt < 3; ++attempt) { + const std::vector<base::Bucket> buckets = + histogram_tester->GetAllSamples(histogram_name); + size_t total_count = 0; + for (const auto& bucket : buckets) + total_count += bucket.count; + if (total_count >= count) + return; + content::FetchHistogramsFromChildProcesses(); + SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); + base::RunLoop().RunUntilIdle(); + } + } + void SetUpOnMainThread() override { primary_server_loop_ = std::make_unique<base::RunLoop>(); primary_server_.RegisterRequestHandler(base::BindRepeating( @@ -455,12 +514,11 @@ DataReductionProxyBrowsertestBase::SetUpOnMainThread(); } - void SetViaHeader(const std::string& via_header) { via_header_ = via_header; } - std::string GetHistogramName(ProxyServer::ProxyType type) { return base::StrCat( {"DataReductionProxy.WarmupURLFetcherCallback.SuccessfulFetch.", - GetParam() == ProxyServer_ProxyScheme_HTTP ? "Insecure" : "Secure", + std::get<0>(GetParam()) == ProxyServer_ProxyScheme_HTTP ? "Insecure" + : "Secure", "Proxy.", type == ProxyServer::CORE ? "Core" : "NonCore"}); } @@ -470,7 +528,7 @@ private: net::EmbeddedTestServer::Type GetTestServerType() { - if (GetParam() == ProxyServer_ProxyScheme_HTTP) + if (std::get<0>(GetParam()) == ProxyServer_ProxyScheme_HTTP) return net::EmbeddedTestServer::TYPE_HTTP; return net::EmbeddedTestServer::TYPE_HTTPS; } @@ -488,39 +546,37 @@ return response; } - std::string via_header_; + const std::string via_header_; net::EmbeddedTestServer primary_server_; net::EmbeddedTestServer secondary_server_; }; IN_PROC_BROWSER_TEST_P(DataReductionProxyWarmupURLBrowsertest, WarmupURLsFetchedForEachProxy) { - SetViaHeader("1.1 Chrome-Compression-Proxy"); primary_server_loop_->Run(); secondary_server_loop_->Run(); SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); + RetryForHistogramUntilCountReached( + &histogram_tester_, GetHistogramName(ProxyServer::UNSPECIFIED_TYPE), 1); + RetryForHistogramUntilCountReached(&histogram_tester_, + GetHistogramName(ProxyServer::CORE), 1); + histogram_tester_.ExpectUniqueSample( - GetHistogramName(ProxyServer::UNSPECIFIED_TYPE), true, 1); + GetHistogramName(ProxyServer::UNSPECIFIED_TYPE), std::get<1>(GetParam()), + 1); histogram_tester_.ExpectUniqueSample(GetHistogramName(ProxyServer::CORE), - true, 1); + std::get<1>(GetParam()), 1); } -IN_PROC_BROWSER_TEST_P(DataReductionProxyWarmupURLBrowsertest, WarmupURLsFail) { - SetViaHeader("bad"); - primary_server_loop_->Run(); - secondary_server_loop_->Run(); - - SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); - histogram_tester_.ExpectUniqueSample( - GetHistogramName(ProxyServer::UNSPECIFIED_TYPE), false, 1); - histogram_tester_.ExpectUniqueSample(GetHistogramName(ProxyServer::CORE), - false, 1); -} - -INSTANTIATE_TEST_CASE_P(, - DataReductionProxyWarmupURLBrowsertest, - testing::Values(ProxyServer_ProxyScheme_HTTP, - ProxyServer_ProxyScheme_HTTPS)); +// First parameter indicate proxy scheme for proxies that are being tested. +// Second parameter is true if the test proxy server should set via header +// correctly on the response headers. +INSTANTIATE_TEST_CASE_P( + , + DataReductionProxyWarmupURLBrowsertest, + ::testing::Combine(testing::Values(ProxyServer_ProxyScheme_HTTP, + ProxyServer_ProxyScheme_HTTPS), + ::testing::Bool())); } // namespace data_reduction_proxy
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 8922d4c..c5c8bbf 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -157,6 +157,21 @@ } } +if (!is_android && !is_chromeos) { + grit("onboarding_welcome_resources") { + source = "welcome/onboarding_welcome/onboarding_welcome_resources.grd" + + defines = chrome_grit_defines + outputs = [ + "grit/onboarding_welcome_resources.h", + "grit/onboarding_welcome_resources_map.cc", + "grit/onboarding_welcome_resources_map.h", + "onboarding_welcome_resources.pak", + ] + output_dir = "$root_gen_dir/chrome" + } +} + if (enable_extensions) { grit("extensions_resources") { if (optimize_webui) {
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs index 37b02fd..cd9f58a 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
@@ -782,17 +782,17 @@ var move = doCmd('nextObject'); mockFeedback.call(move) .expectSpeech('boldface') - .expectSpeech('Button') + .expectSpeech('Toggle Button') .expectSpeech('Partially pressed') .call(move) .expectSpeech('ok') - .expectSpeech('Button') + .expectSpeech('Toggle Button') .expectSpeech('Pressed') .call(move) .expectSpeech('cancel') - .expectSpeech('Button') + .expectSpeech('Toggle Button') .expectSpeech('Not pressed') .call(move)
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js index 35ed82b6..edbc048 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -281,7 +281,7 @@ time: {msgId: 'tag_time', inherits: 'abstractContainer'}, timer: {msgId: 'role_timer', inherits: 'abstractNameFromContents'}, toolbar: {msgId: 'role_toolbar', ignoreAncestry: true}, - toggleButton: {msgId: 'role_button', inherits: 'checkBox'}, + toggleButton: {msgId: 'role_toggle_button', inherits: 'checkBox'}, tree: {msgId: 'role_tree'}, treeItem: {msgId: 'role_treeitem'}, window: {ignoreAncestry: true}
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs index 563892f..fb46b5b 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs
@@ -688,13 +688,15 @@ <div role="button" aria-pressed="true">Subscribe</div>*/}, function(root) { var el = root.firstChild; - var o = new Output().withSpeech(cursors.Range.fromNode(el)); - assertEqualsJSON({string_: '|Subscribe|Button|Pressed|Press Search+Space to toggle.', + var o = new Output().withSpeechAndBraille(cursors.Range.fromNode(el)); + assertEqualsJSON({string_: + '|Subscribe|Toggle Button|Pressed|Press Search+Space to toggle.', spans_: [ {value: {earconId: 'CHECK_ON'}, start: 0, end: 0}, {value: 'name', start: 1, end:10}, - {value: 'role', start: 11, end: 17} + {value: 'role', start: 11, end: 24} ]}, o.speechOutputForTest); + assertEquals('Subscribe tgl btn =', o.brailleOutputForTest.string_); }); });
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd index a3e219a7..bccc6e7 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
@@ -2263,6 +2263,12 @@ <message desc="Describes nodes or anything describing them as a landmark." name="IDS_CHROMEVOX_ROLE_LANDMARK"> Landmark </message> + <message desc="Describes a button that can be pressed/toggled." name="IDS_CHROMEVOX_ROLE_TOGGLE_BUTTON"> + Toggle Button + </message> + <message desc="Brailles a button that can be pressed/toggled." name="IDS_CHROMEVOX_ROLE_TOGGLE_BUTTON_BRL"> + tgl btn + </message> <message desc="Spoken when user types invalid keys into the modifier selection field." name="IDS_CHROMEVOX_MODIFIER_ENTRY_ERROR"> No modifier pressed; please press and hold one or more modifiers; lift your fingers once done and you will hear the keys set. Tab to exit. </message>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb index 07c39aba..c4fa5d35 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -381,6 +381,7 @@ <translation id="3914173277599553213">आवश्यक</translation> <translation id="3914732343065571127">ChromeVox का निर्देश संदर्भ</translation> <translation id="3930498801443296724">पुलकोट</translation> +<translation id="3941269780691800708">माउस के नीचे वाला टेक्स्ट बोलें</translation> <translation id="3962990492275676168">वर्तमान स्थान से पढ़ना प्रारंभ करें</translation> <translation id="4004802134384979325">चेक किया गया</translation> <translation id="4006140876663370126">img</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb index 5a63194..81b1af5 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
@@ -556,7 +556,7 @@ <translation id="5336381510091010269">autoinl+lst</translation> <translation id="5349770431644471053">Spätný odkaz</translation> <translation id="5350654862897073517">Začiatok dolného indexu</translation> -<translation id="536031132345979795">Prejsť späť počas nepretržitého čítania</translation> +<translation id="536031132345979795">Prejsť späť počas plynulého čítania</translation> <translation id="5368000168321181111">Zvukové signály sú vypnuté</translation> <translation id="5374320867641260420">Žiadne ďalšie tlačidlo</translation> <translation id="5376407118396657359">Prechádzajte po bunkách pomocou klávesov Hľadať + Ctrl + Alt.</translation> @@ -766,7 +766,7 @@ <translation id="7161771961008409533">Kontextové tlačidlo</translation> <translation id="7165714724802225287">Aktuálny štýl zobrazenia je prekladaný.</translation> <translation id="7167657087543110">zvuková odozva na znaky</translation> -<translation id="7170733337935166589">Prejsť dopredu počas nepretržitého čítania</translation> +<translation id="7170733337935166589">Prejsť dopredu počas plynulého čítania</translation> <translation id="7181697990050180700">Ak chcete prispôsobiť klávesové skratky pre často používané príkazy, zadajte ich do zodpovedajúcich polí nižšie.</translation> <translation id="7203150201908454328">Rozbalené</translation> <translation id="7210211103303402262">minúty</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb index 38c4978..11971b74 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -36,7 +36,7 @@ <translation id="1201402288615127009">తదుపరి</translation> <translation id="1206619573307042055">marquee</translation> <translation id="1213216066620407844">ChromeVox - Chromeకు వాయిస్ను ఇస్తోంది</translation> -<translation id="1225437811932752266">అభినందనలు! మీరు ChromeVoxను ఉపయోగించడం కోసం ముఖ్యమైన వాటి గురించి తెలుసుకున్నారు. మీరు శోధన+ఫుల్ స్టాప్ బటన్లను ఒకేసారి నొక్కడం ద్వారా ఎప్పుడైనా ChromeVox ఆదేశాల మెనూని తెరవవచ్చని గుర్తుంచుకోండి. ChromeVox మరియు Chrome OSల గురించి మరింత తెలుసుకోవడానికి, కింది కథనాలను సందర్శించండి. +<translation id="1225437811932752266">అభినందనలు! మీరు ChromeVoxను ఉపయోగించడం కోసం ముఖ్యమైన వాటి గురించి తెలుసుకున్నారు. మీరు శోధన+పూర్ణ విరామం నొక్కడం ద్వారా ఎప్పుడైనా ChromeVox ఆదేశం మెనూని తెరవవచ్చని గుర్తుంచుకోండి. ChromeVox మరియు Chrome OS గురించి మరింత తెలుసుకోవాలంటే, కింది కథనాలను సందర్శించండి. మీరు ట్యుటోరియల్ను ముగించి ఉంటే, ChromeVoxను ఉపయోగించి మూసివేయి బటన్కి నావిగేట్ చేసి, దాన్ని క్లిక్ చేయండి.</translation> <translation id="1229276918471378188">మునుపటి జంప్</translation> <translation id="1236794971743289975">ఎండ్నోట్</translation> @@ -157,7 +157,7 @@ <translation id="2417948780551741035">ఎండ్నోట్లు</translation> <translation id="2421113964388408478">తొలగింపు</translation> <translation id="2422937916923936891">మెను అంశం తనిఖీపెట్టె</translation> -<translation id="2428534162001909979">ఆదేశ మెనులు</translation> +<translation id="2428534162001909979">ఆదేశ మెనూలు</translation> <translation id="2429669115401274487">PM</translation> <translation id="2435413342408885429"><ph name="KEY" /> ఇప్పుడు కొత్త ChromeVox మాడిఫైయర్.</translation> <translation id="2450814015951372393">తనిఖీపెట్టె</translation> @@ -379,7 +379,7 @@ <translation id="3897092660631435901">మెను</translation> <translation id="3909320334364316587">మునుపటి స్థాయి 6 శీర్షిక</translation> <translation id="3914173277599553213">అవసరమైనవి</translation> -<translation id="3914732343065571127">ChromeVox ఆదేశం సూచన</translation> +<translation id="3914732343065571127">ChromeVox ఆదేశ సూచన</translation> <translation id="3930498801443296724">పుల్కోట్</translation> <translation id="3941269780691800708">మౌస్ కింద ఉన్న వచనాన్ని చదవచ్చు.</translation> <translation id="3962990492275676168">ప్రస్తుత స్థానం నుండి చదవడం ప్రారంభించండి</translation> @@ -907,7 +907,7 @@ <translation id="8520472399088452386">స్పిన్ బటన్</translation> <translation id="8538744478902126321">ప్రస్తుత సెల్ యొక్క అడ్డు వరుస శీర్షిక వద్ద అంచనా వేయండి</translation> <translation id="8540054775867439484">ఎగువకు సర్దుబాటు చేయబడింది</translation> -<translation id="8542271685829952264">అన్ని ChromeVox ఆదేశాలు మరియు సత్వరమార్గాలను విశ్లేషించడానికి, శోధన + పూర్ణ విరామం నొక్కండి, ఆపై మెనులను నావిగేట్ చేయడానికి బాణం కీలను ఉపయోగించండి మరియు ఆదేశాన్ని సక్రియం చేయడానికి Enter నొక్కండి. శోధన+o, ఆపై t నొక్కడం ద్వారా ఇక్కడికి తిరిగి రండి.</translation> +<translation id="8542271685829952264">అన్ని ChromeVox ఆదేశాలు మరియు షార్ట్కట్లను విశ్లేషించడానికి, శోధన + పూర్ణ విరామం నొక్కండి, ఆపై మెనూలను నావిగేట్ చేయడానికి బాణం కీలను ఉపయోగించండి మరియు ఆదేశాన్ని సక్రియం చేయడానికి Enter నొక్కండి. శోధన+o, ఆపై t నొక్కడం ద్వారా ఇక్కడికి తిరిగి రండి.</translation> <translation id="8548973727659841685">అక్షరం</translation> <translation id="8561322612995434619">పాప్ అప్ను కలిగి ఉంది</translation> <translation id="8571096049907249734">బహు ఎంపి</translation>
diff --git a/chrome/browser/resources/gaia_auth_host/authenticator.js b/chrome/browser/resources/gaia_auth_host/authenticator.js index 15a8899..4a5702a74 100644 --- a/chrome/browser/resources/gaia_auth_host/authenticator.js +++ b/chrome/browser/resources/gaia_auth_host/authenticator.js
@@ -251,6 +251,7 @@ this.onHeadersReceived_.bind(this), {urls: ['<all_urls>'], types: ['main_frame', 'xmlhttprequest']}, ['responseHeaders']); + this.onBeforeSetHeadersSet_ = false; }; /**
diff --git a/chrome/browser/resources/settings/bluetooth_page/bluetooth_page.js b/chrome/browser/resources/settings/bluetooth_page/bluetooth_page.js index f532340..8c3ddb3 100644 --- a/chrome/browser/resources/settings/bluetooth_page/bluetooth_page.js +++ b/chrome/browser/resources/settings/bluetooth_page/bluetooth_page.js
@@ -162,11 +162,14 @@ }, /** + * @param {boolean} bluetoothToggleState * @return {string} * @private */ - getIcon_: function() { - if (!this.bluetoothToggleState_) + getIcon_: function(bluetoothToggleState) { + // Don't use |this.bluetoothToggleState_| here, since it has not been + // updated yet to the latest value. + if (!bluetoothToggleState) return 'settings:bluetooth-disabled'; return 'cr:bluetooth'; },
diff --git a/chrome/browser/resources/settings/people_page/BUILD.gn b/chrome/browser/resources/settings/people_page/BUILD.gn index c833517..ba5fd55 100644 --- a/chrome/browser/resources/settings/people_page/BUILD.gn +++ b/chrome/browser/resources/settings/people_page/BUILD.gn
@@ -25,6 +25,7 @@ ":profile_info_browser_proxy", ":setup_fingerprint_dialog", ":setup_pin_dialog", + ":signout_dialog", ":sync_account_control", ":sync_browser_proxy", ":sync_page", @@ -174,6 +175,7 @@ ":lock_screen", ":lock_state_behavior", ":profile_info_browser_proxy", + ":signout_dialog", ":sync_browser_proxy", "..:page_visibility", "..:route", @@ -214,6 +216,19 @@ ] } +js_library("signout_dialog") { + deps = [ + ":profile_info_browser_proxy", + ":sync_browser_proxy", + "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog", + "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button", + "//ui/webui/resources/js:i18n_behavior", + "//ui/webui/resources/js:load_time_data", + "//ui/webui/resources/js:util", + "//ui/webui/resources/js:web_ui_listener_behavior", + ] +} + js_library("sync_page") { deps = [ ":sync_browser_proxy",
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html index 460ca31..bc4cd21 100644 --- a/chrome/browser/resources/settings/people_page/people_page.html +++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -1,8 +1,5 @@ <link rel="import" href="chrome://resources/html/polymer.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html"> @@ -10,7 +7,6 @@ <link rel="import" href="chrome://resources/html/icon.html"> <link rel="import" href="chrome://resources/html/util.html"> <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> @@ -27,6 +23,7 @@ <link rel="import" href="../passwords_and_forms_page/passwords_section.html"> <link rel="import" href="../passwords_and_forms_page/payments_section.html"> <link rel="import" href="../settings_shared_css.html"> +<link rel="import" href="signout_dialog.html"> <if expr="chromeos"> <link rel="import" href="account_manager.html"> @@ -97,23 +94,6 @@ width: 40px; } - #disconnectDialog [slot=footer] .settings-box { - --settings-box-row-padding: 0; - } - - .delete-profile-warning { - padding-bottom: 10px; - padding-inline-end: var(--cr-section-padding); - /* In order to line up with the checkbox text. */ - padding-inline-start: var(--cr-section-indent-padding); - padding-top: 10px; - } - - #wideFooter { - /* Override the cr-dialog footer padding. */ - padding: 16px 0; - } - <if expr="not chromeos"> #toast { color: white; @@ -461,51 +441,10 @@ </if> </settings-animated-pages> - <template is="dom-if" if="[[showDisconnectDialog_]]" restamp> - <cr-dialog id="disconnectDialog" - ignore-popstate ignore-enter-key - on-close="onDisconnectClosed_" close-text="$i18n{close}"> - <div slot="title">$i18n{syncDisconnectTitle}</div> - <div slot="body"> - <div inner-h-t-m-l="[[ - getDisconnectExplanationHtml_(syncStatus.domain)]]"> - </div> - </div> - <div slot="button-container"> - <paper-button on-click="onDisconnectCancel_" class="cancel-button"> - $i18n{cancel} - </paper-button> - <paper-button id="disconnectConfirm" class="action-button" - hidden="[[syncStatus.domain]]" on-click="onDisconnectConfirm_"> - $i18n{syncDisconnect} - </paper-button> - <paper-button id="disconnectManagedProfileConfirm" - class="action-button" hidden="[[!syncStatus.domain]]" - on-click="onDisconnectConfirm_"> - $i18n{syncDisconnectConfirm} - </paper-button> - </div> -<if expr="(not chromeos and is_posix) or is_win or is_macosx"> - <template is="dom-if" if="[[!syncStatus.domain]]"> - <div id="wideFooter" slot="footer"> - <div class="settings-box first"> - <cr-checkbox id="deleteProfile" class="start" - checked="{{deleteProfile_}}"> - $i18n{syncDisconnectDeleteProfile} - </cr-checkbox> - <cr-expand-button expanded="{{deleteProfileWarningVisible_}}" - alt="$i18n{deleteProfileWarningExpandA11yLabel}"> - </cr-expand-button> - </div> - <iron-collapse opened="[[deleteProfileWarningVisible_]]"> - <div class="delete-profile-warning"> - [[deleteProfileWarning_]] - </div> - </iron-collapse> - </div> - </template> -</if> - </cr-dialog> + <template is="dom-if" if="[[showSignoutDialog_]]" restamp> + <settings-signout-dialog sync-status="[[syncStatus]]" + on-close="onDisconnectDialogClosed_"> + </settings-signout-dialog> </template> <template is="dom-if" if="[[showImportDataDialog_]]" restamp>
diff --git a/chrome/browser/resources/settings/people_page/people_page.js b/chrome/browser/resources/settings/people_page/people_page.js index 84b14a7..7546e97 100644 --- a/chrome/browser/resources/settings/people_page/people_page.js +++ b/chrome/browser/resources/settings/people_page/people_page.js
@@ -86,26 +86,6 @@ */ profileName_: String, - /** - * The profile deletion warning. The message indicates the number of - * profile stats that will be deleted if a non-zero count for the profile - * stats is returned from the browser. - * @private - */ - deleteProfileWarning_: String, - - /** - * True if the profile deletion warning is visible. - * @private - */ - deleteProfileWarningVisible_: Boolean, - - /** - * True if the checkbox to delete the profile has been checked. - * @private - */ - deleteProfile_: Boolean, - // <if expr="not chromeos"> /** @private */ showImportDataDialog_: { @@ -115,7 +95,7 @@ // </if> /** @private */ - showDisconnectDialog_: Boolean, + showSignoutDialog_: Boolean, // <if expr="chromeos"> /** @@ -224,9 +204,6 @@ this.addWebUIListener( 'profile-info-changed', this.handleProfileInfo_.bind(this)); - this.addWebUIListener( - 'profile-stats-count-ready', this.handleProfileStatsCount_.bind(this)); - this.syncBrowserProxy_ = settings.SyncBrowserProxyImpl.getInstance(); this.syncBrowserProxy_.getSyncStatus().then( this.handleSyncStatus_.bind(this)); @@ -245,22 +222,14 @@ settings.getCurrentRoute() == settings.routes.IMPORT_DATA; if (settings.getCurrentRoute() == settings.routes.SIGN_OUT) { - // <if expr="not chromeos"> - settings.ProfileInfoBrowserProxyImpl.getInstance().getProfileStatsCount(); - // </if> // If the sync status has not been fetched yet, optimistically display - // the disconnect dialog. There is another check when the sync status is - // fetched. The dialog will be closed then the user is not signed in. + // the sign-out dialog. There is another check when the sync status is + // fetched. The dialog will be closed when the user is not signed in. if (this.syncStatus && !this.syncStatus.signedIn) { settings.navigateToPreviousRoute(); } else { - this.showDisconnectDialog_ = true; - this.async(() => { - this.$$('#disconnectDialog').showModal(); - }); + this.showSignoutDialog_ = true; } - } else if (this.showDisconnectDialog_) { - this.$$('#disconnectDialog').close(); } }, @@ -307,22 +276,6 @@ }, /** - * Handler for when the profile stats count is pushed from the browser. - * @param {number} count - * @private - */ - handleProfileStatsCount_: function(count) { - const username = this.syncStatus.signedInUsername || ''; - this.deleteProfileWarning_ = (count > 0) ? - (count == 1) ? - loadTimeData.getStringF( - 'deleteProfileWarningWithCountsSingular', username) : - loadTimeData.getStringF( - 'deleteProfileWarningWithCountsPlural', count, username) : - loadTimeData.getStringF('deleteProfileWarningWithoutCounts', username); - }, - - /** * Handler for when the sync state is pushed from the browser. * @param {?settings.SyncStatus} syncStatus * @private @@ -334,9 +287,6 @@ const shouldRecordSigninImpression = !this.syncStatus && syncStatus && this.showSignin_(syncStatus); - if (!syncStatus.signedIn && this.showDisconnectDialog_) - this.$$('#disconnectDialog').close(); - this.syncStatus = syncStatus; if (shouldRecordSigninImpression && !this.shouldShowSyncAccountControl_()) { @@ -388,8 +338,8 @@ }, /** @private */ - onDisconnectClosed_: function() { - this.showDisconnectDialog_ = false; + onDisconnectDialogClosed_: function(e) { + this.showSignoutDialog_ = false; // <if expr="not chromeos"> if (!this.diceEnabled_) { // If DICE-enabled, this button won't exist here. @@ -403,7 +353,6 @@ if (settings.getCurrentRoute() == settings.routes.SIGN_OUT) settings.navigateToPreviousRoute(); - this.fire('signout-dialog-closed'); }, /** @private */ @@ -412,27 +361,6 @@ }, /** @private */ - onDisconnectCancel_: function() { - this.$$('#disconnectDialog').close(); - }, - - /** @private */ - onDisconnectConfirm_: function() { - const deleteProfile = !!this.syncStatus.domain || this.deleteProfile_; - // Trigger the sign out event after the navigateToPreviousRoute(). - // So that the navigation to the setting page could be finished before the - // sign out if navigateToPreviousRoute() returns synchronously even the - // browser is closed after the sign out. Otherwise, the navigation will be - // finished during session restore if the browser is closed before the async - // callback executed. - listenOnce(this, 'signout-dialog-closed', () => { - this.syncBrowserProxy_.signOut(deleteProfile); - }); - - this.$$('#disconnectDialog').close(); - }, - - /** @private */ onSyncTap_: function() { // When unified-consent is enabled, users can go to sync subpage regardless // of sync status. @@ -548,22 +476,6 @@ /** * @private - * @param {string} domain - * @return {string} - */ - getDisconnectExplanationHtml_: function(domain) { - // <if expr="not chromeos"> - if (domain) { - return loadTimeData.getStringF( - 'syncDisconnectManagedProfileExplanation', - '<span id="managed-by-domain-name">' + domain + '</span>'); - } - // </if> - return loadTimeData.getString('syncDisconnectExplanation'); - }, - - /** - * @private * @param {?settings.SyncStatus} syncStatus * @return {boolean} */
diff --git a/chrome/browser/resources/settings/people_page/signout_dialog.html b/chrome/browser/resources/settings/people_page/signout_dialog.html new file mode 100644 index 0000000..7dce40a --- /dev/null +++ b/chrome/browser/resources/settings/people_page/signout_dialog.html
@@ -0,0 +1,78 @@ +<link rel="import" href="chrome://resources/html/polymer.html"> + +<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> +<link rel="import" href="profile_info_browser_proxy.html"> +<link rel="import" href="sync_browser_proxy.html"> +<link rel="import" href="../settings_shared_css.html"> + +<dom-module id="settings-signout-dialog"> + <template> + <style include="settings-shared"> + #dialog [slot=footer] .settings-box { + --settings-box-row-padding: 0; + } + + .delete-profile-warning { + padding-bottom: 10px; + padding-inline-end: var(--cr-section-padding); + /* In order to line up with the checkbox text. */ + padding-inline-start: var(--cr-section-indent-padding); + padding-top: 10px; + } + + #wideFooter { + /* Override the cr-dialog footer padding. */ + padding: 16px 0; + } + </style> + + <cr-dialog id="dialog" ignore-enter-key close-text="$i18n{close}"> + <div slot="title">$i18n{syncDisconnectTitle}</div> + <div slot="body"> + <div inner-h-t-m-l="[[ + getDisconnectExplanationHtml_(syncStatus.domain)]]"> + </div> + </div> + <div slot="button-container"> + <paper-button id="disconnectCancel" class="cancel-button" + on-click="onDisconnectCancel_" > + $i18n{cancel} + </paper-button> + <paper-button id="disconnectConfirm" class="action-button" + hidden="[[syncStatus.domain]]" on-click="onDisconnectConfirm_"> + $i18n{syncDisconnect} + </paper-button> + <paper-button id="disconnectManagedProfileConfirm" + class="action-button" hidden="[[!syncStatus.domain]]" + on-click="onDisconnectConfirm_"> + $i18n{syncDisconnectConfirm} + </paper-button> + </div> +<if expr="(not chromeos and is_posix) or is_win or is_macosx"> + <template is="dom-if" if="[[!syncStatus.domain]]"> + <div id="wideFooter" slot="footer"> + <div class="settings-box first"> + <cr-checkbox id="deleteProfile" class="start" + checked="{{deleteProfile_}}"> + $i18n{syncDisconnectDeleteProfile} + </cr-checkbox> + <cr-expand-button expanded="{{deleteProfileWarningVisible_}}" + alt="$i18n{deleteProfileWarningExpandA11yLabel}"> + </cr-expand-button> + </div> + <iron-collapse opened="[[deleteProfileWarningVisible_]]"> + <div class="delete-profile-warning"> + [[deleteProfileWarning_]] + </div> + </iron-collapse> + </div> + </template> +</if> + </cr-dialog> + </template> + <script src="signout_dialog.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/settings/people_page/signout_dialog.js b/chrome/browser/resources/settings/people_page/signout_dialog.js new file mode 100644 index 0000000..d1564f24 --- /dev/null +++ b/chrome/browser/resources/settings/people_page/signout_dialog.js
@@ -0,0 +1,120 @@ +// 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. + +/** + * @fileoverview 'settings-signout-dialog' is a dialog that allows the + * user to turn off sync and sign out of Chromium. + */ +Polymer({ + is: 'settings-signout-dialog', + + behaviors: [WebUIListenerBehavior], + + properties: { + /** + * The current sync status, supplied by the parent. + * @type {?settings.SyncStatus} + */ + syncStatus: { + type: Object, + observer: 'syncStatusChanged_', + }, + + /** + * True if the checkbox to delete the profile has been checked. + * @private + */ + deleteProfile_: Boolean, + + /** + * True if the profile deletion warning is visible. + * @private + */ + deleteProfileWarningVisible_: Boolean, + + /** + * The profile deletion warning. The message indicates the number of + * profile stats that will be deleted if a non-zero count for the profile + * stats is returned from the browser. + * @private + */ + deleteProfileWarning_: String, + }, + + /** @override */ + attached: function() { + this.addWebUIListener( + 'profile-stats-count-ready', this.handleProfileStatsCount_.bind(this)); + // <if expr="not chromeos"> + settings.ProfileInfoBrowserProxyImpl.getInstance().getProfileStatsCount(); + // </if> + this.async(() => { + this.$.dialog.showModal(); + }); + }, + + /** + * Returns true when the user selected 'Confirm'. + * @return {boolean} + */ + wasConfirmed: function() { + return this.$.dialog.getNative().returnValue == 'success'; + }, + + /** + * Handler for when the profile stats count is pushed from the browser. + * @param {number} count + * @private + */ + handleProfileStatsCount_: function(count) { + const username = this.syncStatus.signedInUsername || ''; + if (count == 0) { + this.deleteProfileWarning_ = loadTimeData.getStringF( + 'deleteProfileWarningWithoutCounts', username); + } else if (count == 1) { + this.deleteProfileWarning_ = loadTimeData.getStringF( + 'deleteProfileWarningWithCountsSingular', username); + } else { + this.deleteProfileWarning_ = loadTimeData.getStringF( + 'deleteProfileWarningWithCountsPlural', count, username); + } + }, + + /** + * Polymer observer for syncStatus. + * @private + */ + syncStatusChanged_: function() { + if (!this.syncStatus.signedIn && this.$.dialog.open) + this.$.dialog.close(); + }, + + /** + * @private + * @param {string} domain + * @return {string} + */ + getDisconnectExplanationHtml_: function(domain) { + // <if expr="not chromeos"> + if (domain) { + return loadTimeData.getStringF( + 'syncDisconnectManagedProfileExplanation', + '<span id="managed-by-domain-name">' + domain + '</span>'); + } + // </if> + return loadTimeData.getString('syncDisconnectExplanation'); + }, + + /** @private */ + onDisconnectCancel_: function() { + this.$.dialog.cancel(); + }, + + /** @private */ + onDisconnectConfirm_: function() { + this.$.dialog.close(); + const deleteProfile = !!this.syncStatus.domain || this.deleteProfile_; + settings.SyncBrowserProxyImpl.getInstance().signOut(deleteProfile); + }, +});
diff --git a/chrome/browser/resources/settings/privacy_page/BUILD.gn b/chrome/browser/resources/settings/privacy_page/BUILD.gn index a206ebd..b938576 100644 --- a/chrome/browser/resources/settings/privacy_page/BUILD.gn +++ b/chrome/browser/resources/settings/privacy_page/BUILD.gn
@@ -37,6 +37,7 @@ "..:page_visibility", "..:route", "../controls:settings_toggle_button", + "../people_page:signout_dialog", "../people_page:sync_browser_proxy", "../settings_page:settings_animated_pages", "../site_settings:constants",
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html index 397ec6d..fda182d 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -12,6 +12,7 @@ <link rel="import" href="../controls/settings_toggle_button.html"> <link rel="import" href="../lifetime_browser_proxy.html"> <link rel="import" href="../people_page/sync_browser_proxy.html"> +<link rel="import" href="../people_page/signout_dialog.html"> <link rel="import" href="../route.html"> <link rel="import" href="../settings_page/settings_animated_pages.html"> <link rel="import" href="../settings_page/settings_subpage.html"> @@ -581,6 +582,13 @@ </template> </template> </settings-animated-pages> + + <template is="dom-if" if="[[showSignoutDialog_]]" restamp> + <settings-signout-dialog sync-status="[[syncStatus]]" + on-close="onSignoutDialogClosed_"> + </settings-signout-dialog> + </template> + <if expr="not chromeos"> <cr-toast id="toast" open="[[showRestart_]]"> <div>$i18n{restartToApplyChanges}</div>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.js b/chrome/browser/resources/settings/privacy_page/privacy_page.js index bf17f64..75f9ce1 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.js +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.js
@@ -166,6 +166,9 @@ /** @private */ showRestart_: Boolean, // </if> + + /** @private */ + showSignoutDialog_: Boolean, }, /** @override */ @@ -369,9 +372,9 @@ /** @private */ onSigninAllowedChange_: function() { if (this.syncStatus.signedIn && !this.$.signinAllowedToggle.checked) { - // Switch the toggle back on and route to people_page's disconnect dialog. + // Switch the toggle back on and show the signout dialog. this.$.signinAllowedToggle.checked = true; - settings.navigateTo(settings.routes.SIGN_OUT); + this.showSignoutDialog_ = true; } else { /** @type {!SettingsToggleButtonElement} */ (this.$.signinAllowedToggle) .sendPrefChange(); @@ -379,6 +382,19 @@ } }, + /** @private */ + onSignoutDialogClosed_: function() { + if (/** @type {!SettingsSignoutDialogElement} */ ( + this.$$('settings-signout-dialog')) + .wasConfirmed()) { + this.$.signinAllowedToggle.checked = false; + /** @type {!SettingsToggleButtonElement} */ (this.$.signinAllowedToggle) + .sendPrefChange(); + this.showRestart_ = true; + } + this.showSignoutDialog_ = false; + }, + /** * @param {!Event} e * @private
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index 825b5d6..d3e89996 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -817,6 +817,14 @@ file="people_page/manage_profile_browser_proxy.js" type="chrome_html" /> </if> + <structure name="IDR_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_HTML" + file="people_page/signout_dialog.html" + type="chrome_html" + preprocess="true" /> + <structure name="IDR_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_JS" + file="people_page/signout_dialog.js" + type="chrome_html" + preprocess="true" /> <structure name="IDR_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_HTML" file="people_page/profile_info_browser_proxy.html" type="chrome_html" />
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd b/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd new file mode 100644 index 0000000..f8ba23e --- /dev/null +++ b/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd
@@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<grit latest_public_release="0" current_release="1" output_all_resource_defines="false"> + <outputs> + <output filename="grit/onboarding_welcome_resources.h" type="rc_header"> + <emit emit_type='prepend'></emit> + </output> + <output filename="grit/onboarding_welcome_resources_map.cc" + type="resource_file_map_source" /> + <output filename="grit/onboarding_welcome_resources_map.h" + type="resource_map_header" /> + <output filename="onboarding_welcome_resources.pak" type="data_package" /> + </outputs> + <release seq="1"> + <structures> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_LANDING_VIEW_JS" + file="landing_view.js" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_NAVIGATION_BEHAVIOR_HTML" + file="navigation_behavior.html" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_NAVIGATION_BEHAVIOR_JS" + file="navigation_behavior.js" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_APP_HTML" + file="welcome_app.html" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_APP_JS" + file="welcome_app.js" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_BROWSER_PROXY_HTML" + file="welcome_browser_proxy.html" + type="chrome_html"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_BROWSER_PROXY_JS" + file="welcome_browser_proxy.js" + type="chrome_html"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_CSS" + file="welcome.css" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_HTML" + file="welcome.html" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_LANDING_VIEW_HTML" + file="landing_view.html" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_CHOOSER_SHARED_CSS" + file="shared\chooser_shared_css.html" + type="chrome_html" /> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_I18N_SETUP_HTML" + file="shared\i18n_setup.html" + type="chrome_html" /> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SIGNIN_VIEW_HTML" + file="signin_view.html" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SIGNIN_VIEW_JS" + file="signin_view.js" + type="chrome_html" + preprocess="true"/> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ACTION_LINK_STYLE_JS" + file="shared\action_link_style.js" + type="chrome_html" /> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ACTION_LINK_STYLE_CSS_HTML" + file="shared\action_link_style_css.html" + type="chrome_html" /> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ONBOARDING_BACKGROUND_HTML" + file="shared\onboarding_background.html" + type="chrome_html" /> + <structure name="IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ONBOARDING_BACKGROUND_JS" + file="shared\onboarding_background.js" + type="chrome_html" /> + + <!-- NUX Email--> + <structure name="IDR_NUX_EMAIL_CHOOSER_HTML" + file="email\email_chooser.html" + type="chrome_html" /> + <structure name="IDR_NUX_EMAIL_CHOOSER_JS" + file="email\email_chooser.js" + type="chrome_html" /> + <structure name="IDR_NUX_EMAIL_HTML" + file="email\nux_email.html" + type="chrome_html" /> + <structure name="IDR_NUX_EMAIL_JS" + file="email\nux_email.js" + type="chrome_html" /> + <structure name="IDR_NUX_EMAIL_PROXY_HTML" + file="email\nux_email_proxy.html" + type="chrome_html" /> + <structure name="IDR_NUX_EMAIL_PROXY_JS" + file="email\nux_email_proxy.js" + type="chrome_html" /> + + <!-- NUX Google apps--> + <structure name="IDR_NUX_GOOGLE_APPS_HTML" + file="google_apps\nux_google_apps.html" + type="chrome_html" /> + <structure name="IDR_NUX_GOOGLE_APPS_JS" + file="google_apps\nux_google_apps.js" + type="chrome_html" /> + <structure name="IDR_NUX_GOOGLE_APPS_PROXY_HTML" + file="google_apps\nux_google_apps_proxy.html" + type="chrome_html" /> + <structure name="IDR_NUX_GOOGLE_APPS_PROXY_JS" + file="google_apps\nux_google_apps_proxy.js" + type="chrome_html" /> + <structure name="IDR_NUX_GOOGLE_APPS_CHOOSER_HTML" + file="google_apps\apps_chooser.html" + type="chrome_html" /> + <structure name="IDR_NUX_GOOGLE_APPS_CHOOSER_JS" + file="google_apps\apps_chooser.js" + type="chrome_html" /> + <structure name="IDR_NUX_SET_AS_DEFAULT_HTML" + file="set_as_default\nux_set_as_default.html" + type="chrome_html" /> + <structure name="IDR_NUX_SET_AS_DEFAULT_JS" + file="set_as_default\nux_set_as_default.js" + type="chrome_html" /> + <structure name="IDR_NUX_SET_AS_DEFAULT_PROXY_HTML" + file="set_as_default\nux_set_as_default_proxy.html" + type="chrome_html" /> + <structure name="IDR_NUX_SET_AS_DEFAULT_PROXY_JS" + file="set_as_default\nux_set_as_default_proxy.js" + type="chrome_html" /> + </structures> + </release> +</grit>
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc index c12934f4..11fd9f8f 100644 --- a/chrome/browser/search/instant_service.cc +++ b/chrome/browser/search/instant_service.cc
@@ -324,7 +324,8 @@ const std::string& new_title) { if (most_visited_sites_) { return most_visited_sites_->UpdateCustomLink(url, new_url, - base::UTF8ToUTF16(new_title)); + base::UTF8ToUTF16(new_title), + /*is_user_action=*/true); } return false; } @@ -489,11 +490,14 @@ // already timed out. if (duration > base::TimeDelta::FromSeconds(kCustomLinkDialogTimeoutSeconds)) { - GURL::Replacements replacements; - replacements.SetSchemeStr(url::kHttpScheme); - GURL new_url = url.ReplaceComponents(replacements); - UpdateCustomLink(url, new_url, /*new_title=*/std::string()); timeout = true; + if (most_visited_sites_) { + GURL::Replacements replacements; + replacements.SetSchemeStr(url::kHttpScheme); + GURL new_url = url.ReplaceComponents(replacements); + most_visited_sites_->UpdateCustomLink(url, new_url, base::string16(), + /*is_user_action=*/false); + } } } std::move(callback).Run(resolves, timeout);
diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc index e88405c..8df262c 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
@@ -1389,6 +1389,9 @@ prefs_->GetDictionary(arc::prefs::kArcApps); for (base::DictionaryValue::Iterator app_it(*apps); !app_it.IsAtEnd(); app_it.Advance()) { + if (!crx_file::id_util::IdIsValid(app_it.key())) + continue; + const base::Value* value = &app_it.value(); const base::DictionaryValue* app; if (!value->GetAsDictionary(&app)) { @@ -1398,7 +1401,7 @@ std::string app_package; if (!app->GetString(kPackageName, &app_package)) { - NOTREACHED(); + LOG(ERROR) << "App is malformed: " << app_it.key(); continue; }
diff --git a/chrome/browser/ui/ash/chrome_keyboard_controller_client.cc b/chrome/browser/ui/ash/chrome_keyboard_controller_client.cc index d194fd6..f13dbe0 100644 --- a/chrome/browser/ui/ash/chrome_keyboard_controller_client.cc +++ b/chrome/browser/ui/ash/chrome_keyboard_controller_client.cc
@@ -8,8 +8,9 @@ #include "ash/public/interfaces/constants.mojom.h" #include "base/values.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "content/public/browser/browser_context.h" +#include "content/public/common/service_manager_connection.h" #include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h" #include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h" #include "extensions/browser/event_router.h" @@ -26,6 +27,13 @@ static ChromeKeyboardControllerClient* g_chrome_keyboard_controller_client = nullptr; +Profile* GetProfile() { + // Always use the active profile for generating keyboard events so that any + // virtual keyboard extensions associated with the active user are notified. + // (Note: UI and associated extensions only exist for the active user). + return ProfileManager::GetActiveUserProfile(); +} + } // namespace // static @@ -35,17 +43,13 @@ return g_chrome_keyboard_controller_client; } -// static -bool ChromeKeyboardControllerClient::HasInstance() { - return !!g_chrome_keyboard_controller_client; -} - -ChromeKeyboardControllerClient::ChromeKeyboardControllerClient( - service_manager::Connector* connector) { +ChromeKeyboardControllerClient::ChromeKeyboardControllerClient() { CHECK(!g_chrome_keyboard_controller_client); g_chrome_keyboard_controller_client = this; - connector->BindInterface(ash::mojom::kServiceName, &keyboard_controller_ptr_); + content::ServiceManagerConnection::GetForProcess() + ->GetConnector() + ->BindInterface(ash::mojom::kServiceName, &keyboard_controller_ptr_); // Request the configuration. This will be queued until the service is ready. keyboard_controller_ptr_->GetKeyboardConfig(base::BindOnce( @@ -83,24 +87,6 @@ keyboard_controller_ptr_->SetKeyboardConfig(cached_keyboard_config_.Clone()); } -void ChromeKeyboardControllerClient::SetEnableFlag( - const keyboard::mojom::KeyboardEnableFlag& flag) { - keyboard_controller_ptr_->SetEnableFlag(flag); -} - -void ChromeKeyboardControllerClient::ClearEnableFlag( - const keyboard::mojom::KeyboardEnableFlag& flag) { - keyboard_controller_ptr_->ClearEnableFlag(flag); -} - -void ChromeKeyboardControllerClient::ReloadKeyboard() { - keyboard_controller_ptr_->ReloadKeyboard(); -} - -void ChromeKeyboardControllerClient::FlushForTesting() { - keyboard_controller_ptr_.FlushForTesting(); -} - void ChromeKeyboardControllerClient::OnGetInitialKeyboardConfig( keyboard::mojom::KeyboardConfigPtr config) { // Only set the cached value if not already set by SetKeyboardConfig (the @@ -112,26 +98,19 @@ ash::mojom::KeyboardControllerObserverAssociatedPtrInfo ptr_info; keyboard_controller_observer_binding_.Bind(mojo::MakeRequest(&ptr_info)); keyboard_controller_ptr_->AddObserver(std::move(ptr_info)); - - // Request the initial enabled state. - keyboard_controller_ptr_->IsKeyboardEnabled( - base::BindOnce(&ChromeKeyboardControllerClient::OnKeyboardEnabledChanged, - weak_ptr_factory_.GetWeakPtr())); } void ChromeKeyboardControllerClient::OnKeyboardEnabledChanged(bool enabled) { - bool was_enabled = is_keyboard_enabled_; - is_keyboard_enabled_ = enabled; - if (enabled || !was_enabled) + if (enabled) return; // When the keyboard becomes disabled, send the onKeyboardClosed event. Profile* profile = GetProfile(); extensions::EventRouter* router = extensions::EventRouter::Get(profile); - // |router| may be null in tests. - if (!router || !router->HasEventListener( - virtual_keyboard_private::OnKeyboardClosed::kEventName)) { + + if (!router->HasEventListener( + virtual_keyboard_private::OnKeyboardClosed::kEventName)) { return; } @@ -160,9 +139,9 @@ const gfx::Rect& bounds) { Profile* profile = GetProfile(); extensions::EventRouter* router = extensions::EventRouter::Get(profile); - // |router| may be null in tests. - if (!router || !router->HasEventListener( - virtual_keyboard_private::OnBoundsChanged::kEventName)) { + + if (!router->HasEventListener( + virtual_keyboard_private::OnBoundsChanged::kEventName)) { return; } @@ -180,13 +159,3 @@ std::move(event_args), profile); router->BroadcastEvent(std::move(event)); } - -Profile* ChromeKeyboardControllerClient::GetProfile() { - if (profile_for_test_) - return profile_for_test_; - - // Always use the active profile for generating keyboard events so that any - // virtual keyboard extensions associated with the active user are notified. - // (Note: UI and associated extensions only exist for the active user). - return ProfileManager::GetActiveUserProfile(); -}
diff --git a/chrome/browser/ui/ash/chrome_keyboard_controller_client.h b/chrome/browser/ui/ash/chrome_keyboard_controller_client.h index 82706287..fc79e83 100644 --- a/chrome/browser/ui/ash/chrome_keyboard_controller_client.h +++ b/chrome/browser/ui/ash/chrome_keyboard_controller_client.h
@@ -12,12 +12,6 @@ #include "base/observer_list_types.h" #include "mojo/public/cpp/bindings/associated_binding.h" -class Profile; - -namespace service_manager { -class Connector; -} - // This class implements mojom::KeyboardControllerObserver and makes calls // into the mojom::KeyboardController service. class ChromeKeyboardControllerClient @@ -35,16 +29,12 @@ }; // This class uses a static getter and only supports a single instance. - explicit ChromeKeyboardControllerClient( - service_manager::Connector* connector); + ChromeKeyboardControllerClient(); ~ChromeKeyboardControllerClient() override; // Static getter. The single instance must be instantiated first. static ChromeKeyboardControllerClient* Get(); - // Used in tests to determine whether this has been instantiated. - static bool HasInstance(); - void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); @@ -54,19 +44,6 @@ // Sets the new keyboard configuration and updates the cached config. void SetKeyboardConfig(const keyboard::mojom::KeyboardConfig& config); - // Sets/clears the privided keyboard enable state. - void SetEnableFlag(const keyboard::mojom::KeyboardEnableFlag& state); - void ClearEnableFlag(const keyboard::mojom::KeyboardEnableFlag& state); - - // Reloads the virtual keyboard if enabled. - void ReloadKeyboard(); - - void FlushForTesting(); - - bool is_keyboard_enabled() { return is_keyboard_enabled_; } - - void set_profile_for_test(Profile* profile) { profile_for_test_ = profile; } - private: void OnGetInitialKeyboardConfig(keyboard::mojom::KeyboardConfigPtr config); @@ -77,9 +54,6 @@ void OnKeyboardVisibilityChanged(bool visible) override; void OnKeyboardVisibleBoundsChanged(const gfx::Rect& bounds) override; - // Returns either the test profile or the active user profile. - Profile* GetProfile(); - ash::mojom::KeyboardControllerPtr keyboard_controller_ptr_; mojo::AssociatedBinding<ash::mojom::KeyboardControllerObserver> keyboard_controller_observer_binding_{this}; @@ -87,13 +61,8 @@ // Cached copy of the latest config provided by mojom::KeyboardController. keyboard::mojom::KeyboardConfigPtr cached_keyboard_config_; - // Tracks the enabled state of the keyboard. - bool is_keyboard_enabled_ = false; - base::ObserverList<Observer> observers_; - Profile* profile_for_test_ = nullptr; - base::WeakPtrFactory<ChromeKeyboardControllerClient> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(ChromeKeyboardControllerClient);
diff --git a/chrome/browser/ui/ash/chrome_keyboard_ui.cc b/chrome/browser/ui/ash/chrome_keyboard_ui.cc index 90df26a3..1c975624 100644 --- a/chrome/browser/ui/ash/chrome_keyboard_ui.cc +++ b/chrome/browser/ui/ash/chrome_keyboard_ui.cc
@@ -38,6 +38,7 @@ #include "ui/keyboard/keyboard_controller.h" #include "ui/keyboard/keyboard_resource_util.h" #include "ui/keyboard/keyboard_switches.h" +#include "ui/keyboard/keyboard_util.h" #include "ui/wm/core/shadow_types.h" namespace {
diff --git a/chrome/browser/ui/ash/launcher/DEPS b/chrome/browser/ui/ash/launcher/DEPS index 192ab8b..4c2ac88b 100644 --- a/chrome/browser/ui/ash/launcher/DEPS +++ b/chrome/browser/ui/ash/launcher/DEPS
@@ -7,6 +7,10 @@ "arc_app_window_launcher_controller\.cc": [ "+ash/shell.h", ], + # TODO(mash): Fix. https://crbug.com/826391 + "chrome_launcher_controller\.cc": [ + "+ash/shell.h", + ], # https://crbug.com/887156 "crostini_app_window_shelf_controller\.cc": [ "+ash/shell.h",
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc index 20b60a6..61c8619 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -15,6 +15,7 @@ #include "ash/public/cpp/shelf_prefs.h" #include "ash/public/cpp/window_animation_types.h" #include "ash/public/interfaces/constants.mojom.h" +#include "ash/shell.h" #include "base/strings/pattern.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -34,7 +35,6 @@ #include "chrome/browser/ui/app_list/crostini/crostini_app_icon_loader.h" #include "chrome/browser/ui/app_list/internal_app/internal_app_icon_loader.h" #include "chrome/browser/ui/app_list/md_icon_normalizer.h" -#include "chrome/browser/ui/ash/chrome_keyboard_controller_client.h" #include "chrome/browser/ui/ash/chrome_launcher_prefs.h" #include "chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h" #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h" @@ -82,6 +82,7 @@ #include "ui/base/resource/resource_bundle.h" #include "ui/base/ui_base_features.h" #include "ui/display/types/display_constants.h" +#include "ui/keyboard/keyboard_util.h" #include "ui/resources/grit/ui_resources.h" using extension_misc::kChromeAppId; @@ -288,7 +289,10 @@ void ChromeLauncherController::Init() { CreateBrowserShortcutLauncherItem(); UpdateAppLaunchersFromPref(); - SetVirtualKeyboardBehaviorFromPrefs(); + + // TODO(sky): update unit test so that this test isn't necessary. + if (ash::Shell::HasInstance()) + SetVirtualKeyboardBehaviorFromPrefs(); } ash::ShelfID ChromeLauncherController::CreateAppLauncherItem( @@ -992,20 +996,24 @@ } void ChromeLauncherController::SetVirtualKeyboardBehaviorFromPrefs() { - using keyboard::mojom::KeyboardEnableFlag; - if (!ChromeKeyboardControllerClient::HasInstance()) // May be null in tests - return; - auto* client = ChromeKeyboardControllerClient::Get(); const PrefService* service = profile()->GetPrefs(); - if (service->HasPrefPath(prefs::kTouchVirtualKeyboardEnabled)) { - // Since these flags are mutually exclusive, setting one clears the other. - client->SetEnableFlag( - service->GetBoolean(prefs::kTouchVirtualKeyboardEnabled) - ? KeyboardEnableFlag::kPolicyEnabled - : KeyboardEnableFlag::kPolicyDisabled); + const bool was_enabled = keyboard::IsKeyboardEnabled(); + if (!service->HasPrefPath(prefs::kTouchVirtualKeyboardEnabled)) { + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_NONE); } else { - client->ClearEnableFlag(KeyboardEnableFlag::kPolicyDisabled); - client->ClearEnableFlag(KeyboardEnableFlag::kPolicyEnabled); + const bool enable = + service->GetBoolean(prefs::kTouchVirtualKeyboardEnabled); + keyboard::SetKeyboardShowOverride( + enable ? keyboard::KEYBOARD_SHOW_OVERRIDE_ENABLED + : keyboard::KEYBOARD_SHOW_OVERRIDE_DISABLED); + } + // TODO(crbug.com/557406): Fix this interaction pattern in Mash. + if (!features::IsMultiProcessMash()) { + const bool is_enabled = keyboard::IsKeyboardEnabled(); + if (was_enabled && !is_enabled) + ash::Shell::Get()->DisableKeyboard(); + else if (is_enabled && !was_enabled) + ash::Shell::Get()->EnableKeyboard(); } }
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc index dfd23d4..2fa41fa 100644 --- a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc +++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc
@@ -37,6 +37,13 @@ TabletModeClient::Get()->tablet_mode_enabled(); } +bool IsSpokenFeedbackEnabled() { + chromeos::AccessibilityManager* accessibility_manager = + chromeos::AccessibilityManager::Get(); + return accessibility_manager && + accessibility_manager->IsSpokenFeedbackEnabled(); +} + // Based on the current status of |contents|, returns the browser top controls // shown state constraints, which specifies if the top controls are allowed to // be only shown, or either shown or hidden. @@ -275,7 +282,16 @@ browser_view_->browser()->tab_strip_model()->AddObserver(this); - OnEnabledStateChanged(IsTabletModeEnabled() && !browser_view->IsFullscreen()); + chromeos::AccessibilityManager* accessibility_manager = + chromeos::AccessibilityManager::Get(); + if (accessibility_manager) { + accessibility_status_subscription_ = + accessibility_manager->RegisterCallback(base::BindRepeating( + &TopControlsSlideControllerChromeOS::OnAccessibilityStatusChanged, + base::Unretained(this))); + } + + OnEnabledStateChanged(CanEnable(base::nullopt)); } TopControlsSlideControllerChromeOS::~TopControlsSlideControllerChromeOS() { @@ -342,14 +358,13 @@ defer_disabling_ = false; // Don't just set |is_enabled_| to false. Make sure it's a correct value. - OnEnabledStateChanged(IsTabletModeEnabled() && - !browser_view_->IsFullscreen()); + OnEnabledStateChanged(CanEnable(base::nullopt)); } } void TopControlsSlideControllerChromeOS::OnBrowserFullscreenStateWillChange( bool new_fullscreen_state) { - OnEnabledStateChanged(IsTabletModeEnabled() && !new_fullscreen_state); + OnEnabledStateChanged(CanEnable(new_fullscreen_state)); } bool TopControlsSlideControllerChromeOS::DoBrowserControlsShrinkRendererSize( @@ -391,7 +406,7 @@ void TopControlsSlideControllerChromeOS::OnTabletModeToggled( bool tablet_mode_enabled) { - OnEnabledStateChanged(tablet_mode_enabled && !browser_view_->IsFullscreen()); + OnEnabledStateChanged(CanEnable(base::nullopt)); } void TopControlsSlideControllerChromeOS::TabInsertedAt( @@ -477,6 +492,24 @@ UpdateBrowserControlsStateShown(active_contents, true /* animate */); } +bool TopControlsSlideControllerChromeOS::CanEnable( + base::Optional<bool> fullscreen_state) const { + return IsTabletModeEnabled() && + !(fullscreen_state ? *fullscreen_state + : browser_view_->IsFullscreen()) && + !IsSpokenFeedbackEnabled(); +} + +void TopControlsSlideControllerChromeOS::OnAccessibilityStatusChanged( + const chromeos::AccessibilityStatusEventDetails& event_details) { + if (event_details.notification_type != + chromeos::ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK) { + return; + } + + OnEnabledStateChanged(CanEnable(base::nullopt)); +} + void TopControlsSlideControllerChromeOS::OnEnabledStateChanged(bool new_state) { if (new_state == is_enabled_) return;
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h index ff1a1262..a6ee438 100644 --- a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h +++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h
@@ -9,6 +9,8 @@ #include "base/containers/flat_map.h" #include "base/macros.h" +#include "base/optional.h" +#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" #include "chrome/browser/ui/ash/tablet_mode_client_observer.h" #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" #include "chrome/browser/ui/views/frame/top_controls_slide_controller.h" @@ -82,6 +84,21 @@ const content::NotificationDetails& details) override; private: + // Returns true if this feature can be turned on. If |fullscreen_state| is + // supplied, it will be used in calculating the result, otherwise the current + // fullscreen state will be queried from BrowserView. This is needed since + // BrowserView informs us with fullscreen state changes before they happen + // (See OnBrowserFullscreenStateWillChange()) so that we can disable the + // sliding behavior *before* immersive mode is entered. + bool CanEnable(base::Optional<bool> fullscreen_state) const; + + // Called back from the AccessibilityManager so that we're updated by the + // status of Chromevox, which when enabled, sliding the top-controls should + // be disabled. This is important for users who want to touch explore and need + // this to be consistent. + void OnAccessibilityStatusChanged( + const chromeos::AccessibilityStatusEventDetails& event_details); + void OnEnabledStateChanged(bool new_state); // Refreshes the status of the browser top controls. @@ -148,6 +165,9 @@ content::NotificationRegistrar registrar_; + std::unique_ptr<chromeos::AccessibilityStatusSubscription> + accessibility_status_subscription_; + DISALLOW_COPY_AND_ASSIGN(TopControlsSlideControllerChromeOS); };
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc index 011a9eb..2c60056 100644 --- a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc +++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc
@@ -18,6 +18,7 @@ #include "base/strings/safe_sprintf.h" #include "base/test/scoped_feature_list.h" #include "cc/base/math_util.h" +#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" #include "chrome/browser/ui/ash/tablet_mode_client.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" @@ -1008,4 +1009,78 @@ CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); } +// Waits for a compositor frame to be drawn and committed on the given +// web_contents. +class CompositorFrameWaiter : content::WebContentsObserver { + public: + explicit CompositorFrameWaiter(content::WebContents* contents) + : WebContentsObserver(contents) {} + ~CompositorFrameWaiter() override = default; + + void Wait() { run_loop_.Run(); } + + // content::WebContentsObserver: + void DidCommitAndDrawCompositorFrame() override { run_loop_.Quit(); } + + private: + base::RunLoop run_loop_; + + DISALLOW_COPY_AND_ASSIGN(CompositorFrameWaiter); +}; + +IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, TestToggleChromeVox) { + ToggleTabletMode(); + ASSERT_TRUE(GetTabletModeEnabled()); + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + + OpenUrlAtIndex(embedded_test_server()->GetURL("/top_controls_scroll.html"), + 0); + content::WebContents* active_contents = + browser_view()->GetActiveWebContents(); + PageStateUpdateWaiter page_state_update_waiter(active_contents); + page_state_update_waiter.Wait(); + EXPECT_TRUE( + browser_view()->DoBrowserControlsShrinkRendererSize(active_contents)); + + aura::Window* browser_window = browser()->window()->GetNativeWindow(); + ui::test::EventGenerator event_generator(browser_window->GetRootWindow(), + browser_window); + const gfx::Point start_point = event_generator.current_location(); + const gfx::Point end_point = start_point + gfx::Vector2d(0, -100); + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + TopControlsShownRatioWaiter waiter(top_controls_slide_controller()); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); + + // Enable Chromevox (spoken feedback) and expect that top-chrome will be fully + // shown, and sliding top-chrome is no longer enabled. + chromeos::AccessibilityManager::Get()->EnableSpokenFeedback(true); + EXPECT_TRUE(chromeos::AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); + waiter.WaitForRatio(1.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + EXPECT_FALSE(top_controls_slide_controller()->IsEnabled()); + EXPECT_EQ(browser_view()->GetTopControlsHeight(), 0); + EXPECT_FALSE( + browser_view()->DoBrowserControlsShrinkRendererSize(active_contents)); + + // Now disable Chromevox, and expect it's now possible to hide top-chrome with + // gesture scrolling. + CompositorFrameWaiter compositor_frame_waiter(active_contents); + chromeos::AccessibilityManager::Get()->EnableSpokenFeedback(false); + compositor_frame_waiter.Wait(); + EXPECT_FALSE( + chromeos::AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); + base::RunLoop().RunUntilIdle(); + // Scroll down, top-chrome should hide. + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); +} + } // namespace
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc index d20d4ac..ea3301d 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
@@ -11,12 +11,14 @@ #include "base/macros.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "chrome/common/url_constants.h" #include "chrome/grit/browser_resources.h" #include "components/arc/arc_prefs.h" #include "components/prefs/pref_service.h" +#include "components/user_manager/user_manager.h" #include "content/public/browser/host_zoom_map.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" @@ -72,8 +74,12 @@ int container_id = dialog->GetDialogModalType() == ui::MODAL_TYPE_NONE ? ash::kShellWindowId_DefaultContainer : ash::kShellWindowId_LockSystemModalContainer; - chrome::ShowWebDialogInContainer( + auto* window = chrome::ShowWebDialogInContainer( container_id, ProfileManager::GetActiveUserProfile(), dialog, true); + + MultiUserWindowManager::GetInstance()->SetWindowOwner( + window, + user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()); } // static
diff --git a/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc b/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc index 37d8b70..c9eacc5f 100644 --- a/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc
@@ -26,7 +26,7 @@ ui::SelectFileDialog::Type type, const base::string16& title, const base::FilePath& default_path, - const base::string16& filter, + const std::vector<ui::FileFilterSpec>& filter, int file_type_index, const base::string16& default_extension, HWND owner) {
diff --git a/chrome/browser/ui/webui/welcome/nux/email_handler.cc b/chrome/browser/ui/webui/welcome/nux/email_handler.cc index 22fcd91..3591b4ae 100644 --- a/chrome/browser/ui/webui/welcome/nux/email_handler.cc +++ b/chrome/browser/ui/webui/welcome/nux/email_handler.cc
@@ -132,20 +132,6 @@ html_source->AddLocalizedString("bookmarkReplaced", IDS_NUX_EMAIL_BOOKMARK_REPLACED); - // Add required resources. - html_source->AddResourcePath("email/nux_email.html", IDR_NUX_EMAIL_HTML); - html_source->AddResourcePath("email/nux_email.js", IDR_NUX_EMAIL_JS); - - html_source->AddResourcePath("email/nux_email_proxy.html", - IDR_NUX_EMAIL_PROXY_HTML); - html_source->AddResourcePath("email/nux_email_proxy.js", - IDR_NUX_EMAIL_PROXY_JS); - - html_source->AddResourcePath("email/email_chooser.html", - IDR_NUX_EMAIL_CHOOSER_HTML); - html_source->AddResourcePath("email/email_chooser.js", - IDR_NUX_EMAIL_CHOOSER_JS); - // Add icons html_source->AddResourcePath("email/aol_1x.png", IDR_NUX_EMAIL_AOL_1X); html_source->AddResourcePath("email/aol_2x.png", IDR_NUX_EMAIL_AOL_2X);
diff --git a/chrome/browser/ui/webui/welcome/nux/google_apps_handler.cc b/chrome/browser/ui/webui/welcome/nux/google_apps_handler.cc index b6860a6..71b2b03 100644 --- a/chrome/browser/ui/webui/welcome/nux/google_apps_handler.cc +++ b/chrome/browser/ui/webui/welcome/nux/google_apps_handler.cc
@@ -135,22 +135,6 @@ html_source->AddLocalizedString("googleAppsDescription", IDS_NUX_GOOGLE_APPS_DESCRIPTION); - // Add required resources. - html_source->AddResourcePath("apps/nux_google_apps.html", - IDR_NUX_GOOGLE_APPS_HTML); - html_source->AddResourcePath("apps/nux_google_apps.js", - IDR_NUX_GOOGLE_APPS_JS); - - html_source->AddResourcePath("apps/nux_google_apps_proxy.html", - IDR_NUX_GOOGLE_APPS_PROXY_HTML); - html_source->AddResourcePath("apps/nux_google_apps_proxy.js", - IDR_NUX_GOOGLE_APPS_PROXY_JS); - - html_source->AddResourcePath("apps/apps_chooser.html", - IDR_NUX_GOOGLE_APPS_CHOOSER_HTML); - html_source->AddResourcePath("apps/apps_chooser.js", - IDR_NUX_GOOGLE_APPS_CHOOSER_JS); - // Add icons html_source->AddResourcePath("apps/chrome_store_1x.png", IDR_NUX_GOOGLE_APPS_CHROME_STORE_1X);
diff --git a/chrome/browser/ui/webui/welcome/nux/set_as_default_handler.cc b/chrome/browser/ui/webui/welcome/nux/set_as_default_handler.cc index 861f50e..0bd0c36 100644 --- a/chrome/browser/ui/webui/welcome/nux/set_as_default_handler.cc +++ b/chrome/browser/ui/webui/welcome/nux/set_as_default_handler.cc
@@ -4,14 +4,6 @@ #include "chrome/browser/ui/webui/welcome/nux/set_as_default_handler.h" -#include "base/metrics/field_trial_params.h" -#include "base/metrics/histogram_macros.h" -#include "chrome/grit/browser_resources.h" -#include "chrome/grit/generated_resources.h" -#include "components/grit/components_resources.h" -#include "components/strings/grit/components_strings.h" -#include "content/public/browser/web_ui_data_source.h" - namespace nux { SetAsDefaultHandler::SetAsDefaultHandler() @@ -23,20 +15,4 @@ // TODO(scottchen): Add UMA tracking. } -void SetAsDefaultHandler::AddSources(content::WebUIDataSource* html_source) { - // Localized strings. - - // Add required resources. - html_source->AddResourcePath("set_as_default/nux_set_as_default.html", - IDR_NUX_SET_AS_DEFAULT_HTML); - html_source->AddResourcePath("set_as_default/nux_set_as_default.js", - IDR_NUX_SET_AS_DEFAULT_JS); - html_source->AddResourcePath("set_as_default/nux_set_as_default_proxy.html", - IDR_NUX_SET_AS_DEFAULT_PROXY_HTML); - html_source->AddResourcePath("set_as_default/nux_set_as_default_proxy.js", - IDR_NUX_SET_AS_DEFAULT_PROXY_JS); - - // Add icons -} - -} // namespace nux \ No newline at end of file +} // namespace nux
diff --git a/chrome/browser/ui/webui/welcome/nux/set_as_default_handler.h b/chrome/browser/ui/webui/welcome/nux/set_as_default_handler.h index 9621e65..5f70e699 100644 --- a/chrome/browser/ui/webui/welcome/nux/set_as_default_handler.h +++ b/chrome/browser/ui/webui/welcome/nux/set_as_default_handler.h
@@ -8,10 +8,6 @@ #include "base/macros.h" #include "chrome/browser/ui/webui/settings/settings_default_browser_handler.h" -namespace content { -class WebUIDataSource; -} // namespace content - namespace nux { class SetAsDefaultHandler : public settings::DefaultBrowserHandler { @@ -19,9 +15,6 @@ SetAsDefaultHandler(); ~SetAsDefaultHandler() override; - // Adds webui sources. - static void AddSources(content::WebUIDataSource* html_source); - protected: void RecordSetAsDefaultUMA() override;
diff --git a/chrome/browser/ui/webui/welcome/welcome_ui.cc b/chrome/browser/ui/webui/welcome/welcome_ui.cc index baf359e..288d221 100644 --- a/chrome/browser/ui/webui/welcome/welcome_ui.cc +++ b/chrome/browser/ui/webui/welcome/welcome_ui.cc
@@ -22,6 +22,8 @@ #include "chrome/grit/chrome_unscaled_resources.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" +#include "chrome/grit/onboarding_welcome_resources.h" +#include "chrome/grit/onboarding_welcome_resources_map.h" #include "components/prefs/pref_service.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui_data_source.h" @@ -68,55 +70,14 @@ html_source->AddLocalizedString("headerText", IDS_WELCOME_HEADER); html_source->AddLocalizedString("acceptText", IDS_WELCOME_ACCEPT_BUTTON); - // Add onboarding welcome resources. + // Add all Onboarding resources. + for (size_t i = 0; i < kOnboardingWelcomeResourcesSize; ++i) { + html_source->AddResourcePath(kOnboardingWelcomeResources[i].name, + kOnboardingWelcomeResources[i].value); + } html_source->SetDefaultResource( IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_HTML); - html_source->AddResourcePath( - "landing_view.html", IDR_WELCOME_ONBOARDING_WELCOME_LANDING_VIEW_HTML); - html_source->AddResourcePath( - "landing_view.js", IDR_WELCOME_ONBOARDING_WELCOME_LANDING_VIEW_JS); - html_source->AddResourcePath( - "navigation_behavior.html", - IDR_WELCOME_ONBOARDING_WELCOME_NAVIGATION_BEHAVIOR_HTML); - html_source->AddResourcePath( - "navigation_behavior.js", - IDR_WELCOME_ONBOARDING_WELCOME_NAVIGATION_BEHAVIOR_JS); - html_source->AddResourcePath( - "signin_view.html", IDR_WELCOME_ONBOARDING_WELCOME_SIGNIN_VIEW_HTML); - html_source->AddResourcePath("signin_view.js", - IDR_WELCOME_ONBOARDING_WELCOME_SIGNIN_VIEW_JS); - html_source->AddResourcePath("welcome.css", - IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_CSS); - html_source->AddResourcePath( - "welcome_app.html", IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_APP_HTML); - html_source->AddResourcePath("welcome_app.js", - IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_APP_JS); - html_source->AddResourcePath( - "welcome_browser_proxy.html", - IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_BROWSER_PROXY_HTML); - html_source->AddResourcePath( - "welcome_browser_proxy.js", - IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_BROWSER_PROXY_JS); - // Add resources shared by the NUX modules. - html_source->AddResourcePath( - "shared/action_link_style_css.html", - IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ACTION_LINK_STYLE_CSS_HTML); - html_source->AddResourcePath( - "shared/action_link_style.js", - IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ACTION_LINK_STYLE_JS); - html_source->AddResourcePath( - "shared/chooser_shared_css.html", - IDR_WELCOME_ONBOARDING_WELCOME_SHARED_CHOOSER_SHARED_CSS); - html_source->AddResourcePath( - "shared/onboarding_background.html", - IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ONBOARDING_BACKGROUND_HTML); - html_source->AddResourcePath( - "shared/onboarding_background.js", - IDR_WELCOME_ONBOARDING_WELCOME_SHARED_ONBOARDING_BACKGROUND_JS); - html_source->AddResourcePath( - "shared/i18n_setup.html", - IDR_WELCOME_ONBOARDING_WELCOME_SHARED_I18N_SETUP_HTML); html_source->AddResourcePath( "images/background_svgs/blue_circle.svg", IDR_WELCOME_ONBOARDING_WELCOME_IMAGES_BACKGROUND_SVGS_BLUE_CIRCLE_SVG); @@ -153,7 +114,6 @@ // Add set-as-default onboarding module. web_ui->AddMessageHandler(std::make_unique<nux::SetAsDefaultHandler>()); - nux::SetAsDefaultHandler::AddSources(html_source); } else if (kIsBranded && is_dice) { // Use special layout if the application is branded and DICE is enabled. html_source->AddLocalizedString("headerText", IDS_WELCOME_HEADER);
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index 8b3d165..ba8e869 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -165,6 +165,10 @@ "//ui/file_manager:resources", ] } + if (!is_android && !is_chromeos) { + sources += [ "$root_gen_dir/chrome/onboarding_welcome_resources.pak" ] + deps += [ "//chrome/browser/resources:onboarding_welcome_resources" ] + } if (enable_extensions) { sources += [ "$root_gen_dir/chrome/extensions_resources.pak",
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 7c22b38..8a4b4b4 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc
@@ -783,8 +783,8 @@ // Forces the update menu badge to show. const char kForceShowUpdateMenuBadge[] = "force-show-update-menu-badge"; -// Forces the update menu item to show. -const char kForceShowUpdateMenuItem[] = "force-show-update-menu-item"; +// Forces the update menu type to a specific type. +const char kForceUpdateMenuType[] = "force-update-menu-type"; // Forces a custom summary to be displayed below the update menu item. const char kForceShowUpdateMenuItemCustomSummary[] = "custom_summary";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 77929830..f724e53 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h
@@ -231,8 +231,8 @@ extern const char kEnableContextualSearch[]; extern const char kEnableHungRendererInfoBar[]; extern const char kForceShowUpdateMenuBadge[]; -extern const char kForceShowUpdateMenuItem[]; extern const char kForceShowUpdateMenuItemCustomSummary[]; +extern const char kForceUpdateMenuType[]; extern const char kMarketUrlForTesting[]; extern const char kProgressBarAnimation[]; extern const char kTrustedCDNBaseURLForTests[];
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json index a5816f4..32d6c08 100644 --- a/chrome/common/extensions/api/_api_features.json +++ b/chrome/common/extensions/api/_api_features.json
@@ -784,18 +784,6 @@ "81986D4F846CEDDDB962643FA501D1780DD441BB" // http://crbug.com/775961 ] }, - "webstore": { - // Hosted apps can use the webstore API from within a blessed context. - "channel": "stable", - // Set extension_types to 'all' to prevent webstore from being filtered. - // Technically, webstore is not in apps or extensions, but it is currently - // displayed on /extensions/webstore and /apps/webstore. The "contexts" - // restriction effectively restricts this to hosted apps and webpages. - "extension_types": "all", - "contexts": ["blessed_web_page", "web_page"], - // Any webpage can use the webstore API. - "matches": ["<all_urls>"] - }, "webstorePrivate": { "dependencies": ["permission:webstorePrivate"], // NOTE: even though this is only used by the webstore hosted app, which
diff --git a/chrome/common/extensions/api/input_method_private.json b/chrome/common/extensions/api/input_method_private.json index af49d28..9ab6dcda 100644 --- a/chrome/common/extensions/api/input_method_private.json +++ b/chrome/common/extensions/api/input_method_private.json
@@ -63,7 +63,8 @@ "autoCapitalize": {"$ref": "AutoCapitalizeType", "description": "The auto-capitalize type of the text field."}, "spellCheck": {"type": "boolean", "description": "Whether the text field wants spell-check."}, "shouldDoLearning": {"type": "boolean", "description": "Whether text entered into the text field should be used to improve typing suggestions for the user."}, - "focusReason": {"$ref": "FocusReason", "description": "How the text field was focused"} + "focusReason": {"$ref": "FocusReason", "description": "How the text field was focused"}, + "hasBeenPassword": {"type": "boolean", "description": "Whether the text field has ever been a password field."} } } ],
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb index a28dfea..dc9a1ce 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb
@@ -1,6 +1,17 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="en-GB"> +<translation id="1296843352074373664">Google user</translation> +<translation id="1383286653814676580">Used to run Google Credential Provider sign-in page.</translation> +<translation id="2119303206591679297">Logon with this Google account is not permitted.</translation> +<translation id="3374277789313311065">An internal error occurred. If the error persists, please report to Google.</translation> +<translation id="3713454256426064844">Log on using your Google account.</translation> +<translation id="440343981193409132">Log on using your updated Google account password.</translation> +<translation id="4735679347289592174">Signing in to your Google account failed. Please try again. Make sure that the computer has a valid Internet connection. If the error persists, please report to Google.</translation> +<translation id="7000592418234387954">Google Account Logon</translation> +<translation id="8474372283141585908">Google Credential Provider</translation> +<translation id="866458870819756755">A user could not be created.</translation> +<translation id="8860262547644202689">Google Credential Provider Helper</translation> <translation id="8912362522468806198">Google Account</translation> <translation id="9094033019050270033">Update password</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb index aa7e817..3fcbc211 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb
@@ -1,6 +1,17 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sk"> +<translation id="1296843352074373664">Používateľ Googlu</translation> +<translation id="1383286653814676580">Používa sa na spúšťanie prihlasovacej stránky poskytovateľa poverení Google</translation> +<translation id="2119303206591679297">Prihlásenie pomocou tohto účtu Google nie je povolené.</translation> +<translation id="3374277789313311065">Vyskytla sa interná chyba. Ak pretrváva, nahláste ju Googlu.</translation> +<translation id="3713454256426064844">Prihlásenie pomocou účtu Google</translation> +<translation id="440343981193409132">Prihlásenie pomocou aktualizovaného hesla účtu Google.</translation> +<translation id="4735679347289592174">Nepodarilo sa prihlásiť do vášho účtu Google. Skúste to znova. Skontrolujte, či máte v počítači platné internetové pripojenie. Ak chyba pretrváva, nahláste ju Googlu.</translation> +<translation id="7000592418234387954">Prihlásenie pomocou účtu Google</translation> +<translation id="8474372283141585908">Poskytovateľ poverení Google</translation> +<translation id="866458870819756755">Používateľa sa nepodarilo vytvoriť.</translation> +<translation id="8860262547644202689">Pomocník pre poskytovateľa poverení Google</translation> <translation id="8912362522468806198">účtu Google</translation> <translation id="9094033019050270033">Aktualizovať heslo</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/services/util_win/shell_util_win_impl.cc b/chrome/services/util_win/shell_util_win_impl.cc index 8e41571..c6ecc65 100644 --- a/chrome/services/util_win/shell_util_win_impl.cc +++ b/chrome/services/util_win/shell_util_win_impl.cc
@@ -20,7 +20,6 @@ #include "base/win/win_util.h" #include "chrome/installer/util/install_util.h" #include "mojo/public/cpp/bindings/strong_binding.h" -#include "ui/base/win/open_file_name_win.h" namespace { @@ -232,22 +231,7 @@ const base::FilePath& initial_directory, const base::FilePath& initial_filename, CallGetOpenFileNameCallback callback) { - ui::win::OpenFileName open_file_name( - reinterpret_cast<HWND>(base::win::Uint32ToHandle(owner)), flags); - - open_file_name.SetInitialSelection(initial_directory, initial_filename); - open_file_name.SetFilters(filters); - - base::FilePath directory; - std::vector<base::FilePath> files; - if (::GetOpenFileName(open_file_name.GetOPENFILENAME())) - open_file_name.GetResult(&directory, &files); - - if (!files.empty()) { - std::move(callback).Run(directory, files); - } else { - std::move(callback).Run(base::FilePath(), std::vector<base::FilePath>()); - } + std::move(callback).Run(base::FilePath(), std::vector<base::FilePath>()); } void ShellUtilWinImpl::CallGetSaveFileName( @@ -259,24 +243,5 @@ const base::FilePath& suggested_filename, const base::string16& default_extension, CallGetSaveFileNameCallback callback) { - ui::win::OpenFileName open_file_name( - reinterpret_cast<HWND>(base::win::Uint32ToHandle(owner)), flags); - - open_file_name.SetInitialSelection(initial_directory, suggested_filename); - open_file_name.SetFilters(filters); - open_file_name.GetOPENFILENAME()->nFilterIndex = one_based_filter_index; - open_file_name.GetOPENFILENAME()->lpstrDefExt = default_extension.c_str(); - - if (::GetSaveFileName(open_file_name.GetOPENFILENAME())) { - std::move(callback).Run( - base::FilePath(open_file_name.GetOPENFILENAME()->lpstrFile), - open_file_name.GetOPENFILENAME()->nFilterIndex); - return; - } - - // Error code 0 means the dialog was closed, otherwise there was an error. - if (DWORD error_code = ::CommDlgExtendedError()) - NOTREACHED() << "::GetSaveFileName() failed: error code " << error_code; - std::move(callback).Run(base::FilePath(), 0); }
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc index be24024..c018f76 100644 --- a/chrome/test/chromedriver/session_commands.cc +++ b/chrome/test/chromedriver/session_commands.cc
@@ -474,7 +474,9 @@ Status status = session->GetTargetWindow(&web_view); if (status.IsError()) return status; - + status = web_view->ConnectIfNecessary(); + if (status.IsError()) + return status; value->reset(new base::Value(WebViewIdToWindowHandle(web_view->GetId()))); return Status(kOk); }
diff --git a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.full_height.Nexus_5-19.png b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.full_height.Nexus_5-19.png index 6fdcd45..e562e01 100644 --- a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.full_height.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.full_height.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.full_height_scrolled.Nexus_5-19.png b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.full_height_scrolled.Nexus_5-19.png index 91deb46..a2876fa 100644 --- a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.full_height_scrolled.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.full_height_scrolled.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_image_loaded.Nexus_5-19.png b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_image_loaded.Nexus_5-19.png index 9fb1133..d93e2e6 100644 --- a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_image_loaded.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_image_loaded.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_image_loading.Nexus_5-19.png b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_image_loading.Nexus_5-19.png index ee0f094..5283b10 100644 --- a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_image_loading.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_image_loading.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_offline.Nexus_5-19.png b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_offline.Nexus_5-19.png index 48ca1d4e..555ef3f 100644 --- a/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_offline.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ContextualSuggestionsTest.suggestion_offline.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/webui/settings/people_page_test.js b/chrome/test/data/webui/settings/people_page_test.js index bbd11534..6a4e8bf3 100644 --- a/chrome/test/data/webui/settings/people_page_test.js +++ b/chrome/test/data/webui/settings/people_page_test.js
@@ -133,20 +133,21 @@ Polymer.dom.flush(); disconnectButton = peoplePage.$$('#disconnectButton'); assertTrue(!!disconnectButton); - assertFalse(!!peoplePage.$$('#disconnectDialog')); + assertFalse(!!peoplePage.$$('settings-signout-dialog')); disconnectButton.click(); Polymer.dom.flush(); }) .then(function() { - assertTrue(peoplePage.$$('#disconnectDialog').open); - assertFalse(peoplePage.$$('#deleteProfile').hidden); + const signoutDialog = peoplePage.$$('settings-signout-dialog'); + assertTrue(signoutDialog.$$('#dialog').open); + assertFalse(signoutDialog.$$('#deleteProfile').hidden); - const deleteProfileCheckbox = peoplePage.$$('#deleteProfile'); + const deleteProfileCheckbox = signoutDialog.$$('#deleteProfile'); assertTrue(!!deleteProfileCheckbox); assertLT(0, deleteProfileCheckbox.clientHeight); - const disconnectConfirm = peoplePage.$$('#disconnectConfirm'); + const disconnectConfirm = signoutDialog.$$('#disconnectConfirm'); assertTrue(!!disconnectConfirm); assertFalse(disconnectConfirm.hidden); @@ -169,7 +170,7 @@ domain: 'example.com', }); - assertFalse(!!peoplePage.$$('#disconnectDialog')); + assertFalse(!!peoplePage.$$('#dialog')); disconnectButton.click(); Polymer.dom.flush(); @@ -178,11 +179,12 @@ }); }) .then(function() { - assertTrue(peoplePage.$$('#disconnectDialog').open); - assertFalse(!!peoplePage.$$('#deleteProfile')); + const signoutDialog = peoplePage.$$('settings-signout-dialog'); + assertTrue(signoutDialog.$$('#dialog').open); + assertFalse(!!signoutDialog.$$('#deleteProfile')); const disconnectManagedProfileConfirm = - peoplePage.$$('#disconnectManagedProfileConfirm'); + signoutDialog.$$('#disconnectManagedProfileConfirm'); assertTrue(!!disconnectManagedProfileConfirm); assertFalse(disconnectManagedProfileConfirm.hidden); @@ -218,10 +220,12 @@ }) .then(function() { Polymer.dom.flush(); - assertTrue(peoplePage.$$('#disconnectDialog').open); + const signoutDialog = peoplePage.$$('settings-signout-dialog'); + assertTrue(signoutDialog.$$('#dialog').open); // Assert the warning message is as expected. - const warningMessage = peoplePage.$$('.delete-profile-warning'); + const warningMessage = + signoutDialog.$$('.delete-profile-warning'); cr.webUIListenerCallback('profile-stats-count-ready', 0); assertEquals( @@ -243,7 +247,7 @@ warningMessage.textContent.trim()); // Close the disconnect dialog. - peoplePage.$$('#disconnectConfirm').click(); + signoutDialog.$$('#disconnectConfirm').click(); return new Promise(function(resolve) { listenOnce(window, 'popstate', resolve); }); @@ -258,7 +262,8 @@ peoplePage.async(resolve); }) .then(function() { - assertTrue(peoplePage.$$('#disconnectDialog').open); + assertTrue( + peoplePage.$$('settings-signout-dialog').$$('#dialog').open); return profileInfoBrowserProxy.whenCalled('getProfileStatsCount'); }) .then(function() { @@ -268,7 +273,9 @@ new settings.ProfileInfoBrowserProxyImpl().getProfileStatsCount(); // Close the disconnect dialog. - peoplePage.$$('#disconnectConfirm').click(); + peoplePage.$$('settings-signout-dialog') + .$$('#disconnectConfirm') + .click(); }) .then(function() { return new Promise(function(resolve) { @@ -286,7 +293,8 @@ }); }) .then(function() { - assertTrue(peoplePage.$$('#disconnectDialog').open); + assertTrue( + peoplePage.$$('settings-signout-dialog').$$('#dialog').open); const popstatePromise = new Promise(function(resolve) { listenOnce(window, 'popstate', resolve);
diff --git a/chrome/test/data/webui/settings/privacy_page_test.js b/chrome/test/data/webui/settings/privacy_page_test.js index 2fcdbad..e2c5ce45 100644 --- a/chrome/test/data/webui/settings/privacy_page_test.js +++ b/chrome/test/data/webui/settings/privacy_page_test.js
@@ -183,12 +183,61 @@ page.syncStatus = {signedIn: true}; // When the user is signed in, clicking the toggle should open the - // sign-out dialog. The toggle should remain checked. + // sign-out dialog. + assertFalse(!!page.$$('settings-signout-dialog')); toggle.click(); - assertTrue(toggle.checked); - assertTrue(page.prefs.signin.allowed_on_next_startup.value); - assertFalse(page.$.toast.open); - assertEquals(settings.routes.SIGN_OUT, settings.getCurrentRoute()); + return test_util.eventToPromise('cr-dialog-open', page) + .then(function() { + Polymer.dom.flush(); + // The toggle remains on. + assertTrue(toggle.checked); + assertTrue(page.prefs.signin.allowed_on_next_startup.value); + assertFalse(page.$.toast.open); + + const signoutDialog = page.$$('settings-signout-dialog'); + assertTrue(!!signoutDialog); + assertTrue(signoutDialog.$$('#dialog').open); + + // The user clicks cancel. + const cancel = signoutDialog.$$('#disconnectCancel'); + cancel.click(); + + return test_util.eventToPromise('close', signoutDialog); + }) + .then(function() { + Polymer.dom.flush(); + assertFalse(!!page.$$('settings-signout-dialog')); + + // After the dialog is closed, the toggle remains turned on. + assertTrue(toggle.checked); + assertTrue(page.prefs.signin.allowed_on_next_startup.value); + assertFalse(page.$.toast.open); + + // The user clicks the toggle again. + toggle.click(); + return test_util.eventToPromise('cr-dialog-open', page); + }) + .then(function() { + Polymer.dom.flush(); + const signoutDialog = page.$$('settings-signout-dialog'); + assertTrue(!!signoutDialog); + assertTrue(signoutDialog.$$('#dialog').open); + + // The user clicks confirm, which signs them out. + const disconnectConfirm = + signoutDialog.$$('#disconnectConfirm'); + disconnectConfirm.click(); + + return test_util.eventToPromise('close', signoutDialog); + }) + .then(function() { + Polymer.dom.flush(); + // After the dialog is closed, the toggle is turned off and the + // toast is shown. + assertFalse(toggle.checked); + assertFalse(page.prefs.signin.allowed_on_next_startup.value); + assertTrue(page.$.toast.open); + }); }); } });
diff --git a/chromecast/app/cast_main_delegate.cc b/chromecast/app/cast_main_delegate.cc index 3353e3d..0198478e 100644 --- a/chromecast/app/cast_main_delegate.cc +++ b/chromecast/app/cast_main_delegate.cc
@@ -19,6 +19,7 @@ #include "base/posix/global_descriptors.h" #include "build/build_config.h" #include "chromecast/base/cast_paths.h" +#include "chromecast/base/chromecast_switches.h" #include "chromecast/browser/cast_content_browser_client.h" #include "chromecast/chromecast_buildflags.h" #include "chromecast/common/cast_resource_delegate.h" @@ -143,20 +144,24 @@ std::string process_type = command_line->GetSwitchValueASCII(switches::kProcessType); -// TODO(crbug.com/753619): Enable crash reporting on Fuchsia. + bool enable_crash_reporter = !command_line->HasSwitch( + switches::kDisableCrashReporter); + if (enable_crash_reporter) { + // TODO(crbug.com/753619): Enable crash reporting on Fuchsia. #if defined(OS_ANDROID) - base::FilePath log_file; - base::PathService::Get(FILE_CAST_ANDROID_LOG, &log_file); - chromecast::CrashHandler::Initialize(process_type, log_file); + base::FilePath log_file; + base::PathService::Get(FILE_CAST_ANDROID_LOG, &log_file); + chromecast::CrashHandler::Initialize(process_type, log_file); #elif defined(OS_LINUX) - crash_reporter::SetCrashReporterClient(GetCastCrashReporter()); + crash_reporter::SetCrashReporterClient(GetCastCrashReporter()); - if (process_type != service_manager::switches::kZygoteProcess) { - CastCrashReporterClient::InitCrashReporter(process_type); - } + if (process_type != service_manager::switches::kZygoteProcess) { + CastCrashReporterClient::InitCrashReporter(process_type); + } #endif // defined(OS_LINUX) - crash_reporter::InitializeCrashKeys(); + crash_reporter::InitializeCrashKeys(); + } InitializeResourceBundle(); } @@ -180,9 +185,13 @@ #if defined(OS_LINUX) void CastMainDelegate::ZygoteForked() { const base::CommandLine* command_line(base::CommandLine::ForCurrentProcess()); - std::string process_type = - command_line->GetSwitchValueASCII(switches::kProcessType); - CastCrashReporterClient::InitCrashReporter(process_type); + bool enable_crash_reporter = !command_line->HasSwitch( + switches::kDisableCrashReporter); + if (enable_crash_reporter) { + std::string process_type = + command_line->GetSwitchValueASCII(switches::kProcessType); + CastCrashReporterClient::InitCrashReporter(process_type); + } } #endif // defined(OS_LINUX)
diff --git a/chromecast/base/chromecast_switches.cc b/chromecast/base/chromecast_switches.cc index 536ac17..4381f4b 100644 --- a/chromecast/base/chromecast_switches.cc +++ b/chromecast/base/chromecast_switches.cc
@@ -20,6 +20,9 @@ // Default is "https://clients2.google.com/cr/staging_report" for non prod. const char kCrashServerUrl[] = "crash-server-url"; +// Switch to disable Crash reporting +const char kDisableCrashReporter[] = "disable-crash-reporter"; + // Enable file accesses. It should not be enabled for most Cast devices. const char kEnableLocalFileAccesses[] = "enable-local-file-accesses";
diff --git a/chromecast/base/chromecast_switches.h b/chromecast/base/chromecast_switches.h index 97b1efb..77823e0 100644 --- a/chromecast/base/chromecast_switches.h +++ b/chromecast/base/chromecast_switches.h
@@ -19,6 +19,9 @@ // Url to upload crash data to. extern const char kCrashServerUrl[]; +// Disable Crash Reporting +extern const char kDisableCrashReporter[]; + // Content-implementation switches extern const char kEnableLocalFileAccesses[];
diff --git a/chromecast/media/audio/cast_audio_mixer_unittest.cc b/chromecast/media/audio/cast_audio_mixer_unittest.cc index ee04378..1718f4c 100644 --- a/chromecast/media/audio/cast_audio_mixer_unittest.cc +++ b/chromecast/media/audio/cast_audio_mixer_unittest.cc
@@ -274,7 +274,7 @@ std::vector<std::unique_ptr<MockAudioSourceCallback>> sources(streams.size()); std::generate(streams.begin(), streams.end(), [this] { return CreateMixerStream(); }); - std::generate(sources.begin(), sources.end(), [this] { + std::generate(sources.begin(), sources.end(), [] { return std::unique_ptr<MockAudioSourceCallback>( new StrictMock<MockAudioSourceCallback>()); });
diff --git a/chromeos/services/assistant/assistant_manager_service.h b/chromeos/services/assistant/assistant_manager_service.h index a31e4274..634ee3f 100644 --- a/chromeos/services/assistant/assistant_manager_service.h +++ b/chromeos/services/assistant/assistant_manager_service.h
@@ -12,6 +12,7 @@ #include "base/callback_forward.h" #include "chromeos/services/assistant/assistant_settings_manager.h" #include "chromeos/services/assistant/public/mojom/assistant.mojom.h" +#include "chromeos/services/assistant/public/mojom/settings.mojom.h" namespace chromeos { namespace assistant { @@ -63,6 +64,15 @@ virtual void SendUpdateSettingsUiRequest( const std::string& update, UpdateSettingsUiResponseCallback callback) = 0; + + // Starts speaker id enrollment. + virtual void StartSpeakerIdEnrollment( + bool skip_cloud_enrollment, + mojom::SpeakerIdEnrollmentClientPtr client) = 0; + + // Stops speaker id enrollment (if one is active). + virtual void StopSpeakerIdEnrollment( + AssistantSettingsManager::StopSpeakerIdEnrollmentCallback callback) = 0; }; } // namespace assistant
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index edf9a53e..d178490 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -37,6 +37,8 @@ using ActionModule = assistant_client::ActionModule; using Resolution = assistant_client::ConversationStateListener::Resolution; +using SpeakerIdEnrollmentState = + assistant_client::SpeakerIdEnrollmentUpdate::State; namespace api = ::assistant::api; @@ -44,6 +46,7 @@ namespace assistant { namespace { +constexpr char kUserID[] = "0"; constexpr char kWiFiDeviceSettingId[] = "WIFI"; constexpr char kBluetoothDeviceSettingId[] = "BLUETOOTH"; constexpr char kVolumeLevelDeviceSettingId[] = "VOLUME_LEVEL"; @@ -138,8 +141,8 @@ // it is started. |user_id| is used to pair a user to their |access_token|, // since we do not support multi-user in this example we can set it to a // dummy value like "0". - assistant_manager_->SetAuthTokens({std::pair<std::string, std::string>( - /* user_id: */ "0", access_token)}); + assistant_manager_->SetAuthTokens( + {std::pair<std::string, std::string>(kUserID, access_token)}); } void AssistantManagerServiceImpl::RegisterFallbackMediaHandler() { @@ -220,6 +223,44 @@ }); } +void AssistantManagerServiceImpl::StartSpeakerIdEnrollment( + bool skip_cloud_enrollment, + mojom::SpeakerIdEnrollmentClientPtr client) { + DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); + + speaker_id_enrollment_client_ = std::move(client); + + assistant_client::SpeakerIdEnrollmentConfig client_config; + client_config.user_id = kUserID; + client_config.skip_cloud_enrollment = skip_cloud_enrollment; + + assistant_manager_internal_->StartSpeakerIdEnrollment(client_config, [ + weak_ptr = weak_factory_.GetWeakPtr(), + task_runner = main_thread_task_runner_ + ](const assistant_client::SpeakerIdEnrollmentUpdate& update) { + task_runner->PostTask( + FROM_HERE, + base::BindOnce( + &AssistantManagerServiceImpl::HandleSpeakerIdEnrollmentUpdate, + weak_ptr, update)); + }); +} + +void AssistantManagerServiceImpl::StopSpeakerIdEnrollment( + AssistantSettingsManager::StopSpeakerIdEnrollmentCallback callback) { + assistant_manager_internal_->StopSpeakerIdEnrollment([ + repeating_callback = base::AdaptCallbackForRepeating(std::move(callback)), + task_runner = main_thread_task_runner_, + weak_ptr = weak_factory_.GetWeakPtr() + ]() { + task_runner->PostTask( + FROM_HERE, + base::BindOnce( + &AssistantManagerServiceImpl::HandleStopSpeakerIdEnrollment, + std::move(weak_ptr), repeating_callback)); + }); +} + void AssistantManagerServiceImpl::StartVoiceInteraction() { platform_api_->SetMicState(true); assistant_manager_->StartAssistantInteraction(); @@ -809,6 +850,35 @@ callback.Run(result); } +void AssistantManagerServiceImpl::HandleSpeakerIdEnrollmentUpdate( + const assistant_client::SpeakerIdEnrollmentUpdate& update) { + switch (update.state) { + case SpeakerIdEnrollmentState::LISTEN: + speaker_id_enrollment_client_->OnListeningHotword(); + break; + case SpeakerIdEnrollmentState::PROCESS: + speaker_id_enrollment_client_->OnProcessingHotword(); + break; + case SpeakerIdEnrollmentState::DONE: + speaker_id_enrollment_client_->OnSpeakerIdEnrollmentDone(); + break; + case SpeakerIdEnrollmentState::FAILURE: + speaker_id_enrollment_client_->OnSpeakerIdEnrollmentFailure(); + break; + case SpeakerIdEnrollmentState::INIT: + case SpeakerIdEnrollmentState::CHECK: + case SpeakerIdEnrollmentState::UPLOAD: + case SpeakerIdEnrollmentState::FETCH: + break; + } +} + +void AssistantManagerServiceImpl::HandleStopSpeakerIdEnrollment( + base::RepeatingCallback<void()> callback) { + speaker_id_enrollment_client_.reset(); + callback.Run(); +} + // assistant_client::DeviceStateListener overrides // Run on LibAssistant threads void AssistantManagerServiceImpl::OnStartFinished() {
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h index 0c0572ad..562437e 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -33,6 +33,7 @@ namespace assistant_client { class AssistantManager; class AssistantManagerInternal; +struct SpeakerIdEnrollmentUpdate; } // namespace assistant_client namespace service_manager { @@ -82,6 +83,12 @@ void SendUpdateSettingsUiRequest( const std::string& update, UpdateSettingsUiResponseCallback callback) override; + void StartSpeakerIdEnrollment( + bool skip_cloud_enrollment, + mojom::SpeakerIdEnrollmentClientPtr client) override; + void StopSpeakerIdEnrollment( + AssistantSettingsManager::StopSpeakerIdEnrollmentCallback callback) + override; // mojom::Assistant overrides: void StartCachedScreenContextInteraction() override; @@ -161,6 +168,9 @@ void HandleUpdateSettingsResponse( base::RepeatingCallback<void(const std::string&)> callback, const std::string& result); + void HandleSpeakerIdEnrollmentUpdate( + const assistant_client::SpeakerIdEnrollmentUpdate& update); + void HandleStopSpeakerIdEnrollment(base::RepeatingCallback<void()> callback); void OnConversationTurnStartedOnMainThread(bool is_mic_open); void OnConversationTurnFinishedOnMainThread( @@ -218,6 +228,8 @@ mojo::Binding<ash::mojom::VoiceInteractionObserver> voice_interaction_observer_binding_; ash::mojom::AshMessageCenterControllerPtr ash_message_center_controller_; + mojom::SpeakerIdEnrollmentClientPtr speaker_id_enrollment_client_; + Service* service_; // unowned. base::Optional<std::string> arc_version_;
diff --git a/chromeos/services/assistant/assistant_settings_manager_impl.cc b/chromeos/services/assistant/assistant_settings_manager_impl.cc index b68764c..585420fa8 100644 --- a/chromeos/services/assistant/assistant_settings_manager_impl.cc +++ b/chromeos/services/assistant/assistant_settings_manager_impl.cc
@@ -39,5 +39,21 @@ std::move(callback)); } +void AssistantSettingsManagerImpl::StartSpeakerIdEnrollment( + bool skip_cloud_enrollment, + mojom::SpeakerIdEnrollmentClientPtr client) { + DCHECK(assistant_manager_service_->GetState() == + AssistantManagerService::State::RUNNING); + assistant_manager_service_->StartSpeakerIdEnrollment(skip_cloud_enrollment, + std::move(client)); +} + +void AssistantSettingsManagerImpl::StopSpeakerIdEnrollment( + StopSpeakerIdEnrollmentCallback callback) { + DCHECK(assistant_manager_service_->GetState() == + AssistantManagerService::State::RUNNING); + assistant_manager_service_->StopSpeakerIdEnrollment(std::move(callback)); +} + } // namespace assistant } // namespace chromeos
diff --git a/chromeos/services/assistant/assistant_settings_manager_impl.h b/chromeos/services/assistant/assistant_settings_manager_impl.h index 5d9ac5c..5b2852d 100644 --- a/chromeos/services/assistant/assistant_settings_manager_impl.h +++ b/chromeos/services/assistant/assistant_settings_manager_impl.h
@@ -28,6 +28,11 @@ GetSettingsCallback callback) override; void UpdateSettings(const std::string& update, UpdateSettingsCallback callback) override; + void StartSpeakerIdEnrollment( + bool skip_cloud_enrollment, + mojom::SpeakerIdEnrollmentClientPtr client) override; + void StopSpeakerIdEnrollment( + StopSpeakerIdEnrollmentCallback callback) override; // AssistantSettingsManager overrides: void BindRequest(mojom::AssistantSettingsManagerRequest request) override;
diff --git a/chromeos/services/assistant/fake_assistant_manager_service_impl.cc b/chromeos/services/assistant/fake_assistant_manager_service_impl.cc index 7970754..c75d64d 100644 --- a/chromeos/services/assistant/fake_assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/fake_assistant_manager_service_impl.cc
@@ -46,6 +46,13 @@ const std::string& update, UpdateSettingsUiResponseCallback callback) {} +void FakeAssistantManagerServiceImpl::StartSpeakerIdEnrollment( + bool skip_cloud_enrollment, + mojom::SpeakerIdEnrollmentClientPtr client) {} + +void FakeAssistantManagerServiceImpl::StopSpeakerIdEnrollment( + AssistantSettingsManager::StopSpeakerIdEnrollmentCallback on_stopped) {} + void FakeAssistantManagerServiceImpl::StartCachedScreenContextInteraction() {} void FakeAssistantManagerServiceImpl::StartMetalayerInteraction(
diff --git a/chromeos/services/assistant/fake_assistant_manager_service_impl.h b/chromeos/services/assistant/fake_assistant_manager_service_impl.h index 7c10aac2..800dcdd 100644 --- a/chromeos/services/assistant/fake_assistant_manager_service_impl.h +++ b/chromeos/services/assistant/fake_assistant_manager_service_impl.h
@@ -37,6 +37,12 @@ void SendUpdateSettingsUiRequest( const std::string& update, UpdateSettingsUiResponseCallback callback) override; + void StartSpeakerIdEnrollment( + bool skip_cloud_enrollment, + mojom::SpeakerIdEnrollmentClientPtr client) override; + void StopSpeakerIdEnrollment( + AssistantSettingsManager::StopSpeakerIdEnrollmentCallback on_stopped) + override; // mojom::Assistant overrides: void StartCachedScreenContextInteraction() override;
diff --git a/chromeos/services/assistant/public/mojom/settings.mojom b/chromeos/services/assistant/public/mojom/settings.mojom index 31f919b..ace2615 100644 --- a/chromeos/services/assistant/public/mojom/settings.mojom +++ b/chromeos/services/assistant/public/mojom/settings.mojom
@@ -4,6 +4,20 @@ module chromeos.assistant.mojom; +interface SpeakerIdEnrollmentClient { + // Listening for hotword. + OnListeningHotword(); + + // Hotword utterance detected. Processing utterance. + OnProcessingHotword(); + + // The enrollment completed successfully. + OnSpeakerIdEnrollmentDone(); + + // Enrollment failed. + OnSpeakerIdEnrollmentFailure(); +}; + interface AssistantSettingsManager { // |selector| is a serialized proto of SettingsUiSelector, indicating which // settings sub-pages should be requested to the server. @@ -18,4 +32,13 @@ // result of updates. // Send a request to update the assistant settings indicated by the |update|. UpdateSettings(string update) => (string result); + + // Starts speaker id enrollment. + // |skip_cloud_enrollment| whether to skip Cloud Enrollment (e.g. for when + // user explicictly requests voice match re-training). + StartSpeakerIdEnrollment(bool skip_cloud_enrollment, + SpeakerIdEnrollmentClient client); + + // Stops speaker id enrollment. + StopSpeakerIdEnrollment() => (); };
diff --git a/components/autofill_assistant/browser/devtools/devtools_api/client_api_generator.py b/components/autofill_assistant/browser/devtools/devtools_api/client_api_generator.py index fccd6ed..853b5b92 100644 --- a/components/autofill_assistant/browser/devtools/devtools_api/client_api_generator.py +++ b/components/autofill_assistant/browser/devtools/devtools_api/client_api_generator.py
@@ -269,6 +269,8 @@ type_definitions['integer'] = CreatePrimitiveTypeDefinition('integer') type_definitions['boolean'] = CreatePrimitiveTypeDefinition('boolean') type_definitions['string'] = CreateStringTypeDefinition() +# TODO(johannes): Support protocol::Binary (http://crbug.com/896940). +type_definitions['binary'] = CreateStringTypeDefinition() type_definitions['object'] = CreateObjectTypeDefinition() type_definitions['any'] = CreateAnyTypeDefinition() @@ -313,6 +315,9 @@ elif type['type'] == 'string': type_definitions[domain['domain'] + '.' + type['id']] = ( CreateStringTypeDefinition()) + elif type['type'] == 'binary': + type_definitions[domain['domain'] + '.' + type['id']] = ( + CreateStringTypeDefinition()) else: type_definitions[domain['domain'] + '.' + type['id']] = ( CreatePrimitiveTypeDefinition(type['type']))
diff --git a/components/download/database/BUILD.gn b/components/download/database/BUILD.gn index cbbe97f1..fae90003 100644 --- a/components/download/database/BUILD.gn +++ b/components/download/database/BUILD.gn
@@ -23,9 +23,6 @@ "download_namespace.h", "in_progress/download_entry.cc", "in_progress/download_entry.h", - "in_progress/in_progress_cache.h", - "in_progress/in_progress_cache_impl.cc", - "in_progress/in_progress_cache_impl.h", "in_progress/in_progress_info.cc", "in_progress/in_progress_info.h", "in_progress/ukm_info.cc", @@ -48,7 +45,6 @@ sources = [ "download_db_conversions_unittest.cc", "download_db_impl_unittest.cc", - "in_progress/in_progress_cache_impl_unittest.cc", ] deps = [
diff --git a/components/download/database/download_db_impl.cc b/components/download/database/download_db_impl.cc index b52ccc3..50e34413 100644 --- a/components/download/database/download_db_impl.cc +++ b/components/download/database/download_db_impl.cc
@@ -85,7 +85,6 @@ db_->Init(kDatabaseClientName, database_dir_, options, base::BindOnce(&DownloadDBImpl::OnDatabaseInitialized, weak_factory_.GetWeakPtr(), std::move(callback))); - // TODO(qinmin): migrate all the data from InProgressCache into this database. } void DownloadDBImpl::DestroyAndReinitialize(DownloadDBCallback callback) {
diff --git a/components/download/database/in_progress/in_progress_cache.h b/components/download/database/in_progress/in_progress_cache.h deleted file mode 100644 index 0c6dc7a..0000000 --- a/components/download/database/in_progress/in_progress_cache.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_DOWNLOAD_DATABASE_IN_PROGRESS_IN_PROGRESS_CACHE_H_ -#define COMPONENTS_DOWNLOAD_DATABASE_IN_PROGRESS_IN_PROGRESS_CACHE_H_ - -#include <string> -#include <vector> - -#include "base/optional.h" -#include "components/download/database/in_progress/download_entry.h" - -namespace download { - -extern const base::FilePath::CharType kDownloadMetadataStoreFilename[]; - -// InProgressCache provides a write-through cache that persists -// information related to an in-progress download such as request origin, retry -// count, resumption parameters etc to the disk. The entries are written to disk -// right away for now (might not be in the case in the long run). -class InProgressCache { - public: - virtual ~InProgressCache() = default; - - // Initializes the cache. - virtual void Initialize(base::OnceClosure callback) = 0; - - // Adds or updates an existing entry. - virtual void AddOrReplaceEntry(const DownloadEntry& entry) = 0; - - // Retrieves an existing entry. - virtual base::Optional<DownloadEntry> RetrieveEntry( - const std::string& guid) = 0; - - // Removes an entry. - virtual void RemoveEntry(const std::string& guid) = 0; - - // Returns all entries. - virtual std::vector<DownloadEntry> GetAllEntries() = 0; - - // Destroys the file associated with the object. - virtual void Destroy() = 0; -}; - -} // namespace download - -#endif // COMPONENTS_DOWNLOAD_DATABASE_IN_PROGRESS_IN_PROGRESS_CACHE_H_
diff --git a/components/download/database/in_progress/in_progress_cache_impl.cc b/components/download/database/in_progress/in_progress_cache_impl.cc deleted file mode 100644 index 775fc2fe..0000000 --- a/components/download/database/in_progress/in_progress_cache_impl.cc +++ /dev/null
@@ -1,237 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/download/database/in_progress/in_progress_cache_impl.h" - -#include "base/bind.h" -#include "base/files/file.h" -#include "base/files/file_util.h" -#include "base/files/important_file_writer.h" -#include "base/task_runner_util.h" -#include "base/threading/thread_task_runner_handle.h" -#include "components/download/database/download_db_conversions.h" - -namespace download { - -const base::FilePath::CharType kDownloadMetadataStoreFilename[] = - FILE_PATH_LITERAL("in_progress_download_metadata_store"); - -namespace { - -// Helper functions for |entries_| related operations. -int GetIndexFromEntries(const download_pb::DownloadEntries& entries, - const std::string& guid) { - int size_of_entries = entries.entries_size(); - for (int i = 0; i < size_of_entries; i++) { - if (entries.entries(i).guid() == guid) - return i; - } - return -1; -} - -void AddOrReplaceEntryInEntries(download_pb::DownloadEntries& entries, - const DownloadEntry& entry) { - download_pb::DownloadEntry metadata_entry = - DownloadDBConversions::DownloadEntryToProto(entry); - int entry_index = GetIndexFromEntries(entries, metadata_entry.guid()); - download_pb::DownloadEntry* entry_ptr = - (entry_index < 0) ? entries.add_entries() - : entries.mutable_entries(entry_index); - *entry_ptr = metadata_entry; -} - -base::Optional<DownloadEntry> GetEntryFromEntries( - const download_pb::DownloadEntries& entries, - const std::string& guid) { - int entry_index = GetIndexFromEntries(entries, guid); - if (entry_index < 0) - return base::nullopt; - - return DownloadDBConversions::DownloadEntryFromProto( - entries.entries(entry_index)); -} - -void RemoveEntryFromEntries(download_pb::DownloadEntries& entries, - const std::string& guid) { - int entry_index = GetIndexFromEntries(entries, guid); - if (entry_index >= 0) - entries.mutable_entries()->DeleteSubrange(entry_index, 1); -} - -// Helper functions for file read/write operations. -std::vector<char> ReadEntriesFromFile(base::FilePath file_path) { - if (file_path.empty()) - return std::vector<char>(); - - // Check validity of file. - base::File entries_file(file_path, - base::File::FLAG_OPEN | base::File::FLAG_READ); - if (!entries_file.IsValid()) { - // The file just doesn't exist yet (potentially because no entries have been - // written yet) so we can't read from it. - return std::vector<char>(); - } - - // Get file info. - base::File::Info info; - if (!entries_file.GetInfo(&info)) { - LOG(ERROR) << "Could not read download entries from file " - << "because get info failed."; - return std::vector<char>(); - } - - if (info.is_directory) { - LOG(ERROR) << "Could not read download entries from file " - << "because file is a directory."; - return std::vector<char>(); - } - - // Read and parse file. - if (info.size < 0) { - LOG(ERROR) << "Could not read download entries from file " - << "because the file size was unexpected."; - return std::vector<char>(); - } - - auto file_data = std::vector<char>(info.size); - if (entries_file.Read(0, file_data.data(), info.size) < 0) { - LOG(ERROR) << "Could not read download entries from file " - << "because there was a read failure."; - return std::vector<char>(); - } - - return file_data; -} - -std::string EntriesToString(const download_pb::DownloadEntries& entries) { - std::string entries_string; - if (!entries.SerializeToString(&entries_string)) { - // TODO(crbug.com/778425): Have more robust error-handling for serialization - // error. - LOG(ERROR) << "Could not write download entries to file " - << "because of a serialization issue."; - return std::string(); - } - return entries_string; -} - -void WriteEntriesToFile(const std::string& entries, base::FilePath file_path) { - if (file_path.empty()) - return; - - if (!base::ImportantFileWriter::WriteFileAtomically(file_path, entries)) { - LOG(ERROR) << "Could not write download entries to file: " - << file_path.value(); - } -} - -void DeleteFile(base::FilePath file_path) { - if (file_path.empty()) - return; - - if (!base::DeleteFile(file_path, false)) { - LOG(ERROR) << "Could not delete download cache file: " << file_path.value(); - } -} - -} // namespace - -InProgressCacheImpl::InProgressCacheImpl( - const base::FilePath& cache_file_path, - const scoped_refptr<base::SequencedTaskRunner>& task_runner) - : file_path_(cache_file_path), - initialization_status_(CACHE_UNINITIALIZED), - task_runner_(task_runner), - weak_ptr_factory_(this) {} - -InProgressCacheImpl::~InProgressCacheImpl() = default; - -void InProgressCacheImpl::Initialize(base::OnceClosure callback) { - // If it's already initialized, just run the callback. - if (initialization_status_ == CACHE_INITIALIZED) { - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - std::move(callback)); - return; - } - - // If uninitialized, initialize |entries_| by reading from file. - if (initialization_status_ == CACHE_UNINITIALIZED) { - base::PostTaskAndReplyWithResult( - task_runner_.get(), FROM_HERE, - base::BindOnce(&ReadEntriesFromFile, file_path_), - base::BindOnce(&InProgressCacheImpl::OnInitialized, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); - } -} - -void InProgressCacheImpl::OnInitialized(base::OnceClosure callback, - const std::vector<char>& entries) { - if (!entries.empty()) { - if (!entries_.ParseFromArray(entries.data(), entries.size())) { - // TODO(crbug.com/778425): Get UMA for errors. - // If the data cannot be parsed, just call the callback and the cache - // will be overwritten by the next write. - LOG(ERROR) << "Could not read download entries from file " - << "because there was a parse failure."; - } - } - - initialization_status_ = CACHE_INITIALIZED; - - std::move(callback).Run(); -} - -void InProgressCacheImpl::AddOrReplaceEntry(const DownloadEntry& entry) { - if (initialization_status_ != CACHE_INITIALIZED) { - LOG(ERROR) << "Cache is not initialized, cannot AddOrReplaceEntry."; - return; - } - - // Update |entries_|. - AddOrReplaceEntryInEntries(entries_, entry); - - // Serialize |entries_| and write to file. - std::string entries_string = EntriesToString(entries_); - task_runner_->PostTask(FROM_HERE, base::BindOnce(&WriteEntriesToFile, - entries_string, file_path_)); -} - -base::Optional<DownloadEntry> InProgressCacheImpl::RetrieveEntry( - const std::string& guid) { - if (initialization_status_ != CACHE_INITIALIZED) { - LOG(ERROR) << "Cache is not initialized, cannot RetrieveEntry."; - return base::nullopt; - } - - return GetEntryFromEntries(entries_, guid); -} - -void InProgressCacheImpl::RemoveEntry(const std::string& guid) { - if (initialization_status_ != CACHE_INITIALIZED) { - LOG(ERROR) << "Cache is not initialized, cannot RemoveEntry."; - return; - } - - // Update |entries_|. - RemoveEntryFromEntries(entries_, guid); - - // Serialize |entries_| and write to file. - std::string entries_string = EntriesToString(entries_); - task_runner_->PostTask(FROM_HERE, base::BindOnce(&WriteEntriesToFile, - entries_string, file_path_)); -} - -std::vector<DownloadEntry> InProgressCacheImpl::GetAllEntries() { - if (initialization_status_ != CACHE_INITIALIZED) { - LOG(ERROR) << "Cache is not initialized, cannot get all entries."; - return std::vector<DownloadEntry>(); - } - return DownloadDBConversions::DownloadEntriesFromProto(entries_); -} - -void InProgressCacheImpl::Destroy() { - task_runner_->PostTask(FROM_HERE, base::BindOnce(&DeleteFile, file_path_)); -} - -} // namespace download
diff --git a/components/download/database/in_progress/in_progress_cache_impl.h b/components/download/database/in_progress/in_progress_cache_impl.h deleted file mode 100644 index a21279e..0000000 --- a/components/download/database/in_progress/in_progress_cache_impl.h +++ /dev/null
@@ -1,62 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_DOWNLOAD_DATABASE_IN_PROGRESS_IN_PROGRESS_CACHE_IMPL_H_ -#define COMPONENTS_DOWNLOAD_DATABASE_IN_PROGRESS_IN_PROGRESS_CACHE_IMPL_H_ - -#include <string> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "base/sequenced_task_runner.h" -#include "components/download/database/in_progress/download_entry.h" -#include "components/download/database/in_progress/in_progress_cache.h" -#include "components/download/database/proto/download_entry.pb.h" - -namespace download { - -// InProgressCache provides a write-through cache that persists -// information related to an in-progress download such as request origin, retry -// count, resumption parameters etc to the disk. The entries are written to disk -// right away. -class InProgressCacheImpl : public InProgressCache { - public: - InProgressCacheImpl( - const base::FilePath& cache_file_path, - const scoped_refptr<base::SequencedTaskRunner>& task_runner); - ~InProgressCacheImpl() override; - - // InProgressCache implementation. - void Initialize(base::OnceClosure callback) override; - void AddOrReplaceEntry(const DownloadEntry& entry) override; - base::Optional<DownloadEntry> RetrieveEntry(const std::string& guid) override; - void RemoveEntry(const std::string& guid) override; - std::vector<DownloadEntry> GetAllEntries() override; - void Destroy() override; - - private: - // States to keep track of initialization status. - enum InitializationStatus { - CACHE_UNINITIALIZED = 0, - CACHE_INITIALIZING = 1, - CACHE_INITIALIZED = 2, - }; - - // Steps to execute after initialization is complete. - void OnInitialized(base::OnceClosure callback, - const std::vector<char>& entries); - - download_pb::DownloadEntries entries_; - base::FilePath file_path_; - InitializationStatus initialization_status_; - scoped_refptr<base::SequencedTaskRunner> task_runner_; - base::WeakPtrFactory<InProgressCacheImpl> weak_ptr_factory_; - - DISALLOW_COPY_AND_ASSIGN(InProgressCacheImpl); -}; - -} // namespace download - -#endif // COMPONENTS_DOWNLOAD_DATABASE_IN_PROGRESS_IN_PROGRESS_CACHE_IMPL_H_
diff --git a/components/download/database/in_progress/in_progress_cache_impl_unittest.cc b/components/download/database/in_progress/in_progress_cache_impl_unittest.cc deleted file mode 100644 index ac54cda..0000000 --- a/components/download/database/in_progress/in_progress_cache_impl_unittest.cc +++ /dev/null
@@ -1,127 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/download/database/in_progress/in_progress_cache_impl.h" - -#include <memory> - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/run_loop.h" -#include "base/sequenced_task_runner.h" -#include "base/task/post_task.h" -#include "base/task_runner.h" -#include "base/test/scoped_task_environment.h" -#include "components/download/public/common/download_url_parameters.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using testing::_; - -namespace download { -namespace { - -const base::FilePath::CharType kInProgressCachePath[] = - FILE_PATH_LITERAL("/test/in_progress_cache"); - -DownloadEntry CreateEntry(const std::string& guid) { - DownloadEntry entry; - entry.guid = guid; - return entry; -} - -class InProgressCacheImplTest : public testing::Test { - public: - InProgressCacheImplTest() - : cache_initialized_(false), - task_environment_( - base::test::ScopedTaskEnvironment::MainThreadType::IO) {} - ~InProgressCacheImplTest() override = default; - - void SetUp() override { - base::FilePath file_path(kInProgressCachePath); - scoped_refptr<base::SequencedTaskRunner> task_runner = - base::CreateSequencedTaskRunnerWithTraits( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}); - cache_ = std::make_unique<InProgressCacheImpl>(file_path, task_runner); - } - - protected: - void InitializeCache() { - cache_->Initialize(base::BindRepeating( - &InProgressCacheImplTest::OnCacheInitialized, base::Unretained(this))); - } - - void OnCacheInitialized() { cache_initialized_ = true; } - - std::unique_ptr<InProgressCacheImpl> cache_; - bool cache_initialized_; - base::test::ScopedTaskEnvironment task_environment_; - - private: - DISALLOW_COPY_AND_ASSIGN(InProgressCacheImplTest); -}; // class InProgressCacheImplTest - -} // namespace - -TEST_F(InProgressCacheImplTest, AddAndRetrieveAndReplaceAndRemove) { - // Initialize cache. - InitializeCache(); - while (!cache_initialized_) { - base::RunLoop().RunUntilIdle(); - } - EXPECT_TRUE(cache_initialized_); - - // Add entry. - std::string guid1("guid"); - DownloadEntry entry1 = CreateEntry(guid1); - cache_->AddOrReplaceEntry(entry1); - - base::Optional<DownloadEntry> retrieved_entry1 = cache_->RetrieveEntry(guid1); - EXPECT_TRUE(retrieved_entry1.has_value()); - EXPECT_EQ(entry1, retrieved_entry1.value()); - - // Replace entry. - std::string new_request_origin("new request origin"); - entry1.request_origin = new_request_origin; - entry1.fetch_error_body = true; - entry1.ukm_download_id = 999u; - entry1.download_source = DownloadSource::DRAG_AND_DROP; - - DownloadUrlParameters::RequestHeadersType request_headers = { - std::make_pair("key_1", "value_1"), std::make_pair("key_2", "value_2")}; - entry1.request_headers = request_headers; - cache_->AddOrReplaceEntry(entry1); - - base::Optional<DownloadEntry> replaced_entry1 = cache_->RetrieveEntry(guid1); - EXPECT_TRUE(replaced_entry1.has_value()); - EXPECT_EQ(entry1, replaced_entry1.value()); - EXPECT_EQ(new_request_origin, replaced_entry1->request_origin); - EXPECT_EQ(true, replaced_entry1->fetch_error_body); - EXPECT_EQ(999u, replaced_entry1->ukm_download_id); - EXPECT_EQ(DownloadSource::DRAG_AND_DROP, replaced_entry1->download_source); - EXPECT_EQ(request_headers, replaced_entry1->request_headers); - - // Add another entry. - std::string guid2("guid2"); - DownloadEntry entry2 = CreateEntry(guid2); - cache_->AddOrReplaceEntry(entry2); - - base::Optional<DownloadEntry> retrieved_entry2 = cache_->RetrieveEntry(guid2); - EXPECT_TRUE(retrieved_entry2.has_value()); - EXPECT_EQ(entry2, retrieved_entry2.value()); - - // Remove original entry. - cache_->RemoveEntry(guid1); - base::Optional<DownloadEntry> removed_entry1 = cache_->RetrieveEntry(guid1); - EXPECT_FALSE(removed_entry1.has_value()); - - // Remove other entry. - cache_->RemoveEntry(guid2); - base::Optional<DownloadEntry> removed_entry2 = cache_->RetrieveEntry(guid2); - EXPECT_FALSE(removed_entry2.has_value()); -} - -} // namespace download
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc index b4de1ee..dfd2db6 100644 --- a/components/download/internal/common/download_item_impl.cc +++ b/components/download/internal/common/download_item_impl.cc
@@ -116,7 +116,8 @@ reason == DOWNLOAD_INTERRUPT_REASON_USER_CANCELED; } -std::string GetDownloadTypeNames(DownloadItem::DownloadType type) { +std::string GetDownloadCreationTypeNames( + DownloadItem::DownloadCreationType type) { switch (type) { case DownloadItem::TYPE_ACTIVE_DOWNLOAD: return "NEW_DOWNLOAD"; @@ -161,7 +162,7 @@ class DownloadItemActivatedData : public base::trace_event::ConvertableToTraceFormat { public: - DownloadItemActivatedData(DownloadItem::DownloadType download_type, + DownloadItemActivatedData(DownloadItem::DownloadCreationType download_type, uint32_t download_id, std::string original_url, std::string final_url, @@ -183,7 +184,8 @@ void AppendAsTraceFormat(std::string* out) const override { out->append("{"); out->append(base::StringPrintf( - "\"type\":\"%s\",", GetDownloadTypeNames(download_type_).c_str())); + "\"type\":\"%s\",", + GetDownloadCreationTypeNames(download_type_).c_str())); out->append(base::StringPrintf("\"id\":\"%d\",", download_id_)); out->append("\"original_url\":"); base::EscapeJSONString(original_url_, true, out); @@ -205,7 +207,7 @@ } private: - DownloadItem::DownloadType download_type_; + DownloadItem::DownloadCreationType download_type_; uint32_t download_id_; std::string original_url_; std::string final_url_; @@ -973,7 +975,8 @@ return is_parallelizable && download::IsParallelDownloadEnabled(); } -DownloadItem::DownloadType DownloadItemImpl::GetDownloadType() const { +DownloadItem::DownloadCreationType DownloadItemImpl::GetDownloadCreationType() + const { return download_type_; } @@ -1284,7 +1287,7 @@ // **** Download progression cascade void DownloadItemImpl::Init(bool active, - DownloadItem::DownloadType download_type) { + DownloadItem::DownloadCreationType download_type) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); download_type_ = download_type;
diff --git a/components/download/internal/common/in_progress_download_manager.cc b/components/download/internal/common/in_progress_download_manager.cc index 51e5c904..9252da8 100644 --- a/components/download/internal/common/in_progress_download_manager.cc +++ b/components/download/internal/common/in_progress_download_manager.cc
@@ -10,7 +10,6 @@ #include "components/download/database/download_db_entry.h" #include "components/download/database/download_db_impl.h" #include "components/download/database/download_namespace.h" -#include "components/download/database/in_progress/in_progress_cache_impl.h" #include "components/download/internal/common/download_db_cache.h" #include "components/download/internal/common/resource_downloader.h" #include "components/download/public/common/download_features.h" @@ -121,80 +120,11 @@ main_task_runner); } -// Responsible for persisting the in-progress metadata associated with a -// download. -class InProgressDownloadObserver : public DownloadItem::Observer { - public: - explicit InProgressDownloadObserver(InProgressCache* in_progress_cache); - ~InProgressDownloadObserver() override; - - private: - // DownloadItem::Observer - void OnDownloadUpdated(DownloadItem* download) override; - void OnDownloadRemoved(DownloadItem* download) override; - - // The persistent cache to store in-progress metadata. - InProgressCache* in_progress_cache_; - - DISALLOW_COPY_AND_ASSIGN(InProgressDownloadObserver); -}; - -InProgressDownloadObserver::InProgressDownloadObserver( - InProgressCache* in_progress_cache) - : in_progress_cache_(in_progress_cache) {} - -InProgressDownloadObserver::~InProgressDownloadObserver() = default; - -void InProgressDownloadObserver::OnDownloadUpdated(DownloadItem* download) { - // TODO(crbug.com/778425): Properly handle fail/resume/retry for downloads - // that are in the INTERRUPTED state for a long time. - if (!in_progress_cache_) - return; - - switch (download->GetState()) { - case DownloadItem::DownloadState::COMPLETE: - // Intentional fallthrough. - case DownloadItem::DownloadState::CANCELLED: - if (in_progress_cache_) - in_progress_cache_->RemoveEntry(download->GetGuid()); - break; - - case DownloadItem::DownloadState::INTERRUPTED: - // Intentional fallthrough. - case DownloadItem::DownloadState::IN_PROGRESS: { - // Make sure the entry exists in the cache. - base::Optional<DownloadEntry> entry_opt = - in_progress_cache_->RetrieveEntry(download->GetGuid()); - DownloadEntry entry; - if (!entry_opt.has_value()) { - entry = CreateDownloadEntryFromItem( - *download, std::string(), /* request_origin */ - DownloadSource::UNKNOWN, false, /* fetch_error_body */ - DownloadUrlParameters::RequestHeadersType()); - in_progress_cache_->AddOrReplaceEntry(entry); - break; - } - entry = entry_opt.value(); - break; - } - - default: - break; - } -} - -void InProgressDownloadObserver::OnDownloadRemoved(DownloadItem* download) { - if (!in_progress_cache_) - return; - - in_progress_cache_->RemoveEntry(download->GetGuid()); -} - } // namespace InProgressDownloadManager::InProgressDownloadManager( Delegate* delegate, - const base::FilePath& metadata_cache_dir, + const base::FilePath& in_progress_db_dir, const IsOriginSecureCallback& is_origin_secure_cb) : is_initialized_(false), delegate_(delegate), @@ -202,7 +132,7 @@ download_start_observer_(nullptr), is_origin_secure_cb_(is_origin_secure_cb), weak_factory_(this) { - Initialize(metadata_cache_dir); + Initialize(in_progress_db_dir); } InProgressDownloadManager::~InProgressDownloadManager() = default; @@ -276,19 +206,15 @@ } void InProgressDownloadManager::Initialize( - const base::FilePath& metadata_cache_dir) { - // TODO(qinmin): remove |download_metadata_cache_| when migration is done for - // most clients. - download_metadata_cache_ = std::make_unique<InProgressCacheImpl>( - metadata_cache_dir.empty() - ? base::FilePath() - : metadata_cache_dir.Append(kDownloadMetadataStoreFilename), - base::CreateSequencedTaskRunnerWithTraits( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})); - download_metadata_cache_->Initialize( - base::BindOnce(&InProgressDownloadManager::OnMetadataCacheInitialized, - weak_factory_.GetWeakPtr(), metadata_cache_dir)); + const base::FilePath& in_progress_db_dir) { + download_db_cache_ = std::make_unique<DownloadDBCache>( + in_progress_db_dir.empty() + ? std::make_unique<DownloadDB>() + : std::make_unique<DownloadDBImpl>( + DownloadNamespace::NAMESPACE_BROWSER_DOWNLOAD, + in_progress_db_dir)); + download_db_cache_->Initialize(base::BindOnce( + &InProgressDownloadManager::OnInitialized, weak_factory_.GetWeakPtr())); } void InProgressDownloadManager::ShutDown() { @@ -332,35 +258,18 @@ if (!download) return base::Optional<DownloadEntry>(); - if (download_metadata_cache_) - return download_metadata_cache_->RetrieveEntry(download->GetGuid()); - - if (download_db_cache_) { - return CreateDownloadEntryFromDownloadDBEntry( - download_db_cache_->RetrieveEntry(download->GetGuid())); - } + return CreateDownloadEntryFromDownloadDBEntry( + download_db_cache_->RetrieveEntry(download->GetGuid())); return base::Optional<DownloadEntry>(); } void InProgressDownloadManager::ReportBytesWasted(DownloadItemImpl* download) { - if (download_db_cache_) - download_db_cache_->OnDownloadUpdated(download); - - if (!download_metadata_cache_) - return; - base::Optional<DownloadEntry> entry_opt = - download_metadata_cache_->RetrieveEntry(download->GetGuid()); - if (entry_opt.has_value()) { - DownloadEntry entry = entry_opt.value(); - entry.bytes_wasted = download->GetBytesWasted(); - download_metadata_cache_->AddOrReplaceEntry(entry); - } + download_db_cache_->OnDownloadUpdated(download); } void InProgressDownloadManager::RemoveInProgressDownload( const std::string& guid) { - if (download_db_cache_) - download_db_cache_->RemoveEntry(guid); + download_db_cache_->RemoveEntry(guid); } void InProgressDownloadManager::StartDownload( @@ -432,36 +341,15 @@ if (delegate_) default_download_directory = delegate_->GetDefaultDownloadDirectory(); - if (download_metadata_cache_) { - base::Optional<DownloadEntry> entry_opt = - download_metadata_cache_->RetrieveEntry(download->GetGuid()); - if (!entry_opt.has_value()) { - download_metadata_cache_->AddOrReplaceEntry(CreateDownloadEntryFromItem( - *download, info->request_origin, info->download_source, - info->fetch_error_body, info->request_headers)); - } - } - - if (download_db_cache_) { - base::Optional<DownloadDBEntry> entry_opt = - download_db_cache_->RetrieveEntry(download->GetGuid()); - if (!entry_opt.has_value()) { - download_db_cache_->AddOrReplaceEntry(CreateDownloadDBEntryFromItem( - *download, UkmInfo(info->download_source, GetUniqueDownloadId()), - info->fetch_error_body, info->request_headers)); + base::Optional<DownloadDBEntry> entry_opt = + download_db_cache_->RetrieveEntry(download->GetGuid()); + if (!entry_opt.has_value()) { + download_db_cache_->AddOrReplaceEntry(CreateDownloadDBEntryFromItem( + *download, UkmInfo(info->download_source, GetUniqueDownloadId()), + info->fetch_error_body, info->request_headers)); } download->RemoveObserver(download_db_cache_.get()); download->AddObserver(download_db_cache_.get()); - } else { - if (!in_progress_download_observer_) { - in_progress_download_observer_ = - std::make_unique<InProgressDownloadObserver>( - download_metadata_cache_.get()); - } - // May already observe this item, remove observer first. - download->RemoveObserver(in_progress_download_observer_.get()); - download->AddObserver(in_progress_download_observer_.get()); - } std::unique_ptr<DownloadFile> download_file; if (info->result == DOWNLOAD_INTERRUPT_REASON_NONE) { @@ -484,29 +372,10 @@ download_start_observer_->OnDownloadStarted(download); } -void InProgressDownloadManager::OnMetadataCacheInitialized( - const base::FilePath& metadata_cache_dir) { - download_db_cache_ = std::make_unique<DownloadDBCache>( - metadata_cache_dir.empty() - ? std::make_unique<DownloadDB>() - : std::make_unique<DownloadDBImpl>( - DownloadNamespace::NAMESPACE_BROWSER_DOWNLOAD, - metadata_cache_dir)); - download_db_cache_->Initialize( - base::BindOnce(&InProgressDownloadManager::OnInitialized, - weak_factory_.GetWeakPtr())); -} - void InProgressDownloadManager::OnInitialized( bool success, std::unique_ptr<std::vector<DownloadDBEntry>> entries) { // Destroy the in-progress cache as it is no longer needed on success. - if (success) { - download_metadata_cache_->Destroy(); - download_metadata_cache_.reset(); - } else { - download_db_cache_.reset(); - } if (base::FeatureList::IsEnabled(features::kDownloadDBForNewDownloads)) { for (const auto& entry : *entries) { auto item = CreateDownloadItemImpl(this, entry);
diff --git a/components/download/public/common/download_item.h b/components/download/public/common/download_item.h index d460243..4886c82 100644 --- a/components/download/public/common/download_item.h +++ b/components/download/public/common/download_item.h
@@ -80,7 +80,7 @@ }; // How download item is created. Used for trace event. - enum DownloadType { + enum DownloadCreationType { TYPE_ACTIVE_DOWNLOAD, TYPE_HISTORY_IMPORT, TYPE_SAVE_PAGE_AS @@ -442,8 +442,8 @@ // parallelizable. virtual bool IsParallelDownload() const = 0; - // Gets the DownloadType of this item. - virtual DownloadType GetDownloadType() const = 0; + // Gets the DownloadCreationType of this item. + virtual DownloadCreationType GetDownloadCreationType() const = 0; // External state transitions/setters ----------------------------------------
diff --git a/components/download/public/common/download_item_impl.h b/components/download/public/common/download_item_impl.h index 04bbb77a..a21b8e7 100644 --- a/components/download/public/common/download_item_impl.h +++ b/components/download/public/common/download_item_impl.h
@@ -276,7 +276,7 @@ base::Time GetLastAccessTime() const override; bool IsTransient() const override; bool IsParallelDownload() const override; - DownloadType GetDownloadType() const override; + DownloadCreationType GetDownloadCreationType() const override; void OnContentCheckCompleted(DownloadDangerType danger_type, DownloadInterruptReason reason) override; void SetOpenWhenComplete(bool open) override; @@ -507,7 +507,7 @@ // Construction common to all constructors. |active| should be true for new // downloads and false for downloads from the history. // |download_type| indicates to the trace event what kind of download this is. - void Init(bool active, DownloadItem::DownloadType download_type); + void Init(bool active, DownloadItem::DownloadCreationType download_type); // Callback from file thread when we initialize the DownloadFile. void OnDownloadFileInitialized(DownloadInterruptReason result, @@ -771,7 +771,8 @@ // Source of the download, used in metrics. DownloadSource download_source_ = DownloadSource::UNKNOWN; - DownloadType download_type_ = DownloadType::TYPE_ACTIVE_DOWNLOAD; + DownloadCreationType download_type_ = + DownloadCreationType::TYPE_ACTIVE_DOWNLOAD; THREAD_CHECKER(thread_checker_);
diff --git a/components/download/public/common/in_progress_download_manager.h b/components/download/public/common/in_progress_download_manager.h index b66b751..04af4e9 100644 --- a/components/download/public/common/in_progress_download_manager.h +++ b/components/download/public/common/in_progress_download_manager.h
@@ -31,7 +31,6 @@ class DownloadStartObserver; class DownloadURLLoaderFactoryGetter; class DownloadUrlParameters; -class InProgressCache; struct DownloadDBEntry; // Manager for handling all active downloads. @@ -70,7 +69,7 @@ using IsOriginSecureCallback = base::RepeatingCallback<bool(const GURL&)>; InProgressDownloadManager(Delegate* delegate, - const base::FilePath& metadata_cache_dir, + const base::FilePath& in_progress_db_dir, const IsOriginSecureCallback& is_origin_secure_cb); ~InProgressDownloadManager() override; // Called to start a download. @@ -153,7 +152,7 @@ } private: - void Initialize(const base::FilePath& metadata_cache_dir); + void Initialize(const base::FilePath& in_progress_db_dir); // UrlDownloadHandler::Delegate implementations. void OnUrlDownloadStarted( @@ -165,9 +164,6 @@ void OnUrlDownloadHandlerCreated( UrlDownloadHandler::UniqueUrlDownloadHandlerPtr downloader) override; - // Called when |download_metadata_cache_| is initialized. - void OnMetadataCacheInitialized(const base::FilePath& metadata_cache_dir); - // Called when the object is initialized. void OnInitialized(bool success, std::unique_ptr<std::vector<DownloadDBEntry>> entries); @@ -192,9 +188,6 @@ // Factory for the creation of download files. std::unique_ptr<DownloadFileFactory> file_factory_; - // Cache for storing metadata about in progress downloads. - std::unique_ptr<InProgressCache> download_metadata_cache_; - // Cache for DownloadDB. std::unique_ptr<DownloadDBCache> download_db_cache_;
diff --git a/components/download/public/common/mock_download_item.h b/components/download/public/common/mock_download_item.h index 3bbd725..f534bd7 100644 --- a/components/download/public/common/mock_download_item.h +++ b/components/download/public/common/mock_download_item.h
@@ -108,7 +108,7 @@ MOCK_CONST_METHOD0(GetLastAccessTime, base::Time()); MOCK_CONST_METHOD0(IsTransient, bool()); MOCK_CONST_METHOD0(IsParallelDownload, bool()); - MOCK_CONST_METHOD0(GetDownloadType, DownloadType()); + MOCK_CONST_METHOD0(GetDownloadCreationType, DownloadCreationType()); MOCK_METHOD2(OnContentCheckCompleted, void(DownloadDangerType, DownloadInterruptReason)); MOCK_METHOD1(SetOpenWhenComplete, void(bool));
diff --git a/components/drive/drive_notification_manager.cc b/components/drive/drive_notification_manager.cc index aed70c1c..658a89cd 100644 --- a/components/drive/drive_notification_manager.cc +++ b/components/drive/drive_notification_manager.cc
@@ -109,7 +109,8 @@ auto invalidations = invalidation_map.ForObject(id); int64_t& invalidation_version = invalidated_change_ids_[unpacked_id] = -1; for (auto& invalidation : invalidations) { - if (invalidation.version() > invalidation_version) { + if (!invalidation.is_unknown_version() && + invalidation.version() > invalidation_version) { invalidation_version = invalidation.version(); } }
diff --git a/components/drive/drive_notification_manager_unittest.cc b/components/drive/drive_notification_manager_unittest.cc index 1208242..9517afa 100644 --- a/components/drive/drive_notification_manager_unittest.cc +++ b/components/drive/drive_notification_manager_unittest.cc
@@ -159,13 +159,13 @@ // Emitting an invalidation should not call our observer until the timer // expires. fake_invalidation_service_->EmitInvalidationForTest( - syncer::Invalidation::Init(kDefaultCorpusObjectId, 1, "")); + syncer::Invalidation::InitUnknownVersion(kDefaultCorpusObjectId)); EXPECT_TRUE(drive_notification_observer_->GetNotificationIds().empty()); task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(5)); // Default corpus is has the id "" when sent to observers. - std::map<std::string, int64_t> expected_ids = {{"", 1}}; + std::map<std::string, int64_t> expected_ids = {{"", -1}}; EXPECT_EQ(expected_ids, drive_notification_observer_->GetNotificationIds()); drive_notification_observer_->ClearNotificationIds();
diff --git a/components/feed/core/feed_content_database.cc b/components/feed/core/feed_content_database.cc index b0209fd..0b2e3514 100644 --- a/components/feed/core/feed_content_database.cc +++ b/components/feed/core/feed_content_database.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/files/file_path.h" +#include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "base/sys_info.h" #include "base/task/post_task.h" @@ -20,6 +21,7 @@ namespace feed { namespace { + using StorageEntryVector = leveldb_proto::ProtoDatabase<ContentStorageProto>::KeyEntryVector; @@ -44,6 +46,11 @@ return base::StartsWith(key, key_prefix, base::CompareCase::SENSITIVE); } +void ReportOperationResult(bool success) { + UMA_HISTOGRAM_BOOLEAN( + "ContentSuggestions.Feed.ContentStorage.OperationCommitSuccess", success); +} + } // namespace FeedContentDatabase::FeedContentDatabase(const base::FilePath& database_folder) @@ -92,7 +99,8 @@ storage_database_->LoadEntriesWithFilter( base::BindRepeating(&DatabaseKeyFilter, std::move(key_set)), base::BindOnce(&FeedContentDatabase::OnLoadEntriesForLoadContent, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(), + std::move(callback))); } void FeedContentDatabase::LoadContentByPrefix(const std::string& prefix, @@ -102,7 +110,8 @@ storage_database_->LoadEntriesWithFilter( base::BindRepeating(&DatabasePrefixFilter, std::move(prefix)), base::BindOnce(&FeedContentDatabase::OnLoadEntriesForLoadContent, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(), + std::move(callback))); } void FeedContentDatabase::LoadAllContentKeys(ContentKeyCallback callback) { @@ -110,7 +119,8 @@ storage_database_->LoadKeys( base::BindOnce(&FeedContentDatabase::OnLoadKeysForLoadAllContentKeys, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(), + std::move(callback))); } void FeedContentDatabase::CommitContentMutation( @@ -119,6 +129,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(content_mutation); + UMA_HISTOGRAM_COUNTS_100( + "ContentSuggestions.Feed.ContentStorage.CommitMutationCount", + content_mutation->Size()); + if (content_mutation->Empty()) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), true)); @@ -236,13 +250,18 @@ database_status_ = INIT_FAILURE; DVLOG(1) << "FeedContentDatabase init failed."; } + UMA_HISTOGRAM_BOOLEAN("ContentSuggestions.Feed.ContentStorage.InitialSuccess", + success); } void FeedContentDatabase::OnLoadEntriesForLoadContent( + base::TimeTicks start_time, ContentLoadCallback callback, bool success, std::unique_ptr<std::vector<ContentStorageProto>> content) { DVLOG_IF(1, !success) << "FeedContentDatabase load content failed."; + UMA_HISTOGRAM_BOOLEAN("ContentSuggestions.Feed.ContentStorage.LoadSuccess", + success); std::vector<KeyAndData> results; for (const auto& proto : *content) { @@ -252,14 +271,33 @@ results.emplace_back(proto.key(), proto.content_data()); } + base::TimeDelta load_time = base::TimeTicks::Now() - start_time; + UMA_HISTOGRAM_TIMES("ContentSuggestions.Feed.ContentStorage.LoadTime", + load_time); + std::move(callback).Run(success, std::move(results)); } void FeedContentDatabase::OnLoadKeysForLoadAllContentKeys( + base::TimeTicks start_time, ContentKeyCallback callback, bool success, std::unique_ptr<std::vector<std::string>> keys) { DVLOG_IF(1, !success) << "FeedContentDatabase load content keys failed."; + UMA_HISTOGRAM_BOOLEAN( + "ContentSuggestions.Feed.ContentStorage.LoadKeysSuccess", success); + + if (success) { + // Typical usage has a max around 300(100 cards, 3 pieces of content per + // card), could grow forever through heavy usage of dismiss. If typically + // usage changes, 1000 maybe too small. + UMA_HISTOGRAM_COUNTS_1000("ContentSuggestions.Feed.ContentStorage.Count", + keys->size()); + } + + base::TimeDelta load_time = base::TimeTicks::Now() - start_time; + UMA_HISTOGRAM_TIMES("ContentSuggestions.Feed.ContentStorage.LoadKeysTime", + load_time); // We std::move the |*keys|'s entries to |callback|, after that, |keys| become // a pointer holding an empty vector, then we can safely delete unique_ptr @@ -276,12 +314,21 @@ // halted immediately". if (!success) { DVLOG(1) << "FeedContentDatabase committed failed."; + ReportOperationResult(false); std::move(callback).Run(success); return; } // All operations were committed successfully, call |callback|. if (content_mutation->Empty()) { + ReportOperationResult(true); + + base::TimeDelta commit_time = + base::TimeTicks::Now() - content_mutation->GetStartTime(); + UMA_HISTOGRAM_TIMES( + "ContentSuggestions.Feed.ContentStorage.OperationCommitTime", + commit_time); + std::move(callback).Run(success); return; }
diff --git a/components/feed/core/feed_content_database.h b/components/feed/core/feed_content_database.h index a7e444c..5345212 100644 --- a/components/feed/core/feed_content_database.h +++ b/components/feed/core/feed_content_database.h
@@ -103,10 +103,12 @@ // Callback methods given to |storage_database_| for async responses. void OnDatabaseInitialized(bool success); void OnLoadEntriesForLoadContent( + base::TimeTicks start_time, ContentLoadCallback callback, bool success, std::unique_ptr<std::vector<ContentStorageProto>> content); void OnLoadKeysForLoadAllContentKeys( + base::TimeTicks start_time, ContentKeyCallback callback, bool success, std::unique_ptr<std::vector<std::string>> keys);
diff --git a/components/feed/core/feed_content_database_unittest.cc b/components/feed/core/feed_content_database_unittest.cc index 4295650..aa66229 100644 --- a/components/feed/core/feed_content_database_unittest.cc +++ b/components/feed/core/feed_content_database_unittest.cc
@@ -6,6 +6,7 @@ #include <map> +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_task_environment.h" #include "components/feed/core/feed_content_mutation.h" #include "components/feed/core/proto/content_storage.pb.h" @@ -13,6 +14,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using base::HistogramTester; using leveldb_proto::test::FakeDB; using testing::_; @@ -27,6 +29,25 @@ const char kContentData1[] = "Content Data1"; const char kContentData2[] = "Content Data2"; +const char kUmaCommitMutationSizeHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.CommitMutationCount"; +const char kUmaInitialSuccessHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.InitialSuccess"; +const char kUmaLoadKeysSuccessHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.LoadKeysSuccess"; +const char kUmaLoadKeysTimeHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.LoadKeysTime"; +const char kUmaLoadSuccessHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.LoadSuccess"; +const char kUmaLoadTimeHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.LoadTime"; +const char kUmaOperationCommitSuccessHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.OperationCommitSuccess"; +const char kUmaOperationCommitTimeHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.OperationCommitTime"; +const char kUmaSizeHistogramName[] = + "ContentSuggestions.Feed.ContentStorage.Count"; + } // namespace class FeedContentDatabaseTest : public testing::Test { @@ -49,6 +70,8 @@ if (init_database) { content_db_->InitCallback(true); ASSERT_TRUE(db()->IsInitialized()); + histogram().ExpectBucketCount(kUmaInitialSuccessHistogramName, + /*success=*/true, 1); } } @@ -66,6 +89,8 @@ FeedContentDatabase* db() { return feed_db_.get(); } + HistogramTester& histogram() { return histogram_; } + MOCK_METHOD2(OnContentEntriesReceived, void(bool, std::vector<std::pair<std::string, std::string>>)); MOCK_METHOD2(OnContentKeyReceived, void(bool, std::vector<std::string>)); @@ -81,6 +106,8 @@ std::unique_ptr<FeedContentDatabase> feed_db_; + HistogramTester histogram_; + DISALLOW_COPY_AND_ASSIGN(FeedContentDatabaseTest); }; @@ -102,6 +129,10 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, LoadContentsEntries) { @@ -126,6 +157,10 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, LoadContentsEntriesByPrefix) { @@ -152,6 +187,10 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, LoadAllContentKeys) { @@ -171,6 +210,12 @@ db()->LoadAllContentKeys(base::BindOnce( &FeedContentDatabaseTest::OnContentKeyReceived, base::Unretained(this))); storage_db()->LoadKeysCallback(true); + + histogram().ExpectBucketCount(kUmaSizeHistogramName, + /*size=*/2, 1); + histogram().ExpectBucketCount(kUmaLoadKeysSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadKeysTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, SaveContent) { @@ -205,6 +250,12 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(true); + + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/2, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, DeleteContent) { @@ -241,6 +292,12 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(true); + + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/2, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, DeleteContentByPrefix) { @@ -273,6 +330,12 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(true); + + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/1, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, DeleteAllContent) { @@ -306,6 +369,12 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(true); + + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/1, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, SaveAndDeleteContent) { @@ -342,6 +411,12 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(true); + + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/4, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, LoadContentsFail) { @@ -362,6 +437,10 @@ base::BindOnce(&FeedContentDatabaseTest::OnContentEntriesReceived, base::Unretained(this))); storage_db()->LoadCallback(false); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/false, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedContentDatabaseTest, LoadAllContentKeysFail) { @@ -378,6 +457,11 @@ db()->LoadAllContentKeys(base::BindOnce( &FeedContentDatabaseTest::OnContentKeyReceived, base::Unretained(this))); storage_db()->LoadKeysCallback(false); + + histogram().ExpectTotalCount(kUmaSizeHistogramName, 0); + histogram().ExpectBucketCount(kUmaLoadKeysSuccessHistogramName, + /*success=*/false, 1); + histogram().ExpectTotalCount(kUmaLoadKeysTimeHistogramName, 1); } } // namespace feed
diff --git a/components/feed/core/feed_content_mutation.cc b/components/feed/core/feed_content_mutation.cc index 06b1f70..0290ee0 100644 --- a/components/feed/core/feed_content_mutation.cc +++ b/components/feed/core/feed_content_mutation.cc
@@ -11,7 +11,7 @@ namespace feed { -ContentMutation::ContentMutation() = default; +ContentMutation::ContentMutation() : start_time_(base::TimeTicks::Now()) {} ContentMutation::~ContentMutation() = default; @@ -39,6 +39,14 @@ return operations_list_.empty(); } +size_t ContentMutation::Size() const { + return operations_list_.size(); +} + +base::TimeTicks ContentMutation::GetStartTime() const { + return start_time_; +} + ContentOperation ContentMutation::TakeFristOperation() { ContentOperation operation = std::move(operations_list_.front()); operations_list_.pop_front();
diff --git a/components/feed/core/feed_content_mutation.h b/components/feed/core/feed_content_mutation.h index d37ef28..7c48fde 100644 --- a/components/feed/core/feed_content_mutation.h +++ b/components/feed/core/feed_content_mutation.h
@@ -9,6 +9,7 @@ #include <string> #include "base/macros.h" +#include "base/time/time.h" namespace feed { @@ -32,6 +33,11 @@ // Check if mutation has ContentOperation left. bool Empty(); + // Return the number of operations in the mutation. + size_t Size() const; + + base::TimeTicks GetStartTime() const; + // This will remove the first ContentOperation in |operations_list_| and // return it to caller. ContentOperation TakeFristOperation(); @@ -39,6 +45,8 @@ private: std::list<ContentOperation> operations_list_; + const base::TimeTicks start_time_; + DISALLOW_COPY_AND_ASSIGN(ContentMutation); };
diff --git a/components/feed/core/feed_journal_database.cc b/components/feed/core/feed_journal_database.cc index e9eaadbd..f75cc84 100644 --- a/components/feed/core/feed_journal_database.cc +++ b/components/feed/core/feed_journal_database.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/metrics/histogram_macros.h" #include "base/sys_info.h" #include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" @@ -17,6 +18,7 @@ namespace feed { namespace { + using StorageEntryVector = leveldb_proto::ProtoDatabase<JournalStorageProto>::KeyEntryVector; @@ -31,6 +33,14 @@ const size_t kDatabaseWriteBufferSizeBytes = 512 * 1024; const size_t kDatabaseWriteBufferSizeBytesForLowEndDevice = 128 * 1024; +void ReportLoadEntriesHistograms(bool success, base::TimeTicks start_time) { + UMA_HISTOGRAM_BOOLEAN("ContentSuggestions.Feed.JournalStorage.LoadSuccess", + success); + base::TimeDelta load_time = base::TimeTicks::Now() - start_time; + UMA_HISTOGRAM_TIMES("ContentSuggestions.Feed.JournalStorage.LoadTime", + load_time); +} + } // namespace FeedJournalDatabase::FeedJournalDatabase(const base::FilePath& database_folder) @@ -76,7 +86,8 @@ storage_database_->GetEntry( key, base::BindOnce(&FeedJournalDatabase::OnGetEntryForLoadJournal, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), + base::TimeTicks::Now(), std::move(callback))); } void FeedJournalDatabase::DoesJournalExist(const std::string& key, @@ -85,7 +96,8 @@ storage_database_->GetEntry( key, base::BindOnce(&FeedJournalDatabase::OnGetEntryForDoesJournalExist, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), + base::TimeTicks::Now(), std::move(callback))); } void FeedJournalDatabase::CommitJournalMutation( @@ -94,6 +106,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(journal_mutation); + UMA_HISTOGRAM_COUNTS_100( + "ContentSuggestions.Feed.JournalStorage.CommitMutationCount", + journal_mutation->Size()); + if (journal_mutation->Empty()) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), true)); @@ -124,7 +140,8 @@ storage_database_->LoadKeys( base::BindOnce(&FeedJournalDatabase::OnLoadKeysForLoadAllJournalKeys, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(), + std::move(callback))); } void FeedJournalDatabase::DeleteAllJournals(ConfirmationCallback callback) { @@ -135,7 +152,8 @@ std::make_unique<StorageEntryVector>(), base::BindRepeating([](const std::string& x) { return true; }), base::BindOnce(&FeedJournalDatabase::OnOperationCommitted, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(), + std::move(callback))); } void FeedJournalDatabase::PerformOperations( @@ -168,11 +186,12 @@ } } - CommitOperations(std::move(journal), std::move(copy_to_journal), - std::move(callback)); + CommitOperations(journal_mutation->GetStartTime(), std::move(journal), + std::move(copy_to_journal), std::move(callback)); } void FeedJournalDatabase::CommitOperations( + base::TimeTicks start_time, std::unique_ptr<JournalStorageProto> journal, JournalMap copy_to_journal, ConfirmationCallback callback) { @@ -194,7 +213,8 @@ storage_database_->UpdateEntries( std::move(journals_to_save), std::move(journals_to_delete), base::BindOnce(&FeedJournalDatabase::OnOperationCommitted, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), std::move(start_time), + std::move(callback))); } void FeedJournalDatabase::OnDatabaseInitialized(bool success) { @@ -206,9 +226,12 @@ database_status_ = INIT_FAILURE; DVLOG(1) << "FeedJournalDatabase init failed."; } + UMA_HISTOGRAM_BOOLEAN("ContentSuggestions.Feed.JournalStorage.InitialSuccess", + success); } void FeedJournalDatabase::OnGetEntryForLoadJournal( + base::TimeTicks start_time, JournalLoadCallback callback, bool success, std::unique_ptr<JournalStorageProto> journal) { @@ -221,28 +244,47 @@ } } + ReportLoadEntriesHistograms(success, start_time); + std::move(callback).Run(success, std::move(results)); } void FeedJournalDatabase::OnGetEntryForDoesJournalExist( + base::TimeTicks start_time, CheckExistingCallback callback, bool success, std::unique_ptr<JournalStorageProto> journal) { DVLOG_IF(1, !success) << "FeedJournalDatabase load journal failed."; + ReportLoadEntriesHistograms(success, start_time); + std::move(callback).Run(success, journal ? true : false); } void FeedJournalDatabase::OnLoadKeysForLoadAllJournalKeys( + base::TimeTicks start_time, JournalLoadCallback callback, bool success, std::unique_ptr<std::vector<std::string>> keys) { DVLOG_IF(1, !success) << "FeedJournalDatabase load journal keys failed."; + UMA_HISTOGRAM_BOOLEAN( + "ContentSuggestions.Feed.JournalStorage.LoadKeysSuccess", success); std::vector<std::string> results; if (keys) { results = std::move(*keys); } + + if (success) { + // Journal count is about how many Feed surfaces opens/shows to a user. + UMA_HISTOGRAM_EXACT_LINEAR("ContentSuggestions.Feed.JournalStorage.Count", + results.size(), 50); + } + + base::TimeDelta load_time = base::TimeTicks::Now() - start_time; + UMA_HISTOGRAM_TIMES("ContentSuggestions.Feed.JournalStorage.LoadKeysTime", + load_time); + std::move(callback).Run(success, std::move(results)); } @@ -261,9 +303,18 @@ std::move(callback)); } -void FeedJournalDatabase::OnOperationCommitted(ConfirmationCallback callback, +void FeedJournalDatabase::OnOperationCommitted(base::TimeTicks start_time, + ConfirmationCallback callback, bool success) { DVLOG_IF(1, !success) << "FeedJournalDatabase commit failed."; + UMA_HISTOGRAM_BOOLEAN( + "ContentSuggestions.Feed.JournalStorage.OperationCommitSuccess", success); + + base::TimeDelta commit_time = base::TimeTicks::Now() - start_time; + UMA_HISTOGRAM_TIMES( + "ContentSuggestions.Feed.JournalStorage.OperationCommitTime", + commit_time); + std::move(callback).Run(success); }
diff --git a/components/feed/core/feed_journal_database.h b/components/feed/core/feed_journal_database.h index ad1eb87..d8093f78 100644 --- a/components/feed/core/feed_journal_database.h +++ b/components/feed/core/feed_journal_database.h
@@ -92,16 +92,19 @@ void PerformOperations(std::unique_ptr<JournalStorageProto> journal, std::unique_ptr<JournalMutation> journal_mutation, ConfirmationCallback callback); - void CommitOperations(std::unique_ptr<JournalStorageProto> journal, + void CommitOperations(base::TimeTicks start_time, + std::unique_ptr<JournalStorageProto> journal, JournalMap copy_to_journal, ConfirmationCallback callback); // Callback methods given to |storage_database_| for async responses. void OnDatabaseInitialized(bool success); - void OnGetEntryForLoadJournal(JournalLoadCallback callback, + void OnGetEntryForLoadJournal(base::TimeTicks start_time, + JournalLoadCallback callback, bool success, std::unique_ptr<JournalStorageProto> journal); void OnGetEntryForDoesJournalExist( + base::TimeTicks start_time, CheckExistingCallback callback, bool success, std::unique_ptr<JournalStorageProto> journal); @@ -111,10 +114,13 @@ bool success, std::unique_ptr<JournalStorageProto> journal); void OnLoadKeysForLoadAllJournalKeys( + base::TimeTicks start_time, JournalLoadCallback callback, bool success, std::unique_ptr<std::vector<std::string>> keys); - void OnOperationCommitted(ConfirmationCallback callback, bool success); + void OnOperationCommitted(base::TimeTicks start_time, + ConfirmationCallback callback, + bool success); JournalStorageProto CopyJouarnal(const std::string& new_journal_name, const JournalStorageProto& source_journal);
diff --git a/components/feed/core/feed_journal_database_unittest.cc b/components/feed/core/feed_journal_database_unittest.cc index 68fcec5..85d7cd9 100644 --- a/components/feed/core/feed_journal_database_unittest.cc +++ b/components/feed/core/feed_journal_database_unittest.cc
@@ -7,6 +7,7 @@ #include <map> #include <utility> +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_task_environment.h" #include "components/feed/core/feed_journal_mutation.h" #include "components/feed/core/proto/journal_storage.pb.h" @@ -14,6 +15,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using base::HistogramTester; using leveldb_proto::test::FakeDB; using testing::Mock; using testing::NotNull; @@ -33,6 +35,25 @@ const char kJournalData5[] = "Journal Data5"; const char kJournalData6[] = "Journal Data6"; +const char kUmaCommitMutationSizeHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.CommitMutationCount"; +const char kUmaInitialSuccessHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.InitialSuccess"; +const char kUmaLoadKeysSuccessHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.LoadKeysSuccess"; +const char kUmaLoadKeysTimeHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.LoadKeysTime"; +const char kUmaLoadSuccessHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.LoadSuccess"; +const char kUmaLoadTimeHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.LoadTime"; +const char kUmaOperationCommitSuccessHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.OperationCommitSuccess"; +const char kUmaOperationCommitTimeHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.OperationCommitTime"; +const char kUmaSizeHistogramName[] = + "ContentSuggestions.Feed.JournalStorage.Count"; + } // namespace class FeedJournalDatabaseTest : public testing::Test { @@ -55,6 +76,8 @@ if (init_database) { journal_db_->InitCallback(true); ASSERT_TRUE(db()->IsInitialized()); + histogram().ExpectBucketCount(kUmaInitialSuccessHistogramName, + /*success=*/true, 1); } } @@ -74,6 +97,8 @@ FeedJournalDatabase* db() { return feed_db_.get(); } + HistogramTester& histogram() { return histogram_; } + MOCK_METHOD2(OnJournalEntryReceived, void(bool, std::vector<std::string>)); MOCK_METHOD1(OnStorageCommitted, void(bool)); MOCK_METHOD2(OnCheckJournalExistReceived, void(bool, bool)); @@ -88,6 +113,8 @@ std::unique_ptr<FeedJournalDatabase> feed_db_; + HistogramTester histogram_; + DISALLOW_COPY_AND_ASSIGN(FeedJournalDatabaseTest); }; @@ -124,6 +151,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->GetCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, LoadNonExistingJournalEntry) { @@ -141,6 +172,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->GetCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, AppendJournal) { @@ -172,6 +207,12 @@ base::Unretained(this))); storage_db()->GetCallback(true); + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/2, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); + Mock::VerifyAndClearExpectations(this); // Append more for |kJournalKey1|. @@ -203,6 +244,12 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->GetCallback(true); + + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/3, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 2); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 2); } TEST_F(FeedJournalDatabaseTest, CopyJournal) { @@ -225,6 +272,12 @@ storage_db()->GetCallback(true); storage_db()->UpdateCallback(true); + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/4, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); + // Check new journal is there. EXPECT_CALL(*this, OnJournalEntryReceived(_, _)) .WillOnce([](bool success, std::vector<std::string> results) { @@ -239,6 +292,10 @@ base::Unretained(this))); storage_db()->GetCallback(true); + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); + Mock::VerifyAndClearExpectations(this); // Check new journal is there. @@ -257,6 +314,10 @@ base::Unretained(this))); storage_db()->GetCallback(true); + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 2); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 2); + Mock::VerifyAndClearExpectations(this); // Check first journal is still there. @@ -274,6 +335,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->GetCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 3); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 3); } TEST_F(FeedJournalDatabaseTest, DeleteJournal) { @@ -295,6 +360,12 @@ RunUntilIdle(); storage_db()->UpdateCallback(true); + histogram().ExpectBucketCount(kUmaCommitMutationSizeHistogramName, + /*operations=*/1, 1); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); + // Make sure |kJournalKey2| got deleted. EXPECT_CALL(*this, OnJournalEntryReceived(_, _)) .WillOnce([](bool success, std::vector<std::string> results) { @@ -307,6 +378,10 @@ base::Unretained(this))); storage_db()->GetCallback(true); + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); + Mock::VerifyAndClearExpectations(this); // Make sure |kJournalKey1| is still there. @@ -323,6 +398,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->GetCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 2); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 2); } TEST_F(FeedJournalDatabaseTest, ChecExistingJournal) { @@ -342,6 +421,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnCheckJournalExistReceived, base::Unretained(this))); storage_db()->GetCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, CheckNonExistingJournal) { @@ -355,6 +438,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnCheckJournalExistReceived, base::Unretained(this))); storage_db()->GetCallback(true); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, LoadAllJournalKeys) { @@ -378,6 +465,12 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->LoadKeysCallback(true); + + histogram().ExpectBucketCount(kUmaSizeHistogramName, + /*size=*/3, 1); + histogram().ExpectBucketCount(kUmaLoadKeysSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadKeysTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, DeleteAllJournals) { @@ -396,6 +489,10 @@ &FeedJournalDatabaseTest::OnStorageCommitted, base::Unretained(this))); storage_db()->UpdateCallback(true); + histogram().ExpectBucketCount(kUmaOperationCommitSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaOperationCommitTimeHistogramName, 1); + // Make sure all journals got deleted. EXPECT_CALL(*this, OnJournalEntryReceived(_, _)) .WillOnce([](bool success, std::vector<std::string> results) { @@ -406,6 +503,12 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->LoadKeysCallback(true); + + histogram().ExpectBucketCount(kUmaSizeHistogramName, + /*size=*/0, 1); + histogram().ExpectBucketCount(kUmaLoadKeysSuccessHistogramName, + /*success=*/true, 1); + histogram().ExpectTotalCount(kUmaLoadKeysTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, LoadJournalEntryFail) { @@ -427,6 +530,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->GetCallback(false); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/false, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, LoadNonExistingJournalEntryFail) { @@ -443,6 +550,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->GetCallback(false); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/false, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, LoadAllJournalKeysFail) { @@ -462,6 +573,11 @@ base::BindOnce(&FeedJournalDatabaseTest::OnJournalEntryReceived, base::Unretained(this))); storage_db()->LoadKeysCallback(false); + + histogram().ExpectTotalCount(kUmaSizeHistogramName, 0); + histogram().ExpectBucketCount(kUmaLoadKeysSuccessHistogramName, + /*success=*/false, 1); + histogram().ExpectTotalCount(kUmaLoadKeysTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, ChecExistingJournalFail) { @@ -481,6 +597,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnCheckJournalExistReceived, base::Unretained(this))); storage_db()->GetCallback(false); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/false, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } TEST_F(FeedJournalDatabaseTest, CheckNonExistingJournalFail) { @@ -494,6 +614,10 @@ base::BindOnce(&FeedJournalDatabaseTest::OnCheckJournalExistReceived, base::Unretained(this))); storage_db()->GetCallback(false); + + histogram().ExpectBucketCount(kUmaLoadSuccessHistogramName, + /*success=*/false, 1); + histogram().ExpectTotalCount(kUmaLoadTimeHistogramName, 1); } } // namespace feed
diff --git a/components/feed/core/feed_journal_mutation.cc b/components/feed/core/feed_journal_mutation.cc index 5bdf03c..22575250 100644 --- a/components/feed/core/feed_journal_mutation.cc +++ b/components/feed/core/feed_journal_mutation.cc
@@ -11,7 +11,8 @@ namespace feed { JournalMutation::JournalMutation(std::string journal_name) - : journal_name_(std::move(journal_name)) {} + : journal_name_(std::move(journal_name)), + start_time_(base::TimeTicks::Now()) {} JournalMutation::~JournalMutation() = default; @@ -37,6 +38,14 @@ return operations_list_.empty(); } +size_t JournalMutation::Size() const { + return operations_list_.size(); +} + +base::TimeTicks JournalMutation::GetStartTime() const { + return start_time_; +} + JournalOperation JournalMutation::TakeFristOperation() { JournalOperation operation = std::move(operations_list_.front()); operations_list_.pop_front();
diff --git a/components/feed/core/feed_journal_mutation.h b/components/feed/core/feed_journal_mutation.h index 306fa2d1..aa473c34 100644 --- a/components/feed/core/feed_journal_mutation.h +++ b/components/feed/core/feed_journal_mutation.h
@@ -9,6 +9,7 @@ #include <string> #include "base/macros.h" +#include "base/time/time.h" #include "components/feed/core/feed_journal_operation.h" namespace feed { @@ -32,6 +33,11 @@ // Check if mutation has JournalOperation left. bool Empty(); + // Return the number of operations in the mutation. + size_t Size() const; + + base::TimeTicks GetStartTime() const; + // This will remove the first JournalOperation in |operations_list_| and // return it to caller. JournalOperation TakeFristOperation(); @@ -43,6 +49,8 @@ std::list<JournalOperation> operations_list_; + const base::TimeTicks start_time_; + DISALLOW_COPY_AND_ASSIGN(JournalMutation); };
diff --git a/components/image_fetcher/core/cache/BUILD.gn b/components/image_fetcher/core/cache/BUILD.gn index 572ebe5..acbb6e36 100644 --- a/components/image_fetcher/core/cache/BUILD.gn +++ b/components/image_fetcher/core/cache/BUILD.gn
@@ -4,6 +4,8 @@ static_library("cache") { sources = [ + "cached_image_fetcher_metrics_reporter.cc", + "cached_image_fetcher_metrics_reporter.h", "image_cache.cc", "image_cache.h", "image_data_store.h",
diff --git a/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.cc b/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.cc new file mode 100644 index 0000000..ed5a86d --- /dev/null +++ b/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.cc
@@ -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. + +#include "components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h" + +#include "base/metrics/histogram_macros.h" + +namespace image_fetcher { + +// static +void CachedImageFetcherMetricsReporter::ReportEvent( + CachedImageFetcherEvent event) { + UMA_HISTOGRAM_ENUMERATION("CachedImageFetcher.Events", event); +} + +// static +void CachedImageFetcherMetricsReporter::ReportLoadTime(LoadTimeType type, + base::Time start_time) { + base::TimeDelta time_delta = base::Time::Now() - start_time; + switch (type) { + case LoadTimeType::kLoadFromCache: + UMA_HISTOGRAM_TIMES("CachedImageFetcher.ImageLoadFromCacheTime", + time_delta); + break; + case LoadTimeType::kLoadFromNetwork: + UMA_HISTOGRAM_TIMES("CachedImageFetcher.ImageLoadFromNetworkTime", + time_delta); + break; + case LoadTimeType::kLoadFromNetworkAfterCacheHit: + UMA_HISTOGRAM_TIMES( + "CachedImageFetcher.ImageLoadFromNetworkAfterCacheHit", time_delta); + break; + } +} + +} // namespace image_fetcher \ No newline at end of file
diff --git a/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h b/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h new file mode 100644 index 0000000..e6f87b6 --- /dev/null +++ b/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h
@@ -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. + +#ifndef COMPONENTS_IMAGE_FETCHER_CORE_CACHE_CACHED_IMAGE_FETCHER_METRICS_REPORTER_H_ +#define COMPONENTS_IMAGE_FETCHER_CORE_CACHE_CACHED_IMAGE_FETCHER_METRICS_REPORTER_H_ + +#include "base/time/time.h" + +namespace image_fetcher { + +// Enum for the result of the fetch, reported through UMA. Present in enums.xml +// as CachedImageFetcherEvent. New values should be added at the end and things +// should not be renumbered. +enum class CachedImageFetcherEvent { + kImageRequest = 0, + kCacheHit = 1, + kCacheMiss = 2, + kCacheDecodingError = 3, + kTranscodingError = 4, + kFailure = 5, + kMaxValue = kFailure, +}; + +// Tracks the various forms of timing events. +enum class LoadTimeType { + kLoadFromCache = 0, + kLoadFromNetwork = 1, + kLoadFromNetworkAfterCacheHit = 2 +}; + +class CachedImageFetcherMetricsReporter { + public: + // Report cache events, used by CachedImageFetcher and composing classes. + static void ReportEvent(CachedImageFetcherEvent event); + + // Report timing for various Cache events related to CachedImageFetcher. + static void ReportLoadTime(LoadTimeType type, base::Time start_time); +}; + +} // namespace image_fetcher + +#endif // COMPONENTS_IMAGE_FETCHER_CORE_CACHE_CACHED_IMAGE_FETCHER_METRICS_REPORTER_H_ \ No newline at end of file
diff --git a/components/image_fetcher/core/cached_image_fetcher.cc b/components/image_fetcher/core/cached_image_fetcher.cc index a62f150..8d0924a 100644 --- a/components/image_fetcher/core/cached_image_fetcher.cc +++ b/components/image_fetcher/core/cached_image_fetcher.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/metrics/histogram_macros.h" #include "base/timer/elapsed_timer.h" +#include "components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h" #include "components/image_fetcher/core/cache/image_cache.h" #include "components/image_fetcher/core/image_decoder.h" #include "components/image_fetcher/core/request_metadata.h" @@ -21,13 +22,6 @@ namespace { -// Tracks the various forms of timing events. -enum class LoadTimeType { - kLoadFromCache = 0, - kLoadFromNetwork = 1, - kLoadFromNetworkAfterCacheHit = 2 -}; - void DataCallbackIfPresent(ImageDataFetcherCallback data_callback, const std::string& image_data, const image_fetcher::RequestMetadata& metadata) { @@ -60,31 +54,8 @@ std::vector<gfx::PNGCodec::Comment>(), dest); } -void ReportLoadTime(LoadTimeType type, base::Time start_time) { - base::TimeDelta time_delta = base::Time::Now() - start_time; - switch (type) { - case LoadTimeType::kLoadFromCache: - UMA_HISTOGRAM_TIMES("CachedImageFetcher.ImageLoadFromCacheTime", - time_delta); - break; - case LoadTimeType::kLoadFromNetwork: - UMA_HISTOGRAM_TIMES("CachedImageFetcher.ImageLoadFromNetworkTime", - time_delta); - break; - case LoadTimeType::kLoadFromNetworkAfterCacheHit: - UMA_HISTOGRAM_TIMES( - "CachedImageFetcher.ImageLoadFromNetworkAfterCacheHit", time_delta); - break; - } -} - } // namespace -// static -void CachedImageFetcher::ReportEvent(CachedImageFetcherEvent event) { - UMA_HISTOGRAM_ENUMERATION("CachedImageFetcher.Events", event); -} - CachedImageFetcher::CachedImageFetcher( std::unique_ptr<ImageFetcher> image_fetcher, scoped_refptr<ImageCache> image_cache, @@ -132,7 +103,8 @@ image_url, std::move(data_callback), std::move(image_callback), traffic_annotation)); - ReportEvent(CachedImageFetcherEvent::kImageRequest); + CachedImageFetcherMetricsReporter::ReportEvent( + CachedImageFetcherEvent::kImageRequest); } void CachedImageFetcher::OnImageFetchedFromCache( @@ -149,7 +121,8 @@ std::move(data_callback), std::move(image_callback), traffic_annotation); - ReportEvent(CachedImageFetcherEvent::kCacheMiss); + CachedImageFetcherMetricsReporter::ReportEvent( + CachedImageFetcherEvent::kCacheMiss); } else { DataCallbackIfPresent(std::move(data_callback), image_data, RequestMetadata()); @@ -161,7 +134,8 @@ image_url, base::Passed(std::move(data_callback)), base::Passed(std::move(image_callback)), traffic_annotation, image_data)); - ReportEvent(CachedImageFetcherEvent::kCacheHit); + CachedImageFetcherMetricsReporter::ReportEvent( + CachedImageFetcherEvent::kCacheHit); } } @@ -180,11 +154,13 @@ std::move(data_callback), std::move(image_callback), traffic_annotation); - ReportEvent(CachedImageFetcherEvent::kCacheDecodingError); + CachedImageFetcherMetricsReporter::ReportEvent( + CachedImageFetcherEvent::kCacheDecodingError); } else { ImageCallbackIfPresent(std::move(image_callback), id, image, RequestMetadata()); - ReportLoadTime(LoadTimeType::kLoadFromCache, start_time); + CachedImageFetcherMetricsReporter::ReportLoadTime( + LoadTimeType::kLoadFromCache, start_time); } } @@ -224,13 +200,15 @@ // Report failure if the image is empty. if (image.IsEmpty()) { - ReportEvent(CachedImageFetcherEvent::kFailure); + CachedImageFetcherMetricsReporter::ReportEvent( + CachedImageFetcherEvent::kFailure); } // Report to different histograms depending upon if there was a cache hit. - ReportLoadTime(cache_hit ? LoadTimeType::kLoadFromNetworkAfterCacheHit - : LoadTimeType::kLoadFromNetwork, - start_time); + CachedImageFetcherMetricsReporter::ReportLoadTime( + cache_hit ? LoadTimeType::kLoadFromNetworkAfterCacheHit + : LoadTimeType::kLoadFromNetwork, + start_time); } void CachedImageFetcher::DecodeDataForCaching( @@ -252,7 +230,8 @@ // it. if (image.IsEmpty() || !EncodeSkBitmapToPNG(*image.ToSkBitmap(), &encoded_data)) { - ReportEvent(CachedImageFetcherEvent::kTranscodingError); + CachedImageFetcherMetricsReporter::ReportEvent( + CachedImageFetcherEvent::kTranscodingError); image_cache_->DeleteImage(image_url.spec()); return; }
diff --git a/components/image_fetcher/core/cached_image_fetcher.h b/components/image_fetcher/core/cached_image_fetcher.h index 99a5dcb9..d145742 100644 --- a/components/image_fetcher/core/cached_image_fetcher.h +++ b/components/image_fetcher/core/cached_image_fetcher.h
@@ -12,6 +12,7 @@ #include "base/containers/flat_map.h" #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" +#include "components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h" #include "components/image_fetcher/core/image_decoder.h" #include "components/image_fetcher/core/image_fetcher.h" #include "components/image_fetcher/core/image_fetcher_types.h" @@ -30,30 +31,12 @@ class ImageFetcher; struct RequestMetadata; -// Enum for the result of the fetch, reported through UMA Present in enums.xml -// as CachedImageFetcherEvent. New values should be added at the end and things -// should not be renumbered. -enum class CachedImageFetcherEvent { - kImageRequest = 0, - kCacheHit = 1, - kCacheMiss = 2, - kCacheDecodingError = 3, - kTranscodingError = 4, - kFailure = 5, - kMaxValue = kFailure, -}; - -// TODO(wylieb): Transcode the image once it's downloaded. // TODO(wylieb): Consider creating a struct to encapsulate the request. // CachedImageFetcher takes care of fetching images from the network and caching // them. Has a read-only mode which doesn't perform write operations on the // cache. class CachedImageFetcher : public ImageFetcher { public: - // Report CachedImageFetcher events, used by sub-systems to report events (as - // well as CachedImageFetcher). - static void ReportEvent(CachedImageFetcherEvent event); - CachedImageFetcher(std::unique_ptr<ImageFetcher> image_fetcher, scoped_refptr<ImageCache> image_cache, bool read_only);
diff --git a/components/ntp_tiles/custom_links_manager.h b/components/ntp_tiles/custom_links_manager.h index df527c1f..226791d0 100644 --- a/components/ntp_tiles/custom_links_manager.h +++ b/components/ntp_tiles/custom_links_manager.h
@@ -65,10 +65,13 @@ // no longer be considered Most Visited. Returns false and does nothing if // custom links is not initialized, either URL is invalid, |url| does not // exist in the list, |new_url| already exists in the list, or both parameters - // are empty. + // are empty. |is_user_action| is true if this was executed by the user (i.e. + // by editing a custom link). Only user actions will update the previous state + // that is restored when CustomLinksManager::UndoAction is called. virtual bool UpdateLink(const GURL& url, const GURL& new_url, - const base::string16& new_title) = 0; + const base::string16& new_title, + bool is_user_action) = 0; // Deletes the link with the specified |url|. Returns false and does nothing // if custom links is not initialized, |url| is invalid, or |url| does not // exist in the list.
diff --git a/components/ntp_tiles/custom_links_manager_impl.cc b/components/ntp_tiles/custom_links_manager_impl.cc index e59b77ec..fd83c95 100644 --- a/components/ntp_tiles/custom_links_manager_impl.cc +++ b/components/ntp_tiles/custom_links_manager_impl.cc
@@ -94,7 +94,8 @@ bool CustomLinksManagerImpl::UpdateLink(const GURL& url, const GURL& new_url, - const base::string16& new_title) { + const base::string16& new_title, + bool is_user_action) { if (!IsInitialized() || !url.is_valid() || (new_url.is_empty() && new_title.empty())) { return false; @@ -112,7 +113,10 @@ return false; // At this point, we will be modifying at least one of the values. - previous_links_ = current_links_; + if (is_user_action) { + // Save the previous state since this was a user update. + previous_links_ = current_links_; + } if (!new_url.is_empty()) it->url = new_url;
diff --git a/components/ntp_tiles/custom_links_manager_impl.h b/components/ntp_tiles/custom_links_manager_impl.h index cc5902b..d350223 100644 --- a/components/ntp_tiles/custom_links_manager_impl.h +++ b/components/ntp_tiles/custom_links_manager_impl.h
@@ -48,7 +48,8 @@ bool AddLink(const GURL& url, const base::string16& title) override; bool UpdateLink(const GURL& url, const GURL& new_url, - const base::string16& new_title) override; + const base::string16& new_title, + bool is_user_action) override; bool DeleteLink(const GURL& url) override; bool UndoAction() override;
diff --git a/components/ntp_tiles/custom_links_manager_impl_unittest.cc b/components/ntp_tiles/custom_links_manager_impl_unittest.cc index bf54bfc..9839d6e1 100644 --- a/components/ntp_tiles/custom_links_manager_impl_unittest.cc +++ b/components/ntp_tiles/custom_links_manager_impl_unittest.cc
@@ -219,18 +219,20 @@ // Update the link's URL. EXPECT_TRUE(custom_links_->UpdateLink(GURL(kTestCase1[0].url), GURL(kTestUrl), - base::string16())); + base::string16(), + /*is_user_action=*/true)); EXPECT_EQ(links_after_update_url, custom_links_->GetLinks()); // Update the link's title. EXPECT_TRUE(custom_links_->UpdateLink(GURL(kTestUrl), GURL(), - base::UTF8ToUTF16(kTestTitle))); + base::UTF8ToUTF16(kTestTitle), + /*is_user_action=*/true)); EXPECT_EQ(links_after_update_title, custom_links_->GetLinks()); // Update the link's URL and title. - EXPECT_TRUE( - custom_links_->UpdateLink(GURL(kTestUrl), GURL(kTestCase1[0].url), - base::UTF8ToUTF16(kTestCase1[0].title))); + EXPECT_TRUE(custom_links_->UpdateLink(GURL(kTestUrl), GURL(kTestCase1[0].url), + base::UTF8ToUTF16(kTestCase1[0].title), + /*is_user_action=*/true)); EXPECT_EQ(links_after_update_both, custom_links_->GetLinks()); } @@ -246,20 +248,24 @@ // Try to update a link that does not exist. This should fail and not modify // the list. EXPECT_FALSE(custom_links_->UpdateLink(GURL(kTestUrl), GURL(), - base::UTF8ToUTF16(kTestTitle))); + base::UTF8ToUTF16(kTestTitle), + /*is_user_action=*/true)); EXPECT_EQ(initial_links, custom_links_->GetLinks()); // Try to pass empty params. This should fail and not modify the list. EXPECT_FALSE(custom_links_->UpdateLink(GURL(kTestCase1[0].url), GURL(), - base::string16())); + base::string16(), + /*is_user_action=*/true)); EXPECT_EQ(initial_links, custom_links_->GetLinks()); // Try to pass an invalid URL. This should fail and not modify the list. EXPECT_FALSE(custom_links_->UpdateLink(kInvalidUrl, GURL(), - base::UTF8ToUTF16(kTestTitle))); + base::UTF8ToUTF16(kTestTitle), + /*is_user_action=*/true)); EXPECT_EQ(initial_links, custom_links_->GetLinks()); EXPECT_FALSE(custom_links_->UpdateLink(GURL(kTestCase1[0].url), kInvalidUrl, - base::string16())); + base::string16(), + /*is_user_action=*/true)); EXPECT_EQ(initial_links, custom_links_->GetLinks()); } @@ -274,7 +280,8 @@ // Try to update a link with a URL that exists in the list. This should fail // and not modify the list. EXPECT_FALSE(custom_links_->UpdateLink( - GURL(kTestCase2[0].url), GURL(kTestCase2[1].url), base::string16())); + GURL(kTestCase2[0].url), GURL(kTestCase2[1].url), base::string16(), + /*is_user_action=*/true)); EXPECT_EQ(initial_links, custom_links_->GetLinks()); } @@ -350,7 +357,8 @@ // Update the link's URL. EXPECT_TRUE(custom_links_->UpdateLink(GURL(kTestCase1[0].url), GURL(kTestUrl), - base::string16())); + base::string16(), + /*is_user_action=*/true)); EXPECT_EQ(links_after_update_url, custom_links_->GetLinks()); // Undo update link. @@ -359,7 +367,8 @@ // Update the link's title. EXPECT_TRUE(custom_links_->UpdateLink(GURL(kTestCase1[0].url), GURL(), - base::UTF8ToUTF16(kTestTitle))); + base::UTF8ToUTF16(kTestTitle), + /*is_user_action=*/true)); EXPECT_EQ(links_after_update_title, custom_links_->GetLinks()); // Undo update link. @@ -413,6 +422,48 @@ EXPECT_EQ(expected_links, custom_links_->GetLinks()); } +TEST_F(CustomLinksManagerImplTest, ShouldNotUndoActionIfInternal) { + NTPTilesVector initial_tiles = FillTestTiles(kTestCase1); + std::vector<Link> initial_links = FillTestLinks(kTestCase1); + std::vector<Link> links_after_update_twice; + links_after_update_twice.emplace_back( + Link{GURL(kTestUrl), base::UTF8ToUTF16(kTestTitle), false}); + std::vector<Link> links_after_add_and_update(initial_links); + links_after_add_and_update.emplace_back(Link{ + GURL(kTestCase2[1].url), base::UTF8ToUTF16(kTestCase2[1].title), false}); + links_after_add_and_update[0].url = GURL(kTestUrl); + links_after_add_and_update[0].is_most_visited = false; + + // Initialize. + ASSERT_TRUE(custom_links_->Initialize(initial_tiles)); + ASSERT_EQ(initial_links, custom_links_->GetLinks()); + + // Update twice. Specify that the second update was internal. + EXPECT_TRUE(custom_links_->UpdateLink(GURL(kTestCase1[0].url), GURL(), + base::UTF8ToUTF16(kTestTitle), + /*is_user_action=*/true)); + EXPECT_TRUE(custom_links_->UpdateLink(GURL(kTestCase1[0].url), GURL(kTestUrl), + base::string16(), + /*is_user_action=*/false)); + EXPECT_EQ(links_after_update_twice, custom_links_->GetLinks()); + + // Undo should revert to the state before the first action. + EXPECT_TRUE(custom_links_->UndoAction()); + EXPECT_EQ(initial_links, custom_links_->GetLinks()); + + // Add then update. Specify that the update was internal. + EXPECT_TRUE(custom_links_->AddLink(GURL(kTestCase2[1].url), + base::UTF8ToUTF16(kTestCase2[1].title))); + EXPECT_TRUE(custom_links_->UpdateLink(GURL(kTestCase1[0].url), GURL(kTestUrl), + base::string16(), + /*is_user_action=*/false)); + EXPECT_EQ(links_after_add_and_update, custom_links_->GetLinks()); + + // Undo should revert to the state before the first action. + EXPECT_TRUE(custom_links_->UndoAction()); + EXPECT_EQ(initial_links, custom_links_->GetLinks()); +} + TEST_F(CustomLinksManagerImplTest, ShouldDeleteMostVisitedOnHistoryDeletion) { NTPTilesVector initial_tiles = FillTestTiles(kTestCase2); std::vector<Link> initial_links = FillTestLinks(kTestCase2);
diff --git a/components/ntp_tiles/most_visited_sites.cc b/components/ntp_tiles/most_visited_sites.cc index 27cddc8..53704ad3 100644 --- a/components/ntp_tiles/most_visited_sites.cc +++ b/components/ntp_tiles/most_visited_sites.cc
@@ -301,16 +301,19 @@ bool MostVisitedSites::UpdateCustomLink(const GURL& url, const GURL& new_url, - const base::string16& new_title) { + const base::string16& new_title, + bool is_user_action) { if (!custom_links_ || !custom_links_enabled_) return false; // Initialize custom links if they have not been initialized yet. InitializeCustomLinks(); - bool success = custom_links_->UpdateLink(url, new_url, new_title); + bool success = + custom_links_->UpdateLink(url, new_url, new_title, is_user_action); if (success) { - if (custom_links_action_count_ != -1) + // Only update the action count if this was executed by the user. + if (is_user_action && custom_links_action_count_ != -1) custom_links_action_count_++; BuildCurrentTiles(); }
diff --git a/components/ntp_tiles/most_visited_sites.h b/components/ntp_tiles/most_visited_sites.h index 6fa7eca8..101bbe3b 100644 --- a/components/ntp_tiles/most_visited_sites.h +++ b/components/ntp_tiles/most_visited_sites.h
@@ -180,10 +180,12 @@ // Updates the URL and/or title of the custom link specified by |url|. If // |url| does not exist or |new_url| already exists in the custom link list, // returns false and does nothing. Will initialize custom links if they have - // not been initialized yet. Custom links must be enabled. + // not been initialized yet. |is_user_action| is true if this was executed by + // the user (i.e. editing a custom link). Custom links must be enabled. bool UpdateCustomLink(const GURL& url, const GURL& new_url, - const base::string16& new_title); + const base::string16& new_title, + bool is_user_action); // Deletes the custom link with the specified |url|. If |url| does not exist // in the custom link list, returns false and does nothing. Will initialize // custom links if they have not been initialized yet. Custom links must be
diff --git a/components/ntp_tiles/most_visited_sites_unittest.cc b/components/ntp_tiles/most_visited_sites_unittest.cc index aae5163..5765fa71 100644 --- a/components/ntp_tiles/most_visited_sites_unittest.cc +++ b/components/ntp_tiles/most_visited_sites_unittest.cc
@@ -272,10 +272,11 @@ MOCK_CONST_METHOD0(IsInitialized, bool()); MOCK_CONST_METHOD0(GetLinks, const std::vector<CustomLinksManager::Link>&()); MOCK_METHOD2(AddLink, bool(const GURL& url, const base::string16& title)); - MOCK_METHOD3(UpdateLink, + MOCK_METHOD4(UpdateLink, bool(const GURL& url, const GURL& new_url, - const base::string16& new_title)); + const base::string16& new_title, + bool is_user_action)); MOCK_METHOD1(DeleteLink, bool(const GURL& url)); MOCK_METHOD0(UndoAction, bool()); MOCK_METHOD1(RegisterCallbackForOnChanged, @@ -1501,7 +1502,8 @@ // Initialize custom links and complete a custom link action. EXPECT_CALL(*mock_custom_links_, Initialize(_)).WillOnce(Return(true)); - EXPECT_CALL(*mock_custom_links_, UpdateLink(_, _, _)).WillOnce(Return(true)); + EXPECT_CALL(*mock_custom_links_, UpdateLink(_, _, _, _)) + .WillOnce(Return(true)); EXPECT_CALL(*mock_custom_links_, IsInitialized()) .WillRepeatedly(Return(true)); EXPECT_CALL(*mock_custom_links_, GetLinks()) @@ -1509,7 +1511,8 @@ EXPECT_CALL(mock_observer_, OnURLsAvailable(_)) .WillOnce(SaveArg<0>(§ions)); most_visited_sites_->UpdateCustomLink(GURL("test.com"), GURL("test.com"), - base::UTF8ToUTF16("test")); + base::UTF8ToUTF16("test"), + /*is_user_action=*/true); base::RunLoop().RunUntilIdle(); ASSERT_THAT( sections.at(SectionType::PERSONALIZED),
diff --git a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc index 3aba74c0..9e742ad0 100644 --- a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc +++ b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc
@@ -263,12 +263,11 @@ void ExpectHasThumbnailForOfflineId(int64_t offline_id, bool to_return) { EXPECT_CALL(*offline_model_, HasThumbnailForOfflineId(offline_id, _)) - .WillOnce( - [&, offline_id, to_return]( - int64_t offline_id, base::OnceCallback<void(bool)> callback) { - task_runner()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), to_return)); - }); + .WillOnce([&, to_return](int64_t offline_id, + base::OnceCallback<void(bool)> callback) { + task_runner()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), to_return)); + }); } PrefetchDispatcherImpl* dispatcher() { return dispatcher_; }
diff --git a/components/password_manager/ios/password_suggestion_helper.h b/components/password_manager/ios/password_suggestion_helper.h index cbcca46..be176807c 100644 --- a/components/password_manager/ios/password_suggestion_helper.h +++ b/components/password_manager/ios/password_suggestion_helper.h
@@ -64,6 +64,7 @@ // of other parameters. - (void)checkIfSuggestionsAvailableForForm:(NSString*)formName fieldIdentifier:(NSString*)fieldIdentifier + fieldType:(NSString*)fieldType type:(NSString*)type frameID:(NSString*)frameID isMainFrame:(BOOL)isMainFrame
diff --git a/components/password_manager/ios/password_suggestion_helper.mm b/components/password_manager/ios/password_suggestion_helper.mm index f46f1853..a8ce9a1 100644 --- a/components/password_manager/ios/password_suggestion_helper.mm +++ b/components/password_manager/ios/password_suggestion_helper.mm
@@ -99,6 +99,7 @@ - (void)checkIfSuggestionsAvailableForForm:(NSString*)formName fieldIdentifier:(NSString*)fieldIdentifier + fieldType:(NSString*)fieldType type:(NSString*)type frameID:(NSString*)frameID isMainFrame:(BOOL)isMainFrame @@ -121,16 +122,19 @@ // Passwords is only supported on main frame and iframes with the same // origin. completion(NO); + return; } } + BOOL isPasswordField = [fieldType isEqual:kPasswordFieldType]; if (!_sentPasswordFormToPasswordManager && [type isEqual:@"focus"]) { // Save the callback until fill data is ready. _suggestionsAvailableCompletion = ^(const AccountSelectFillData* fillData) { completion(!fillData ? NO : fillData->IsSuggestionsAvailable( SysNSStringToUTF16(formName), - SysNSStringToUTF16(fieldIdentifier), false)); + SysNSStringToUTF16(fieldIdentifier), + isPasswordField)); }; // Form extraction is required for this check. [self.delegate suggestionHelperShouldTriggerFormExtraction:self]; @@ -139,7 +143,7 @@ completion(_fillData.IsSuggestionsAvailable( SysNSStringToUTF16(formName), SysNSStringToUTF16(fieldIdentifier), - false)); + isPasswordField)); } - (std::unique_ptr<password_manager::FillData>)getFillDataForUsername:
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index 8a0a9d63..5478d716 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -24,6 +24,12 @@ When this policy is set to false or unset, cookies set by the IdP are transferred to the user's profile during their first login on a device only. This policy affects users whose domain matches the device's enrolment domain only. For all other users, cookies set by the IdP are transferred to the user's profile during their first login on the device only.</translation> +<translation id="1035385378988781231">This policy controls whether the Network File Shares feature for <ph name="PRODUCT_NAME" /> will use NTLM for authentication. + + When this policy is set to True, NTLM will be used for authentication to SMB shares if necessary. + When this policy is set to False, NTLM authentication to SMB shares will be disabled. + + If the policy is left not set, the default is disabled for enterprise-managed users and enabled for non-managed users.</translation> <translation id="1040446814317236570">Enable PAC URL stripping (for https://)</translation> <translation id="1044878202534415707">Report hardware statistics such as CPU/RAM usage. @@ -102,6 +108,13 @@ Default is RollbackDisabled.</translation> <translation id="1221359380862872747">Load specified URLs on demo login</translation> <translation id="1223789468190631420">Safe Browsing enable state for trusted sources</translation> +<translation id="122899932962115297">A whitelist controlling which quick unlock modes the user can configure and use to unlock the lock screen. + + This value is a list of strings; valid list entries are: 'all', 'PIN', 'FINGERPRINT'. Adding 'all' to the list means that every quick unlock mode is available to the user, including ones implemented in the future. Otherwise, only the quick unlock modes present in the list will be available. + + For example, to allow every quick unlock mode, use ['all']. To allow only PIN unlock, use ['PIN']. To allow PIN and fingerprint, use ['PIN', 'FINGERPRINT']. To disable all quick unlock modes, use []. + + By default, no quick unlock modes are available for managed devices.</translation> <translation id="123081309365616809">Enable casting content to the device</translation> <translation id="1243570869342663665">Control SafeSites adult content filtering.</translation> <translation id="1257550411839719984">Set default download directory</translation> @@ -654,6 +667,7 @@ If this policy is left not set, the default is not allowed for managed users and allowed for non-managed users.</translation> <translation id="2660846099862559570">Never use a proxy</translation> +<translation id="2672012807430078509">Controls enabling NTLM as an authentication protocol for SMB mounts</translation> <translation id="267596348720209223">Specifies the character encodings supported by the search provider. Encodings are code page names like UTF-8, GB2312, and ISO-8859-1. They are tried in the order provided. This policy is optional. If not set, the default will be used which is UTF-8. @@ -999,6 +1013,11 @@ If the policy is disabled, no explicit Site Isolation will happen and field trials of IsolateOrigins and SitePerProcess will be disabled. However, users will still be able to facilitate IsolateOrigins manually. If the policy is not configured, the platform default site isolation settings will be used for the sign-in screen. </translation> +<translation id="3748900290998155147">Specifies whether wake locks are allowed. Wake locks can be requested by extensions via the power management extension API and by ARC apps. + + If this policy is set to true or left not set, wake locks will be honoured for power management. + + If this policy is set to false, wake lock requests will be ignored.</translation> <translation id="3750220015372671395">Block key generation on these sites</translation> <translation id="3756011779061588474">Block developer mode</translation> <translation id="3758089716224084329">Allows you to specify the proxy server used by <ph name="PRODUCT_NAME" /> and prevents users from changing proxy settings. @@ -1032,6 +1051,11 @@ If the policy "EnableMediaRouter" is set to false, then this policy's value would have no effect and the toolbar icon would not be shown.</translation> <translation id="3788662722837364290">Power management settings when the user becomes idle</translation> +<translation id="3790085888761753785">If this setting is enabled, users will be allowed to sign into their account with Smart Lock. This is more permissive than usual Smart Lock behaviour which only allows users to unlock their screen. + + If this setting is disabled, users will not be allowed to use Smart Lock Sign-in. + + If this policy is left not set, the default is not allowed for enterprise-managed users and allowed for non-managed users.</translation> <translation id="379602782757302612">Allows you to specify which extensions the users can NOT install. Extensions already installed will be disabled if blacklisted, without a way for the user to enable them. Once a disabled, blacklisted extension is removed, it will automatically get re-enabled. A blacklist value of '*' means all extensions are blacklisted unless they are explicitly listed in the whitelist. @@ -1134,6 +1158,9 @@ If not set or set to False, then users will be able to transfer files to Google Drive.</translation> <translation id="3915395663995367577">URL to a proxy .pac file</translation> +<translation id="3925020515212192040">Specifies a list of preconfigued network file shares. + + Each list item of the policy is an object with two members: 'share_url' and 'mode'. 'share_url' should be the URL of the share and 'mode' should be 'drop_down' which indicates that 'share_url' will be added to the share discovery drop-down.</translation> <translation id="3939893074578116847">Send network packets to the management server to monitor online status, to allow the server to detect if the device is offline. @@ -1282,6 +1309,7 @@ <translation id="4377599627073874279">Allow all sites to show all images</translation> <translation id="437791893267799639">Policy unset, disallow data migration and ARC</translation> <translation id="4389091865841123886">Configure the remote attestation with TPM mechanism.</translation> +<translation id="4408428864159735559">List of pre-configured network file shares.</translation> <translation id="4410236409016356088">Enable throttling network bandwidth</translation> <translation id="441217499641439905">Disable Google Drive over mobile connections in the <ph name="PRODUCT_OS_NAME" /> Files app</translation> <translation id="4418726081189202489">Setting this policy to false stops <ph name="PRODUCT_NAME" /> from occasionally sending queries to a Google server to retrieve an accurate timestamp. These queries will be enabled if this policy is set to True or is not set.</translation> @@ -2019,6 +2047,7 @@ To control which websites are allowed to run Flash, see the 'DefaultPluginsSetting', 'PluginsAllowedForURLs' and 'PluginsBlockedForURLs' policies. If this setting is disabled or not set, Flash content from other origins or small content might be blocked.</translation> +<translation id="6532769014584932288">Allow wake locks</translation> <translation id="653608967792832033">Specifies the length of time without user input after which the screen is locked when running on battery power. When this policy is set to a value greater than zero, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME" /> locks the screen. @@ -2036,6 +2065,7 @@ <translation id="6544897973797372144">If this policy is set to True and the ChromeOsReleaseChannel policy is not specified then users of the enrolling domain will be allowed to change the release channel of the device. If this policy is set to false the device will be locked in whatever channel it was last set. The user selected channel will be overridden by the ChromeOsReleaseChannel policy, but if the policy channel is more stable than the one that was installed on the device, then the channel will only switch after the version of the more stable channel reaches a higher version number than the one installed on the device.</translation> +<translation id="6553143066970470539">Screen brightness per cent</translation> <translation id="6559057113164934677">Do not allow any site to access the camera and microphone</translation> <translation id="6561396069801924653">Show accessibility options in system tray menu</translation> <translation id="6565312346072273043">Set the default state of the on-screen keyboard accessibility feature on the login screen. @@ -2324,6 +2354,11 @@ <translation id="7167436895080860385">Allow users to show passwords in Password Manager (deprecated)</translation> <translation id="7173856672248996428">Ephemeral profile</translation> <translation id="717630378807352957">Allow all printers from the configuration file.</translation> +<translation id="7176721759719212761">Specifies whether screen wake locks are allowed. Screen wake locks can be requested by extensions via the power management extension API and by ARC apps. + + If this policy is set to true or left not set, screen wake locks will be honoured for power management, unless AllowWakeLocks is set to false. + + If this policy is set to false, screen wake lock requests will be demoted to system wake lock requests.</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="718956142899066210">Connection types allowed for updates</translation> <translation id="7194407337890404814">Default search provider name</translation> @@ -2337,6 +2372,11 @@ Automatic playback is only allowed for domains explicitly listed in the <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" /> policy. If you want to enabled automatic playback for all sites, consider adding http://* and https://* to this list. If this policy is left not set, the user will be able to change this setting manually.</translation> +<translation id="7229975860249300121">Contains a regular expression which is used to determine which Google accounts can be set as browser primary accounts in <ph name="PRODUCT_NAME" /> (i.e. the account that is chosen during the Sync opt-in flow). + + An appropriate error is displayed if a user tries to set a browser primary account with a username that does not match this pattern. + + If this policy is left not set or blank, then the user can set any Google account as a browser primary account in <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Set the minimum length of the lock screen PIN</translation> <translation id="7232816984286843471">If the policy is set to false, unaffiliated users will not be allowed to use Crostini. @@ -2489,6 +2529,10 @@ </translation> <translation id="7511361072385293666">If this policy is set to true or not set usage of QUIC protocol in <ph name="PRODUCT_NAME" /> is allowed. If this policy is set to false usage of QUIC protocol is disallowed.</translation> +<translation id="7517845714620372896">Specifies screen brightness per cent. + When this policy is set, initial screen brightness is adjusted to the policy value, but the user can change it later on. Auto-brightness features are disabled. + When this policy is unset, user screen controls and auto-brightness features are not affected. + The policy values should be specified in per cents in the range 0-100.</translation> <translation id="7519251620064708155">Allow key generation on these sites</translation> <translation id="7529100000224450960">Allows you to set a list of url patterns that specify sites which are allowed to open pop-ups. @@ -2599,6 +2643,7 @@ The recognised connection type identifiers are "ethernet", "wifi", "wimax", "bluetooth" and "cellular".</translation> <translation id="7763614521440615342">Show content suggestions on the New Tab page</translation> +<translation id="7765879851993224640">Allow Smart Lock Sign-in to be used.</translation> <translation id="7774768074957326919">Use system proxy settings</translation> <translation id="7775831859772431793">You can specify the URL of the proxy server here. @@ -2712,6 +2757,7 @@ When this policy is changed to False, it applies to starting new virtual machines but does not shut down virtual machines which are already running. When this policy is not set on a managed device, the device is not allowed to run virtual machines. Unmanaged devices are allowed to run virtual machines.</translation> +<translation id="8001701200415781021">Restrict which Google accounts are allowed to be set as browser primary accounts in <ph name="PRODUCT_NAME" /></translation> <translation id="802147957407376460">Rotate screen by 0 degrees</translation> <translation id="8033913082323846868">This policy is deprecated in M70, please use AutofillAddressEnabled and AutofillCreditCardEnabled instead. @@ -2959,6 +3005,25 @@ If the policy is unset or set to true, all users are allowed to use ARC (unless ARC is disabled by other means). Changes to the policy will only be applied while ARC is not running, e.g. while Chrome OS is starting.</translation> +<translation id="8615400197788843468">Enables <ph name="PRODUCT_NAME" />'s restricted login feature in G Suite and prevents users from changing this setting. + + If you define this setting, the user will only be able to access Google + Apps using accounts from the specified domains (note that to allow + gmail.com/googlemail.com accounts, you should add 'consumer_accounts' + (without quotes) to the list of domains). + + This setting will prevent the user from logging in, and adding a secondary + account, on a managed device that requires Google authentication, if that + account does not belong to the aforementioned list of allowed domains. + + If you leave this setting empty/not configured, the user will be able to + access G Suite with any account. + + This policy causes the X-GoogApps-Allowed-Domains header to be appended to + all HTTP and HTTPS requests to all google.com domains, as described in + https://support.google.com/a/answer/1668854. + + Users cannot change or override this setting.</translation> <translation id="8631434304112909927">until version <ph name="UNTIL_VERSION" /></translation> <translation id="863319402127182273">For Android apps, this policy affects the built-in camera only. When this policy is set to true, the camera is disabled for all Android apps, with no exceptions.</translation> <translation id="8649763579836720255">Chrome OS devices can use remote attestation (Verified Access) to get a certificate issued by the Chrome OS CA that asserts that the device is eligible to play protected content. This process involves sending hardware endorsement information to the Chrome OS CA which uniquely identifies the device.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index 98bc40a..b2de90f 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -2,6 +2,15 @@ <!DOCTYPE translationbundle> <translationbundle lang="hi"> <translation id="101438888985615157">स्क्रीन को 180 डिग्री पर घुमाएं</translation> +<translation id="1016912092715201525"><ph name="PRODUCT_NAME" /> में डिफ़ॉल्ट ब्राउज़र जाँच कॉन्फ़िगर करती है और उपयोगकर्ताओं को उन्हें बदलने से रोकती है. + + अगर आप यह सेटिंग चालू करते हैं, तो <ph name="PRODUCT_NAME" /> स्टार्टअप के समय हमेशा जाँच करेगा कि यह डिफ़ॉल्ट ब्राउज़र है या नहीं और मुमकिन होने पर खुद को अपने आप रजिस्टर कर लेगा. + + अगर यह सेटिंग बंद की जाती है, तो <ph name="PRODUCT_NAME" /> कभी भी जाँच नहीं करेगा कि यह डिफ़ॉल्ट ब्राउज़र है या नहीं और उपयोगकर्ता नियंत्रणों को यह विकल्प सेट नहीं करने देगा. + + अगर यह सेटिंग सेट नहीं की जाती है, तो <ph name="PRODUCT_NAME" /> उपयोगकर्ता को यह नियंत्रित करने देगा कि यह डिफ़ॉल्ट ब्राउज़र है या नहीं और ऐसा नहीं होने पर उपयोगकर्ता सूचनाएं दिखाई जानी चाहिए या नहीं. + + <ph name="MS_WIN_NAME" /> के एडमिन के लिए नोट: यह सेटिंग चालू करने की सुविधा सिर्फ़ Windows 7 पर चल रही मशीनों पर काम करेगी. Windows 8 से शुरू होने वाले Windows के वर्शन के लिए, आपको ऐसी "डिफ़ॉल्ट ऐप्लिकेशन एसोसिएशन" फ़ाइल लागू करनी होगी जो <ph name="PRODUCT_NAME" /> को <ph name="HHTPS_PROTOCOL" /> और <ph name="HTTP_PROTOCOL" /> प्रोटोकॉल (और विकल्प के तौर पर, <ph name="FTP_PROTOCOL" /> प्रोटोकॉल और फ़ाइल फ़ॉर्मेट जैसे कि <ph name="HTML_EXTENSION" />, <ph name="HTM_EXTENSION" />, <ph name="PDF_EXTENSION" />, <ph name="SVG_EXTENSION" />, <ph name="WEBP_EXTENSION" />, वगैरह...) का हैंडलर बना देगी. ज़्यादा जानकारी के लिए <ph name="SUPPORT_URL" /> देखें.</translation> <translation id="1017967144265860778">लॉगिन स्क्रीन पर पावर प्रबंधन</translation> <translation id="1019101089073227242">'उपयोगकर्ता डेटा निर्देशिका' सेट करें</translation> <translation id="1022361784792428773">वैसे एक्सटेंशन आईडी जिन्हें इंस्टॉल करने से उपयोगकर्ता को बचना चाहिए (या सभी के लिए *)</translation> @@ -717,6 +726,7 @@ <translation id="2873651257716068683">डिफ़ॉल्ट प्रिंटिंग पेज आकार ओवरराइड कर देती है. अगर इस आकार का पेज उपलब्ध नहीं है तो इस नीति को अनदेखा कर दिया जाता है.</translation> <translation id="2874209944580848064">Android ऐप्लिकेशन का समर्थन करने वाले <ph name="PRODUCT_OS_NAME" /> डिवाइस के लिए नोट:</translation> <translation id="2877225735001246144">Kerberos की पुष्टि तय करते समय CNAME लुकअप बंद करें</translation> +<translation id="2890645751406497668">इन साइटों को, बताए गए विक्रेता और उत्पाद आईडी वाले यूएसबी डिवाइसों से अपने आप जुड़ने की मंज़ूरी देें.</translation> <translation id="2892414556511568464">डुप्लेक्स मोड में प्रिंट करना रोक देती है. सेट न की गई और खाली छोड़ दी गई नीति पर कोई रोक नहीं होती है.</translation> <translation id="2893546967669465276">प्रबंधन सर्वर को सिस्टम लॉग भेजें</translation> <translation id="2899002520262095963">Android ऐप्लिकेशन इस नीति द्वारा सेट किए गए नेटवर्क कॉन्फ़िगरेशन और CA प्रमाणपत्रों का उपयोग कर सकते हैं, लेकिन उनके पास कुछ कॉन्फ़िगरेशन विकल्पों का एक्सेस नहीं होता.</translation> @@ -916,6 +926,7 @@ अगर यह सेटिंग बंद कर दी जाती है या कोई मान सेट नहीं किया जाता है तो, <ph name="PRODUCT_NAME" /> YouTube पर पाबंदी वाला मोड लागू नहीं करता. हालांकि, YouTube की नीतियों जैसी बाहरी नीतियां अभी भी पाबंदी वाला मोड लागू कर सकती हैं.</translation> <translation id="3428247105888806363">नेटवर्क पूर्वानुमान सक्षम करें</translation> +<translation id="3437924696598384725">उपयोगकर्ता को वीपीएन कनेक्शन प्रबंधित करने दें</translation> <translation id="3449886121729668969"><ph name="PRODUCT_NAME" /> की प्रॉक्सी सेटिंग कॉन्फ़िगर करती है. ये प्रॉक्सी सेटिंग ARC-ऐप्लिकेशन के लिए भी उपलब्ध होंगी. यह पॉलिसी अभी तक उपयोग के लिए तैयार नहीं है, कृपया इसका उपयोग ना करें.</translation> @@ -1594,6 +1605,11 @@ <translation id="5323128137188992869"><ph name="PRODUCT_NAME" /> का उपयोग करने वाले डिवाइस पर सामग्री कास्ट करने दें. अगर यह नीति गलत पर सेट की जाती है, तो उपयोगकर्ता उपने डिवाइस पर सामग्री कास्ट नहीं कर पाएंगे. अगर यह नीति सही पर सेट की जाती है, तो उपयोगकर्ता सामग्री कास्ट कर सकते हैं. अगर यह नीति सेट नहीं की जाती है, तो उपयोगकर्ता नामांकित Chrome OS डिवाइसों पर सामग्री कास्ट नहीं कर सकते हैं, लेकिन वे नामांकित नहीं किए गए डिवाइसों पर कास्ट कर सकते हैं.</translation> +<translation id="5329007337159326804">चेतावनी: वर्शन 75 के आने पर (करीब जून 2019 में) ज़्यादातर टीएलएस वर्शन नीति को <ph name="PRODUCT_NAME" /> से पूरी तरह हटा दिया जाएगा. + + अगर यह नीति कॉन्फ़िगर नहीं की जाती है तो <ph name="PRODUCT_NAME" /> डिफ़ॉल्ट अधिकतम वर्शन का इस्तेमाल करता है. + + नहीं तो, इसे आगे दिए गए में से किसी एक मान पर सेट किया जा सकता है: "tls1.2" या "tls1.3". सेट होने पर, <ph name="PRODUCT_NAME" /> बताए गए वर्शन के बाद वाले एसएसएल/टीएलएस वर्शन का इस्तेमाल नहीं करेगा. किसी अनजान मान को अनदेखा कर दिया जाएगा.</translation> <translation id="5330684698007383292"><ph name="PRODUCT_FRAME_NAME" /> को सामग्री के निम्न प्रकारों को प्रबंधित करने दें</translation> <translation id="5365946944967967336">टूलबार पर मुख्यपृष्ठ बटन दिखाएं</translation> <translation id="5366745336748853475">अगर साइट कोई प्रमाणपत्र मांगती है, तो यह आपको ऐसे यूआरएल पैटर्न की सूची तय करने देती है जिसमें ऐसी साइटें होती हैं जिनके लिए SAML फ़्लो होस्ट करने वाली फ़्रेम में साइन-इन स्क्रीन पर क्लाइंट प्रमाणपत्र अपने आप चुना जाता है. SAML IdP को प्रस्तुत किया जाने वाला डिवाइस-व्यापी प्रमाणपत्र कॉन्फ़िगर करना इसके इस्तेमाल का एक उदाहरण है. @@ -1623,6 +1639,15 @@ यदि यह सेटिंग सक्षम हो, तो फिर होस्ट के भौतिक इनपुट और आउटपुट डिवाइस अक्षम कर दिए जाते हैं, जबकि एक दूरस्थ कनेक्शन चल रहा होता है. यदि यह सेटिंग अक्षम हो या सेट नहीं हो, तो फिर स्थानीय और दूरस्थ दोनों उपयोगकर्ता होस्ट के शेयर किए जाते समय उससे सहभागिता कर सकते हैं.</translation> +<translation id="5396049152026347991">उपयोगकर्ता को वीपीएन कनेक्शन प्रबंधित करने की मंज़ूरी दें. + + अगर यह नीति गलत पर सेट की जाती है, तो <ph name="PRODUCT_NAME" /> के वे सभी उपयोगकर्ता इंटरफ़ेस जो उपयोगकर्ता को वीपीएन कनेक्शन डिसकनेक्ट करने देंगे या उनमें बदलाव करने देंगे, उन्हें बंद कर दिया जाता है. + + अगर यह नीति सेट किए बिना छोड़ दी जाती है या सही पर सेट की जाती है, तो उपयोगकर्ता हमेशा की तरह वीपीएन कनेक्शन डिसकनेक्ट कर सकते हैं या उनमें बदलाव कर सकते हैं. + + अगर वीपीएन कनेक्शन किसी वीपीएन ऐप्लिकेशन के ज़रिए बनाया गया है, तो ऐप्लिकेशन के अंदर मौजूद यूआई पर इस नीति का कोई असर नहीं होता. इसलिए, उपयोगकर्ता वीपीएन कनेक्शन में बदलाव करने के लिए ऐप्लिकेशन का अभी भी इस्तेमाल कर सकता है. + + इस नीति का इस्तेमाल "हमेशा चालू वीपीएन" सुविधा के साथ मिलकर किया जाना चाहिए, जो एडमिन को बूट पर वीपीएन कनेक्शन बनाने का फ़ैसला करने देती है.</translation> <translation id="5405289061476885481">यह कॉन्फ़िगर करती है कि <ph name="PRODUCT_OS_NAME" /> साइन-इन स्क्रीन पर किस-किस कीबोर्ड लेआउट की अनुमति है. @@ -1716,6 +1741,11 @@ यदि यह सेटिंग अक्षम होती है या कॉन्फ़िगर नहीं की जाती है, तो उपयोगकर्ता अपने डिवाइस पर बाहरी जगह के सभी समर्थित प्रकारों का उपयोग कर सकते हैं.</translation> <translation id="5697306356229823047">डिवाइस उपयोगकर्ताओं की रिपोर्ट करें</translation> <translation id="570062449808736508">जब यह नीति किसी खाली नहीं स्ट्रिंग पर जोड़ी जाती है तो, WebView किसी दिए गए प्राधिकरण नाम के साथ सामग्री मुहैया कराने वाले URL प्रतिबंधों को पढ़ेगा.</translation> +<translation id="5701714006401683963">अगर नीति गलत पर सेट की जाती है, तो 'प्रबंधित मेहमान सत्र' https://support.google.com/chrome/a/answer/3017014 - मानक "सार्वजनिक सत्र" में बताए गए तरीके से बर्ताव करेगा. + + अगर यह नीति सही पर सेट की जाती है या सेट किए बिना छोड़ दी जाती है, तो 'प्रबंधित मेहमान सत्र' का सामना "प्रबंधित सत्र" के बर्ताव से होगा जिसके चलते नियमित "सार्वजनिक सत्र" के लिए लागू कई पाबंदियां हट जाएंगी. + + अगर यह नीति सेट की जाती है, तो उपयोगकर्ता न तो इसे बदल सकता है न ही ओवरराइड कर सकता है.</translation> <translation id="5722934961007828462">इस सेटिंग के सक्षम होने पर, <ph name="PRODUCT_NAME" /> हमेशा ही ऐसे सर्वर प्रमाणपत्रों के लिए निरस्तीकरण जाँच निष्पादित करेगा जो स्थानीय रूप से स्थापित CA प्रमाणपत्रों द्वारा सफलतापूर्वक मान्य हैं और साइन इन किए गए हैं. यदि <ph name="PRODUCT_NAME" /> निरस्तीकरण स्थिति की जानकारी प्राप्त करने में असमर्थ हो, तो ऐसे प्रमाणपत्रों को निरस्त ('hard-fail') माना जाएगा. @@ -2098,6 +2128,13 @@ <translation id="6786967369487349613">रोमिंग प्रोफ़ाइल निर्देशिका सेट करें</translation> <translation id="6810445994095397827">इन साइटों पर JavaScript अवरुद्ध करें</translation> <translation id="681446116407619279">समर्थित प्रमाणीकरण स्कीम</translation> +<translation id="6816212867679667972">डीएचसीपी अनुरोधों में इस्तेमाल किए जाने वाले डिवाइस का होस्टनाम तय करती है. + + अगर यह नीति किसी ऐसी स्ट्रिंग पर सेट की जाती है जो खाली नहीं है तो, डीएचसीपी अनुरोध के दौरान उस स्ट्रिंग का इस्तेमाल डिवाइस होस्टनाम की तरह किया जाएगा. + + इस स्ट्रिंग में ऐसे वैरिएबल ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME} हैं जिन्हें होस्टनाम के तौर पर इस्तेमाल किए जाने से पहले डिवाइस पर मौजूद मानों से बदल दिया जाएगा. इसके नतीजे के ज़रिए होने वाला बदलाव एक मान्य होस्टनाम होना चाहिए (जैसा कि RFC 1035, सेक्शन 3.1 में बताया गया है). + + अगर यह नीति सेट नहीं की जाती या बदलाव के बाद मिला मान एक मान्य होस्टनाम नहीं है तो, डीएचसीपी अनुरोध में कोई भी होस्टनाम सेट नहीं किया जाएगा. </translation> <translation id="6835883744948188639">उपयोगकर्ता को बार-बार यह सूचित करने वाला संकेत दिखाता है कि फिर से लॉन्च करने का सुझाव दिया गया है</translation> <translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> डिफ़ॉल्ट प्रिंटर चुनने के नियमों को ओवरराइड करती है. @@ -2394,6 +2431,22 @@ यदि यह नीति सेट नहीं है, तो स्वचालित क्लीन-अप डिफ़ॉल्ट अंतर्निहित कार्यनीति का उपयोग करता है. वर्तमान में, यह 'RemoveLRUIfDormant' कार्यनीति है.</translation> <translation id="7336878834592315572">सत्र की अवधि तक कुकी बनाए रखना</translation> +<translation id="7337967786223261174">प्रिंटरों की एक सूची कॉन्फ़िगर करती है. + + यह नीति एडमिन को उनके उपयोगकर्ताओं के लिए प्रिंटर कॉन्फ़िगरेशन मुहैया कराने + देती है. + + <ph name="PRINTER_DISPLAY_NAME" /> और <ph name="PRINTER_DESCRIPTION" /> ऐसी फ़्री-फ़ॉर्म स्ट्रिंग हैं जिन्हें हर चुने गए प्रिंटर के लिए मनमुताबिक बनाया जा सकता है. <ph name="PRINTER_MANUFACTURER" /> और <ph name="PRINTER_MODEL" /> की मदद से आखिरी उपयोगकर्ता प्रिंटर की आसानी से पहचान कर पाते हैं. वे प्रिंटर के निर्माता और मॉडल के बारे में बताते हैं. <ph name="PRINTER_URI" /> एक ऐसा पता होना चाहिए जिस पर किसी क्लाइंट कंप्यूटर से पहुंचा जा सके, जिसमें <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> और <ph name="URI_QUEUE" /> शामिल हैं. <ph name="PRINTER_UUID" /> वैकल्पिक है. अगर बताया गया हो, तो इसका इस्तेमाल <ph name="ZEROCONF_DISCOVERY" /> प्रिंटर की कॉपी हटाने में किया जाता है. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> का मिलान उस स्ट्रिंग से होना चाहिए जो काम करने वाले किसी <ph name="PRODUCT_NAME" /> के बारे में बताती है. स्ट्रिंग का इस्तेमाल प्रिंटर के लिए सही पीपीडी की पहचान करने और उसे इंस्टॉल करने के लिए किया जाएगा. ज़्यादा जानकारी https://support.google.com/chrome?p=noncloudprint पर मिल सकती है. + + प्रिंटर का पहली बार इस्तेमाल करने पर प्रिंटर सेटअप पूरा हो जाता है. जब तक प्रिंटर का इस्तेमाल नहीं किया जाता है तब तक पीपीडी डाउनलोड नहीं किए जाते हैं. उस समय के बाद, अक्सर इस्तेमाल किए जाने वाले पीपीडी कैश कर लिए जाते हैं. + + इस नीति का इस पर कोई असर नहीं पड़ता कि उपयोगकर्ता अलग-अलग डिवाइस पर प्रिंटर कॉन्फ़िगर कर सकता है या नहीं. इसे अलग-अलग उपयोगकर्ताओं के प्रिंटर कॉन्फ़िगरेशन का पूरक होने के लिए बनाया गया है. + + 'चालू निर्देशिका' से प्रबंधित होने वाले डिवाइस के लिए यह नीति <ph name="MACHINE_NAME_VARIABLE" /> को 'चालू निर्देशिका' मशीन नाम या उसकी किसी सबस्ट्रिंग में विस्तारित करने की मंज़ूरी देती है. उदाहरण के लिए, अगर मशीन नाम <ph name="MACHINE_NAME_EXAMPLE" /> है, तो <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> को छठी जगह के बाद शुरू होने वाले चार वर्णों, यानी <ph name="MACHINE_NAME_PART_EXAMPLE" /> से बदल दिया जाएगा. ध्यान रखें कि जगह शून्य पर आधारित होती है. + M71 में <ph name="MACHINE_NAME_VARIABLE_LOWERCASE" /> (लोअरकेस) का इस्तेमाल कम किया गया है और M72 में उसे हटा दिया जाएगा. + </translation> <translation id="7340034977315324840">डिवाइस गतिविधि समय की रिपोर्ट करें</translation> <translation id="7343497214039883642">डिवाइसों के लिए एंटरप्राइज़ प्रिंटर कॉन्फ़िगरेशन फ़ाइल</translation> <translation id="7349338075015720646">खास तौर पर उन वेबसाइटों की एक सूची बनाती है जो उपयोगकर्ता इंटरैक्शन के बिना चुपचाप इंस्टॉल की गई हैं और जिन्हें उपयोगकर्ता अनइंस्टाल नहीं कर सकता और न ही उन पर रोक लगा सकता है. @@ -2823,6 +2876,7 @@ <translation id="8359734107661430198">02/09/2008 से ExampleDeprecatedFeature API (एपीआई) चालू है</translation> <translation id="8367209241899435947">Windows पर Chrome से हानिकारक सॉफ़्टवेयर हटाने की सुविधा चालू करें</translation> <translation id="8369602308428138533">AC पावर पर चलते समय स्क्रीन बंद विलंब</translation> +<translation id="8371178326720637170">एंटरप्राइज़ हार्डवेयर प्लैटफ़ॉर्म API (एपीआई) का इस्तेमाल करने के लिए प्रबंधित एक्सटेंशन चालू करती है</translation> <translation id="8382184662529825177">डिवाइस के लिए सामग्री सुरक्षा के लिए दूरस्थ अनुप्रमाणन के उपयोग को सक्षम करें</translation> <translation id="838870586332499308">डेटा रोमिंग सक्षम करें</translation> <translation id="8390049129576938611">यह नीति <ph name="PRODUCT_NAME" /> में 'इंटरनल PDF व्यूअर' बंद करती है. इसके बजाय यह इसे डाउनलोड के रूप में देखता है और उपयोगकर्ता को डिफ़ॉल्ट ऐप्लिकेशन से PDF फ़ाइलें खोलने की अनुमति देता है. @@ -3082,6 +3136,11 @@ <translation id="8970205333161758602"><ph name="PRODUCT_FRAME_NAME" /> टर्नडाउन संकेत को छिपाती है</translation> <translation id="8976248126101463034">दूरस्थ ऐक्सेस होस्ट के लिए gnubby प्रमाणीकरण की अनुमति दें</translation> <translation id="8976531594979650914">डिफ़ॉल्ट के रूप में सिस्टम डिफ़ॉल्ट प्रिंटर का उपयोग करें</translation> +<translation id="898520305112996948">आपको उन यूआरएल पैटर्न की एक सूची तय करने की मंज़ूरी देती है जो बताएंगे कि किन साइटों को बताए गए विक्रेता और उत्पाद आईडी के ज़रिए कोई यूएसबी डिवाइस एक्सेस करने की अपने आप मंज़ूरी दी जाएगी. नीति मान्य हो इसके लिए ज़रूरी है कि सूची के हर एक आइटम में डिवाइस और यूआरएल पैटर्न, दोनों होने चाहिए. डिवाइस के हर एक आइटम में एक विक्रेता आईडी और उत्पाद आईडी फ़ील्ड हो सकता है. मिटाए गए किसी भी आईडी को एक अपवाद वाले वाइल्डकार्ड की तरह माना जाता है और वह अपवाद यह है कि विक्रेता आईडी तय किए बिना किसी उत्पाद आईडी को तय नहीं किया जा सकता है. नहीं तो, नीति मान्य नहीं होगी. मान्य नीति मानों को अनदेखा कर दिया जाएगा. + + अगर यह नीति सेट किए बिना छोड़ दी जाती है, तो सभी साइटों के लिए 'DefaultWebUsbGuardSetting' के सेट होने पर उससे, या फिर उपयोगकर्ता के निजी कॉन्फ़िगरेशन से वैश्विक डिफ़ॉल्ट मान का इस्तेमाल किया जाएगा. + + इस नीति में बताए गए यूआरएल पैटर्न का टकराव WebUsbBlockedForUrls के ज़रिए कॉन्फ़िगर किए गए यूआरएल से नहीं होना चाहिए. अगर कोई टकराव होता है, तो इस नीति को WebUsbBlockedForUrls और WebUsbAskForUrls के मुकाबले प्राथमिकता दी जाएगी.</translation> <translation id="8992176907758534924">किसी भी साइट को चित्र दिखाने की अनुमति न दें</translation> <translation id="9012851181124311976">यह एंटरप्राइज़ लॉगिन यूआरएल (सिर्फ़ एचटीटीपी और एचटीटीपीएस स्कीम) की सूची कॉन्फ़िगर करती है. इन यूआरएल पर पासवर्ड का फ़िंगरप्रिंट को कैप्चर किया जाएगा और यह पता लगाने के लिए इस्तेमाल किया जाएगा कि क्या पासवर्ड दोबारा इस्तेमाल किया गया है. <ph name="PRODUCT_NAME" /> पासवर्ड के फ़िंगरप्रिंट सही तरीके से कैप्चर करे, इसके लिए कृपया पक्का करें कि आपके लॉगिन पेज https://www.chromium.org/developers/design-documents/create-amazing-password-forms पर दिए गए दिशानिर्देशों का पालन करते हैं.
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index 4bc89b2..7007309 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -2334,7 +2334,7 @@ A házirend segítségével a rendszergazdák nyomtatókonfigurációkat biztosíthatnak a felhasználóknak. - A <ph name="PRINTER_DISPLAY_NAME" /> és a <ph name="PRINTER_DESCRIPTION" /> szabadon megadható karakterláncok, módosításukkal könnyíthető a nyomtatók kiválasztása. A <ph name="PRINTER_MANUFACTURER" /> és a <ph name="PRINTER_MODEL" /> a nyomtatók felhasználó általi azonosítását segíti. A nyomtató gyártóját és típusát jelzik. A <ph name="PRINTER_URI" /> olyan URL-cím, amely elérhető az ügyfélszámítógépről, és tartalmazza a következő elemeket: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> és <ph name="URI_QUEUE" />. Az <ph name="PRINTER_UUID" /> megadása nem kötelező. Ha szerepel, a <ph name="ZEROCONF_DISCOVERY" /> nyomtatók duplikálásának megszüntetését segíti. + A <ph name="PRINTER_DISPLAY_NAME" /> és a <ph name="PRINTER_DESCRIPTION" /> szabadon megadható karakterláncok, módosításukkal könnyíthető a nyomtatók kiválasztása. A <ph name="PRINTER_MANUFACTURER" /> és a <ph name="PRINTER_MODEL" /> a nyomtatók felhasználó általi azonosítását segíti. A nyomtató gyártóját és típusát jelzik. A <ph name="PRINTER_URI" /> olyan URL-cím, amely elérhető az ügyfélszámítógépről, és tartalmazza a következő elemeket: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> és <ph name="URI_QUEUE" />. Az <ph name="PRINTER_UUID" /> megadása nem kötelező. Ha meg van adva, a <ph name="ZEROCONF_DISCOVERY" /> nyomtatók duplikálásának megszüntetését segíti. Az <ph name="PRINTER_EFFECTIVE_MODEL" /> mező értékének <ph name="PRODUCT_NAME" /> által támogatott nyomtatót azonosító karakterlánccal kell egyeznie. Ezen a karakterláncon alapszik a nyomtatóhoz tartozó megfelelő PPD azonosítása és telepítése. További információ: https://support.google.com/chrome?p=noncloudprint.
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index 8748f5e..daa8e75e 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -24,6 +24,12 @@ Ak je toto pravidlo nastavené na hodnotu False alebo nie je nakonfigurované, súbory cookie nastavené poskytovateľom identity sa prenesú do profilu používateľa iba počas prvého prihlásenia používateľa na zariadení. Toto pravidlo má vplyv iba na používateľov, ktorých doména sa zhoduje s doménou registrácie zariadenia. Pre všetkých ostatných používateľov platí, že súbory cookie nastavené poskytovateľom identity sa prenesú do profilu používateľa iba počas prvého prihlásenia používateľa na zariadení.</translation> +<translation id="1035385378988781231">Toto pravidlo riadi, či bude funkcia zdieľania súborov v sieti pre <ph name="PRODUCT_NAME" /> používať na overenie totožnosti NTLM. + + Keď toto pravidlo nastavíte na hodnotu true, totožnosť zdieľaných súborov malých a stredných firiem sa bude v prípade potreby overovať pomocou NTLM. + Keď ho nastavíte na hodnotu false, overenie totožnosti zdieľaných súborov malých a stredných firiem pomocou NTLM bude zakázané. + + Ak toto pravidlo nenastavíte, predvolená hodnota bude zakázaná pre používateľov spravovaných podnikmi a povolená pre používateľov, ktorí nie sú spravovaní.</translation> <translation id="1040446814317236570">Aktivovať odstraňovanie častí z webových adries pred odoslaním do skriptov PAC (pre adresy https://)</translation> <translation id="1044878202534415707">Nahlasovanie štatistík hardvéru, napríklad využitia CPU/RAM. Ak je pravidlo nastavené na možnosť False, štatistiky nebudú hlásené. @@ -90,6 +96,13 @@ Predvolene je pravidlo zakázané (hodnota RollbackDisabled).</translation> <translation id="1221359380862872747">Po prihlásení v režime ukážky načítať zadané webové adresy</translation> <translation id="1223789468190631420">Stav povolenia Bezpečného prehliadania pre dôveryhodné zdroje</translation> +<translation id="122899932962115297">Zoznam povolených položiek umožňujúci ovládať, ktoré režimy rýchleho odomknutia môže používateľ nakonfigurovať a používať na odomykanie uzamknutej obrazovky. + + Táto hodnota je zoznam reťazcov. Platné vstupy sú „all“, „PIN“ a „FINGERPRINT“. Ak do zoznamu pridáte možnosť „all“, používateľ bude mať k dispozícii všetky režimy rýchleho odomknutia vrátane tých, ktoré budú implementované v budúcnosti. Inak budú k dispozícii iba tie režimy rýchleho odomknutia, ktoré sú uvedené v zozname. + + Ak chcete napríklad povoliť všetky režimy rýchleho odomknutia, použite možnosť ["all"]. Ak chcete povoliť iba odomknutie pomocou kódu PIN, použite ["PIN"]. Ak chcete povoliť kód PIN aj odtlačok prsta, použite ["PIN", "FINGERPRINT"]. Ak chcete všetky režimy rýchleho odomknutia zakázať, použite []. + + Pre spravované zariadenia nie sú predvolene k dispozícii žiadne režimy rýchleho odomknutia.</translation> <translation id="123081309365616809">Povolenie prenášania obsahu do zariadenia</translation> <translation id="1243570869342663665">Ovládať filtrovanie obsahu pre dospelých SafeSites</translation> <translation id="1257550411839719984">Nastaviť predvolený adresár na sťahovanie</translation> @@ -630,6 +643,7 @@ Ak ho nenastavíte, predvolene bude táto funkcia zakázaná pre spravovaných používateľov a povolená pre nespravovaných používateľov.</translation> <translation id="2660846099862559570">Nikdy nepoužívať server proxy</translation> +<translation id="2672012807430078509">Ovláda povolenie protokolu NTLM na overenie totožnosti v prípade prepojených súborov malých a stredných firiem</translation> <translation id="267596348720209223">Určuje kódovanie znakov podporovaných poskytovateľom vyhľadávania. Kódovania sú kódové stránky, napríklad UTF-8, GB2312 alebo ISO-8859-1. Budú vyskúšané v uvedenom poradí. Toto pravidlo je voliteľné. Ak nebude nastavené, použije sa predvolené kódovanie (UTF-8). @@ -974,6 +988,11 @@ Ak toto pravidlo zakážete, nenastane žiadna explicitná izolácia webu a skúšobné testy pravidiel IsolateOrigins a SitePerProcess budú zakázané. Používatelia budú môcť ale pravidlo SitePerProcess ručne povoliť. Ak toto pravidlo nenakonfigurujete, pre prihlasovaciu obrazovku sa použijú nastavenia izolácie webov predvolené v rámci danej platformy. </translation> +<translation id="3748900290998155147">Určujte, či sú povolené zákazy režimu spánku. Zákazy režimu spánku je možné vyžiadať rozšíreniami prostredníctvom rozhrania API na správu napájania pre rozšírenia a aplikáciami ARC. + + Ak toto pravidlo nastavíte na hodnotu true alebo ho nenastavíte, zákazy režimu spánku sa budú pri správe napájania zohľadňovať. + + Ak ho nastavíte na hodnotu false, žiadosti o zákaz režimu spánku sa budú ignorovať.</translation> <translation id="3750220015372671395">Blokovať generovanie kľúčov na týchto weboch</translation> <translation id="3756011779061588474">Blokovať režim pre vývojárov</translation> <translation id="3758089716224084329">Umožňuje špecifikovať proxy server, ktorý bude <ph name="PRODUCT_NAME" /> používať, a bráni používateľom zmeniť nastavenia proxy servera. @@ -1007,6 +1026,11 @@ Ak je pravidlo EnableMediaRouter nastavené na hodnotu False, hodnota tohto pravidla sa nijak neprejaví a ikona sa na paneli s nástrojmi nebude zobrazovať.</translation> <translation id="3788662722837364290">Nastavenia správy spotreby energie, keď je používateľ nečinný</translation> +<translation id="3790085888761753785">Ak povolíte toto nastavenie, používatelia sa budú môcť prihlásiť do svojich účtov pomocou funkcie Smart Lock. Ide o benevolentnejší postup narozdiel od zvyčajného správania funkcie Smart Lock, ktoré používateľom umožňuje odomknúť iba obrazovku. + + Ak toto nastavenie zakážete, používatelia nebudú môcť používať prihlásenie pomocou funkcie Smart Lock. + + Ak ho nenastavíte, predvolene bude zakázané pre používateľov spravovaných podnikom a povolené pre používateľov, ktorí nie sú spravovaní.</translation> <translation id="379602782757302612">Umožňuje určiť, ktoré rozšírenia používatelia NEMÔŽU inštalovať. Nainštalované rozšírenia uvedené v zozname zakázaných položiek budú zakázané a používateľ ich nebude môcť povoliť. Ak odstránite rozšírenie zo zoznamu zakázaných položiek, ktoré bolo na základe toho zakázané, bude automaticky znova povolené. Hodnota „*“ v zozname zakázaných položiek znamená, že všetky rozšírenia sú zaradené do zoznamu zakázaných položiek, ak nie sú výslovne uvedené v zozname povolených položiek. @@ -1109,6 +1133,9 @@ Ak toto pravidlo nie je nastavené alebo ak je nastavené na hodnotu False, používatelia budú môcť prenášať súbory na Disk Google.</translation> <translation id="3915395663995367577">Webová adresa súboru PAC servera proxy</translation> +<translation id="3925020515212192040">Určuje zoznam vopred nakonfigurovaných zdieľaných súborov v sieti. + + Jednotlivé položky zoznamu v rámci tohto pravidla sú objekty pozostávajúce z dvoch častí: „share_url“ a „mode“. „share_url“ by mala byť adresa webovej aplikácie a „mode“ by mala byť zoznam „drop_down“ označujúci, že „share_url“ sa pridá do rozbaľovacieho zoznamu na objavovanie zdieľaných súborov.</translation> <translation id="3939893074578116847">Odosielanie sieťových paketov na správcovský server s cieľom sledovania online stavu, ktoré umožní serveru zistiť, či je zariadenie v režime offline. @@ -1257,6 +1284,7 @@ <translation id="4377599627073874279">Povoliť všetkým stránkam zobrazovať obrázky</translation> <translation id="437791893267799639">Pravidlo nie je nastavené, zakázať migráciu dát a ARC</translation> <translation id="4389091865841123886">Konfigurácia vzdialeného overenia s použitím mechanizmu TPM.</translation> +<translation id="4408428864159735559">Zoznam vopred nakonfigurovaných zdieľaných súborov v sieti.</translation> <translation id="4410236409016356088">Povoliť obmedzenie rýchlosti pripojenia</translation> <translation id="441217499641439905">Zakázať v aplikácii Súbory systému <ph name="PRODUCT_OS_NAME" /> používanie Disku Google prostredníctvom mobilných pripojení</translation> <translation id="4418726081189202489">Ak toto pravidlo nastavíte na hodnotu False, <ph name="PRODUCT_NAME" /> prestane odosielať príležitostné dopyty na server Google s cieľom získať presnú časovú pečiatku. Ak pravidlo nastavíte na hodnotu True alebo ju nenastavíte, tieto dopyty budú povolené.</translation> @@ -1994,6 +2022,7 @@ Ak chcete ovládať, ktoré webové stránky majú povolené spúšťať Flash, pozrite si pravidlá DefaultPluginsSetting, PluginsAllowedForUrls a PluginsBlockedForUrls. Ak je toto nastavenie zakázané alebo nie je nastavené, obsah Flash z ostatných zdrojov alebo malého obsahu môže byť blokovaný.</translation> +<translation id="6532769014584932288">Povoliť zákazy režimu spánku</translation> <translation id="653608967792832033">Určuje dobu nečinnosti používateľa, po ktorej sa obrazovka pri napájaní z batérie uzamkne. Ak je toto pravidlo nastavené na hodnotu väčšiu ako nula, určuje dobu nečinnosti používateľa, po ktorej systém <ph name="PRODUCT_OS_NAME" /> obrazovku uzamkne. @@ -2011,6 +2040,7 @@ <translation id="6544897973797372144">Ak je toto pravidlo nastavené na možnosť True a pravidlo ChromeOsReleaseChannel nie je určené, používatelia budú môcť v zariadení meniť kanál na vydávanie nových verzií. Ak je toto pravidlo nastavené na možnosť False, zariadenie bude uzamknuté v kanáli, v ktorom bolo naposledy nastavené. Kanál vybratý používateľom bude prepísaný pravidlom ChromeOsReleaseChannel, avšak ak je kanál pravidla stabilnejší ako kanál nainštalovaný v zariadení, kanál sa zmení až potom, čo bude stabilnejší kanál vo vyššej verzii ako kanál nainštalovaný v zariadení.</translation> +<translation id="6553143066970470539">Percento jasu obrazovky</translation> <translation id="6559057113164934677">Nepovoliť žiadnym stránkam používať kameru a mikrofón</translation> <translation id="6561396069801924653">Zobraziť možnosti dostupnosti v oblasti oznámení</translation> <translation id="6565312346072273043">Nastavuje na prihlasovacej obrazovke predvolený stav funkcie zjednodušenia prístupu ku klávesnici na obrazovke. @@ -2299,6 +2329,11 @@ <translation id="7167436895080860385">Povoliť používateľom zobraziť heslá v Správcovi hesiel (podpora bola ukončená)</translation> <translation id="7173856672248996428">Efemérny profil</translation> <translation id="717630378807352957">Povoliť všetky tlačiarne z konfiguračného súboru</translation> +<translation id="7176721759719212761">Určuje, či sú povolené zákazy režimu spánku obrazovky. Zákazy režimu spánku obrazovky je možné vyžiadať rozšíreniami prostredníctvom rozhrania API na správu napájania pre rozšírenia a aplikáciami ARC. + + Ak toto pravidlo nastavíte na hodnotu true alebo ho nenastavíte, zákazy režimu spánku obrazovky sa budú pri správe napájania zohľadňovať, ak pravidlo AllowWakeLocks nie je nastavené na hodnotu false. + + Ak ho nastavíte na hodnotu false, žiadosti o zákaz režimu spánku obrazovky budú zmenené na zákazy režimu spánku systému.</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="718956142899066210">Typy pripojenia, pre ktoré sú povolené aktualizácie</translation> <translation id="7194407337890404814">Názov predvoleného poskytovateľa vyhľadávania</translation> @@ -2312,6 +2347,11 @@ Automatické prehrávanie je povolené iba pre domény výslovne uvedené v pravidle <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" />. Ak chcete povoliť automatické prehrávanie pre všetky weby, odporúčame do tohto zoznamu pridať výrazy http://* a https://*. Ak toto pravidlo nenastavíte, používateľ bude môcť nastavenie zmeniť ručne.</translation> +<translation id="7229975860249300121">Obsahuje regulárny výraz, ktorý sa používa na určenie toho, ktoré účty Google je možné nastaviť ako hlavné účty prehliadača <ph name="PRODUCT_NAME" /> (t. j. tie, ktoré sa vyberú pri aktivovaní synchronizácie). + + Ak sa používateľ pokúsi nastaviť hlavný účet prehliadača pomocou používateľského mena, ktoré sa nezhoduje s týmto vzorom, zobrazí sa príslušná chyba. + + Ak toto pravidlo nie je nastavené alebo je prázdne, používateľ môže nastaviť ľubovoľný účet Google ako hlavný účet prehliadača <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Nastaviť minimálnu dĺžku kódu PIN na uzamknutej obrazovke</translation> <translation id="7232816984286843471">Ak toto pravidlo nastavíte na hodnotu false, používatelia, ktorí nie sú partneri, nebudú môcť používať funkciu Crostini. @@ -2464,6 +2504,10 @@ </translation> <translation id="7511361072385293666">Ak je toto pravidlo nastavené na možnosť True alebo nie je nastavené vôbec, použitie protokolu QUIC je v prehliadači <ph name="PRODUCT_NAME" /> povolené. Ak je toto pravidlo nastavené na možnosť False, použitie protokolu QUIC je zakázané.</translation> +<translation id="7517845714620372896">Určuje percento jasu obrazovky. + Keď toto pravidlo nastavíte, pôvodný jas obrazovky sa upraví podľa jeho hodnoty, ale používateľ ho môže neskôr zmeniť. Funkcie automatického jasu sú zakázané. + Keď toto pravidlo nenastavíte, ovládacie prvky obrazovky používateľa a funkcie automatického jasu sa nezmenia. + Hodnoty tohto pravidla by ste mali uviesť v percentách od 0 do 100.</translation> <translation id="7519251620064708155">Povoliť generovanie kľúčov na týchto webových stránkach</translation> <translation id="7529100000224450960">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré môžu otvárať kontextové okná. @@ -2574,6 +2618,7 @@ Medzi uznávané identifikátory typov pripojení patria "ethernet", "wifi", "wimax", "bluetooth" a "cellular".</translation> <translation id="7763614521440615342">Zobrazovať návrhy obsahu na stránke na novej karte</translation> +<translation id="7765879851993224640">Povoliť použitie prihlásenia pomocou funkcie Smart Lock</translation> <translation id="7774768074957326919">Použiť systémové nastavenia servera proxy</translation> <translation id="7775831859772431793">Tu môžete zadať webovú adresu proxy servera. @@ -2684,6 +2729,7 @@ Keď toto pravidlo zmeníte na hodnotu false, bude platiť pre nové virtuálne počítače, ale nevypne už spustené virtuálne počítače. Ak toto pravidlo nenastavíte v spravovanom zariadení, nebude môcť spúšťať virtuálne počítače. Nespravované zariadenia môžu spúšťať virtuálne počítače.</translation> +<translation id="8001701200415781021">Obmedziť, ktoré účty Google môžu byť nastavené ako hlavné účty prehliadača <ph name="PRODUCT_NAME" /></translation> <translation id="802147957407376460">Otočiť obrazovku o 0 stupňov</translation> <translation id="8033913082323846868">Podpora tohto pravidla bola ukončená vo verzii M70, použite namiesto neho AutofillAddressEnabled a AutofillCreditCardEnabled. @@ -2919,6 +2965,25 @@ Ak zrušíte nastavenie tohto pravidla alebo ho nastavíte na možnosť True, všetci používatelia môžu používať funkciu ARC (ak nie je zakázaná iným spôsobom). Zmeny pravidla sa použijú iba vtedy, keď funkcia ARC nie je spustená, napr. keď sa spúšťa systém Chrome OS.</translation> +<translation id="8615400197788843468">Umožňuje povoliť funkciu obmedzeného prihlásenia prehliadača <ph name="PRODUCT_NAME" /> v službe G Suite a zabráni používateľom toto nastavenie meniť. + + Ak toto nastavenie definujete, používateľ bude mať prístup do aplikácií Google + iba pomocou účtov z uvedených domén (upozorňujeme, že ak chcete povoliť účty + gmail.com/googlemail.com, mali by ste do zoznamu domén pridať parameter „consumer_accounts“ + (bez úvodzoviek)). + + Toto nastavenie zabráni používateľovi prihlásiť sa a pridať druhý + účet v spravovanom zariadení, ktoré vyžaduje overenie totožnosti Google v prípade, že tento účet + nepatrí do zoznamu povolených domén spomenutého vyššie. + + Ak toto nastavenie ponecháte prázdne alebo ho nenakonfigurujete, používateľ bude mať prístup do služby + G Suite pomocou ľubovoľného účtu. + + Toto pravidlo spôsobí, že hlavička X-GoogApps-Allowed-Domains bude pripojená k všetkým žiadostiam + HTTP a HTTPS do všetkých domén google.com tak, ako je to opísané na + https://support.google.com/a/answer/1668854. + + Používatelia nemôžu toto nastavenie zmeniť ani prepísať.</translation> <translation id="8631434304112909927">po verziu <ph name="UNTIL_VERSION" /></translation> <translation id="863319402127182273">V prípade aplikácií pre Android toto pravidlo ovplyvňuje iba vstavaný fotoaparát. Keď je pravidlo nastavené na hodnotu True, fotoaparát je zakázaný pre všetky aplikácie pre Android (bez výnimiek).</translation> <translation id="8649763579836720255">Zariadenia OS Chrome môžu používať vzdialené overenie (overený prístup) na získanie certifikátu vydaného certifikačnou autoritou OS Chrome, ktorý potvrdzuje, že zariadenie môže prehrávať chránený obsah. Tento proces zahrnuje odoslanie informácií o hardvére certifikačnej autorite OS Chrome, ktoré dané zariadenie jedinečne identifikujú.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index c1100a6a..db1b17c 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -1604,7 +1604,7 @@ Ако подесите ове смернице на „нетачно“, корисници неће моћи да пребацују садржај на свој уређај. Ако подесите ове смернице на „тачно“, корисницима ће бити дозвољено да пребацују садржај. Ако не подесите ове смернице, корисници неће моћи да пребацују садржај на регистроване Chrome ОС уређаје, али ће моћи да га пребацују на нерегистроване уређаје.</translation> <translation id="5329007337159326804">Упозорење: Максимална верзија смерница TLS ће у потпуности бити уклоњена из производа <ph name="PRODUCT_NAME" /> у периоду издавања верзије 75 (око јуна 2019. године). - Ако се ове смернице не конфигуришу, онда ће <ph name="PRODUCT_NAME" /> користити подразумевану максималну верзију. + Ако се ове смернице не конфигуришу, онда ће <ph name="PRODUCT_NAME" /> користити подразумевану максималну верзију. У супротном, смернице могу да се подесе на једну од следећих вредности: „tls1.2“ или „tls1.3“. После подешавања <ph name="PRODUCT_NAME" /> неће користити SSL/TLS верзије изнад наведене верзије. Вредности које не буду препознате ће бити игнорисане.</translation> <translation id="5330684698007383292">Дозволи <ph name="PRODUCT_FRAME_NAME" />-у да рукује следећим типовима садржаја</translation>
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb index 76685bd..9a3cd19 100644 --- a/components/policy/resources/policy_templates_te.xtb +++ b/components/policy/resources/policy_templates_te.xtb
@@ -69,7 +69,7 @@ <translation id="1118093128235245168">కనెక్ట్ చేయబడిన USB పరికరానికి యాక్సెస్ని అందించాల్సిందిగా వినియోగదారుని అభ్యర్థించడానికి సైట్లను అనుమతిస్తుంది</translation> <translation id="1128903365609589950">డిస్క్లో కాష్ చేసిన ఫైల్లను నిల్వ చేయడం కోసం <ph name="PRODUCT_NAME" /> ఉపయోగించే డైరెక్టరీని కాన్ఫిగర్ చేస్తుంది. - మీరు ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారు '--disk-cache-dir' ఫ్లాగ్ను పేర్కొన్నా లేదా పేర్కొనకపోయినా అందించబడిన డైరెక్టరీని <ph name="PRODUCT_NAME" /> ఉపయోగిస్తుంది. <ph name="PRODUCT_NAME" /> దాని కంటెంట్లను నిర్వహించే కారణంగా డేటా నష్టాన్ని లేదా ఇతర ఊహించని లోపాలను నివారించడానికి ఈ విధానాన్ని వాల్యూమ్ మూల డైరెక్టరీకి లేదా ఇతర ప్రయోజనాల కోసం ఉపయోగించే డైరెక్టరీకి సెట్ చేయకూడదు. + మీరు ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారు '--disk-cache-dir' ఫ్లాగ్ను పేర్కొన్నా లేదా పేర్కొనకపోయినా అందించబడిన డైరెక్టరీని <ph name="PRODUCT_NAME" /> ఉపయోగిస్తుంది. <ph name="PRODUCT_NAME" /> దాని కంటెంట్లను నిర్వహించే కారణంగా డేటా నష్టాన్ని లేదా ఇతర ఊహించని ఎర్రర్లను నివారించడానికి ఈ విధానాన్ని వాల్యూమ్ మూల డైరెక్టరీకి లేదా ఇతర ప్రయోజనాల కోసం ఉపయోగించే డైరెక్టరీకి సెట్ చేయకూడదు. ఉపయోగించదగిన చరాంశాల జాబితా కోసం https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables లింక్ని చూడండి. @@ -312,11 +312,11 @@ <translation id="1827523283178827583">స్థిర పరిచిన ప్రాక్సీ సర్వర్లని ఉపయోగించండి</translation> <translation id="1843117931376765605">వినియోగదారు విధానం కోసం రిఫ్రెష్ రేట్</translation> <translation id="1844620919405873871">త్వరిత అన్లాక్ సంబంధిత విధానాలను కాన్ఫిగర్ చేస్తుంది.</translation> -<translation id="1847960418907100918">POSTతో తక్షణ శోధన చేస్తున్నప్పుడు ఉపయోగించే పారామీటర్లను పేర్కొంటుంది. ఇందులో కామాతో వేరు చేయబడిన పేర్ల/విలువల జతలు ఉంటాయి. ఏదైనా విలువ ఎగువ ఉదాహరణలోని {searchTerms} వంటి టెంప్లేట్ పారమీటర్ అయితే, అది వాస్తవ శోధన పదాల డేటాతో భర్తీ చేయబడుతుంది. +<translation id="1847960418907100918">POSTతో తక్షణ శోధన చేస్తున్నప్పుడు ఉపయోగించే పరామితులను పేర్కొంటుంది. ఇందులో కామాతో వేరు చేయబడిన పేరు/విలువ జతలు ఉంటాయి. విలువ ఎగువ ఉదాహరణలోని {searchTerms} వంటి టెంప్లేట్ పరామితి అయితే, ఇది వాస్తవ శోధన పదాల డేటాతో భర్తీ చేయబడుతుంది. ఈ విధానం ఐచ్ఛికం. సెట్ చేయకపోతే, తక్షణ శోధన అభ్యర్థన GET పద్ధతిని ఉపయోగించి పంపబడుతుంది. - 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడినప్పుడు మాత్రమే ఈ విధానం వర్తించబడుతుంది.</translation> + 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడినప్పుడు మాత్రమే ఈ విధానం గౌరవించబడుతుంది.</translation> <translation id="1852294065645015766">మీడియా స్వీయ ప్లేని అనుమతించండి</translation> <translation id="1859859319036806634">హెచ్చరిక: TLS సంస్కరణ ఫాల్బ్యాక్ సంస్కరణ 52 (సుమారు సెప్టెంబర్ 2016) తర్వాత <ph name="PRODUCT_NAME" /> నుండి తీసివేయబడుతుంది మరియు ఈ విధానం ఆపై పని చేయడం ఆగిపోతుంది. @@ -348,7 +348,7 @@ ఈ విధానాన్ని సెట్ చేయడం వలన పరికర స్థాన ఆధారిత స్వయంచాలక సమయ మండలి నిర్ధారణ పూర్తిగా నిలిపివేయబడుతుంది. అలాగే ఇది SystemTimezoneAutomaticDetection విధానాన్ని భర్తీ చేస్తుంది.</translation> <translation id="1885782360784839335">పూర్తి-ట్యాబ్ ప్రచార కంటెంట్ను ప్రదర్శించడాన్ని ప్రారంభించండి</translation> <translation id="1888871729456797026">డెస్క్టాప్లో క్లౌడ్ విధానం యొక్క నమోదు టోకెన్</translation> -<translation id="1897365952389968758">JavaScriptని అమలు చెయ్యడానికి అన్ని సైట్లని అనుమతించు</translation> +<translation id="1897365952389968758">JavaScriptని అమలు చేయ్డడానికి అన్ని సైట్లని అనుమతించు</translation> <translation id="1906888171268104594">Googleకు వినియోగ ప్రమాణాలు మరియు క్రాష్ నివేదికలతో సహా విశ్లేషణ డేటాను తిరిగి నివేదించాలో లేదో నియంత్రిస్తుంది. ఒప్పుకు సెట్ చేసినట్లయితే, <ph name="PRODUCT_OS_NAME" /> వినియోగ ప్రమాణాలు మరియు విశ్లేషణ డేటాను నివేదిస్తుంది. @@ -546,7 +546,7 @@ <translation id="2231817271680715693">మొదటి అమలులోనే డిఫాల్ట్ బ్రౌజర్ నుండి బ్రౌజింగ్ చరిత్రను దిగుమతి చేయి</translation> <translation id="2236488539271255289">స్థానిక డేటాని సెట్ చెయ్యడానికి ఏ సైట్ని అనుమతించవద్దు</translation> <translation id="2240879329269430151">వెబ్సైట్లు పాప్-అప్లు చూపడానికి అనుమతించాలో, లేదో అని సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. పాప్అప్లను ప్రదర్శించడానికి అన్ని వెబ్సైట్లను అనుమతించవచ్చు లేదా నిరాకరించవచ్చు. ఈ విధానం సెట్ చేయకుండా వదిలివేస్తే, 'BlockPopups' ఉపయోగించబడుతుంది మరియు దీన్ని వినియోగదారు మార్పుచేయగలుగుతారు.</translation> -<translation id="2255326053989409609">ఈ సెట్టింగ్ను ప్రారంభించడం వలన వెబ్ పేజీలు గ్రాఫిక్స్ ప్రాసెసింగ్ యూనిట్ని (GPU) యాక్సెస్ చేయకుండా నిరోధించబడతాయి. ప్రత్యేకించి, వెబ్ పేజీలు WebGL APIని యాక్సెస్ చేయలేవు మరియు ప్లగిన్లు పెప్పర్ 3డి APIని ఉపయోగించలేవు. +<translation id="2255326053989409609">ఈ సెట్టింగ్ను ప్రారంభించడం వలన వెబ్ పేజీలు గ్రాఫిక్స్ ప్రాసెసింగ్ యూనిట్ని (GPU) ప్రాప్యత చేయకుండా నిరోధించబడతాయి. ప్రత్యేకించి, వెబ్ పేజీలు WebGL APIని ప్రాప్యత చేయలేవు మరియు ప్లగిన్లు పెప్పర్ 3డి APIని ఉపయోగించలేవు. ఈ సెట్టింగ్ని ఆపివేయడం లేదా సెట్ చేయకుండా విడిచిపెడితే, WebGL APIని ఉపయోగించడానికి వెబ్ పేజీలు సమర్థవంతంగా మరియు పెప్పర్ 3డి APIని ఉపయోగించడానికి ప్లగిన్లు అనుమతించబడతాయి. ఈ APIలని ఉపయోగించడానికి అనుమతించబడడానికి బ్రౌజర్ యొక్క డిఫాల్ట్ సెట్టింగ్లకు ఆదేశ పంక్తి అంశాలు ఇప్పటికీ అవసరం. @@ -721,17 +721,17 @@ ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, డిఫాల్ట్ ప్రకారం నిర్వహిత వినియోగదారులకు నిరాకరించబడుతుంది మరియు నిర్వహించబడని వినియోగదారులకు అనుమతించబడుతుంది.</translation> <translation id="2660846099862559570">ఇప్పటి వరకు ప్రాక్సీని ఉపయోగించలేదా</translation> <translation id="267596348720209223">శోధన ప్రొవైడర్ ద్వారా మద్దతు గల అక్షర ఎన్కోడింగ్లను పేర్కొంటుంది. ఎన్కోడింగ్లు అంటే UTF-8 GB2312 మరియు ISO-8859-1 వంటి కోడ్ పేజీ పేర్లు. అవి అందించబడిన క్రమంలో ప్రయత్నించబడతాయి. ఈ విధానం ఐచ్ఛికం. సెట్ చేయకపోతే, UTF-8 డిఫాల్ట్ ఉపయోగించబడుతుంది. ఈ విధానం కేవలం 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడితే పరిగణించబడుతుంది.</translation> -<translation id="2682697254900811431"><ph name="PRODUCT_NAME" />గురించి వినియోగం మరియు క్రాష్-సంబంధిత డేటాను అజ్ఞాతంగా Googleకి నివేదించడాన్ని ప్రారంభిస్తుంది మరియు ఈ సెట్టింగ్ను మార్చకుండా వినియోగదారులను నిరోధిస్తుంది. +<translation id="2682697254900811431">Enables anonymous reporting of usage and crash-related data about <ph name="PRODUCT_NAME" /> to Google and prevents users from changing this setting. - ఈ సెట్టింగ్ ప్రారంభించబడితే, వినియోగం మరియు క్రాష్-సంబంధిత - డేటా Googleకి అజ్ఞాతంగా నివేదించబడుతుంది. ఇది నిలిపివేయబడితే, ఈ సమాచారం Googleకి - పంపబడదు. ఈ రెండు సందర్భాలలో, వినియోగదారులు సెట్టింగ్లను మార్చలేరు లేదా భర్తీ చేయలేరు. - ఈ విధానం సెట్ చేయబడకపోతే, వినియోగదారు ఇన్స్టాలేషన్ / మొదటిసారి అమలు చేస్తున్నప్పుడు - ఏ సెట్టింగ్ ఎంచుకుంటారో అదే ఉంటుంది. + If this setting is enabled, anonymous reporting of usage and crash-related + data is sent to Google. If it is disabled, this information is not sent + to Google. In both cases, users cannot change or override the setting. + If this policy is left not set, the setting will be what the user chose + upon installation / first run. - ఈ విధానం <ph name="MS_AD_NAME" /> డొమైన్లో చేరని Windows సందర్భాలకు - అందుబాటులో ఉండదు. (Chrome OS కోసం, - DeviceMetricsReportingEnabledని చూడండి.)</translation> + This policy is not available on Windows instances that are not joined to + a <ph name="MS_AD_NAME" /> domain. (For Chrome OS, see + DeviceMetricsReportingEnabled.)</translation> <translation id="268577405881275241">డేటా కుదింపు ప్రాక్సీ లక్షణాన్ని ప్రారంభించండి</translation> <translation id="2693108589792503178">పాస్వర్డ్ని మార్చే URLని కాన్ఫిగర్ చేయండి.</translation> <translation id="2710534340210290498">ఈ విధానాన్ని తప్పుకు సెట్ చేస్తే, వినియోగదారులు స్క్రీన్ను లాక్ చేయలేరు (వినియోగదారు సెషన్ నుండి సైన్ అవుట్ చేయడం మాత్రమే సాధ్యమవుతుంది). ఈ సెట్టింగ్ను ఒప్పుకు సెట్ చేస్తే లేదా సెట్ చేయకుండా వదిలివేస్తే, పాస్వర్డ్ కలిగి ఉండే వినియోగదారులు స్క్రీన్ను లాక్ చేయగలరు.</translation> @@ -835,7 +835,7 @@ TLS డొమైన్-బౌండ్ ప్రమాణపత్రాల పొడిగింపు ప్రారంభించబడాలో లేదో పేర్కొంటుంది. పరీక్షించడం కోసం TLS డొమైన్-బౌండ్ ప్రమాణపత్రాల పొడిగింపుని ప్రారంభించడానికి ఈ సెట్టింగ్ ఉపయోగించబడుతుంది. ఈ ప్రయోగాత్మక సెట్టింగ్ భవిష్యత్తులో తీసివేయబడుతుంది.</translation> -<translation id="2957506574938329824">వెబ్ బ్లూటూత్ API ద్వారా బ్లూటూత్ పరికరాలకు యాక్సెస్ను అభ్యర్థించడానికి సైట్ ఏదీ అనుమతించవద్దు</translation> +<translation id="2957506574938329824">వెబ్ బ్లూటూత్ API ద్వారా బ్లూటూత్ పరికరాలకు యాక్సెస్ అభ్యర్థించడానికి ఏ సైట్ను అనుమతించవద్దు</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> ప్రమాణీకరణ కోసం ఖాతా రకం</translation> <translation id="2959469725686993410">ఎల్లవేళలా సమయ మండలిని నిశ్చయిస్తున్నప్పుడు WiFi ప్రాప్యత పాయింట్లను సర్వర్కు పంపండి</translation> <translation id="2959898425599642200">ప్రాక్సీ బైపాస్ నియమాలు</translation> @@ -914,25 +914,25 @@ మీరు సిస్టమ్ ప్రాక్సీ సెట్టింగ్లను ఉపయోగించాలని ఎంచుకుంటే, అన్ని ఇతర ఎంపికలు విస్మరించబడతాయి. - మీరు ప్రాక్సీ సర్వర్ను స్వయంచాలకంగా గుర్తించాలని ఎంచుకుంటే, అన్ని ఇతర ఎంపికలు విస్మరించబడతాయి. + మీరు ప్రాక్సీ సర్వర్ను ఆటోమేటిక్గా గుర్తించాలని ఎంచుకుంటే, అన్ని ఇతర ఎంపికలు విస్మరించబడతాయి. - మీరు స్థిర సర్వర్ ప్రాక్సీ మోడ్ను ఎంచుకుంటే, 'ప్రాక్సీ సర్వర్ చిరునామా లేదా URL' మరియు 'కామాతో వేరు చేసిన ప్రాక్సీ దాటివేత నియమాల జాబితా'లో తదుపరి ఎంపికలను పేర్కొనవచ్చు. ARC అనువర్తనాల కోసం అత్యధిక ప్రాధాన్యత గల HTTP ప్రాక్సీ సర్వర్ మాత్రమే అందుబాటులో ఉంటుంది. + మీరు స్థిర సర్వర్ ప్రాక్సీ మోడ్ను ఎంచుకుంటే, 'ప్రాక్సీ సర్వర్ చిరునామా లేదా URL' మరియు 'కామాతో వేరు చేసిన ప్రాక్సీ దాటివేత నియమాల జాబితా'లో తదుపరి ఎంపికలను పేర్కొనవచ్చు. ARC యాప్ల కోసం అత్యధిక ప్రాధాన్యత గల HTTP ప్రాక్సీ సర్వర్ మాత్రమే అందుబాటులో ఉంటుంది. మీరు ఒక .pac ప్రాక్సీ స్క్రిప్ట్ను ఉపయోగించడానికి ఎంచుకుంటే, మీరు తప్పనిసరిగా 'ప్రాక్సీ .pac ఫైల్కు URL' ఎంపికలో స్క్రిప్ట్కు URLను పేర్కొనాలి. వివరణాత్మక ఉదాహరణల కోసం ఈ లింక్ను సందర్శించండి: <ph name="PROXY_HELP_URL" />. - మీరు ఈ సెట్టింగ్ని ప్రారంభిస్తే, <ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాలు ఆదేశ పంక్తి నుండి పేర్కొన్న అన్ని ప్రాక్సీ సంబంధిత ఎంపికలను విస్మరిస్తాయి. + మీరు ఈ సెట్టింగ్ని ప్రారంభిస్తే, <ph name="PRODUCT_NAME" /> మరియు ARC యాప్లు ఆదేశ పంక్తి నుండి పేర్కొన్న అన్ని ప్రాక్సీ సంబంధిత ఎంపికలను విస్మరిస్తాయి. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, వినియోగదారులు ప్రాక్సీ సెట్టింగ్లను వారి స్వంతంగా ఎంచుకోగలుగుతారు.</translation> <translation id="3205825995289802549">మొదటి అమలులో మొదటి బ్రౌజర్ విండోను గరిష్టీకరిస్తుంది</translation> <translation id="3211426942294667684">బ్రౌజర్ సైన్ ఇన్ సెట్టింగ్లు</translation> <translation id="3213821784736959823"><ph name="PRODUCT_NAME" />లో అంతర్నిర్మిత DNS క్లయింట్ ఉపయోగించబడాలో లేదో అనే దాన్ని నియంత్రిస్తుంది. - ఈ విధానాన్ని ఒప్పునకు సెట్ చేస్తే, అంతర్నిర్మిత DNS క్లయింట్ అందుబాటులో ఉన్నప్పుడు ఉపయోగించబడుతుంది. + ఈ విధానాన్ని ఒప్పుకు సెట్ చేస్తే, అంతర్నిర్మిత DNS క్లయింట్ అందుబాటులో ఉన్నప్పుడు ఉపయోగించబడుతుంది. - ఈ విధానాన్ని తప్పునకు సెట్ చేస్తే, అంతర్నిర్మిత DNS క్లయింట్ ఎప్పుడూ ఉపయోగించబడదు. + ఈ విధానాన్ని తప్పుకు సెట్ చేస్తే, అంతర్నిర్మిత DNS క్లయింట్ ఎప్పుడూ ఉపయోగించబడదు. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, వినియోగదారులు chrome://flagsను సవరించడం లేదా ఆదేశ-పంక్తి ఫ్లాగ్ను పేర్కొనడం ద్వారా అంతర్నిర్మిత DNS క్లయింట్ ఉపయోగించబడాలో లేదో అనే దాన్ని మార్చగలరు.</translation> <translation id="3214164532079860003">ఈ విధానం హోమ్ పేజీని ప్రారంభించబడినట్లయితే ప్రస్తుత డిఫాల్ట్ బ్రౌజర్ నుండి దిగుమతి చేస్తుంది. ఆపివేయబడితే, హోమ్ పేజీ దిగుమతి చేయబడదు. సెట్ చేయకపోతే, దిగుమతి కోసం వినియోగదారు అభ్యర్థనను పొందవచ్చు లేదా స్వయంచాలకంగా దిగుమతి కావచ్చు.</translation> @@ -958,15 +958,15 @@ ఈ సెట్టింగ్ ప్రారంభించబడినా లేదా కాన్ఫిగర్ చేయకపోయినా, వినియోగదారులు వారి Google ఖాతాతో ప్రమాణీకరణ ద్వారా క్లౌడ్ ప్రింట్ ప్రాక్సీని ప్రారంభించవచ్చు. ఈ సెట్టింగ్ను నిలిపివేస్తే, వినియోగదారులు ప్రాక్సీని ప్రారంభించలేరు మరియు మెషీన్ దాని ప్రింటర్లను <ph name="CLOUD_PRINT_NAME" />తో షేర్ చేయడానికి అనుమతించబడదు.</translation> -<translation id="3307746730474515290">ఏయే ఆప్/పొడిగింపు రకాలను ఇన్స్టాల్ చేసేందుకు అనుమతించాలో నియంత్రిస్తుంది మరియు అమలు సమయ ఆక్సెస్ని పరిమితం చేస్తుంది. +<translation id="3307746730474515290">ఏయే యాప్/ఎక్స్టెన్షన్ రకాలను ఇన్స్టాల్ చేసేందుకు అనుమతించాలో నియంత్రిస్తుంది మరియు అమలు సమయ యాక్సెస్ని పరిమితం చేస్తుంది. - <ph name="PRODUCT_NAME" />లో ఇన్స్టాల్ చేయగల పొడిగింపు/ఆప్ల రకాలను మరియు అవి పరస్పర చర్య చేయగల హోస్ట్లను ఈ సెట్టింగ్ అనుమతిస్తుంది. విలువ అనేది పదబంధాల జాబితా, ప్రతి దానిలో కింది వాటిలో ఒకటి ఉండాలి: "పొడిగింపు", "థీమ్", "వినియోగదారు_స్క్రిప్ట్", "హోస్ట్ చేసిన_ఆప్", "ప్యాకేజీలోని_లెగసీ_ఆప్", "ప్లాట్ఫారమ్_ఆప్". ఈ రకాలకు సంబంధించిన మరింత సమాచారం కావాలంటే, <ph name="PRODUCT_NAME" /> పొడిగింపుల పత్రాలను చూడండి. + <ph name="PRODUCT_NAME" />లో ఇన్స్టాల్ చేయగల యాప్/ఎక్స్టెన్షన్ రకాలను మరియు అవి పరస్పర చర్య చేయగల హోస్ట్లను ఈ సెట్టింగ్ అనుమతిస్తుంది. విలువ అనేది పదబంధాల జాబితా, ప్రతి దానిలో కింది వాటిలో ఒకటి ఉండాలి: "user_script", "hosted_app", "legacy_packaged_app", "platform_app". ఈ రకాలకు సంబంధించిన మరింత సమాచారం కావాలంటే, <ph name="PRODUCT_NAME" /> ఎక్స్టెన్షన్ల పత్రాలను చూడండి. - గమనించండి, ఈ విధానం కారణంగా ఆప్లు మరియు పొడిగింపులు ExtensionInstallForcelist ద్వారా నిర్బంధంగా ఇన్స్టాల్ చేయబడేలా కూడా ప్రభావం పడుతుంది. + గమనించండి, ఈ విధానం కారణంగా యాప్లు మరియు ఎక్స్టెన్షన్లు ExtensionInstallForcelist ద్వారా నిర్బంధంగా ఇన్స్టాల్ చేయబడేలా కూడా ప్రభావం పడుతుంది. - ఈ సెట్టింగ్ని కాన్ఫిగర్ చేస్తే, జాబితాలో లేని రకాన్ని కలిగిన పొడిగింపులు/ఆప్లు ఇన్స్టాల్ చేయబడవు. + ఈ సెట్టింగ్ని కాన్ఫిగర్ చేస్తే, జాబితాలో లేని రకాన్ని కలిగిన ఎక్స్టెన్షన్లు/యాప్లు ఇన్స్టాల్ చేయబడవు. - ఈ సెట్టింగ్లు కాన్ఫిగర్ చేయకుండా వదిలివేస్తే, ఆమోదించగల పొడిగింపు/ఆప్ రకాలపై పరిమితులు విధించబడవు.</translation> + ఈ సెట్టింగ్లు కాన్ఫిగర్ చేయకుండా వదిలివేస్తే, ఆమోదించగల ఎక్స్టెన్షన్లు/యాప్ల రకాలపై పరిమితులు విధించబడవు.</translation> <translation id="3322771899429619102">కీ ఉత్పాదనను ఉపయోగించడానికి అనుమతించబడే సైట్లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఒకవేళ url నమూనా 'KeygenBlockedForUrls'లో ఉంటే, అది ఈ మినహాయింపులను భర్తీ చేస్తుంది. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, అన్ని సైట్ల కోసం 'DefaultKeygenSetting' విధానం సెట్ చేసి ఉంటే దాని నుండి లేదా వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి సార్వజనీన డిఫాల్ట్ విలువ ఉపయోగించబడుతుంది.</translation> @@ -1112,12 +1112,12 @@ మీరు ప్రాక్సీ సర్వర్ని ఎప్పటికీ ఉపయోగించకూడదని మరియు ఎల్లప్పుడూ నేరుగా కనెక్ట్ చేయాలని ఎంచుకుంటే, అన్ని ఇతర ఎంపికలు విస్మరించబడతాయి. - మీరు ప్రాక్సీ సర్వర్ను స్వయంచాలకంగా గుర్తించాలని ఎంచుకుంటే, అన్ని ఇతర ఎంపికలు విస్మరించబడతాయి. + మీరు ప్రాక్సీ సర్వర్ను ఆటోమేటిక్గా గుర్తించాలని ఎంచుకుంటే, అన్ని ఇతర ఎంపికలు విస్మరించబడతాయి. వివరణాత్మక ఉదాహరణల కోసం ఈ లింక్ను సందర్శించండి: <ph name="PROXY_HELP_URL" />. - మీరు ఈ సెట్టింగ్ని ప్రారంభిస్తే, <ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాలు ఆదేశ పంక్తి నుండి పేర్కొన్న అన్ని ప్రాక్సీ సంబంధిత ఎంపికలను విస్మరిస్తాయి. + మీరు ఈ సెట్టింగ్ని ప్రారంభిస్తే, <ph name="PRODUCT_NAME" /> మరియు ARC యాప్లు ఆదేశ పంక్తి నుండి పేర్కొన్న అన్ని ప్రాక్సీ సంబంధిత ఎంపికలను విస్మరిస్తాయి. ఈ విధానాలను సెట్ చేయకుండా వదిలేస్తే, వినియోగదారులు ప్రాక్సీ సెట్టింగ్లను వారి స్వంతంగా ఎంచుకోగలుగుతారు.</translation> <translation id="3758249152301468420">డెవలపర్ ఉపకరణాలని ఆపివేయి</translation> @@ -1400,11 +1400,11 @@ ఈ విధానాన్ని ఉపయోగించినట్లయితే, ఈ విధానంలో ఉన్న విలువలకు సరిపోలిన idలను కలిగిన ప్రింటర్లు మాత్రమే వినియోగదారుకి అందుబాటులో ఉంటాయి. idలు తప్పనిసరిగా <ph name="BULK_PRINTERS_POLICY" />లో పేర్కొనబడిన ఫైల్లోని "id" లేదా "guid" ఫీల్డ్లకు సంబంధితంగా ఉండాలి. </translation> -<translation id="427632463972968153">POSTతో చిత్ర శోధన చేస్తున్నప్పుడు ఉపయోగించే పారామీటర్లను పేర్కొంటుంది. ఇందులో కామాతో వేరు చేయబడిన పేర్ల/విలువల జతలు ఉంటాయి. ఏదైనా విలువ ఎగువ ఉదాహరణలోని {imageThumbnail} వంటి టెంప్లేట్ పారామీటర్ అయితే, అది వాస్తవ చిత్రం యొక్క సూక్ష్మచిత్ర డేటాతో భర్తీ చేయబడుతుంది. +<translation id="427632463972968153">POSTతో చిత్ర శోధన చేస్తున్నప్పుడు ఉపయోగించే పరామితులను పేర్కొంటుంది. ఇందులో కామాతో వేరు చేయబడిన పేరు/విలువ జతలు ఉంటాయి. విలువ ఎగువ ఉదాహరణలోని {imageThumbnail} వంటి టెంప్లేట్ పరామితి అయితే, ఇది వాస్తవ చిత్రం యొక్క సూక్ష్మచిత్ర డేటాతో భర్తీ చేయబడుతుంది. - ఈ విధానం ఐచ్ఛికం. సెట్ చేయకపోతే, చిత్ర శోధన అభ్యర్థన GET పద్ధతిని ఉపయోగించి పంపబడుతుంది. + ఈ విధానం ఐచ్ఛికం. సెట్ చేయకపోతే, చిత్రం శోధన అభ్యర్థన GET పద్ధతిని ఉపయోగించి పంపబడుతుంది. - 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడినప్పుడు మాత్రమే ఈ విధానం వర్తించబడుతుంది.</translation> + 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడినప్పుడు మాత్రమే ఈ విధానం గౌరవించబడుతుంది.</translation> <translation id="4285674129118156176">ARCని ఉపయోగించడానికి అనుబంధిత వినియోగదారులను అనుమతించండి</translation> <translation id="4298509794364745131"><ph name="PRODUCT_OS_NAME" /> లాక్ స్క్రీన్పై విషయ సేకరణ యాప్గా ఆరంభించగలిగే యాప్ల జాబితాను పేర్కొంటుంది. @@ -1643,11 +1643,11 @@ <translation id="487460824085252184">స్వయంచాలకంగా తరలించబడుతుంది, వినియోగదారు సమ్మతి కోసం అడగదు.</translation> <translation id="4874982543810021567">ఈ సైట్లలో WebUSBని బ్లాక్ చేయండి</translation> <translation id="4876805738539874299">గరిష్ట SSL సంస్కరణ ప్రారంభించబడింది</translation> -<translation id="4897928009230106190">POSTతో సూచించిన శోధన చేస్తున్నప్పుడు ఉపయోగించే పారామీటర్లను పేర్కొంటుంది. ఇందులో కామాతో వేరు చేయబడిన పేర్ల/విలువల జతలు ఉంటాయి. ఏదైనా విలువ ఎగువ ఉదాహరణలోని {searchTerms} వంటి టెంప్లేట్ పారామీటర్ అయితే, అది వాస్తవ శోధన పదాల డేటాతో భర్తీ చేయబడుతుంది. +<translation id="4897928009230106190">POSTతో సూచించిన శోధన చేస్తున్నప్పుడు ఉపయోగించే పరామితులను పేర్కొంటుంది. ఇందులో కామాతో వేరు చేయబడిన పేరు/విలువ జతలు ఉంటాయి. విలువ ఎగువ ఉదాహరణలోని {searchTerms} వంటి టెంప్లేట్ పరామితి అయితే, ఇది వాస్తవ శోధన పదాల డేటాతో భర్తీ చేయబడుతుంది. ఈ విధానం ఐచ్ఛికం. సెట్ చేయకపోతే, సూచన శోధన అభ్యర్థన GET పద్ధతిని ఉపయోగించి పంపబడుతుంది. - 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడినప్పుడు మాత్రమే ఈ విధానం వర్తించబడుతుంది.</translation> + 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడినప్పుడు మాత్రమే ఈ విధానం గౌరవించబడుతుంది.</translation> <translation id="489803897780524242">డిఫాల్ట్ శోధన ప్రదాత కోసం శోధన పద నియామకాన్ని నియంత్రించే పరామితి</translation> <translation id="4899708173828500852">సురక్షిత బ్రౌజింగ్ని ప్రారంభించు</translation> <translation id="4899802251198446659"><ph name="PRODUCT_NAME" />లో వీడియోలను ఆటోమేటిక్గా (వినియోగదారు సమ్మతి లేకుండా) ఆడియో కంటెంట్తో పాటు ప్లే చేయాలో లేదో నియంత్రించడానికి మిమ్మల్ని అనుమతిస్తుంది. @@ -1666,11 +1666,11 @@ ఈ విధానం తప్పు అని సెట్ చేస్తే, వినియోగదారు మేనేజర్ నుండి కొత్త ప్రొఫైల్లను సృష్టించడానికి <ph name="PRODUCT_NAME" /> అనుమతించదు.</translation> <translation id="4970855112942626932">బ్రౌజర్ సైన్-ఇన్ని నిలిపివేయండి</translation> -<translation id="4971529314808359013">సైట్ ప్రమాణపత్రాన్ని అభ్యర్థిస్తే, <ph name="PRODUCT_NAME" /> స్వయంచాలకంగా క్లయింట్ ప్రమాణపత్రాన్ని ఎంచుకోవాల్సిన సైట్లను పేర్కొనే url నమూనాల జాబితాను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది. +<translation id="4971529314808359013">సైట్ సర్టిఫికెట్ను అభ్యర్థిస్తే, <ph name="PRODUCT_NAME" /> ఆటోమేటిక్గా క్లయింట్ సర్టిఫికెట్ ఎంచుకోవాల్సిన సైట్లను పేర్కొనే url నమూనాల జాబితాను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది. - విలువ తప్పనిసరిగా వచన ఆకృతికి మార్చబడిన JSON నిఘంటువుల శ్రేణి అయ్యి ఉండాలి. ప్రతి నిఘంటువు తప్పనిసరిగా { "pattern": "$URL_PATTERN", "filter" : $FILTER } ఆకృతిలో ఉండాలి, $URL_PATTERN అనేది కంటెంట్ సెట్టింగ్ నమూనా. $FILTER బ్రౌజర్ స్వయంచాలకంగా ఎంచుకునే క్లయింట్ ప్రమాణపత్రాలను నియంత్రిస్తుంది. ఫిల్టర్తో సంబంధం లేకుండా, సర్వర్ ప్రమాణపత్ర అభ్యర్థనకు సరిపోలే ప్రమాణపత్రాలు మాత్రమే ఎంచుకోబడతాయి. $FILTER { "ISSUER": { "CN": "$ISSUER_CN" } } ఆకృతిలో ఉంటే, అదనంగా CommonName $ISSUER_CNతో ప్రమాణపత్రం ద్వారా మంజూరు చేయబడిన క్లయింట్ ప్రమాణపత్రాలు మాత్రమే ఎంచుకోబడతాయి. $FILTER ఖాళీ నిఘంటువు {} అయితే, క్లయింట్ ప్రమాణపత్రాల ఎంపిక అదనంగా నియంత్రించబడదు. + విలువ తప్పనిసరిగా వచన ఫార్మాట్కు మార్చబడిన JSON నిఘంటువుల శ్రేణి అయ్యి ఉండాలి. ప్రతి నిఘంటువు తప్పనిసరిగా {"pattern": "$URL_PATTERN", "filter" : $FILTER } ఫార్మాట్లో ఉండాలి, $URL_PATTERN అనేది కంటెంట్ సెట్టింగ్ నమూనా. $FILTER బ్రౌజర్ ఆటోమేటిక్గా ఎంచుకునే క్లయింట్ సర్టిఫికెట్లను నియంత్రిస్తుంది. ఫిల్టర్తో సంబంధం లేకుండా, సర్వర్ సర్టిఫికెట్ అభ్యర్థనకు సరిపోలే సర్టిఫికెట్లు మాత్రమే ఎంచుకోబడతాయి. $FILTER { "ISSUER": { "CN": "$ISSUER_CN" } } ఫార్మాట్లో ఉంటే, అదనంగా CommonName $ISSUER_CNతో సర్టిఫికెట్ ద్వారా మంజూరు చేయబడిన క్లయింట్ సర్టిఫికెట్లు మాత్రమే ఎంచుకోబడతాయి. $FILTER ఖాళీ నిఘంటువు {} అయితే, క్లయింట్ సర్టిఫికెట్ల ఎంపిక అదనంగా నియంత్రించబడదు. - ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, ఏ సైట్ కోసం స్వీయ ఎంపిక చేయబడదు.</translation> + ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, ఏ సైట్ కోసం స్వీయ-ఎంపిక చేయబడదు.</translation> <translation id="4978405676361550165">"OffHours" విధానాన్ని సెట్ చేసినట్లయితే, పేర్కొనబడిన సమయ వ్యవధులలో పేర్కొనబడిన పరికర విధానాలు విస్మరించబడతాయి (ఈ విధానాల యొక్క డిఫాల్ట్ సెట్టింగ్లు ఉపయోగించబడతాయి). "OffHours" ప్రారంభమైన లేదా ముగిసిన ప్రతిసారీ పరికర విధానాలను Chrome తిరిగి వర్తింపజేస్తుంది. "OffHours" సమయం ముగిసినప్పుడు మరియు పరికర విధాన సెట్టింగ్లు మార్చబడినప్పుడు (ఉదా., వినియోగదారు అనుమతి లేని ఖాతాతో సైన్ ఇన్ చేసినప్పుడు) వినియోగదారుకు తెలియజేయబడుతుంది మరియు నిర్బంధంగా సైన్ అవుట్ చేయాల్సి వస్తుంది.</translation> <translation id="4980635395568992380">డేటా రకం:</translation> <translation id="4983201894483989687">పాత ప్లగ్ఇన్లని అమలు చెయ్యడానికి అనుమతించు</translation> @@ -1823,9 +1823,9 @@ లేదంటే ఇది క్రింది విలువల్లో ఒక దానికి సెట్ చేయబడవచ్చు: "tls1.2" లేదా "tls1.3". సెట్ చేసినప్పుడు, <ph name="PRODUCT_NAME" /> పేర్కొన్న వెర్షన్ కంటే తాజా అయిన SSL/TLS వెర్షన్లను ఉపయోగించదు. గుర్తించని విలువ విస్మరించబడుతుంది.</translation> <translation id="5330684698007383292">ఈ క్రింది కంటెంట్ రకాలని నిర్వహించడానికి <ph name="PRODUCT_FRAME_NAME" />ని అనుమతించండి</translation> <translation id="5365946944967967336">ఉపకరణ పట్టీలో హోమ్ బటన్ని చూపు</translation> -<translation id="5366745336748853475">సైట్ ప్రమాణపత్రాన్ని అభ్యర్ధించినట్లయితే, SAML విధానం హోస్ట్ చేసిన ఫ్రేమ్లో సైన్-ఇన్ స్క్రీన్లో క్లయింట్ ప్రమాణపత్రం స్వయంచాలకంగా ఎంచుకోబడే సైట్లను పేర్కొనే url నమూనాల జాబితాను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది. ఉదాహరణకు, పరికర వ్యాప్తంగా అమలు కాగల ప్రమాణపత్రాన్ని కాన్ఫిగర్ చేసి, దానిని SAML IdPకి సమర్పించడానికి ఉపయోగించవచ్చు. +<translation id="5366745336748853475">సైట్ సర్టిఫికెట్ అభ్యర్ధించినట్లయితే, SAML విధానం హోస్ట్ చేసిన ఫ్రేమ్లో సైన్-ఇన్ స్క్రీన్లో క్లయింట్ సర్టిఫికెట్ ఆటోమేటిక్గా ఎంచుకోబడే సైట్లను పేర్కొనే url నమూనాల జాబితాను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది. ఉదాహరణకు, పరికర వ్యాప్తంగా అమలు కాగల సర్టిఫికెట్ కాన్ఫిగర్ చేసి, దానిని SAML IdPకి సమర్పించడానికి ఉపయోగించవచ్చు. - విలువ తప్పనిసరిగా వచన ఆకృతికి మార్చబడిన JSON నిఘంటువుల శ్రేణి అయ్యి ఉండాలి. ప్రతి నిఘంటువు తప్పనిసరిగా { "pattern": "$URL_PATTERN", "filter" : $FILTER } ఆకృతిలో ఉండాలి, ఇందులో $URL_PATTERN అనగా కంటెంట్ సెట్టింగ్ నమూనా. $FILTER అనేది బ్రౌజర్ స్వయంచాలకంగా ఎంచుకునే క్లయింట్ ప్రమాణపత్రాలను నియంత్రిస్తుంది. ఫిల్టర్తో సంబంధం లేకుండా, సర్వర్ ప్రమాణపత్ర అభ్యర్థనకు సరిపోలే ప్రమాణపత్రాలు మాత్రమే ఎంచుకోబడతాయి. ఒకవేళ $FILTER అనేది { "ISSUER": { "CN": "$ISSUER_CN" } } ఆకృతిలో ఉంటే, అదనంగా CommonName $ISSUER_CNతో ప్రమాణపత్రం ద్వారా మంజూరు చేయబడిన క్లయింట్ ప్రమాణపత్రాలు మాత్రమే ఎంచుకోబడతాయి. ఒకవేళ $FILTER అనేది ఖాళీ నిఘంటువు {} అయితే, క్లయింట్ ప్రమాణపత్రాల ఎంపిక అదనంగా నియంత్రించబడదు. + విలువ తప్పనిసరిగా వచన ఫార్మాట్కు మార్చబడిన JSON నిఘంటువుల శ్రేణి అయ్యి ఉండాలి. ప్రతి నిఘంటువు తప్పనిసరిగా { "pattern": "$URL_PATTERN", "filter" : $FILTER } ఫార్మాట్లో ఉండాలి, ఇందులో $URL_PATTERN అంటే కంటెంట్ సెట్టింగ్ నమూనా. $FILTER అనేది బ్రౌజర్ ఆటోమేటిక్గా ఎంచుకునే క్లయింట్ సర్టిఫికెట్లను నియంత్రిస్తుంది. ఫిల్టర్తో సంబంధం లేకుండా, సర్వర్ సర్టిఫికెట్ అభ్యర్థనకు సరిపోలే సర్టిఫికెట్లు మాత్రమే ఎంచుకోబడతాయి. ఒకవేళ $FILTER అనేది { "ISSUER": { "CN": "$ISSUER_CN" } } ఫార్మాట్లో ఉంటే, అదనంగా CommonName $ISSUER_CNతో సర్టిఫికెట్ ద్వారా మంజూరు చేయబడిన క్లయింట్ సర్టిఫికెట్లు మాత్రమే ఎంచుకోబడతాయి. ఒకవేళ $FILTER అనేది ఖాళీ నిఘంటువు {} అయితే, క్లయింట్ సర్టిఫికెట్ల ఎంపిక అదనంగా నియంత్రించబడదు. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, ఏ సైట్ కోసం స్వీయ ఎంపిక చేయబడదు.</translation> <translation id="5366977351895725771">తప్పుకు సెట్ చేస్తే, ఈ వినియోగదారు యొక్క పర్యవేక్షించబడే-వినియోగదారు సృష్టి నిలిపివేయబడుతుంది. ప్రస్తుతం ఉన్న పర్యవేక్షించబడే వినియోగదారులు ఇప్పటికీ అందుబాటులో ఉంటారు. @@ -1922,7 +1922,7 @@ ప్లాట్ఫారమ్ విధాన నోటిఫికేషన్లకు మద్దతు ఇచ్చే పక్షంలో, అత్యంత తరచుగా రిఫ్రెష్లు చేయడాన్ని నివారించడానికి రిఫ్రెష్ జాప్యం 24 గంటలకు సెట్ చేయబడుతుందని గమనించండి (ఈ సందర్భంలో అన్ని డిఫాల్ట్లు మరియు ఈ విధానం విలువ విస్మరించబడతాయి), ఎందుకంటే విధానంలో మార్పులు జరిగినప్పుడు విధాన నోటిఫికేషన్లు నిర్బంధంగా స్వయంచాలిత రిఫ్రెష్ చేయడానికి అవకాశం ఉంటుంది.</translation> <translation id="5530347722229944744">సంభావ్యంగా హానికరమైన డౌన్లోడ్లను బ్లాక్ చేయి</translation> <translation id="5535973522252703021">Kerberos ప్రతినిధి బృందం సర్వర్ ఆమోదిత జాబితా</translation> -<translation id="555077880566103058"><ph name="FLASH_PLUGIN_NAME" /> ప్లగిన్ని స్వయంచాలకంగా అమలు చేయడానికి అన్ని సైట్లను అనుమతించు</translation> +<translation id="555077880566103058"><ph name="FLASH_PLUGIN_NAME" /> ప్లగిన్ని ఆటోమేటిక్గా అమలు చేయడానికి అన్ని సైట్లను అనుమతించు</translation> <translation id="5559079916187891399">ఈ విధానం Android అనువర్తనాలపై ఎలాంటి ప్రభావం చూపదు.</translation> <translation id="5560039246134246593"><ph name="PRODUCT_NAME" />లో వ్యత్యాసాల సీడ్ను పొందడానికి పారామీటర్ని జోడించండి. @@ -1992,11 +1992,11 @@ ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారు దీన్ని మార్చలేరు లేదా భర్తీ చేయలేరు.</translation> <translation id="5708969689202733975">అనుమతించబడిన త్వరిత అన్లాక్ మోడ్లను కాన్ఫిగర్ చేస్తుంది</translation> -<translation id="5722934961007828462">ఈ సెట్టింగ్ను ప్రారంభించినప్పుడు, <ph name="PRODUCT_NAME" /> ఎల్లప్పుడూ విజయవంతంగా ప్రామాణీకరించబడిన మరియు స్థానికంగా ఇన్స్టాల్ చేయబడిన CA ప్రమాణపత్రాల సంతకం కలిగిన సర్వర్ ప్రమాణపత్రాల కోసం ఉపసంహరణ తనిఖీని అమలు చేస్తుంది. +<translation id="5722934961007828462">ఈ సెట్టింగ్ను ప్రారంభించినప్పుడు, <ph name="PRODUCT_NAME" /> ఎల్లప్పుడూ విజయవంతంగా ప్రమాణీకరించబడిన మరియు స్థానికంగా ఇన్స్టాల్ చేయబడిన CA సర్టిఫికెట్ల సంతకం కలిగిన సర్వర్ సర్టిఫికెట్ల కోసం ఉపసంహరణ తనిఖీని అమలు చేస్తుంది. - <ph name="PRODUCT_NAME" /> ఉపసంహరణ స్థితి సమాచారాన్ని పొందలేకపోతే, అటువంటి ప్రమాణపత్రాలను ఉపసంహరించబడినవిగా పరిగణిస్తారు ('హార్డ్-వైఫల్యం'). + <ph name="PRODUCT_NAME" /> ఉపసంహరణ స్థితి సమాచారాన్ని పొందలేకపోతే, అటువంటి సర్టిఫికెట్లను ఉపసంహరించబడినవిగా పరిగణిస్తారు ('హార్డ్-వైఫల్యం'). - ఈ విధానాన్ని సెట్ చేయకపోతే లేదా తప్పుకు సెట్ చేస్తే, అప్పుడు <ph name="PRODUCT_NAME" /> ఇప్పటికే ఉన్న ఆన్లైన్ ఉపసంహరణ తనిఖీ సెట్టింగ్లను ఉపయోగిస్తుంది.</translation> + ఈ విధానాన్ని సెట్ చేయకపోతే లేదా తప్పునకు సెట్ చేస్తే, అప్పుడు <ph name="PRODUCT_NAME" /> ఇప్పటికే ఉన్న ఆన్లైన్ ఉపసంహరణ తనిఖీ సెట్టింగ్లను ఉపయోగిస్తుంది.</translation> <translation id="5728154254076636808"><ph name="PRODUCT_NAME" /> ప్రొఫైల్ డేటా కోసం రోమింగ్ కాపీల సృష్టిని ప్రారంభించండి</translation> <translation id="5732972008943405952">మొదటి అమలు సమయంలో డిఫాల్ట్ బ్రౌజర్ నుండి స్వీయ పూరణ ఫారమ్ డేటాను దిగుమతి చేస్తుంది</translation> <translation id="5741810844420698449">ఈ విధానాన్ని సెట్ చేసినప్పుడు, ఇది వినియోగదారు పరికరం యొక్క మూతను మూసివేసినప్పుడు <ph name="PRODUCT_OS_NAME" /> తీసుకునే చర్యను పేర్కొంటుంది. @@ -2091,9 +2091,9 @@ మీరు ఈ సెట్టింగ్ను నిలిపివేస్తే లేదా విలువను సెట్ చేయకపోతే, Google శోధనలో సురక్షిత శోధన అమలు చేయబడదు.</translation> <translation id="5946082169633555022">బీటా ఛానెల్</translation> -<translation id="5950205771952201658">ఒకవేళ సాఫ్ట్-వైఫల్యం సంభవిస్తే, ఆన్లైన్ ఉపసంహరణ తనిఖీలు ఎలాంటి ప్రభావవంతమైన భద్రతా ప్రయోజనాన్ని అందించవు, అవి <ph name="PRODUCT_NAME" /> సంస్కరణ 19 మరియు దాని తదుపరి వాటిలో డిఫాల్ట్గా నిలిపివేయబడతాయి. ఈ విధానాన్ని ఒప్పుకి సెట్ చేస్తే, తద్వారా మునుపటి ప్రవర్తన పునరుద్ధరించబడుతుంది మరియు ఆన్లైన్ OCSP/CRL తనిఖీలు అమలు చేయబడతాయి. +<translation id="5950205771952201658">ఒకవేళ సాఫ్ట్-వైఫల్యం సంభవిస్తే, ఆన్లైన్ ఉపసంహరణ తనిఖీలు ఎలాంటి ప్రభావవంతమైన భద్రతా ప్రయోజనాన్ని అందించవు, అవి <ph name="PRODUCT_NAME" /> వెర్షన్ 19 మరియు దాని తదుపరి వాటిలో డిఫాల్ట్గా నిలిపివేయబడతాయి. ఈ విధానాన్ని ఒప్పునకు సెట్ చేస్తే, తద్వారా మునుపటి ప్రవర్తన పునరుద్ధరించబడుతుంది మరియు ఆన్లైన్ OCSP/CRL తనిఖీలు అమలు చేయబడతాయి. - విధానాన్ని సెట్ చేయకపోయినా లేదా తప్పుకి సెట్ చేసినా, అప్పుడు <ph name="PRODUCT_NAME" /> 19 మరియు దాని తదుపరి వాటిలో <ph name="PRODUCT_NAME" /> ఆన్లైన్ ఉపసంహరణ తనిఖీలను అమలు చేయదు.</translation> + విధానాన్ని సెట్ చేయకపోయినా లేదా తప్పునకు సెట్ చేసినా, అప్పుడు <ph name="PRODUCT_NAME" /> 19 మరియు దాని తదుపరి వాటిలో <ph name="PRODUCT_NAME" /> ఆన్లైన్ ఉపసంహరణ తనిఖీలను అమలు చేయదు.</translation> <translation id="5966615072639944554">రిమోట్ ధృవీకరణ APIని ఉపయోగించడానికి అనుమతించబడిన ఎక్స్టెన్షన్లు</translation> <translation id="5983708779415553259">ఏ కంటెంట్ ప్యాక్లో లేని సైట్ల కోసం డిఫాల్ట్ స్వభావం</translation> <translation id="5997543603646547632">డిఫాల్ట్గా 24 గంటల గడియారాన్ని ఉపయోగించండి</translation> @@ -2106,7 +2106,7 @@ <translation id="6022948604095165524">స్టార్ట్అప్లో చర్య</translation> <translation id="6023030044732320798">ARC అమలు సమయానికి సంకలనం చేయబడే విధానాల సెట్ను పేర్కొంటుంది. విలువ తప్పకుండా చెల్లుబాటయ్యే JSON రకం అయ్యి ఉండాలి. - ఈ విధానాన్ని ఉపయోగించడం ద్వారా పరికరంలో ఏయే Android యాప్లు స్వయంచాలకంగా ఇన్స్టాల్ కావాలో కాన్ఫిగర్ చేయవచ్చు: + ఈ విధానాన్ని ఉపయోగించడం ద్వారా పరికరంలో ఏయే Android యాప్లు ఆటోమేటిక్గా ఇన్స్టాల్ కావాలో కాన్ఫిగర్ చేయవచ్చు: { "type": "object", @@ -2239,11 +2239,11 @@ ఈ విధానాన్ని సెట్ చేస్తే, లాగిన్ స్క్రీన్పై వినియోగదారు ప్రమేయం లేకుండా నిర్దిష్ట సమయ వ్యవధి గడిచిన తర్వాత పేర్కొన్న సెషన్ ఆటోమేటిక్గా లాగిన్ చేయబడుతుంది. పరికర-స్థానిక ఖాతాను తప్పనిసరిగా కాన్ఫిగర్ చేసి ఉండాలి (|DeviceLocalAccounts| చూడండి). ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, ఆటో-లాగిన్ ఉండదు.</translation> -<translation id="6353901068939575220">POSTతో URLను వెతుకుతున్నప్పుడు ఉపయోగించే పారామీటర్లను పేర్కొంటుంది. ఇందులో కామాతో వేరు చేయబడిన పేర్ల/విలువల జతలు ఉంటాయి. ఏదైనా విలువ ఎగువ ఉదాహరణలోని {searchTerms} వంటి టెంప్లేట్ పారామీటర్ అయితే, అది వాస్తవ శోధన పదాల డేటాతో భర్తీ చేయబడుతుంది. +<translation id="6353901068939575220">POSTతో URLను వెతుకుతున్నప్పుడు ఉపయోగించే పరామితులను పేర్కొంటుంది. ఇందులో కామాతో వేరు చేయబడిన పేరు/విలువ జతలు ఉంటాయి. విలువ ఎగువ ఉదాహరణలోని {searchTerms} వంటి టెంప్లేట్ పరామితి అయితే, ఇది వాస్తవ శోధన పదాల డేటాతో భర్తీ చేయబడుతుంది. ఈ విధానం ఐచ్ఛికం. సెట్ చేయకపోతే, శోధన అభ్యర్థన GET పద్ధతిని ఉపయోగించి పంపబడుతుంది. - 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడితే మాత్రమే ఈ విధానం వర్తించబడుతుంది.</translation> + 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడితే మాత్రమే ఈ విధానం గౌరవించబడుతుంది.</translation> <translation id="6367755442345892511">విడుదల ఛానెల్ వినియోగదారు ద్వారా కాన్ఫిగర్ చేయబడాలో లేదో అనేదాన్ని తెలియజేస్తుంది</translation> <translation id="6368011194414932347">హోమ్ పేజీ URLని కాన్ఫిగర్ చెయ్యి</translation> <translation id="6368403635025849609">ఈ సైట్లలో JavaScriptని అనుమతించు</translation> @@ -2595,11 +2595,11 @@ <translation id="7207095846245296855">Google సురక్షితశోధనను నిర్బంధం చేస్తుంది</translation> <translation id="7211368186050418507">సమయ మండలిని ఎన్నడూ స్వయంచాలకంగా గుర్తించవద్దు</translation> <translation id="7216442368414164495">సురక్షిత బ్రౌజింగ్ విస్తారిత నివేదనను ప్రారంభించడానికి వినియోగదారులను అనుమతిస్తుంది</translation> -<translation id="7221822638060296742">వెబ్సైట్లు స్వయంచాలకంగా <ph name="FLASH_PLUGIN_NAME" /> ప్లగ్ఇన్ అమలు చేయడానికి అనుమతించాలో లేదో సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. స్వయంచాలకంగా అమలవుతున్న <ph name="FLASH_PLUGIN_NAME" /> ప్లగ్ఇన్ అన్ని వెబ్సైట్లకు అనుమతించవచ్చు లేదా అన్ని వెబ్సైట్లకు తిరస్కరించవచ్చు. +<translation id="7221822638060296742">వెబ్సైట్లు ఆటోమేటిక్గా <ph name="FLASH_PLUGIN_NAME" /> ప్లగ్ఇన్ అమలు చేయడానికి అనుమతించాలో లేదో సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఆటోమేటిక్గా అమలవుతున్న <ph name="FLASH_PLUGIN_NAME" /> ప్లగ్ఇన్ అన్ని వెబ్సైట్లకు అనుమతించవచ్చు లేదా అన్ని వెబ్సైట్లకు తిరస్కరించవచ్చు. ప్లే చేయడానికి క్లిక్ చేయడం <ph name="FLASH_PLUGIN_NAME" /> ప్లగ్ఇన్ అమలు చేయడానికి అనుమతిస్తుంది, కానీ వాడుకదారు దాని అమలు ప్రారంభించడానికి ప్లేస్హోల్డర్పై క్లిక్ చేయాలి. - స్వయంచాలక ప్లేబ్యాక్ <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" /> విధానంపై స్పష్టంగా జాబితా చేయబడిన డొమైన్ల కోసం మాత్రమే అనుమతించబడుతుంది. మీరు అన్ని సైట్లకు స్వయంచాలక ప్లేబ్యాక్ను ప్రారంభించాలనుకుంటే, http://* మరియు https://*ను ఈ జాబితాకు జోడించండి. + ఆటోమేటిక్ ప్లేబ్యాక్ <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" /> విధానంపై స్పష్టంగా జాబితా చేయబడిన డొమైన్ల కోసం మాత్రమే అనుమతించబడుతుంది. మీరు అన్ని సైట్లకు ఆటోమేటిక్ ప్లేబ్యాక్ను ప్రారంభించాలనుకుంటే, http://* మరియు https://*ను ఈ జాబితాకు జోడించండి. ఈ విధానాన్ని సెట్ చేయకుండా వదిలి వేసి ఉంటే, వినియోగదారు ఈ సెట్టింగ్ను మాన్యువల్గా మార్చగలుగుతారు.</translation> <translation id="723103540848640830">లాక్ స్క్రీన్ పిన్ యొక్క కనిష్ట అంకెల పరిమితిని సెట్ చేయండి</translation> @@ -2827,8 +2827,8 @@ సురక్షిత బ్రౌజింగ్ గురించి మరింత సమాచారం కావాలంటే https://developers.google.com/safe-browsingని చూడండి.</translation> <translation id="7643883929273267746"><ph name="PRODUCT_NAME" />లో కనిపించే ఖాతాలను నియంత్రించండి</translation> -<translation id="7644825865811580663">ఈ విధానాన్ని ఒప్పుకి సెట్ చేస్తే, <ph name="PRODUCT_NAME" /> మొదటి అమలులో చూపబడే మొదటి విండోను బేషరతుగా విస్తరిస్తుంది. - ఈ విధానాన్ని తప్పుకి సెట్ చేస్తే లేదా కాన్ఫిగర్ చేయకుంటే, చూపబడే మొదటి విండోను విస్తరించాలా వద్దా అనే నిర్ణయం స్క్రీన్ పరిమాణం ఆధారంగా ఉంటుంది.</translation> +<translation id="7644825865811580663">If this policy is set to true, <ph name="PRODUCT_NAME" /> will unconditionally maximize the first window shown on first run. + If this policy is set to false or not configured, the decision whether to maximize the first window shown will be based on the screen size.</translation> <translation id="7651739109954974365">ఈ పరికరం కోసం డేటా రోమింగ్ ప్రారంభించబడాలో లేదో అనే దాన్ని నిశ్చయిస్తుంది. ఒప్పుకు సెట్ చేయబడితే, డేటా రోమింగ్ ప్రారంభించబడుతుంది. కాన్ఫిగర్ చేయకుండా ఉంటే లేదా తప్పుకు సెట్ చేస్తే, డేటా రోమింగ్ అందుబాటులో ఉండదు.</translation> <translation id="7673194325208122247">వ్యవధి (మిల్లీసెకన్లు)</translation> <translation id="7676708657861783864">ఈ URL నమూనాలను సరిపోలే పేజీల ద్వారా సెట్ చేయబడిన కుక్కీలు ప్రస్తుత సెషన్కి పరిమితం చేయబడతాయి, అంటే బ్రౌజర్ నుండి నిష్క్రమిస్తున్నప్పుడు అవి తొలగించబడతాయి. @@ -3493,11 +3493,11 @@ ఈ విధానం <ph name="MS_AD_NAME" /> డొమైన్లో చేరని Windowsని ఉపయోగించే సందర్భంలో అందుబాటులో ఉండదు.</translation> <translation id="9013875414788074110">లాగిన్ సమయంలో, <ph name="PRODUCT_OS_NAME" /> సర్వర్ (ఆన్లైన్)కు అనుగుణంగా లేదా కాష్ చేయబడిన పాస్వర్డ్ (ఆఫ్లైన్)ను ఉపయోగించి ప్రామాణీకరించవచ్చు. -ఈ విధానాన్ని -1 విలువకు సెట్ చేసినప్పుడు, వినియోగదారు నిరవధికంగా ఆఫ్లైన్లో ప్రామాణీకరించవచ్చు. ఈ విధానాన్ని వేరే ఇతర విలువకు సెట్ చేసినప్పుడు, ఇది చివరి ఆన్లైన్ ప్రమాణీకరణ నాటి నుండి వినియోగదారు తప్పనిసరిగా మళ్లీ ఆన్లైన్ ప్రమాణీకరణ ఉపయోగించాల్సిన సమయ నిడివిని పేర్కొంటుంది. +ఈ విధానాన్ని -1 విలువకు సెట్ చేసినప్పుడు, వినియోగదారు నిరవధికంగా ఆఫ్లైన్లో ప్రమాణీకరించవచ్చు. ఈ విధానాన్ని వేరే ఇతర విలువకు సెట్ చేసినప్పుడు, ఇది చివరి ఆన్లైన్ ప్రమాణీకరణ నాటి నుండి వినియోగదారు తప్పనిసరిగా మళ్లీ ఆన్లైన్ ప్రమాణీకరణ ఉపయోగించాల్సిన సమయ నిడివిని పేర్కొంటుంది. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, వినియోగదారు మళ్లీ ఆన్లైన్ ప్రమాణీకరణను తప్పనిసరిగా ఉపయోగించాల్సిన సమయంగా 14 రోజుల డిఫాల్ట్ కాల పరిమితిని <ph name="PRODUCT_OS_NAME" /> ఉపయోగిస్తుంది. -ఈ విధానం SAMLని ఉపయోగించి ప్రామాణీకరించబడిన వినియోగదారులను మాత్రమే ప్రభావితం చేస్తుంది. +ఈ విధానం SAMLని ఉపయోగించి ప్రమాణీకరించబడిన వినియోగదారులను మాత్రమే ప్రభావితం చేస్తుంది. విధానం విలువను సెకన్లలో పేర్కొనాలి.</translation> <translation id="9027787254195333560">ఈ విధానం లాగిన్ స్క్రీన్లో వినియోగదారుని సూచించే అవతార్ చిత్రాన్ని కాన్ఫిగర్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. <ph name="PRODUCT_OS_NAME" /> అవతార్ చిత్రాన్ని ఏ URL నుండి డౌన్లోడ్ చేయాలో పేర్కొనడం ద్వారా విధానం సెట్ చేయబడుతుంది మరియు డౌన్లోడ్ సమగ్రతను ధృవీకరించడానికి క్రిప్టోగ్రాఫిక్ హాష్ ఉపయోగించబడుతుంది. చిత్రం తప్పనిసరిగా JPEG ఆకృతిలో ఉండాలి, దీని పరిమాణం ఎట్టి పరిస్థితుల్లోనూ 512kB మించకూడదు. URL తప్పనిసరిగా ఎటువంటి ప్రమాణీకరణ లేకుండానే ప్రాప్యత చేయగలిగేలా ఉండాలి.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 201b64d..8b8ae51 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -4,13 +4,13 @@ <translation id="101438888985615157">หมุนหน้าจอ 180 องศา</translation> <translation id="1016912092715201525">กำหนดค่าการตรวจสอบเบราว์เซอร์เริ่มต้นใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตรวจสอบดังกล่าว - หากเปิดใช้งานการตั้งค่านี้ <ph name="PRODUCT_NAME" /> จะตรวจสอบทุกครั้งที่เริ่มต้นใช้งานว่าตนเองเป็นเบราว์เซอร์เริ่มต้นหรือไม่ และจะลงทะเบียนตนเองโดยอัตโนมัติหากทำได้ + หากเปิดใช้การตั้งค่านี้ <ph name="PRODUCT_NAME" /> จะตรวจสอบทุกครั้งที่เริ่มต้นใช้งานว่าตนเองเป็นเบราว์เซอร์เริ่มต้นหรือไม่ และจะลงทะเบียนตนเองโดยอัตโนมัติหากทำได้ หากปิดใช้การตั้งค่านี้ <ph name="PRODUCT_NAME" /> จะไม่ตรวจสอบว่าตนเองเป็นเบราว์เซอร์เริ่มต้นหรือไม่ และจะปิดใช้การควบคุมโดยผู้ใช้สำหรับการตั้งค่าตัวเลือกนี้ หากไม่กำหนดการตั้งค่านี้ <ph name="PRODUCT_NAME" /> จะอนุญาตให้ผู้ใช้ควบคุมได้ว่าจะให้ตนเองเป็นเบราว์เซอร์เริ่มต้นหรือไม่ และควรแสดงการแจ้งเตือนผู้ใช้หรือไม่เมื่อตนเองไม่ได้เป็นเบราว์เซอร์เริ่มต้น - หมายเหตุสำหรับผู้ดูแลระบบ <ph name="MS_WIN_NAME" />: การเปิดใช้การตั้งค่านี้ใช้ได้กับเครื่องที่ใช้ Windows 7 เท่านั้น สำหรับเครื่องที่ใช้ Windows 8 ขึ้นไป คุณต้องใช้ไฟล์ "การเชื่อมโยงแอปพลิเคชันเริ่มต้น" ที่ทำให้ <ph name="PRODUCT_NAME" /> เป็นเครื่องจัดการของโปรโตคอล <ph name="HHTPS_PROTOCOL" /> และ <ph name="HTTP_PROTOCOL" /> (และอาจเลือกให้เป็นเครื่องจัดการของโปรโตคอล <ph name="FTP_PROTOCOL" /> รวมถึงรูปแบบไฟล์ เช่น <ph name="HTML_EXTENSION" />, <ph name="HTM_EXTENSION" />, <ph name="PDF_EXTENSION" />, <ph name="SVG_EXTENSION" />, <ph name="WEBP_EXTENSION" /> เป็นต้น) ดูข้อมูลเพิ่มเติมที่ <ph name="SUPPORT_URL" /></translation> + หมายเหตุสำหรับผู้ดูแลระบบ <ph name="MS_WIN_NAME" />: การเปิดใช้การตั้งค่านี้ใช้ได้กับเครื่องที่ใช้ Windows 7 เท่านั้น สำหรับเครื่องที่ใช้ Windows 8 ขึ้นไป คุณต้องใช้ไฟล์ "การเชื่อมโยงแอปพลิเคชันเริ่มต้น" ที่ทำให้ <ph name="PRODUCT_NAME" /> เป็นเครื่องจัดการของโปรโตคอล <ph name="HHTPS_PROTOCOL" /> และ <ph name="HTTP_PROTOCOL" /> (และอาจเลือกให้เป็นเครื่องจัดการของโปรโตคอล <ph name="FTP_PROTOCOL" /> รวมถึงรูปแบบไฟล์ เช่น <ph name="HTML_EXTENSION" />, <ph name="HTM_EXTENSION" />, <ph name="PDF_EXTENSION" />, <ph name="SVG_EXTENSION" />, <ph name="WEBP_EXTENSION" /> ฯลฯ ก็ได้) ดูข้อมูลเพิ่มเติมที่ <ph name="SUPPORT_URL" /></translation> <translation id="1017967144265860778">การจัดการพลังงานบนหน้าจอการเข้าสู่ระบบ</translation> <translation id="1019101089073227242">ตั้งค่าไดเรกทอรีข้อมูลผู้ใช้</translation> <translation id="1022361784792428773">รหัสส่วนขยายที่ผู้ใช้ควรป้องกันไม่ให้มีการติดตั้ง (หรือ * สำหรับทั้งหมด)</translation> @@ -1540,7 +1540,7 @@ หากไม่ได้กำหนดค่านโยบายนี้ไว้ <ph name="PRODUCT_NAME" /> จะใช้เวอร์ชันสูงสุดเริ่มต้น - มิฉะนั้น อาจตั้งค่านโยบายเป็นค่าใดค่าหนึ่งต่อไปนี้ "tls1.2" หรือ "tls1.3" เมื่อตั้งค่าแล้ว <ph name="PRODUCT_NAME" /> จะไม่ใช้เวอร์ชัน SSL/TLS ที่สูงกว่าเวอร์ชันที่ระบุไว้ และระบบจะไม่สนใจค่าที่ไม่รู้จัก</translation> + มิฉะนั้น อาจตั้งค่านโยบายเป็นค่าใดค่าหนึ่งระหว่าง "tls1.2" หรือ "tls1.3" เมื่อตั้งค่าแล้ว <ph name="PRODUCT_NAME" /> จะไม่ใช้เวอร์ชัน SSL/TLS ที่สูงกว่าเวอร์ชันที่ระบุไว้ และระบบจะไม่สนใจค่าที่ไม่รู้จัก</translation> <translation id="5330684698007383292">อนุญาตให้ <ph name="PRODUCT_FRAME_NAME" /> จัดการประเภทเนื้อหาดังต่อไปนี้</translation> <translation id="5365946944967967336">แสดงปุ่ม "หน้าแรก" บนแถบเครื่องมือ</translation> <translation id="5366745336748853475">ช่วยให้คุณระบุรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่มีการเลือกใบรับรองไคลเอ็นต์โดยอัตโนมัติในหน้าจอลงชื่อเข้าใช้ในเฟรมที่โฮสต์ขั้นตอน SAML หากเว็บไซต์นั้นขอใบรับรอง ตัวอย่างการใช้งานคือเพื่อกำหนดค่าใบรับรองสำหรับทั้งอุปกรณ์เพื่อแสดงต่อ SAML IdP @@ -2327,9 +2327,9 @@ การตั้งค่าเครื่องพิมพ์จะเสร็จสมบูรณ์เมื่อใช้เครื่องพิมพ์เป็นครั้งแรก จะไม่มีการดาวน์โหลด PPD จนกว่าจะมีการใช้เครื่องพิมพ์ หลังจากนั้น ระบบจะเก็บ PPD ที่ใช้บ่อยไว้ในแคช - นโยบายนี้ไม่มีผลต่อความสามารถในการกำหนดค่าเครื่องพิมพ์ของอุปกรณ์ใดๆ แต่เป็นเพียงนโยบายเพิ่มเติมสำหรับการกำหนดค่าเครื่องพิมพ์ของผู้ใช้แต่ละราย + นโยบายนี้ไม่มีผลต่อความสามารถของผู้ใช้ในการกำหนดค่าเครื่องพิมพ์ในอุปกรณ์ใดๆ แต่เป็นเพียงนโยบายเพิ่มเติมสำหรับการกำหนดค่าเครื่องพิมพ์ของผู้ใช้แต่ละราย - สำหรับอุปกรณ์ที่จัดการโดย Active Directory นโยบายนี้รองรับส่วนขยาย <ph name="MACHINE_NAME_VARIABLE" /> ในชื่อเครื่อง Active Directory หรือสตริงย่อย ตัวอย่างเช่น หากชื่อเครื่องคือ <ph name="MACHINE_NAME_EXAMPLE" /> ระบบก็จะแทนที่ <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ด้วยอักขระ 4 ตัวที่เริ่มหลังจากตำแหน่งที่ 6 นั่นคือ <ph name="MACHINE_NAME_PART_EXAMPLE" /> โปรดทราบว่าตำแหน่งจะเริ่มนับจากศูนย์ + สำหรับอุปกรณ์ที่จัดการโดย Active Directory นโยบายนี้รองรับส่วนขยาย <ph name="MACHINE_NAME_VARIABLE" /> ในชื่อเครื่อง Active Directory หรือสตริงย่อย ตัวอย่างเช่น หากชื่อเครื่องคือ <ph name="MACHINE_NAME_EXAMPLE" /> ระบบก็จะแทนที่ <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ด้วยอักขระ 4 ตัวที่เริ่มหลังจากตำแหน่งที่ 6 นั่นคือ <ph name="MACHINE_NAME_PART_EXAMPLE" /> โปรดทราบว่าตำแหน่งจะเริ่มนับจาก 0 เราจะเลิกใช้งาน <ph name="MACHINE_NAME_VARIABLE_LOWERCASE" /> (ตัวพิมพ์เล็ก) ใน M71 และจะนำออกใน M72 </translation> <translation id="7340034977315324840">รายงานจำนวนครั้งของกิจกรรมบนอุปกรณ์</translation> @@ -3017,7 +3017,7 @@ <translation id="8970205333161758602">ระงับการแจ้งเตือนการปฏิเสธของ <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">อนุญาตให้ตรวจสอบสิทธิ์ Gnubby สำหรับโฮสต์การเข้าถึงระยะไกล</translation> <translation id="8976531594979650914">ใช้เครื่องพิมพ์เริ่มต้นของระบบเป็นค่าเริ่มต้น</translation> -<translation id="898520305112996948">อนุญาตให้คุณกำหนดรูปแบบ URL ซึ่งระบุเว็บไซต์ที่จะได้รับสิทธิ์เข้าถึงอุปกรณ์ USB ที่มีรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ที่ระบุโดยอัตโนมัติ นโยบายจะถูกต้องก็ต่อเมื่อแต่ละรายการในรายการรูปแบบมีทั้งอุปกรณ์และรูปแบบ URL แต่ละรายการในอุปกรณ์มีช่องรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ได้ ระบบจะถือว่ารหัสใดๆ ที่ละไว้เป็นสัญลักษณ์แทนโดยมีข้อยกเว้นอย่างหนึ่งคือ รหัสผลิตภัณฑ์จะต้องระบุไว้กับรหัสผู้ให้บริการเสมอ มิเช่นนั้นนโยบายจะไม่ถูกต้อง ระบบจะไม่สนใจค่าของนโยบายที่ไม่ถูกต้อง +<translation id="898520305112996948">อนุญาตให้คุณกำหนดรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่จะได้รับสิทธิ์โดยอัตโนมัติในการเข้าถึงอุปกรณ์ USB ที่มีรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ที่ระบุ นโยบายจะถูกต้องก็ต่อเมื่อแต่ละรายการในรายการรูปแบบมีทั้งอุปกรณ์และรูปแบบ URL แต่ละรายการในอุปกรณ์มีช่องรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ได้ ระบบจะถือว่ารหัสใดๆ ที่ละไว้เป็นสัญลักษณ์แทนโดยมีข้อยกเว้นอย่างหนึ่งคือ รหัสผลิตภัณฑ์จะต้องระบุไว้กับรหัสผู้ให้บริการเสมอ มิเช่นนั้นนโยบายจะไม่ถูกต้อง ระบบจะไม่สนใจค่าของนโยบายที่ไม่ถูกต้อง หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นทั่วไปกับเว็บไซต์ทั้งหมด ทั้งจากนโยบาย "DefaultWebUsbGuardSetting" หากมีการตั้งค่า หรือจากการกำหนดค่าส่วนตัวของผู้ใช้
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 04c3fc9..8574c94 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1584,7 +1584,7 @@ Якщо для правила вибрано значення false, усі інтерфейси користувача в <ph name="PRODUCT_NAME" />, що дають змогу змінювати з’єднання з VPN або від’єднуватися від цієї мережі, вимикаються. - Якщо для правила вибрано значення true або його не налаштовано, користувачі можуть змінювати з’єднання з VPN або від’єднуватися від цієї мережі як зазвичай. + Якщо для правила вибрано значення true або його не налаштовано, користувачі можуть змінювати з’єднання з VPN або від’єднуватися від цієї мережі, як зазвичай. Якщо з’єднання встановлено через додаток VPN, це правило не впливає на інтерфейс у ньому. Тому користувач усе ще зможе змінювати з’єднання з VPN через додаток.
diff --git a/components/previews/content/previews_hints.cc b/components/previews/content/previews_hints.cc index 41c353f..ac541834 100644 --- a/components/previews/content/previews_hints.cc +++ b/components/previews/content/previews_hints.cc
@@ -111,8 +111,7 @@ }; // Returns base::nullopt if |optimization_type| can't be converted. -base::Optional<PreviewsType> -ConvertProtoOptimizationTypeToPreviewsOptimizationType( +base::Optional<PreviewsType> ConvertProtoOptimizationTypeToPreviewsType( optimization_guide::proto::OptimizationType optimization_type) { switch (optimization_type) { case optimization_guide::proto::TYPE_UNSPECIFIED: @@ -126,6 +125,30 @@ } } +net::EffectiveConnectionType ConvertProtoEffectiveConnectionType( + optimization_guide::proto::EffectiveConnectionType proto_ect) { + switch (proto_ect) { + case optimization_guide::proto::EffectiveConnectionType:: + EFFECTIVE_CONNECTION_TYPE_UNKNOWN: + return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; + case optimization_guide::proto::EffectiveConnectionType:: + EFFECTIVE_CONNECTION_TYPE_OFFLINE: + return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE; + case optimization_guide::proto::EffectiveConnectionType:: + EFFECTIVE_CONNECTION_TYPE_SLOW_2G: + return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G; + case optimization_guide::proto::EffectiveConnectionType:: + EFFECTIVE_CONNECTION_TYPE_2G: + return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G; + case optimization_guide::proto::EffectiveConnectionType:: + EFFECTIVE_CONNECTION_TYPE_3G: + return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G; + case optimization_guide::proto::EffectiveConnectionType:: + EFFECTIVE_CONNECTION_TYPE_4G: + return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G; + } +} + // Returns whether any features using page hints are enabled. bool ShouldProcessPageHints() { return previews::params::IsResourceLoadingHintsEnabled(); @@ -230,7 +253,7 @@ continue; } base::Optional<PreviewsType> previews_type = - ConvertProtoOptimizationTypeToPreviewsOptimizationType( + ConvertProtoOptimizationTypeToPreviewsType( optimization.optimization_type()); if (!previews_type.has_value()) { continue; @@ -263,7 +286,7 @@ continue; } base::Optional<PreviewsType> previews_type = - ConvertProtoOptimizationTypeToPreviewsOptimizationType( + ConvertProtoOptimizationTypeToPreviewsType( optimization.optimization_type()); if (!previews_type || @@ -310,7 +333,7 @@ const optimization_guide::proto::Configuration& config) { for (const auto blacklist : config.optimization_blacklists()) { base::Optional<PreviewsType> previews_type = - ConvertProtoOptimizationTypeToPreviewsOptimizationType( + ConvertProtoOptimizationTypeToPreviewsType( blacklist.optimization_type()); if (previews_type == PreviewsType::LITE_PAGE_REDIRECT && previews::params::IsLitePageServerPreviewsEnabled() && @@ -403,16 +426,19 @@ } } -bool PreviewsHints::IsWhitelisted(const GURL& url, - PreviewsType type, - int* out_inflation_percent) const { +bool PreviewsHints::IsWhitelisted( + const GURL& url, + PreviewsType type, + int* out_inflation_percent, + net::EffectiveConnectionType* out_ect_threshold) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!url.has_host()) return false; return IsWhitelistedAtTopLevel(url, type, out_inflation_percent) || - IsWhitelistedInPageHints(url, type, out_inflation_percent); + IsWhitelistedInPageHints(url, type, out_inflation_percent, + out_ect_threshold); } bool PreviewsHints::IsWhitelistedAtTopLevel(const GURL& url, @@ -450,9 +476,11 @@ return false; } -bool PreviewsHints::IsWhitelistedInPageHints(const GURL& url, - PreviewsType type, - int* out_inflation_percent) const { +bool PreviewsHints::IsWhitelistedInPageHints( + const GURL& url, + PreviewsType type, + int* out_inflation_percent, + net::EffectiveConnectionType* out_ect_threshold) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!hint_cache_) @@ -475,14 +503,19 @@ for (const auto& optimization : matched_page_hint->whitelisted_optimizations()) { - if (ConvertProtoOptimizationTypeToPreviewsOptimizationType( + if (ConvertProtoOptimizationTypeToPreviewsType( optimization.optimization_type()) == type) { if (IsDisabledExperimentalOptimization(optimization)) { // This is an experimental optimization that is not enabled so continue // in case there is a non-experimental one. continue; } + // Found whitelisted optimization. *out_inflation_percent = optimization.inflation_percent(); + if (matched_page_hint->has_max_ect_trigger()) { + *out_ect_threshold = ConvertProtoEffectiveConnectionType( + matched_page_hint->max_ect_trigger()); + } return true; } }
diff --git a/components/previews/content/previews_hints.h b/components/previews/content/previews_hints.h index 92165af..e9d9223 100644 --- a/components/previews/content/previews_hints.h +++ b/components/previews/content/previews_hints.h
@@ -49,13 +49,14 @@ void Initialize(); // Whether the URL is whitelisted for the given previews type. If so, - // |out_inflation_percent| will be populated if metadata is available for it. - // This first checks the top-level whitelist and, if not whitelisted there, - // it will check the HintCache for having a loaded, matching PageHint that - // whitelists it. + // |out_inflation_percent| and |out_ect_threshold| will be populated if + // metadata is available for them. This first checks the top-level whitelist + // and, if not whitelisted there, it will check the HintCache for having a + // loaded, matching PageHint that whitelists it. bool IsWhitelisted(const GURL& url, PreviewsType type, - int* out_inflation_percent) const; + int* out_inflation_percent, + net::EffectiveConnectionType* out_ect_threshold) const; // Whether the URL is blacklisted for the given previews type. bool IsBlacklisted(const GURL& url, PreviewsType type) const; @@ -86,11 +87,13 @@ PreviewsType type, int* out_inflation_percent) const; // Returns whether |url| is whitelisted in the page hints contained within - // |hint_cache_|. If it is, then |out_inflation_percent| will be populated if - // metadata is available for it. - bool IsWhitelistedInPageHints(const GURL& url, - PreviewsType type, - int* out_inflation_percent) const; + // |hint_cache_|. If it is, then |out_inflation_percent| and + // |out_ect_threshold| will be populated if metadata is available for them. + bool IsWhitelistedInPageHints( + const GURL& url, + PreviewsType type, + int* out_inflation_percent, + net::EffectiveConnectionType* out_ect_threshold) const; // Parses optimization filters from |config| and populates corresponding // supported blacklists in this object.
diff --git a/components/previews/content/previews_hints_unittest.cc b/components/previews/content/previews_hints_unittest.cc index c86fe7a..09db582 100644 --- a/components/previews/content/previews_hints_unittest.cc +++ b/components/previews/content/previews_hints_unittest.cc
@@ -278,6 +278,61 @@ GURL("https://black.com/path"), PreviewsType::LITE_PAGE_REDIRECT)); } +TEST_F(PreviewsHintsTest, IsWhitelistedOutParams) { + base::test::ScopedFeatureList scoped_list; + scoped_list.InitAndEnableFeature(features::kResourceLoadingHints); + optimization_guide::proto::Configuration config; + + optimization_guide::proto::Hint* hint1 = config.add_hints(); + hint1->set_key("somedomain.org"); + hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX); + + // Page hint for "/has_inflation_percent/" + optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints(); + page_hint1->set_page_pattern("/has_inflation_percent/"); + optimization_guide::proto::Optimization* optimization_with_inflation_percent = + page_hint1->add_whitelisted_optimizations(); + optimization_with_inflation_percent->set_inflation_percent(55); + optimization_with_inflation_percent->set_optimization_type( + optimization_guide::proto::RESOURCE_LOADING); + // Page hint for "/has_max_ect_trigger/" + optimization_guide::proto::PageHint* page_hint2 = hint1->add_page_hints(); + page_hint2->set_page_pattern("/has_max_ect_trigger/"); + page_hint2->set_max_ect_trigger( + optimization_guide::proto::EffectiveConnectionType:: + EFFECTIVE_CONNECTION_TYPE_4G); + optimization_guide::proto::Optimization* + optimization_without_inflation_percent = + page_hint2->add_whitelisted_optimizations(); + optimization_without_inflation_percent->set_optimization_type( + optimization_guide::proto::RESOURCE_LOADING); + ParseConfig(config); + + // Verify optimization providing inflation_percent. + int inflation_percent = 0; + net::EffectiveConnectionType ect_threshold = + net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; + EXPECT_TRUE(previews_hints()->IsWhitelisted( + GURL("https://www.somedomain.org/has_inflation_percent/"), + PreviewsType::RESOURCE_LOADING_HINTS, &inflation_percent, + &ect_threshold)); + EXPECT_EQ(55, inflation_percent); + EXPECT_EQ(net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN, + ect_threshold); + + // Verify page hint providing ECT trigger. + inflation_percent = 0; + ect_threshold = + net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; + EXPECT_TRUE(previews_hints()->IsWhitelisted( + GURL("https://www.somedomain.org/has_max_ect_trigger/"), + PreviewsType::RESOURCE_LOADING_HINTS, &inflation_percent, + &ect_threshold)); + EXPECT_EQ(0, inflation_percent); + EXPECT_EQ(net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G, + ect_threshold); +} + TEST_F(PreviewsHintsTest, IsWhitelistedForExperimentalPreview) { base::test::ScopedFeatureList scoped_list; scoped_list.InitAndEnableFeature(features::kResourceLoadingHints); @@ -290,6 +345,9 @@ // Page hint for "/experimental_preview/" optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints(); page_hint1->set_page_pattern("/experimental_preview/"); + page_hint1->set_max_ect_trigger( + optimization_guide::proto::EffectiveConnectionType:: + EFFECTIVE_CONNECTION_TYPE_3G); // First add experimental PageHint optimization. optimization_guide::proto::Optimization* experimental_optimization = page_hint1->add_whitelisted_optimizations(); @@ -316,12 +374,17 @@ ParseConfig(config); // Verify default resource hint whitelisted (via inflation_percent). - int inflation_percent; + int inflation_percent = 0; + net::EffectiveConnectionType ect_threshold = + net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; EXPECT_TRUE(previews_hints()->IsWhitelisted( GURL("https://www.somedomain.org/experimental_preview/" "experimental_resource.js"), - PreviewsType::RESOURCE_LOADING_HINTS, &inflation_percent)); + PreviewsType::RESOURCE_LOADING_HINTS, &inflation_percent, + &ect_threshold)); EXPECT_EQ(33, inflation_percent); + EXPECT_EQ(net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G, + ect_threshold); // Now enable the experiment and verify experimental resource hint chosen. { @@ -330,11 +393,16 @@ features::kOptimizationHintsExperiments, {{"experiment_name", "foo_experiment"}}); int inflation_percent; + net::EffectiveConnectionType ect_threshold = + net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G; EXPECT_TRUE(previews_hints()->IsWhitelisted( GURL("https://www.somedomain.org/experimental_preview/" "experimental_resource.js"), - PreviewsType::RESOURCE_LOADING_HINTS, &inflation_percent)); + PreviewsType::RESOURCE_LOADING_HINTS, &inflation_percent, + &ect_threshold)); EXPECT_EQ(99, inflation_percent); + EXPECT_EQ(net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G, + ect_threshold); } }
diff --git a/components/previews/content/previews_optimization_guide.cc b/components/previews/content/previews_optimization_guide.cc index 7fb4810..0874e30 100644 --- a/components/previews/content/previews_optimization_guide.cc +++ b/components/previews/content/previews_optimization_guide.cc
@@ -39,7 +39,9 @@ return false; int inflation_percent = 0; - if (!hints_->IsWhitelisted(url, type, &inflation_percent)) + net::EffectiveConnectionType ect_threshold = + params::GetECTThresholdForPreview(type); + if (!hints_->IsWhitelisted(url, type, &inflation_percent, &ect_threshold)) return false; if (inflation_percent != 0 && previews_data)
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 2a56501..32dade1 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -17,6 +17,7 @@ <translation id="1080116354587839789">Fit to width</translation> <translation id="1088860948719068836">Add Name on Card</translation> <translation id="1089439967362294234">Change Password</translation> +<translation id="109743633954054152">Manage passwords in Chrome settings</translation> <translation id="1103523840287552314">Always translate <ph name="LANGUAGE" /></translation> <translation id="1107591249535594099">If ticked, Chrome will store a copy of your card on this device for faster form filling.</translation> <translation id="1110994991967754504">Select permission for <ph name="PERMISSION_NAME" /></translation> @@ -147,6 +148,7 @@ <translation id="1871208020102129563">Proxy is set to use fixed proxy servers, not a .pac script URL.</translation> <translation id="1871284979644508959">Required field</translation> <translation id="1874765382782611674">Accepted Debit Cards</translation> +<translation id="1875512691959384712">Google Forms</translation> <translation id="187918866476621466">Open startup pages</translation> <translation id="1883255238294161206">Collapse list</translation> <translation id="1898423065542865115">Filtering</translation> @@ -200,6 +202,7 @@ <translation id="2239100178324503013">Send now</translation> <translation id="225207911366869382">This value is deprecated for this policy.</translation> <translation id="2262243747453050782">HTTP error</translation> +<translation id="2263079731045660823">Update credit card auto-fill info in Chrome settings</translation> <translation id="2270484714375784793">Phone number</translation> <translation id="2283340219607151381">Save and fill addresses</translation> <translation id="2292556288342944218">Your Internet access is blocked</translation> @@ -224,6 +227,7 @@ <translation id="239429038616798445">This delivery method isn’t available. Try a different method.</translation> <translation id="2396249848217231973">&Undo delete</translation> <translation id="2413528052993050574">This server could not prove that it is <ph name="DOMAIN" />; its security certificate might be revoked. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation> +<translation id="2463193859425327265">Change home page</translation> <translation id="2463739503403862330">Fill in</translation> <translation id="2465655957518002998">Choose delivery method</translation> <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Running Network Diagnostics<ph name="END_LINK" /></translation> @@ -256,6 +260,7 @@ <translation id="2650446666397867134">Access to the file was denied</translation> <translation id="2653659639078652383">Submit</translation> <translation id="2666117266261740852">Close other tabs or apps</translation> +<translation id="267371737713284912">press <ph name="MODIFIER_KEY_DESCRIPTION" /> to undo</translation> <translation id="2674170444375937751">Are you sure that you want to delete these pages from your history?</translation> <translation id="2677748264148917807">Leave</translation> <translation id="2699302886720511147">Accepted Cards</translation> @@ -285,6 +290,7 @@ <translation id="2824775600643448204">Address and search bar</translation> <translation id="2826760142808435982">The connection is encrypted and authenticated using <ph name="CIPHER" /> and uses <ph name="KX" /> as the key exchange mechanism.</translation> <translation id="2835170189407361413">Clear form</translation> +<translation id="2847118875340931228">Open incognito window</translation> <translation id="2851634818064021665">You need permission to visit this site</translation> <translation id="2856444702002559011">Attackers might be trying to steal your information from <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> (for example, passwords, messages or credit cards). <ph name="BEGIN_LEARN_MORE_LINK" />Learn more<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="2881276955470682203">Save card?</translation> @@ -384,6 +390,7 @@ <translation id="3467763166455606212">Cardholder name required</translation> <translation id="3479539252931486093">Was this unexpected? <ph name="BEGIN_LINK" />Let us know<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Not now</translation> +<translation id="3484560055331845446">You could lose access to your Google account. Chrome recommends changing your password now. You'll be asked to sign in.</translation> <translation id="3498215018399854026">We could not reach your parent at the moment. Please try again.</translation> <translation id="3528171143076753409">Server's certificate is not trusted</translation> <translation id="3530944546672790857">{COUNT,plural, =0{At least 1 item on synced devices}=1{1 item (and more on synced devices)}other{# items (and more on synced devices)}}</translation> @@ -406,6 +413,7 @@ <translation id="3650584904733503804">Validation successful</translation> <translation id="3655670868607891010">If you're seeing this frequently, try these <ph name="HELP_LINK" />.</translation> <translation id="3658742229777143148">Revision</translation> +<translation id="366077651725703012">Update credit card</translation> <translation id="3676592649209844519">Device ID:</translation> <translation id="3678029195006412963">Request could not be signed</translation> <translation id="3678529606614285348">Open page in a new Incognito window (Ctrl-Shift-N)</translation> @@ -716,6 +724,7 @@ <translation id="5784606427469807560">There was a problem confirming your card. Check your Internet connection and try again.</translation> <translation id="5785756445106461925">Further, this page includes other resources which are not secure. These resources can be viewed by others while in transit, and can be modified by an attacker to change the look of the page.</translation> <translation id="5786044859038896871">Do you want to fill in your card info?</translation> +<translation id="5798683403665926540">Change home page in Chrome settings</translation> <translation id="5803412860119678065">Do you want to fill in your <ph name="CARD_DETAIL" />?</translation> <translation id="5810442152076338065">Your connection to <ph name="DOMAIN" /> is encrypted using an obsolete cipher suite.</translation> <translation id="5813119285467412249">&Redo Add</translation> @@ -840,6 +849,7 @@ <translation id="6839929833149231406">Area</translation> <translation id="6852204201400771460">Reload app?</translation> <translation id="6865412394715372076">This card can't be verified at the moment</translation> +<translation id="6868206169573555318">Relaunch to update</translation> <translation id="6874604403660855544">&Redo add</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation> <translation id="6891596781022320156">Policy level is not supported.</translation> @@ -865,6 +875,7 @@ <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">These charges could be one-off or recurring and may not be obvious.</translation> <translation id="7029809446516969842">Passwords</translation> +<translation id="7041710477964360998">{NUM_CARDS,plural, =1{This card and its billing address will be saved to your Google account for faster checkout across devices.}other{These cards and their billing addresses will be saved to your Google account for faster checkout across devices.}}</translation> <translation id="7050187094878475250">You attempted to reach <ph name="DOMAIN" />, but the server presented a certificate whose validity period is too long to be trustworthy.</translation> <translation id="7053983685419859001">Block</translation> <translation id="7064851114919012435">Contact info</translation> @@ -971,7 +982,9 @@ <translation id="7667346355482952095">Returned policy token is empty or doesn't match current token</translation> <translation id="7668654391829183341">Unknown device</translation> <translation id="7669271284792375604">Attackers on this site might try to trick you into installing programs that harm your browsing experience (for example, by changing your homepage or showing extra ads on sites that you visit).</translation> +<translation id="7681101578153515023">Change search engine</translation> <translation id="7682287625158474539">Shipping</translation> +<translation id="7687186412095877299">Fills in payment forms with your saved payment methods</translation> <translation id="7699293099605015246">Articles aren't available at the moment.</translation> <translation id="7701040980221191251">None</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Proceed to <ph name="SITE" /> (unsafe)<ph name="END_LINK" /></translation> @@ -994,6 +1007,7 @@ <translation id="7802523362929240268">Site is legitimate</translation> <translation id="780301667611848630">No, thank you</translation> <translation id="7805768142964895445">Status</translation> +<translation id="7806344367022510803">Change search engine settings in Chrome</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Remove form suggestion from Chrome?</translation> <translation id="7815407501681723534">Found <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> for '<ph name="SEARCH_STRING" />'</translation> @@ -1029,6 +1043,7 @@ <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="808894953321890993">Change password</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> <translation id="8103161714697287722">Payment Method</translation> @@ -1040,6 +1055,7 @@ <translation id="8184538546369750125">Use global default (Allow)</translation> <translation id="8191494405820426728">Local Crash ID <ph name="CRASH_LOCAL_ID" /></translation> <translation id="8194797478851900357">&Undo Move</translation> +<translation id="8197543752516192074">Translate page</translation> <translation id="8201077131113104583">Invalid update URL for extension with ID "<ph name="EXTENSION_ID" />".</translation> <translation id="8202097416529803614">Order summary</translation> <translation id="8211406090763984747">Connection is secure</translation> @@ -1084,6 +1100,7 @@ <translation id="8428213095426709021">Settings</translation> <translation id="8433057134996913067">This will sign you out of most websites.</translation> <translation id="8437238597147034694">&Undo move</translation> +<translation id="8461694314515752532">Encrypt synced data with your own sync passphrase</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 credit card}other{# credit cards}}</translation> <translation id="8473863474539038330">Addresses and more</translation> <translation id="8483780878231876732">To use cards from your Google account, sign in to Chrome</translation> @@ -1193,6 +1210,7 @@ <translation id="9219103736887031265">Images</translation> <translation id="933712198907837967">Diners Club</translation> <translation id="935608979562296692">CLEAR FORM</translation> +<translation id="936602727769022409">You could lose access to your Google account. Chromium recommends changing your password now. You'll be asked to sign in.</translation> <translation id="939736085109172342">New folder</translation> <translation id="951104842009476243">Accepted Debit and Prepaid Cards</translation> <translation id="962484866189421427">This content might try to install deceptive apps that pretend to be something else or collect data that may be used to track you. <ph name="BEGIN_LINK" />Show anyway<ph name="END_LINK" /></translation> @@ -1212,4 +1230,5 @@ <li>Try connecting to another network</li> </ul></translation> <translation id="997986563973421916">From Google Pay</translation> +<translation id="998893882640184078">Open new Chrome incognito window</translation> </translationbundle> \ No newline at end of file
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 26930db..5b57262 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -162,6 +162,7 @@ <translation id="1973335181906896915">क्रमबद्ध करने में गड़बड़ी</translation> <translation id="1974060860693918893">उन्नत</translation> <translation id="1978555033938440688">फ़र्मवेयर वर्शन</translation> +<translation id="1981206234434200693">Chrome के ब्राउज़िंग इतिहास का डेटा हटाएं</translation> <translation id="2001146170449793414">{COUNT,plural, =1{और 1 अधिक}one{और # अधिक}other{और # अधिक}}</translation> <translation id="2003709556000175978">अपना पासवर्ड अभी रीसेट करें</translation> <translation id="2025186561304664664">प्रॉक्सी स्वत: कॉन्फ़िगर पर सेट है.</translation> @@ -229,6 +230,7 @@ <translation id="2473195200299095979">इस पेज का अनुवाद करें</translation> <translation id="2479410451996844060">गलत खोज यूआरएल.</translation> <translation id="2482878487686419369">अधिसूचनाएं</translation> +<translation id="248348093745724435">मशीन के लिए नीतियां</translation> <translation id="2491120439723279231">सर्वर के प्रमाणपत्र में त्रुटियां हैं.</translation> <translation id="2495083838625180221">JSON पार्सर</translation> <translation id="2495093607237746763">यदि चेक किया गया हो, तो अधिक तेज़ी से फ़ॉर्म भरने के लिए क्रोमियम इस डिवाइस पर आपके कार्ड की कॉपी संग्रहित करेगा.</translation> @@ -299,6 +301,7 @@ <translation id="2969319727213777354">सुरक्षित कनेक्शन स्थापित करने के लिए, आपकी घड़ी को सही तरीके से सेट किए जाने की आवश्यकता है. ऐसा इसलिए क्योंकि वेबसाइटों द्वारा स्वयं की पहचान करने के लिए उपयोग किए जाने वाले प्रमाणपत्र केवल विशिष्ट समयावधियों के लिए ही मान्य होते हैं. चूंकि आपके डिवाइस की घड़ी गलत है, इसलिए Google Chrome इन प्रमाणपत्रों का सत्यापन नहीं कर सकता.</translation> <translation id="2972581237482394796">&फिर से करें</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, इस समय चुना गया है. <ph name="ROW_CONTENT" /></translation> +<translation id="2982481275546140226">डेटा हटाएं</translation> <translation id="2985306909656435243">यदि सक्षम किया गया हो, तो अधिक तेज़ी से फ़ॉर्म भरने के लिए क्रोमियम इस डिवाइस पर आपके कार्ड की एक कॉपी संग्रहित करेगा.</translation> <translation id="2985398929374701810">मान्य पता डालें</translation> <translation id="2986368408720340940">पिकअप का यह तरीका उपलब्ध नहीं है. कोई दूसरा तरीका आज़माएं.</translation> @@ -318,6 +321,7 @@ <translation id="3109728660330352905">आपके पास इस पेज को देखने के लिए प्राधिकरण नहीं है.</translation> <translation id="3120730422813725195">Elo</translation> <translation id="31207688938192855"><ph name="BEGIN_LINK" />कनेक्टिविटी निदान चलाकर देखें<ph name="END_LINK" />.</translation> +<translation id="3137507986424712703">{COUNT,plural, =0{कोई नहीं}=1{एक खाते का साइन-इन डेटा}one{# खातों का साइन-इन डेटा}other{# खातों का साइन-इन डेटा}}</translation> <translation id="3145945101586104090">उत्तर डीकोड करने में विफल</translation> <translation id="3150653042067488994">अस्थायी सर्वर गड़बड़ी</translation> <translation id="3154506275960390542">इस पेज में ऐसा फ़ॉर्म शामिल है, जो सुरक्षित रूप से सबमिट नहीं किया जा सकता है. ट्रांज़िट में होने के दौरान आपके भेजे जाने वाले डेटा को दूसरे लोग देख सकते हैं या सर्वर को मिलने वाली सामग्री में बदलाव करने के लिए कोई आक्रमणकर्ता उसे संशोधित कर सकता है.</translation> @@ -402,6 +406,7 @@ <translation id="3650584904733503804">मान्यकरण सफल</translation> <translation id="3655670868607891010">यदि आपको यह बार-बार दिखाई दे रहा हो, तो इन <ph name="HELP_LINK" /> को आज़माएं.</translation> <translation id="3658742229777143148">पुनरीक्षण</translation> +<translation id="3676592649209844519">डिवाइस आईडी:</translation> <translation id="3678029195006412963">अनुरोध पर हस्ताक्षर नहीं किया जा सका</translation> <translation id="3678529606614285348">पेज को नई गुप्त विंडो में खोलें (Ctrl-Shift-N)</translation> <translation id="3679803492151881375">ख़राबी रिपोर्ट <ph name="CRASH_TIME" /> पर कैप्चर की गई, <ph name="UPLOAD_TIME" /> पर अपलोड की गई</translation> @@ -584,6 +589,7 @@ <translation id="4989163558385430922">सभी देखें</translation> <translation id="4989809363548539747">यह प्लग इन समर्थित नहीं है</translation> <translation id="5002932099480077015">यदि सक्षम किया हुआ हो, तो Chrome फ़ॉर्म को तेज़ी से भरने के लिए इस डिवाइस पर आपके कार्ड की एक प्रति संग्रहित करेगा.</translation> +<translation id="5015510746216210676">मशीन का नाम:</translation> <translation id="5018422839182700155">यह पेज खुल नहीं पा रहा है</translation> <translation id="5019198164206649151">बैकिंग संग्रह खराब स्थिति में है</translation> <translation id="5023310440958281426">अपने व्यवस्थापक की नीतियां देखें</translation> @@ -723,6 +729,7 @@ <translation id="5908541034548427511"><ph name="TYPE_1" /> (सिंक किया गया)</translation> <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 उपयोग में है}one{# उपयोग में हैं}other{# उपयोग में हैं}}</translation> <translation id="5922853866070715753">करीब-करीब हो गया है</translation> +<translation id="5932224571077948991">साइट में तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं</translation> <translation id="5939518447894949180">रीसेट करें</translation> <translation id="5951495562196540101">उपभोक्ता खाते (पैकेज किया गया लाइसेंस मौजूद है) के साथ नामांकन नहीं कर सकते.</translation> <translation id="5966151627327109289">आपको ज़्यादातर साइटों से साइन आउट कर देता है. आप <ph name="SITE" /> से और कुछ दूसरी साइटों से सुरक्षित सामग्री का एक्सेस खो सकते हैं.</translation> @@ -760,6 +767,7 @@ <translation id="6203231073485539293">अपना इंटरनेट कनेक्शन जाँचें</translation> <translation id="6218753634732582820">क्रोमियम से पता निकालें?</translation> <translation id="6221345481584921695">Google सुरक्षित ब्राउज़िंग को <ph name="SITE" /> पर हाल ही में <ph name="BEGIN_LINK" />मैलवेयर का पता चला<ph name="END_LINK" /> है. आमतौर पर सुरक्षित रहने वाली वेबसाइटें कभी-कभी मैलेवयर से संक्रमित हो जाती हैं. दुर्भावनापूर्ण सामग्री <ph name="SUBRESOURCE_HOST" /> से आती है, जो कि एक ज्ञात मैलवेयर वितरक है.</translation> +<translation id="6240447795304464094">Google Pay का लोगो</translation> <translation id="6251924700383757765">निजता नीति</translation> <translation id="6254436959401408446">यह पेज खोलने के लिए ज़रूरी जगह नहीं है</translation> <translation id="625755898061068298">आपने इस साइट के लिए सुरक्षा चेतावनियों को बंद करने का विकल्प चुना है.</translation> @@ -778,6 +786,7 @@ <translation id="6337133576188860026"><ph name="SIZE" /> से कम जगह खाली करता है. जब आप अगली बार विज़िट करेंगे तो, कुछ साइटें और धीमे लोड हो सकती हैं.</translation> <translation id="6337534724793800597">नाम के अनुसार नीतियां फ़िल्टर करें</translation> <translation id="6358450015545214790">इनका क्या अर्थ है?</translation> +<translation id="6383221683286411806">आगे शुल्क लग सकते हैं.</translation> <translation id="6386120369904791316">{COUNT,plural, =1{1 अन्य सुझाव}one{# अन्य सुझाव}other{# अन्य सुझाव}}</translation> <translation id="6387754724289022810">अगली बार तेज़ी से भुगतान करने के लिए, अपने कार्ड और बिलिंग पते को अपने Google खाते में और इस डिवाइस में सेव करें.</translation> <translation id="6397451950548600259">आपके कंप्यूटर पर मौजूद सॉफ़्टवेयर Chrome को सुरक्षित रूप से वेब से कनेक्ट होने से रोक रहा है</translation> @@ -815,6 +824,7 @@ <translation id="6685834062052613830">प्रस्थान करें और सेटअप पूरा करें</translation> <translation id="6710213216561001401">पिछला</translation> <translation id="6710594484020273272"><खोज शब्द लिखें></translation> +<translation id="671076103358959139">नाम दर्ज करने का टोकन:</translation> <translation id="6711464428925977395">प्रॉक्सी सर्वर के साथ कुछ गलत है या पता गलत है.</translation> <translation id="674375294223700098">अज्ञात सर्वर प्रमाणपत्र गड़बड़ी.</translation> <translation id="6744009308914054259">कनेक्शन का इंतज़ार करते समय, ऑफ़लाइन लेख पढ़ने के लिए आप 'डाउनलोड' पर जा सकते हैं.</translation> @@ -880,6 +890,7 @@ <translation id="721197778055552897">इस समस्या के बारे में <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" />.</translation> <translation id="7219179957768738017">कनेक्शन <ph name="SSL_VERSION" /> का उपयोग करता है.</translation> <translation id="7220786058474068424">संसाधित हो रहा है</translation> +<translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> <translation id="724691107663265825">साइट में आगे मैलवेयर हैं</translation> <translation id="724975217298816891">अपने कार्ड विवरण अपडेट करने के लिए <ph name="CREDIT_CARD" /> का समय समाप्ति दिनांक और CVC डालें. आपकी तरफ से पुष्टि हो जाने पर, आपके कार्ड के विवरण इस साइट के साथ शेयर किए जाएंगे.</translation> <translation id="7251437084390964440">नेटवर्क कॉन्फ़िगरेशन ONC मानक के मुताबिक नहीं है. हो सकता है कि कॉन्फ़िगरेशन के कुछ हिस्से नहीं लाए गए हों. @@ -1060,6 +1071,7 @@ <translation id="8364627913115013041">सेट नहीं है.</translation> <translation id="8368476060205742148">Google Play सेवाएं</translation> <translation id="8380941800586852976">खतरनाक</translation> +<translation id="8381674639488873545">ये शुल्क एक बार लगने वाले या बार-बार लगने वाले हो सकते हैं और हो सकता है कि इनके बारे में साफ़ तौर पर न बताया जाए. <ph name="BEGIN_LINK" />फिर भी दिखाएं<ph name="END_LINK" /></translation> <translation id="8382348898565613901">हाल ही में विज़िट किए गए आपके बुकमार्क यहां दिखाई देते हैं</translation> <translation id="8398259832188219207">ख़राबी रिपोर्ट <ph name="UPLOAD_TIME" /> पर अपलोड की गई</translation> <translation id="8412145213513410671">क्रैश (<ph name="CRASH_COUNT" />)</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index 5032d8b..6f6b836 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -890,7 +890,7 @@ <translation id="721197778055552897"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /> sobre este problema.</translation> <translation id="7219179957768738017">A conexão usa a <ph name="SSL_VERSION" />.</translation> <translation id="7220786058474068424">Processando</translation> -<translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> +<translation id="7243010569062352439"><ph name="PASSWORDS" />, <ph name="SIGNIN_DATA" /></translation> <translation id="724691107663265825">O site a seguir contém malware</translation> <translation id="724975217298816891">Digite a data de validade e o CVC do <ph name="CREDIT_CARD" /> para atualizar os detalhes do cartão. Depois da confirmação, os detalhes do cartão serão compartilhados com esse site.</translation> <translation id="7251437084390964440">A configuração de rede não está de acordo com o padrão ONC. É possível que partes da configuração não sejam importadas.
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index a7797b7..4d12d34 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -17,6 +17,7 @@ <translation id="1080116354587839789">Prispôsobiť šírke</translation> <translation id="1088860948719068836">Pridanie mena na karte</translation> <translation id="1089439967362294234">Zmeniť heslo</translation> +<translation id="109743633954054152">Spravujte heslá v nastaveniach Chromu</translation> <translation id="1103523840287552314">Vždy preložiť nasledujúci jazyk: <ph name="LANGUAGE" /></translation> <translation id="1107591249535594099">Ak je toto nastavenie začiarknuté, Chrome uloží kópiu karty na toto zariadenie, aby ste mohli vypĺňať formuláre rýchlejšie.</translation> <translation id="1110994991967754504">Vyberte povolenie pre <ph name="PERMISSION_NAME" /></translation> @@ -147,6 +148,7 @@ <translation id="1871208020102129563">Proxy je nastavené na použitie pevne daných serverov proxy, nie skriptov PAC webovej adresy.</translation> <translation id="1871284979644508959">Povinné pole</translation> <translation id="1874765382782611674">Akceptované debetné karty</translation> +<translation id="1875512691959384712">Formuláre Google</translation> <translation id="187918866476621466">Otvoriť stránky pri spustení</translation> <translation id="1883255238294161206">Zbaliť zoznam</translation> <translation id="1898423065542865115">Filtrovanie</translation> @@ -200,6 +202,7 @@ <translation id="2239100178324503013">Odoslať</translation> <translation id="225207911366869382">Táto hodnota už pre toto pravidlo nie je podporovaná.</translation> <translation id="2262243747453050782">Chyba protokolu HTTP</translation> +<translation id="2263079731045660823">Aktualizujte informácie automatického dopĺňania kreditných kariet v nastaveniach Chromu</translation> <translation id="2270484714375784793">Telefónne číslo</translation> <translation id="2283340219607151381">Ukladať a dopĺňať adresy</translation> <translation id="2292556288342944218">Váš prístup k internetu je blokovaný</translation> @@ -224,6 +227,7 @@ <translation id="239429038616798445">Tento spôsob dodania nie je k dispozícii. Skúste inú možnosť.</translation> <translation id="2396249848217231973">&Vrátiť späť odstránenie</translation> <translation id="2413528052993050574">Server nedokáže overiť, či ide o doménu <ph name="DOMAIN" />, jej bezpečnostný certifikát bol zrejme zrušený. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie zachytil útočník.</translation> +<translation id="2463193859425327265">Zmeniť domovskú stránku</translation> <translation id="2463739503403862330">Vyplniť</translation> <translation id="2465655957518002998">Zvoliť spôsob doručenia</translation> <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Spustiť nástroj Diagnostika siete<ph name="END_LINK" /></translation> @@ -256,6 +260,7 @@ <translation id="2650446666397867134">Prístup k súboru bol odmietnutý</translation> <translation id="2653659639078652383">Odoslať</translation> <translation id="2666117266261740852">Zavrite ostatné karty alebo aplikácie</translation> +<translation id="267371737713284912">vráťte späť stlačením klávesa <ph name="MODIFIER_KEY_DESCRIPTION" /></translation> <translation id="2674170444375937751">Naozaj chcete odstrániť tieto stránky zo svojej histórie?</translation> <translation id="2677748264148917807">Odísť</translation> <translation id="2699302886720511147">Akceptované karty</translation> @@ -285,6 +290,7 @@ <translation id="2824775600643448204">Panel s adresou a vyhľadávací panel</translation> <translation id="2826760142808435982">Pripojenie je šifrované pomocou štandardu <ph name="CIPHER" /> a používa mechanizmus výmeny kľúčov <ph name="KX" />.</translation> <translation id="2835170189407361413">Vymazať formulár</translation> +<translation id="2847118875340931228">Otvoriť okno inkognito</translation> <translation id="2851634818064021665">Na návštevu tohto webu potrebujete povolenie</translation> <translation id="2856444702002559011">Útočníci sa môžu pokúsiť ukradnúť vaše informácie z webu <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> (napríklad heslá, správy alebo kreditné karty). <ph name="BEGIN_LEARN_MORE_LINK" />Ďalšie informácie<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="2881276955470682203">Uložiť kartu?</translation> @@ -381,6 +387,7 @@ <translation id="3467763166455606212">Meno majiteľa karty je povinný údaj</translation> <translation id="3479539252931486093">Neočakávali ste to? <ph name="BEGIN_LINK" />Dajte nám vedieť<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Teraz nie</translation> +<translation id="3484560055331845446">Môžete stratiť prístup do účtu Google. Chrome odporúča, aby ste si ihneď zmenili heslo. Zobrazí sa výzva na prihlásenie.</translation> <translation id="3498215018399854026">V tejto chvíli sa nám nepodarilo spojiť s vaším rodičom. Skúste to znova neskôr.</translation> <translation id="3528171143076753409">Certifikát servera nie je dôveryhodný.</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Aspoň 1 položka v synchronizovaných zariadeniach}=1{1 položka (a ďalšie v synchronizovaných zariadeniach)}few{# položky (a ďalšie v synchronizovaných zariadeniach)}many{# položky (a ďalšie v synchronizovaných zariadeniach)}other{# položiek (a ďalšie v synchronizovaných zariadeniach)}}</translation> @@ -402,6 +409,7 @@ <translation id="3650584904733503804">Overenie bolo úspešné</translation> <translation id="3655670868607891010">Ak sa vám táto stránka zobrazuje často, skúste použiť tieto stránky <ph name="HELP_LINK" />.</translation> <translation id="3658742229777143148">Verzia</translation> +<translation id="366077651725703012">Aktualizovať kreditnú kartu</translation> <translation id="3676592649209844519">ID zariadenia:</translation> <translation id="3678029195006412963">Požiadavku sa nepodarilo podpísať</translation> <translation id="3678529606614285348">Otvorte stránku v novom okne inkognito (Ctrl-Shift-N)</translation> @@ -712,6 +720,7 @@ <translation id="5784606427469807560">Pri overovaní karty sa vyskytol problém. Skontrolujte pripojenie k internetu a skúste to znova.</translation> <translation id="5785756445106461925">Táto stránka obsahuje aj iné zdroje, ktoré nie sú zabezpečené. Tieto zdroje môžu pri prenose vidieť ostatní používatelia a útočník ich môže upraviť tak, aby zmenil vzhľad stránky.</translation> <translation id="5786044859038896871">Chcete vyplniť informácie o karte?</translation> +<translation id="5798683403665926540">Zmeniť domovskú stránku v nastaveniach Chromu</translation> <translation id="5803412860119678065">Chcete vyplniť informácie o karte <ph name="CARD_DETAIL" />?</translation> <translation id="5810442152076338065">Vaše pripojenie k doméne <ph name="DOMAIN" /> je šifrované pomocou zastaranej šifrovacej súpravy.</translation> <translation id="5813119285467412249">&Znova pridať</translation> @@ -835,6 +844,7 @@ <translation id="6839929833149231406">Oblasť</translation> <translation id="6852204201400771460">Načítať znova aplikáciu?</translation> <translation id="6865412394715372076">Táto karta sa momentálne nedá overiť</translation> +<translation id="6868206169573555318">Aktualizovať opätovným spustením</translation> <translation id="6874604403660855544">&Znova pridať</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation> <translation id="6891596781022320156">Úroveň pravidla nie je podporovaná.</translation> @@ -860,6 +870,7 @@ <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">Tieto poplatky môžu byť jednorazové alebo opakované a nemusia byť predvídateľné.</translation> <translation id="7029809446516969842">Heslá</translation> +<translation id="7041710477964360998">{NUM_CARDS,plural, =1{Táto karta bude spolu s príslušnou fakturačnou adresou uložená do vášho účtu Google na zrýchlenie platieb v zariadeniach.}few{Tieto karty budú spolu s príslušnými fakturačnými adresami uložené do vášho účtu Google na zrýchlenie platieb v zariadeniach.}many{Tieto karty budú spolu s príslušnými fakturačnými adresami uložené do vášho účtu Google na zrýchlenie platieb v zariadeniach.}other{Tieto karty budú spolu s príslušnými fakturačnými adresami uložené do vášho účtu Google na zrýchlenie platieb v zariadeniach.}}</translation> <translation id="7050187094878475250">Pokúsili ste sa prejsť do domény <ph name="DOMAIN" />, ale server udelil certifikát, ktorého obdobie platnosti je príliš dlhé, a preto nie je dôveryhodný</translation> <translation id="7053983685419859001">Blokovať</translation> <translation id="7064851114919012435">Kontaktné informácie</translation> @@ -966,7 +977,9 @@ <translation id="7667346355482952095">Vrátený token pravidla je prázdny alebo sa nezhoduje s aktuálnym tokenom</translation> <translation id="7668654391829183341">Neznáme zariadenie</translation> <translation id="7669271284792375604">Útočníci na tomto webe sa vás môžu pokúsiť podvodom presvedčiť, aby ste si nainštalovali programy poškodzujúce vaše prostredie prehliadania (napríklad zmenou domovskej stránky alebo zobrazovaním ďalších reklám na weboch, ktoré navštevujete).</translation> +<translation id="7681101578153515023">Zmeniť vyhľadávač</translation> <translation id="7682287625158474539">Dodacia</translation> +<translation id="7687186412095877299">Doplní do platobných formulárov vaše uložené spôsoby platby</translation> <translation id="7699293099605015246">Články nie sú momentálne k dispozícii</translation> <translation id="7701040980221191251">Žiadne</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Prejsť na stránky <ph name="SITE" /> (nebezpečné)<ph name="END_LINK" /></translation> @@ -989,6 +1002,7 @@ <translation id="7802523362929240268">Web je legitímny</translation> <translation id="780301667611848630">Nie, ďakujem</translation> <translation id="7805768142964895445">Stav</translation> +<translation id="7806344367022510803">Zmeňte nastavenia vyhľadávača v Chrome</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chcete návrh odstrániť z prehliadača Chrome?</translation> <translation id="7815407501681723534">Nájdené výsledky (počet: <ph name="NUMBER_OF_RESULTS" />) pre dopyt „<ph name="SEARCH_STRING" />“: <ph name="SEARCH_RESULTS" /></translation> @@ -1024,6 +1038,7 @@ <translation id="8057711352706143257">Softvér <ph name="SOFTWARE_NAME" /> nie je správne nakonfigurovaný. Tento problém sa zvyčajne odstráni odinštalovaním softvéru <ph name="SOFTWARE_NAME" />. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8079031581361219619">Znova načítať web?</translation> <translation id="8088680233425245692">Článok sa nepodarilo zobraziť.</translation> +<translation id="808894953321890993">Zmeniť heslo</translation> <translation id="8091372947890762290">Aktivácia čaká na server</translation> <translation id="8094917007353911263">Sieť, ktorú používate, môže vyžadovať, aby ste navštívili stránku <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /></translation> <translation id="8103161714697287722">Spôsob platby</translation> @@ -1035,6 +1050,7 @@ <translation id="8184538546369750125">Použiť predvolené všeobecné nastavenie (Povoliť)</translation> <translation id="8191494405820426728">Identifikátor miestneho zlyhania <ph name="CRASH_LOCAL_ID" /></translation> <translation id="8194797478851900357">&Vrátiť späť presunutie</translation> +<translation id="8197543752516192074">Preložiť stránku</translation> <translation id="8201077131113104583">Neplatná webová adresa aktualizácie pre rozšírenie s ID <ph name="EXTENSION_ID" />.</translation> <translation id="8202097416529803614">Súhrn objednávky</translation> <translation id="8211406090763984747">Pripojenie je bezpečné</translation> @@ -1079,6 +1095,7 @@ <translation id="8428213095426709021">Nastavenia</translation> <translation id="8433057134996913067">Táto možnosť vás odhlási z väčšiny webov.</translation> <translation id="8437238597147034694">&Vrátiť späť presunutie</translation> +<translation id="8461694314515752532">Šifrovať synchronizované údaje pomocou vlastnej prístupovej frázy synchronizácie</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kreditná karta}few{# kreditné karty}many{# kreditnej karty}other{# kreditných kariet}}</translation> <translation id="8473863474539038330">Adresy a ďalšie údaje</translation> <translation id="8483780878231876732">Ak chcete používať karty z účtu Google, prihláste sa do Chromu</translation> @@ -1189,6 +1206,7 @@ <translation id="9219103736887031265">Obrázky</translation> <translation id="933712198907837967">Diners Club</translation> <translation id="935608979562296692">VYMAZAŤ FORMULÁR</translation> +<translation id="936602727769022409">Môžete stratiť prístup do účtu Google. Chromium odporúča, aby ste si ihneď zmenili heslo. Zobrazí sa výzva na prihlásenie.</translation> <translation id="939736085109172342">Nový priečinok</translation> <translation id="951104842009476243">Akceptované debetné a predplatené karty</translation> <translation id="962484866189421427">Tento obsah sa môže pokúsiť nainštalovať klamlivé aplikácie vydávajúce sa za iné aplikácie alebo zhromažďovať údaje, ktoré sa dajú použiť na sledovanie vašej osoby. <ph name="BEGIN_LINK" />Napriek tomu zobraziť<ph name="END_LINK" /></translation> @@ -1208,4 +1226,5 @@ <li>skúste sa pripojiť k inej sieti Wi-Fi.</li> </ul></translation> <translation id="997986563973421916">Zo služby Google Pay</translation> +<translation id="998893882640184078">Otvoriť nové okno inkognito v Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index fb79aee..a47f950 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -116,7 +116,7 @@ <translation id="1656489000284462475">పికప్</translation> <translation id="1662550410081243962">చెల్లింపు పద్ధతులను సేవ్ చేసి, పూరించండి</translation> <translation id="1663943134801823270">కార్డ్లు మరియు చిరునామాలు Chrome నుండి పొందినవి. మీరు <ph name="BEGIN_LINK" />సెట్టింగ్లు<ph name="END_LINK" />లో వాటిని నిర్వహించవచ్చు.</translation> -<translation id="1676269943528358898"><ph name="SITE" /> సాధారణంగా మీ సమాచారాన్ని రక్షించడానికి గుప్తీకరణను ఉపయోగిస్తుంది. Google Chrome ఈసారి <ph name="SITE" />కి కనెక్ట్ చేయడానికి ప్రయత్నించినప్పుడు, వెబ్సైట్ అసాధారణ మరియు తప్పు ఆధారాలు అని ప్రతిస్పందించింది. దాడి చేసే వ్యక్తి <ph name="SITE" />గా వ్యవహరించి మోసగించడానికి ప్రయత్నిస్తున్నప్పుడు లేదా Wi-Fi సైన్-ఇన్ స్క్రీన్ కనెక్షన్కు అంతరాయం కలిగించినప్పుడు ఇలా జరగవచ్చు. Google Chrome డేటా వినిమయం సంభవించక ముందే కనెక్షన్ను ఆపివేసినందున మీ సమాచారం ఇప్పటికీ సురక్షితంగానే ఉంది.</translation> +<translation id="1676269943528358898"><ph name="SITE" /> సాధారణంగా మీ సమాచారాన్ని రక్షించడానికి ఎన్క్రిప్షన్ను ఉపయోగిస్తుంది. Google Chrome ఈసారి <ph name="SITE" />కి కనెక్ట్ చేయడానికి ప్రయత్నించినప్పుడు, వెబ్సైట్ అసాధారణ మరియు తప్పు ఆధారాలు అని ప్రతిస్పందించింది. దాడి చేసే వ్యక్తి <ph name="SITE" />గా వ్యవహరించి మోసగించడానికి ప్రయత్నిస్తున్నప్పుడు లేదా Wi-Fi సైన్-ఇన్ స్క్రీన్ కనెక్షన్కు అంతరాయం కలిగించినప్పుడు ఇలా జరగవచ్చు. Google Chrome డేటా వినిమయం సంభవించక ముందే కనెక్షన్ను ఆపివేసినందున మీ సమాచారం ఇప్పటికీ సురక్షితంగానే ఉంది.</translation> <translation id="168841957122794586">సర్వర్ ప్రమాణపత్రం బలహీన క్రిప్టోగ్రాఫిక్ కీని కలిగి ఉంది.</translation> <translation id="1697532407822776718">మీరు సిద్ధంగా ఉన్నారు!</translation> <translation id="1706954506755087368">{1,plural, =1{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం రేపటిది కావచ్చు. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు.}other{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం భవిష్యత్తులో # రోజుల తదుపరిది కావచ్చు. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు.}}</translation> @@ -267,7 +267,7 @@ <translation id="2712173769900027643">అనుమతి అడుగు</translation> <translation id="2720342946869265578">సమీపం</translation> <translation id="2721148159707890343">అభ్యర్థన విజయవంతం అయింది</translation> -<translation id="2728127805433021124">సర్వర్ యొక్క ప్రమాణపత్రం ఒక బలహీనమైన సంతకం అల్గారిథమ్ ఉపయోగించి సంతకం చేయబడింది.</translation> +<translation id="2728127805433021124">సర్వర్ సర్టిఫికెట్ బలహీన సంతకం అల్గారిథమ్ను ఉపయోగించి సంతకం చేయబడింది.</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />కనెక్టివిటీ సమస్య విశ్లేషణలను అమలు చేయడం<ph name="END_LINK" /></translation> <translation id="2738330467931008676">పికప్ చిరునామాను ఎంచుకోండి</translation> <translation id="2740531572673183784">సరే</translation> @@ -353,7 +353,7 @@ <translation id="3305707030755673451"><ph name="TIME" />న మీ సమకాలీకరణ రహస్య పదబంధంతో మీ డేటా గుప్తీకరించబడింది. సమకాలీకరణను ప్రారంభించడానికి దీన్ని నమోదు చేయండి.</translation> <translation id="3320021301628644560">బిల్లింగ్ చిరునామాను జోడించండి</translation> <translation id="3338095232262050444">సురక్షితం</translation> -<translation id="3345135638360864351">ఈ సైట్ని ప్రాప్యత చేయడానికి మీరు చేసిన అభ్యర్థన <ph name="NAME" />కి పంపబడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation> +<translation id="3345135638360864351">ఈ సైట్ని యాక్సెస్ చేయడానికి మీరు చేసిన అభ్యర్థన <ph name="NAME" />కి పంపబడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation> <translation id="3355823806454867987">ప్రాక్సీ సెట్టింగ్లను మార్చు...</translation> <translation id="3361596688432910856">Chrome ఈ కింది సమాచారాన్ని <ph name="BEGIN_EMPHASIS" />సేవ్ చేయదు<ph name="END_EMPHASIS" />: <ph name="BEGIN_LIST" /> @@ -421,7 +421,7 @@ <translation id="372429172604983730">ఈ ఎర్రర్కు దారితీసే అప్లికేషన్లలో యాంటీవైరస్, ఫైర్వాల్ మరియు వెబ్ ఫిల్టరింగ్ లేదా ప్రాక్సీ సాఫ్ట్వేర్ ఉండవచ్చు.</translation> <translation id="3736520371357197498">మీ భద్రతకు వాటిల్లే ఆపదల గురించి మీకు అర్థం అయ్యి ఉంటే, ప్రమాదకరమైన ప్రోగ్రామ్లు తీసివేయబడటానికి ముందే <ph name="BEGIN_LINK" />ఈ అసురక్షితమైన సైట్ను సందర్శించవచ్చు<ph name="END_LINK" />.</translation> <translation id="3739623965217189342">మీరు కాపీ చేసిన లింక్</translation> -<translation id="3744899669254331632">మీరు సందర్శించాలనుకుంటున్న <ph name="SITE" /> వెబ్సైట్ Chromium ప్రాసెస్ చేయలేని చిందరవందరైన ఆధారాలను పంపినందున ప్రస్తుతం దాన్ని సందర్శించలేరు. నెట్వర్క్ లోపాలు మరియు దాడులు సాధారణంగా తాత్కాలికంగా మాత్రమే ఉంటాయి, కాబట్టి ఈ పేజీ బహుశా తర్వాత పని చేయవచ్చు.</translation> +<translation id="3744899669254331632">మీరు సందర్శించాలనుకుంటున్న <ph name="SITE" /> వెబ్సైట్ Chromium ప్రాసెస్ చేయలేని చిందరవందరైన ఆధారాలను పంపినందున ప్రస్తుతం దాన్ని సందర్శించలేరు. నెట్వర్క్ ఎర్రర్లు మరియు దాడులు సాధారణంగా తాత్కాలికంగా మాత్రమే ఉంటాయి, కాబట్టి ఈ పేజీ బహుశా తర్వాత పని చేయవచ్చు.</translation> <translation id="3748148204939282805"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />లోని హ్యాకర్లు మిమ్మల్ని సాఫ్ట్వేర్ ఇన్స్టాల్ చేసే విధంగా లేదా మీ వ్యక్తిగత సమాచారాన్ని (ఉదాహరణకు, పాస్వర్డ్లు, ఫోన్ నంబర్లు లేదా క్రెడిట్ కార్డ్లు) బహిర్గతం చేసే విధంగా మిమ్మల్ని మాయ చేయవచ్చు. <ph name="BEGIN_LEARN_MORE_LINK" />మరింత తెలుసుకోండి<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="375403751935624634">సర్వర్ లోపం వల్ల అనువాదం విఫలమైంది.</translation> <translation id="3759461132968374835">మీకు ఇటీవల నివేదించిన క్రాష్లు లేవు. క్రాష్ నివేదన నిలిపివేసినపుడు ఏర్పడే క్రాష్లు ఇక్కడ కనిపించవు.</translation> @@ -437,7 +437,7 @@ <translation id="3858027520442213535">తేదీ మరియు సమయాన్ని నవీకరించు</translation> <translation id="3884278016824448484">వైరుధ్యమైన పరికరం ఐడెంటిఫైయర్</translation> <translation id="3885155851504623709">పారిష్</translation> -<translation id="3886446263141354045">మీరు ఈ సైట్ను ప్రాప్యత చేయడానికి చేసిన అభ్యర్థన <ph name="NAME" />కి పంపబడింది</translation> +<translation id="3886446263141354045">మీరు ఈ సైట్ను యాక్సెస్ చేయడానికి చేసిన అభ్యర్థన <ph name="NAME" />కి పంపబడింది</translation> <translation id="3890664840433101773">ఇమెయిల్ను జోడించండి</translation> <translation id="3901925938762663762">కార్డ్ గడువు సమయం ముగిసింది</translation> <translation id="3909695131102177774"><ph name="LABEL" /> <ph name="ERROR" /></translation> @@ -518,7 +518,7 @@ <translation id="4356973930735388585">ఈ సైట్లోని దాడి చేసేవారు మీ సమాచారాన్ని (ఉదాహరణకు, ఫోటోలు, పాస్వర్డ్లు, సందేశాలు మరియు క్రెడిట్ కార్డ్లు) దొంగిలించడం కోసం లేదా తొలగించడం కోసం మీ కంప్యూటర్లో ప్రమాదకరమైన ప్రోగ్రామ్లను ఇన్స్టాల్ చేయడానికి ప్రయత్నించవచ్చు.</translation> <translation id="4358461427845829800">చెల్లింపు పద్ధతులను నిర్వహించండి...</translation> <translation id="4372948949327679948">ఆశిస్తున్న <ph name="VALUE_TYPE" /> విలువ.</translation> -<translation id="4377125064752653719"><ph name="DOMAIN" />ను చేరుకోవడానికి మీరు ప్రయత్నించారు, కానీ సర్వర్ అందించిన ప్రమాణపత్రాన్ని దాన్ని జారీ చేసినవారు రద్దు చేసారు. సర్వర్ అందించిన భద్రత ఆధారాలు ఖచ్చితంగా విశ్వసించబడలేదని దీని అర్థం. మీరు దాడి చేసే వారితో కమ్యూనికేట్ చేస్తూ ఉండవచ్చు.</translation> +<translation id="4377125064752653719"><ph name="DOMAIN" />ను చేరుకోవడానికి మీరు ప్రయత్నించారు, కానీ సర్వర్ అందించిన సర్టిఫికెట్ దాన్ని జారీ చేసినవారు రద్దు చేసారు. సర్వర్ అందించిన భద్రత ఆధారాలు ఖచ్చితంగా విశ్వసించబడలేదని దీని అర్థం. మీరు దాడి చేసే వారితో కమ్యూనికేట్ చేస్తూ ఉండవచ్చు.</translation> <translation id="4406896451731180161">శోధన ఫలితాలు</translation> <translation id="4408413947728134509">కుక్కీలు <ph name="NUM_COOKIES" /></translation> <translation id="4415426530740016218">పికప్ చిరునామా</translation> @@ -564,7 +564,7 @@ <translation id="4792143361752574037">సెషన్ ఫైల్లను యాక్సెస్ చేస్తున్నప్పుడు సమస్య ఏర్పడింది. ప్రస్తుతానికి డిస్క్లో సేవ్ చేయడం నిలిపివేయబడింది. దయచేసి మళ్లీ ప్రయత్నించడం కోసం పేజీని తిరిగి లోడ్ చేయండి.</translation> <translation id="4800132727771399293">మీ గడువు ముగింపు తేదీ మరియు CVCని తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి</translation> <translation id="4803924862070940586"><ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation> -<translation id="4807049035289105102">వెబ్సైట్ Google Chrome ప్రాసెస్ చేయలేని, గజిబిజిగా ఉండే ఆధారాలను పంపినందున మీరు ప్రస్తుతం <ph name="SITE" />ని సందర్శించలేరు. నెట్వర్క్ లోపాలు మరియు దాడులు సాధారణంగా తాత్కాలికంగానే ఉంటాయి, కనుక ఈ పేజీ కాసేపటి తర్వాత పని చేసే అవకాశం ఉంది.</translation> +<translation id="4807049035289105102">వెబ్సైట్ Google Chrome ప్రాసెస్ చేయలేని, గజిబిజిగా ఉండే ఆధారాలను పంపినందున మీరు ప్రస్తుతం <ph name="SITE" />ని సందర్శించలేరు. నెట్వర్క్ ఎర్రర్లు మరియు దాడులు సాధారణంగా తాత్కాలికంగానే ఉంటాయి, కనుక ఈ పేజీ కాసేపటి తర్వాత పని చేసే అవకాశం ఉంది.</translation> <translation id="4813512666221746211">నెట్వర్క్ లోపం</translation> <translation id="4816492930507672669">పేజీకి తగినట్లు అమర్చు</translation> <translation id="4850886885716139402">వీక్షణ</translation> @@ -612,7 +612,7 @@ <translation id="5121084798328133320">మీరు నిర్ధారించిన తర్వాత, మీ Google చెల్లింపుల ఖాతా నుండి కార్డ్ వివరాలు ఈ సైట్తో షేర్ చేయబడతాయి.</translation> <translation id="5128122789703661928">ఈ పేరు కలిగిన సెషన్ని తొలగించలేరు.</translation> <translation id="5135404736266831032">చిరునామాలను నిర్వహించండి...</translation> -<translation id="5141240743006678641">మీ Google ఆధారాలతో సమకాలీకరించబడిన పాస్వర్డ్లను గుప్తీకరించండి</translation> +<translation id="5141240743006678641">మీ Google ఆధారాలతో సమకాలీకరించబడిన పాస్వర్డ్లను ఎన్క్రిప్ట్ చేయండి</translation> <translation id="5145883236150621069">విధాన ప్రతిస్పందనలో లోపం కోడ్ ఉంది</translation> <translation id="5159010409087891077">కొత్త అజ్ఞాత విండోలో పేజీని తెరవండి (⇧⌘N)</translation> <translation id="5169827969064885044">మీరు మీ సంస్థ యొక్క ఖాతాకు యాక్సెస్ని కోల్పోవచ్చు లేదా గుర్తింపు చౌర్యానికి గురికావచ్చు. Chrome మీరు ఇప్పుడే మీ పాస్వర్డ్ని మార్చాల్సిందిగా సిఫార్సు చేస్తోంది.</translation> @@ -834,7 +834,7 @@ <translation id="681021252041861472">అవసరమైన ఫీల్డ్</translation> <translation id="6810899417690483278">అనుకూలీకరణ ID</translation> <translation id="6824266427216888781">ప్రాంతాల డేటాను లోడ్ చేయడం విఫలమైంది</translation> -<translation id="6825578344716086703"><ph name="DOMAIN" />ను చేరుకోవడానికి మీరు ప్రయత్నించారు, కానీ సర్వర్ (SHA-1 వంటి) బలహీనమైన సంతకం అల్గారిథమ్ను ఉపయోగించి సంతకం చేసిన ప్రమాణపత్రాన్ని అందించింది. అంటే సర్వర్ అందించిన భద్రత ఆధారాలు నకిలీ కావచ్చు మరియు సర్వర్ మీరు ఊహించిన సర్వర్ కాకపోవచ్చు (మీరు హ్యాకర్తో పరస్పర చర్య చేస్తుండవచ్చు).</translation> +<translation id="6825578344716086703"><ph name="DOMAIN" />ను చేరుకోవడానికి మీరు ప్రయత్నించారు, కానీ సర్వర్ (SHA-1 వంటి) బలహీనమైన సంతకం అల్గారిథమ్ను ఉపయోగించి సంతకం చేసిన సర్టిఫికెట్ను అందించింది. అంటే సర్వర్ అందించిన భద్రత ఆధారాలు నకిలీ కావచ్చు మరియు సర్వర్ మీరు ఊహించిన సర్వర్ కాకపోవచ్చు (మీరు హ్యాకర్తో పరస్పర చర్య చేస్తుండవచ్చు).</translation> <translation id="6831043979455480757">అనువదించు</translation> <translation id="6839929833149231406">ప్రాంతం</translation> <translation id="6852204201400771460">యాప్ను మళ్లీ లోడ్ చేయాలా?</translation> @@ -1169,7 +1169,7 @@ <translation id="9076283476770535406">ఇందులో పెద్దలకు మాత్రమే అనుమతించిన కంటెంట్ ఉండవచ్చు</translation> <translation id="9078964945751709336">మరింత సమాచారం ఆవశ్యకం</translation> <translation id="9080712759204168376">ఆర్డర్ సారాంశం</translation> -<translation id="9103872766612412690"><ph name="SITE" /> సాధారణంగా మీ సమాచారాన్ని రక్షించడానికి గుప్తీకరణను ఉపయోగిస్తుంది. Chromium ఈసారి <ph name="SITE" />కి కనెక్ట్ చేయడానికి ప్రయత్నించినప్పుడు, వెబ్సైట్ అసాధారణ మరియు తప్పు ఆధారాలు అని ప్రతిస్పందించింది. దాడి చేసే వ్యక్తి <ph name="SITE" />గా వ్యవహరించి మోసగించడానికి ప్రయత్నిస్తున్నప్పుడు లేదా Wi-Fi సైన్-ఇన్ స్క్రీన్ కనెక్షన్కు అంతరాయం కలిగించినప్పుడు ఇలా జరగవచ్చు. Chromium ఎలాంటి డేటా వినిమయం సంభవించక ముందే కనెక్షన్ను ఆపివేసినందున మీ సమాచారం ఇప్పటికీ సురక్షితంగానే ఉంది.</translation> +<translation id="9103872766612412690"><ph name="SITE" /> సాధారణంగా మీ సమాచారాన్ని రక్షించడానికి ఎన్క్రిప్షన్ను ఉపయోగిస్తుంది. Chromium ఈసారి <ph name="SITE" />కి కనెక్ట్ చేయడానికి ప్రయత్నించినప్పుడు, వెబ్సైట్ అసాధారణ మరియు తప్పు ఆధారాలు అని ప్రతిస్పందించింది. దాడి చేసే వ్యక్తి <ph name="SITE" />గా వ్యవహరించి మోసగించడానికి ప్రయత్నిస్తున్నప్పుడు లేదా Wi-Fi సైన్-ఇన్ స్క్రీన్ కనెక్షన్కు అంతరాయం కలిగించినప్పుడు ఇలా జరగవచ్చు. Chromium ఎలాంటి డేటా వినిమయం సంభవించక ముందే కనెక్షన్ను ఆపివేసినందున మీ సమాచారం ఇప్పటికీ సురక్షితంగానే ఉంది.</translation> <translation id="9106062320799175032">బిల్లింగ్ చిరునామాను జోడించండి</translation> <translation id="9114524666733003316">కార్డ్ నిర్ధారించబడుతోంది...</translation> <translation id="9128870381267983090">నెట్వర్క్కి కనెక్ట్ చెయ్యి</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 003f1f3..07da04f 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -1071,7 +1071,7 @@ <translation id="8364627913115013041">ไม่ได้ตั้งค่า</translation> <translation id="8368476060205742148">บริการ Google Play</translation> <translation id="8380941800586852976">อันตราย</translation> -<translation id="8381674639488873545">การเรียกเก็บเงินเหล่านี้อาจเกิดขึ้นครั้งเดียวหรือเป็นเกิดขึ้นซ้ำๆ และอาจไม่แสดงอย่างชัดแจ้ง <ph name="BEGIN_LINK" />เปิดเว็บไซต์<ph name="END_LINK" /></translation> +<translation id="8381674639488873545">การเรียกเก็บเงินเหล่านี้อาจเกิดขึ้นครั้งเดียวหรือเกิดขึ้นซ้ำๆ และอาจไม่แสดงอย่างชัดแจ้ง <ph name="BEGIN_LINK" />เปิดเว็บไซต์<ph name="END_LINK" /></translation> <translation id="8382348898565613901">บุ๊กมาร์กที่คุณเข้าชมล่าสุดจะปรากฏที่นี่</translation> <translation id="8398259832188219207">อัปโหลดรายงานข้อขัดข้องเมื่อ <ph name="UPLOAD_TIME" /></translation> <translation id="8412145213513410671">ข้อขัดข้อง (<ph name="CRASH_COUNT" />)</translation>
diff --git a/content/app/strings/translations/content_strings_hi.xtb b/content/app/strings/translations/content_strings_hi.xtb index 16f7078..65b90e9 100644 --- a/content/app/strings/translations/content_strings_hi.xtb +++ b/content/app/strings/translations/content_strings_hi.xtb
@@ -138,6 +138,7 @@ <translation id="5939518447894949180">रीसेट करें</translation> <translation id="5966707198760109579">सप्ताह</translation> <translation id="5987525920412732405">स्पिन बटन</translation> +<translation id="6011459053400940133">वॉल्यूम स्लाइडर</translation> <translation id="6015796118275082299">वर्ष</translation> <translation id="6023896073578205740">सूची बॉक्स</translation> <translation id="6150588977291308318">संदर्भ सूची</translation>
diff --git a/content/browser/devtools/devtools_url_interceptor_request_job.cc b/content/browser/devtools/devtools_url_interceptor_request_job.cc index 45fbecb0..d5682d1 100644 --- a/content/browser/devtools/devtools_url_interceptor_request_job.cc +++ b/content/browser/devtools/devtools_url_interceptor_request_job.cc
@@ -17,6 +17,7 @@ #include "net/base/completion_once_callback.h" #include "net/base/elements_upload_data_stream.h" #include "net/base/io_buffer.h" +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/base/upload_bytes_element_reader.h" #include "net/base/upload_element_reader.h" #include "net/cert/cert_status_flags.h" @@ -27,6 +28,7 @@ #include "net/traffic_annotation/network_traffic_annotation.h" #include "net/url_request/url_request_context.h" #include "third_party/blink/public/platform/resource_request_blocked_reason.h" + namespace { static const int kInitialBufferSize = 4096; static const int kMaxBufferSize = IPC::Channel::kMaximumMessageSize / 4; @@ -604,10 +606,47 @@ net::CookieOptions options; options.set_include_httponly(); - if (request()->attach_same_site_cookies()) { - options.set_same_site_cookie_mode( - net::CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX); + // The below is a copy of the logic in URLRequestHttpJob + + // Set SameSiteCookieMode according to the rules laid out in + // https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site: + // + // * Include both "strict" and "lax" same-site cookies if the request's + // |url|, |initiator|, and |site_for_cookies| all have the same + // registrable domain. Note: this also covers the case of a request + // without an initiator (only happens for browser-initiated main frame + // navigations). + // + // * Include only "lax" same-site cookies if the request's |URL| and + // |site_for_cookies| have the same registrable domain, _and_ the + // request's |method| is "safe" ("GET" or "HEAD"). + // + // Note that this will generally be the case only for cross-site requests + // which target a top-level browsing context. + // + // * Include both "strict" and "lax" same-site cookies if the request is + // tagged with a flag allowing it. + // Note that this can be the case for requests initiated by extensions, + // which need to behave as though they are made by the document itself, + // but appear like cross-site ones. + // + // * Otherwise, do not include same-site cookies. + using namespace net::registry_controlled_domains; + if (SameDomainOrHost(request()->url(), request()->site_for_cookies(), + INCLUDE_PRIVATE_REGISTRIES)) { + if (!request()->initiator() || + SameDomainOrHost(request()->url(), + request()->initiator().value().GetURL(), + INCLUDE_PRIVATE_REGISTRIES) || + request()->attach_same_site_cookies()) { + options.set_same_site_cookie_mode( + net::CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX); + } else if (net::HttpUtil::IsMethodSafe(request()->method())) { + options.set_same_site_cookie_mode( + net::CookieOptions::SameSiteCookieMode::INCLUDE_LAX); + } } + store->GetCookieListWithOptionsAsync( request_details_.url, options, base::BindOnce(&DevToolsURLInterceptorRequestJob::StartWithCookies,
diff --git a/content/browser/devtools/devtools_url_loader_interceptor.cc b/content/browser/devtools/devtools_url_loader_interceptor.cc index af405769..67d3f3dd 100644 --- a/content/browser/devtools/devtools_url_loader_interceptor.cc +++ b/content/browser/devtools/devtools_url_loader_interceptor.cc
@@ -3,21 +3,27 @@ // found in the LICENSE file. #include "content/browser/devtools/devtools_url_loader_interceptor.h" +#include "base/barrier_closure.h" #include "base/base64.h" #include "base/no_destructor.h" #include "base/strings/stringprintf.h" #include "base/task/post_task.h" #include "base/time/time.h" #include "base/unguessable_token.h" +#include "content/browser/devtools/protocol/network.h" #include "content/browser/devtools/protocol/network_handler.h" #include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/loader/download_utils_impl.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/storage_partition.h" #include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/system/data_pipe_drainer.h" +#include "net/base/load_flags.h" #include "net/base/mime_sniffer.h" +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/http/http_util.h" +#include "net/url_request/redirect_util.h" #include "net/url_request/url_request.h" #include "services/network/public/cpp/resource_request_body.h" #include "third_party/blink/public/platform/resource_request_blocked_reason.h" @@ -206,8 +212,13 @@ Response InnerContinueRequest(std::unique_ptr<Modifications> modifications); Response ProcessAuthResponse(AuthChallengeResponse* auth_challenge_response); - Response ProcessResponseOverride(const std::string& response); - Response ProcessRedirectByClient(const GURL& redirect_url); + Response ProcessResponseOverride(std::string response); + void ProcessRedirectByClient(const GURL& redirect_url); + void ProcessSetCookies(const net::HttpResponseHeaders& response_headers, + base::OnceClosure callback); + void SendResponseAfterCookiesSet(const std::string& response, + int header_size, + size_t body_size); void SendResponse(const base::StringPiece& body); void ApplyModificationsToRequest( std::unique_ptr<Modifications> modifications); @@ -219,6 +230,12 @@ std::unique_ptr<InterceptedRequestInfo> BuildRequestInfo( const network::ResourceResponseHead* head); void NotifyClient(std::unique_ptr<InterceptedRequestInfo> request_info); + void FetchCookies( + base::OnceCallback<void(const std::vector<net::CanonicalCookie>&)> + callback); + void NotifyClientWithCookies( + std::unique_ptr<InterceptedRequestInfo> request_info, + const std::vector<net::CanonicalCookie>& cookie_list); void ResponseBodyComplete(); @@ -300,6 +317,8 @@ pending_auth_callback_; TakeResponseBodyPipeCallback pending_response_body_pipe_callback_; + base::WeakPtrFactory<InterceptionJob> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(InterceptionJob); }; @@ -315,6 +334,10 @@ entry.second->Detach(); } + void SetCookieManager(network::mojom::CookieManagerPtrInfo cookie_manager) { + cookie_manager_.Bind(std::move(cookie_manager)); + } + void CreateJob(const base::UnguessableToken& frame_token, int32_t process_id, bool is_download, @@ -403,7 +426,12 @@ jobs_.emplace(id, job); } + network::mojom::CookieManagerPtr::Proxy* GetCookieManager() { + return cookie_manager_.get(); + } + std::map<std::string, InterceptionJob*> jobs_; + network::mojom::CookieManagerPtr cookie_manager_; RequestInterceptedCallback request_intercepted_callback_; std::vector<DevToolsNetworkInterceptor::Pattern> patterns_; @@ -540,7 +568,7 @@ } DevToolsURLLoaderInterceptor::DevToolsURLLoaderInterceptor( - FrameTreeNode* const local_root, + FrameTreeNode* local_root, RequestInterceptedCallback callback) : local_root_(local_root), enabled_(false), @@ -548,7 +576,17 @@ base::OnTaskRunnerDeleter( base::CreateSingleThreadTaskRunnerWithTraits( {BrowserThread::IO}))), - weak_impl_(impl_->AsWeakPtr()) {} + weak_impl_(impl_->AsWeakPtr()) { + network::mojom::CookieManagerPtrInfo cookie_manager; + StoragePartition* storage_partition = + local_root->current_frame_host()->GetProcess()->GetStoragePartition(); + storage_partition->GetNetworkContext()->GetCookieManager( + mojo::MakeRequest(&cookie_manager)); + base::PostTaskWithTraits( + FROM_HERE, {BrowserThread::IO}, + base::BindOnce(&Impl::SetCookieManager, base::Unretained(impl_.get()), + std::move(cookie_manager))); +} DevToolsURLLoaderInterceptor::~DevToolsURLLoaderInterceptor() { UpdateSubresourceLoaderFactories(); @@ -656,7 +694,8 @@ target_factory_(std::move(target_factory)), state_(kNotStarted), waiting_for_resolution_(false), - redirect_count_(0) { + redirect_count_(0), + weak_factory_(this) { UpdateIdAndRegister(); const network::ResourceRequest& request = create_loader_params_->request; stage_ = interceptor_->GetInterceptionStage( @@ -799,7 +838,7 @@ } if (modifications->raw_response) - return ProcessResponseOverride(*modifications->raw_response); + return ProcessResponseOverride(std::move(*modifications->raw_response)); if (state_ == State::kFollowRedirect) { if (modifications->modified_url.isJust()) { @@ -821,8 +860,11 @@ auto* headers = response_metadata_->head.headers.get(); headers->RemoveHeader("location"); headers->AddHeader("location: " + location); - return ProcessRedirectByClient( - create_loader_params_->request.url.Resolve(location)); + GURL redirect_url = create_loader_params_->request.url.Resolve(location); + if (!redirect_url.is_valid()) + return Response::Error("Invalid modified URL"); + ProcessRedirectByClient(redirect_url); + return Response::OK(); } client_->OnReceiveRedirect(*response_metadata_->redirect_info, response_metadata_->head); @@ -918,7 +960,7 @@ return Response::OK(); } -Response InterceptionJob::ProcessResponseOverride(const std::string& response) { +Response InterceptionJob::ProcessResponseOverride(std::string response) { CancelRequest(); std::string raw_headers; @@ -956,13 +998,6 @@ head->request_start = start_ticks_; head->response_start = base::TimeTicks::Now(); - std::string location; - if (head->headers->IsRedirect(&location)) { - GURL redirect_url = create_loader_params_->request.url.Resolve(location); - if (redirect_url.is_valid()) - return ProcessRedirectByClient(redirect_url); - } - response_metadata_->transfer_size = body_size; response_metadata_->status.completion_time = base::TimeTicks::Now(); @@ -970,13 +1005,68 @@ response_metadata_->status.encoded_body_length = body_size; response_metadata_->status.decoded_body_length = body_size; - SendResponse(base::StringPiece(response.data() + header_size, body_size)); + base::OnceClosure continue_after_cookies_set; + std::string location; + if (head->headers->IsRedirect(&location)) { + GURL redirect_url = create_loader_params_->request.url.Resolve(location); + if (redirect_url.is_valid()) { + continue_after_cookies_set = + base::BindOnce(&InterceptionJob::ProcessRedirectByClient, + weak_factory_.GetWeakPtr(), std::move(redirect_url)); + } + } + if (!continue_after_cookies_set) { + continue_after_cookies_set = + base::BindOnce(&InterceptionJob::SendResponseAfterCookiesSet, + weak_factory_.GetWeakPtr(), std::move(response), + header_size, body_size); + } + ProcessSetCookies(*head->headers, std::move(continue_after_cookies_set)); + return Response::OK(); } -Response InterceptionJob::ProcessRedirectByClient(const GURL& redirect_url) { - if (!redirect_url.is_valid()) - return Response::Error("Invalid redirect URL in overriden headers"); +void InterceptionJob::SendResponseAfterCookiesSet(const std::string& response, + int header_size, + size_t body_size) { + SendResponse(base::StringPiece(response.data() + header_size, body_size)); +} + +void InterceptionJob::ProcessSetCookies(const net::HttpResponseHeaders& headers, + base::OnceClosure callback) { + if (create_loader_params_->request.load_flags & + net::LOAD_DO_NOT_SAVE_COOKIES) { + std::move(callback).Run(); + return; + } + + const base::StringPiece name("Set-Cookie"); + std::string cookie_line; + size_t iter = 0; + net::CookieOptions options; + options.set_include_httponly(); + std::vector<std::unique_ptr<net::CanonicalCookie>> cookies; + base::Time response_date; + if (headers.GetDateValue(&response_date)) + options.set_server_time(response_date); + base::Time now = base::Time::Now(); + while (headers.EnumerateHeader(&iter, name, &cookie_line)) { + std::unique_ptr<net::CanonicalCookie> cookie = net::CanonicalCookie::Create( + create_loader_params_->request.url, cookie_line, now, options); + if (cookie) + cookies.emplace_back(std::move(cookie)); + } + auto on_cookie_set = base::BindRepeating( + [](base::RepeatingClosure closure, bool) { closure.Run(); }, + base::BarrierClosure(cookies.size(), std::move(callback))); + for (auto& cookie : cookies) { + interceptor_->GetCookieManager()->SetCanonicalCookie(*cookie, true, true, + on_cookie_set); + } +} + +void InterceptionJob::ProcessRedirectByClient(const GURL& redirect_url) { + DCHECK(redirect_url.is_valid()); const net::HttpResponseHeaders& headers = *response_metadata_->head.headers; const network::ResourceRequest& request = create_loader_params_->request; @@ -997,7 +1087,6 @@ client_->OnReceiveRedirect(*response_metadata_->redirect_info, response_metadata_->head); - return Response::OK(); } void InterceptionJob::SendResponse(const base::StringPiece& body) { @@ -1070,9 +1159,6 @@ const network::ResourceResponseHead* head) { auto result = std::make_unique<InterceptedRequestInfo>(); result->interception_id = current_id_; - result->network_request = - protocol::NetworkHandler::CreateRequestFromResourceRequest( - create_loader_params_->request); result->frame_id = frame_token_; ResourceType resource_type = static_cast<ResourceType>(create_loader_params_->request.resource_type); @@ -1099,8 +1185,83 @@ return result; } +void InterceptionJob::FetchCookies( + base::OnceCallback<void(const std::vector<net::CanonicalCookie>&)> + callback) { + if (create_loader_params_->request.load_flags & + net::LOAD_DO_NOT_SEND_COOKIES) { + std::move(callback).Run({}); + return; + } + net::CookieOptions options; + options.set_include_httponly(); + options.set_do_not_update_access_time(); + + const network::ResourceRequest& request = create_loader_params_->request; + + // The below is a copy of the logic in URLRequestHttpJob + + // Set SameSiteCookieMode according to the rules laid out in + // https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site: + // + // * Include both "strict" and "lax" same-site cookies if the request's + // |url|, |initiator|, and |site_for_cookies| all have the same + // registrable domain. Note: this also covers the case of a request + // without an initiator (only happens for browser-initiated main frame + // navigations). + // + // * Include only "lax" same-site cookies if the request's |URL| and + // |site_for_cookies| have the same registrable domain, _and_ the + // request's |method| is "safe" ("GET" or "HEAD"). + // + // Note that this will generally be the case only for cross-site requests + // which target a top-level browsing context. + // + // * Include both "strict" and "lax" same-site cookies if the request is + // tagged with a flag allowing it. + // Note that this can be the case for requests initiated by extensions, + // which need to behave as though they are made by the document itself, + // but appear like cross-site ones. + // + // * Otherwise, do not include same-site cookies. + using namespace net::registry_controlled_domains; + if (SameDomainOrHost(request.url, request.site_for_cookies, + INCLUDE_PRIVATE_REGISTRIES)) { + if (!request.request_initiator || + SameDomainOrHost(request.url, + request.request_initiator.value().GetURL(), + INCLUDE_PRIVATE_REGISTRIES) || + request.attach_same_site_cookies) { + options.set_same_site_cookie_mode( + net::CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX); + } else if (net::HttpUtil::IsMethodSafe(request.method)) { + options.set_same_site_cookie_mode( + net::CookieOptions::SameSiteCookieMode::INCLUDE_LAX); + } + } + interceptor_->GetCookieManager()->GetCookieList(request.url, options, + std::move(callback)); +} + void InterceptionJob::NotifyClient( std::unique_ptr<InterceptedRequestInfo> request_info) { + FetchCookies(base::BindOnce(&InterceptionJob::NotifyClientWithCookies, + weak_factory_.GetWeakPtr(), + std::move(request_info))); +} + +void InterceptionJob::NotifyClientWithCookies( + std::unique_ptr<InterceptedRequestInfo> request_info, + const std::vector<net::CanonicalCookie>& cookie_list) { + if (!interceptor_) + return; + std::string cookie_line; + if (!cookie_list.empty()) + cookie_line = net::CanonicalCookie::BuildCookieLine(cookie_list); + request_info->network_request = + protocol::NetworkHandler::CreateRequestFromResourceRequest( + create_loader_params_->request, cookie_line); + waiting_for_resolution_ = true; base::PostTaskWithTraits( FROM_HERE, {BrowserThread::UI}, @@ -1126,6 +1287,14 @@ network::ResourceRequest* request = &create_loader_params_->request; const net::RedirectInfo& info = *response_metadata_->redirect_info; + + bool clear_body = false; + net::RedirectUtil::UpdateHttpRequest( + request->url, request->method, info, + base::nullopt /* modified_request_headers */, &request->headers, + &clear_body); + if (clear_body) + request->request_body = nullptr; request->method = info.new_method; request->url = info.new_url; request->site_for_cookies = info.new_site_for_cookies;
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index 1ba2c301..b0f95860 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -1938,7 +1938,8 @@ // static std::unique_ptr<Network::Request> NetworkHandler::CreateRequestFromResourceRequest( - const network::ResourceRequest& request) { + const network::ResourceRequest& request, + const std::string& cookie_line) { std::unique_ptr<DictionaryValue> headers_dict(DictionaryValue::create()); for (net::HttpRequestHeaders::Iterator it(request.headers); it.GetNext();) headers_dict->setString(it.name(), it.value()); @@ -1946,6 +1947,9 @@ headers_dict->setString(net::HttpRequestHeaders::kReferer, request.referrer.spec()); } + if (!cookie_line.empty()) + headers_dict->setString(net::HttpRequestHeaders::kCookie, cookie_line); + std::string url_fragment; std::unique_ptr<protocol::Network::Request> request_object = Network::Request::Create()
diff --git a/content/browser/devtools/protocol/network_handler.h b/content/browser/devtools/protocol/network_handler.h index e83b50c..10933d2 100644 --- a/content/browser/devtools/protocol/network_handler.h +++ b/content/browser/devtools/protocol/network_handler.h
@@ -177,7 +177,8 @@ static std::string ExtractFragment(const GURL& url, std::string* fragment); static std::unique_ptr<Network::Request> CreateRequestFromResourceRequest( - const network::ResourceRequest& request); + const network::ResourceRequest& request, + const std::string& cookie_line); static std::unique_ptr<Network::Request> CreateRequestFromURLRequest( const net::URLRequest* request, const std::string& cookie);
diff --git a/content/browser/devtools/protocol_string.cc b/content/browser/devtools/protocol_string.cc index 8287a17..b96f778 100644 --- a/content/browser/devtools/protocol_string.cc +++ b/content/browser/devtools/protocol_string.cc
@@ -4,6 +4,8 @@ #include "content/browser/devtools/protocol_string.h" +#include <utility> +#include "base/base64.h" #include "base/json/json_reader.h" #include "base/memory/ptr_util.h" #include "base/strings/string16.h" @@ -164,5 +166,55 @@ string_.reserve(capacity); } +Binary::Binary() : bytes_(new base::RefCountedBytes) {} +Binary::Binary(const Binary& binary) : bytes_(binary.bytes_) {} +Binary::Binary(scoped_refptr<base::RefCountedMemory> bytes) : bytes_(bytes) {} +Binary::~Binary() {} + +String Binary::toBase64() const { + std::string encoded; + base::Base64Encode( + base::StringPiece(reinterpret_cast<const char*>(bytes_->front()), + bytes_->size()), + &encoded); + return encoded; +} + +// static +Binary Binary::fromBase64(const String& base64, bool* success) { + std::string decoded; + *success = base::Base64Decode(base::StringPiece(base64), &decoded); + if (*success) { + return Binary::fromString(std::move(decoded)); + } + return Binary(); +} + +// static +Binary Binary::fromRefCounted(scoped_refptr<base::RefCountedMemory> memory) { + return Binary(memory); +} + +// static +Binary Binary::fromVector(std::vector<uint8_t>&& data) { + return Binary(base::RefCountedBytes::TakeVector(&data)); +} + +// static +Binary Binary::fromVector(const std::vector<uint8_t>& data) { + std::vector<uint8_t> copied_data(data); + return Binary(base::RefCountedBytes::TakeVector(&copied_data)); +} + +// static +Binary Binary::fromString(std::string&& data) { + return Binary(base::RefCountedString::TakeString(&data)); +} + +// static +Binary Binary::fromString(const std::string& data) { + std::string copied_data(data); + return Binary(base::RefCountedString::TakeString(&copied_data)); +} } // namespace protocol } // namespace content
diff --git a/content/browser/devtools/protocol_string.h b/content/browser/devtools/protocol_string.h index 75d7b79..fb43a8b 100644 --- a/content/browser/devtools/protocol_string.h +++ b/content/browser/devtools/protocol_string.h
@@ -2,14 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_DEVTOOLS_PROTOCOL_STRING_H -#define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_STRING_H +#ifndef CONTENT_BROWSER_DEVTOOLS_PROTOCOL_STRING_H_ +#define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_STRING_H_ #include <memory> #include <string> +#include <vector> #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ref_counted_memory.h" #include "base/strings/string_number_conversions.h" #include "content/common/content_export.h" @@ -85,6 +87,30 @@ static std::unique_ptr<protocol::Value> parseJSON(const String&); }; +// A read-only sequence of uninterpreted bytes with reference-counted storage. +class CONTENT_EXPORT Binary { + public: + Binary(const Binary&); + Binary(); + ~Binary(); + + const uint8_t* data() const { return bytes_->front(); } + size_t size() const { return bytes_->size(); } + + String toBase64() const; + + static Binary fromBase64(const String& base64, bool* success); + static Binary fromRefCounted(scoped_refptr<base::RefCountedMemory> memory); + static Binary fromVector(std::vector<uint8_t>&& data); + static Binary fromVector(const std::vector<uint8_t>& data); + static Binary fromString(std::string&& data); + static Binary fromString(const std::string& data); + + private: + explicit Binary(scoped_refptr<base::RefCountedMemory> bytes); + scoped_refptr<base::RefCountedMemory> bytes_; +}; + std::unique_ptr<protocol::Value> toProtocolValue( const base::Value* value, int depth); std::unique_ptr<base::Value> toBaseValue(protocol::Value* value, int depth); @@ -92,4 +118,4 @@ } // namespace protocol } // namespace content -#endif // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_STRING_H +#endif // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_STRING_H_
diff --git a/content/browser/devtools/protocol_unittest.cc b/content/browser/devtools/protocol_unittest.cc new file mode 100644 index 0000000..e3801e3f --- /dev/null +++ b/content/browser/devtools/protocol_unittest.cc
@@ -0,0 +1,59 @@ +// 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 "content/browser/devtools/protocol_string.h" + +#include <vector> +#include "testing/gtest/include/gtest/gtest.h" + +namespace content { +namespace protocol { +namespace { +TEST(ProtocolBinaryTest, base64EmptyArgs) { + EXPECT_EQ(protocol::String(), Binary().toBase64()); + + bool success = false; + Binary decoded = Binary::fromBase64("", &success); + EXPECT_TRUE(success); + EXPECT_EQ( + std::vector<uint8_t>(), + std::vector<uint8_t>(decoded.data(), decoded.data() + decoded.size())); +} + +TEST(ProtocolStringTest, AllBytesBase64Roundtrip) { + std::vector<uint8_t> all_bytes; + for (int ii = 0; ii < 255; ++ii) + all_bytes.push_back(ii); + Binary binary = Binary::fromVector(all_bytes); + bool success = false; + Binary decoded = Binary::fromBase64(binary.toBase64(), &success); + EXPECT_TRUE(success); + std::vector<uint8_t> decoded_bytes(decoded.data(), + decoded.data() + decoded.size()); + EXPECT_EQ(all_bytes, decoded_bytes); +} + +TEST(ProtocolStringTest, HelloWorldBase64Roundtrip) { + const char* kMsg = "Hello, world."; + std::vector<uint8_t> msg(kMsg, kMsg + strlen(kMsg)); + EXPECT_EQ(strlen(kMsg), msg.size()); + + protocol::String encoded = Binary::fromVector(msg).toBase64(); + EXPECT_EQ("SGVsbG8sIHdvcmxkLg==", encoded); + bool success = false; + Binary decoded_binary = Binary::fromBase64(encoded, &success); + EXPECT_TRUE(success); + std::vector<uint8_t> decoded(decoded_binary.data(), + decoded_binary.data() + decoded_binary.size()); + EXPECT_EQ(msg, decoded); +} + +TEST(ProtocolBinaryTest, InvalidBase64Decode) { + bool success = true; + Binary binary = Binary::fromBase64("This is not base64.", &success); + EXPECT_FALSE(success); +} +} // namespace +} // namespace protocol +} // namespace content
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index a0220133..18afe87c 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -23,7 +23,6 @@ #include "base/task/post_task.h" #include "build/build_config.h" #include "components/download/database/in_progress/download_entry.h" -#include "components/download/database/in_progress/in_progress_cache_impl.h" #include "components/download/public/common/download_create_info.h" #include "components/download/public/common/download_features.h" #include "components/download/public/common/download_file.h"
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index fa6bd70..bce01d4f 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -248,6 +248,44 @@ .WillRepeatedly(Return(download_id)); EXPECT_CALL(*result, GetGuid()) .WillRepeatedly(ReturnRefOfCopy(base::GenerateGUID())); + EXPECT_CALL(*result, GetUrlChain()) + .WillRepeatedly(ReturnRefOfCopy(std::vector<GURL>())); + EXPECT_CALL(*result, GetReferrerUrl()) + .WillRepeatedly(ReturnRefOfCopy(GURL())); + EXPECT_CALL(*result, GetTabUrl()).WillRepeatedly(ReturnRefOfCopy(GURL())); + EXPECT_CALL(*result, GetTabReferrerUrl()) + .WillRepeatedly(ReturnRefOfCopy(GURL())); + EXPECT_CALL(*result, GetETag()) + .WillRepeatedly(ReturnRefOfCopy(std::string())); + EXPECT_CALL(*result, GetLastModifiedTime()) + .WillRepeatedly(ReturnRefOfCopy(std::string())); + EXPECT_CALL(*result, GetMimeType()).WillRepeatedly(Return(std::string())); + EXPECT_CALL(*result, GetOriginalMimeType()) + .WillRepeatedly(Return(std::string())); + EXPECT_CALL(*result, GetTotalBytes()).WillRepeatedly(Return(0)); + EXPECT_CALL(*result, GetFullPath()) + .WillRepeatedly( + ReturnRefOfCopy(base::FilePath(FILE_PATH_LITERAL("foo")))); + EXPECT_CALL(*result, GetTargetFilePath()) + .WillRepeatedly( + ReturnRefOfCopy(base::FilePath(FILE_PATH_LITERAL("foo")))); + EXPECT_CALL(*result, GetReceivedBytes()).WillRepeatedly(Return(0)); + EXPECT_CALL(*result, GetStartTime()).WillRepeatedly(Return(base::Time())); + EXPECT_CALL(*result, GetEndTime()).WillRepeatedly(Return(base::Time())); + EXPECT_CALL(*result, GetReceivedSlices()) + .WillRepeatedly(ReturnRefOfCopy( + std::vector<download::DownloadItem::ReceivedSlice>())); + EXPECT_CALL(*result, GetHash()) + .WillRepeatedly(ReturnRefOfCopy(std::string())); + EXPECT_CALL(*result, GetState()) + .WillRepeatedly(Return(download::DownloadItem::IN_PROGRESS)); + EXPECT_CALL(*result, GetDangerType()) + .WillRepeatedly(Return(download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)); + EXPECT_CALL(*result, GetLastReason()) + .WillRepeatedly(Return(download::DOWNLOAD_INTERRUPT_REASON_NONE)); + EXPECT_CALL(*result, IsPaused()).WillRepeatedly(Return(false)); + EXPECT_CALL(*result, IsTemporary()).WillRepeatedly(Return(false)); + if (is_download_started_) { EXPECT_CALL(*result, RemoveObserver(_)); EXPECT_CALL(*result, AddObserver(_));
diff --git a/content/browser/download/download_utils.cc b/content/browser/download/download_utils.cc index 89d3af0..491f42c 100644 --- a/content/browser/download/download_utils.cc +++ b/content/browser/download/download_utils.cc
@@ -10,7 +10,6 @@ #include "base/strings/stringprintf.h" #include "base/task/post_task.h" #include "components/download/database/in_progress/download_entry.h" -#include "components/download/database/in_progress/in_progress_cache.h" #include "components/download/public/common/download_create_info.h" #include "components/download/public/common/download_interrupt_reasons_utils.h" #include "components/download/public/common/download_save_info.h"
diff --git a/content/browser/renderer_host/input/fling_browsertest.cc b/content/browser/renderer_host/input/fling_browsertest.cc index 14afc422..06c8e27 100644 --- a/content/browser/renderer_host/input/fling_browsertest.cc +++ b/content/browser/renderer_host/input/fling_browsertest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "build/build_config.h" #include "content/browser/renderer_host/input/synthetic_smooth_scroll_gesture.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/test/browser_test_utils.h" @@ -74,6 +75,11 @@ shell()->web_contents()->GetRenderViewHost()->GetWidget()); } + void SynchronizeThreads() { + MainThreadFrameObserver observer(GetWidgetHost()); + observer.Wait(); + } + void LoadURL(const std::string& page_data) { const GURL data_url("data:text/html," + page_data); NavigateToURL(shell(), data_url); @@ -84,25 +90,29 @@ base::string16 ready_title(base::ASCIIToUTF16("ready")); TitleWatcher watcher(shell()->web_contents(), ready_title); ignore_result(watcher.WaitAndGetTitle()); - - MainThreadFrameObserver main_thread_sync(host); - main_thread_sync.Wait(); + SynchronizeThreads(); } void LoadPageWithOOPIF() { // navigate main frame to URL. GURL main_url(embedded_test_server()->GetURL( - "a.com", "/frame_tree/page_with_positioned_frame.html")); + "a.com", "/frame_tree/scrollable_page_with_positioned_frame.html")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); - // Navigate oopif to URL. FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) ->GetFrameTree() ->root(); ASSERT_EQ(1U, root->child_count()); + + // Navigate oopif to URL. FrameTreeNode* iframe_node = root->child_at(0); GURL iframe_url(embedded_test_server()->GetURL("b.com", "/tall_page.html")); - NavigateFrameToURL(iframe_node, iframe_url); + { + RenderFrameDeletedObserver deleted_observer( + iframe_node->current_frame_host()); + NavigateFrameToURL(iframe_node, iframe_url); + deleted_observer.WaitUntilDeleted(); + } WaitForHitTestDataOrChildSurfaceReady(iframe_node->current_frame_host()); FrameTreeVisualizer visualizer; @@ -119,17 +129,29 @@ iframe_node->current_frame_host()->GetRenderWidgetHost()->GetView()); } - void SimulateTouchscreenFling(RenderWidgetHostImpl* render_widget_host) { + void SimulateTouchscreenFling( + RenderWidgetHostImpl* render_widget_host, + RenderWidgetHostImpl* parent_render_widget_host = nullptr, + const gfx::Vector2dF& fling_velocity = gfx::Vector2dF(0.f, -2000.f)) { DCHECK(render_widget_host); - // Send a GSB to start scrolling sequence. + // Send a GSB to start scrolling sequence. In case of scroll bubbling wait + // for the parent to receive the GSB before sending the GFS. + auto input_msg_watcher = + parent_render_widget_host + ? std::make_unique<InputMsgWatcher>( + parent_render_widget_host, + blink::WebInputEvent::kGestureScrollBegin) + : std::make_unique<InputMsgWatcher>( + render_widget_host, + blink::WebInputEvent::kGestureScrollBegin); blink::WebGestureEvent gesture_scroll_begin( blink::WebGestureEvent::kGestureScrollBegin, blink::WebInputEvent::kNoModifiers, ui::EventTimeForNow()); gesture_scroll_begin.SetSourceDevice(blink::kWebGestureDeviceTouchscreen); gesture_scroll_begin.data.scroll_begin.delta_hint_units = blink::WebGestureEvent::ScrollUnits::kPrecisePixels; - gesture_scroll_begin.data.scroll_begin.delta_x_hint = 0.f; - gesture_scroll_begin.data.scroll_begin.delta_y_hint = -5.f; + gesture_scroll_begin.data.scroll_begin.delta_x_hint = fling_velocity.x(); + gesture_scroll_begin.data.scroll_begin.delta_y_hint = fling_velocity.y(); const gfx::PointF scroll_location_in_widget(1, 1); const gfx::PointF scroll_location_in_root = child_view_ ? child_view_->TransformPointToRootCoordSpaceF( @@ -142,26 +164,39 @@ gesture_scroll_begin.SetPositionInWidget(scroll_location_in_widget); gesture_scroll_begin.SetPositionInScreen(scroll_location_in_screen); render_widget_host->ForwardGestureEvent(gesture_scroll_begin); + input_msg_watcher->GetAckStateWaitIfNecessary(); // Send a GFS. blink::WebGestureEvent gesture_fling_start( blink::WebGestureEvent::kGestureFlingStart, blink::WebInputEvent::kNoModifiers, ui::EventTimeForNow()); gesture_fling_start.SetSourceDevice(blink::kWebGestureDeviceTouchscreen); - gesture_fling_start.data.fling_start.velocity_x = 0.f; - gesture_fling_start.data.fling_start.velocity_y = -2000.f; + gesture_fling_start.data.fling_start.velocity_x = fling_velocity.x(); + gesture_fling_start.data.fling_start.velocity_y = fling_velocity.y(); gesture_fling_start.SetPositionInWidget(scroll_location_in_widget); gesture_fling_start.SetPositionInScreen(scroll_location_in_screen); render_widget_host->ForwardGestureEvent(gesture_fling_start); } - void SimulateTouchpadFling(RenderWidgetHostImpl* render_widget_host) { + void SimulateTouchpadFling( + RenderWidgetHostImpl* render_widget_host, + RenderWidgetHostImpl* parent_render_widget_host = nullptr, + const gfx::Vector2dF& fling_velocity = gfx::Vector2dF(0.f, -2000.f)) { DCHECK(render_widget_host); - // Send a wheel event to start scrolling sequence. - auto input_msg_watcher = std::make_unique<InputMsgWatcher>( - GetWidgetHost(), blink::WebInputEvent::kMouseWheel); + // Send a wheel event to start scrolling sequence. In case of scroll + // bubbling wait for the parent to receive the GSB before sending the GFS. + auto input_msg_watcher = + parent_render_widget_host + ? std::make_unique<InputMsgWatcher>( + parent_render_widget_host, + blink::WebInputEvent::kGestureScrollBegin) + : std::make_unique<InputMsgWatcher>( + render_widget_host, + blink::WebInputEvent::kGestureScrollBegin); blink::WebMouseWheelEvent wheel_event = - SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, -53, 0, true); + SyntheticWebMouseWheelEventBuilder::Build( + 10, 10, fling_velocity.x() / 1000, fling_velocity.y() / 1000, 0, + true); wheel_event.phase = blink::WebMouseWheelEvent::kPhaseBegan; const gfx::PointF position_in_widget(1, 1); const gfx::PointF position_in_root = @@ -175,15 +210,15 @@ wheel_event.SetPositionInWidget(position_in_widget); wheel_event.SetPositionInScreen(position_in_screen); render_widget_host->ForwardWheelEvent(wheel_event); - input_msg_watcher->WaitForAck(); + input_msg_watcher->GetAckStateWaitIfNecessary(); // Send a GFS. blink::WebGestureEvent gesture_fling_start( blink::WebGestureEvent::kGestureFlingStart, blink::WebInputEvent::kNoModifiers, ui::EventTimeForNow()); gesture_fling_start.SetSourceDevice(blink::kWebGestureDeviceTouchpad); - gesture_fling_start.data.fling_start.velocity_x = 0.f; - gesture_fling_start.data.fling_start.velocity_y = -2000.f; + gesture_fling_start.data.fling_start.velocity_x = fling_velocity.x(); + gesture_fling_start.data.fling_start.velocity_y = fling_velocity.y(); gesture_fling_start.SetPositionInWidget(position_in_widget); gesture_fling_start.SetPositionInScreen(position_in_screen); render_widget_host->ForwardGestureEvent(gesture_fling_start); @@ -212,25 +247,36 @@ run_loop.Run(); } - void WaitForChildScroll() { - FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) - ->GetFrameTree() - ->root(); - ASSERT_EQ(1U, root->child_count()); - FrameTreeNode* iframe_node = root->child_at(0); - int scroll_top = EvalJs(iframe_node->current_frame_host(), "window.scrollY") - .ExtractDouble(); + void WaitForFrameScroll(FrameTreeNode* frame_node, + int target_scroll_offset = 100, + bool upward = false) { + DCHECK(frame_node); + double scroll_top = + EvalJs(frame_node->current_frame_host(), "window.scrollY") + .ExtractDouble(); // scrollTop > 0 is not enough since the first progressFling is called from - // FlingController::ProcessGestureFlingStart. Wait for scrollTop to exceed - // 100 pixels to make sure that ProgressFling has been called through - // FlingScheduler at least once. - while (scroll_top < 100) { + // FlingController::ProcessGestureFlingStart. Wait for scrollTop to reach + // target_scroll_offset to make sure that ProgressFling has been called + // through FlingScheduler at least once. + while ((upward && scroll_top > target_scroll_offset) || + (!upward && scroll_top < target_scroll_offset)) { GiveItSomeTime(); - scroll_top = EvalJs(iframe_node->current_frame_host(), "window.scrollY") + scroll_top = EvalJs(frame_node->current_frame_host(), "window.scrollY") .ExtractDouble(); } } + FrameTreeNode* GetRootNode() { + return static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetFrameTree() + ->root(); + } + + FrameTreeNode* GetChildNode() { + FrameTreeNode* root = GetRootNode(); + return root->child_at(0); + } + std::unique_ptr<base::RunLoop> run_loop_; RenderWidgetHostViewBase* child_view_ = nullptr; RenderWidgetHostViewBase* root_view_ = nullptr; @@ -239,6 +285,10 @@ DISALLOW_COPY_AND_ASSIGN(BrowserSideFlingBrowserTest); }; +// On Mac we don't have any touchscreen/touchpad fling events (GFS/GFC). +// Instead, the OS keeps sending wheel events when the user lifts their fingers +// from touchpad. +#if !defined(OS_MACOSX) IN_PROC_BROWSER_TEST_F(BrowserSideFlingBrowserTest, TouchscreenFling) { LoadURL(kBrowserFlingDataURL); SimulateTouchscreenFling(GetWidgetHost()); @@ -257,8 +307,7 @@ GURL first_url(embedded_test_server()->GetURL( "b.a.com", "/scrollable_page_with_iframe.html")); EXPECT_TRUE(NavigateToURL(shell(), first_url)); - MainThreadFrameObserver main_thread_sync1(GetWidgetHost()); - main_thread_sync1.Wait(); + SynchronizeThreads(); SimulateTouchscreenFling(GetWidgetHost()); WaitForScroll(); @@ -266,8 +315,7 @@ GURL second_url( embedded_test_server()->GetURL("a.com", "/scrollable_page.html")); NavigateToURL(shell(), second_url); - MainThreadFrameObserver main_thread_sync2(GetWidgetHost()); - main_thread_sync2.Wait(); + SynchronizeThreads(); // Wait for 100ms. Then check that the second page has not scrolled. GiveItSomeTime(100); @@ -281,23 +329,89 @@ IN_PROC_BROWSER_TEST_F(BrowserSideFlingBrowserTest, TouchscreenFlingInOOPIF) { LoadPageWithOOPIF(); SimulateTouchscreenFling(child_view_->host()); - WaitForChildScroll(); + WaitForFrameScroll(GetChildNode()); } IN_PROC_BROWSER_TEST_F(BrowserSideFlingBrowserTest, TouchpadFlingInOOPIF) { LoadPageWithOOPIF(); - SimulateTouchscreenFling(child_view_->host()); - WaitForChildScroll(); + SimulateTouchpadFling(child_view_->host()); + WaitForFrameScroll(GetChildNode()); +} +IN_PROC_BROWSER_TEST_F(BrowserSideFlingBrowserTest, + TouchscreenFlingBubblesFromOOPIF) { + LoadPageWithOOPIF(); + // Scroll the parent down so that it is scrollable upward. + EXPECT_TRUE( + ExecJs(GetRootNode()->current_frame_host(), "window.scrollTo(0, 20)")); + // We expect to have window.scrollY == 20 after scrolling but with zoom for + // dsf enabled on android we get window.scrollY == 19 (see + // https://crbug.com/891860). + WaitForFrameScroll(GetRootNode(), 19); + SynchronizeThreads(); + + // Fling and wait for the parent to scroll upward. + gfx::Vector2d fling_velocity(0, 2000); + SimulateTouchscreenFling(child_view_->host(), GetWidgetHost(), + fling_velocity); + WaitForFrameScroll(GetRootNode(), 15, true /* upward */); } -// Disabled on MacOS because it doesn't support touchscreen scroll. -#if defined(OS_MACOSX) -#define MAYBE_ScrollEndGeneratedForFilteredFling \ - DISABLED_ScrollEndGeneratedForFilteredFling -#else +// Flaky, probably because of https://crbug.com/892656 +IN_PROC_BROWSER_TEST_F(BrowserSideFlingBrowserTest, + DISABLED_TouchpadFlingBubblesFromOOPIF) { + LoadPageWithOOPIF(); + // Scroll the parent down so that it is scrollable upward. + EXPECT_TRUE( + ExecJs(GetRootNode()->current_frame_host(), "window.scrollTo(0, 20)")); + // We expect to have window.scrollY == 20 after scrolling but with zoom for + // dsf enabled on android we get window.scrollY == 19 (see + // https://crbug.com/891860). + WaitForFrameScroll(GetRootNode(), 19); + SynchronizeThreads(); + + // Fling and wait for the parent to scroll upward. + gfx::Vector2d fling_velocity(0, 2000); + SimulateTouchpadFling(child_view_->host(), GetWidgetHost(), fling_velocity); + WaitForFrameScroll(GetRootNode(), 15, true /* upward */); +} +IN_PROC_BROWSER_TEST_F(BrowserSideFlingBrowserTest, GFCGetsBubbledFromOOPIF) { + LoadPageWithOOPIF(); + // Scroll the parent down so that it is scrollable upward. + EXPECT_TRUE( + ExecJs(GetRootNode()->current_frame_host(), "window.scrollTo(0, 20)")); + // We expect to have window.scrollY == 20 after scrolling but with zoom for + // dsf enabled on android we get window.scrollY == 19 (see + // https://crbug.com/891860). + WaitForFrameScroll(GetRootNode(), 19); + SynchronizeThreads(); + + // Fling and wait for the parent to scroll upward. + gfx::Vector2d fling_velocity(0, 2000); + SimulateTouchscreenFling(child_view_->host(), GetWidgetHost(), + fling_velocity); + WaitForFrameScroll(GetRootNode(), 15, true /* upward */); + + // Send a GFC to the child and wait for it to get bubbled. + auto input_msg_watcher = std::make_unique<InputMsgWatcher>( + GetWidgetHost(), blink::WebInputEvent::kGestureFlingCancel); + blink::WebGestureEvent gesture_fling_cancel( + blink::WebGestureEvent::kGestureFlingCancel, + blink::WebInputEvent::kNoModifiers, ui::EventTimeForNow()); + gesture_fling_cancel.SetSourceDevice(blink::kWebGestureDeviceTouchscreen); + + const gfx::PointF location_in_widget(1, 1); + const gfx::PointF location_in_root = + child_view_->TransformPointToRootCoordSpaceF(location_in_widget); + const gfx::PointF location_in_screen = + location_in_root + root_view_->GetViewBounds().OffsetFromOrigin(); + gesture_fling_cancel.SetPositionInWidget(location_in_widget); + gesture_fling_cancel.SetPositionInScreen(location_in_screen); + child_view_->host()->ForwardGestureEvent(gesture_fling_cancel); + input_msg_watcher->GetAckStateWaitIfNecessary(); +} + // Flaky, see https://crbug.com/850455 #define MAYBE_ScrollEndGeneratedForFilteredFling \ DISABLED_ScrollEndGeneratedForFilteredFling -#endif IN_PROC_BROWSER_TEST_F(BrowserSideFlingBrowserTest, MAYBE_ScrollEndGeneratedForFilteredFling) { LoadURL(kTouchActionFilterDataURL); @@ -348,5 +462,6 @@ EXPECT_EQ(InputEventAckSource::BROWSER, scroll_end_watcher->last_event_ack_source()); } +#endif // !defined(OS_MACOSX) } // namespace content
diff --git a/content/browser/renderer_host/input/touch_action_browsertest.cc b/content/browser/renderer_host/input/touch_action_browsertest.cc index e0267e6..835b0d6 100644 --- a/content/browser/renderer_host/input/touch_action_browsertest.cc +++ b/content/browser/renderer_host/input/touch_action_browsertest.cc
@@ -7,6 +7,7 @@ #include "base/auto_reset.h" #include "base/bind.h" #include "base/command_line.h" +#include "base/json/json_reader.h" #include "base/macros.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" @@ -18,7 +19,9 @@ #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/browser/web_contents/web_contents_impl.h" +#include "content/common/input/actions_parser.h" #include "content/common/input/synthetic_gesture_params.h" +#include "content/common/input/synthetic_pointer_action_list_params.h" #include "content/common/input/synthetic_smooth_scroll_gesture_params.h" #include "content/common/input_messages.h" #include "content/public/browser/render_view_host.h" @@ -316,6 +319,45 @@ expected_scroll_position_after_scroll); } + // Generate touch events for a double tap and drag zoom gesture at + // coordinates (50, 50). + void DoDoubleTapDragZoom() { + DCHECK(URLLoaded()); + + const std::string pointer_actions_json = R"HTML( + [{ + "source": "touch", + "actions": [ + { "name": "pointerDown", "x": 50, "y": 50 }, + { "name": "pointerUp" }, + { "name": "pause", "duration": 0.05 }, + { "name": "pointerDown", "x": 50, "y": 50 }, + { "name": "pointerMove", "x": 50, "y": 150 }, + { "name": "pointerUp" } + ] + }] + )HTML"; + + base::JSONReader json_reader; + std::unique_ptr<base::Value> params = + json_reader.ReadToValue(pointer_actions_json); + ASSERT_TRUE(params.get()) << json_reader.GetErrorMessage(); + ActionsParser actions_parser(params.get()); + + ASSERT_TRUE(actions_parser.ParsePointerActionSequence()); + + run_loop_ = std::make_unique<base::RunLoop>(); + + GetWidgetHost()->QueueSyntheticGesture( + SyntheticGesture::Create(actions_parser.gesture_params()), + base::BindOnce(&TouchActionBrowserTest::OnSyntheticGestureCompleted, + base::Unretained(this))); + + // Runs until we get the OnSyntheticGestureCompleted callback + run_loop_->Run(); + run_loop_.reset(); + } + private: void CheckScrollOffset( bool wait_until_scrolled, @@ -532,4 +574,43 @@ gfx::Vector2d(45, 0), kShortJankTime); } +namespace { + +const std::string kDoubleTapZoomDataURL = R"HTML( + data:text/html,<!DOCTYPE html> + <meta name='viewport' content='width=device-width'/> + <style> + html, body { + margin: 0; + } + .spacer { height: 10000px; } + .touchaction { width: 75px; height: 75px; touch-action: none; } + </style> + <div class="touchaction"></div> + <div class=spacer></div> + <script> + document.title='ready'; + </script>)HTML"; + +} // namespace + +// Test that |touch-action: none| correctly blocks a double-tap and drag zoom +// gesture. +IN_PROC_BROWSER_TEST_F(TouchActionBrowserTest, BlockDoubleTapDragZoom) { + LoadURL(kDoubleTapZoomDataURL.c_str()); + + ASSERT_EQ(1, ExecuteScriptAndExtractDouble("window.visualViewport.scale")); + + DoDoubleTapDragZoom(); + + // Since we don't expect anything to change, we don't know how long to wait + // before we're sure the zoom was blocked. Do a scroll so that we can wait + // until the offset changes. At that point, we know the zoom should have + // taken effect if it wasn't blocked by touch-action. + DoTouchScroll(gfx::Point(300, 300), gfx::Vector2d(0, 200), true, 10075, + gfx::Vector2d(0, 200), kNoJankTime); + + EXPECT_EQ(1, ExecuteScriptAndExtractDouble("window.visualViewport.scale")); +} + } // namespace content
diff --git a/content/browser/renderer_host/input/touch_action_filter.cc b/content/browser/renderer_host/input/touch_action_filter.cc index da66a5d..d4d3134 100644 --- a/content/browser/renderer_host/input/touch_action_filter.cc +++ b/content/browser/renderer_host/input/touch_action_filter.cc
@@ -63,6 +63,7 @@ if (!scrolling_touch_action_.has_value()) SetTouchAction(cc::kTouchActionAuto); } + gesture_scroll_in_progress_ = true; gesture_sequence_.append("B"); if (!scrolling_touch_action_.has_value()) { static auto* crash_key = base::debug::AllocateCrashKeyString( @@ -114,6 +115,7 @@ case WebInputEvent::kGestureScrollEnd: gesture_sequence_.clear(); + gesture_scroll_in_progress_ = false; gesture_sequence_in_progress_ = false; ReportGestureEventFiltered(suppress_manipulation_events_); return FilterManipulationEventAndResetState() @@ -121,13 +123,32 @@ : FilterGestureEventResult::kFilterGestureEventAllowed; case WebInputEvent::kGesturePinchBegin: + if (!gesture_scroll_in_progress_) { + suppress_manipulation_events_ = + ShouldSuppressManipulation(*gesture_event); + } + FALLTHROUGH; case WebInputEvent::kGesturePinchUpdate: - case WebInputEvent::kGesturePinchEnd: gesture_sequence_.append("P"); ReportGestureEventFiltered(suppress_manipulation_events_); return suppress_manipulation_events_ ? FilterGestureEventResult::kFilterGestureEventFiltered : FilterGestureEventResult::kFilterGestureEventAllowed; + case WebInputEvent::kGesturePinchEnd: + ReportGestureEventFiltered(suppress_manipulation_events_); + // If we're in a double-tap and drag zoom, we won't be bracketed between + // a GSB/GSE pair so end the sequence now. Otherwise this will happen + // when we get the GSE. + if (!gesture_scroll_in_progress_) { + gesture_sequence_.clear(); + gesture_sequence_in_progress_ = false; + return FilterManipulationEventAndResetState() + ? FilterGestureEventResult::kFilterGestureEventFiltered + : FilterGestureEventResult::kFilterGestureEventAllowed; + } + return suppress_manipulation_events_ + ? FilterGestureEventResult::kFilterGestureEventFiltered + : FilterGestureEventResult::kFilterGestureEventAllowed; // The double tap gesture is a tap ending event. If a double-tap gesture is // filtered out, replace it with a tap event but preserve the tap-count to @@ -339,7 +360,12 @@ bool TouchActionFilter::ShouldSuppressManipulation( const blink::WebGestureEvent& gesture_event) { - DCHECK_EQ(gesture_event.GetType(), WebInputEvent::kGestureScrollBegin); + DCHECK(gesture_event.GetType() == WebInputEvent::kGestureScrollBegin || + WebInputEvent::IsPinchGestureEventType(gesture_event.GetType())); + + if (WebInputEvent::IsPinchGestureEventType(gesture_event.GetType())) { + return (scrolling_touch_action_.value() & cc::kTouchActionPinchZoom) == 0; + } if (gesture_event.data.scroll_begin.pointer_count >= 2) { // Any GestureScrollBegin with more than one fingers is like a pinch-zoom
diff --git a/content/browser/renderer_host/input/touch_action_filter.h b/content/browser/renderer_host/input/touch_action_filter.h index 231a026..8969967 100644 --- a/content/browser/renderer_host/input/touch_action_filter.h +++ b/content/browser/renderer_host/input/touch_action_filter.h
@@ -111,6 +111,9 @@ // before GSE. bool gesture_sequence_in_progress_ = false; + // True if we're between a GSB and a GSE. + bool gesture_scroll_in_progress_ = false; + // Increment at receiving ACK for touch start and decrement at touch end. int num_of_active_touches_ = 0;
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index 98771d4..854924d 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -131,6 +131,8 @@ "gin_java_bridge_messages.h", "in_process_child_thread_params.cc", "in_process_child_thread_params.h", + "input/actions_parser.cc", + "input/actions_parser.h", "input/event_with_latency_info.h", "input/gesture_event_stream_validator.cc", "input/gesture_event_stream_validator.h",
diff --git a/content/renderer/gpu/actions_parser.cc b/content/common/input/actions_parser.cc similarity index 99% rename from content/renderer/gpu/actions_parser.cc rename to content/common/input/actions_parser.cc index 52a3ed96..78503184 100644 --- a/content/renderer/gpu/actions_parser.cc +++ b/content/common/input/actions_parser.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/renderer/gpu/actions_parser.h" +#include "content/common/input/actions_parser.h" #include "base/format_macros.h" #include "base/strings/stringprintf.h"
diff --git a/content/renderer/gpu/actions_parser.h b/content/common/input/actions_parser.h similarity index 91% rename from content/renderer/gpu/actions_parser.h rename to content/common/input/actions_parser.h index 3568b23..c5d0ca83 100644 --- a/content/renderer/gpu/actions_parser.h +++ b/content/common/input/actions_parser.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_RENDERER_GPU_ACTION_PARSER_H_ -#define CONTENT_RENDERER_GPU_ACTION_PARSER_H_ +#ifndef CONTENT_COMMON_INPUT_ACTIONS_PARSER_H_ +#define CONTENT_COMMON_INPUT_ACTIONS_PARSER_H_ #include <cstddef> #include <set> @@ -54,4 +54,4 @@ } // namespace content -#endif // CONTENT_RENDERER_GPU_ACTION_PARSER_H_ +#endif // CONTENT_COMMON_INPUT_ACTIONS_PARSER_H_
diff --git a/content/renderer/gpu/actions_parser_unittest.cc b/content/common/input/actions_parser_unittest.cc similarity index 99% rename from content/renderer/gpu/actions_parser_unittest.cc rename to content/common/input/actions_parser_unittest.cc index 1429542..8a5b21f 100644 --- a/content/renderer/gpu/actions_parser_unittest.cc +++ b/content/common/input/actions_parser_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/renderer/gpu/actions_parser.h" +#include "content/common/input/actions_parser.h" #include "base/json/json_reader.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/content/public/test/OWNERS b/content/public/test/OWNERS index 7b359503..f4438e9c 100644 --- a/content/public/test/OWNERS +++ b/content/public/test/OWNERS
@@ -4,7 +4,7 @@ tommi@chromium.org # For download tests support review. -per-file test_download_http_response.*=file://components/download/OWNERS +per-file *download*=file://components/download/OWNERS # For Android-specific changes. per-file *android*=file://content/public/test/android/OWNERS
diff --git a/content/public/test/fake_download_item.cc b/content/public/test/fake_download_item.cc index 07733c6..6a1828b 100644 --- a/content/public/test/fake_download_item.cc +++ b/content/public/test/fake_download_item.cc
@@ -191,8 +191,9 @@ return is_parallel_download_; } -download::DownloadItem::DownloadType FakeDownloadItem::GetDownloadType() const { - return download::DownloadItem::DownloadType::TYPE_ACTIVE_DOWNLOAD; +download::DownloadItem::DownloadCreationType +FakeDownloadItem::GetDownloadCreationType() const { + return download::DownloadItem::DownloadCreationType::TYPE_ACTIVE_DOWNLOAD; } void FakeDownloadItem::SetIsDone(bool is_done) {
diff --git a/content/public/test/fake_download_item.h b/content/public/test/fake_download_item.h index 42f26cc..b11534e 100644 --- a/content/public/test/fake_download_item.h +++ b/content/public/test/fake_download_item.h
@@ -53,7 +53,7 @@ base::Time GetLastAccessTime() const override; bool IsTransient() const override; bool IsParallelDownload() const override; - DownloadType GetDownloadType() const override; + DownloadCreationType GetDownloadCreationType() const override; bool IsDone() const override; const std::string& GetETag() const override; const std::string& GetLastModifiedTime() const override;
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 6be3ad9..b5b0252 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -113,8 +113,6 @@ "frame_blame_context.h", "frame_owner_properties.cc", "frame_owner_properties.h", - "gpu/actions_parser.cc", - "gpu/actions_parser.h", "gpu/compositor_dependencies.h", "gpu/frame_swap_message_queue.cc", "gpu/frame_swap_message_queue.h",
diff --git a/content/renderer/gpu/gpu_benchmarking_extension.cc b/content/renderer/gpu/gpu_benchmarking_extension.cc index f142cfc..c8b684e 100644 --- a/content/renderer/gpu/gpu_benchmarking_extension.cc +++ b/content/renderer/gpu/gpu_benchmarking_extension.cc
@@ -21,6 +21,7 @@ #include "cc/layers/layer.h" #include "cc/paint/skia_paint_canvas.h" #include "cc/trees/layer_tree_host.h" +#include "content/common/input/actions_parser.h" #include "content/common/input/synthetic_gesture_params.h" #include "content/common/input/synthetic_pinch_gesture_params.h" #include "content/common/input/synthetic_pointer_action_list_params.h" @@ -32,7 +33,6 @@ #include "content/public/renderer/chrome_object_extensions_utils.h" #include "content/public/renderer/render_thread.h" #include "content/public/renderer/v8_value_converter.h" -#include "content/renderer/gpu/actions_parser.h" #include "content/renderer/gpu/layer_tree_view.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/render_view_impl.h"
diff --git a/content/renderer/media/stream/media_stream_constraints_util.cc b/content/renderer/media/stream/media_stream_constraints_util.cc index e8f8052..bbcd6b96 100644 --- a/content/renderer/media/stream/media_stream_constraints_util.cc +++ b/content/renderer/media/stream/media_stream_constraints_util.cc
@@ -126,10 +126,14 @@ max_frame_rate_(max_frame_rate) { DCHECK(!min_frame_rate || *min_frame_rate_ <= capture_params.requested_format.frame_rate); - DCHECK_LE(track_adapter_settings.max_width, - capture_params.requested_format.frame_size.width()); - DCHECK_LE(track_adapter_settings.max_height, - capture_params.requested_format.frame_size.height()); + // TODO(crbug.com/854980): Update these DCHECKS to allow for unspecified + // target size. + DCHECK(track_adapter_settings.target_size() && + track_adapter_settings.target_size()->width() <= + capture_params.requested_format.frame_size.width()); + DCHECK(track_adapter_settings_.target_size() && + track_adapter_settings_.target_size()->height() <= + capture_params.requested_format.frame_size.height()); } VideoCaptureSettings::VideoCaptureSettings(const VideoCaptureSettings& other) = @@ -287,7 +291,7 @@ track_max_frame_rate = 0.0; return VideoTrackAdapterSettings( - track_max_width, track_max_height, track_min_aspect_ratio, + gfx::Size(track_max_width, track_max_height), track_min_aspect_ratio, track_max_aspect_ratio, track_max_frame_rate); }
diff --git a/content/renderer/media/stream/media_stream_constraints_util_unittest.cc b/content/renderer/media/stream/media_stream_constraints_util_unittest.cc index 9b0a9ffd..5f81668 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_unittest.cc +++ b/content/renderer/media/stream/media_stream_constraints_util_unittest.cc
@@ -127,11 +127,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(0.0, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(0.0, result.max_frame_rate()); } // Ideal height. @@ -142,11 +142,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kIdealHeight, result.max_height); - EXPECT_EQ(std::round(kIdealHeight * kSourceAspectRatio), result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(0.0, result.max_frame_rate); + EXPECT_EQ(kIdealHeight, result.target_height()); + EXPECT_EQ(std::round(kIdealHeight * kSourceAspectRatio), + result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(0.0, result.max_frame_rate()); } // Ideal width. @@ -157,11 +158,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(std::round(kIdealWidth / kSourceAspectRatio), result.max_height); - EXPECT_EQ(kIdealWidth, result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(0.0, result.max_frame_rate); + EXPECT_EQ(std::round(kIdealWidth / kSourceAspectRatio), + result.target_height()); + EXPECT_EQ(kIdealWidth, result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(0.0, result.max_frame_rate()); } // Ideal aspect ratio. @@ -172,11 +174,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(std::round(kSourceHeight * kIdealAspectRatio), result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(0.0, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(std::round(kSourceHeight * kIdealAspectRatio), + result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(0.0, result.max_frame_rate()); } // Ideal frame rate. @@ -187,11 +190,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(kIdealFrameRate, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(kIdealFrameRate, result.max_frame_rate()); } // All ideals supplied. @@ -209,11 +212,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kIdealHeight, result.max_height); - EXPECT_EQ(kIdealWidth, result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(kIdealFrameRate, result.max_frame_rate); + EXPECT_EQ(kIdealHeight, result.target_height()); + EXPECT_EQ(kIdealWidth, result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(kIdealFrameRate, result.max_frame_rate()); } } @@ -236,11 +239,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Ideal height < min. @@ -253,12 +256,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kMinHeight, result.max_height); + EXPECT_EQ(kMinHeight, result.target_height()); // kMinWidth > kMinHeight * kNativeAspectRatio - EXPECT_EQ(kMinWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kMinWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // min < Ideal height < max. @@ -273,11 +276,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kIdealHeight, result.max_height); - EXPECT_EQ(std::round(kIdealHeight * kSourceAspectRatio), result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kIdealHeight, result.target_height()); + EXPECT_EQ(std::round(kIdealHeight * kSourceAspectRatio), + result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Ideal height > max. @@ -290,11 +294,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kMaxHeight, result.max_height); - EXPECT_EQ(std::round(kMaxHeight * kSourceAspectRatio), result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kMaxHeight, result.target_height()); + EXPECT_EQ(std::round(kMaxHeight * kSourceAspectRatio), + result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Ideal width < min. @@ -307,11 +312,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(std::round(kMinWidth / kSourceAspectRatio), result.max_height); - EXPECT_EQ(kMinWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(std::round(kMinWidth / kSourceAspectRatio), + result.target_height()); + EXPECT_EQ(kMinWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // min < Ideal width < max. @@ -326,11 +332,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(std::round(kIdealWidth / kSourceAspectRatio), result.max_height); - EXPECT_EQ(kIdealWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(std::round(kIdealWidth / kSourceAspectRatio), + result.target_height()); + EXPECT_EQ(kIdealWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Ideal width > max. @@ -344,11 +351,11 @@ constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); // kMaxHeight < kMaxWidth / kNativeAspectRatio - EXPECT_EQ(kMaxHeight, result.max_height); - EXPECT_EQ(kMaxWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kMaxHeight, result.target_height()); + EXPECT_EQ(kMaxWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Ideal aspect ratio < min. @@ -364,11 +371,11 @@ // Desired point is (kNativeWidth/kMinAspectRatio, kNativeWidth), but it // is outside the size constraints. Closest to that while maintaining the // same aspect ratio is (kMaxHeight, kMaxHeight * kMinAspectRatio). - EXPECT_EQ(kMaxHeight, result.max_height); - EXPECT_EQ(std::round(kMaxHeight * kMinAspectRatio), result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kMaxHeight, result.target_height()); + EXPECT_EQ(std::round(kMaxHeight * kMinAspectRatio), result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // min < Ideal aspect ratio < max. @@ -383,11 +390,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(std::round(kSourceWidth / kIdealAspectRatio), result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(std::round(kSourceWidth / kIdealAspectRatio), + result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Ideal aspect ratio > max. @@ -400,11 +408,12 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(std::round(kSourceHeight * kMaxAspectRatio), result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(std::round(kSourceHeight * kMaxAspectRatio), + result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Ideal frame rate < min. @@ -417,11 +426,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMinFrameRate, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMinFrameRate, result.max_frame_rate()); } // min < Ideal frame rate < max. @@ -436,11 +445,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kIdealFrameRate, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kIdealFrameRate, result.max_frame_rate()); } // Ideal frame rate > max. @@ -453,11 +462,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Ideal values inside constraints. @@ -484,11 +493,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kIdealHeight, result.max_height); - EXPECT_EQ(kIdealWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kIdealFrameRate, result.max_frame_rate); + EXPECT_EQ(kIdealHeight, result.target_height()); + EXPECT_EQ(kIdealWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kIdealFrameRate, result.max_frame_rate()); } // Ideal values outside constraints. @@ -509,11 +518,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kMaxHeight, result.max_height); - EXPECT_EQ(kMaxWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); - EXPECT_EQ(kMaxFrameRate, result.max_frame_rate); + EXPECT_EQ(kMaxHeight, result.target_height()); + EXPECT_EQ(kMaxWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); + EXPECT_EQ(kMaxFrameRate, result.max_frame_rate()); } // Source frame rate. @@ -523,13 +532,13 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); // No frame-rate adjustment because the track will use the same frame rate // as the source. - EXPECT_EQ(0.0, result.max_frame_rate); + EXPECT_EQ(0.0, result.max_frame_rate()); } // High frame rate. @@ -542,13 +551,13 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio); - EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(kMinAspectRatio, result.min_aspect_ratio()); + EXPECT_EQ(kMaxAspectRatio, result.max_aspect_ratio()); // No frame-rate adjustment because the track will use a frame rate that is // greater than the source's. - EXPECT_EQ(0.0, result.max_frame_rate); + EXPECT_EQ(0.0, result.max_frame_rate()); } } @@ -562,11 +571,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(0.0, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(0.0, result.max_frame_rate()); } { @@ -574,11 +583,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kSourceHeight, result.max_height); - EXPECT_EQ(kSourceWidth, result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(0.0, result.max_frame_rate); + EXPECT_EQ(kSourceHeight, result.target_height()); + EXPECT_EQ(kSourceWidth, result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(0.0, result.max_frame_rate()); } // Ideals supplied. @@ -596,11 +605,11 @@ auto result = SelectVideoTrackAdapterSettings( constraint_factory.CreateWebMediaConstraints().Basic(), resolution_set, frame_rate_set, SourceFormat()); - EXPECT_EQ(kIdealHeight, result.max_height); - EXPECT_EQ(kIdealWidth, result.max_width); - EXPECT_EQ(0.0, result.min_aspect_ratio); - EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio); - EXPECT_EQ(kIdealFrameRate, result.max_frame_rate); + EXPECT_EQ(kIdealHeight, result.target_height()); + EXPECT_EQ(kIdealWidth, result.target_width()); + EXPECT_EQ(0.0, result.min_aspect_ratio()); + EXPECT_EQ(HUGE_VAL, result.max_aspect_ratio()); + EXPECT_EQ(kIdealFrameRate, result.max_frame_rate()); } }
diff --git a/content/renderer/media/stream/media_stream_constraints_util_video_content_unittest.cc b/content/renderer/media/stream/media_stream_constraints_util_video_content_unittest.cc index 7fcd5e8c..bc2b2520 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_video_content_unittest.cc +++ b/content/renderer/media/stream/media_stream_constraints_util_video_content_unittest.cc
@@ -39,19 +39,19 @@ void CheckTrackAdapterSettingsEqualsFormat(const VideoCaptureSettings& result) { // For content capture, resolution and frame rate should always be the same // for source and track. - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(0.0, result.track_adapter_settings().max_frame_rate); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(0.0, result.track_adapter_settings().max_frame_rate()); } void CheckTrackAdapterSettingsEqualsFormatDefaultAspectRatio( const VideoCaptureSettings& result) { EXPECT_EQ( static_cast<double>(kMinScreenCastDimension) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ( static_cast<double>(kMaxScreenCastDimension) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -267,9 +267,9 @@ EXPECT_EQ(std::round(kHeight * kDefaultScreenCastAspectRatio), result.Width()); CheckNonResolutionDefaults(result); - EXPECT_EQ(1.0 / kHeight, result.track_adapter_settings().min_aspect_ratio); + EXPECT_EQ(1.0 / kHeight, result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -285,9 +285,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); const int kSmallHeight = 100; @@ -299,9 +299,9 @@ EXPECT_EQ(kDefaultScreenCastWidth, result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kSmallHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -318,9 +318,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -336,9 +336,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -354,9 +354,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -373,9 +373,9 @@ EXPECT_EQ(kMaxScreenCastDimension, result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -395,9 +395,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -415,9 +415,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -435,9 +435,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -475,9 +475,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -497,9 +497,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -522,8 +522,10 @@ // Expect width closest to kIdealHeight * default aspect ratio. EXPECT_EQ(std::round(kIdealHeight * default_aspect_ratio), result.Width()); CheckNonResolutionDefaults(result); - EXPECT_EQ(100.0 / 1000.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(500.0 / 500.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(100.0 / 1000.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(500.0 / 500.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -544,8 +546,9 @@ EXPECT_EQ(constraint_factory_.basic().width.Max(), result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(100.0 / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(500.0 / 500.0, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(500.0 / 500.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -564,8 +567,9 @@ EXPECT_EQ(constraint_factory_.basic().height.Max(), result.Height()); EXPECT_EQ(constraint_factory_.basic().width.Max(), result.Width()); CheckNonResolutionDefaults(result); - EXPECT_EQ(1.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(1000.0 / 500.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(1.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(1000.0 / 500.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -581,9 +585,9 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kWidth) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -599,10 +603,10 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kWidth) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ( static_cast<double>(kMaxScreenCastDimension) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); const int kSmallWidth = 100; @@ -614,10 +618,10 @@ EXPECT_EQ(kDefaultScreenCastHeight, result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kSmallWidth) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ( static_cast<double>(kMaxScreenCastDimension) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -635,9 +639,9 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -654,9 +658,9 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -673,10 +677,10 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ( static_cast<double>(kMaxScreenCastDimension) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -692,9 +696,9 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -714,9 +718,9 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kMinWidth) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -734,9 +738,9 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kMinWidth) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -754,9 +758,9 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kMinWidth) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -793,9 +797,9 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(1.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -814,10 +818,10 @@ result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kMinWidth) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ( static_cast<double>(kMaxScreenCastDimension) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -840,8 +844,10 @@ constraint_factory_.basic().height.Max(); EXPECT_EQ(std::round(kIdealWidth / default_aspect_ratio), result.Height()); CheckNonResolutionDefaults(result); - EXPECT_EQ(500.0 / 500.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(1000.0 / 100.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(500.0 / 500.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(1000.0 / 100.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -861,9 +867,10 @@ // max height. EXPECT_EQ(constraint_factory_.basic().height.Max(), result.Height()); CheckNonResolutionDefaults(result); - EXPECT_EQ(500.0 / 500.0, result.track_adapter_settings().min_aspect_ratio); + EXPECT_EQ(500.0 / 500.0, + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / 100.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -882,8 +889,9 @@ EXPECT_EQ(constraint_factory_.basic().width.Max(), result.Width()); EXPECT_EQ(constraint_factory_.basic().height.Max(), result.Height()); CheckNonResolutionDefaults(result); - EXPECT_EQ(100.0 / 500.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(1.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(100.0 / 500.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(1.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -901,8 +909,8 @@ EXPECT_EQ(std::round(kDefaultScreenCastHeight * kAspectRatio), result.Width()); CheckNonResolutionDefaults(result); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -917,10 +925,10 @@ EXPECT_EQ(std::round(kDefaultScreenCastHeight * kAspectRatio), result.Width()); CheckNonResolutionDefaults(result); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / static_cast<double>(kMinScreenCastDimension), - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); const double kSmallAspectRatio = 0.5; @@ -932,10 +940,10 @@ EXPECT_EQ(kDefaultScreenCastWidth, result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kSmallAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / static_cast<double>(kMinScreenCastDimension), - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -951,8 +959,8 @@ CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kMinScreenCastDimension) / static_cast<double>(kMaxScreenCastDimension), - result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); const double kSmallAspectRatio = 0.5; @@ -968,9 +976,9 @@ CheckNonResolutionDefaults(result); EXPECT_EQ(static_cast<double>(kMinScreenCastDimension) / static_cast<double>(kMaxScreenCastDimension), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kSmallAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -988,9 +996,9 @@ EXPECT_EQ(kDefaultScreenCastWidth, result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1007,9 +1015,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1026,9 +1034,9 @@ EXPECT_EQ(kDefaultScreenCastWidth, result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -1064,9 +1072,9 @@ CheckNonResolutionDefaults(result); EXPECT_EQ( static_cast<double>(kMinScreenCastDimension) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1085,10 +1093,10 @@ EXPECT_EQ(kDefaultScreenCastWidth, result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ( static_cast<double>(kMaxScreenCastDimension) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1111,8 +1119,10 @@ result.Height()); EXPECT_EQ(constraint_factory_.basic().width.Max(), result.Width()); CheckNonResolutionDefaults(result); - EXPECT_EQ(100.0 / 500.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(500.0 / 100.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(100.0 / 500.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(500.0 / 100.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().height.SetMin(1000); @@ -1128,9 +1138,9 @@ EXPECT_EQ(constraint_factory_.basic().width.Max(), result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(1000.0 / 5000.0, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(5000.0 / 1000.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.Reset(); @@ -1145,9 +1155,9 @@ EXPECT_EQ(kDefaultScreenCastHeight * kIdealAspectRatio, result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(250.0 / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxScreenCastDimension / 250.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1172,9 +1182,9 @@ EXPECT_EQ(constraint_factory_.basic().width.Max(), result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().aspect_ratio.SetIdeal(0.3); @@ -1187,9 +1197,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); // Use a box that is bigger and further from the origin to force closeness @@ -1209,9 +1219,9 @@ result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().aspect_ratio.SetIdeal(0.3); @@ -1224,9 +1234,9 @@ EXPECT_EQ(constraint_factory_.basic().width.Min(), result.Width()); CheckNonResolutionDefaults(result); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1245,8 +1255,9 @@ EXPECT_EQ(constraint_factory_.basic().height.Min(), result.Height()); EXPECT_EQ(constraint_factory_.basic().width.Max(), result.Width()); CheckNonResolutionDefaults(result); - EXPECT_EQ(1.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(500.0 / 100.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(1.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(500.0 / 100.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -1528,8 +1539,8 @@ EXPECT_EQ(400, result.Height()); EXPECT_EQ(500, result.Width()); CheckNonResolutionDefaults(result); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); blink::WebMediaTrackConstraintSet& advanced3 = @@ -1543,8 +1554,8 @@ EXPECT_EQ(10.0, result.FrameRate()); EXPECT_EQ(base::Optional<bool>(), result.noise_reduction()); EXPECT_EQ(std::string(), result.device_id()); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); blink::WebMediaTrackConstraintSet& advanced4 = @@ -1560,8 +1571,8 @@ EXPECT_EQ(10.0, result.FrameRate()); EXPECT_EQ(base::Optional<bool>(), result.noise_reduction()); EXPECT_EQ(std::string(), result.device_id()); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().width.SetIdeal(100); @@ -1577,8 +1588,8 @@ EXPECT_EQ(10.0, result.FrameRate()); EXPECT_EQ(base::Optional<bool>(), result.noise_reduction()); EXPECT_EQ(std::string(), result.device_id()); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().width.SetIdeal(2000); @@ -1593,8 +1604,8 @@ EXPECT_EQ(10.0, result.FrameRate()); EXPECT_EQ(base::Optional<bool>(), result.noise_reduction()); EXPECT_EQ(std::string(), result.device_id()); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(5.0 / 4.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1628,9 +1639,9 @@ EXPECT_EQ(1080, result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(1920.0 / 1080.0, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(1920.0 / 1080.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); blink::WebMediaTrackConstraintSet& advanced4 = @@ -1645,9 +1656,9 @@ EXPECT_EQ(1080, result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(1920.0 / 1080.0, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(1920.0 / 1080.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().width.SetIdeal(800); @@ -1659,9 +1670,9 @@ EXPECT_EQ(1080, result.Height()); CheckNonResolutionDefaults(result); EXPECT_EQ(1920.0 / 1080.0, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(1920.0 / 1080.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } } @@ -1681,8 +1692,10 @@ EXPECT_EQ(1920, result.Width()); EXPECT_EQ(1080, result.Height()); EXPECT_EQ(60.0, result.FrameRate()); - EXPECT_EQ(1920.0 / 1080.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(1920.0 / 1080.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(1920.0 / 1080.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(1920.0 / 1080.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1708,9 +1721,9 @@ result.Height()); EXPECT_TRUE(result.noise_reduction() && !*result.noise_reduction()); EXPECT_EQ(kMinWidth / static_cast<double>(kMaxScreenCastDimension), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1734,8 +1747,8 @@ EXPECT_EQ(640, result.Width()); EXPECT_EQ(480, result.Height()); EXPECT_TRUE(result.noise_reduction() && *result.noise_reduction()); - EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1755,8 +1768,8 @@ EXPECT_EQ(640, result.Width()); EXPECT_EQ(480, result.Height()); CheckNonResolutionDefaults(result); - EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1779,9 +1792,9 @@ // Resolution cannot exceed the requested resolution. EXPECT_EQ(kDefaultScreenCastFrameRate, result.FrameRate()); EXPECT_EQ(kMinScreenCastDimension / 480.0, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(640.0 / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1806,9 +1819,9 @@ EXPECT_EQ(kMinHeight, result.Height()); EXPECT_EQ(kDefaultScreenCastFrameRate, result.FrameRate()); EXPECT_EQ(static_cast<double>(kMinWidth) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxScreenCastDimension) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1828,8 +1841,10 @@ result.Width()); EXPECT_EQ(kDefaultScreenCastHeight, result.Height()); CheckNonResolutionDefaults(result); - EXPECT_EQ(kMinAspectRatio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(kMinAspectRatio, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(kMinAspectRatio, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(kMinAspectRatio, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1849,10 +1864,11 @@ result.Width()); EXPECT_EQ(kDefaultScreenCastHeight, result.Height()); CheckNonResolutionDefaults(result); - EXPECT_EQ(kMinAspectRatio, result.track_adapter_settings().min_aspect_ratio); + EXPECT_EQ(kMinAspectRatio, + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ( kMaxScreenCastDimension / static_cast<double>(kMinScreenCastDimension), - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1910,9 +1926,9 @@ EXPECT_EQ(90.0, result.FrameRate()); EXPECT_EQ( static_cast<double>(kMinScreenCastDimension) / kMaxScreenCastDimension, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMaxWidth) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -1937,10 +1953,10 @@ EXPECT_EQ(kMaxHeight, result.Height()); EXPECT_EQ(60.0, result.FrameRate()); EXPECT_EQ(static_cast<double>(kMinScreenCastDimension) / kMaxHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ( static_cast<double>(kMaxScreenCastDimension) / kMinScreenCastDimension, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -2064,8 +2080,10 @@ EXPECT_EQ(480, result.Height()); EXPECT_EQ(media::ResolutionChangePolicy::FIXED_RESOLUTION, result.ResolutionChangePolicy()); - EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(640.0 / 480.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(640.0 / 480.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } { @@ -2077,8 +2095,10 @@ EXPECT_EQ(500, result.Height()); EXPECT_EQ(media::ResolutionChangePolicy::FIXED_RESOLUTION, result.ResolutionChangePolicy()); - EXPECT_EQ(1000.0 / 500.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(1000.0 / 500.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(1000.0 / 500.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(1000.0 / 500.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } { @@ -2090,8 +2110,10 @@ EXPECT_EQ(470, result.Height()); EXPECT_EQ(media::ResolutionChangePolicy::FIXED_RESOLUTION, result.ResolutionChangePolicy()); - EXPECT_EQ(630.0 / 470.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(630.0 / 470.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(630.0 / 470.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(630.0 / 470.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } { @@ -2134,8 +2156,8 @@ // Only specifying a maximum resolution allows resolution adjustment. EXPECT_EQ(media::ResolutionChangePolicy::ANY_WITHIN_LIMIT, result.ResolutionChangePolicy()); - EXPECT_EQ(1.0 / 4000, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(4000.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(1.0 / 4000, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(4000.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFormat(result); } }
diff --git a/content/renderer/media/stream/media_stream_constraints_util_video_device_unittest.cc b/content/renderer/media/stream/media_stream_constraints_util_video_device_unittest.cc index 8b47070..aeb43820 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_video_device_unittest.cc +++ b/content/renderer/media/stream/media_stream_constraints_util_video_device_unittest.cc
@@ -34,13 +34,13 @@ void CheckTrackAdapterSettingsEqualsResolution( const VideoCaptureSettings& settings) { EXPECT_EQ(settings.Format().frame_size.width(), - settings.track_adapter_settings().max_width); + settings.track_adapter_settings().target_width()); EXPECT_EQ(settings.Format().frame_size.height(), - settings.track_adapter_settings().max_height); + settings.track_adapter_settings().target_height()); EXPECT_EQ(1.0 / settings.Format().frame_size.height(), - settings.track_adapter_settings().min_aspect_ratio); + settings.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(settings.Format().frame_size.width(), - settings.track_adapter_settings().max_aspect_ratio); + settings.track_adapter_settings().max_aspect_ratio()); } void CheckTrackAdapterSettingsEqualsFrameRate( @@ -48,7 +48,7 @@ double value = 0.0) { if (value >= settings.FrameRate()) value = 0.0; - EXPECT_EQ(value, settings.track_adapter_settings().max_frame_rate); + EXPECT_EQ(value, settings.track_adapter_settings().max_frame_rate()); } void CheckTrackAdapterSettingsEqualsFormat( @@ -519,7 +519,7 @@ // which is the low-res device. EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(kHeight, result.Height()); - EXPECT_EQ(kHeight, result.track_adapter_settings().max_height); + EXPECT_EQ(kHeight, result.track_adapter_settings().target_height()); const int kLargeHeight = 1500; constraint_factory_.basic().height.SetExact(kLargeHeight); @@ -529,9 +529,9 @@ // height, even if not natively. EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_highest_format_, result.Format()); - EXPECT_EQ(kLargeHeight, result.track_adapter_settings().max_height); + EXPECT_EQ(kLargeHeight, result.track_adapter_settings().target_height()); EXPECT_EQ(std::round(kLargeHeight * AspectRatio(*high_res_highest_format_)), - result.track_adapter_settings().max_width); + result.track_adapter_settings().target_width()); } TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinHeight) { @@ -544,12 +544,12 @@ // algorithm should prefer the default device. EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_LE(kHeight, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(static_cast<double>(result.Width()) / kHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); const int kLargeHeight = 1500; @@ -561,12 +561,12 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_highest_format_, result.Format()); EXPECT_LE(kHeight, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(static_cast<double>(result.Width()) / kLargeHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -581,12 +581,13 @@ // maximum by the lowest amount. In this case it is the low-res device. EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(low_res_device_->formats[0], result.Format()); - EXPECT_EQ(kLowHeight, result.track_adapter_settings().max_height); + EXPECT_EQ(kLowHeight, result.track_adapter_settings().target_height()); EXPECT_EQ(std::round(kLowHeight * AspectRatio(result.Format())), - result.track_adapter_settings().max_width); + result.track_adapter_settings().target_width()); EXPECT_EQ(static_cast<double>(result.Width()), - result.track_adapter_settings().max_aspect_ratio); - EXPECT_EQ(1.0 / kLowHeight, result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); + EXPECT_EQ(1.0 / kLowHeight, + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -607,12 +608,12 @@ // range. EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(*default_closest_format_, result.Format()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(static_cast<double>(result.Width()) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -631,12 +632,12 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(800, result.Width()); EXPECT_EQ(600, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(static_cast<double>(result.Width()) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -655,12 +656,12 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(1280, result.Width()); EXPECT_EQ(720, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(static_cast<double>(result.Width()) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } } @@ -692,12 +693,13 @@ EXPECT_EQ(*default_closest_format_, result.Format()); // The track is cropped to the ideal height, maintaining the source aspect // ratio. - EXPECT_EQ(kIdealHeight, result.track_adapter_settings().max_height); + EXPECT_EQ(kIdealHeight, result.track_adapter_settings().target_height()); EXPECT_EQ(std::round(kIdealHeight * AspectRatio(result.Format())), - result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -712,12 +714,13 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(1920, result.Width()); EXPECT_EQ(1080, result.Height()); - EXPECT_EQ(kIdealHeight, result.track_adapter_settings().max_height); + EXPECT_EQ(kIdealHeight, result.track_adapter_settings().target_height()); EXPECT_EQ(std::round(kIdealHeight * AspectRatio(result.Format())), - result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -730,12 +733,13 @@ // which is the high-res device at the highest resolution. EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_highest_format_, result.Format()); - EXPECT_EQ(kIdealHeight, result.track_adapter_settings().max_height); + EXPECT_EQ(kIdealHeight, result.track_adapter_settings().target_height()); EXPECT_EQ(std::round(kIdealHeight * AspectRatio(result.Format())), - result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } } @@ -752,11 +756,11 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(kWidth, result.Width()); EXPECT_EQ(std::round(kWidth / AspectRatio(result.Format())), - result.track_adapter_settings().max_height); - EXPECT_EQ(kWidth, result.track_adapter_settings().max_width); - EXPECT_EQ(kWidth, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(kWidth, result.track_adapter_settings().target_width()); + EXPECT_EQ(kWidth, result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(static_cast<double>(kWidth) / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); const int kLargeWidth = 2000; @@ -769,11 +773,11 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_highest_format_, result.Format()); EXPECT_EQ(std::round(kLargeWidth / AspectRatio(result.Format())), - result.track_adapter_settings().max_height); - EXPECT_EQ(kLargeWidth, result.track_adapter_settings().max_width); - EXPECT_EQ(kLargeWidth, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(kLargeWidth, result.track_adapter_settings().target_width()); + EXPECT_EQ(kLargeWidth, result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(static_cast<double>(kLargeWidth) / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -790,11 +794,11 @@ EXPECT_LE(kWidth, result.Width()); EXPECT_EQ(1000, result.Width()); EXPECT_EQ(1000, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(static_cast<double>(kWidth) / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); const int kLargeWidth = 2000; @@ -806,11 +810,11 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_LE(kLargeWidth, result.Width()); EXPECT_EQ(*high_res_highest_format_, result.Format()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(static_cast<double>(kLargeWidth) / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -828,11 +832,11 @@ EXPECT_EQ(low_res_device_->formats[0], result.Format()); // The track is cropped to kLowWidth and keeps the source aspect ratio. EXPECT_EQ(std::round(kLowWidth / AspectRatio(result.Format())), - result.track_adapter_settings().max_height); - EXPECT_EQ(kLowWidth, result.track_adapter_settings().max_width); - EXPECT_EQ(kLowWidth, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(kLowWidth, result.track_adapter_settings().target_width()); + EXPECT_EQ(kLowWidth, result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -853,11 +857,12 @@ EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(1000, result.Width()); EXPECT_EQ(1000, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMinWidth) / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -876,11 +881,12 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(800, result.Width()); EXPECT_EQ(600, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMinWidth) / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -899,11 +905,12 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(1920, result.Width()); EXPECT_EQ(1080, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(static_cast<double>(kMinWidth) / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } } @@ -920,11 +927,11 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(kIdealWidth, result.Width()); EXPECT_EQ(std::round(kIdealWidth / AspectRatio(result.Format())), - result.track_adapter_settings().max_height); - EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_width); - EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(kIdealWidth, result.track_adapter_settings().target_width()); + EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -941,11 +948,12 @@ EXPECT_EQ(480, result.Width()); // The track is cropped to kIdealWidth and keeps the source aspect ratio. EXPECT_EQ(std::round(kIdealWidth / AspectRatio(result.Format())), - result.track_adapter_settings().max_height); - EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(kIdealWidth, result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -959,11 +967,12 @@ EXPECT_EQ(*high_res_highest_format_, result.Format()); // The track is cropped to kIdealWidth and keeps the source aspect ratio. EXPECT_EQ(std::round(kIdealWidth / AspectRatio(result.Format())), - result.track_adapter_settings().max_height); - EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_width); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(kIdealWidth, result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1266,10 +1275,10 @@ EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(*default_closest_format_, result.Format()); EXPECT_EQ(std::round(result.Width() / kAspectRatio), - result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); const int kMinWidth = 500; @@ -1295,10 +1304,10 @@ EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(*default_closest_format_, result.Format()); EXPECT_EQ(std::round(result.Width() / kAspectRatio), - result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); const int kMinHeight = 480; @@ -1327,10 +1336,10 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(*low_res_closest_format_, result.Format()); EXPECT_EQ(std::round(result.Width() / kAspectRatio), - result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1354,10 +1363,10 @@ // Adjust the track resolution to use the minimum aspect ratio, which is // greater than the source's aspect ratio. EXPECT_EQ(std::round(result.Width() / kAspectRatio), - result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); const int kMinWidth = 500; @@ -1386,10 +1395,11 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(*low_res_closest_format_, result.Format()); // The source's native aspect ratio equals the minimum aspect ratio. - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(max_aspect_ratio, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(max_aspect_ratio, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1412,11 +1422,12 @@ EXPECT_EQ(*default_closest_format_, result.Format()); // The track's aspect ratio is adjusted to the maximum, which is lower than // the source's native aspect ratio. - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); EXPECT_EQ(std::round(result.Height() * kAspectRatio), - result.track_adapter_settings().max_width); - EXPECT_EQ(min_aspect_ratio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_width()); + EXPECT_EQ(min_aspect_ratio, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); const int kExactWidth = 360; @@ -1445,11 +1456,12 @@ EXPECT_EQ(720, result.Height()); // The track's aspect ratio is adjusted to the maximum, which is lower than // the source's native aspect ratio. - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); EXPECT_EQ(std::round(result.Height() * kAspectRatio), - result.track_adapter_settings().max_width); - EXPECT_EQ(min_aspect_ratio, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_width()); + EXPECT_EQ(min_aspect_ratio, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1480,12 +1492,12 @@ EXPECT_EQ(*default_closest_format_, result.Format()); // The source's aspect ratio matches the maximum aspect ratio. No adjustment // is required. - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(kMaxAspectRatio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1517,12 +1529,12 @@ EXPECT_EQ(1080, result.Height()); // The track is cropped to support the minimum aspect ratio. EXPECT_EQ(std::round(result.Width() / kMinAspectRatio), - result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(kMinAspectRatio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(result.Width()) / kMinHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } } @@ -1548,13 +1560,13 @@ EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(*default_closest_format_, result.Format()); // The track is cropped to support the ideal aspect ratio. - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); EXPECT_EQ(std::round(result.Height() * kIdealAspectRatio), - result.track_adapter_settings().max_width); + result.track_adapter_settings().target_width()); EXPECT_EQ(min_aspect_ratio, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(max_aspect_ratio, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1574,11 +1586,12 @@ // resulting low value for height. For more typical resolution values, // the at-most 1-pixel error caused by rounding is not an issue. EXPECT_EQ(std::round(result.Width() / kIdealAspectRatio), - result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1592,11 +1605,12 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_highest_format_, result.Format()); EXPECT_EQ(std::round(result.Width() / kIdealAspectRatio), - result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1610,11 +1624,12 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_highest_format_, result.Format()); // In this case there is no rounding error. - EXPECT_EQ(1, result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(1, result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1631,13 +1646,13 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(800, result.Width()); EXPECT_EQ(600, result.Height()); - EXPECT_EQ(kExactHeight, result.track_adapter_settings().max_height); + EXPECT_EQ(kExactHeight, result.track_adapter_settings().target_height()); EXPECT_EQ(kExactHeight * kIdealAspectRatio, - result.track_adapter_settings().max_width); + result.track_adapter_settings().target_width()); EXPECT_EQ(1.0 / kExactHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(result.Width()) / kExactHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1654,13 +1669,13 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(1280, result.Width()); EXPECT_EQ(720, result.Height()); - EXPECT_EQ(kExactHeight, result.track_adapter_settings().max_height); + EXPECT_EQ(kExactHeight, result.track_adapter_settings().target_height()); EXPECT_EQ(kExactHeight * kIdealAspectRatio, - result.track_adapter_settings().max_width); + result.track_adapter_settings().target_width()); EXPECT_EQ(1.0 / kExactHeight, - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(static_cast<double>(result.Width()) / kExactHeight, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } } @@ -1694,10 +1709,10 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(640, result.Width()); EXPECT_EQ(480, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); blink::WebMediaTrackConstraintSet& advanced3 = @@ -1710,10 +1725,10 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(640, result.Width()); EXPECT_EQ(480, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result, 10.0); blink::WebMediaTrackConstraintSet& advanced4 = @@ -1727,10 +1742,10 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(640, result.Width()); EXPECT_EQ(480, result.Height()); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result, 10.0); constraint_factory_.basic().width.SetIdeal(100); @@ -1750,10 +1765,10 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(320, result.Width()); EXPECT_EQ(240, result.Height()); - EXPECT_EQ(320, result.track_adapter_settings().max_width); - EXPECT_EQ(240, result.track_adapter_settings().max_height); - EXPECT_EQ(320.0 / 240.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(320.0 / 240.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(320, result.track_adapter_settings().target_width()); + EXPECT_EQ(240, result.track_adapter_settings().target_height()); + EXPECT_EQ(320.0 / 240.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(320.0 / 240.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result, 10.0); constraint_factory_.basic().width.SetIdeal(2000); @@ -1765,10 +1780,10 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(640, result.Width()); EXPECT_EQ(480, result.Height()); - EXPECT_EQ(640, result.track_adapter_settings().max_width); - EXPECT_EQ(480, result.track_adapter_settings().max_height); - EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(640, result.track_adapter_settings().target_width()); + EXPECT_EQ(480, result.track_adapter_settings().target_height()); + EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result, 10.0); } @@ -1796,10 +1811,12 @@ EXPECT_EQ(1920, result.Width()); EXPECT_EQ(1080, result.Height()); EXPECT_EQ(60.0, result.FrameRate()); - EXPECT_EQ(1920, result.track_adapter_settings().max_width); - EXPECT_EQ(1080, result.track_adapter_settings().max_height); - EXPECT_EQ(1920.0 / 1080.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(1920.0 / 1080.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(1920, result.track_adapter_settings().target_width()); + EXPECT_EQ(1080, result.track_adapter_settings().target_height()); + EXPECT_EQ(1920.0 / 1080.0, + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(1920.0 / 1080.0, + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result, 60.0); } @@ -1820,12 +1837,12 @@ EXPECT_LE(1920, result.Width()); EXPECT_LE(1080, result.Height()); EXPECT_TRUE(result.noise_reduction() && !*result.noise_reduction()); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); EXPECT_EQ(1920.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(result.Width() / 1080.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1852,12 +1869,12 @@ EXPECT_LE(640, result.Width()); EXPECT_LE(480, result.Height()); EXPECT_TRUE(result.noise_reduction() && *result.noise_reduction()); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); EXPECT_EQ(640.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(result.Width() / 480.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1880,12 +1897,12 @@ EXPECT_LE(1080, result.Height()); // Should select default noise reduction setting. EXPECT_TRUE(!result.noise_reduction()); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); EXPECT_EQ(1920.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(result.Width() / 1080.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } } @@ -1909,10 +1926,10 @@ EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(640, result.Width()); EXPECT_EQ(480, result.Height()); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().max_aspect_ratio); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); + EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1938,11 +1955,11 @@ EXPECT_EQ(200, result.Width()); EXPECT_EQ(200, result.Height()); EXPECT_EQ(40, result.FrameRate()); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); EXPECT_EQ(1.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1968,12 +1985,12 @@ EXPECT_EQ(1000, result.Width()); EXPECT_EQ(1000, result.Height()); EXPECT_EQ(20, result.FrameRate()); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); + EXPECT_EQ(result.Height(), result.track_adapter_settings().target_height()); EXPECT_EQ(800.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); + result.track_adapter_settings().min_aspect_ratio()); EXPECT_EQ(result.Width() / 600.0, - result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -1994,11 +2011,11 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_highest_format_, result.Format()); // The track is cropped to support the exact aspect ratio. - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(std::round(result.Height() / 2300.0), - result.track_adapter_settings().max_height); - EXPECT_EQ(2300.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(2300.0, result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(2300.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(2300.0, result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -2019,11 +2036,11 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_highest_format_, result.Format()); // The track is cropped to support the min aspect ratio. - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(std::round(result.Height() / 2300.0), - result.track_adapter_settings().max_height); - EXPECT_EQ(2300.0, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(2300.0, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } @@ -2205,9 +2222,9 @@ // set, but the third set must be applied. EXPECT_EQ(result.device_id(), low_res_device_->device_id); EXPECT_EQ(result.Width(), 800); - EXPECT_EQ(result.track_adapter_settings().max_width, 800); + EXPECT_EQ(result.track_adapter_settings().target_width(), 800); EXPECT_EQ(result.Height(), 600); - EXPECT_EQ(result.track_adapter_settings().max_height, 600); + EXPECT_EQ(result.track_adapter_settings().target_height(), 600); } TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, @@ -2250,11 +2267,12 @@ // selected. EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(*default_closest_format_, result.Format()); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); + EXPECT_EQ(result.Width(), result.track_adapter_settings().target_width()); EXPECT_EQ(std::round(result.Width() / 17.0), - result.track_adapter_settings().max_height); - EXPECT_EQ(17, result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio); + result.track_adapter_settings().target_height()); + EXPECT_EQ(17, result.track_adapter_settings().min_aspect_ratio()); + EXPECT_EQ(result.Width(), + result.track_adapter_settings().max_aspect_ratio()); CheckTrackAdapterSettingsEqualsFrameRate(result); } }
diff --git a/content/renderer/media/stream/media_stream_video_source.cc b/content/renderer/media/stream/media_stream_video_source.cc index abaffe1f4..c7cbece 100644 --- a/content/renderer/media/stream/media_stream_video_source.cc +++ b/content/renderer/media/stream/media_stream_video_source.cc
@@ -405,11 +405,11 @@ // Calculate resulting frame size if the source delivers frames // according to the current format. Note: Format may change later. gfx::Size desired_size; - VideoTrackAdapter::CalculateTargetSize(false /* is_rotated */, - GetCurrentFormat()->frame_size, - adapter_settings, &desired_size); + VideoTrackAdapter::CalculateDesiredSize(false /* is_rotated */, + GetCurrentFormat()->frame_size, + adapter_settings, &desired_size); track->SetTargetSizeAndFrameRate(desired_size.width(), desired_size.height(), - adapter_settings.max_frame_rate); + adapter_settings.max_frame_rate()); } MediaStreamVideoSource::PendingTrackInfo::PendingTrackInfo(
diff --git a/content/renderer/media/stream/media_stream_video_source.h b/content/renderer/media/stream/media_stream_video_source.h index 82da3b1f..0e6dac7 100644 --- a/content/renderer/media/stream/media_stream_video_source.h +++ b/content/renderer/media/stream/media_stream_video_source.h
@@ -31,7 +31,7 @@ class MediaStreamVideoTrack; class VideoTrackAdapter; -struct VideoTrackAdapterSettings; +class VideoTrackAdapterSettings; // MediaStreamVideoSource is an interface used for sending video frames to a // MediaStreamVideoTrack.
diff --git a/content/renderer/media/stream/media_stream_video_source_unittest.cc b/content/renderer/media/stream/media_stream_video_source_unittest.cc index ff1c566..5940b4df4 100644 --- a/content/renderer/media/stream/media_stream_video_source_unittest.cc +++ b/content/renderer/media/stream/media_stream_video_source_unittest.cc
@@ -107,8 +107,7 @@ double frame_rate, bool detect_rotation = false) { blink::WebMediaStreamTrack track = CreateTrack( - "123", - VideoTrackAdapterSettings(width, height, 0.0, HUGE_VAL, frame_rate), + "123", VideoTrackAdapterSettings(gfx::Size(width, height), frame_rate), base::Optional<bool>(), false, 0.0); EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks()); @@ -200,12 +199,11 @@ CreateTrackAndStartSource(expected_width1, expected_height1, MediaStreamVideoSource::kDefaultFrameRate); - blink::WebMediaStreamTrack track2 = - CreateTrack("dummy", - VideoTrackAdapterSettings( - expected_width2, expected_height2, 0.0, HUGE_VAL, - MediaStreamVideoSource::kDefaultFrameRate), - base::Optional<bool>(), false, 0.0); + blink::WebMediaStreamTrack track2 = CreateTrack( + "dummy", + VideoTrackAdapterSettings(gfx::Size(expected_width2, expected_height2), + MediaStreamVideoSource::kDefaultFrameRate), + base::Optional<bool>(), false, 0.0); MockMediaStreamVideoSink sink1; sink1.ConnectToTrack(track1); @@ -463,7 +461,7 @@ EXPECT_EQ(settings.aspect_ratio, 640.0 / 480.0); source()->ReconfigureTrack( - native_track, VideoTrackAdapterSettings(630, 470, 0, HUGE_VAL, 30.0)); + native_track, VideoTrackAdapterSettings(gfx::Size(630, 470), 30.0)); native_track->GetSettings(settings); EXPECT_EQ(settings.width, 630); EXPECT_EQ(settings.height, 470); @@ -500,7 +498,7 @@ blink::WebMediaStreamSource::kReadyStateEnded); source()->ReconfigureTrack( - native_track, VideoTrackAdapterSettings(630, 470, 0, HUGE_VAL, 30.0)); + native_track, VideoTrackAdapterSettings(gfx::Size(630, 470), 30.0)); blink::WebMediaStreamTrack::Settings stopped_settings; native_track->GetSettings(stopped_settings); EXPECT_EQ(stopped_settings.width, -1);
diff --git a/content/renderer/media/stream/media_stream_video_track.h b/content/renderer/media/stream/media_stream_video_track.h index c46e29b..6ad08d29 100644 --- a/content/renderer/media/stream/media_stream_video_track.h +++ b/content/renderer/media/stream/media_stream_video_track.h
@@ -21,7 +21,7 @@ namespace content { -struct VideoTrackAdapterSettings; +class VideoTrackAdapterSettings; // MediaStreamVideoTrack is a video specific representation of a // blink::WebMediaStreamTrack in content. It is owned by the blink object
diff --git a/content/renderer/media/stream/media_stream_video_track_unittest.cc b/content/renderer/media/stream/media_stream_video_track_unittest.cc index 19a5ec9..8dd3361 100644 --- a/content/renderer/media/stream/media_stream_video_track_unittest.cc +++ b/content/renderer/media/stream/media_stream_video_track_unittest.cc
@@ -4,6 +4,8 @@ #include <stdint.h> +#include <utility> + #include "base/bind.h" #include "base/bind_helpers.h" #include "base/callback.h" @@ -308,8 +310,9 @@ const int kAdjustedWidth = 600; const int kAdjustedHeight = 400; const double kAdjustedFrameRate = 20.0; - VideoTrackAdapterSettings adapter_settings(kAdjustedWidth, kAdjustedHeight, - 0.0, 10000.0, kAdjustedFrameRate); + VideoTrackAdapterSettings adapter_settings( + gfx::Size(kAdjustedWidth, kAdjustedHeight), 0.0, 10000.0, + kAdjustedFrameRate); blink::WebMediaStreamTrack track = CreateTrackWithSettings(adapter_settings); MediaStreamVideoTrack* const native_track = MediaStreamVideoTrack::GetVideoTrack(track);
diff --git a/content/renderer/media/stream/mock_media_stream_registry.h b/content/renderer/media/stream/mock_media_stream_registry.h index 1f04732..7f2bbfe9 100644 --- a/content/renderer/media/stream/mock_media_stream_registry.h +++ b/content/renderer/media/stream/mock_media_stream_registry.h
@@ -12,7 +12,7 @@ namespace content { -struct VideoTrackAdapterSettings; +class VideoTrackAdapterSettings; // This class encapsulates creation of a Blink MediaStream having inside the // necessary Blink and Chromium, track and source. The Chrome Video source is
diff --git a/content/renderer/media/stream/user_media_client_impl_unittest.cc b/content/renderer/media/stream/user_media_client_impl_unittest.cc index f2f1955..a647704b 100644 --- a/content/renderer/media/stream/user_media_client_impl_unittest.cc +++ b/content/renderer/media/stream/user_media_client_impl_unittest.cc
@@ -889,14 +889,16 @@ const VideoTrackAdapterSettings& track_settings = video_capture_settings.track_adapter_settings(); - EXPECT_EQ(track_settings.max_width, MediaStreamVideoSource::kDefaultWidth); - EXPECT_EQ(track_settings.max_height, MediaStreamVideoSource::kDefaultHeight); - EXPECT_EQ(track_settings.min_aspect_ratio, + EXPECT_EQ(track_settings.target_width(), + MediaStreamVideoSource::kDefaultWidth); + EXPECT_EQ(track_settings.target_height(), + MediaStreamVideoSource::kDefaultHeight); + EXPECT_EQ(track_settings.min_aspect_ratio(), 1.0 / MediaStreamVideoSource::kDefaultHeight); - EXPECT_EQ(track_settings.max_aspect_ratio, + EXPECT_EQ(track_settings.max_aspect_ratio(), MediaStreamVideoSource::kDefaultWidth); // 0.0 is the default max_frame_rate and it indicates no frame-rate adjustment - EXPECT_EQ(track_settings.max_frame_rate, 0.0); + EXPECT_EQ(track_settings.max_frame_rate(), 0.0); } TEST_F(UserMediaClientImplTest, DefaultTabCapturePropagate) { @@ -949,12 +951,12 @@ const VideoTrackAdapterSettings& track_settings = video_capture_settings.track_adapter_settings(); - EXPECT_EQ(track_settings.max_width, kDefaultScreenCastWidth); - EXPECT_EQ(track_settings.max_height, kDefaultScreenCastHeight); - EXPECT_EQ(track_settings.min_aspect_ratio, 1.0 / kMaxScreenCastDimension); - EXPECT_EQ(track_settings.max_aspect_ratio, kMaxScreenCastDimension); + EXPECT_EQ(track_settings.target_width(), kDefaultScreenCastWidth); + EXPECT_EQ(track_settings.target_height(), kDefaultScreenCastHeight); + EXPECT_EQ(track_settings.min_aspect_ratio(), 1.0 / kMaxScreenCastDimension); + EXPECT_EQ(track_settings.max_aspect_ratio(), kMaxScreenCastDimension); // 0.0 is the default max_frame_rate and it indicates no frame-rate adjustment - EXPECT_EQ(track_settings.max_frame_rate, 0.0); + EXPECT_EQ(track_settings.max_frame_rate(), 0.0); } TEST_F(UserMediaClientImplTest, DefaultDesktopCapturePropagate) { @@ -1008,12 +1010,12 @@ const VideoTrackAdapterSettings& track_settings = video_capture_settings.track_adapter_settings(); - EXPECT_EQ(track_settings.max_width, kDefaultScreenCastWidth); - EXPECT_EQ(track_settings.max_height, kDefaultScreenCastHeight); - EXPECT_EQ(track_settings.min_aspect_ratio, 1.0 / kMaxScreenCastDimension); - EXPECT_EQ(track_settings.max_aspect_ratio, kMaxScreenCastDimension); + EXPECT_EQ(track_settings.target_width(), kDefaultScreenCastWidth); + EXPECT_EQ(track_settings.target_height(), kDefaultScreenCastHeight); + EXPECT_EQ(track_settings.min_aspect_ratio(), 1.0 / kMaxScreenCastDimension); + EXPECT_EQ(track_settings.max_aspect_ratio(), kMaxScreenCastDimension); // 0.0 is the default max_frame_rate and it indicates no frame-rate adjustment - EXPECT_EQ(track_settings.max_frame_rate, 0.0); + EXPECT_EQ(track_settings.max_frame_rate(), 0.0); } TEST_F(UserMediaClientImplTest, NonDefaultAudioConstraintsPropagate) {
diff --git a/content/renderer/media/stream/video_track_adapter.cc b/content/renderer/media/stream/video_track_adapter.cc index cbe15d6..b0cc9a9 100644 --- a/content/renderer/media/stream/video_track_adapter.cc +++ b/content/renderer/media/stream/video_track_adapter.cc
@@ -139,7 +139,7 @@ keep_frame_counter_(0.0) { DCHECK(renderer_task_runner_.get()); DCHECK(io_thread_checker_.CalledOnValidThread()); - CHECK_NE(0, settings_.max_aspect_ratio); + CHECK_NE(0, settings_.max_aspect_ratio()); const std::string max_fps_str = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( @@ -147,20 +147,13 @@ if (!max_fps_str.empty()) { double value; if (base::StringToDouble(max_fps_str, &value) && value >= 0.0) { - DVLOG(1) << "Overriding max frame rate. Was=" << settings_.max_frame_rate - << ", Now=" << value; - settings_.max_frame_rate = value; + DVLOG(1) << "Overriding max frame rate. Was=" + << settings_.max_frame_rate() << ", Now=" << value; + settings_.set_max_frame_rate(value); } else { DLOG(ERROR) << "Unable to set max fps to " << max_fps_str; } } - - DVLOG(3) << "VideoFrameResolutionAdapter(" - << "{ max_width =" << settings_.max_width << "}, " - << "{ max_height =" << settings_.max_height << "}, " - << "{ min_aspect_ratio =" << settings_.min_aspect_ratio << "}, " - << "{ max_aspect_ratio_ =" << settings_.max_aspect_ratio << "}" - << "{ max_frame_rate_ =" << settings_.max_frame_rate << "}) "; } VideoTrackAdapter:: @@ -244,8 +237,8 @@ scoped_refptr<media::VideoFrame> video_frame(frame); gfx::Size desired_size; - CalculateTargetSize(is_device_rotated, frame->natural_size(), settings_, - &desired_size); + CalculateDesiredSize(is_device_rotated, frame->natural_size(), settings_, + &desired_size); if (desired_size != frame->natural_size()) { // Get the largest centered rectangle with the same aspect ratio of // |desired_size| that fits entirely inside of |frame->visible_rect()|. @@ -296,9 +289,9 @@ // Do not drop frames if max frame rate hasn't been specified or the source // frame rate is known and is lower than max. - if (settings_.max_frame_rate == 0.0f || + if (settings_.max_frame_rate() == 0.0f || (source_frame_rate > 0 && - source_frame_rate <= settings_.max_frame_rate)) { + source_frame_rate <= settings_.max_frame_rate())) { return false; } @@ -333,12 +326,12 @@ frame_rate_ = 100 / delta_ms + 0.9 * frame_rate_; // Prefer to not drop frames. - if (settings_.max_frame_rate + 0.5f > frame_rate_) + if (settings_.max_frame_rate() + 0.5f > frame_rate_) return false; // Keep this frame. // The input frame rate is higher than requested. // Decide if we should keep this frame or drop it. - keep_frame_counter_ += settings_.max_frame_rate / frame_rate_; + keep_frame_counter_ += settings_.max_frame_rate() / frame_rate_; if (keep_frame_counter_ >= 1) { keep_frame_counter_ -= 1; // Keep the frame. @@ -349,30 +342,33 @@ } VideoTrackAdapterSettings::VideoTrackAdapterSettings() - : VideoTrackAdapterSettings(std::numeric_limits<int>::max(), - std::numeric_limits<int>::max(), + : VideoTrackAdapterSettings(base::nullopt, 0.0, std::numeric_limits<double>::max(), 0.0) {} -VideoTrackAdapterSettings::VideoTrackAdapterSettings(int max_width, - int max_height, - double min_aspect_ratio, - double max_aspect_ratio, - double max_frame_rate) - : max_width(max_width), - max_height(max_height), - min_aspect_ratio(min_aspect_ratio), - max_aspect_ratio(max_aspect_ratio), - max_frame_rate(max_frame_rate) { - DCHECK_GE(max_width, 0); - DCHECK_GE(max_height, 0); - DCHECK(!std::isnan(min_aspect_ratio)); - DCHECK_GE(min_aspect_ratio, 0.0); - DCHECK(!std::isnan(max_aspect_ratio)); - DCHECK_GE(max_aspect_ratio, min_aspect_ratio); - DCHECK(!std::isnan(max_frame_rate)); - DCHECK_GE(max_frame_rate, 0.0); +VideoTrackAdapterSettings::VideoTrackAdapterSettings( + const gfx::Size& target_size, + double max_frame_rate) + : VideoTrackAdapterSettings(target_size, 0.0, HUGE_VAL, max_frame_rate) {} + +VideoTrackAdapterSettings::VideoTrackAdapterSettings( + base::Optional<gfx::Size> target_size, + double min_aspect_ratio, + double max_aspect_ratio, + double max_frame_rate) + : target_size_(std::move(target_size)), + min_aspect_ratio_(min_aspect_ratio), + max_aspect_ratio_(max_aspect_ratio), + max_frame_rate_(max_frame_rate) { + DCHECK(!target_size_ || + (target_size_->width() >= 0 && target_size_->height() >= 0)); + DCHECK(!std::isnan(min_aspect_ratio_)); + DCHECK_GE(min_aspect_ratio_, 0.0); + DCHECK(!std::isnan(max_aspect_ratio_)); + DCHECK_GE(max_aspect_ratio_, min_aspect_ratio_); + DCHECK(!std::isnan(max_frame_rate_)); + DCHECK_GE(max_frame_rate_, 0.0); } VideoTrackAdapterSettings::VideoTrackAdapterSettings( @@ -382,10 +378,10 @@ bool VideoTrackAdapterSettings::operator==( const VideoTrackAdapterSettings& other) const { - return max_width == other.max_width && max_height == other.max_height && - min_aspect_ratio == other.min_aspect_ratio && - max_aspect_ratio == other.max_aspect_ratio && - max_frame_rate == other.max_frame_rate; + return target_size_ == other.target_size_ && + min_aspect_ratio_ == other.min_aspect_ratio_ && + max_aspect_ratio_ == other.max_aspect_ratio_ && + max_frame_rate_ == other.max_frame_rate_; } VideoTrackAdapter::VideoTrackAdapter( @@ -479,53 +475,65 @@ } // static -void VideoTrackAdapter::CalculateTargetSize( +bool VideoTrackAdapter::CalculateDesiredSize( bool is_rotated, const gfx::Size& original_input_size, const VideoTrackAdapterSettings& settings, gfx::Size* desired_size) { - // Perform all the cropping computations as if the device was never rotated. + // Perform all the rescaling computations as if the device was never rotated. int width = is_rotated ? original_input_size.height() : original_input_size.width(); int height = is_rotated ? original_input_size.width() : original_input_size.height(); + DCHECK_GE(width, 0); + DCHECK_GE(height, 0); - // Adjust the size of the frame to the maximum allowed size. - width = ClampToValidDimension(std::min(width, settings.max_width)); - height = ClampToValidDimension(std::min(height, settings.max_height)); + // Rescale only if a target size was provided in |settings|. + if (settings.target_size()) { + // Adjust the size of the frame to the maximum allowed size. + width = + ClampToValidDimension(std::min(width, settings.target_size()->width())); + height = ClampToValidDimension( + std::min(height, settings.target_size()->height())); - // If the area of the frame is zero, ignore aspect-ratio correction. - if (width * height > 0) { - double ratio = static_cast<double>(width) / height; - DCHECK(std::isfinite(ratio)); - if (ratio > settings.max_aspect_ratio || - ratio < settings.min_aspect_ratio) { - // Make sure |min_aspect_ratio| <= |desired_ratio| <= |max_aspect_ratio|. - double desired_ratio = - std::max(std::min(ratio, settings.max_aspect_ratio), - settings.min_aspect_ratio); - DCHECK(std::isfinite(desired_ratio)); - DCHECK_NE(desired_ratio, 0.0); + // If the area of the frame is zero, ignore aspect-ratio correction. + if (width * height > 0) { + double ratio = static_cast<double>(width) / height; + DCHECK(std::isfinite(ratio)); + if (ratio > settings.max_aspect_ratio() || + ratio < settings.min_aspect_ratio()) { + // Make sure |min_aspect_ratio| <= |desired_ratio| <= + // |max_aspect_ratio|. + double desired_ratio = + std::max(std::min(ratio, settings.max_aspect_ratio()), + settings.min_aspect_ratio()); + DCHECK(std::isfinite(desired_ratio)); + DCHECK_NE(desired_ratio, 0.0); - if (ratio < desired_ratio) { - double desired_height_fp = (height * ratio) / desired_ratio; - DCHECK(std::isfinite(desired_height_fp)); - height = static_cast<int>(desired_height_fp); - // Make sure we scale to an even height to avoid rounding errors - height = (height + 1) & ~1; - } else if (ratio > desired_ratio) { - double desired_width_fp = (width * desired_ratio) / ratio; - DCHECK(std::isfinite(desired_width_fp)); - width = static_cast<int>(desired_width_fp); - // Make sure we scale to an even width to avoid rounding errors. - width = (width + 1) & ~1; + if (ratio < desired_ratio) { + double desired_height_fp = (height * ratio) / desired_ratio; + DCHECK(std::isfinite(desired_height_fp)); + height = static_cast<int>(desired_height_fp); + // Make sure we scale to an even height to avoid rounding errors + height = (height + 1) & ~1; + } else if (ratio > desired_ratio) { + double desired_width_fp = (width * desired_ratio) / ratio; + DCHECK(std::isfinite(desired_width_fp)); + width = static_cast<int>(desired_width_fp); + // Make sure we scale to an even width to avoid rounding errors. + width = (width + 1) & ~1; + } } } + } else if (width > media::limits::kMaxDimension || + height > media::limits::kMaxDimension) { + return false; } // Output back taking device rotation into account. *desired_size = is_rotated ? gfx::Size(height, width) : gfx::Size(width, height); + return true; } void VideoTrackAdapter::StartFrameMonitoringOnIO(
diff --git a/content/renderer/media/stream/video_track_adapter.h b/content/renderer/media/stream/video_track_adapter.h index c2cf8f9d..1faaeabb 100644 --- a/content/renderer/media/stream/video_track_adapter.h +++ b/content/renderer/media/stream/video_track_adapter.h
@@ -20,10 +20,19 @@ namespace content { -struct CONTENT_EXPORT VideoTrackAdapterSettings { +class CONTENT_EXPORT VideoTrackAdapterSettings { + public: + // Creates a VideoTrackAdapterSettings with no target resolution or frame rate + // and without any constraints on the resolution. VideoTrackAdapterSettings(); - VideoTrackAdapterSettings(int max_width, - int max_height, + // Creates a VideoTrackAdapterSettings with a given target resolution and + // and frame rate, and without any constraints on the resolution. + VideoTrackAdapterSettings(const gfx::Size& target_size, + double max_frame_rate); + // Creates a VideoTrackAdapterSettings with the specified resolution, frame + // rate and resolution constraints. If |target_size| is null, it means that + // no video processing is desired. + VideoTrackAdapterSettings(base::Optional<gfx::Size> target_size, double min_aspect_ratio, double max_aspect_ratio, double max_frame_rate); @@ -31,14 +40,30 @@ VideoTrackAdapterSettings& operator=(const VideoTrackAdapterSettings& other); bool operator==(const VideoTrackAdapterSettings& other) const; - int max_width; - int max_height; - double min_aspect_ratio; - double max_aspect_ratio; - // A |max_frame_rate| of zero is used to signal that no frame-rate adjustment - // is necessary. + const base::Optional<gfx::Size>& target_size() const { return target_size_; } + int target_width() const { + DCHECK(target_size_); + return target_size_->width(); + } + int target_height() const { + DCHECK(target_size_); + return target_size_->height(); + } + double min_aspect_ratio() const { return min_aspect_ratio_; } + double max_aspect_ratio() const { return max_aspect_ratio_; } + double max_frame_rate() const { return max_frame_rate_; } + void set_max_frame_rate(double max_frame_rate) { + max_frame_rate_ = max_frame_rate; + } + + private: + base::Optional<gfx::Size> target_size_; + double min_aspect_ratio_; + double max_aspect_ratio_; + // A |max_frame_rate| of zero is used to signal that no frame-rate + // adjustment is necessary. // TODO(guidou): Change this to base::Optional. http://crbug.com/734528 - double max_frame_rate; + double max_frame_rate_; }; // VideoTrackAdapter is a helper class used by MediaStreamVideoSource used for @@ -91,7 +116,10 @@ void SetSourceFrameSize(const gfx::Size& source_frame_size); // Exported for testing. - CONTENT_EXPORT static void CalculateTargetSize( + // Returns true if |desired_size| is updated successfully, false otherwise. + // |desired_size| is not updated |settings| has rescaling disabled and + // |input_size| is invalid. + CONTENT_EXPORT static bool CalculateDesiredSize( bool is_rotated, const gfx::Size& input_size, const VideoTrackAdapterSettings& settings,
diff --git a/content/renderer/media/stream/video_track_adapter_unittest.cc b/content/renderer/media/stream/video_track_adapter_unittest.cc index 1aea48a..10f919a 100644 --- a/content/renderer/media/stream/video_track_adapter_unittest.cc +++ b/content/renderer/media/stream/video_track_adapter_unittest.cc
@@ -30,41 +30,41 @@ kLargeDimension > kMaxWidth && kLargeDimension > kMaxHeight, "kLargeDimension must be greater than kMaxWidth and kMaxHeight"); const VideoTrackAdapterSettings kVideoTrackAdapterSettings( - kMaxWidth, kMaxHeight, 0.1 /* min_aspect_ratio */, + gfx::Size(kMaxWidth, kMaxHeight), 0.1 /* min_aspect_ratio */, 2.0 /* max_aspect_ratio */, 0.0 /* max_frame_rate */); const bool kIsRotatedValues[] = {true, false}; for (bool is_rotated : kIsRotatedValues) { gfx::Size desired_size; - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( is_rotated, gfx::Size(0, 0), kVideoTrackAdapterSettings, &desired_size); EXPECT_EQ(desired_size.width(), 0); EXPECT_EQ(desired_size.height(), 0); // Zero width. - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( is_rotated, gfx::Size(0, kSmallDimension), kVideoTrackAdapterSettings, &desired_size); EXPECT_EQ(desired_size.width(), 0); EXPECT_EQ(desired_size.height(), kSmallDimension); // Zero height. - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( is_rotated, gfx::Size(kSmallDimension, 0), kVideoTrackAdapterSettings, &desired_size); EXPECT_EQ(desired_size.width(), kSmallDimension); EXPECT_EQ(desired_size.height(), 0); // Requires "cropping" of height. - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( is_rotated, gfx::Size(0, kLargeDimension), kVideoTrackAdapterSettings, &desired_size); EXPECT_EQ(desired_size.width(), 0); EXPECT_EQ(desired_size.height(), is_rotated ? kMaxWidth : kMaxHeight); // Requires "cropping" of width. - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( is_rotated, gfx::Size(kLargeDimension, 0), kVideoTrackAdapterSettings, &desired_size); EXPECT_EQ(desired_size.width(), is_rotated ? kMaxHeight : kMaxWidth); @@ -90,60 +90,57 @@ gfx::Size desired_size; - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( false /* is_rotated */, gfx::Size(kInputWidth, kInputHeight), - VideoTrackAdapterSettings(0 /* max_width */, 0 /* max_height */, - kMinAspectRatio, kMaxAspectRatio, - 0.0 /* max_frame_rate */), + VideoTrackAdapterSettings(gfx::Size(0, 0), kMinAspectRatio, + kMaxAspectRatio, 0.0 /* max_frame_rate */), &desired_size); EXPECT_EQ(desired_size.width(), 0); EXPECT_EQ(desired_size.height(), 0); // Width is cropped to zero. - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( false /* is_rotated */, gfx::Size(kInputWidth, kInputHeight), - VideoTrackAdapterSettings( - 0 /* max_width */, kLargeMaxDimension /* max_height */, - kMinAspectRatio, kMaxAspectRatio, 0.0 /* max_frame_rate */), + VideoTrackAdapterSettings(gfx::Size(0, kLargeMaxDimension), 0.0, + HUGE_VAL, // kMinAspectRatio, kMaxAspectRatio, + 0.0 /* max_frame_rate */), &desired_size); EXPECT_EQ(desired_size.width(), 0); EXPECT_EQ(desired_size.height(), kInputHeight); // Requires "cropping" of width and height. - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( false /* is_rotated */, gfx::Size(kInputWidth, kInputHeight), - VideoTrackAdapterSettings( - 0 /* max_width */, kSmallMaxDimension /* max_height */, - kMinAspectRatio, kMaxAspectRatio, 0.0 /* max_frame_rate */), + VideoTrackAdapterSettings(gfx::Size(0, kSmallMaxDimension), + kMinAspectRatio, kMaxAspectRatio, + 0.0 /* max_frame_rate */), &desired_size); EXPECT_EQ(desired_size.width(), 0); EXPECT_EQ(desired_size.height(), kSmallMaxDimension); // Height is cropped to zero. - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( false /* is_rotated */, gfx::Size(kInputWidth, kInputHeight), - VideoTrackAdapterSettings(kLargeMaxDimension /* max_width */, - 0 /* max_height */, kMinAspectRatio, - kMaxAspectRatio, 0.0 /* max_frame_rate */), + VideoTrackAdapterSettings(gfx::Size(kLargeMaxDimension, 0), + kMinAspectRatio, kMaxAspectRatio, + 0.0 /* max_frame_rate */), &desired_size); EXPECT_EQ(desired_size.width(), kInputWidth); EXPECT_EQ(desired_size.height(), 0); // Requires "cropping" of width and height. - VideoTrackAdapter::CalculateTargetSize( + VideoTrackAdapter::CalculateDesiredSize( false /* is_rotated */, gfx::Size(kInputWidth, kInputHeight), - VideoTrackAdapterSettings(kSmallMaxDimension /* max_width */, - 0 /* max_height */, kMinAspectRatio, - kMaxAspectRatio, 0.0 /* max_frame_rate */), + VideoTrackAdapterSettings( + gfx::Size(kSmallMaxDimension /* max_width */, 0 /* max_height */), + kMinAspectRatio, kMaxAspectRatio, 0.0 /* max_frame_rate */), &desired_size); EXPECT_EQ(desired_size.width(), kSmallMaxDimension); EXPECT_EQ(desired_size.height(), 0); } -// Test that large frame sizes are clamped to the maximum supported dimension. -TEST(VideoTrackAdapterTest, ClampToMaxDimension) { - const double kMinAspectRatio = 0.0; - const double kMaxAspectRatio = HUGE_VAL; +// Test that large frames are handled correctly. +TEST(VideoTrackAdapterTest, LargeFrames) { const int kInputWidth = std::numeric_limits<int>::max(); const int kInputHeight = std::numeric_limits<int>::max(); const int kMaxWidth = std::numeric_limits<int>::max(); @@ -151,13 +148,44 @@ gfx::Size desired_size; - VideoTrackAdapter::CalculateTargetSize( + // If a target size is provided in VideoTrackAdapterSettings, rescaling is + // allowed and frames must be clamped to the maximum allowed size, even if the + // target exceeds the system maximum. + bool success = VideoTrackAdapter::CalculateDesiredSize( false /* is_rotated */, gfx::Size(kInputWidth, kInputHeight), - VideoTrackAdapterSettings(kMaxWidth, kMaxHeight, kMinAspectRatio, - kMaxAspectRatio, 0.0 /* max_frame_rate */), + VideoTrackAdapterSettings(gfx::Size(kMaxWidth, kMaxHeight), + 0.0 /* max_frame_rate */), &desired_size); + EXPECT_TRUE(success); EXPECT_EQ(desired_size.width(), media::limits::kMaxDimension); EXPECT_EQ(desired_size.height(), media::limits::kMaxDimension); + + // If no target size is provided in VideoTrackAdapterSettings, rescaling is + // disabled and |desired_size| is left unmodified. + desired_size.set_width(0); + desired_size.set_height(0); + success = VideoTrackAdapter::CalculateDesiredSize( + false /* is_rotated */, gfx::Size(kInputWidth, kInputHeight), + VideoTrackAdapterSettings(), &desired_size); + EXPECT_FALSE(success); + EXPECT_EQ(desired_size.width(), 0); + EXPECT_EQ(desired_size.height(), 0); +} + +// Test that regular frames are not rescaled if settings do not specify a target +// resolution. +TEST(VideoTrackAdapterTest, NoRescaling) { + const int kInputWidth = 640; + const int kInputHeight = 480; + + // No target size, + gfx::Size desired_size; + bool success = VideoTrackAdapter::CalculateDesiredSize( + false /* is_rotated */, gfx::Size(kInputWidth, kInputHeight), + VideoTrackAdapterSettings(), &desired_size); + EXPECT_TRUE(success); + EXPECT_EQ(desired_size.width(), kInputWidth); + EXPECT_EQ(desired_size.height(), kInputHeight); } } // namespace content
diff --git a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc index 099b1a0e..dc1bb0db 100644 --- a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc +++ b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc
@@ -956,27 +956,28 @@ measurement_interval.get(); ON_CALL(*measurement_interval, ReadRemoteCharacteristic(_, _)) - .WillByDefault(Invoke([adapter_ptr, device_ptr, measurement_ptr, - disconnect, succeeds]( - const BluetoothRemoteGattCharacteristic::ValueCallback& callback, - const BluetoothRemoteGattCharacteristic::ErrorCallback& - error_callback) { - base::Closure pending; - if (succeeds) { - pending = base::Bind(callback, std::vector<uint8_t>({1})); - } else { - pending = base::Bind(error_callback, - BluetoothRemoteGattService::GATT_ERROR_FAILED); - } - device_ptr->PushPendingCallback(std::move(pending)); - if (disconnect) { - device_ptr->SetConnected(false); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&NotifyDeviceChanged, - base::RetainedRef(adapter_ptr), device_ptr)); - } - })); + .WillByDefault(Invoke( + [adapter_ptr, device_ptr, disconnect, succeeds]( + const BluetoothRemoteGattCharacteristic::ValueCallback& callback, + const BluetoothRemoteGattCharacteristic::ErrorCallback& + error_callback) { + base::Closure pending; + if (succeeds) { + pending = base::Bind(callback, std::vector<uint8_t>({1})); + } else { + pending = + base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_FAILED); + } + device_ptr->PushPendingCallback(std::move(pending)); + if (disconnect) { + device_ptr->SetConnected(false); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&NotifyDeviceChanged, + base::RetainedRef(adapter_ptr), device_ptr)); + } + })); ON_CALL(*measurement_interval, WriteRemoteCharacteristic(_, _, _)) .WillByDefault(Invoke([adapter_ptr, device_ptr, disconnect, succeeds]( @@ -1030,28 +1031,29 @@ BluetoothUUID(kUserDescriptionUUID), false, device::BluetoothRemoteGattCharacteristic::PROPERTY_READ); - NiceMockBluetoothGattDescriptor* user_descriptor_ptr = user_descriptor.get(); ON_CALL(*user_descriptor, ReadRemoteDescriptor(_, _)) - .WillByDefault(Invoke([adapter_ptr, device_ptr, user_descriptor_ptr, - disconnect, succeeds]( - const BluetoothRemoteGattDescriptor::ValueCallback& callback, - const BluetoothRemoteGattDescriptor::ErrorCallback& error_callback) { - base::Closure pending; - if (succeeds) { - pending = base::Bind(callback, std::vector<uint8_t>({1})); - } else { - pending = base::Bind(error_callback, - BluetoothRemoteGattService::GATT_ERROR_FAILED); - } - device_ptr->PushPendingCallback(std::move(pending)); - if (disconnect) { - device_ptr->SetConnected(false); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&NotifyDeviceChanged, - base::RetainedRef(adapter_ptr), device_ptr)); - } - })); + .WillByDefault(Invoke( + [adapter_ptr, device_ptr, disconnect, succeeds]( + const BluetoothRemoteGattDescriptor::ValueCallback& callback, + const BluetoothRemoteGattDescriptor::ErrorCallback& + error_callback) { + base::Closure pending; + if (succeeds) { + pending = base::Bind(callback, std::vector<uint8_t>({1})); + } else { + pending = + base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_FAILED); + } + device_ptr->PushPendingCallback(std::move(pending)); + if (disconnect) { + device_ptr->SetConnected(false); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&NotifyDeviceChanged, + base::RetainedRef(adapter_ptr), device_ptr)); + } + })); ON_CALL(*user_descriptor, WriteRemoteDescriptor(_, _, _)) .WillByDefault(Invoke([adapter_ptr, device_ptr, disconnect, succeeds](
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index dff9168..8278263 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1348,6 +1348,7 @@ "../browser/devtools/devtools_manager_unittest.cc", "../browser/devtools/devtools_video_consumer_unittest.cc", "../browser/devtools/protocol/tracing_handler_unittest.cc", + "../browser/devtools/protocol_unittest.cc", "../browser/dom_storage/dom_storage_area_unittest.cc", "../browser/dom_storage/dom_storage_context_impl_unittest.cc", "../browser/dom_storage/dom_storage_database_unittest.cc", @@ -1649,6 +1650,7 @@ "../common/content_switches_internal_unittest.cc", "../common/cursors/webcursor_unittest.cc", "../common/dom_storage/dom_storage_map_unittest.cc", + "../common/input/actions_parser_unittest.cc", "../common/input/event_with_latency_info_unittest.cc", "../common/input/gesture_event_stream_validator_unittest.cc", "../common/input/synthetic_web_input_event_builders_unittest.cc", @@ -1688,7 +1690,6 @@ "../renderer/dom_storage/local_storage_cached_areas_unittest.cc", "../renderer/dom_storage/mock_leveldb_wrapper.cc", "../renderer/dom_storage/mock_leveldb_wrapper.h", - "../renderer/gpu/actions_parser_unittest.cc", "../renderer/gpu/frame_swap_message_queue_unittest.cc", "../renderer/gpu/layer_tree_view_unittest.cc", "../renderer/gpu/queue_message_swap_promise_unittest.cc",
diff --git a/extensions/renderer/extension_bindings_system.cc b/extensions/renderer/extension_bindings_system.cc index 8c344ef..e58518b 100644 --- a/extensions/renderer/extension_bindings_system.cc +++ b/extensions/renderer/extension_bindings_system.cc
@@ -33,7 +33,7 @@ // static const char* const ExtensionBindingsSystem::kWebAvailableFeatures[] = { - "app", "webstore", "dashboardPrivate", + "app", "dashboardPrivate", }; void ExtensionBindingsSystem::LogUpdateBindingsForContextTime(
diff --git a/extensions/renderer/extension_bindings_system.h b/extensions/renderer/extension_bindings_system.h index e6b8f37..c1cc26b0 100644 --- a/extensions/renderer/extension_bindings_system.h +++ b/extensions/renderer/extension_bindings_system.h
@@ -93,7 +93,7 @@ // Note: `runtime` is not included here, since it's handled specially above. // Note: We specify the size of the array to allow for its use in for loops // without needing to expose a separate "kNumWebAvailableFeatures". - static const char* const kWebAvailableFeatures[3]; + static const char* const kWebAvailableFeatures[2]; }; } // namespace extensions
diff --git a/extensions/renderer/native_renderer_messaging_service_unittest.cc b/extensions/renderer/native_renderer_messaging_service_unittest.cc index 5be44649..72ebee1 100644 --- a/extensions/renderer/native_renderer_messaging_service_unittest.cc +++ b/extensions/renderer/native_renderer_messaging_service_unittest.cc
@@ -463,8 +463,7 @@ const PortId on_message_external_port_id(other_context_id, ++next_port_id, false); - auto open_port = [this, &other_context_id](const PortId& port_id, - const ExtensionId& source_id) { + auto open_port = [this](const PortId& port_id, const ExtensionId& source_id) { ExtensionMsg_TabConnectionInfo tab_connection_info; tab_connection_info.frame_id = 0; const int tab_id = 10;
diff --git a/extensions/strings/extensions_strings_hi.xtb b/extensions/strings/extensions_strings_hi.xtb index 637ba5f..fbb06ab6 100644 --- a/extensions/strings/extensions_strings_hi.xtb +++ b/extensions/strings/extensions_strings_hi.xtb
@@ -47,6 +47,7 @@ <translation id="6322279351188361895">निजी कुंजी को पढ़ने में विफल.</translation> <translation id="6391538222494443604">इनपुट निर्देशिका मौजूद होनी चाहिए.</translation> <translation id="641087317769093025">एक्सटेंशन को अनज़िप नहीं किया जा सका</translation> +<translation id="6413453408918378296">आइकॉन पूरी तरह दिखाई नहीं दे रहा है '<ph name="ICON" />'.</translation> <translation id="6542618148162044354">"<ph name="APP_NAME" />" आपके एक या अधिक डिवाइस के एक्सेस का अनुरोध कर रहा है:</translation> <translation id="657064425229075395">पृष्ठभूमि स्क्रिप्ट '<ph name="BACKGROUND_SCRIPT" />' लोड नहीं की जा सकी.</translation> <translation id="6580950983454333167"><ph name="VENDOR_NAME" /> का <ph name="PRODUCT_NAME" /> (सीरियल नंबर <ph name="SERIAL_NUMBER" />)</translation>
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index fb24d1c7..260c1d5 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -288,6 +288,7 @@ if (is_android) { libs += [ "android" ] deps += [ "//ui/android:ui_java" ] + sources += [ "command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc" ] } else if (is_mac) { libs += [ "IOSurface.framework" ] } else if (is_win) {
diff --git a/gpu/command_buffer/client/raster_implementation.cc b/gpu/command_buffer/client/raster_implementation.cc index 692cfd7..6848deae 100644 --- a/gpu/command_buffer/client/raster_implementation.cc +++ b/gpu/command_buffer/client/raster_implementation.cc
@@ -705,6 +705,7 @@ valid_value = true; break; case GL_QUERY_RESULT_AVAILABLE_EXT: + case GL_QUERY_RESULT_AVAILABLE_NO_FLUSH_CHROMIUM_EXT: *params = query->CheckResultsAvailable(helper_, flush_if_pending); valid_value = true; break;
diff --git a/gpu/command_buffer/client/raster_implementation_unittest.cc b/gpu/command_buffer/client/raster_implementation_unittest.cc index 662a39a..60db959 100644 --- a/gpu/command_buffer/client/raster_implementation_unittest.cc +++ b/gpu/command_buffer/client/raster_implementation_unittest.cc
@@ -515,6 +515,10 @@ ClearCommands(); gl_->GetQueryObjectuivEXT(id1, GL_QUERY_RESULT_AVAILABLE_EXT, &available); EXPECT_EQ(0u, available); + available = 1u; + gl_->GetQueryObjectuivEXT( + id1, GL_QUERY_RESULT_AVAILABLE_NO_FLUSH_CHROMIUM_EXT, &available); + EXPECT_EQ(0u, available); } TEST_F(RasterImplementationManualInitTest, BadQueryTargets) {
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn index d97f913..6370763 100644 --- a/gpu/command_buffer/service/BUILD.gn +++ b/gpu/command_buffer/service/BUILD.gn
@@ -254,6 +254,15 @@ "wrapped_sk_image.h", ] + if (is_android) { + sources += [ + "ahardwarebuffer_utils.cc", + "ahardwarebuffer_utils.h", + "shared_image_backing_factory_ahardwarebuffer.cc", + "shared_image_backing_factory_ahardwarebuffer.h", + ] + } + configs += [ "//build/config:precompiled_headers", "//gpu:gpu_gles2_implementation",
diff --git a/gpu/command_buffer/service/ahardwarebuffer_utils.cc b/gpu/command_buffer/service/ahardwarebuffer_utils.cc new file mode 100644 index 0000000..2c061d51 --- /dev/null +++ b/gpu/command_buffer/service/ahardwarebuffer_utils.cc
@@ -0,0 +1,45 @@ +// 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/service/ahardwarebuffer_utils.h" + +#include <android/hardware_buffer.h> + +#include "base/logging.h" + +namespace gpu { + +bool AHardwareBufferSupportedFormat(viz::ResourceFormat format) { + switch (format) { + case viz::RGBA_8888: + case viz::RGB_565: + case viz::RGBA_F16: + case viz::RGBX_8888: + case viz::RGBX_1010102: + return true; + default: + return false; + } +} + +unsigned int AHardwareBufferFormat(viz::ResourceFormat format) { + DCHECK(AHardwareBufferSupportedFormat(format)); + switch (format) { + case viz::RGBA_8888: + return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; + case viz::RGB_565: + return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; + case viz::RGBA_F16: + return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT; + case viz::RGBX_8888: + return AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM; + case viz::RGBX_1010102: + return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM; + default: + NOTREACHED(); + return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; + } +} + +} // namespace gpu
diff --git a/gpu/command_buffer/service/ahardwarebuffer_utils.h b/gpu/command_buffer/service/ahardwarebuffer_utils.h new file mode 100644 index 0000000..2f834ba3 --- /dev/null +++ b/gpu/command_buffer/service/ahardwarebuffer_utils.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 GPU_COMMAND_BUFFER_SERVICE_AHARDWAREBUFFER_UTILS_H_ +#define GPU_COMMAND_BUFFER_SERVICE_AHARDWAREBUFFER_UTILS_H_ + +#include "components/viz/common/resources/resource_format.h" + +namespace gpu { + +// TODO(vikassoni): In future we will need to expose the set of formats and +// constraints (e.g. max size) to the clients somehow that are available for +// certain combinations of SharedImageUsage flags (e.g. when Vulkan is on, +// SHARED_IMAGE_USAGE_GLES2 + SHARED_IMAGE_USAGE_DISPLAY implies AHB, so those +// restrictions apply, but that's decided on the service side). +// For now getting supported format is a static mechanism like this. We +// probably need something like gpu::Capabilities.texture_target_exception_list. + +// Returns whether the format is supported by AHardwareBuffer. +bool AHardwareBufferSupportedFormat(viz::ResourceFormat format); + +// Returns the corresponding AHardwareBuffer format. +unsigned int AHardwareBufferFormat(viz::ResourceFormat format); + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_AHARDWAREBUFFER_UTILS_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc index c53d8ec..d479adca 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -177,7 +177,7 @@ if (!have_context) { texture_object_map.ForEach( - [api](GLuint client_id, scoped_refptr<TexturePassthrough> texture) { + [](GLuint client_id, scoped_refptr<TexturePassthrough> texture) { texture->MarkContextLost(); }); for (const auto& pair : texture_shared_image_map) {
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc new file mode 100644 index 0000000..3abb134 --- /dev/null +++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
@@ -0,0 +1,162 @@ +// 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/service/shared_image_backing_factory_ahardwarebuffer.h" + +#include "base/android/android_hardware_buffer_compat.h" +#include "base/android/scoped_hardware_buffer_handle.h" +#include "base/logging.h" +#include "gpu/command_buffer/service/ahardwarebuffer_utils.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/shared_image_backing.h" +#include "gpu/config/gpu_driver_bug_workarounds.h" +#include "ui/gfx/color_space.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gl/gl_bindings.h" + +namespace gpu { + +// Implementation of SharedImageBacking that holds an AHardwareBuffer. This +// can be used to create a GL texture or a VK Image from the AHardwareBuffer +// backing. +class SharedImageBackingAHardwareBuffer : public SharedImageBacking { + public: + SharedImageBackingAHardwareBuffer( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage, + base::android::ScopedHardwareBufferHandle handle) + : SharedImageBacking(mailbox, format, size, color_space, usage), + hardware_buffer_handle_(std::move(handle)) { + DCHECK(hardware_buffer_handle_.is_valid()); + } + + ~SharedImageBackingAHardwareBuffer() override { + // Check to make sure buffer is explicitly destroyed using Destroy() api + // before this destructor is called. + DCHECK(!hardware_buffer_handle_.is_valid()); + } + + bool IsCleared() const override { return is_cleared_; } + + void SetCleared() override { is_cleared_ = true; } + + bool ProduceLegacyMailbox(MailboxManager* mailbox_manager) override { + DCHECK(hardware_buffer_handle_.is_valid()); + + // Legacy mailbox is not supported. + return false; + } + + void Destroy() override { + DCHECK(hardware_buffer_handle_.is_valid()); + hardware_buffer_handle_.reset(); + } + + private: + base::android::ScopedHardwareBufferHandle hardware_buffer_handle_; + + // TODO(vikassoni): In future when we add begin/end write support, we will + // need to properly use this flag to pass the is_cleared_ information to + // the GL texture representation while begin write and back to this class from + // the GL texture represntation after end write. This is because this class + // will not know if SetCleared() arrives during begin write happening on GL + // texture representation. + bool is_cleared_ = false; + + DISALLOW_COPY_AND_ASSIGN(SharedImageBackingAHardwareBuffer); +}; + +SharedImageBackingFactoryAHardwareBuffer:: + SharedImageBackingFactoryAHardwareBuffer( + const GpuDriverBugWorkarounds& workarounds) { + // TODO(vikassoni): We are using below GL api calls for now as Vulkan mode + // doesn't exist. Once we have vulkan support, we shouldn't query GL in this + // code until we are asked to make a GL representation (or allocate a backing + // for import into GL)? We may use an AHardwareBuffer exclusively with Vulkan, + // where there is no need to require that a GL context is current. Maybe we + // can lazy init this if someone tries to create an AHardwareBuffer with + // SHARED_IMAGE_USAGE_GLES2 || !gpu_preferences.enable_vulkan. When in Vulkan + // mode, we should only need this with GLES2. + gl::GLApi* api = gl::g_current_gl_context; + api->glGetIntegervFn(GL_MAX_TEXTURE_SIZE, &max_gl_texture_size_); + + // TODO(vikassoni): Check vulkan image size restrictions also. + if (workarounds.max_texture_size) { + max_gl_texture_size_ = + std::min(max_gl_texture_size_, workarounds.max_texture_size); + } +} + +SharedImageBackingFactoryAHardwareBuffer:: + ~SharedImageBackingFactoryAHardwareBuffer() = default; + +std::unique_ptr<SharedImageBacking> +SharedImageBackingFactoryAHardwareBuffer::CreateSharedImage( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage) { + DCHECK(base::AndroidHardwareBufferCompat::IsSupportAvailable()); + + // Check if the format is supported by AHardwareBuffer. + // TODO(vikassoni): We need to check if the equivalent GL texture format + // and VK image format support is available in the underlying hardware. Else + // we might not be able to use this AHB as a gl texture or VK Image. + // Additionally we also need to check usage flags to determine the format. + if (!AHardwareBufferSupportedFormat(format)) { + LOG(ERROR) << "viz::ResourceFormat " << format + << "not supported by AHardwareBuffer"; + return nullptr; + } + + // Check for size restrictions. + // TODO(vikassoni): Check for VK size restrictions for VK import, GL size + // restrictions for GL import OR both if this backing is needed to be used + // with both GL and VK. + if (size.width() < 1 || size.height() < 1 || + size.width() > max_gl_texture_size_ || + size.height() > max_gl_texture_size_) { + LOG(ERROR) << "CreateSharedImage: invalid size"; + return nullptr; + } + + // Setup AHardwareBuffer. + AHardwareBuffer* buffer = nullptr; + AHardwareBuffer_Desc hwb_desc; + hwb_desc.width = size.width(); + hwb_desc.height = size.height(); + hwb_desc.format = AHardwareBufferFormat(format); + + // Set usage so that gpu can both read as a texture/write as a framebuffer + // attachment. TODO(vikassoni): Find out if we need to set some more usage + // flags based on the usage params in the current function call. + hwb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | + AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT; + + // Number of images in an image array. + hwb_desc.layers = 1; + + // The following three are not used here. + hwb_desc.stride = 0; + hwb_desc.rfu0 = 0; + hwb_desc.rfu1 = 0; + + // Allocate an AHardwareBuffer. + base::AndroidHardwareBufferCompat::GetInstance().Allocate(&hwb_desc, &buffer); + if (!buffer) { + LOG(ERROR) << "Failed to allocate AHardwareBuffer"; + return nullptr; + } + + auto backing = std::make_unique<SharedImageBackingAHardwareBuffer>( + mailbox, format, size, color_space, usage, + base::android::ScopedHardwareBufferHandle::Adopt(buffer)); + return backing; +} + +} // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h new file mode 100644 index 0000000..6a59cda8 --- /dev/null +++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h
@@ -0,0 +1,49 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_FACTORY_AHARDWAREBUFFER_H_ +#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_FACTORY_AHARDWAREBUFFER_H_ + +#include "base/macros.h" +#include "components/viz/common/resources/resource_format.h" +#include "gpu/command_buffer/service/shared_image_backing_factory.h" +#include "gpu/gpu_gles2_export.h" + +namespace gfx { +class Size; +class ColorSpace; +} // namespace gfx + +namespace gpu { +class SharedImageBacking; +class GpuDriverBugWorkarounds; +struct Mailbox; + +// Implementation of SharedImageBackingFactory that produces AHardwareBuffer +// backed SharedImages. This is meant to be used on Android only. +class GPU_GLES2_EXPORT SharedImageBackingFactoryAHardwareBuffer + : public SharedImageBackingFactory { + public: + SharedImageBackingFactoryAHardwareBuffer( + const GpuDriverBugWorkarounds& workarounds); + ~SharedImageBackingFactoryAHardwareBuffer() override; + + // SharedImageBackingFactory implementation. + std::unique_ptr<SharedImageBacking> CreateSharedImage( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage) override; + + private: + // Used to limit the max size of AHardwareBuffer. + int32_t max_gl_texture_size_ = 0; + + DISALLOW_COPY_AND_ASSIGN(SharedImageBackingFactoryAHardwareBuffer); +}; + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_FACTORY_AHARDWAREBUFFER_H_
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc new file mode 100644 index 0000000..185a9e46 --- /dev/null +++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
@@ -0,0 +1,111 @@ +// 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/service/shared_image_backing_factory_ahardwarebuffer.h" + +#include "base/android/android_hardware_buffer_compat.h" +#include "gpu/command_buffer/common/mailbox.h" +#include "gpu/command_buffer/common/shared_image_usage.h" +#include "gpu/command_buffer/service/mailbox_manager_impl.h" +#include "gpu/command_buffer/service/shared_image_backing.h" +#include "gpu/config/gpu_driver_bug_workarounds.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/color_space.h" +#include "ui/gl/gl_bindings.h" +#include "ui/gl/gl_context.h" +#include "ui/gl/gl_surface.h" +#include "ui/gl/init/gl_factory.h" + +namespace gpu { +namespace { + +class SharedImageBackingFactoryAHardwareBufferTest : public testing::Test { + public: + void SetUp() override { + // AHardwareBuffer is only supported on ANDROID O+. Hence these tests + // should not be run on android versions less that O. + if (!base::AndroidHardwareBufferCompat::IsSupportAvailable()) + return; + + surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size()); + ASSERT_TRUE(surface_); + context_ = gl::init::CreateGLContext(nullptr, surface_.get(), + gl::GLContextAttribs()); + ASSERT_TRUE(context_); + bool result = context_->MakeCurrent(surface_.get()); + ASSERT_TRUE(result); + + GpuDriverBugWorkarounds workarounds; + workarounds.max_texture_size = INT_MAX - 1; + backing_factory_ = + std::make_unique<SharedImageBackingFactoryAHardwareBuffer>(workarounds); + } + + protected: + scoped_refptr<gl::GLSurface> surface_; + scoped_refptr<gl::GLContext> context_; + std::unique_ptr<SharedImageBackingFactoryAHardwareBuffer> backing_factory_; + gles2::MailboxManagerImpl mailbox_manager_; +}; + +// Basic test to check creation and deletion of AHB backed shared image. +TEST_F(SharedImageBackingFactoryAHardwareBufferTest, Basic) { + if (!base::AndroidHardwareBufferCompat::IsSupportAvailable()) + return; + + auto mailbox = Mailbox::Generate(); + auto format = viz::ResourceFormat::RGBA_8888; + gfx::Size size(256, 256); + auto color_space = gfx::ColorSpace::CreateSRGB(); + uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + auto backing = backing_factory_->CreateSharedImage(mailbox, format, size, + color_space, usage); + EXPECT_TRUE(backing); + + // There is no Legacy mailbox support in AHardwareBuffer Implementation. + EXPECT_FALSE(backing->ProduceLegacyMailbox(&mailbox_manager_)); + TextureBase* texture_base = mailbox_manager_.ConsumeTexture(mailbox); + ASSERT_FALSE(texture_base); + + // Destroy the backing resource. + backing->Destroy(); +} + +// Test to check invalid format support. +TEST_F(SharedImageBackingFactoryAHardwareBufferTest, InvalidFormat) { + if (!base::AndroidHardwareBufferCompat::IsSupportAvailable()) + return; + + auto mailbox = Mailbox::Generate(); + auto format = viz::ResourceFormat::UYVY_422; + gfx::Size size(256, 256); + auto color_space = gfx::ColorSpace::CreateSRGB(); + uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + auto backing = backing_factory_->CreateSharedImage(mailbox, format, size, + color_space, usage); + EXPECT_FALSE(backing); +} + +// Test to check invalid size support. +TEST_F(SharedImageBackingFactoryAHardwareBufferTest, InvalidSize) { + if (!base::AndroidHardwareBufferCompat::IsSupportAvailable()) + return; + + auto mailbox = Mailbox::Generate(); + auto format = viz::ResourceFormat::RGBA_8888; + gfx::Size size(0, 0); + auto color_space = gfx::ColorSpace::CreateSRGB(); + uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + auto backing = backing_factory_->CreateSharedImage(mailbox, format, size, + color_space, usage); + EXPECT_FALSE(backing); + + size = gfx::Size(INT_MAX, INT_MAX); + backing = backing_factory_->CreateSharedImage(mailbox, format, size, + color_space, usage); + EXPECT_FALSE(backing); +} + +} // anonymous namespace +} // namespace gpu
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb index a3e1507..0b0947a6 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -17,6 +17,7 @@ <translation id="2687023731466035790">'क्रोमियम' में Google की स्मार्ट सुविधाएं पाएं</translation> <translation id="2730884209570016437">क्रोमियम आपके कैमरे का उपयोग नहीं कर सकता क्योंकि दूसरा ऐप्लिकेशन उसका उपयोग कर रहा है</translation> <translation id="2797210818057553964">आप किसी भी समय Chromium सेटिंग में जाकर इसे अपनी पसंद के मुताबिक बना सकते हैं</translation> +<translation id="2915596697727466327">आपके पासवर्ड का अधिकृत एक्सेस पक्का करने के लिए, क्रोमियम 'फ़ेस आईडी' यानी चेहरा पहचान का इस्तेमाल करता है.</translation> <translation id="3256316712990552818">क्रोमियम पर कॉपी किया गया</translation> <translation id="3413120535237193088">अपने सभी डिवाइस पर अपने बुकमार्क पाने के लिए, क्रोमियम में प्रवेश करें.</translation> <translation id="3473048256428424907">क्रोमियम QR स्कैनर चालू करें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb index 7c7b414..c1402edf 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
@@ -45,6 +45,7 @@ <translation id="690638524486313356">Google Chrome सेवा की शर्तें</translation> <translation id="7165736900384873061">Google Chrome QR स्कैनर उपयोग शुरू करें</translation> <translation id="7172660552945675509">टिप्स: <ph name="BEGIN_LINK" />Chrome को अपने डॉक में ले जाएं<ph name="END_LINK" /></translation> +<translation id="7173660919484573146">आपके पासवर्ड का अधिकृत एक्सेस पक्का करने के लिए, Chrome 'फ़ेस आईडी' यानी चेहरा पहचान का इस्तेमाल करता है.</translation> <translation id="7265369419224458312">अपने कंप्यूटर पर आपके खोले हुए टैब सीधे यहां से एेक्सेस करें. बस अपने कंप्यूटर पर Chrome खोलें, मेनू पर जाएं और "Chrome में साइन इन करें…" चुनें</translation> <translation id="728488472449859922">Google Chrome QR स्कैनर चालू करें</translation> <translation id="7400722733683201933">Google Chrome के बारे में</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 2188821..e073f20b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -226,8 +226,12 @@ Your data is encrypted with your sync passphrase. Enter it to start sync.</translation> <translation id="473775607612524610">Update</translation> +<translation id="4747097190499141774">Passphrase encryption doesn’t include payment methods and addresses from Google Pay. Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, you will need to reset sync. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation> <translation id="4749030437873592350">Find in Page…</translation> <translation id="4751645464639803239">New Incognito Tab</translation> +<translation id="4802417911091824046">Passphrase encryption doesn’t include payment methods and addresses from Google Pay. + +To change this setting, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /></translation> <translation id="4807020197310989387">1 unread Reading List article.</translation> <translation id="481968316161811770">Cookies, Site Data</translation> <translation id="4854345657858711387">Set A Passcode</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 9e6fc551..c116a48 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -160,7 +160,7 @@ <translation id="3494788280727468875">બ્રાઉઝિંગ ડેટા સાફ કરવાની પુષ્ટિ કરો</translation> <translation id="3519193562722059437">વેબ બ્રાઉઝ કરવા ટેબ ખોલો.</translation> <translation id="3527085408025491307">ફોલ્ડર</translation> -<translation id="3533202363250687977">બધાં છુપા ટૅબ બંધ કરો</translation> +<translation id="3533202363250687977">બધાં છૂપા ટૅબ બંધ કરો</translation> <translation id="3533436815740441613">નવું ટૅબ</translation> <translation id="3551320343578183772">ટૅબ બંધ કરો</translation> <translation id="3588820906588687999">નવા ટેબમાં છબી ખોલો</translation> @@ -227,7 +227,7 @@ તમારો ડેટા તમારા સમન્વયન પાસફ્રેઝ સાથે એન્ક્રિપ્ટ કરવામાં આવ્યો છે. સમન્વયન શરૂ કરવા માટે તે દાખલ કરો.</translation> <translation id="473775607612524610">અપડેટ કરો</translation> <translation id="4749030437873592350">પેજમાં શોધો...</translation> -<translation id="4751645464639803239">નવું છુપું ટૅબ</translation> +<translation id="4751645464639803239">નવું છૂપું ટૅબ</translation> <translation id="4807020197310989387">વાંચન સૂચિમાં 1 ન વાંચેલ લેખ.</translation> <translation id="481968316161811770">કુકીઝ, સાઇટ ડેટા</translation> <translation id="4854345657858711387">એક પાસકોડ સેટ કરો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index fa13f2c6..4929e2c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -19,6 +19,7 @@ <translation id="1201530049782216880">नया गुप्त टैब</translation> <translation id="1209206284964581585">अभी छिपाएं</translation> <translation id="1219674500290482172">इंटरनेट से कनेक्ट होने में असमर्थ.</translation> +<translation id="122699739164161391">सभी टैब बंद करें</translation> <translation id="1254117744268754948">फ़ोल्डर चुनें</translation> <translation id="1265739287306757398">तरीका जानें</translation> <translation id="127138278192656016">सिंक और सभी सेवाएं इस्तेमाल करें</translation> @@ -79,6 +80,7 @@ <translation id="2149973817440762519">बुकमार्क संपादित करें</translation> <translation id="2207590065820824892">पढ़ने की सूची में <ph name="UNREAD_COUNT" /> ऐसे लेख हैं जो पढ़े नहीं गए हैं.</translation> <translation id="2230173723195178503">वेबपेज लोड हो गया है</translation> +<translation id="2239626343334228536">ब्राउज़िंग डेटा साफ़ हो रहा है...</translation> <translation id="2256128224215992540">खोज और साइट सुझाव</translation> <translation id="2267753748892043616">खाता जोड़ें</translation> <translation id="2273327106802955778">अधिक मेनू</translation> @@ -86,6 +88,7 @@ <translation id="2339560363438331454">सिंक, Google सेवाएं</translation> <translation id="2351097562818989364">आपकी अनुवाद सेटिंग रीसेट कर दी गई हैं.</translation> <translation id="2359808026110333948">जारी रखें</translation> +<translation id="2360196772093551345">मोबाइल साइट का अनुरोध करें</translation> <translation id="2381405137052800939">मूलभूत बातें</translation> <translation id="2386793615875593361">1 चयनित</translation> <translation id="2435457462613246316">पासवर्ड दिखाएं</translation> @@ -116,6 +119,7 @@ <translation id="285960592395650245">पुन: डाउनलोड करके देखें</translation> <translation id="2870560284913253234">साइट</translation> <translation id="2871695793448672541">छिपा हुआ पासवर्ड</translation> +<translation id="288655811176831528">टैब बंद करें</translation> <translation id="2898963176829412617">नया फ़ोल्डर…</translation> <translation id="2916171785467530738">खोजों और यूआरएल को अपने आप पूरा करें</translation> <translation id="291754862089661335">QR कोड या बारकोड को इस फ़्रेम में लाएं</translation> @@ -145,6 +149,7 @@ <translation id="3393920035788932672">पॉप-अप की अनुमति है</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> मिनट</translation> <translation id="3448016392200048164">विभाजित दृश्य</translation> +<translation id="345565170154308620">पासवर्ड प्रबंधित करें...</translation> <translation id="3469166899695866866">डाउनलोड रोकें?</translation> <translation id="3470502288861289375">कॉपी किया जा रहा है...</translation> <translation id="3474624961160222204"><ph name="NAME" /> के रूप में जारी रखें</translation> @@ -155,6 +160,8 @@ <translation id="3494788280727468875">ब्राउज़िंग डेटा साफ़ करने की पुष्टि करें</translation> <translation id="3519193562722059437">वेब ब्राउज़ करने के लिए टैब खोलें.</translation> <translation id="3527085408025491307">फ़ोल्डर</translation> +<translation id="3533202363250687977">सभी 'गुप्त' टैब बंद करें</translation> +<translation id="3533436815740441613">नया टैब</translation> <translation id="3551320343578183772">टैब बंद करें</translation> <translation id="3588820906588687999">चित्र नए टैब में खोलें</translation> <translation id="3603009562372709545">लिंक URL कॉपी करें</translation> @@ -177,6 +184,7 @@ <translation id="3989635538409502728">प्रस्थान करें</translation> <translation id="3995521777587992544">पेज लोड प्रगति बार, <ph name="EMAIL" /> लोड किया गया.</translation> <translation id="4002066346123236978">शीर्षक</translation> +<translation id="4004204301268239848">पासवर्ड आपके Google खाते में सेव किए जाते हैं इसलिए आप किसी भी डिवाइस पर उनका इस्तेमाल कर सकते हैं.</translation> <translation id="4038354071007134711">इस डिवाइस पर कोई भी ऐप्लिकेशन, फ़ाइल नहीं खोल सकता.</translation> <translation id="4042870976416480368">'पेज में ढूंढें'</translation> <translation id="4049507953662678203">सुनिश्चित करें कि आपके पास नेटवर्क कनेक्शन है और फिर से प्रयास करें.</translation> @@ -202,6 +210,7 @@ <translation id="4378154925671717803">फ़ोन</translation> <translation id="441868831736628555">निजता सूचना</translation> <translation id="4460091562821778167">मुझसे हर बार पूछें कि कौन से ऐप का उपयोग करना है</translation> +<translation id="4476574785019001431">सेटिंग</translation> <translation id="4496373720959965247">टैब जोड़ें और पेज के बीच स्विच करें</translation> <translation id="4508750114462689118">साइन इन प्रोमो बंद करें</translation> <translation id="4526249700380860531">सहेजे गए पासवर्ड <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> पर देखें और प्रबंधित करें</translation> @@ -217,6 +226,8 @@ आपका डेटा आपके समन्वयन पासफ़्रेज़ के साथ एन्क्रिप्ट किया गया है. समन्वयन शुरू करने के लिए इसे डालें.</translation> <translation id="473775607612524610">अपडेट करें</translation> +<translation id="4749030437873592350">पेज में ढूंढें...</translation> +<translation id="4751645464639803239">नया 'गुप्त' टैब</translation> <translation id="4807020197310989387">पढ़ने की सूची में एक ऐसा लेख है जो पढ़ा नहीं गया है.</translation> <translation id="481968316161811770">कुकी, साइट डेटा</translation> <translation id="4854345657858711387">पासकोड सेट करें</translation> @@ -329,6 +340,7 @@ <translation id="6656103420185847513">फ़ोल्डर संपादित करें</translation> <translation id="6657585470893396449">पासवर्ड</translation> <translation id="667999046851023355">दस्तावेज़</translation> +<translation id="6709334795756764830">'बुकमार्क' में बदलाव करें</translation> <translation id="6713747756340119864">Google Apps</translation> <translation id="6730682669179532099">पासवर्ड निर्यात नहीं कर सकते</translation> <translation id="6780034285637185932">ज़िप कोड</translation> @@ -338,6 +350,7 @@ <translation id="6807889908376551050">सभी दिखाएं...</translation> <translation id="681368974849482173">आइटम बनाया गया</translation> <translation id="685040365210406336">कोई बदलाव न करें</translation> +<translation id="6851516051005285358">डेस्कटॉप साइट का अनुरोध करें</translation> <translation id="6896758677409633944">कॉपी बनाएं</translation> <translation id="6903907808598579934">समन्वयन चालू करें</translation> <translation id="6914783257214138813">आपके पासवर्ड, निर्यात की गई फ़ाइल देख पाने वाले सभी व्यक्तियों को दिखाई देंगे.</translation> @@ -351,6 +364,7 @@ <translation id="7031882061095297553">इसमें समन्वयित करें</translation> <translation id="7053983685419859001">अवरोधित करें</translation> <translation id="7062545763355031412">स्वीकार करें और खातों को बदलें</translation> +<translation id="7099761977003084116">हाल के टैब</translation> <translation id="7102005569666697658">डाउनलोड हो रही है… <ph name="FILE_SIZE" /></translation> <translation id="7108338896283013870">छुपाएं</translation> <translation id="7133798577887235672">पूरा नाम</translation> @@ -366,6 +380,7 @@ <translation id="7291368939935408496">पासवर्ड तैयार हो रहे हैं...</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> प्रतिशत डाउनलोड हो गई</translation> <translation id="7346909386216857016">ठीक है, समझ लिया</translation> +<translation id="7383797227493018512">पढ़ने की चीज़ों की सूची</translation> <translation id="7400418766976504921">URL</translation> <translation id="741204030948306876">हां मैं सहमत हूं</translation> <translation id="7425346204213733349">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग में किए गए बदलाव अब आपके Google खाते में समन्वयित नहीं किए जाएंगे. हालांकि, आपका मौजूदा डेटा आपके Google खाते में संग्रहित रहेगा.</translation> @@ -449,6 +464,7 @@ <translation id="8904976895050290827">Chrome सिंक</translation> <translation id="895541991026785598">किसी समस्या की रिपोर्ट करें</translation> <translation id="8971089644512329999">ठीक है, समझ लिया</translation> +<translation id="8976382372951310360">सहायता</translation> <translation id="8981454092730389528">Google गतिविधि नियंत्रण</translation> <translation id="8985320356172329008">Google में इस रूप में प्रवेश किया हुआ है</translation> <translation id="902659348151742535">खोज, विज्ञापन और अन्य Google सेवाओं को वैयक्तिकृत करने के लिए Google आपके ब्राउज़िंग इतिहास का उपयोग कर सकता है.</translation> @@ -457,6 +473,7 @@ <translation id="9055772144595778347">प्रवेश नहीं कर सकते</translation> <translation id="9065203028668620118">संपादित करें</translation> <translation id="9079935439869366234">सभी को अपठित के रूप में चिह्नित करें</translation> +<translation id="9081058212938299310"><ph name="USERNAME" /> का पासवर्ड अपडेट करना चाहते हैं?</translation> <translation id="9083392325882095631">1 आइटम</translation> <translation id="9100610230175265781">पासफ़्रेज़ आवश्यक</translation> <translation id="9148126808321036104">पुन: प्रवेश करें</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 1b11679..6c08b0b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -210,7 +210,7 @@ <translation id="4378154925671717803">Telefone</translation> <translation id="441868831736628555">Aviso de privacidade</translation> <translation id="4460091562821778167">Pergunte-me sempre qual app usar</translation> -<translation id="4476574785019001431">Ajustes</translation> +<translation id="4476574785019001431">Configurações</translation> <translation id="4496373720959965247">Adicionar guias e alternar entre páginas</translation> <translation id="4508750114462689118">Fechar promoção de login</translation> <translation id="4526249700380860531">Ver e gerenciar as senhas salvas em <ph name="BEGIN_LINK" />passwords.google.com<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 47b90c0..e996be9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -226,8 +226,12 @@ Údaje sú šifrované pomocou vlastnej prístupovej frázy synchronizácie. Keď ju zadáte, synchronizácia sa spustí.</translation> <translation id="473775607612524610">Aktualizovať</translation> +<translation id="4747097190499141774">Šifrovanie prístupovej frázy nezahŕňa spôsoby platby a adresy zo služby Google Pay. Šifrované údaje si môže prečítať iba používateľ s prístupovou frázou. Prístupová fráza sa neodosiela do Googlu ani sa v ňom neuchováva. Ak ju zabudnete, budete musieť restovať synchronizáciu. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="4749030437873592350">Nájsť na stránke...</translation> <translation id="4751645464639803239">Nová karta inkognito</translation> +<translation id="4802417911091824046">Šifrovanie prístupovej frázy nezahŕňa spôsoby platby a adresy zo služby Google Pay. + +Ak chcete toto nastavenie zmeniť, <ph name="BEGIN_LINK" />resetujte synchronizáciu<ph name="END_LINK" /></translation> <translation id="4807020197310989387">1 neprečítaný článok v čitateľskom zozname.</translation> <translation id="481968316161811770">Súbory cookie, údaje webu</translation> <translation id="4854345657858711387">Nastavenie vstupného kódu</translation>
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm index 8cb404d..38392db 100644 --- a/ios/chrome/browser/about_flags.mm +++ b/ios/chrome/browser/about_flags.mm
@@ -186,6 +186,11 @@ {"external-search", flag_descriptions::kExternalSearchName, flag_descriptions::kExternalSearchDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kExternalSearch)}, + {"ignores-viewport-scale-limits", + flag_descriptions::kIgnoresViewportScaleLimitsName, + flag_descriptions::kIgnoresViewportScaleLimitsDescription, + flags_ui::kOsIos, + FEATURE_VALUE_TYPE(web::features::kIgnoresViewportScaleLimits)}, {"slim-navigation-manager", flag_descriptions::kSlimNavigationManagerName, flag_descriptions::kSlimNavigationManagerDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(web::features::kSlimNavigationManager)},
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view.mm b/ios/chrome/browser/autofill/form_input_accessory_view.mm index 8e7422db..a109425 100644 --- a/ios/chrome/browser/autofill/form_input_accessory_view.mm +++ b/ios/chrome/browser/autofill/form_input_accessory_view.mm
@@ -8,7 +8,9 @@ #include "base/i18n/rtl.h" #include "base/logging.h" +#include "components/autofill/core/common/autofill_features.h" #import "ios/chrome/browser/autofill/form_input_accessory_view_delegate.h" +#import "ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.h" #import "ios/chrome/browser/ui/image_util/image_util.h" #include "ios/chrome/browser/ui/ui_util.h" #import "ios/chrome/common/ui_util/constraints_ui_util.h" @@ -33,6 +35,24 @@ // The width of the navigation area / custom view separator asset. const CGFloat kNavigationAreaSeparatorWidth = 1; +// The width for the white gradient UIImageView. +constexpr CGFloat ManualFillGradientWidth = 44; + +// The margin for the white gradient UIImageView. +constexpr CGFloat ManualFillGradientMargin = 14; + +// The spacing between the items in the navigation view. +constexpr CGFloat ManualFillNavigationItemSpacing = 4; + +// The left content inset for the close button. +constexpr CGFloat ManualFillCloseButtonLeftInset = 7; + +// The right content inset for the close button. +constexpr CGFloat ManualFillCloseButtonRightInset = 15; + +// The height for the top and bottom sepparator lines. +constexpr CGFloat ManualFillSeparatorHeight = 0.5; + } // namespace @interface FormInputAccessoryView () @@ -81,39 +101,86 @@ UIView* customViewContainer = [[UIView alloc] init]; customViewContainer.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:customViewContainer]; - UIView* navView = [[UIView alloc] init]; - navView.translatesAutoresizingMaskIntoConstraints = NO; - [self addSubview:navView]; [customViewContainer addSubview:customView]; customView.translatesAutoresizingMaskIntoConstraints = NO; AddSameConstraints(customViewContainer, customView); - UIView* navViewContent = + UIView* navigationView = [self viewForNavigationButtonsUsingDelegate:delegate]; - [navView addSubview:navViewContent]; + navigationView.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:navigationView]; - AddSameConstraints(navView, navViewContent); + id<LayoutGuideProvider> layoutGuide = SafeAreaLayoutGuideForView(self); + [NSLayoutConstraint activateConstraints:@[ + [customViewContainer.topAnchor + constraintEqualToAnchor:layoutGuide.topAnchor], + [customViewContainer.bottomAnchor + constraintEqualToAnchor:layoutGuide.bottomAnchor], + [customViewContainer.leadingAnchor + constraintEqualToAnchor:layoutGuide.leadingAnchor], + [navigationView.trailingAnchor + constraintEqualToAnchor:layoutGuide.trailingAnchor], + [navigationView.topAnchor constraintEqualToAnchor:layoutGuide.topAnchor], + [navigationView.bottomAnchor + constraintEqualToAnchor:layoutGuide.bottomAnchor], + ]]; + if (autofill::features::IsPasswordManualFallbackEnabled()) { + self.backgroundColor = UIColor.whiteColor; + + UIImage* gradientImage = [[UIImage imageNamed:@"mf_gradient"] + resizableImageWithCapInsets:UIEdgeInsetsZero + resizingMode:UIImageResizingModeStretch]; + UIImageView* gradientView = + [[UIImageView alloc] initWithImage:gradientImage]; + gradientView.translatesAutoresizingMaskIntoConstraints = NO; + [self insertSubview:gradientView belowSubview:navigationView]; + + UIView* topGrayLine = [[UIView alloc] init]; + topGrayLine.backgroundColor = UIColor.cr_manualFillSeparatorColor; + topGrayLine.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:topGrayLine]; + + UIView* bottomGrayLine = [[UIView alloc] init]; + bottomGrayLine.backgroundColor = UIColor.cr_manualFillSeparatorColor; + bottomGrayLine.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:bottomGrayLine]; + + [NSLayoutConstraint activateConstraints:@[ + [topGrayLine.topAnchor constraintEqualToAnchor:self.topAnchor], + [topGrayLine.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], + [topGrayLine.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], + [topGrayLine.heightAnchor + constraintEqualToConstant:ManualFillSeparatorHeight], + + [bottomGrayLine.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], + [bottomGrayLine.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], + [bottomGrayLine.trailingAnchor + constraintEqualToAnchor:self.trailingAnchor], + [bottomGrayLine.heightAnchor + constraintEqualToConstant:ManualFillSeparatorHeight], + + [gradientView.topAnchor constraintEqualToAnchor:navigationView.topAnchor], + [gradientView.bottomAnchor + constraintEqualToAnchor:navigationView.bottomAnchor], + [gradientView.widthAnchor + constraintEqualToConstant:ManualFillGradientWidth], + [gradientView.trailingAnchor + constraintEqualToAnchor:navigationView.leadingAnchor + constant:ManualFillGradientMargin], + + [customViewContainer.trailingAnchor + constraintEqualToAnchor:navigationView.leadingAnchor], + ]]; + } else { [[self class] addBackgroundImageInView:self withImageName:@"autofill_keyboard_background"]; - - id<LayoutGuideProvider> layoutGuide = SafeAreaLayoutGuideForView(self); - [NSLayoutConstraint activateConstraints:@[ - [customViewContainer.topAnchor - constraintEqualToAnchor:layoutGuide.topAnchor], - [customViewContainer.bottomAnchor - constraintEqualToAnchor:layoutGuide.bottomAnchor], - [customViewContainer.leadingAnchor - constraintEqualToAnchor:layoutGuide.leadingAnchor], - [customViewContainer.trailingAnchor - constraintEqualToAnchor:navView.leadingAnchor - constant:kNavigationAreaSeparatorShadowWidth], - [navView.trailingAnchor - constraintEqualToAnchor:layoutGuide.trailingAnchor], - [navView.topAnchor constraintEqualToAnchor:layoutGuide.topAnchor], - [navView.bottomAnchor constraintEqualToAnchor:layoutGuide.bottomAnchor], - ]]; + [customViewContainer.trailingAnchor + constraintEqualToAnchor:navigationView.leadingAnchor + constant:kNavigationAreaSeparatorShadowWidth] + .active = YES; + } } #pragma mark - @@ -133,6 +200,56 @@ - (UIView*)viewForNavigationButtonsUsingDelegate: (id<FormInputAccessoryViewDelegate>)delegate { + if (autofill::features::IsPasswordManualFallbackEnabled()) { + UIButton* previousButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [previousButton setImage:[UIImage imageNamed:@"mf_arrow_up"] + forState:UIControlStateNormal]; + previousButton.tintColor = UIColor.cr_manualFillTintColor; + [previousButton addTarget:delegate + action:@selector(selectPreviousElementWithButtonPress) + forControlEvents:UIControlEventTouchUpInside]; + previousButton.enabled = NO; + NSString* previousButtonAccessibilityLabel = + l10n_util::GetNSString(IDS_IOS_AUTOFILL_ACCNAME_PREVIOUS_FIELD); + [previousButton setAccessibilityLabel:previousButtonAccessibilityLabel]; + + UIButton* nextButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [nextButton setImage:[UIImage imageNamed:@"mf_arrow_down"] + forState:UIControlStateNormal]; + nextButton.tintColor = UIColor.cr_manualFillTintColor; + [nextButton addTarget:delegate + action:@selector(selectNextElementWithButtonPress) + forControlEvents:UIControlEventTouchUpInside]; + nextButton.enabled = NO; + NSString* nextButtonAccessibilityLabel = + l10n_util::GetNSString(IDS_IOS_AUTOFILL_ACCNAME_NEXT_FIELD); + [nextButton setAccessibilityLabel:nextButtonAccessibilityLabel]; + + UIButton* closeButton = [UIButton buttonWithType:UIButtonTypeSystem]; + NSString* title = l10n_util::GetNSString(IDS_IOS_AUTOFILL_INPUT_BAR_DONE); + [closeButton setTitle:title forState:UIControlStateNormal]; + closeButton.tintColor = UIColor.cr_manualFillTintColor; + [closeButton addTarget:delegate + action:@selector(closeKeyboardWithButtonPress) + forControlEvents:UIControlEventTouchUpInside]; + closeButton.contentEdgeInsets = UIEdgeInsetsMake( + 0, ManualFillCloseButtonLeftInset, 0, ManualFillCloseButtonRightInset); + NSString* closeButtonAccessibilityLabel = + l10n_util::GetNSString(IDS_IOS_AUTOFILL_ACCNAME_HIDE_KEYBOARD); + [closeButton setAccessibilityLabel:closeButtonAccessibilityLabel]; + + [delegate fetchPreviousAndNextElementsPresenceWithCompletionHandler:^( + BOOL hasPreviousElement, BOOL hasNextElement) { + previousButton.enabled = hasPreviousElement; + nextButton.enabled = hasNextElement; + }]; + + UIStackView* navigationView = [[UIStackView alloc] + initWithArrangedSubviews:@[ previousButton, nextButton, closeButton ]]; + navigationView.spacing = ManualFillNavigationItemSpacing; + return navigationView; + } + UIView* navView = [[UIView alloc] init]; navView.translatesAutoresizingMaskIntoConstraints = NO;
diff --git a/ios/chrome/browser/infobars/BUILD.gn b/ios/chrome/browser/infobars/BUILD.gn index 11a7459..32202758 100644 --- a/ios/chrome/browser/infobars/BUILD.gn +++ b/ios/chrome/browser/infobars/BUILD.gn
@@ -15,8 +15,6 @@ "infobar_container_ios.h", "infobar_container_ios.mm", "infobar_container_state_delegate.h", - "infobar_container_view.h", - "infobar_container_view.mm", "infobar_controller+protected.h", "infobar_controller.h", "infobar_controller.mm", @@ -30,7 +28,6 @@ "//base", "//components/translate/core/browser", "//ios/chrome/browser/ui/infobars:infobars_ui", - "//ios/chrome/common", "//ios/web", "//ui/base", "//ui/gfx",
diff --git a/ios/chrome/browser/infobars/infobar_container_ios.h b/ios/chrome/browser/infobars/infobar_container_ios.h index e4c7cfd..24ca1d8 100644 --- a/ios/chrome/browser/infobars/infobar_container_ios.h +++ b/ios/chrome/browser/infobars/infobar_container_ios.h
@@ -11,25 +11,16 @@ #include "base/macros.h" -@class InfoBarContainerView; +@protocol InfobarContainerConsumer; // IOS infobar container specialization, managing infobars visibility so // that only the front most one is visible at any time. class InfoBarContainerIOS : public infobars::InfoBarContainer { public: - explicit InfoBarContainerIOS(infobars::InfoBarContainer::Delegate* delegate); + InfoBarContainerIOS(infobars::InfoBarContainer::Delegate* delegate, + id<InfobarContainerConsumer> consumer); ~InfoBarContainerIOS() override; - // Returns the UIView container. - InfoBarContainerView* view(); - - // Hides the current infobar keeping the current state. If a new infobar is - // added, it will be hidden as well. - void SuspendInfobars(); - - // Restores the normal behavior of the infobars. - void RestoreInfobars(); - protected: void PlatformSpecificAddInfoBar(infobars::InfoBar* infobar, size_t position) override; @@ -37,8 +28,8 @@ void PlatformSpecificInfoBarStateChanged(bool is_animating) override; private: - InfoBarContainerView* container_view_; InfoBarContainer::Delegate* delegate_; + id<InfobarContainerConsumer> consumer_; DISALLOW_COPY_AND_ASSIGN(InfoBarContainerIOS); };
diff --git a/ios/chrome/browser/infobars/infobar_container_ios.mm b/ios/chrome/browser/infobars/infobar_container_ios.mm index 561252a..4fb25d1a 100644 --- a/ios/chrome/browser/infobars/infobar_container_ios.mm +++ b/ios/chrome/browser/infobars/infobar_container_ios.mm
@@ -5,45 +5,20 @@ #include "ios/chrome/browser/infobars/infobar_container_ios.h" #include <stddef.h> -#import <UIKit/UIKit.h> #include "base/logging.h" #include "ios/chrome/browser/infobars/infobar.h" -#include "ios/chrome/browser/infobars/infobar_container_view.h" -#import "ios/chrome/common/material_timing.h" +#import "ios/chrome/browser/ui/infobars/infobar_container_consumer.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -namespace { -void SetViewAlphaWithAnimation(UIView* view, float alpha) { - CGFloat oldAlpha = [view alpha]; - if (oldAlpha > 0 && alpha == 0) { - [view setUserInteractionEnabled:NO]; - } - [UIView cr_transitionWithView:view - duration:ios::material::kDuration3 - curve:ios::material::CurveEaseInOut - options:0 - animations:^{ - [view setAlpha:alpha]; - } - completion:^(BOOL) { - if (oldAlpha == 0 && alpha > 0) { - [view setUserInteractionEnabled:YES]; - }; - }]; -} -} // namespace - InfoBarContainerIOS::InfoBarContainerIOS( - infobars::InfoBarContainer::Delegate* delegate) - : InfoBarContainer(delegate), delegate_(delegate) { + infobars::InfoBarContainer::Delegate* delegate, + id<InfobarContainerConsumer> consumer) + : InfoBarContainer(delegate), delegate_(delegate), consumer_(consumer) { DCHECK(delegate); - container_view_ = [[InfoBarContainerView alloc] init]; - [container_view_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth | - UIViewAutoresizingFlexibleTopMargin]; } InfoBarContainerIOS::~InfoBarContainerIOS() { @@ -51,14 +26,10 @@ RemoveAllInfoBarsForDestruction(); } -InfoBarContainerView* InfoBarContainerIOS::view() { - return container_view_; -} - void InfoBarContainerIOS::PlatformSpecificAddInfoBar(infobars::InfoBar* infobar, size_t position) { InfoBarIOS* infobar_ios = static_cast<InfoBarIOS*>(infobar); - [container_view_ addInfoBar:infobar_ios position:position]; + [consumer_ addInfoBar:infobar_ios position:position]; } void InfoBarContainerIOS::PlatformSpecificRemoveInfoBar( @@ -76,14 +47,6 @@ void InfoBarContainerIOS::PlatformSpecificInfoBarStateChanged( bool is_animating) { - [container_view_ setUserInteractionEnabled:!is_animating]; - [container_view_ setNeedsLayout]; -} - -void InfoBarContainerIOS::SuspendInfobars() { - SetViewAlphaWithAnimation(container_view_, 0); -} - -void InfoBarContainerIOS::RestoreInfobars() { - SetViewAlphaWithAnimation(container_view_, 1); + [consumer_ setUserInteractionEnabled:!is_animating]; + [consumer_ updateLayout]; }
diff --git a/ios/chrome/browser/infobars/infobar_container_view.h b/ios/chrome/browser/infobars/infobar_container_view.h deleted file mode 100644 index 4d14f871..0000000 --- a/ios/chrome/browser/infobars/infobar_container_view.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_VIEW_H_ -#define IOS_CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_VIEW_H_ - -#import <UIKit/UIKit.h> - -class InfoBarIOS; - -@interface InfoBarContainerView : UIView { -} - -// Add a new infobar to the container view at position |position|. -- (void)addInfoBar:(InfoBarIOS*)infoBarIOS position:(NSInteger)position; - -// Height of the frontmost infobar that is not hidden. -- (CGFloat)topmostVisibleInfoBarHeight; - -@end - -#endif // IOS_CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_VIEW_H_
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc index 0d67c33..1a5b92c 100644 --- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -246,6 +246,10 @@ "When enabled, the omnibox will include suggestions for web pages " "broadcast by devices near you."; +const char kIgnoresViewportScaleLimitsName[] = "Ignore Viewport Scale Limits"; +const char kIgnoresViewportScaleLimitsDescription[] = + "When enabled the page can always be scaled, regardless of author intent."; + const char kSlimNavigationManagerName[] = "Use Slim Navigation Manager"; const char kSlimNavigationManagerDescription[] = "When enabled, uses the experimental slim navigation manager that provides "
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h index b51903a..ad1d742 100644 --- a/ios/chrome/browser/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -203,6 +203,10 @@ extern const char kPhysicalWeb[]; extern const char kPhysicalWebDescription[]; +// Title and description for the flag to ignore viewport scale limits. +extern const char kIgnoresViewportScaleLimitsName[]; +extern const char kIgnoresViewportScaleLimitsDescription[]; + // Title and description for the flag to enable WKBackForwardList based // navigation manager. extern const char kSlimNavigationManagerName[];
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm index eee8586e..179e49e 100644 --- a/ios/chrome/browser/passwords/password_controller.mm +++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -330,6 +330,7 @@ [self.suggestionHelper checkIfSuggestionsAvailableForForm:formName fieldIdentifier:fieldIdentifier + fieldType:fieldType type:type frameID:frameID isMainFrame:isMainFrame @@ -408,8 +409,10 @@ std::unique_ptr<password_manager::FillData> fillData = [self.suggestionHelper getFillDataForUsername:username]; - if (!fillData) + if (!fillData) { completion(); + return; + } [self.formHelper fillPasswordFormWithFillData:*fillData completionHandler:^(BOOL success) {
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn index 55b52628..8c8ca24e 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
@@ -69,14 +69,16 @@ "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser/autofill/manual_fill:manual_fill", "//ios/chrome/browser/ui/autofill/manual_fill/resources:addresses", + "//ios/chrome/browser/ui/autofill/manual_fill/resources:mf_arrow_down", + "//ios/chrome/browser/ui/autofill/manual_fill/resources:mf_arrow_up", + "//ios/chrome/browser/ui/autofill/manual_fill/resources:mf_gradient", + "//ios/chrome/browser/ui/autofill/manual_fill/resources:mf_keyboard", "//ios/chrome/browser/ui/list_model:list_model", "//ios/chrome/browser/ui/table_view:styler", "//ios/chrome/browser/ui/table_view:table_view", "//ios/chrome/common/ui_util:ui_util", "//net:net", - "//third_party/material_design_icons:ic_account_circle", "//third_party/material_design_icons:ic_credit_card", - "//third_party/material_design_icons:ic_keyboard", "//third_party/material_design_icons:ic_vpn_key", "//ui/base:base", ]
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.mm index e685cda..04df3bab 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.mm
@@ -26,6 +26,16 @@ } // namespace manual_fill +namespace { + +// The inset on the left before the icons start. +constexpr CGFloat ManualFillIconsLeftInset = 10; + +// The inset on the right after the icons end. +constexpr CGFloat ManualFillIconsRightInset = 24; + +} // namespace + static NSTimeInterval MFAnimationDuration = 0.20; @interface ManualFillAccessoryViewController () @@ -67,7 +77,7 @@ if (!IsIPadIdiom()) { self.keyboardButton = [UIButton buttonWithType:UIButtonTypeSystem]; - UIImage* keyboardImage = [UIImage imageNamed:@"ic_keyboard"]; + UIImage* keyboardImage = [UIImage imageNamed:@"mf_keyboard"]; [self.keyboardButton setImage:keyboardImage forState:UIControlStateNormal]; self.keyboardButton.tintColor = tintColor; self.keyboardButton.translatesAutoresizingMaskIntoConstraints = NO; @@ -132,9 +142,10 @@ // Horizontal constraints. [stackView.leadingAnchor constraintEqualToAnchor:safeAreaLayoutGuide.leadingAnchor - constant:10], - [stackView.trailingAnchor - constraintEqualToAnchor:safeAreaLayoutGuide.trailingAnchor], + constant:ManualFillIconsLeftInset], + [safeAreaLayoutGuide.trailingAnchor + constraintEqualToAnchor:stackView.trailingAnchor + constant:ManualFillIconsRightInset], ]]; self.keyboardButton.hidden = YES; self.keyboardButton.alpha = 0.0;
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_coordinator.mm b/ios/chrome/browser/ui/autofill/manual_fill/password_coordinator.mm index d8b7b6c..2813ef5 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/password_coordinator.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/password_coordinator.mm
@@ -71,7 +71,7 @@ if (self) { _passwordViewController = [[PasswordViewController alloc] initWithSearchController:nil]; - + _passwordViewController.contentInsetsAlwaysEqualToSafeArea = YES; _manualFillInjectionHandler = injectionHandler; auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.h b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.h index 83d9d7771..aa3180b3 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.h +++ b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.h
@@ -29,6 +29,11 @@ appBarStyle: (ChromeTableViewControllerStyle)appBarStyle NS_UNAVAILABLE; + +// If set to YES, the controller will add negative content insets inverse to the +// ones added by UITableViewController to accommodate for the keyboard. +@property(nonatomic, assign) BOOL contentInsetsAlwaysEqualToSafeArea; + @end #endif // IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_PASSWORD_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.mm b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.mm index 9b498ea..308dfa1d 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.mm
@@ -9,6 +9,7 @@ #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" #include "ios/chrome/browser/ui/ui_util.h" +#import "ios/chrome/browser/ui/uikit_ui_util.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util_mac.h" @@ -54,6 +55,17 @@ appBarStyle:ChromeTableViewControllerStyleNoAppBar]; if (self) { _searchController = searchController; + + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(handleKeyboardWillShow:) + name:UIKeyboardWillShowNotification + object:nil]; + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(handleKeyboardDidHide:) + name:UIKeyboardDidHideNotification + object:nil]; } return self; } @@ -111,6 +123,29 @@ #pragma mark - Private +- (void)handleKeyboardDidHide:(NSNotification*)notification { + if (self.contentInsetsAlwaysEqualToSafeArea && !IsIPadIdiom()) { + // Resets the table view content inssets to be equal to the safe area + // insets. + self.tableView.contentInset = SafeAreaInsetsForView(self.view); + } +} + +- (void)handleKeyboardWillShow:(NSNotification*)notification { + if (self.contentInsetsAlwaysEqualToSafeArea && !IsIPadIdiom()) { + // Sets the bottom inset to be equal to the height of the keyboard to + // override the behaviour in UITableViewController. Which adjust the scroll + // view insets to accommodate for the keyboard. + CGRect keyboardFrame = + [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; + CGFloat keyboardHeight = keyboardFrame.size.height; + UIEdgeInsets safeInsets = SafeAreaInsetsForView(self.view); + self.tableView.contentInset = + UIEdgeInsetsMake(safeInsets.top, safeInsets.left, + safeInsets.bottom - keyboardHeight, safeInsets.right); + } +} + // Presents |items| in the respective section. Handles creating or deleting the // section accordingly. - (void)presentItems:(NSArray<TableViewItem*>*)items
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm index 6ee50dd..2c94dd58 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
@@ -37,6 +37,7 @@ namespace { const char kFormElementUsername[] = "username"; +const char kFormElementPassword[] = "password"; const char kExampleUsername[] = "concrete username"; const char kExamplePassword[] = "concrete password"; @@ -472,4 +473,32 @@ assertWithMatcher:grey_notVisible()]; } +// Test that after switching fields the content size of the table view didn't +// grow. +- (void)testPasswordControllerKeepsRightSize { + // Bring up the keyboard. + [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] + performAction:chrome_test_util::TapWebElement(kFormElementUsername)]; + + // Tap on the passwords icon. + [[EarlGrey selectElementWithMatcher:PasswordIconMatcher()] + performAction:grey_tap()]; + + // Verify the "Manage Passwords..." is on screen. + [[EarlGrey selectElementWithMatcher:OtherPasswordsMatcher()] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Tap the second element. + [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] + performAction:chrome_test_util::TapWebElement(kFormElementPassword)]; + + // Try to scroll. + [[EarlGrey selectElementWithMatcher:PasswordTableViewMatcher()] + performAction:grey_scrollToContentEdge(kGREYContentEdgeBottom)]; + + // Verify the "Manage Passwords..." is on screen. + [[EarlGrey selectElementWithMatcher:OtherPasswordsMatcher()] + assertWithMatcher:grey_sufficientlyVisible()]; +} + @end
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/BUILD.gn b/ios/chrome/browser/ui/autofill/manual_fill/resources/BUILD.gn index 3f1e2fd..7fdd0488 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/resources/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/BUILD.gn
@@ -12,3 +12,37 @@ "addresses.imageset/addresses@3x.png", ] } + +imageset("mf_arrow_down") { + sources = [ + "mf_arrow_down.imageset/Contents.json", + "mf_arrow_down.imageset/mf_arrow_down.png", + "mf_arrow_down.imageset/mf_arrow_down@2x.png", + "mf_arrow_down.imageset/mf_arrow_down@3x.png", + ] +} + +imageset("mf_arrow_up") { + sources = [ + "mf_arrow_up.imageset/Contents.json", + "mf_arrow_up.imageset/mf_arrow_up.png", + "mf_arrow_up.imageset/mf_arrow_up@2x.png", + "mf_arrow_up.imageset/mf_arrow_up@3x.png", + ] +} + +imageset("mf_gradient") { + sources = [ + "mf_gradient.imageset/Contents.json", + "mf_gradient.imageset/mf_gradient.png", + ] +} + +imageset("mf_keyboard") { + sources = [ + "mf_keyboard.imageset/Contents.json", + "mf_keyboard.imageset/mf_keyboard.png", + "mf_keyboard.imageset/mf_keyboard@2x.png", + "mf_keyboard.imageset/mf_keyboard@3x.png", + ] +}
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/Contents.json b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/Contents.json new file mode 100644 index 0000000..4c693c4e --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "mf_arrow_down.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "mf_arrow_down@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "mf_arrow_down@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down.png new file mode 100644 index 0000000..79e1b464 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down@2x.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down@2x.png new file mode 100644 index 0000000..a768576 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down@3x.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down@3x.png new file mode 100644 index 0000000..4ecba48 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_down.imageset/mf_arrow_down@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/Contents.json b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/Contents.json new file mode 100644 index 0000000..d7bbfc8 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "mf_arrow_up.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "mf_arrow_up@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "mf_arrow_up@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up.png new file mode 100644 index 0000000..e5199de --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up@2x.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up@2x.png new file mode 100644 index 0000000..b2c9f9d --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up@3x.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up@3x.png new file mode 100644 index 0000000..6028e98 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_arrow_up.imageset/mf_arrow_up@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_gradient.imageset/Contents.json b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_gradient.imageset/Contents.json new file mode 100644 index 0000000..523ab78 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_gradient.imageset/Contents.json
@@ -0,0 +1,13 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "mf_gradient.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_gradient.imageset/mf_gradient.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_gradient.imageset/mf_gradient.png new file mode 100644 index 0000000..c22d2cc --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_gradient.imageset/mf_gradient.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/Contents.json b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/Contents.json new file mode 100644 index 0000000..42f99fd --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "mf_keyboard.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "mf_keyboard@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "mf_keyboard@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard.png new file mode 100644 index 0000000..20be7858 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard@2x.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard@2x.png new file mode 100644 index 0000000..45ef1be --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard@3x.png b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard@3x.png new file mode 100644 index 0000000..c24e960 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/resources/mf_keyboard.imageset/mf_keyboard@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.h b/ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.h index 182a623..368bc905 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.h +++ b/ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.h
@@ -8,8 +8,13 @@ #import <UIKit/UIKit.h> @interface UIColor (ManualFill) + // Color to set in interactable elements for manual fill (0.1, 0.45, 0.91 RGB). @property(class, nonatomic, readonly) UIColor* cr_manualFillTintColor; + +// Color for the line separators in manual fill (0.66, 0.66, 0.66 RGB). +@property(class, nonatomic, readonly) UIColor* cr_manualFillSeparatorColor; + @end #endif // IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_UICOLOR_MANUALFILL_H_
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.mm b/ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.mm index 6a1ef1f..aaabc9c 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.mm
@@ -16,4 +16,12 @@ return color; } ++ (UIColor*)cr_manualFillSeparatorColor { + static UIColor* color = [UIColor colorWithRed:188 / 255.0 + green:187 / 255.0 + blue:193 / 255.0 + alpha:1 / 1.0]; + return color; +} + @end
diff --git a/ios/chrome/browser/ui/infobars/BUILD.gn b/ios/chrome/browser/ui/infobars/BUILD.gn index 97424d6..66a62ec 100644 --- a/ios/chrome/browser/ui/infobars/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/BUILD.gn
@@ -5,10 +5,14 @@ source_set("infobars") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ + # TODO(crbug.com/892376): Move infobar_container_view to infobars_ui. + "infobar_container_view.h", + "infobar_container_view.mm", "infobar_coordinator.h", "infobar_coordinator.mm", ] deps = [ + ":infobars_ui", ":public", "//base", "//ios/chrome/browser/infobars", @@ -21,6 +25,7 @@ "//ios/chrome/browser/upgrade", "//ios/chrome/browser/web:tab_id_tab_helper", "//ios/chrome/browser/web_state_list", + "//ui/base", ] } @@ -37,6 +42,7 @@ "confirm_infobar_view.mm", "infobar_constants.h", "infobar_constants.mm", + "infobar_container_consumer.h", "infobar_view_sizing.h", "infobar_view_sizing_delegate.h", ]
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_consumer.h b/ios/chrome/browser/ui/infobars/infobar_container_consumer.h new file mode 100644 index 0000000..c9b45dd54 --- /dev/null +++ b/ios/chrome/browser/ui/infobars/infobar_container_consumer.h
@@ -0,0 +1,33 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONTAINER_CONSUMER_H_ +#define IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONTAINER_CONSUMER_H_ + +#import <UIKit/UIKit.h> + +class InfoBarIOS; + +// Protocol to communicate with the Infobar container. +@protocol InfobarContainerConsumer + +// Add a new infobar to the Infobar container view at position |position|. +- (void)addInfoBar:(InfoBarIOS*)infoBarIOS position:(NSInteger)position; + +// Height of the frontmost infobar contained in Infobar container that is not +// hidden. +- (CGFloat)topmostVisibleInfoBarHeight; + +// Animates the Infobar container alpha to |alpha|. +- (void)animateInfoBarContainerToAlpha:(CGFloat)alpha; + +// Sets the Infobar container user interaction to |enabled|. +- (void)setUserInteractionEnabled:(BOOL)enabled; + +// Updates Infobar container layout. This should be called when Infobar +// container needs to re-draw. +- (void)updateLayout; +@end + +#endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONTAINER_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_view.h b/ios/chrome/browser/ui/infobars/infobar_container_view.h new file mode 100644 index 0000000..61ab12bd --- /dev/null +++ b/ios/chrome/browser/ui/infobars/infobar_container_view.h
@@ -0,0 +1,15 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONTAINER_VIEW_H_ +#define IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONTAINER_VIEW_H_ + +#import <UIKit/UIKit.h> + +#import "ios/chrome/browser/ui/infobars/infobar_container_consumer.h" + +@interface InfoBarContainerView : UIView<InfobarContainerConsumer> +@end + +#endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONTAINER_VIEW_H_
diff --git a/ios/chrome/browser/infobars/infobar_container_view.mm b/ios/chrome/browser/ui/infobars/infobar_container_view.mm similarity index 63% rename from ios/chrome/browser/infobars/infobar_container_view.mm rename to ios/chrome/browser/ui/infobars/infobar_container_view.mm index bdb5acbe..2cce323 100644 --- a/ios/chrome/browser/infobars/infobar_container_view.mm +++ b/ios/chrome/browser/ui/infobars/infobar_container_view.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/infobars/infobar_container_view.h" +#import "ios/chrome/browser/ui/infobars/infobar_container_view.h" #include "base/logging.h" #include "ios/chrome/browser/infobars/infobar.h" @@ -12,8 +12,24 @@ #error "This file requires ARC support." #endif +namespace { +// Duration for the alpha change animation. +const CGFloat kAlphaChangeAnimationDuration = 0.35; +} // namespace + @implementation InfoBarContainerView +- (void)layoutSubviews { + for (UIView<InfoBarViewSizing>* view in self.subviews) { + [view sizeToFit]; + CGRect frame = view.frame; + frame.origin.y = CGRectGetHeight(frame) - [view visibleHeight]; + [view setFrame:frame]; + } +} + +#pragma mark - InfobarConsumer + - (void)addInfoBar:(InfoBarIOS*)infoBarIOS position:(NSInteger)position { DCHECK_LE((NSUInteger)position, [[self subviews] count]); CGRect containerBounds = [self bounds]; @@ -24,33 +40,6 @@ [self insertSubview:view atIndex:position]; } -- (CGSize)sizeThatFits:(CGSize)size { - CGFloat height = 0; - if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) { - for (UIView* view in self.subviews) { - CGSize elementSize = [view sizeThatFits:size]; - height += elementSize.height; - } - } else { - for (UIView* view in self.subviews) { - CGFloat elementHeight = [view sizeThatFits:size].height; - if (elementHeight > height) - height = elementHeight; - } - } - size.height = height; - return size; -} - -- (void)layoutSubviews { - for (UIView<InfoBarViewSizing>* view in self.subviews) { - [view sizeToFit]; - CGRect frame = view.frame; - frame.origin.y = CGRectGetHeight(frame) - [view visibleHeight]; - [view setFrame:frame]; - } -} - - (CGFloat)topmostVisibleInfoBarHeight { for (UIView* view in [self.subviews reverseObjectEnumerator]) { return [view sizeThatFits:self.frame.size].height; @@ -58,4 +47,27 @@ return 0; } +- (void)animateInfoBarContainerToAlpha:(CGFloat)alpha { + CGFloat oldAlpha = self.alpha; + if (oldAlpha > 0 && alpha == 0) { + [self setUserInteractionEnabled:NO]; + } + + [UIView transitionWithView:self + duration:kAlphaChangeAnimationDuration + options:UIViewAnimationOptionCurveEaseInOut + animations:^{ + [self setAlpha:alpha]; + } + completion:^(BOOL) { + if (oldAlpha == 0 && alpha > 0) { + [self setUserInteractionEnabled:YES]; + }; + }]; +} + +- (void)updateLayout { + [self setNeedsLayout]; +} + @end
diff --git a/ios/chrome/browser/ui/infobars/infobar_coordinator.mm b/ios/chrome/browser/ui/infobars/infobar_coordinator.mm index 5ae6bb17..3a726e2 100644 --- a/ios/chrome/browser/ui/infobars/infobar_coordinator.mm +++ b/ios/chrome/browser/ui/infobars/infobar_coordinator.mm
@@ -9,13 +9,13 @@ #include "base/ios/block_types.h" #include "ios/chrome/browser/infobars/infobar_container_delegate_ios.h" #include "ios/chrome/browser/infobars/infobar_container_ios.h" -#include "ios/chrome/browser/infobars/infobar_container_view.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h" #import "ios/chrome/browser/tabs/tab.h" #import "ios/chrome/browser/tabs/tab_model.h" #import "ios/chrome/browser/tabs/tab_model_observer.h" #import "ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.h" #import "ios/chrome/browser/ui/commands/application_commands.h" +#include "ios/chrome/browser/ui/infobars/infobar_container_view.h" #import "ios/chrome/browser/ui/infobars/infobar_positioner.h" #import "ios/chrome/browser/ui/settings/sync_utils/sync_util.h" #import "ios/chrome/browser/ui/signin_interaction/public/signin_presenter.h" @@ -41,6 +41,9 @@ } @property(nonatomic, assign) TabModel* tabModel; +// UIView that contains Infobars. +@property(nonatomic, strong) InfoBarContainerView* containerView; + @end @implementation InfobarCoordinator @@ -54,20 +57,23 @@ if (self) { _tabModel = tabModel; [_tabModel addObserver:self]; + _containerView = [[InfoBarContainerView alloc] init]; + [_containerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | + UIViewAutoresizingFlexibleTopMargin]; _infoBarContainerDelegate.reset(new InfoBarContainerDelegateIOS(self)); - _infoBarContainer.reset( - new InfoBarContainerIOS(_infoBarContainerDelegate.get())); + _infoBarContainer.reset(new InfoBarContainerIOS( + _infoBarContainerDelegate.get(), _containerView)); } return self; } - (void)start { - [self.baseViewController.view insertSubview:_infoBarContainer->view() + [self.baseViewController.view insertSubview:self.containerView aboveSubview:self.positioner.parentView]; CGRect infoBarFrame = self.positioner.parentView.frame; infoBarFrame.origin.y = CGRectGetMaxY(infoBarFrame); infoBarFrame.size.height = 0; - [_infoBarContainer->view() setFrame:infoBarFrame]; + [self.containerView setFrame:infoBarFrame]; infobars::InfoBarManager* infoBarManager = nullptr; if (self.tabModel.currentTab) { @@ -89,15 +95,15 @@ #pragma mark - Public Interface - (UIView*)view { - return _infoBarContainer->view(); + return self.containerView; } - (void)restoreInfobars { - _infoBarContainer->RestoreInfobars(); + [self.containerView animateInfoBarContainerToAlpha:1]; } - (void)suspendInfobars { - _infoBarContainer->SuspendInfobars(); + [self.containerView animateInfoBarContainerToAlpha:0]; } @@ -117,7 +123,7 @@ #pragma mark - InfobarContainerStateDelegate - (void)infoBarContainerStateDidChangeAnimated:(BOOL)animated { - InfoBarContainerView* infoBarContainerView = _infoBarContainer->view(); + InfoBarContainerView* infoBarContainerView = self.containerView; DCHECK(infoBarContainerView); CGRect containerFrame = infoBarContainerView.frame; CGFloat height = [infoBarContainerView topmostVisibleInfoBarHeight];
diff --git a/ios/chrome/common/material_timing.h b/ios/chrome/common/material_timing.h index d9c03c2..5756074c 100644 --- a/ios/chrome/common/material_timing.h +++ b/ios/chrome/common/material_timing.h
@@ -52,19 +52,6 @@ animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; -// Performs a standard UIView transition animation using a material timing -// |curve|. -// Note: any curve option specified in |options| will be ignored in favor of the -// specified curve value. -// See also: -// +[UIView transitionWithView:duration:options:animations:completion]. -+ (void)cr_transitionWithView:(UIView*)view - duration:(NSTimeInterval)duration - curve:(ios::material::Curve)curve - options:(UIViewAnimationOptions)options - animations:(void (^)(void))animations - completion:(void (^)(BOOL finished))completion; - @end #endif // IOS_CHROME_COMMON_MATERIAL_TIMING_H_
diff --git a/ios/chrome/common/material_timing.mm b/ios/chrome/common/material_timing.mm index 6eb4c3a..d1a9b62 100644 --- a/ios/chrome/common/material_timing.mm +++ b/ios/chrome/common/material_timing.mm
@@ -100,20 +100,4 @@ [CATransaction commit]; } -+ (void)cr_transitionWithView:(UIView*)view - duration:(NSTimeInterval)duration - curve:(ios::material::Curve)curve - options:(UIViewAnimationOptions)options - animations:(void (^)(void))animations - completion:(void (^)(BOOL finished))completion { - [CATransaction begin]; - [CATransaction setAnimationTimingFunction:TimingFunction(curve)]; - [UIView transitionWithView:view - duration:duration - options:AnimationOptionsForceLinearTiming(options) - animations:animations - completion:completion]; - [CATransaction commit]; -} - @end
diff --git a/ios/third_party/material_components_ios/README.chromium b/ios/third_party/material_components_ios/README.chromium index c395239..184391a 100644 --- a/ios/third_party/material_components_ios/README.chromium +++ b/ios/third_party/material_components_ios/README.chromium
@@ -1,7 +1,7 @@ Name: Material Components for iOS URL: https://github.com/material-components/material-components-ios Version: 0 -Revision: f6c357a1718718a576e1b57ef97c8d165b728068 +Revision: d57bd2777a261d3503c745fa5a7e080f9523a676 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/ios/web/features.mm b/ios/web/features.mm index 9f28b64..df35177 100644 --- a/ios/web/features.mm +++ b/ios/web/features.mm
@@ -7,6 +7,9 @@ namespace web { namespace features { +const base::Feature kIgnoresViewportScaleLimits{ + "IgnoresViewportScaleLimits", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kWebFrameMessaging{"WebFrameMessaging", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/web/public/features.h b/ios/web/public/features.h index 6d2452e4..2e3e6cf 100644 --- a/ios/web/public/features.h +++ b/ios/web/public/features.h
@@ -10,6 +10,9 @@ namespace web { namespace features { +// Used to always allow scaling of the web page, regardless of author intent. +extern const base::Feature kIgnoresViewportScaleLimits; + // Used to enable API to send messages directly to frames of a webpage. extern const base::Feature kWebFrameMessaging;
diff --git a/ios/web/web_state/ui/wk_web_view_configuration_provider.mm b/ios/web/web_state/ui/wk_web_view_configuration_provider.mm index 18a5f1e..96615025 100644 --- a/ios/web/web_state/ui/wk_web_view_configuration_provider.mm +++ b/ios/web/web_state/ui/wk_web_view_configuration_provider.mm
@@ -10,6 +10,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "ios/web/public/browser_state.h" +#include "ios/web/public/features.h" #import "ios/web/web_state/js/page_script_util.h" #import "ios/web/web_state/ui/crw_wk_script_message_router.h" @@ -85,8 +86,12 @@ [configuration_ setWebsiteDataStore:[WKWebsiteDataStore nonPersistentDataStore]]; } - // API available on iOS 9, although doesn't appear to enable inline playback - // Works as intended on iOS 10+ + + if (base::FeatureList::IsEnabled( + web::features::kIgnoresViewportScaleLimits)) { + [configuration_ setIgnoresViewportScaleLimits:YES]; + } + [configuration_ setAllowsInlineMediaPlayback:YES]; // setJavaScriptCanOpenWindowsAutomatically is required to support popups. [[configuration_ preferences] setJavaScriptCanOpenWindowsAutomatically:YES];
diff --git a/ios/web_view/internal/passwords/cwv_password_controller.mm b/ios/web_view/internal/passwords/cwv_password_controller.mm index d52f8bc..273369c 100644 --- a/ios/web_view/internal/passwords/cwv_password_controller.mm +++ b/ios/web_view/internal/passwords/cwv_password_controller.mm
@@ -360,22 +360,14 @@ [self.suggestionHelper checkIfSuggestionsAvailableForForm:formName fieldIdentifier:fieldIdentifier + fieldType:fieldType type:@"focus" frameID:frameID isMainFrame:YES webState:_webState completionHandler:^(BOOL suggestionsAvailable) { - // Currently -checkIfSuggestionsAvailableForForm always - // returns NO for password fields, in this case, we - // still need to retrieve suggestions. - // TODO(crbug.com/865114): Update - // -checkIfSuggestionsAvailableForForm to return YES - // for password fields if matching form is found. - BOOL willRetrieve = - suggestionsAvailable || - [fieldType isEqualToString:@"password"]; CWVPasswordController* strongSelf = weakSelf; - if (!strongSelf || !willRetrieve) { + if (!strongSelf || !suggestionsAvailable) { completionHandler(@[]); return; } @@ -407,6 +399,7 @@ getFillDataForUsername:suggestion.formSuggestion.value]; if (!fillData) { DLOG(WARNING) << "Failed to fill password suggestion: Fill data not found."; + return; } [self.formHelper fillPasswordFormWithFillData:*fillData completionHandler:^(BOOL success) {
diff --git a/ios/web_view/internal/signin/web_view_signin_manager_factory.mm b/ios/web_view/internal/signin/web_view_signin_manager_factory.mm index ed1ad46..0ccb6d0 100644 --- a/ios/web_view/internal/signin/web_view_signin_manager_factory.mm +++ b/ios/web_view/internal/signin/web_view_signin_manager_factory.mm
@@ -11,6 +11,7 @@ #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_registry_simple.h" +#include "components/prefs/pref_service.h" #include "components/signin/core/browser/profile_management_switches.h" #include "components/signin/core/browser/signin_manager.h" #include "components/signin/core/browser/signin_pref_names.h" @@ -69,6 +70,14 @@ web::BrowserState* context) const { WebViewBrowserState* browser_state = WebViewBrowserState::FromBrowserState(context); + + // Clearing the sign in state on start up greatly simplifies the management of + // ChromeWebView's signin state. + PrefService* pref_service = browser_state->GetPrefs(); + pref_service->ClearPref(prefs::kGoogleServicesAccountId); + pref_service->ClearPref(prefs::kGoogleServicesUsername); + pref_service->ClearPref(prefs::kGoogleServicesUserAccountId); + std::unique_ptr<SigninManager> service = std::make_unique<SigninManager>( WebViewSigninClientFactory::GetForBrowserState(browser_state), WebViewOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
diff --git a/ios/web_view/internal/web_view_global_state_util.mm b/ios/web_view/internal/web_view_global_state_util.mm index 185244ae..fcf62ef 100644 --- a/ios/web_view/internal/web_view_global_state_util.mm +++ b/ios/web_view/internal/web_view_global_state_util.mm
@@ -29,13 +29,6 @@ web_main_delegate = std::make_unique<ios_web_view::WebViewWebMainDelegate>(); web::WebMainParams params(web_main_delegate.get()); - params.argc = 2; - const char* executable = "ios-web-view"; - // This is used in SigninManagerBase to clear the tokens on startup. This - // greatly simplifies the management of ChromeWebView's signin state. - const char* clear_token = "--clear-token-service"; - const char* argv[] = {executable, clear_token}; - params.argv = argv; web_main = std::make_unique<web::WebMain>(std::move(params)); }); }
diff --git a/net/BUILD.gn b/net/BUILD.gn index 22d5961..42d5e4a 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -1636,6 +1636,7 @@ "third_party/spdy/core/spdy_protocol.h", "third_party/spdy/core/write_scheduler.h", "third_party/spdy/core/zero_copy_output_buffer.h", + "third_party/spdy/platform/api/spdy_arraysize.h", "third_party/spdy/platform/api/spdy_estimate_memory_usage.h", "third_party/spdy/platform/api/spdy_export.h", "third_party/spdy/platform/api/spdy_flags.h", @@ -1644,6 +1645,7 @@ "third_party/spdy/platform/api/spdy_string.h", "third_party/spdy/platform/api/spdy_string_piece.h", "third_party/spdy/platform/api/spdy_string_utils.h", + "third_party/spdy/platform/impl/spdy_arraysize_impl.h", "third_party/spdy/platform/impl/spdy_estimate_memory_usage_impl.h", "third_party/spdy/platform/impl/spdy_export_impl.h", "third_party/spdy/platform/impl/spdy_flags_impl.cc",
diff --git a/net/proxy_resolution/proxy_resolution_service.cc b/net/proxy_resolution/proxy_resolution_service.cc index 190e419..4ada96d4 100644 --- a/net/proxy_resolution/proxy_resolution_service.cc +++ b/net/proxy_resolution/proxy_resolution_service.cc
@@ -21,6 +21,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "base/values.h" +#include "build/build_config.h" #include "net/base/net_errors.h" #include "net/base/proxy_delegate.h" #include "net/base/url_util.h" @@ -1553,6 +1554,9 @@ #elif defined(OS_ANDROID) return std::make_unique<ProxyConfigServiceAndroid>( main_task_runner, base::ThreadTaskRunnerHandle::Get()); +#elif defined(OS_FUCHSIA) + // TODO(crbug.com/889195): Implement a system proxy service for Fuchsia. + return std::make_unique<ProxyConfigServiceDirect>(); #else LOG(WARNING) << "Failed to choose a system proxy settings fetcher " "for this platform.";
diff --git a/net/third_party/spdy/core/hpack/hpack_constants.cc b/net/third_party/spdy/core/hpack/hpack_constants.cc index 080a2fc..a828f6d 100644 --- a/net/third_party/spdy/core/hpack/hpack_constants.cc +++ b/net/third_party/spdy/core/hpack/hpack_constants.cc
@@ -11,6 +11,7 @@ #include "base/memory/singleton.h" #include "net/third_party/spdy/core/hpack/hpack_huffman_table.h" #include "net/third_party/spdy/core/hpack/hpack_static_table.h" +#include "net/third_party/spdy/platform/api/spdy_arraysize.h" #include "net/third_party/spdy/platform/api/spdy_ptr_util.h" namespace spdy { @@ -327,13 +328,13 @@ {0xfffffffcul, 30, 256}, // EOS 11111111|11111111|11111111|111111 }; return std::vector<HpackHuffmanSymbol>( - kHpackHuffmanCode, kHpackHuffmanCode + arraysize(kHpackHuffmanCode)); + kHpackHuffmanCode, kHpackHuffmanCode + SPDY_ARRAYSIZE(kHpackHuffmanCode)); } // The "constructor" for a HpackStaticEntry that computes the lengths at // compile time. #define STATIC_ENTRY(name, value) \ - { name, arraysize(name) - 1, value, arraysize(value) - 1 } + { name, SPDY_ARRAYSIZE(name) - 1, value, SPDY_ARRAYSIZE(value) - 1 } std::vector<HpackStaticEntry> HpackStaticTableVector() { static const HpackStaticEntry kHpackStaticTable[] = { @@ -400,7 +401,7 @@ STATIC_ENTRY("www-authenticate", ""), // 61 }; return std::vector<HpackStaticEntry>( - kHpackStaticTable, kHpackStaticTable + arraysize(kHpackStaticTable)); + kHpackStaticTable, kHpackStaticTable + SPDY_ARRAYSIZE(kHpackStaticTable)); } #undef STATIC_ENTRY
diff --git a/net/third_party/spdy/core/hpack/hpack_decoder_adapter_test.cc b/net/third_party/spdy/core/hpack/hpack_decoder_adapter_test.cc index 9a781e2d..551acb1 100644 --- a/net/third_party/spdy/core/hpack/hpack_decoder_adapter_test.cc +++ b/net/third_party/spdy/core/hpack/hpack_decoder_adapter_test.cc
@@ -22,6 +22,7 @@ #include "net/third_party/spdy/core/hpack/hpack_encoder.h" #include "net/third_party/spdy/core/hpack/hpack_output_stream.h" #include "net/third_party/spdy/core/spdy_test_utils.h" +#include "net/third_party/spdy/platform/api/spdy_arraysize.h" #include "net/third_party/spdy/platform/api/spdy_string.h" #include "net/third_party/spdy/platform/api/spdy_string_utils.h" #include "testing/gmock/include/gmock/gmock.h" @@ -586,8 +587,8 @@ // First header with indexed name, second header with string literal // name. const char input[] = "\x04\x0c/sample/path\x00\x06:path2\x0e/sample/path/2"; - const SpdyHeaderBlock& header_set = - DecodeBlockExpectingSuccess(SpdyStringPiece(input, arraysize(input) - 1)); + const SpdyHeaderBlock& header_set = DecodeBlockExpectingSuccess( + SpdyStringPiece(input, SPDY_ARRAYSIZE(input) - 1)); SpdyHeaderBlock expected_header_set; expected_header_set[":path"] = "/sample/path"; @@ -599,8 +600,8 @@ // indexing and string literal names should work. TEST_P(HpackDecoderAdapterTest, LiteralHeaderIncrementalIndexing) { const char input[] = "\x44\x0c/sample/path\x40\x06:path2\x0e/sample/path/2"; - const SpdyHeaderBlock& header_set = - DecodeBlockExpectingSuccess(SpdyStringPiece(input, arraysize(input) - 1)); + const SpdyHeaderBlock& header_set = DecodeBlockExpectingSuccess( + SpdyStringPiece(input, SPDY_ARRAYSIZE(input) - 1)); SpdyHeaderBlock expected_header_set; expected_header_set[":path"] = "/sample/path";
diff --git a/net/third_party/spdy/core/hpack/hpack_huffman_table_test.cc b/net/third_party/spdy/core/hpack/hpack_huffman_table_test.cc index e7ab9f7..9424782 100644 --- a/net/third_party/spdy/core/hpack/hpack_huffman_table_test.cc +++ b/net/third_party/spdy/core/hpack/hpack_huffman_table_test.cc
@@ -14,6 +14,7 @@ #include "net/third_party/http2/hpack/huffman/hpack_huffman_decoder.h" #include "net/third_party/spdy/core/hpack/hpack_constants.h" #include "net/third_party/spdy/core/hpack/hpack_output_stream.h" +#include "net/third_party/spdy/platform/api/spdy_arraysize.h" #include "net/third_party/spdy/platform/api/spdy_string_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -84,7 +85,7 @@ {bits32("11000000000000000000000000000000"), 3, 6}, {bits32("11100000000000000000000000000000"), 8, 7}}; HpackHuffmanTable table; - EXPECT_TRUE(table.Initialize(code, arraysize(code))); + EXPECT_TRUE(table.Initialize(code, SPDY_ARRAYSIZE(code))); } { // But using 2 bits with one symbol overflows the code. @@ -98,7 +99,7 @@ {bits32("11100000000000000000000000000000"), 3, 6}, {bits32("00000000000000000000000000000000"), 8, 7}}; // Overflow. HpackHuffmanTable table; - EXPECT_FALSE(table.Initialize(code, arraysize(code))); + EXPECT_FALSE(table.Initialize(code, SPDY_ARRAYSIZE(code))); EXPECT_EQ(7, HpackHuffmanTablePeer(table).failed_symbol_id()); } { @@ -109,7 +110,7 @@ {bits32("11000000000000000000000000000000"), 3, 2}, {bits32("11100000000000000000000000000000"), 8, 3}}; HpackHuffmanTable table; - EXPECT_TRUE(table.Initialize(code, arraysize(code))); + EXPECT_TRUE(table.Initialize(code, SPDY_ARRAYSIZE(code))); } { // But repeating a length overflows the code. @@ -119,7 +120,7 @@ {bits32("11000000000000000000000000000000"), 2, 2}, {bits32("00000000000000000000000000000000"), 8, 3}}; // Overflow. HpackHuffmanTable table; - EXPECT_FALSE(table.Initialize(code, arraysize(code))); + EXPECT_FALSE(table.Initialize(code, SPDY_ARRAYSIZE(code))); EXPECT_EQ(3, HpackHuffmanTablePeer(table).failed_symbol_id()); } { @@ -130,7 +131,7 @@ {bits32("11000000000000000000000000000000"), 3, 1}, // Repeat. {bits32("11100000000000000000000000000000"), 8, 3}}; HpackHuffmanTable table; - EXPECT_FALSE(table.Initialize(code, arraysize(code))); + EXPECT_FALSE(table.Initialize(code, SPDY_ARRAYSIZE(code))); EXPECT_EQ(2, HpackHuffmanTablePeer(table).failed_symbol_id()); } { @@ -141,7 +142,7 @@ {bits32("10100000000000000000000000000000"), 4, 2}, {bits32("10110000000000000000000000000000"), 8, 3}}; HpackHuffmanTable table; - EXPECT_FALSE(table.Initialize(code, arraysize(code))); + EXPECT_FALSE(table.Initialize(code, SPDY_ARRAYSIZE(code))); EXPECT_EQ(0, HpackHuffmanTablePeer(table).failed_symbol_id()); } { @@ -152,7 +153,7 @@ {bits32("11000000000000000000000000000000"), 2, 2}, // Not canonical. {bits32("10000000000000000000000000000000"), 8, 3}}; HpackHuffmanTable table; - EXPECT_FALSE(table.Initialize(code, arraysize(code))); + EXPECT_FALSE(table.Initialize(code, SPDY_ARRAYSIZE(code))); EXPECT_EQ(2, HpackHuffmanTablePeer(table).failed_symbol_id()); } { @@ -163,7 +164,7 @@ {bits32("11000000000000000000000000000000"), 3, 2}, {bits32("11100000000000000000000000000000"), 7, 3}}; HpackHuffmanTable table; - EXPECT_FALSE(table.Initialize(code, arraysize(code))); + EXPECT_FALSE(table.Initialize(code, SPDY_ARRAYSIZE(code))); } } @@ -177,10 +178,10 @@ {bits32("10001000000000000000000000000000"), 5, 5}, // 6th. {bits32("10011000000000000000000000000000"), 8, 6}, // 8th. {bits32("10010000000000000000000000000000"), 5, 7}}; // 7th. - EXPECT_TRUE(table_.Initialize(code, arraysize(code))); - ASSERT_EQ(arraysize(code), peer_.code_by_id().size()); - ASSERT_EQ(arraysize(code), peer_.length_by_id().size()); - for (size_t i = 0; i < arraysize(code); ++i) { + EXPECT_TRUE(table_.Initialize(code, SPDY_ARRAYSIZE(code))); + ASSERT_EQ(SPDY_ARRAYSIZE(code), peer_.code_by_id().size()); + ASSERT_EQ(SPDY_ARRAYSIZE(code), peer_.length_by_id().size()); + for (size_t i = 0; i < SPDY_ARRAYSIZE(code); ++i) { EXPECT_EQ(code[i].code, peer_.code_by_id()[i]); EXPECT_EQ(code[i].length, peer_.length_by_id()[i]); } @@ -188,11 +189,11 @@ EXPECT_EQ(bits8("10011000"), peer_.pad_bits()); char input_storage[] = {2, 3, 2, 7, 4}; - SpdyStringPiece input(input_storage, arraysize(input_storage)); + SpdyStringPiece input(input_storage, SPDY_ARRAYSIZE(input_storage)); // By symbol: (2) 00 (3) 010 (2) 00 (7) 10010 (4) 10000 (6 as pad) 1001100. char expect_storage[] = {bits8("00010001"), bits8("00101000"), bits8("01001100")}; - SpdyStringPiece expect(expect_storage, arraysize(expect_storage)); + SpdyStringPiece expect(expect_storage, SPDY_ARRAYSIZE(expect_storage)); EXPECT_EQ(expect, EncodeString(input)); } @@ -231,7 +232,7 @@ "custom-value", }; // Round-trip each test example. - for (size_t i = 0; i != arraysize(test_table); i += 2) { + for (size_t i = 0; i != SPDY_ARRAYSIZE(test_table); i += 2) { const SpdyString& encodedFixture(test_table[i]); const SpdyString& decodedFixture(test_table[i + 1]); DecodeString(encodedFixture, &buffer); @@ -260,7 +261,7 @@ "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", }; // Round-trip each test example. - for (size_t i = 0; i != arraysize(test_table); i += 2) { + for (size_t i = 0; i != SPDY_ARRAYSIZE(test_table); i += 2) { const SpdyString& encodedFixture(test_table[i]); const SpdyString& decodedFixture(test_table[i + 1]); DecodeString(encodedFixture, &buffer); @@ -274,7 +275,7 @@ for (size_t i = 0; i != 256; i++) { char c = static_cast<char>(i); char storage[3] = {c, c, c}; - SpdyStringPiece input(storage, arraysize(storage)); + SpdyStringPiece input(storage, SPDY_ARRAYSIZE(storage)); SpdyString buffer_in = EncodeString(input); SpdyString buffer_out; DecodeString(buffer_in, &buffer_out); @@ -288,7 +289,7 @@ storage[i] = static_cast<char>(i); storage[511 - i] = static_cast<char>(i); } - SpdyStringPiece input(storage, arraysize(storage)); + SpdyStringPiece input(storage, SPDY_ARRAYSIZE(storage)); SpdyString buffer_in = EncodeString(input); SpdyString buffer_out; @@ -308,12 +309,12 @@ }; for (size_t i = 0; i != 256; ++i) { // Expand last |test_table| entry to cover all codes. - test_table[arraysize(test_table) - 1][i] = static_cast<char>(i); + test_table[SPDY_ARRAYSIZE(test_table) - 1][i] = static_cast<char>(i); } HpackOutputStream output_stream; SpdyString encoding; - for (size_t i = 0; i != arraysize(test_table); ++i) { + for (size_t i = 0; i != SPDY_ARRAYSIZE(test_table); ++i) { table_.EncodeString(test_table[i], &output_stream); output_stream.TakeString(&encoding); EXPECT_EQ(encoding.size(), table_.EncodedSize(test_table[i]));
diff --git a/net/third_party/spdy/core/spdy_frame_reader_test.cc b/net/third_party/spdy/core/spdy_frame_reader_test.cc index 09ee1c0..fd88dc95 100644 --- a/net/third_party/spdy/core/spdy_frame_reader_test.cc +++ b/net/third_party/spdy/core/spdy_frame_reader_test.cc
@@ -9,6 +9,7 @@ #include <memory> #include "base/sys_byteorder.h" +#include "net/third_party/spdy/platform/api/spdy_arraysize.h" #include "testing/platform_test.h" namespace spdy { @@ -40,7 +41,7 @@ }; SpdyFrameReader frame_reader(reinterpret_cast<const char*>(kFrameData), - arraysize(kFrameData) * sizeof(uint32_t)); + SPDY_ARRAYSIZE(kFrameData) * sizeof(uint32_t)); EXPECT_FALSE(frame_reader.IsDoneReading()); uint32_t uint32_val; @@ -63,7 +64,7 @@ 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, // "Testing, 1, 2, 3" }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); SpdyStringPiece stringpiece_val; @@ -86,7 +87,7 @@ 0x20, 0x34, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x36, // "Testing, 4, 5, 6" }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); SpdyStringPiece stringpiece_val; @@ -105,7 +106,7 @@ 0x00, // part of a uint16_t }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); uint16_t uint16_val; @@ -118,7 +119,7 @@ 0x00, 0x00, 0x00, // part of a uint32_t }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); uint32_t uint32_val; @@ -138,7 +139,7 @@ 0x48, 0x69, // "Hi" }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); SpdyStringPiece stringpiece_val; @@ -157,7 +158,7 @@ 0x00, // part of a uint16_t }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); SpdyStringPiece stringpiece_val; @@ -177,7 +178,7 @@ 0x48, 0x69, // "Hi" }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); SpdyStringPiece stringpiece_val; @@ -196,7 +197,7 @@ 0x00, 0x00, 0x00, // part of a uint32_t }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); SpdyStringPiece stringpiece_val; @@ -215,18 +216,18 @@ 0x48, 0x69, // "Hi" }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); char dest1[3] = {}; - EXPECT_TRUE(frame_reader.ReadBytes(&dest1, arraysize(dest1))); + EXPECT_TRUE(frame_reader.ReadBytes(&dest1, SPDY_ARRAYSIZE(dest1))); EXPECT_FALSE(frame_reader.IsDoneReading()); - EXPECT_EQ("foo", SpdyStringPiece(dest1, arraysize(dest1))); + EXPECT_EQ("foo", SpdyStringPiece(dest1, SPDY_ARRAYSIZE(dest1))); char dest2[2] = {}; - EXPECT_TRUE(frame_reader.ReadBytes(&dest2, arraysize(dest2))); + EXPECT_TRUE(frame_reader.ReadBytes(&dest2, SPDY_ARRAYSIZE(dest2))); EXPECT_TRUE(frame_reader.IsDoneReading()); - EXPECT_EQ("Hi", SpdyStringPiece(dest2, arraysize(dest2))); + EXPECT_EQ("Hi", SpdyStringPiece(dest2, SPDY_ARRAYSIZE(dest2))); } TEST(SpdyFrameReaderTest, ReadBytesWithBufferTooSmall) { @@ -235,11 +236,11 @@ 0x01, }; - SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); + SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_FALSE(frame_reader.IsDoneReading()); - char dest[arraysize(kFrameData) + 2] = {}; - EXPECT_FALSE(frame_reader.ReadBytes(&dest, arraysize(kFrameData) + 1)); + char dest[SPDY_ARRAYSIZE(kFrameData) + 2] = {}; + EXPECT_FALSE(frame_reader.ReadBytes(&dest, SPDY_ARRAYSIZE(kFrameData) + 1)); EXPECT_STREQ("", dest); }
diff --git a/net/third_party/spdy/core/spdy_framer_test.cc b/net/third_party/spdy/core/spdy_framer_test.cc index 40f5737..3fab3a5 100644 --- a/net/third_party/spdy/core/spdy_framer_test.cc +++ b/net/third_party/spdy/core/spdy_framer_test.cc
@@ -23,6 +23,7 @@ #include "net/third_party/spdy/core/spdy_frame_reader.h" #include "net/third_party/spdy/core/spdy_protocol.h" #include "net/third_party/spdy/core/spdy_test_utils.h" +#include "net/third_party/spdy/platform/api/spdy_arraysize.h" #include "net/third_party/spdy/platform/api/spdy_flags.h" #include "net/third_party/spdy/platform/api/spdy_ptr_util.h" #include "net/third_party/spdy/platform/api/spdy_string.h" @@ -1316,7 +1317,7 @@ const char bytes[] = "this is a test test test test test!"; SpdyDataIR data_ir(/* stream_id = */ 1, - SpdyStringPiece(bytes, arraysize(bytes))); + SpdyStringPiece(bytes, SPDY_ARRAYSIZE(bytes))); data_ir.set_fin(true); SpdySerializedFrame send_frame(framer_.SerializeData(data_ir)); @@ -1336,7 +1337,7 @@ EXPECT_EQ(0, visitor.error_count_); EXPECT_EQ(1, visitor.headers_frame_count_); - EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_)); + EXPECT_EQ(SPDY_ARRAYSIZE(bytes), static_cast<unsigned>(visitor.data_bytes_)); EXPECT_EQ(0, visitor.fin_frame_count_); EXPECT_EQ(0, visitor.fin_flag_count_); EXPECT_EQ(1, visitor.end_of_stream_count_); @@ -1361,7 +1362,7 @@ 0x12, 0x34, 0x56, 0x78, // Increment: 305419896 }; - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } TEST_P(SpdyFramerTest, CreateDataFrame) { @@ -1381,7 +1382,8 @@ SpdyDataIR data_ir(/* stream_id = */ 1, bytes); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); SpdyDataIR data_header_ir(/* stream_id = */ 1); data_header_ir.SetDataShallow(bytes); @@ -1436,7 +1438,8 @@ // bytes. data_ir.set_padding_len(248); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); frame = framer_.SerializeDataFrameHeaderWithPaddingLengthField(data_ir); CompareCharArraysWithHexError( @@ -1465,7 +1468,8 @@ // 7 zeros and the pad length field make the overall padding to be 8 bytes. data_ir.set_padding_len(8); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1489,7 +1493,8 @@ // payload is needed. data_ir.set_padding_len(1); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); frame = framer_.SerializeDataFrameHeaderWithPaddingLengthField(data_ir); CompareCharArraysWithHexError( @@ -1508,7 +1513,8 @@ }; SpdyDataIR data_ir(/* stream_id = */ 1, "\xff"); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1524,7 +1530,8 @@ SpdyDataIR data_ir(/* stream_id = */ 1, "hello"); data_ir.set_fin(true); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1537,7 +1544,8 @@ }; SpdyDataIR data_ir(/* stream_id = */ 1, ""); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); frame = framer_.SerializeDataFrameHeaderWithPaddingLengthField(data_ir); CompareCharArraysWithHexError( @@ -1558,7 +1566,8 @@ SpdyDataIR data_ir(/* stream_id = */ 0x7fffffff, "hello"); data_ir.set_fin(true); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); } } @@ -1580,7 +1589,8 @@ ASSERT_TRUE(framer_.SerializeRstStream(rst_stream, &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, + SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1601,7 +1611,7 @@ ASSERT_TRUE(framer_.SerializeRstStream(rst_stream, &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1621,7 +1631,7 @@ ASSERT_TRUE(framer_.SerializeRstStream(rst_stream, &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } } @@ -1648,7 +1658,7 @@ ASSERT_TRUE(framer_.SerializeSettings(settings_ir, &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1683,7 +1693,7 @@ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1702,7 +1712,7 @@ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } } @@ -1734,7 +1744,7 @@ ASSERT_TRUE(framer_.SerializePing(ping_ir, &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); // Tests SpdyPingIR when the ping is an ack. ping_ir.set_is_ack(true); @@ -1745,7 +1755,7 @@ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } CompareFrame(kDescription, frame, kH2FrameDataWithAck, - arraysize(kH2FrameDataWithAck)); + SPDY_ARRAYSIZE(kH2FrameDataWithAck)); } } @@ -1768,7 +1778,7 @@ ASSERT_TRUE(framer_.SerializeGoAway(goaway_ir, &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1790,7 +1800,7 @@ ASSERT_TRUE(framer_.SerializeGoAway(goaway_ir, &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } } @@ -1824,7 +1834,7 @@ headers.SetHeader("foo", "bar"); SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( &framer, headers, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1855,7 +1865,7 @@ headers.SetHeader("foo", "bar"); SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( &framer, headers, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1886,7 +1896,7 @@ headers_ir.SetHeader("foo", ""); SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( &framer, headers_ir, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1922,7 +1932,7 @@ headers_ir.SetHeader("foo", ""); SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( &framer, headers_ir, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -1961,7 +1971,7 @@ headers_ir.SetHeader("foo", ""); SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( &framer, headers_ir, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kV4FrameData, arraysize(kV4FrameData)); + CompareFrame(kDescription, frame, kV4FrameData, SPDY_ARRAYSIZE(kV4FrameData)); } { @@ -2000,7 +2010,7 @@ headers_ir.SetHeader("foo", ""); SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( &framer, headers_ir, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kV4FrameData, arraysize(kV4FrameData)); + CompareFrame(kDescription, frame, kV4FrameData, SPDY_ARRAYSIZE(kV4FrameData)); } { @@ -2037,7 +2047,7 @@ headers_ir.set_padding_len(6); SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( &framer, headers_ir, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } } @@ -2059,7 +2069,7 @@ SpdyWindowUpdateIR(/* stream_id = */ 1, /* delta = */ 1), &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -2080,7 +2090,7 @@ &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } { @@ -2101,7 +2111,7 @@ &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); + CompareFrame(kDescription, frame, kH2FrameData, SPDY_ARRAYSIZE(kH2FrameData)); } } @@ -2139,7 +2149,7 @@ push_promise.SetHeader("foo", "bar"); SpdySerializedFrame frame(SpdyFramerPeer::SerializePushPromise( &framer, push_promise, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); + CompareFrame(kDescription, frame, kFrameData, SPDY_ARRAYSIZE(kFrameData)); } { @@ -2179,7 +2189,7 @@ SpdySerializedFrame frame(SpdyFramerPeer::SerializePushPromise( &framer, push_promise, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); + CompareFrame(kDescription, frame, kFrameData, SPDY_ARRAYSIZE(kFrameData)); } { @@ -2239,7 +2249,7 @@ SpdySerializedFrame frame(SpdyFramerPeer::SerializePushPromise( &framer, push_promise, use_output_ ? &output_ : nullptr)); - CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); + CompareFrame(kDescription, frame, kFrameData, SPDY_ARRAYSIZE(kFrameData)); } } @@ -2293,7 +2303,7 @@ ASSERT_TRUE(framer.SerializeContinuation(continuation, &output_)); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); + CompareFrame(kDescription, frame, kFrameData, SPDY_ARRAYSIZE(kFrameData)); } // Test that if we send an unexpected CONTINUATION @@ -2425,15 +2435,16 @@ // Partially compare the PUSH_PROMISE frame against the template. const unsigned char* frame_data = reinterpret_cast<const unsigned char*>(frame.data()); - CompareCharArraysWithHexError( - kDescription, frame_data, arraysize(kPartialPushPromiseFrameData), - kPartialPushPromiseFrameData, arraysize(kPartialPushPromiseFrameData)); + CompareCharArraysWithHexError(kDescription, frame_data, + SPDY_ARRAYSIZE(kPartialPushPromiseFrameData), + kPartialPushPromiseFrameData, + SPDY_ARRAYSIZE(kPartialPushPromiseFrameData)); // Compare the CONTINUATION frame against the template. frame_data += kHttp2MaxControlFrameSendSize; CompareCharArraysWithHexError( - kDescription, frame_data, arraysize(kContinuationFrameData), - kContinuationFrameData, arraysize(kContinuationFrameData)); + kDescription, frame_data, SPDY_ARRAYSIZE(kContinuationFrameData), + kContinuationFrameData, SPDY_ARRAYSIZE(kContinuationFrameData)); } } @@ -2460,7 +2471,7 @@ EXPECT_EQ(framer_.SerializeFrame(altsvc_ir, &output_), frame.size()); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); + CompareFrame(kDescription, frame, kFrameData, SPDY_ARRAYSIZE(kFrameData)); } TEST_P(SpdyFramerTest, CreatePriority) { @@ -2482,7 +2493,7 @@ EXPECT_EQ(framer_.SerializeFrame(priority_ir, &output_), frame.size()); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); + CompareFrame(kDescription, frame, kFrameData, SPDY_ARRAYSIZE(kFrameData)); } TEST_P(SpdyFramerTest, CreateUnknown) { @@ -2509,7 +2520,7 @@ EXPECT_EQ(framer_.SerializeFrame(unknown_ir, &output_), frame.size()); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); + CompareFrame(kDescription, frame, kFrameData, SPDY_ARRAYSIZE(kFrameData)); } // Test serialization of a SpdyUnknownIR with a defined type, a length field @@ -2541,7 +2552,7 @@ EXPECT_EQ(framer_.SerializeFrame(unknown_ir, &output_), frame.size()); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); + CompareFrame(kDescription, frame, kFrameData, SPDY_ARRAYSIZE(kFrameData)); } TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { @@ -3578,7 +3589,7 @@ // Simulate the case where the stream id validation checks out. visitor.on_unknown_frame_result_ = true; - visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame)); + visitor.SimulateInFramer(unknown_frame, SPDY_ARRAYSIZE(unknown_frame)); EXPECT_EQ(0, visitor.error_count_); // Follow it up with a valid control frame to make sure we handle @@ -3614,7 +3625,7 @@ TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); TestExtension extension; visitor.set_extension_visitor(&extension); - visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame)); + visitor.SimulateInFramer(unknown_frame, SPDY_ARRAYSIZE(unknown_frame)); EXPECT_EQ(0, visitor.error_count_); EXPECT_EQ(0x7fffffffu, extension.stream_id_); EXPECT_EQ(20u, extension.length_); @@ -3645,7 +3656,7 @@ 0xff, 0xff, 0xff, 0xff, // }; TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); - visitor.SimulateInFramer(kFrameData, arraysize(kFrameData)); + visitor.SimulateInFramer(kFrameData, SPDY_ARRAYSIZE(kFrameData)); EXPECT_EQ(1, visitor.error_count_); } @@ -3664,7 +3675,7 @@ }; TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); - visitor.SimulateInFramer(kInput, arraysize(kInput)); + visitor.SimulateInFramer(kInput, SPDY_ARRAYSIZE(kInput)); EXPECT_EQ(1, visitor.error_count_); } @@ -4189,7 +4200,7 @@ EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_NO_ERROR)); deframer_.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid), - arraysize(kH2RstStreamInvalid)); + SPDY_ARRAYSIZE(kH2RstStreamInvalid)); EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( @@ -4199,7 +4210,7 @@ EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_INTERNAL_ERROR)); deframer_.ProcessInput( reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes), - arraysize(kH2RstStreamNumStatusCodes)); + SPDY_ARRAYSIZE(kH2RstStreamNumStatusCodes)); EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( @@ -4222,7 +4233,7 @@ EXPECT_CALL(visitor, OnGoAway(1, ERROR_CODE_INTERNAL_ERROR)); deframer_.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), - arraysize(kH2FrameData)); + SPDY_ARRAYSIZE(kH2FrameData)); EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( @@ -4246,7 +4257,7 @@ EXPECT_CALL(visitor, OnGoAway(0x7fffffff, ERROR_CODE_NO_ERROR)); deframer_.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), - arraysize(kH2FrameData)); + SPDY_ARRAYSIZE(kH2FrameData)); EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( @@ -4738,7 +4749,7 @@ SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); const char bytes[] = "this is a very short data frame"; - SpdyDataIR data_ir(1, SpdyStringPiece(bytes, arraysize(bytes))); + SpdyDataIR data_ir(1, SpdyStringPiece(bytes, SPDY_ARRAYSIZE(bytes))); CheckFrameAndIRSize(&data_ir, &framer, &output_); SpdyRstStreamIR rst_ir(/* stream_id = */ 1, ERROR_CODE_PROTOCOL_ERROR);
diff --git a/net/third_party/spdy/platform/api/spdy_arraysize.h b/net/third_party/spdy/platform/api/spdy_arraysize.h new file mode 100644 index 0000000..3c6710a1 --- /dev/null +++ b/net/third_party/spdy/platform/api/spdy_arraysize.h
@@ -0,0 +1,8 @@ +#ifndef NET_THIRD_PARTY_SPDY_PLATFORM_API_SPDY_ARRAYSIZE_H_ +#define NET_THIRD_PARTY_SPDY_PLATFORM_API_SPDY_ARRAYSIZE_H_ + +#include "net/third_party/spdy/platform/impl/spdy_arraysize_impl.h" + +#define SPDY_ARRAYSIZE(x) SPDY_ARRAYSIZE_IMPL(x) + +#endif // NET_THIRD_PARTY_SPDY_PLATFORM_API_SPDY_ARRAYSIZE_H_
diff --git a/net/third_party/spdy/platform/impl/spdy_arraysize_impl.h b/net/third_party/spdy/platform/impl/spdy_arraysize_impl.h new file mode 100644 index 0000000..1111fbcd --- /dev/null +++ b/net/third_party/spdy/platform/impl/spdy_arraysize_impl.h
@@ -0,0 +1,8 @@ +#ifndef NET_THIRD_PARTY_SPDY_PLATFORM_IMPL_SPDY_ARRAYSIZE_IMPL_H_ +#define NET_THIRD_PARTY_SPDY_PLATFORM_IMPL_SPDY_ARRAYSIZE_IMPL_H_ + +#include "base/macros.h" + +#define SPDY_ARRAYSIZE_IMPL(x) arraysize(x) + +#endif /* NET_THIRD_PARTY_SPDY_PLATFORM_IMPL_SPDY_ARRAYSIZE_IMPL_H_ */
diff --git a/remoting/ios/app/client_connection_view_controller.mm b/remoting/ios/app/client_connection_view_controller.mm index 68bff3f..070f1f2 100644 --- a/remoting/ios/app/client_connection_view_controller.mm +++ b/remoting/ios/app/client_connection_view_controller.mm
@@ -484,7 +484,6 @@ HostViewController* hostViewController = [[HostViewController alloc] initWithClient:_client]; - _client = nil; [self.navigationController pushViewController:hostViewController animated:NO]; }
diff --git a/remoting/resources/remoting_strings_te.xtb b/remoting/resources/remoting_strings_te.xtb index 55a3d01..0f595f30 100644 --- a/remoting/resources/remoting_strings_te.xtb +++ b/remoting/resources/remoting_strings_te.xtb
@@ -7,12 +7,12 @@ <translation id="1199593201721843963">రిమోట్ కనెక్షన్లను నిలిపివేయి</translation> <translation id="1291443878853470558">మీరు ఈ కంప్యూటర్ను ప్రాప్యత చేయడానికి Chromotingను ఉపయోగించాలనుకుంటే మీరు రిమోట్ కనెక్షన్లను తప్పనిసరిగా ప్రారంభించాలి.</translation> <translation id="1297009705180977556"><ph name="HOSTNAME" />కు కనెక్ట్ చేయడంలో లోపం</translation> -<translation id="1300633907480909701">మీ Android పరికరం నుండి మీ కంప్యూటర్లను సురక్షితంగా ప్రాప్యత చేయండి. +<translation id="1300633907480909701">మీ Android పరికరం నుండి మీ కంప్యూటర్లను సురక్షితంగా యాక్సెస్ చేయండి. -• మీ కంప్యూటర్ల్లో ప్రతిదానిలోనూ, Chrome వెబ్ స్టోర్లోని Chrome రిమోట్ డెస్క్టాప్ అనువర్తనాన్ని ఉపయోగించి రిమోట్ ప్రాప్యతను సెటప్ చేయండి: https://chrome.google.com/remotedesktop -• మీ Android పరికరంలో, అనువర్తనాన్ని తెరిచి, కనెక్ట్ చేయడానికి మీ ఆన్లైన్ కంప్యూటర్ల్లో దేనిపైన అయినా నొక్కండి. +• మీ కంప్యూటర్ల్లో ప్రతిదానిలోనూ, Chrome వెబ్ స్టోర్లోని Chrome రిమోట్ డెస్క్టాప్ యాప్ను ఉపయోగించి రిమోట్ యాక్సెస్ సెటప్ చేయండి: https://chrome.google.com/remotedesktop +• మీ Android పరికరంలో, యాప్ను తెరిచి, కనెక్ట్ చేయడానికి మీ ఆన్లైన్ కంప్యూటర్ల్లో దేనిపైన అయినా నొక్కండి. -US-ఆంగ్ల యేతర కీబోర్డ్లు కలిగి ఉన్న రిమోట్ కంప్యూటర్లు చెల్లని వచన ఇన్పుట్ను స్వీకరించవచ్చు. ఇతర కీబోర్డ్ లేఅవుట్లకు త్వరలోనే మద్దతు అందించబడుతుంది! +US-ఆంగ్లేతర కీబోర్డ్లు కలిగి ఉన్న రిమోట్ కంప్యూటర్లు చెల్లని వచన ఇన్పుట్ను స్వీకరించవచ్చు. ఇతర కీబోర్డ్ లేఅవుట్లకు త్వరలోనే మద్దతు అందించబడుతుంది! గోప్యత గురించి సమాచారం కోసం, దయచేసి Google గోప్యతా విధానాన్ని (http://goo.gl/SyrVzj) మరియు Chrome గోప్యతా విధానాన్ని (http://goo.gl/0uXE5d) చూడండి.</translation> <translation id="1324095856329524885">(ఈ లక్షణం మీ కంప్యూటర్కి ఇంకా అందుబాటులో లేదు)</translation> @@ -37,17 +37,17 @@ <translation id="195619862187186579">కీబోర్డ్ లేఅవుట్లు</translation> <translation id="1996161829609978754">Chromoting హోస్ట్ ఇన్స్టాలర్ను Chrome డౌన్లోడ్ చేస్తోంది. డౌన్లోడ్ పూర్తయిన తర్వాత, దయచేసి కొనసాగడానికి ముందు ఇన్స్టాలర్ను అమలు చేయండి.</translation> <translation id="2009755455353575666">కనెక్షన్ విఫలమైంది</translation> -<translation id="2013884659108657024">Chrome రిమోట్ డెస్క్టాప్ హోస్ట్ ఇన్స్టాలర్ను Chrome డౌన్లోడ్ చేస్తోంది. డౌన్లోడ్ పూర్తయిన తర్వాత, దయచేసి కొనసాగడానికి ముందు ఇన్స్టాలర్ను అమలు చేయండి.</translation> +<translation id="2013884659108657024">Chrome రిమోట్ డెస్క్టాప్ హోస్ట్ ఇన్స్టాలర్ను Chrome డౌన్లోడ్ చేస్తోంది. డౌన్లోడ్ పూర్తయిన తర్వాత, దయచేసి కొనసాగడానికి ముందు ఇన్స్టాలర్ను అమలు చేయండి.</translation> <translation id="2013996867038862849">జత చేయబడిన క్లయింట్లు అందరు తొలగించబడ్డారు.</translation> <translation id="2038229918502634450">విధాన మార్పుని అనుమతించడానికి హోస్ట్ పునఃప్రారంభించబడుతోంది.</translation> <translation id="2046651113449445291">కింది క్లయింట్లు ఈ కంప్యూటర్కు జత చేయబడ్డారు మరియు PINని అందించకుండానే కనెక్ట్ కాగలవు. మీరు ఈ అనుమతిని ఎప్పుడైనా ఒక్కొక్కరి కోసం లేదా క్లయింట్లు అందరి కోసం ఉపసంహరించవచ్చు.</translation> <translation id="2078880767960296260">హోస్ట్ ప్రక్రియ</translation> <translation id="20876857123010370">ట్రాక్ ప్యాడ్ మోడ్</translation> <translation id="2089514346391228378">ఈ కంప్యూటర్ కోసం రిమోట్ కనెక్షన్లు ప్రారంభించబడ్డాయి.</translation> -<translation id="2118549242412205620">మీ Android పరికరం నుండి మీ కంప్యూటర్లను సురక్షితంగా ప్రాప్యత చేయండి. +<translation id="2118549242412205620">మీ Android పరికరం నుండి మీ కంప్యూటర్లను సురక్షితంగా యాక్సెస్ చేయండి. -• మీ కంప్యూటర్ల్లో ప్రతిదానిలోనూ, Chrome వెబ్ స్టోర్లోని Chrome రిమోట్ డెస్క్టాప్ అనువర్తనాన్ని ఉపయోగించి రిమోట్ ప్రాప్యతను సెటప్ చేయండి: https://chrome.google.com/remotedesktop -• మీ Android పరికరంలో, అనువర్తనాన్ని తెరిచి, కనెక్ట్ చేయడానికి మీ ఆన్లైన్ కంప్యూటర్ల్లో దేనిపైన అయినా నొక్కండి. +• మీ కంప్యూటర్ల్లో ప్రతిదానిలోనూ, Chrome వెబ్ స్టోర్లోని Chrome రిమోట్ డెస్క్టాప్ యాప్ను ఉపయోగించి రిమోట్ యాక్సెస్ను సెటప్ చేయండి: https://chrome.google.com/remotedesktop +• మీ Android పరికరంలో, యాప్ను తెరిచి, కనెక్ట్ చేయడానికి మీ ఆన్లైన్ కంప్యూటర్ల్లో దేనిపైన అయినా నొక్కండి. గోప్యత గురించి సమాచారం కోసం, దయచేసి Google గోప్యతా విధానాన్ని (http://goo.gl/SyrVzj) మరియు Chrome గోప్యతా విధానాన్ని (http://goo.gl/0uXE5d) చూడండి.</translation> <translation id="2124408767156847088">మీ Android పరికరం నుండి మీ కంప్యూటర్లను సురక్షితంగా ప్రాప్యత చేయండి.</translation> @@ -65,7 +65,7 @@ <translation id="2353140552984634198">మీరు Chromotingను ఉపయోగించి ఈ కంప్యూటర్ను సురక్షితంగా ప్రాప్యత చేయవచ్చు.</translation> <translation id="2359808026110333948">కొనసాగు</translation> <translation id="2366718077645204424">హోస్ట్కు చేరుకోవడం సాధ్యపడలేదు. ఇది బహుశా మీరు ఉపయోగిస్తున్న నెట్వర్క్ యొక్క కాన్ఫిగరేషన్ వల్ల సంభవించి ఉండవచ్చు.</translation> -<translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> ఆన్లైన్లో చివరిగా కనిపించినది <ph name="RELATIVE_TIMESTAMP" />.</translation> +<translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> ఆన్లైన్లో చివరిగా కనిపించినది <ph name="RELATIVE_TIMESTAMP" />.</translation> <translation id="2405928220797050937">ఈ యాప్కు మద్దతు లేదు. మీరు తాజా ఫీచర్లు మరియు భద్రతా అప్డేట్లను పొందుతున్నట్లు నిర్ధారించుకోవడం కోసం, దయచేసి <ph name="LINK_BEGIN" />Chrome రిమోట్ డెస్క్టాప్ వెబ్ యాప్<ph name="LINK_END" /> ఉపయోగించండి.</translation> <translation id="2499160551253595098">వినియోగ గణాంకాలను మరియు క్రాష్ నివేదికలను సేకరించడానికి మమ్మల్ని అనుమతించడం ద్వారా Chrome రిమోట్ డెస్క్టాప్ను మెరుగుపరచడంలో మాకు సహాయపడండి.</translation> <translation id="2509394361235492552"><ph name="HOSTNAME" />కి కనెక్ట్ అయ్యింది</translation> @@ -298,7 +298,7 @@ <translation id="7810127880729796595">గణాంకాలను చూపు (కనెక్షన్: <ph name="QUALITY" />)</translation> <translation id="7836926030608666805">కొన్ని ఆవశ్యక అంశాలు లేవు. దయచేసి మీరు తాజా Chrome సంస్కరణను అమలు చేస్తున్నారని నిర్ధారించుకొని, ఆపై మళ్లీ ప్రయత్నించండి.</translation> <translation id="7868137160098754906">దయచేసి రిమోట్ కంప్యూటర్ కోసం మీ PINను నమోదు చేయండి.</translation> -<translation id="7869445566579231750">ఈ అప్లికేషన్ను అమలు చేయడానికి మీకు అనుమతి లేదు.</translation> +<translation id="7869445566579231750">ఈ యాప్ను అమలు చేయడానికి మీకు అనుమతి లేదు.</translation> <translation id="7895403300744144251">రిమోట్ కంప్యూటర్లోని భద్రతా విధానాలు మీ ఖాతా నుండి కనెక్షన్లను అనుమతించవు.</translation> <translation id="7936528439960309876">కుడివైపున ఉంచు</translation> <translation id="7948001860594368197">స్క్రీన్ ఎంపికలు</translation>
diff --git a/services/tracing/coordinator.cc b/services/tracing/coordinator.cc index 5535cee..c253db5e 100644 --- a/services/tracing/coordinator.cc +++ b/services/tracing/coordinator.cc
@@ -482,7 +482,7 @@ std::move(stop_and_flush_callback_) .Run(std::move(*trace_streamer_->GetMetadata())); background_task_runner_->DeleteSoon(FROM_HERE, trace_streamer_.release()); - agent_registry_->ForAllAgents([this](AgentRegistry::AgentEntry* agent_entry) { + agent_registry_->ForAllAgents([](AgentRegistry::AgentEntry* agent_entry) { agent_entry->set_is_tracing(false); }); is_tracing_ = false;
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index abe87a7..1b0e58a8 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -823,6 +823,18 @@ }, { "args": [ + "--enable-features=SingleProcessMash", + "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter" + ], + "name": "single_process_mash_interactive_ui_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "shards": 3 + }, + "test": "interactive_ui_tests" + }, + { + "args": [ "--enable-features=WebUIPolymer2", "--test-launcher-filter-file=../../testing/buildbot/filters/webui_polymer2_interactive_ui_tests.filter" ], @@ -1529,6 +1541,18 @@ }, { "args": [ + "--enable-features=SingleProcessMash", + "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter" + ], + "name": "single_process_mash_interactive_ui_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "shards": 3 + }, + "test": "interactive_ui_tests" + }, + { + "args": [ "--enable-features=WebUIPolymer2", "--test-launcher-filter-file=../../testing/buildbot/filters/webui_polymer2_interactive_ui_tests.filter" ],
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 941b0ef8..47b7ab4 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -1617,12 +1617,13 @@ }, { "args": [ - "--enable-features=SingleProcessMash", - "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter" + "--enable-features=NetworkService", + "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.chromeos.network_interactive_ui_tests.filter" ], - "name": "single_process_mash_interactive_ui_tests", + "name": "network_service_interactive_ui_tests", "swarming": { - "can_use_on_swarming_builders": true + "can_use_on_swarming_builders": true, + "shards": 3 }, "test": "interactive_ui_tests" }, @@ -3230,6 +3231,18 @@ "test": "crypto_unittests" }, { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "fidlgen_js_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "http_service_tests" + }, + { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter" ], @@ -3358,6 +3371,28 @@ "test": "crypto_unittests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1" + } + ] + }, + "test": "fidlgen_js_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1" + } + ] + }, + "test": "http_service_tests" + }, + { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter" ], @@ -3531,6 +3566,28 @@ "test": "crypto_unittests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1" + } + ] + }, + "test": "fidlgen_js_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1" + } + ] + }, + "test": "http_service_tests" + }, + { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter" ],
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index ba49dd15..46021304 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -708,6 +708,17 @@ "test": "crypto_unittests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1" + } + ] + }, + "test": "fidlgen_js_unittests" + }, + { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter" ],
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 6d401e6..e94a9583 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -4642,6 +4642,19 @@ }, { "args": [ + "--enable-features=SingleProcessMash", + "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter", + "--test-launcher-print-test-stdio=always" + ], + "name": "single_process_mash_interactive_ui_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "shards": 3 + }, + "test": "interactive_ui_tests" + }, + { + "args": [ "--enable-features=WebUIPolymer2", "--test-launcher-filter-file=../../testing/buildbot/filters/webui_polymer2_interactive_ui_tests.filter", "--test-launcher-print-test-stdio=always" @@ -5961,6 +5974,25 @@ }, { "args": [ + "--enable-features=SingleProcessMash", + "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter", + "--test-launcher-print-test-stdio=always" + ], + "name": "single_process_mash_interactive_ui_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Ubuntu-14.04" + } + ], + "shards": 3 + }, + "test": "interactive_ui_tests" + }, + { + "args": [ "--enable-features=WebUIPolymer2", "--test-launcher-filter-file=../../testing/buildbot/filters/webui_polymer2_interactive_ui_tests.filter", "--test-launcher-print-test-stdio=always"
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index b4e3a7b..e60d162 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -2518,6 +2518,7 @@ "test": "events_unittests" }, { + "experiment_percentage": 100, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index fe162bcf5..0d58107 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -32,6 +32,7 @@ "//testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter", "//testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter", "//testing/buildbot/filters/mojo.fyi.chromeos.network_browser_tests.filter", + "//testing/buildbot/filters/mojo.fyi.chromeos.network_interactive_ui_tests.filter", "//testing/buildbot/filters/mojo.fyi.network_browser_tests.filter", "//testing/buildbot/filters/webui_polymer2_browser_tests.filter", "//testing/buildbot/filters/webrtc_functional.browser_tests.filter",
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.ash_unittests.filter b/testing/buildbot/filters/chromeos.single_process_mash.ash_unittests.filter index b785c2e..2909977 100644 --- a/testing/buildbot/filters/chromeos.single_process_mash.ash_unittests.filter +++ b/testing/buildbot/filters/chromeos.single_process_mash.ash_unittests.filter
@@ -1,7 +1,6 @@ # These tests fail. https://crbug.com/646565 -AppListPresenterDelegateTest.TapAppListWithVirtualKeyboardDismissesVirtualKeyboard/0 -AppListPresenterDelegateTest.TapAppListWithVirtualKeyboardDismissesVirtualKeyboard/1 --AshKeyboardControllerTest.* -LockActionHandlerLayoutManagerTest.KeyboardBounds -PipPositionerTest.* -PipWindowResizerTest.*
diff --git a/testing/buildbot/filters/mojo.fyi.chromeos.network_interactive_ui_tests.filter b/testing/buildbot/filters/mojo.fyi.chromeos.network_interactive_ui_tests.filter new file mode 100644 index 0000000..2486373 --- /dev/null +++ b/testing/buildbot/filters/mojo.fyi.chromeos.network_interactive_ui_tests.filter
@@ -0,0 +1,26 @@ +# NOTE: if adding an exclusion for an existing failure (e.g. additional test for +# feature X that is already not working), please add it beside the existing +# failures. Otherwise please reach out to network-service-dev@. + +# This filter contains Chrome OS only test failures. +# See https://crbug.com/881976 + +# Uncategorized timeouts or test failures. +-DownloadNotificationTest.CancelDownload +-DownloadNotificationTest.CloseNotificationAfterDownload +-DownloadNotificationTest.CloseNotificationWhileDownloading +-DownloadNotificationTest.DownloadCancelledByUserExternally +-DownloadNotificationTest.DownloadFile +-DownloadNotificationTest.DownloadMultipleFiles +-DownloadNotificationTest.DownloadMultipleFilesOneByOne +-DownloadNotificationTest.DownloadRemoved +-DownloadNotificationTest.IncognitoDownloadFile +-DownloadNotificationTest.InterruptDownload +-DownloadNotificationTest.InterruptDownloadAfterClosingNotification +-DownloadNotificationTest.SimultaneousIncognitoAndNormalDownloads +-MultiProfileDownloadNotificationTest.DownloadMultipleFiles +-OobeTest.NewUser + +# NOTE: if adding an exclusion for an existing failure (e.g. additional test for +# feature X that is already not working), please add it beside the existing +# failures. Otherwise please reach out to network-service-dev@.
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter index 7492b130..f97623ca 100644 --- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter +++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -103,6 +103,7 @@ # https://crbug.com/721403 -ContextMenuBrowserTest.DataSaverOpenOrigImageInNewTab +-DataReductionProxyBrowsertest.UMAMetricsRecorded -DataReductionProxyFallbackBrowsertest.FallbackProxyUsedOn500Status -DataReductionProxyFallbackBrowsertest.FallbackProxyUsedWhenBlockHeaderSent -DataReductionProxyFallbackBrowsertest.FallbackProxyUsedWhenBlockZeroHeaderSent @@ -110,7 +111,7 @@ -DataReductionProxyFallbackBrowsertest.NoProxyUsedWhenBlockOnceHeaderSent -DataReductionProxyWarmupURLBrowsertest.WarmupURLsFetchedForEachProxy/0 -DataReductionProxyWarmupURLBrowsertest.WarmupURLsFetchedForEachProxy/1 --DataReductionProxyWarmupURLBrowsertest.WarmupURLsFail/1 +-DataReductionProxyWarmupURLBrowsertest.WarmupURLsFetchedForEachProxy/3 # NOTE: if adding an exclusion for an existing failure (e.g. additional test for # feature X that is already not working), please add it beside the existing
diff --git a/testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter b/testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter index 8776955..64e0418c 100644 --- a/testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter +++ b/testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter
@@ -107,7 +107,13 @@ -org.chromium.android_webview.test.AwSettingsTest.testUniversalAccessFromFilesWithTwoViews # https://crbug.com/893572 +-org.chromium.android_webview.test.ClientOnPageStartedTest.testBrowserInitiatedHangingNavigation +-org.chromium.android_webview.test.ClientOnPageStartedTest.testBrowserInitiatedRedirectHangingNavigation +-org.chromium.android_webview.test.ClientOnPageStartedTest.testNotCalledForDownloadContentDisposition +-org.chromium.android_webview.test.ClientOnPageStartedTest.testNotCalledForDownloadPdf -org.chromium.android_webview.test.ClientOnPageStartedTest.testOnPageStartedCalledOnceOnError +-org.chromium.android_webview.test.ClientOnPageStartedTest.testRendererInitiatedHangingNavigation +-org.chromium.android_webview.test.ClientOnPageStartedTest.testRendererInitiatedRedirectHangingNavigation # https://crbug.com/893573 -org.chromium.android_webview.test.ClientOnReceivedError2Test.testIframeSubresource
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 0b20114..ec5c5b8 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -586,6 +586,10 @@ "label": "//extensions:extensions_unittests", "type": "windowed_test_launcher", }, + "fidlgen_js_unittests": { + "label": "//tools/fuchsia/fidlgen_js:fidlgen_js_unittests", + "type": "console_test_launcher", + }, "filesystem_service_unittests": { "label": "//components/services/filesystem:filesystem_service_unittests", "type": "console_test_launcher", @@ -662,6 +666,10 @@ "label": "//headless:headless_unittests", "type": "console_test_launcher", }, + "http_service_tests": { + "label": "//webrunner/net_http:http_service_tests", + "type": "console_test_launcher", + }, "installer_util_unittests": { "label": "//chrome/installer/util:installer_util_unittests", "type": "console_test_launcher",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index ec423e84..c4dacd6 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -494,6 +494,13 @@ 'linux-win_cross-rel', # https://crbug.com/762167 ], }, + 'extensions_browsertests': { + 'modifications': { + 'Win10 Tests x64 (dbg)': { + 'experiment_percentage': 100, # https://crbug.com/876615 + }, + }, + }, 'gin_unittests': { 'remove_from': [ # chromium.clang @@ -654,6 +661,12 @@ 'Linux ASan LSan Tests (1)', # https://crbug.com/843732 ], }, + 'http_service_tests': { + 'remove_from': [ + # chromium.linux + 'Fuchsia x64', # https://crbug.com/896884 + ], + }, 'info_collection_tests': { 'remove_from': [ # chromium.gpu.fyi
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index ce0ba795..13da9da 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -979,6 +979,8 @@ 'cronet_tests': {}, 'cronet_unittests': {}, 'crypto_unittests': {}, + 'fidlgen_js_unittests': {}, + 'http_service_tests': {}, 'ipc_tests': { 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter', @@ -1757,6 +1759,16 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.exo_unittests.filter', ], }, + 'single_process_mash_interactive_ui_tests': { + 'test': 'interactive_ui_tests', + 'args': [ + '--enable-features=SingleProcessMash', + '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter', + ], + 'swarming': { + 'shards': 3, + }, + }, 'ui_chromeos_unittests': {}, 'views_mus_unittests': {}, 'views_mus_interactive_ui_tests': {}, @@ -1829,13 +1841,6 @@ '--enable-features=Mash', ], }, - 'single_process_mash_interactive_ui_tests': { - 'test': 'interactive_ui_tests', - 'args': [ - '--enable-features=SingleProcessMash', - '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter', - ], - }, }, 'memory_infra_isolated_scripts': { @@ -1978,6 +1983,16 @@ ], 'test': 'extensions_browsertests', }, + 'network_service_interactive_ui_tests': { + 'args': [ + '--enable-features=NetworkService', + '--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.chromeos.network_interactive_ui_tests.filter', + ], + 'swarming': { + 'shards': 3, + }, + 'test': 'interactive_ui_tests', + }, }, 'network_service_gtests': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index fd89ab0..d519920 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1328,6 +1328,25 @@ ] } ], + "DataReductionProxyBrotliHoldback": [ + { + "platforms": [ + "android", + "windows", + "mac", + "chromeos", + "linux" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "DataReductionProxyBrotliHoldback" + ] + } + ] + } + ], "DataReductionProxyFREPromo": [ { "platforms": [
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index 1088e93b..3ef19d0 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -310,7 +310,6 @@ crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ] crbug.com/591099 fast/table/background-gradient-border-collapsed.html [ Failure Pass ] crbug.com/591099 fast/table/border-collapsing/004-vertical.html [ Failure ] -crbug.com/591099 fast/table/border-collapsing/composited-cell-collapsed-border.html [ Failure ] crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ] crbug.com/591099 fast/table/unbreakable-images-quirk.html [ Failure ] crbug.com/591099 fast/text/descent-clip-in-scaled-page.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService index 60f6ebf..5739fa19 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -17,8 +17,6 @@ # Flaky on non-NetworkService (disabled), consistent failing on NetworkService. Probably due to DCHECK. crbug.com/849670 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Pass Failure ] -crbug.com/850689 http/tests/inspector-protocol/network/interception-cookie.js [ Failure ] -crbug.com/850689 http/tests/inspector-protocol/network/interception-set-cookie.js [ Failure ] # This passes in content_shell but not in chrome with network service disabled, # because content_shell does not add the about: handler. With network service
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 07b9d94..38cae4d6 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2829,10 +2829,11 @@ crbug.com/875249 external/wpt/infrastructure/testdriver/bless.html [ Timeout Pass ] -# text-indent percentage should be resolved against the block's own content-box inline-size -crbug.com/884588 external/wpt/css/css-text/text-indent/text-indent-percentage-002.html [ Failure ] -crbug.com/884588 external/wpt/css/css-text/text-indent/text-indent-percentage-003.html [ Failure ] -crbug.com/884588 external/wpt/css/css-text/text-indent/text-indent-percentage-004.html [ Failure ] +# Tests need to be updated to reflect newly-specified behavior: +# https://github.com/web-platform-tests/wpt/issues/13581 +crbug.com/884588 external/wpt/css/css-text/text-indent/text-indent-percentage-001.xht [ Failure ] +crbug.com/884588 external/wpt/css/CSS2/text/text-indent-percent-001.xht [ Failure ] + # Some control characters still not visible crbug.com/893490 [ Mac ] external/wpt/css/css-text/white-space/control-chars-001.html [ Failure ] @@ -5333,3 +5334,6 @@ # ecosystem-infra sheriff 2018-10-16 crbug.com/895777 external/wpt/infrastructure/assumptions/blank.html [ Failure Crash ] + +#Sheriff 2018-10-18 +crbug.com/896765 [ Linux Mac ] http/tests/performance-timing/element-timing/observe-child-element.html [ Failure Pass ] \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/css2.1/t1601-c547-indent-01-d.html b/third_party/WebKit/LayoutTests/css2.1/t1601-c547-indent-01-d.html index dbccd1f..541f03ab 100644 --- a/third_party/WebKit/LayoutTests/css2.1/t1601-c547-indent-01-d.html +++ b/third_party/WebKit/LayoutTests/css2.1/t1601-c547-indent-01-d.html
@@ -5,7 +5,7 @@ <style type="text/css"> .one {text-indent: 5em; background: aqua;} .eight {text-indent: 50%; background: aqua;} - div {text-indent: 50%; background: aqua;width: 25%;} + div {text-indent: 200%; background: aqua;width: 25%;} </style> <link rel="help" href="http://www.w3.org/TR/CSS21/text.html#indentation-prop" title="16.1 Indentation: the 'text-indent' property"> </head> @@ -25,4 +25,4 @@ X The X on the previous line should be centered across the window. </div> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/reference/text-indent-percentage-002-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/reference/text-indent-percentage-002-ref.html index 5b3bc91..eebe7dac 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/reference/text-indent-percentage-002-ref.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/reference/text-indent-percentage-002-ref.html
@@ -4,7 +4,10 @@ <title>CSS Text Test reference</title> <link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/"> <style> -div { padding-left: 50px; } +div { + padding-left: 50px; + font-family: Ahem; +} </style> <p>Test passes if there is a single black X below and no red.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-002.html index 6596926..1c0a33b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-002.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-002.html
@@ -13,6 +13,7 @@ border-right: 10px solid white; margin-right: 10px; padding-right: 10px; + font-family: Ahem; } div { box-sizing: border-box;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-003.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-003.html index f81390da8..9f41e5b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-003.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-003.html
@@ -13,6 +13,7 @@ border-right: 10px solid white; margin-right: 10px; padding-right: 10px; + font-family: Ahem; } div { box-sizing: border-box;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-004.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-004.html index 73f4c21..4d1dff1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-004.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-text/text-indent/text-indent-percentage-004.html
@@ -13,6 +13,7 @@ border-right: 10px solid white; margin-right: 10px; padding-right: 10px; + font-family: Ahem; } div { box-sizing: border-box;
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-redirect-303-clears-post-data-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-redirect-303-clears-post-data-expected.txt new file mode 100644 index 0000000..febc83c --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-redirect-303-clears-post-data-expected.txt
@@ -0,0 +1,10 @@ +Test to ensure devtools clears post data after getting HTTP 303 through interception response. + +Got request: POST http://127.0.0.1:8000/my-path +Post Data: foo=bar +Origin: http://127.0.0.1:8000 +Content-Type: application/x-www-form-urlencoded +Got request: GET http://127.0.0.1:8000/devtools/resources/empty.html +Origin: undefined +Content-Type: undefined +
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-redirect-303-clears-post-data.js b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-redirect-303-clears-post-data.js new file mode 100644 index 0000000..a0d6b8f --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-redirect-303-clears-post-data.js
@@ -0,0 +1,35 @@ +// 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) { + var {page, session, dp} = await testRunner.startBlank(`Test to ensure devtools clears post data after getting HTTP 303 through interception response.\n`); + + dp.Network.enable(); + dp.Page.enable(); + + dp.Network.setRequestInterception({patterns: [{}]}); + + dp.Runtime.evaluate({expression: ` + document.body.innerHTML = '<form id="form" method="post" action="/my-path"><input type="text" name="foo" value="bar" /></form>'; + var form = document.getElementById('form'); + form.submit(); + `}); + + dp.Network.onRequestIntercepted(event => { + const request = event.params.request; + testRunner.log(`Got request: ${request.method} ${request.url}`); + if (request.postData) + testRunner.log("Post Data: " + request.postData); + for (const header of ["Origin", "Content-Type"]) { + testRunner.log(`${header}: ${request.headers[header]}`); + } + }); + let params = (await dp.Network.onceRequestIntercepted()).params; + const response = "HTTP/1.1 303 See other\r\n" + + "Location: http://127.0.0.1:8000/devtools/resources/empty.html\r\n\r\n"; + dp.Network.continueInterceptedRequest({interceptionId: params.interceptionId, rawResponse: btoa(response)}); + params = (await dp.Network.onceRequestIntercepted()).params; + dp.Network.continueInterceptedRequest({interceptionId: params.interceptionId}); + dp.Page.onLoadEventFired(() => testRunner.completeTest()); +}); \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-patterns.js b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-patterns.js index 7b8b587..264d581 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-patterns.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-patterns.js
@@ -20,16 +20,17 @@ var interceptionWaitingResolver = requestInterceptionWaitingMap.get(fileName); if (interceptionWaitingResolver) interceptionWaitingResolver(); + else + requestInterceptionWaitingMap.set(fileName, null); }); session.protocol.Network.onRequestIntercepted(async event => { var fileName = nameForUrl(event.params.request.url); // Because requestWillBeSent and interception requests come from different processes, they may come in random order, // This will syncronize them to ensure requestWillBeSent is processed first and will stall here till it does. - if (!inflightRequests.get(fileName)) { + if (!requestInterceptionWaitingMap.has(fileName)) await new Promise(resolve => requestInterceptionWaitingMap.set(fileName, resolve)); - requestInterceptionWaitingMap.delete(fileName); - } + requestInterceptionWaitingMap.delete(fileName); testRunner.log('Request Intercepted: ' + fileName); var rawContent = dataForNames[fileName]; @@ -71,6 +72,7 @@ * @return {!Promise} */ async function testUrls() { + requestInterceptionWaitingMap.clear(); session.evaluate(`fetch('../network/resources/small-test-1.txt')`); await new Promise(resolve => responseWasReceivedCallback = resolve); session.evaluate(`fetch('../network/resources/small-test-2.txt')`);
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/url-fragment-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/url-fragment-expected.txt index 3763b9e..b0d715b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/url-fragment-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/url-fragment-expected.txt
@@ -1,8 +1,10 @@ Tests the we properly report url fragment in network requests -Intercepted URL: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: undefined +Request will be sent: http://127.0.0.1:8000/devtools/network/resources/empty.html fragment: #ref +Intercepted URL: http://127.0.0.1:8000/devtools/network/resources/empty.html fragment: #ref Request will be sent: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: undefined -Intercepted URL: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: #ref +Intercepted URL: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: undefined Request will be sent: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: #ref -Intercepted URL: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: # +Intercepted URL: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: #ref Request will be sent: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: # +Intercepted URL: http://127.0.0.1:8000/devtools/network/resources/resource.php fragment: #
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/url-fragment.js b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/url-fragment.js index 84ba457..95cbf626 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/url-fragment.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/url-fragment.js
@@ -5,22 +5,28 @@ dp.Network.enable(); dp.Page.enable(); - dp.Network.onRequestIntercepted(event => { - const request = event.params.request; - testRunner.log(`Intercepted URL: ${request.url} fragment: ${request.urlFragment}`); - dp.Network.continueInterceptedRequest({interceptionId: event.params.interceptionId}); - }); - dp.Network.onRequestWillBeSent(event => { - const request = event.params.request; - testRunner.log(`Request will be sent: ${request.url} fragment: ${request.urlFragment}`); - }); - dp.Network.setRequestInterception({patterns: [{}]}); - const pageURL = '/inspector-protocol/network/resources/simple.html'; - await dp.Page.navigate({url: pageURL}); - await dp.Page.navigate({url: pageURL + '#ref'}); + async function dumpEventsAndContinue() { + const requestInterceptedPromise = dp.Network.onceRequestIntercepted(); + const requestWillBeSentPromise = dp.Network.onceRequestWillBeSent(); + const interceptedRequestParams = (await requestInterceptedPromise).params; + const interceptedRequest = interceptedRequestParams.request; + const sentRequest = (await requestWillBeSentPromise).params.request; + + testRunner.log(`Request will be sent: ${sentRequest.url} fragment: ${sentRequest.urlFragment}`); + testRunner.log(`Intercepted URL: ${interceptedRequest.url} fragment: ${interceptedRequest.urlFragment}`); + dp.Network.continueInterceptedRequest({interceptionId: interceptedRequestParams.interceptionId}); + } + + await dp.Network.setRequestInterception({patterns: [{}]}); + const navigatePromise = dp.Page.navigate({url: 'http://127.0.0.1:8000/devtools/network/resources/empty.html#ref'}); + await dumpEventsAndContinue(); + await navigatePromise; const resourceURL = '/devtools/network/resources/resource.php'; - await session.evaluateAsync(`fetch("${resourceURL}")`); - await session.evaluateAsync(`fetch("${resourceURL}#ref")`); - await session.evaluateAsync(`fetch("${resourceURL}#")`); + session.evaluateAsync(`fetch("${resourceURL}")`); + await dumpEventsAndContinue(); + session.evaluateAsync(`fetch("${resourceURL}#ref")`); + dumpEventsAndContinue(); + session.evaluateAsync(`fetch("${resourceURL}#")`); + await dumpEventsAndContinue(); testRunner.completeTest(); })
diff --git a/third_party/WebKit/LayoutTests/media/controls/resizing-changes-css-class.html b/third_party/WebKit/LayoutTests/media/controls/resizing-changes-css-class.html index 0934356f..741625d 100644 --- a/third_party/WebKit/LayoutTests/media/controls/resizing-changes-css-class.html +++ b/third_party/WebKit/LayoutTests/media/controls/resizing-changes-css-class.html
@@ -10,9 +10,9 @@ const video = document.querySelector('video'); const testCases = [ { width: 500, expect: expectSmall }, - { width: 1441, expect: expectLarge }, + { width: 1441, expect: expectMedium }, { width: 800, expect: expectMedium }, - { width: 2000, expect: expectLarge }, + { width: 2000, expect: expectMedium }, { width: 0, expect: expectSmall }, { width: 741, expect: expectMedium }, { width: 308, expect: expectSmall }, @@ -39,18 +39,14 @@ function expectSmall() { checkControlsHasClass(video, 'sizing-small'); - checkControlsDoesNotHaveClasses(video, ['sizing-medium', 'sizing-large']); + checkControlsDoesNotHaveClass(video, 'sizing-medium'); } function expectMedium() { checkControlsHasClass(video, 'sizing-medium'); - checkControlsDoesNotHaveClasses(video, ['sizing-small', 'sizing-large']); + checkControlsDoesNotHaveClass(video, 'sizing-small'); } - function expectLarge() { - checkControlsHasClass(video, 'sizing-large'); - checkControlsDoesNotHaveClasses(video, ['sizing-small', 'sizing-medium']); - } }); </script> </html>
diff --git a/third_party/blink/renderer/core/frame/ad_tracker.cc b/third_party/blink/renderer/core/frame/ad_tracker.cc index 3bc797d..41c3968 100644 --- a/third_party/blink/renderer/core/frame/ad_tracker.cc +++ b/third_party/blink/renderer/core/frame/ad_tracker.cc
@@ -67,9 +67,15 @@ ? false : IsKnownAdScript(execution_context, script_url); stack_frame_is_ad_.push_back(is_ad); + if (is_ad) + num_ads_in_stack_ += 1; } void AdTracker::DidExecuteScript() { + if (stack_frame_is_ad_.back()) { + DCHECK_LT(0u, num_ads_in_stack_); + num_ads_in_stack_ -= 1; + } stack_frame_is_ad_.pop_back(); } @@ -127,6 +133,9 @@ } bool AdTracker::IsAdScriptInStack() { + if (num_ads_in_stack_ > 0) + return true; + ExecutionContext* execution_context = GetCurrentExecutionContext(); if (!execution_context) return false; @@ -144,11 +153,6 @@ if (!top_script.IsEmpty() && IsKnownAdScript(execution_context, top_script)) return true; - // Scan the pseudo-stack for ad scripts. - for (bool is_ad : stack_frame_is_ad_) { - if (is_ad) - return true; - } return false; }
diff --git a/third_party/blink/renderer/core/frame/ad_tracker.h b/third_party/blink/renderer/core/frame/ad_tracker.h index a64bc5c..544605c 100644 --- a/third_party/blink/renderer/core/frame/ad_tracker.h +++ b/third_party/blink/renderer/core/frame/ad_tracker.h
@@ -85,6 +85,8 @@ // an ad script. Each time the script or function finishes, it pops the stack. Vector<bool> stack_frame_is_ad_; + uint32_t num_ads_in_stack_ = 0; + // The set of ad scripts detected outside of ad-frame contexts. HeapHashMap<WeakMember<ExecutionContext>, HashSet<String>> known_ad_scripts_;
diff --git a/third_party/blink/renderer/core/frame/ad_tracker_test.cc b/third_party/blink/renderer/core/frame/ad_tracker_test.cc index c9572f0c..b914ede 100644 --- a/third_party/blink/renderer/core/frame/ad_tracker_test.cc +++ b/third_party/blink/renderer/core/frame/ad_tracker_test.cc
@@ -94,6 +94,8 @@ String(script_url)); } + void DidExecuteScript() { ad_tracker_->DidExecuteScript(); } + bool AnyExecutingScriptsTaggedAsAdResource() { return ad_tracker_->IsAdScriptInStack(); } @@ -161,6 +163,39 @@ EXPECT_TRUE(AnyExecutingScriptsTaggedAsAdResource()); } +TEST_F(AdTrackerTest, AdStackFrameCounting) { + AppendToKnownAdScripts("https://example.com/ad.js"); + + WillExecuteScript("https://example.com/vanilla.js"); + WillExecuteScript("https://example.com/vanilla.js"); + EXPECT_FALSE(AnyExecutingScriptsTaggedAsAdResource()); + + WillExecuteScript("https://example.com/ad.js"); + EXPECT_TRUE(AnyExecutingScriptsTaggedAsAdResource()); + + DidExecuteScript(); + EXPECT_FALSE(AnyExecutingScriptsTaggedAsAdResource()); + + WillExecuteScript("https://example.com/ad.js"); + WillExecuteScript("https://example.com/ad.js"); + WillExecuteScript("https://example.com/vanilla.js"); + EXPECT_TRUE(AnyExecutingScriptsTaggedAsAdResource()); + + DidExecuteScript(); + DidExecuteScript(); + EXPECT_TRUE(AnyExecutingScriptsTaggedAsAdResource()); + + DidExecuteScript(); + EXPECT_FALSE(AnyExecutingScriptsTaggedAsAdResource()); + + DidExecuteScript(); + DidExecuteScript(); + EXPECT_FALSE(AnyExecutingScriptsTaggedAsAdResource()); + + WillExecuteScript("https://example.com/ad.js"); + EXPECT_TRUE(AnyExecutingScriptsTaggedAsAdResource()); +} + class AdTrackerSimTest : public SimTest { protected: void SetUp() override {
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc index e2aa140..1b35cbd3 100644 --- a/third_party/blink/renderer/core/layout/layout_block.cc +++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -1140,7 +1140,7 @@ LayoutUnit LayoutBlock::TextIndentOffset() const { LayoutUnit cw; if (StyleRef().TextIndent().IsPercentOrCalc()) - cw = ContainingBlock()->AvailableLogicalWidth(); + cw = ContentLogicalWidth(); return MinimumValueForLength(StyleRef().TextIndent(), cw); }
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index 45257ad..07c8e3d7 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -751,10 +751,7 @@ ShouldAffinityBeDownstream should_affinity_be_downstream) { DCHECK(box); DCHECK_GE(offset, 0); - - // TODO(layout-dev): Stop passing out-of-range |offset|. - if (static_cast<unsigned>(offset) > box->Len()) - offset = box->Len(); + DCHECK_LE(static_cast<unsigned>(offset), box->Len()); if (offset && static_cast<unsigned>(offset) < box->Len()) { return CreatePositionWithAffinityForBox(box, box->Start() + offset, @@ -822,8 +819,7 @@ return CreatePositionWithAffinityForBoxAfterAdjustingOffsetForBiDi( last_box, last_box->OffsetForPosition(point_line_direction, IncludePartialGlyphs, - BreakGlyphs) + - last_box->Start(), + BreakGlyphs), should_affinity_be_downstream); } return CreatePositionWithAffinity(0);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc index b14c65d..fb051162 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc
@@ -32,16 +32,6 @@ size_.inline_size = LayoutUnit(); } -LayoutUnit NGLineBoxFragmentBuilder::LineHeight() const { - return metrics_.LineHeight().ClampNegativeToZero(); -} - -const NGPhysicalFragment* NGLineBoxFragmentBuilder::Child::PhysicalFragment() - const { - return layout_result ? layout_result->PhysicalFragment().get() - : fragment.get(); -} - NGLineBoxFragmentBuilder::Child* NGLineBoxFragmentBuilder::ChildList::FirstInFlowChild() { for (auto& child : *this) { @@ -61,16 +51,6 @@ return nullptr; } -void NGLineBoxFragmentBuilder::ChildList::InsertChild( - unsigned index, - scoped_refptr<NGLayoutResult> layout_result, - const NGLogicalOffset& offset, - LayoutUnit inline_size, - UBiDiLevel bidi_level) { - children_.insert( - index, Child{std::move(layout_result), offset, inline_size, bidi_level}); -} - void NGLineBoxFragmentBuilder::ChildList::MoveInInlineDirection( LayoutUnit delta, unsigned start, @@ -92,24 +72,6 @@ children_[index].offset.block_offset += delta; } -void NGLineBoxFragmentBuilder::SetMetrics(const NGLineHeightMetrics& metrics) { - metrics_ = metrics; -} - -void NGLineBoxFragmentBuilder::SetBaseDirection(TextDirection direction) { - base_direction_ = direction; -} - -void NGLineBoxFragmentBuilder::SwapPositionedFloats( - Vector<NGPositionedFloat>* positioned_floats) { - positioned_floats_.swap(*positioned_floats); -} - -void NGLineBoxFragmentBuilder::SetBreakToken( - scoped_refptr<NGInlineBreakToken> break_token) { - break_token_ = std::move(break_token); -} - void NGLineBoxFragmentBuilder::AddChildren(ChildList& children) { offsets_.ReserveCapacity(children.size()); children_.ReserveCapacity(children.size()); @@ -130,21 +92,22 @@ WritingMode line_writing_mode(ToLineWritingMode(GetWritingMode())); NGPhysicalSize physical_size = Size().ConvertToPhysical(line_writing_mode); + Vector<NGLink> children; + if (!children_.IsEmpty()) + children.ReserveInitialCapacity(children_.size()); + DCHECK_EQ(children_.size(), offsets_.size()); for (wtf_size_t i = 0; i < children_.size(); i++) { auto& child = children_[i]; - child.offset_ = offsets_[i].ConvertToPhysical( - line_writing_mode, Direction(), physical_size, child->Size()); + children.emplace_back( + std::move(children_[i]), + offsets_[i].ConvertToPhysical(line_writing_mode, Direction(), + physical_size, child->Size())); } - // Because this vector will be long-lived, make sure to not waaste space. - // (We reserve an initial capacity when adding the first child) - if (children_.size()) - children_.ShrinkToReasonableCapacity(); - scoped_refptr<const NGPhysicalLineBoxFragment> fragment = base::AdoptRef(new NGPhysicalLineBoxFragment( - Style(), style_variant_, physical_size, children_, metrics_, + Style(), style_variant_, physical_size, children, metrics_, base_direction_, break_token_ ? std::move(break_token_) : NGInlineBreakToken::Create(node_)));
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h index 4ff2065..a4cdcc9 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
@@ -6,10 +6,12 @@ #define NGLineBoxFragmentBuilder_h #include "third_party/blink/renderer/core/layout/ng/geometry/ng_logical_offset.h" +#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_break_token.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h" #include "third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h" #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h" +#include "third_party/blink/renderer/core/layout/ng/ng_positioned_float.h" #include "third_party/blink/renderer/platform/wtf/allocator.h" namespace blink { @@ -32,18 +34,26 @@ void Reset(); - LayoutUnit LineHeight() const; + LayoutUnit LineHeight() const { + return metrics_.LineHeight().ClampNegativeToZero(); + } const NGLineHeightMetrics& Metrics() const { return metrics_; } - void SetMetrics(const NGLineHeightMetrics&); + void SetMetrics(const NGLineHeightMetrics& metrics) { metrics_ = metrics; } - void SetBaseDirection(TextDirection); + void SetBaseDirection(TextDirection direction) { + base_direction_ = direction; + } - void SwapPositionedFloats(Vector<NGPositionedFloat>*); + void SwapPositionedFloats(Vector<NGPositionedFloat>* positioned_floats) { + positioned_floats_.swap(*positioned_floats); + } // Set the break token for the fragment to build. // A finished break token will be attached if not set. - void SetBreakToken(scoped_refptr<NGInlineBreakToken>); + void SetBreakToken(scoped_refptr<NGInlineBreakToken> break_token) { + break_token_ = std::move(break_token); + } // A data struct to keep NGLayoutResult or fragment until the box tree // structures and child offsets are finalized. @@ -108,7 +118,10 @@ } bool HasBidiLevel() const { return bidi_level != 0xff; } bool IsPlaceholder() const { return !HasFragment() && !HasBidiLevel(); } - const NGPhysicalFragment* PhysicalFragment() const; + const NGPhysicalFragment* PhysicalFragment() const { + return layout_result ? layout_result->PhysicalFragment().get() + : fragment.get(); + } }; // A vector of Child. @@ -154,11 +167,14 @@ void AddChild(Args&&... args) { children_.emplace_back(std::forward<Args>(args)...); } - void InsertChild(unsigned, - scoped_refptr<NGLayoutResult>, - const NGLogicalOffset&, + void InsertChild(unsigned index, + scoped_refptr<NGLayoutResult> layout_result, + const NGLogicalOffset& offset, LayoutUnit inline_size, - UBiDiLevel); + UBiDiLevel bidi_level) { + children_.insert(index, Child{std::move(layout_result), offset, + inline_size, bidi_level}); + } void MoveInInlineDirection(LayoutUnit, unsigned start, unsigned end); void MoveInBlockDirection(LayoutUnit); @@ -189,4 +205,7 @@ } // namespace blink +WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS( + blink::NGLineBoxFragmentBuilder::Child); + #endif // NGLineBoxFragmentBuilder
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc index d051cf7..9e99b2a1 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
@@ -77,11 +77,7 @@ has_last_resort_break_ = true; } } - // Assume that if we have one child, we may have more than one and try to - // limit the number of allocations we would do in that case. - if (!children_.capacity()) - children_.ReserveCapacity(16); - children_.emplace_back(std::move(child), NGPhysicalOffset()); + children_.emplace_back(std::move(child)); offsets_.push_back(child_offset); return *this; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h index 163f62d..f260452a 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h +++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
@@ -31,6 +31,7 @@ STACK_ALLOCATED(); public: + typedef Vector<scoped_refptr<const NGPhysicalFragment>, 16> ChildrenVector; typedef Vector<NGLogicalOffset, 16> OffsetVector; ~NGContainerFragmentBuilder() override; @@ -96,7 +97,7 @@ scoped_refptr<const NGPhysicalFragment>, const NGLogicalOffset&); - const Vector<NGLink>& Children() const { return children_; } + const ChildrenVector& Children() const { return children_; } // Builder has non-trivial out-of-flow descendant methods. // These methods are building blocks for implementation of @@ -224,15 +225,7 @@ NGUnpositionedListMarker unpositioned_list_marker_; - // Store NGLinks rather than NGPhysicalOffsets even though we don't have the - // offsets yet to allow us to move the entire vector to the fragment at - // construction time. - // Unlike OffsetVector, we don't want to keep the inline capacity around - // because this vector will be long-lived, and it would be wasteful to reserve - // space for 16 children in every fragment. Instead, we reserve some initial - // capacity for it when adding the first child and shrink it down when - // creating the fragment. - Vector<NGLink> children_; + ChildrenVector children_; // Logical offsets for the children. Stored as logical offsets as we can't // convert to physical offsets until layout of all children has been
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc index a8955a5..ff1f5a5 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc
@@ -237,11 +237,16 @@ NGPhysicalSize physical_size = Size().ConvertToPhysical(GetWritingMode()); + Vector<NGLink> children; + children.ReserveInitialCapacity(children_.size()); + DCHECK_EQ(children_.size(), offsets_.size()); for (wtf_size_t i = 0; i < children_.size(); i++) { auto& child = children_[i]; - child.offset_ = offsets_[i].ConvertToPhysical( - block_or_line_writing_mode, Direction(), physical_size, child->Size()); + children.emplace_back( + std::move(children_[i]), + offsets_[i].ConvertToPhysical(block_or_line_writing_mode, Direction(), + physical_size, child->Size())); } scoped_refptr<NGBreakToken> break_token; @@ -263,13 +268,9 @@ } } - // Because this vector will be long-lived, make sure to not waste space. - // (We reserve an initial capacity when adding the first child) - if (children_.size()) - children_.ShrinkToReasonableCapacity(); scoped_refptr<const NGPhysicalBoxFragment> fragment = base::AdoptRef(new NGPhysicalBoxFragment( - layout_object_, Style(), style_variant_, physical_size, children_, + layout_object_, Style(), style_variant_, physical_size, children, borders_.ConvertToPhysical(GetWritingMode(), Direction()), padding_.ConvertToPhysical(GetWritingMode(), Direction()), baselines_, BoxType(), is_fieldset_container_, is_rendered_legend,
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc index ec8eb43..084bd1b 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -544,7 +544,15 @@ PaintNormalBoxShadow(paint_info, paint_rect, style, border_edges_.line_left, border_edges_.line_right); - if (BleedAvoidanceIsClipping(box_decoration_data.bleed_avoidance)) { + if (box_fragment_.HasSelfPaintingLayer() && layout_box.IsTableCell() && + ToLayoutTableCell(layout_box).Table()->ShouldCollapseBorders()) { + // We have to clip here because the background would paint on top of the + // collapsed table borders otherwise, since this is a self-painting layer. + LayoutRect clip_rect = paint_rect; + clip_rect.Expand(ToLayoutTableCell(layout_box).BorderInsets()); + state_saver.Save(); + paint_info.context.Clip(PixelSnappedIntRect(clip_rect)); + } else if (BleedAvoidanceIsClipping(box_decoration_data.bleed_avoidance)) { state_saver.Save(); FloatRoundedRect border = style.GetRoundedBorderFor( paint_rect, border_edges_.line_left, border_edges_.line_right);
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc index 01077e6..d268ad6 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
@@ -581,15 +581,17 @@ if (parent.IsInline() && !parent.IsAtomicInlineLevel()) return MarkLineBoxesDirtyFor(parent); - if (!parent.IsLayoutNGMixin()) - return; - const LayoutBlockFlow& block = ToLayoutBlockFlow(parent); - if (!block.PaintFragment()) { - // We have not yet layout. - return; + // The |layout_object| is inserted into an empty block. + // Mark the first line box dirty. + if (parent.IsLayoutNGMixin()) { + const LayoutBlockFlow& block = ToLayoutBlockFlow(parent); + if (NGPaintFragment* paint_fragment = block.PaintFragment()) { + if (NGPaintFragment* first_line = paint_fragment->FirstLineBox()) { + first_line->is_dirty_inline_ = true; + return; + } + } } - // We inserted |layout_object| into empty block. - block.PaintFragment()->FirstLineBox()->is_dirty_inline_ = true; } void NGPaintFragment::MarkLineBoxDirty() {
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc index 43a10f5..ab2167a 100644 --- a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc +++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
@@ -1385,10 +1385,8 @@ sizing_class == MediaControlsSizingClass::kSmall); SetClass(kMediaControlsSizingMediumCSSClass, ShouldShowVideoControls() && - sizing_class == MediaControlsSizingClass::kMedium); - SetClass(kMediaControlsSizingLargeCSSClass, - ShouldShowVideoControls() && - sizing_class == MediaControlsSizingClass::kLarge); + (sizing_class == MediaControlsSizingClass::kMedium || + sizing_class == MediaControlsSizingClass::kLarge)); } void MediaControlsImpl::MaybeToggleControlsFromTap() {
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css b/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css index 9d6ecde..4338454d 100644 --- a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css +++ b/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
@@ -100,10 +100,6 @@ background-size: auto 200px; } -video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-panel" i] { - background-size: auto 312px; -} - /* Need dark gradient at the top of the video when the scrubbing message is * shown */ video::-webkit-media-controls:not(.audio-only) div[pseudo="-webkit-media-controls-panel" i].scrubbing-message { @@ -122,10 +118,6 @@ background-size: auto 120px, auto 200px; } -video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-panel" i].scrubbing-message { - background-size: auto 120px, auto 312px; -} - audio::-internal-media-controls-button-panel, video::-internal-media-controls-button-panel { -webkit-appearance: -internal-media-control; @@ -229,18 +221,6 @@ background-size: 32px; } -/* TODO(https://crbug.com/857120): remove these rules and the sizing-large CSS class. */ -video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-play-button" i], -video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-mute-button" i], -video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-fullscreen-button" i], -video::-webkit-media-controls.sizing-large input[pseudo="-internal-media-controls-display-cutout-fullscreen-button" i], -video::-webkit-media-controls.sizing-large input[pseudo="-internal-media-controls-overflow-button" i] { - width: 64px; - height: 64px; - min-width: 64px; - background-size: 32px; -} - video::-webkit-media-controls.sizing-small div[pseudo="-internal-media-controls-button-panel" i] { height: 48px; line-height: 48px; @@ -253,13 +233,6 @@ padding: 0 16px 0 32px; } -/* TODO(https://crbug.com/857120): remove these rules and the sizing-large CSS class. */ -video::-webkit-media-controls.sizing-large div[pseudo="-internal-media-controls-button-panel" i] { - height: 64px; - line-height: 64px; - padding: 0 16px 0 32px; -} - audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-button { background-image: -webkit-image-set(url(ic_play_arrow.svg) 1x); @@ -465,11 +438,6 @@ padding: 0 32px 20px 32px; } -/* TODO(https://crbug.com/857120): remove these rules and the sizing-large CSS class. */ -video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-timeline" i] { - padding: 0 32px 20px 32px; -} - input[pseudo="-webkit-media-controls-timeline" i], input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before, input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after, @@ -618,8 +586,7 @@ transition: width 0.3s ease, opacity 0.28s step-end; } -video::-webkit-media-controls.sizing-medium input[pseudo="-webkit-media-controls-volume-slider" i], -video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-volume-slider" i] { +video::-webkit-media-controls.sizing-medium input[pseudo="-webkit-media-controls-volume-slider" i] { padding: 30px 0; /* (64px button panel height - 4px slider height) / 2 */ } @@ -692,35 +659,14 @@ padding-right: 16px; } -/* TODO(https://crbug.com/857120): All these are the same, so these are unnecessary. */ -video::-webkit-media-controls.sizing-small div[pseudo="-internal-media-controls-overflow-menu-list" i] { - min-width: 180px; - max-width: 180px; - max-height: 250px; -} - +video::-webkit-media-controls.sizing-small div[pseudo="-internal-media-controls-overflow-menu-list" i], video::-webkit-media-controls.sizing-medium div[pseudo="-internal-media-controls-overflow-menu-list" i] { min-width: 180px; max-width: 180px; max-height: 250px; } -video::-webkit-media-controls.sizing-large div[pseudo="-internal-media-controls-overflow-menu-list" i] { - min-width: 180px; - max-width: 180px; - max-height: 250px; -} - -/* TODO(https://crbug.com/857120): All these are the same, so these are unnecessary. */ -video::-webkit-media-controls.sizing-small label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input { - margin-left: 0; - margin-right: 16px; - width: 24px; - height: 24px; - min-width: 24px; - background-size: 24px; -} - +video::-webkit-media-controls.sizing-small label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input, video::-webkit-media-controls.sizing-medium label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input { margin-left: 0; margin-right: 16px; @@ -730,15 +676,6 @@ background-size: 24px; } -video::-webkit-media-controls.sizing-large label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input { - margin-left: 0; - margin-right: 16px; - width: 24px; - height: 24px; - min-width: 24px; - background-size: 24px; -} - label[pseudo="-internal-media-controls-overflow-menu-list-item"] input { margin-left: -9px; margin-right: 6px;
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_controller_test.cc b/third_party/blink/renderer/platform/graphics/paint/paint_controller_test.cc index be7dd565..5ad0cab6 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_controller_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/paint_controller_test.cc
@@ -896,7 +896,7 @@ FakeDisplayItemClient container("container"); // The first paint. - auto paint_container = [this, &context, &container, kFragmentCount]() { + auto paint_container = [this, &context, &container]() { SubsequenceRecorder r(context, container); for (size_t i = 0; i < kFragmentCount; ++i) { ScopedDisplayItemFragment scoped_fragment(context, i);
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids index 0d621a15..537db650 100644 --- a/tools/gritsettings/resource_ids +++ b/tools/gritsettings/resource_ids
@@ -122,16 +122,19 @@ "includes": [13280], }, "chrome/browser/resources/task_scheduler_internals/resources.grd": { - "includes": [13310], + "includes": [13300], }, "chrome/browser/resources/translate_internals_resources.grd": { - "includes": [13320], + "includes": [13310], }, "chrome/browser/resources/webapks_ui_resources.grd": { - "includes": [13340], + "includes": [13320], + }, + "chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd": { + "structures": [13330], }, "chrome/browser/vr/testapp/vr_testapp_resources.grd": { - "includes": [13350], + "includes": [13370], }, # END chrome/browser section.
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 5c53326..f291da0 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -7984,6 +7984,7 @@ <int value="35" label="Open in browser (CCT)"/> <int value="36" label="Open in Chrome (Fullscreen)"/> <int value="37" label="Share link"/> + <int value="38" label="Sneak peek (Ephemeral tab)"/> </enum> <enum name="ContextMenuSaveImage"> @@ -29086,6 +29087,7 @@ <int value="-1532014193" label="disable-encryption-migration"/> <int value="-1528455406" label="OmniboxPedalSuggestions:enabled"/> <int value="-1520855274" label="PWAFullCodeCache:disabled"/> + <int value="-1517518406" label="force-update-menu-type"/> <int value="-1515415104" label="top-document-isolation:disabled"/> <int value="-1514943439" label="ash-enable-swipe-to-close-in-overview-mode"/> <int value="-1514611301" label="enable-data-reduction-proxy-bypass-warnings"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 225ee13..8466109 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -15161,6 +15161,26 @@ </summary> </histogram> +<histogram name="ContentSuggestions.Feed.CommitMutationCount" + units="operations" expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary> + Tracks the number of operations in a Feed mutation when database receive the + commit request. + </summary> +</histogram> + +<histogram name="ContentSuggestions.Feed.Count" units="entries" + expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary> + Tracks the number of entries for the Feed storage after database perform get + all keys request. + </summary> +</histogram> + <histogram name="ContentSuggestions.Feed.Image.FetchResult" enum="FeedImageFetchResult" expires_after="2019-10-01"> <owner>wylieb@chromium.org</owner> @@ -15186,6 +15206,47 @@ </summary> </histogram> +<histogram name="ContentSuggestions.Feed.InitialSuccess" enum="BooleanSuccess" + expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary> + Tracks the Feed storage success rate during initial storage. + </summary> +</histogram> + +<histogram name="ContentSuggestions.Feed.LoadKeysSuccess" enum="BooleanSuccess" + expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary>Tracks the Feed storage success rate during load keys.</summary> +</histogram> + +<histogram name="ContentSuggestions.Feed.LoadKeysTime" units="ms" + expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary> + The time it takes for the Feed to load all keys from the storage. + </summary> +</histogram> + +<histogram name="ContentSuggestions.Feed.LoadSuccess" enum="BooleanSuccess" + expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary>Tracks the Feed storage success rate during load entries.</summary> +</histogram> + +<histogram name="ContentSuggestions.Feed.LoadTime" units="ms" + expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary> + The time it takes for the Feed to load entries from the storage. + </summary> +</histogram> + <histogram name="ContentSuggestions.Feed.Network.RequestSizeKB.Compressed" units="KB" expires_after="2019-10-01"> <owner>pnoland@chromium.org</owner> @@ -15253,6 +15314,24 @@ </summary> </histogram> +<histogram name="ContentSuggestions.Feed.OperationCommitSuccess" + enum="BooleanSuccess" expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary> + Tracks the Feed storage success rate during commit operations. + </summary> +</histogram> + +<histogram name="ContentSuggestions.Feed.OperationCommitTime" units="ms" + expires_after="2019-10-01"> + <owner>gangwu@chromium.org</owner> + <owner>fgorski@chromium.org</owner> + <summary> + The time it takes for the Feed to commit operations from the storage. + </summary> +</histogram> + <histogram name="ContentSuggestions.Feed.RequestSizeKB.Compressed" units="KB"> <obsolete> Deprecated in favor of @@ -122768,6 +122847,7 @@ <suffix name="Image"/> <suffix name="OfflinePage"/> <suffix name="Other"/> + <suffix name="PrefetchedOfflinePage"/> <suffix name="Total"/> <suffix name="Video"/> <affected-histogram name="Android.DownloadManager.InitialCount"/> @@ -125722,6 +125802,20 @@ <affected-histogram name="Favicons.DownloadAttempts"/> </histogram_suffixes> +<histogram_suffixes name="FeedStorageType" separator="." ordering="prefix,2"> + <suffix name="ContentStorage" label="Database for content storage."/> + <suffix name="JournalStorage" label="Database for journal storage."/> + <affected-histogram name="ContentSuggestions.Feed.CommitMutationCount"/> + <affected-histogram name="ContentSuggestions.Feed.Count"/> + <affected-histogram name="ContentSuggestions.Feed.InitialSuccess"/> + <affected-histogram name="ContentSuggestions.Feed.LoadKeysSuccess"/> + <affected-histogram name="ContentSuggestions.Feed.LoadKeysTime"/> + <affected-histogram name="ContentSuggestions.Feed.LoadSuccess"/> + <affected-histogram name="ContentSuggestions.Feed.LoadTime"/> + <affected-histogram name="ContentSuggestions.Feed.OperationCommitSuccess"/> + <affected-histogram name="ContentSuggestions.Feed.OperationCommitTime"/> +</histogram_suffixes> + <histogram_suffixes name="FieldPredictionSubmissionEvents" separator="."> <suffix name="BasedOnAutocomplete" label="Quality metrics based on autocomplete attributes."/>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv index 23c0c69..7ead40f 100644 --- a/tools/perf/benchmark.csv +++ b/tools/perf/benchmark.csv
@@ -17,7 +17,6 @@ blink_perf.svg,"kouhei@chromium.org, fs@opera.com",Blink>SVG,https://bit.ly/blink-perf-benchmarks, components_perftests,csharrison@chromium.org,,, dromaeo,"jbroman@chromium.org, yukishiino@chromium.org, haraken@chromium.org",Blink>Bindings,, -dummy_benchmark.histogram_benchmark_1,"eakuefner@chromium.org, simonhatch@chromium.org",,, dummy_benchmark.noisy_benchmark_1,nednguyen@google.com,Speed>Telemetry,, dummy_benchmark.stable_benchmark_1,nednguyen@google.com,Speed>Telemetry,, gpu_perftests,"reveman@chromium.org, chrome-gpu-perf-owners@chromium.org",Internals>GPU,,
diff --git a/tools/perf/benchmarks/dummy_benchmark.py b/tools/perf/benchmarks/dummy_benchmark.py index da440613..64d02403 100644 --- a/tools/perf/benchmarks/dummy_benchmark.py +++ b/tools/perf/benchmarks/dummy_benchmark.py
@@ -15,7 +15,6 @@ from telemetry import benchmark from telemetry.value import scalar from telemetry.page import legacy_page_test -from telemetry.web_perf import timeline_based_measurement from page_sets import dummy_story_set @@ -62,19 +61,3 @@ @classmethod def Name(cls): return 'dummy_benchmark.noisy_benchmark_1' - - -@benchmark.Info(emails=['eakuefner@chromium.org', 'simonhatch@chromium.org']) -class DummyBenchmarkThree(perf_benchmark.PerfBenchmark): - """A test benchmark for outputting histograms.""" - page_set = dummy_story_set.DummyStorySet - - def CreateCoreTimelineBasedMeasurementOptions(self): - options = timeline_based_measurement.Options( - timeline_based_measurement.DEBUG_OVERHEAD_LEVEL) - options.SetTimelineBasedMetrics(['sampleMetric']) - return options - - @classmethod - def Name(cls): - return 'dummy_benchmark.histogram_benchmark_1'
diff --git a/tools/perf/benchmarks/system_health_smoke_test.py b/tools/perf/benchmarks/system_health_smoke_test.py index 74d287fd..cd11a46 100644 --- a/tools/perf/benchmarks/system_health_smoke_test.py +++ b/tools/perf/benchmarks/system_health_smoke_test.py
@@ -34,44 +34,68 @@ _DISABLED_TESTS = frozenset({ - # crbug.com/733427 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile/browse:news:cnn', # pylint: disable=line-too-long + # crbug.com/878390 - These stories are already covered by their 2018 versions + # and will later be removed. + 'system_health.memory_mobile/browse:tech:discourse_infinite_scroll', + 'system_health.memory_mobile/browse:social:facebook_infinite_scroll', + 'system_health.memory_mobile/browse:news:cnn', + 'system_health.memory_mobile/load:news:cnn', + 'system_health.memory_mobile/load:tools:stackoverflow', + 'system_health.memory_desktop/load_accessibility:shopping:amazon', + 'system_health.memory_desktop/browse_accessibility:tech:codesearch', + 'system_health.memory_desktop/load_accessibility:media:wikipedia', + 'system_health.memory_desktop/browse:tech:discourse_infinite_scroll', + 'system_health.memory_desktop/browse:social:facebook_infinite_scroll', + 'system_health.memory_desktop/browse:news:flipboard', + 'system_health.memory_desktop/browse:search:google', + 'system_health.memory_desktop/browse:news:hackernews', + 'system_health.memory_desktop/load:search:amazon', + 'system_health.memory_desktop/load:news:bbc', + 'system_health.memory_desktop/load:news:hackernews', + 'system_health.memory_desktop/load:social:instagram', + 'system_health.memory_desktop/load:news:reddit', + 'system_health.memory_desktop/load:search:taobao', + 'system_health.memory_desktop/multitab:misc:typical24', + 'system_health.memory_desktop/browse:news:reddit', + 'system_health.memory_desktop/browse:media:tumblr', + 'system_health.memory_desktop/browse:social:twitter_infinite_scroll', + # crbug.com/637230 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/browse:news:cnn', # pylint: disable=line-too-long + 'system_health.memory_desktop/browse:news:cnn', # Permenently disabled from smoke test for being long-running. - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile/long_running:tools:gmail-foreground', # pylint: disable=line-too-long - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile/long_running:tools:gmail-background', # pylint: disable=line-too-long - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/long_running:tools:gmail-foreground', # pylint: disable=line-too-long - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/long_running:tools:gmail-background', # pylint: disable=line-too-long + 'system_health.memory_mobile/long_running:tools:gmail-foreground', + 'system_health.memory_mobile/long_running:tools:gmail-background', + 'system_health.memory_desktop/long_running:tools:gmail-foreground', + 'system_health.memory_desktop/long_running:tools:gmail-background', # crbug.com/769263 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/play:media:soundcloud', # pylint: disable=line-too-long + 'system_health.memory_desktop/play:media:soundcloud', # crbug.com/ - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/browse:news:nytimes', # pylint: disable=line-too-long + 'system_health.memory_desktop/browse:news:nytimes', # crbug.com/688190 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile/browse:news:washingtonpost', # pylint: disable=line-too-long + 'system_health.memory_mobile/browse:news:washingtonpost', # crbug.com/696824 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/load:news:qq', # pylint: disable=line-too-long + 'system_health.memory_desktop/load:news:qq', # crbug.com/893615 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/load:news:cnn', # pylint: disable=line-too-long - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/load:tools:stackoverflow', # pylint: disable=line-too-long - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/load:games:alphabetty', # pylint: disable=line-too-long + 'system_health.memory_desktop/load:news:cnn', + 'system_health.memory_desktop/load:tools:stackoverflow', + 'system_health.memory_desktop/load:games:alphabetty', # crbug.com/698006 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/load:tools:drive', # pylint: disable=line-too-long - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/load:tools:gmail', # pylint: disable=line-too-long + 'system_health.memory_desktop/load:tools:drive', + 'system_health.memory_desktop/load:tools:gmail', # crbug.com/725386 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/browse:social:twitter', # pylint: disable=line-too-long + 'system_health.memory_desktop/browse:social:twitter', # crbug.com/816482 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/load:news:nytimes', # pylint: disable=line-too-long + 'system_health.memory_desktop/load:news:nytimes', # crbug.com/885320 - 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop/browse:search:google:2018', # pylint: disable=line-too-long + 'system_health.memory_desktop/browse:search:google:2018', }) @@ -117,7 +141,16 @@ if possible_browser is None: self.skipTest('Cannot find the browser to run the test.') - if self.id() in _DISABLED_TESTS and not options.run_disabled_tests: + + simplified_test_name = self.id().replace( + 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.', + '') + + # Sanity check to ensure that that substring removal was effective. + assert len(simplified_test_name) < len(self.id()) + + if (simplified_test_name in _DISABLED_TESTS and + not options.run_disabled_tests): self.skipTest('Test is explicitly disabled') single_page_benchmark = SinglePageBenchmark() @@ -172,6 +205,7 @@ suite = progress_reporter.TestSuite() benchmark_classes = GetSystemHealthBenchmarksToSmokeTest() assert benchmark_classes, 'This list should never be empty' + names_stories_to_smoke_tests = [] for benchmark_class in benchmark_classes: # HACK: these options should be derived from options_for_unittests which are @@ -193,4 +227,18 @@ suite.addTest( _GenerateSmokeTestCase(benchmark_class, story_to_smoke_test)) + names_stories_to_smoke_tests.append( + benchmark_class.Name() + '/' + story_to_smoke_test.name) + + for i, story_name in enumerate(names_stories_to_smoke_tests): + for j in xrange(i + 1, len(names_stories_to_smoke_tests)): + other_story_name = names_stories_to_smoke_tests[j] + if (other_story_name.startswith(story_name + ':') and + story_name not in _DISABLED_TESTS): + raise ValueError( + 'Story %s is to be replaced by %s. Please put %s in ' + '_DISABLED_TESTS list to save CQ capacity (see crbug.com/893615)). ' + 'You can use crbug.com/878390 for the disabling reference.' % + (repr(story_name), repr(other_story_name), repr(story_name))) + return suite
diff --git a/tools/perf/core/shard_maps/android-go-perf_map.json b/tools/perf/core/shard_maps/android-go-perf_map.json index 885370c..091808ab 100644 --- a/tools/perf/core/shard_maps/android-go-perf_map.json +++ b/tools/perf/core/shard_maps/android-go-perf_map.json
@@ -49,22 +49,22 @@ "benchmarks": { "system_health.common_mobile": { "begin": 17, - "end": 33 + "end": 34 } } }, "6": { "benchmarks": { "system_health.common_mobile": { - "begin": 33, - "end": 59 + "begin": 34, + "end": 61 } } }, "7": { "benchmarks": { "system_health.common_mobile": { - "begin": 59 + "begin": 61 }, "system_health.memory_mobile": { "end": 6 @@ -99,38 +99,38 @@ "benchmarks": { "system_health.memory_mobile": { "begin": 24, - "end": 32 + "end": 33 } } }, "12": { "benchmarks": { "system_health.memory_mobile": { - "begin": 32, - "end": 44 + "begin": 33, + "end": 45 } } }, "13": { "benchmarks": { "system_health.memory_mobile": { - "begin": 44, - "end": 54 + "begin": 45, + "end": 56 } } }, "14": { "benchmarks": { "system_health.memory_mobile": { - "begin": 54, - "end": 60 + "begin": 56, + "end": 62 } } }, "15": { "benchmarks": { "system_health.memory_mobile": { - "begin": 60 + "begin": 62 }, "system_health.webview_startup": {}, "v8.browsing_mobile": { @@ -162,7 +162,7 @@ } }, "extra_infos": { - "num_stories": 194, + "num_stories": 198, "predicted_min_shard_time": 2148.0, "predicted_min_shard_index": 10, "predicted_max_shard_time": 3000.0, @@ -172,15 +172,15 @@ "shard #2": 2538.0, "shard #3": 2356.0, "shard #4": 2546.0, - "shard #5": 2320.0, - "shard #6": 2318.0, + "shard #5": 2322.0, + "shard #6": 2320.0, "shard #7": 2452.0, "shard #8": 3000.0, "shard #9": 2220.0, "shard #10": 2148.0, - "shard #11": 2394.0, + "shard #11": 2400.0, "shard #12": 2538.0, - "shard #13": 2334.0, + "shard #13": 2340.0, "shard #14": 2538.0, "shard #15": 2214.0, "shard #16": 2574.0,
diff --git a/tools/perf/core/shard_maps/android-nexus5x-perf_map.json b/tools/perf/core/shard_maps/android-nexus5x-perf_map.json index 509ccd0..9912c93 100644 --- a/tools/perf/core/shard_maps/android-nexus5x-perf_map.json +++ b/tools/perf/core/shard_maps/android-nexus5x-perf_map.json
@@ -8,18 +8,22 @@ "blink_perf.dom": {}, "blink_perf.events": {}, "blink_perf.image_decoder": {}, - "blink_perf.layout": {} + "blink_perf.layout": { + "end": 59 + } } }, "1": { "benchmarks": { + "blink_perf.layout": { + "begin": 59 + }, "blink_perf.owp_storage": {}, "blink_perf.paint": {}, "blink_perf.parser": {}, "blink_perf.shadow_dom": {}, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {}, "jetstream": {}, @@ -34,22 +38,22 @@ "benchmarks": { "loading.mobile": { "begin": 16, - "end": 47 + "end": 44 } } }, "3": { "benchmarks": { "loading.mobile": { - "begin": 47, - "end": 92 + "begin": 44, + "end": 90 } } }, "4": { "benchmarks": { "loading.mobile": { - "begin": 92 + "begin": 90 }, "media.desktop": {}, "media.mobile": {}, @@ -57,14 +61,14 @@ "memory.long_running_idle_gmail_background_tbmv2": {}, "memory.long_running_idle_gmail_tbmv2": {}, "memory.top_10_mobile": { - "end": 12 + "end": 9 } } }, "5": { "benchmarks": { "memory.top_10_mobile": { - "begin": 12 + "begin": 9 }, "octane": {}, "oortonline_tbmv2": {}, @@ -72,52 +76,48 @@ "power.typical_10_mobile": {}, "rasterize_and_record_micro.partial_invalidation": {}, "rasterize_and_record_micro.top_25": {}, - "rendering.desktop": {}, - "rendering.mobile": { - "end": 12 - } + "rendering.desktop": {} } }, "6": { "benchmarks": { "rendering.mobile": { - "begin": 12, - "end": 116 + "end": 101 } } }, "7": { "benchmarks": { "rendering.mobile": { - "begin": 116, - "end": 220 + "begin": 101, + "end": 228 } } }, "8": { "benchmarks": { "rendering.mobile": { - "begin": 220, - "end": 356 + "begin": 228, + "end": 359 } } }, "9": { "benchmarks": { "rendering.mobile": { - "begin": 356 + "begin": 359 }, - "smoothness.gpu_rasterization.tough_pinch_zoom_cases": { - "end": 12 + "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, + "smoothness.tough_pinch_zoom_cases": { + "end": 13 } } }, "10": { "benchmarks": { - "smoothness.gpu_rasterization.tough_pinch_zoom_cases": { - "begin": 12 + "smoothness.tough_pinch_zoom_cases": { + "begin": 13 }, - "smoothness.tough_pinch_zoom_cases": {}, "speedometer": {}, "speedometer-future": {}, "speedometer2": {}, @@ -125,33 +125,33 @@ "startup.mobile": {}, "system_health.common_desktop": {}, "system_health.common_mobile": { - "end": 24 + "end": 39 } } }, "11": { "benchmarks": { "system_health.common_mobile": { - "begin": 24 + "begin": 39 }, "system_health.memory_desktop": {}, "system_health.memory_mobile": { - "end": 14 + "end": 15 } } }, "12": { "benchmarks": { "system_health.memory_mobile": { - "begin": 14, - "end": 39 + "begin": 15, + "end": 43 } } }, "13": { "benchmarks": { "system_health.memory_mobile": { - "begin": 39 + "begin": 43 }, "system_health.webview_startup": {}, "tab_switching.typical_25": {}, @@ -159,14 +159,14 @@ "v8.browsing_desktop": {}, "v8.browsing_desktop-future": {}, "v8.browsing_mobile": { - "end": 7 + "end": 8 } } }, "14": { "benchmarks": { "v8.browsing_mobile": { - "begin": 7 + "begin": 8 }, "v8.browsing_mobile-future": { "end": 7 @@ -184,26 +184,26 @@ } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 6850.0, - "predicted_min_shard_index": 13, - "predicted_max_shard_time": 7154.0, - "predicted_max_shard_index": 14, - "shard #0": 7030.0, - "shard #1": 7070.0, - "shard #2": 7016.0, - "shard #3": 7152.0, - "shard #4": 6970.0, - "shard #5": 6978.0, - "shard #6": 7020.0, - "shard #7": 7026.0, - "shard #8": 7008.0, - "shard #9": 7068.0, - "shard #10": 6956.0, - "shard #11": 7076.0, - "shard #12": 6984.0, - "shard #13": 6850.0, - "shard #14": 7154.0, + "num_stories": 1960, + "predicted_min_shard_time": 6540.0, + "predicted_min_shard_index": 2, + "predicted_max_shard_time": 7232.0, + "predicted_max_shard_index": 1, + "shard #0": 6838.0, + "shard #1": 7232.0, + "shard #2": 6540.0, + "shard #3": 7188.0, + "shard #4": 6610.0, + "shard #5": 6800.0, + "shard #6": 6944.0, + "shard #7": 6860.0, + "shard #8": 6916.0, + "shard #9": 6844.0, + "shard #10": 6852.0, + "shard #11": 6706.0, + "shard #12": 7068.0, + "shard #13": 6838.0, + "shard #14": 6630.0, "shard #15": 7136.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/android_nexus5_perf_map.json b/tools/perf/core/shard_maps/android_nexus5_perf_map.json index 51e35602..5be42a1c 100644 --- a/tools/perf/core/shard_maps/android_nexus5_perf_map.json +++ b/tools/perf/core/shard_maps/android_nexus5_perf_map.json
@@ -24,102 +24,96 @@ "blink_perf.shadow_dom": {}, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, - "dummy_benchmark.stable_benchmark_1": {}, - "jetstream": {} + "dummy_benchmark.stable_benchmark_1": {} } }, "2": { "benchmarks": { + "jetstream": {}, "kraken": {}, "loading.desktop": {}, "loading.mobile": { - "end": 24 + "end": 23 } } }, "3": { "benchmarks": { "loading.mobile": { - "begin": 24, - "end": 63 + "begin": 23, + "end": 59 } } }, "4": { "benchmarks": { "loading.mobile": { - "begin": 63 + "begin": 59 }, "media.desktop": {}, "media.mobile": {}, "memory.desktop": {}, - "memory.long_running_idle_gmail_background_tbmv2": {}, - "memory.long_running_idle_gmail_tbmv2": {}, - "memory.top_10_mobile": { - "end": 2 - } + "memory.long_running_idle_gmail_background_tbmv2": {} } }, "5": { "benchmarks": { - "memory.top_10_mobile": { - "begin": 2 - }, + "memory.long_running_idle_gmail_tbmv2": {}, + "memory.top_10_mobile": {}, "octane": {}, "oortonline_tbmv2": {}, "power.desktop": {}, "power.typical_10_mobile": {}, "rasterize_and_record_micro.partial_invalidation": {}, "rasterize_and_record_micro.top_25": { - "end": 20 + "end": 7 } } }, "6": { "benchmarks": { "rasterize_and_record_micro.top_25": { - "begin": 20 + "begin": 7 }, "rendering.desktop": {}, "rendering.mobile": { - "end": 96 + "end": 82 } } }, "7": { "benchmarks": { "rendering.mobile": { - "begin": 96, - "end": 210 + "begin": 82, + "end": 218 } } }, "8": { "benchmarks": { "rendering.mobile": { - "begin": 210, - "end": 358 + "begin": 218, + "end": 360 } } }, "9": { "benchmarks": { "rendering.mobile": { - "begin": 358 + "begin": 360 }, - "smoothness.gpu_rasterization.tough_pinch_zoom_cases": { - "end": 16 + "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, + "smoothness.tough_pinch_zoom_cases": { + "end": 14 } } }, "10": { "benchmarks": { - "smoothness.gpu_rasterization.tough_pinch_zoom_cases": { - "begin": 16 + "smoothness.tough_pinch_zoom_cases": { + "begin": 14 }, - "smoothness.tough_pinch_zoom_cases": {}, "speedometer": {}, "speedometer-future": {}, "speedometer2": {}, @@ -127,33 +121,33 @@ "startup.mobile": {}, "system_health.common_desktop": {}, "system_health.common_mobile": { - "end": 23 + "end": 36 } } }, "11": { "benchmarks": { "system_health.common_mobile": { - "begin": 23 + "begin": 36 }, "system_health.memory_desktop": {}, "system_health.memory_mobile": { - "end": 13 + "end": 14 } } }, "12": { "benchmarks": { "system_health.memory_mobile": { - "begin": 13, - "end": 36 + "begin": 14, + "end": 40 } } }, "13": { "benchmarks": { "system_health.memory_mobile": { - "begin": 36 + "begin": 40 }, "system_health.webview_startup": {}, "tab_switching.typical_25": {}, @@ -161,24 +155,24 @@ "v8.browsing_desktop": {}, "v8.browsing_desktop-future": {}, "v8.browsing_mobile": { - "end": 1 + "end": 2 } } }, "14": { "benchmarks": { "v8.browsing_mobile": { - "begin": 1 + "begin": 2 }, "v8.browsing_mobile-future": { - "end": 3 + "end": 6 } } }, "15": { "benchmarks": { "v8.browsing_mobile-future": { - "begin": 3 + "begin": 6 }, "v8.runtime_stats.top_25": {}, "wasm": {}, @@ -186,26 +180,26 @@ } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 7492.0, - "predicted_min_shard_index": 11, - "predicted_max_shard_time": 8258.0, - "predicted_max_shard_index": 1, - "shard #0": 7888.0, - "shard #1": 8258.0, - "shard #2": 7542.0, - "shard #3": 7740.0, - "shard #4": 7796.0, - "shard #5": 7906.0, - "shard #6": 7830.0, - "shard #7": 7882.0, - "shard #8": 7874.0, - "shard #9": 7874.0, - "shard #10": 7856.0, - "shard #11": 7492.0, - "shard #12": 8160.0, - "shard #13": 8008.0, - "shard #14": 7732.0, - "shard #15": 7848.0 + "num_stories": 1960, + "predicted_min_shard_time": 7352.0, + "predicted_min_shard_index": 1, + "predicted_max_shard_time": 8142.0, + "predicted_max_shard_index": 2, + "shard #0": 7468.0, + "shard #1": 7352.0, + "shard #2": 8142.0, + "shard #3": 7580.0, + "shard #4": 7590.0, + "shard #5": 7974.0, + "shard #6": 7690.0, + "shard #7": 7644.0, + "shard #8": 7644.0, + "shard #9": 7724.0, + "shard #10": 7712.0, + "shard #11": 7572.0, + "shard #12": 7764.0, + "shard #13": 7758.0, + "shard #14": 7564.0, + "shard #15": 7712.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/android_nexus5x_webview_perf_map.json b/tools/perf/core/shard_maps/android_nexus5x_webview_perf_map.json index dcf2abcf..2cb26681 100644 --- a/tools/perf/core/shard_maps/android_nexus5x_webview_perf_map.json +++ b/tools/perf/core/shard_maps/android_nexus5x_webview_perf_map.json
@@ -9,14 +9,14 @@ "blink_perf.events": {}, "blink_perf.image_decoder": {}, "blink_perf.layout": { - "end": 12 + "end": 13 } } }, "1": { "benchmarks": { "blink_perf.layout": { - "begin": 12 + "begin": 13 }, "blink_perf.owp_storage": {}, "blink_perf.paint": {}, @@ -33,37 +33,36 @@ "dromaeo": { "begin": 2 }, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {}, "jetstream": {}, "kraken": {}, "loading.desktop": {}, "loading.mobile": { - "end": 33 + "end": 31 } } }, "3": { "benchmarks": { "loading.mobile": { - "begin": 33, - "end": 55 + "begin": 31, + "end": 54 } } }, "4": { "benchmarks": { "loading.mobile": { - "begin": 55, - "end": 92 + "begin": 54, + "end": 91 } } }, "5": { "benchmarks": { "loading.mobile": { - "begin": 92 + "begin": 91 }, "media.desktop": {}, "media.mobile": {}, @@ -71,14 +70,14 @@ "memory.long_running_idle_gmail_background_tbmv2": {}, "memory.long_running_idle_gmail_tbmv2": {}, "memory.top_10_mobile": { - "end": 18 + "end": 17 } } }, "6": { "benchmarks": { "memory.top_10_mobile": { - "begin": 18 + "begin": 17 }, "octane": {}, "oortonline_tbmv2": {}, @@ -88,22 +87,22 @@ "rasterize_and_record_micro.top_25": {}, "rendering.desktop": {}, "rendering.mobile": { - "end": 22 + "end": 17 } } }, "7": { "benchmarks": { "rendering.mobile": { - "begin": 22, - "end": 187 + "begin": 17, + "end": 174 } } }, "8": { "benchmarks": { "rendering.mobile": { - "begin": 187, + "begin": 174, "end": 403 } } @@ -122,37 +121,42 @@ "startup.mobile": {}, "system_health.common_desktop": {}, "system_health.common_mobile": { - "end": 1 + "end": 8 } } }, "10": { "benchmarks": { "system_health.common_mobile": { - "begin": 1 + "begin": 8 + }, + "system_health.memory_desktop": { + "end": 79 } } }, "11": { "benchmarks": { - "system_health.memory_desktop": {}, + "system_health.memory_desktop": { + "begin": 79 + }, "system_health.memory_mobile": { - "end": 19 + "end": 20 } } }, "12": { "benchmarks": { "system_health.memory_mobile": { - "begin": 19, - "end": 47 + "begin": 20, + "end": 50 } } }, "13": { "benchmarks": { "system_health.memory_mobile": { - "begin": 47 + "begin": 50 }, "system_health.webview_startup": {}, "tab_switching.typical_25": {}, @@ -160,14 +164,14 @@ "v8.browsing_desktop": {}, "v8.browsing_desktop-future": {}, "v8.browsing_mobile": { - "end": 6 + "end": 7 } } }, "14": { "benchmarks": { "v8.browsing_mobile": { - "begin": 6 + "begin": 7 }, "v8.browsing_mobile-future": { "end": 7 @@ -185,26 +189,26 @@ } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 5702.0, - "predicted_min_shard_index": 13, - "predicted_max_shard_time": 6112.0, - "predicted_max_shard_index": 4, - "shard #0": 5910.0, - "shard #1": 5896.0, - "shard #2": 5950.0, - "shard #3": 5852.0, - "shard #4": 6112.0, - "shard #5": 5754.0, - "shard #6": 6004.0, - "shard #7": 5862.0, - "shard #8": 5950.0, - "shard #9": 5896.0, - "shard #10": 6030.0, - "shard #11": 5730.0, - "shard #12": 6054.0, - "shard #13": 5702.0, - "shard #14": 6104.0, + "num_stories": 1960, + "predicted_min_shard_time": 5582.0, + "predicted_min_shard_index": 14, + "predicted_max_shard_time": 6084.0, + "predicted_max_shard_index": 13, + "shard #0": 5838.0, + "shard #1": 5874.0, + "shard #2": 5836.0, + "shard #3": 5840.0, + "shard #4": 5816.0, + "shard #5": 5914.0, + "shard #6": 5700.0, + "shard #7": 5902.0, + "shard #8": 5872.0, + "shard #9": 5778.0, + "shard #10": 5880.0, + "shard #11": 5922.0, + "shard #12": 5700.0, + "shard #13": 6084.0, + "shard #14": 5582.0, "shard #15": 5914.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/android_nexus6_webview_perf_map.json b/tools/perf/core/shard_maps/android_nexus6_webview_perf_map.json index 2d415c3..aa49e2e 100644 --- a/tools/perf/core/shard_maps/android_nexus6_webview_perf_map.json +++ b/tools/perf/core/shard_maps/android_nexus6_webview_perf_map.json
@@ -15,7 +15,6 @@ "blink_perf.shadow_dom": {}, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {} } @@ -26,14 +25,14 @@ "kraken": {}, "loading.desktop": {}, "loading.mobile": { - "end": 77 + "end": 70 } } }, "2": { "benchmarks": { "loading.mobile": { - "begin": 77 + "begin": 70 }, "media.desktop": {}, "media.mobile": {}, @@ -49,51 +48,46 @@ "rasterize_and_record_micro.top_25": {}, "rendering.desktop": {}, "rendering.mobile": { - "end": 13 + "end": 1 } } }, "3": { "benchmarks": { "rendering.mobile": { - "begin": 13, - "end": 263 + "begin": 1, + "end": 245 } } }, "4": { "benchmarks": { "rendering.mobile": { - "begin": 263 + "begin": 245 }, "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, - "smoothness.tough_pinch_zoom_cases": { - "end": 9 - } + "smoothness.tough_pinch_zoom_cases": {}, + "speedometer": {}, + "speedometer-future": {}, + "speedometer2": {} } }, "5": { "benchmarks": { - "smoothness.tough_pinch_zoom_cases": { - "begin": 9 - }, - "speedometer": {}, - "speedometer-future": {}, - "speedometer2": {}, "speedometer2-future": {}, "startup.mobile": {}, "system_health.common_desktop": {}, "system_health.common_mobile": {}, "system_health.memory_desktop": {}, "system_health.memory_mobile": { - "end": 16 + "end": 18 } } }, "6": { "benchmarks": { "system_health.memory_mobile": { - "begin": 16 + "begin": 18 }, "system_health.webview_startup": {}, "tab_switching.typical_25": {}, @@ -101,14 +95,14 @@ "v8.browsing_desktop": {}, "v8.browsing_desktop-future": {}, "v8.browsing_mobile": { - "end": 1 + "end": 2 } } }, "7": { "benchmarks": { "v8.browsing_mobile": { - "begin": 1 + "begin": 2 }, "v8.browsing_mobile-future": {}, "v8.runtime_stats.top_25": {}, @@ -117,18 +111,18 @@ } }, "extra_infos": { - "num_stories": 1944, - "predicted_min_shard_time": 13184.0, - "predicted_min_shard_index": 0, - "predicted_max_shard_time": 13580.0, + "num_stories": 1960, + "predicted_min_shard_time": 12836.0, + "predicted_min_shard_index": 6, + "predicted_max_shard_time": 13204.0, "predicted_max_shard_index": 1, - "shard #0": 13184.0, - "shard #1": 13580.0, - "shard #2": 13458.0, - "shard #3": 13400.0, - "shard #4": 13364.0, - "shard #5": 13324.0, - "shard #6": 13426.0, - "shard #7": 13452.0 + "shard #0": 13028.0, + "shard #1": 13204.0, + "shard #2": 13022.0, + "shard #3": 13138.0, + "shard #4": 13204.0, + "shard #5": 13146.0, + "shard #6": 12836.0, + "shard #7": 13192.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/linux-perf_map.json b/tools/perf/core/shard_maps/linux-perf_map.json index f1cd4cd..99f1563c 100644 --- a/tools/perf/core/shard_maps/linux-perf_map.json +++ b/tools/perf/core/shard_maps/linux-perf_map.json
@@ -22,31 +22,30 @@ "blink_perf.paint": {}, "blink_perf.parser": {}, "blink_perf.shadow_dom": { - "end": 35 + "end": 36 } } }, "2": { "benchmarks": { "blink_perf.shadow_dom": { - "begin": 35 + "begin": 36 }, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {}, "jetstream": {}, "kraken": {}, "loading.desktop": { - "end": 25 + "end": 26 } } }, "3": { "benchmarks": { "loading.desktop": { - "begin": 25, + "begin": 26, "end": 61 } } @@ -83,62 +82,62 @@ "octane": {}, "oortonline_tbmv2": {}, "power.desktop": { - "end": 4 + "end": 5 } } }, "7": { "benchmarks": { "power.desktop": { - "begin": 4 + "begin": 5 }, "power.typical_10_mobile": {}, "rasterize_and_record_micro.partial_invalidation": {}, "rasterize_and_record_micro.top_25": { - "end": 23 + "end": 24 } } }, "8": { "benchmarks": { "rasterize_and_record_micro.top_25": { - "begin": 23 + "begin": 24 }, "rendering.desktop": { - "end": 52 + "end": 53 } } }, "9": { "benchmarks": { "rendering.desktop": { - "begin": 52, - "end": 109 + "begin": 53, + "end": 111 } } }, "10": { "benchmarks": { "rendering.desktop": { - "begin": 109, - "end": 173 + "begin": 111, + "end": 178 } } }, "11": { "benchmarks": { "rendering.desktop": { - "begin": 173 + "begin": 178 }, "rendering.mobile": { - "end": 67 + "end": 139 } } }, "12": { "benchmarks": { "rendering.mobile": { - "begin": 67 + "begin": 139 }, "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, "smoothness.tough_pinch_zoom_cases": {}, @@ -148,65 +147,65 @@ "speedometer2-future": {}, "startup.mobile": {}, "system_health.common_desktop": { - "end": 16 + "end": 19 } } }, "13": { "benchmarks": { "system_health.common_desktop": { - "begin": 16, - "end": 59 + "begin": 19, + "end": 74 } } }, "14": { "benchmarks": { "system_health.common_desktop": { - "begin": 59 + "begin": 74 }, "system_health.common_mobile": {}, "system_health.memory_desktop": { - "end": 7 + "end": 9 } } }, "15": { "benchmarks": { "system_health.memory_desktop": { - "begin": 7, - "end": 17 + "begin": 9, + "end": 19 } } }, "16": { "benchmarks": { "system_health.memory_desktop": { - "begin": 17, - "end": 35 + "begin": 19, + "end": 43 } } }, "17": { "benchmarks": { "system_health.memory_desktop": { - "begin": 35, - "end": 57 + "begin": 43, + "end": 73 } } }, "18": { "benchmarks": { "system_health.memory_desktop": { - "begin": 57, - "end": 68 + "begin": 73, + "end": 88 } } }, "19": { "benchmarks": { "system_health.memory_desktop": { - "begin": 68 + "begin": 88 }, "system_health.memory_mobile": {}, "system_health.webview_startup": {}, @@ -255,50 +254,50 @@ "benchmarks": { "v8.runtime_stats.top_25": { "begin": 74, - "end": 114 + "end": 113 } } }, "25": { "benchmarks": { "v8.runtime_stats.top_25": { - "begin": 114 + "begin": 113 }, "wasm": {}, "webrtc": {} } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 2782.0, - "predicted_min_shard_index": 14, - "predicted_max_shard_time": 3088.0, + "num_stories": 1960, + "predicted_min_shard_time": 2784.0, + "predicted_min_shard_index": 15, + "predicted_max_shard_time": 3102.0, "predicted_max_shard_index": 21, - "shard #0": 2920.0, - "shard #1": 2912.0, - "shard #2": 2894.0, - "shard #3": 2972.0, + "shard #0": 2910.0, + "shard #1": 2928.0, + "shard #2": 2932.0, + "shard #3": 2888.0, "shard #4": 2940.0, "shard #5": 2878.0, - "shard #6": 2916.0, - "shard #7": 2862.0, - "shard #8": 2952.0, - "shard #9": 2904.0, - "shard #10": 2926.0, - "shard #11": 2930.0, - "shard #12": 2928.0, - "shard #13": 2944.0, - "shard #14": 2782.0, - "shard #15": 3054.0, - "shard #16": 2892.0, - "shard #17": 2892.0, - "shard #18": 3012.0, - "shard #19": 2832.0, - "shard #20": 2804.0, - "shard #21": 3088.0, + "shard #6": 3008.0, + "shard #7": 2926.0, + "shard #8": 2856.0, + "shard #9": 2910.0, + "shard #10": 2962.0, + "shard #11": 2910.0, + "shard #12": 2868.0, + "shard #13": 2862.0, + "shard #14": 3082.0, + "shard #15": 2784.0, + "shard #16": 3048.0, + "shard #17": 2946.0, + "shard #18": 2910.0, + "shard #19": 2856.0, + "shard #20": 2818.0, + "shard #21": 3102.0, "shard #22": 2828.0, "shard #23": 2946.0, - "shard #24": 2958.0, - "shard #25": 2882.0 + "shard #24": 2882.0, + "shard #25": 2958.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/mac-10_12_laptop_low_end-perf_map.json b/tools/perf/core/shard_maps/mac-10_12_laptop_low_end-perf_map.json index 2320a5ec..a641453 100644 --- a/tools/perf/core/shard_maps/mac-10_12_laptop_low_end-perf_map.json +++ b/tools/perf/core/shard_maps/mac-10_12_laptop_low_end-perf_map.json
@@ -9,14 +9,14 @@ "blink_perf.events": {}, "blink_perf.image_decoder": {}, "blink_perf.layout": { - "end": 59 + "end": 60 } } }, "1": { "benchmarks": { "blink_perf.layout": { - "begin": 59 + "begin": 60 }, "blink_perf.owp_storage": {}, "blink_perf.paint": {}, @@ -24,7 +24,6 @@ "blink_perf.shadow_dom": {}, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {}, "jetstream": {}, @@ -95,116 +94,111 @@ "rasterize_and_record_micro.partial_invalidation": {}, "rasterize_and_record_micro.top_25": {}, "rendering.desktop": { - "end": 21 + "end": 23 } } }, "8": { "benchmarks": { "rendering.desktop": { - "begin": 21, - "end": 71 + "begin": 23, + "end": 72 } } }, "9": { "benchmarks": { "rendering.desktop": { - "begin": 71, - "end": 121 + "begin": 72, + "end": 123 } } }, "10": { "benchmarks": { "rendering.desktop": { - "begin": 121, - "end": 200 + "begin": 123, + "end": 203 } } }, "11": { "benchmarks": { "rendering.desktop": { - "begin": 200 + "begin": 203 }, - "rendering.mobile": { - "end": 421 - } + "rendering.mobile": {}, + "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, + "smoothness.tough_pinch_zoom_cases": {} } }, "12": { "benchmarks": { - "rendering.mobile": { - "begin": 421 - }, - "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, - "smoothness.tough_pinch_zoom_cases": {}, "speedometer": {}, "speedometer-future": {}, "speedometer2": {}, "speedometer2-future": {}, "startup.mobile": {}, "system_health.common_desktop": { - "end": 22 + "end": 26 } } }, "13": { "benchmarks": { "system_health.common_desktop": { - "begin": 22, - "end": 62 + "begin": 26, + "end": 80 } } }, "14": { "benchmarks": { "system_health.common_desktop": { - "begin": 62 + "begin": 80 }, "system_health.common_mobile": {}, "system_health.memory_desktop": { - "end": 10 + "end": 11 } } }, "15": { "benchmarks": { "system_health.memory_desktop": { - "begin": 10, - "end": 19 + "begin": 11, + "end": 25 } } }, "16": { "benchmarks": { "system_health.memory_desktop": { - "begin": 19, - "end": 40 + "begin": 25, + "end": 49 } } }, "17": { "benchmarks": { "system_health.memory_desktop": { - "begin": 40, - "end": 58 + "begin": 49, + "end": 73 } } }, "18": { "benchmarks": { "system_health.memory_desktop": { - "begin": 58, - "end": 65 + "begin": 73, + "end": 83 } } }, "19": { "benchmarks": { "system_health.memory_desktop": { - "begin": 65 + "begin": 83 }, "system_health.memory_mobile": {}, "system_health.webview_startup": {}, @@ -225,14 +219,14 @@ "21": { "benchmarks": { "v8.browsing_desktop-future": { - "end": 20 + "end": 25 } } }, "22": { "benchmarks": { "v8.browsing_desktop-future": { - "begin": 20 + "begin": 25 }, "v8.browsing_mobile": {}, "v8.browsing_mobile-future": {}, @@ -267,34 +261,34 @@ } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 2928.0, + "num_stories": 1960, + "predicted_min_shard_time": 2778.0, "predicted_min_shard_index": 17, - "predicted_max_shard_time": 3780.0, + "predicted_max_shard_time": 3798.0, "predicted_max_shard_index": 18, - "shard #0": 3246.0, - "shard #1": 3264.0, + "shard #0": 3234.0, + "shard #1": 3238.0, "shard #2": 3300.0, "shard #3": 3216.0, "shard #4": 3280.0, "shard #5": 3174.0, "shard #6": 3328.0, - "shard #7": 3174.0, - "shard #8": 3252.0, - "shard #9": 3280.0, - "shard #10": 3266.0, - "shard #11": 3244.0, - "shard #12": 3230.0, - "shard #13": 3264.0, - "shard #14": 3408.0, - "shard #15": 3174.0, - "shard #16": 3126.0, - "shard #17": 2928.0, - "shard #18": 3780.0, - "shard #19": 3178.0, - "shard #20": 3234.0, - "shard #21": 3226.0, - "shard #22": 3288.0, + "shard #7": 3286.0, + "shard #8": 3230.0, + "shard #9": 3256.0, + "shard #10": 3274.0, + "shard #11": 3192.0, + "shard #12": 3340.0, + "shard #13": 3230.0, + "shard #14": 3270.0, + "shard #15": 3204.0, + "shard #16": 3330.0, + "shard #17": 2778.0, + "shard #18": 3798.0, + "shard #19": 3214.0, + "shard #20": 3248.0, + "shard #21": 3236.0, + "shard #22": 3292.0, "shard #23": 3198.0, "shard #24": 3270.0, "shard #25": 3226.0
diff --git a/tools/perf/core/shard_maps/mac-10_13_laptop_high_end-perf_map.json b/tools/perf/core/shard_maps/mac-10_13_laptop_high_end-perf_map.json index f741a28a..86f0d089 100644 --- a/tools/perf/core/shard_maps/mac-10_13_laptop_high_end-perf_map.json +++ b/tools/perf/core/shard_maps/mac-10_13_laptop_high_end-perf_map.json
@@ -9,14 +9,14 @@ "blink_perf.events": {}, "blink_perf.image_decoder": {}, "blink_perf.layout": { - "end": 60 + "end": 61 } } }, "1": { "benchmarks": { "blink_perf.layout": { - "begin": 60 + "begin": 61 }, "blink_perf.owp_storage": {}, "blink_perf.paint": {}, @@ -24,28 +24,27 @@ "blink_perf.shadow_dom": {}, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {}, "jetstream": {}, "kraken": {}, "loading.desktop": { - "end": 10 + "end": 11 } } }, "2": { "benchmarks": { "loading.desktop": { - "begin": 10, - "end": 44 + "begin": 11, + "end": 45 } } }, "3": { "benchmarks": { "loading.desktop": { - "begin": 44, + "begin": 45, "end": 76 } } @@ -55,16 +54,11 @@ "loading.desktop": { "begin": 76 }, - "loading.mobile": { - "end": 84 - } + "loading.mobile": {} } }, "5": { "benchmarks": { - "loading.mobile": { - "begin": 84 - }, "media.desktop": {}, "media.mobile": {}, "memory.desktop": {} @@ -81,48 +75,48 @@ "power.typical_10_mobile": {}, "rasterize_and_record_micro.partial_invalidation": {}, "rasterize_and_record_micro.top_25": { - "end": 9 + "end": 12 } } }, "7": { "benchmarks": { "rasterize_and_record_micro.top_25": { - "begin": 9 + "begin": 12 }, "rendering.desktop": { - "end": 40 + "end": 41 } } }, "8": { "benchmarks": { "rendering.desktop": { - "begin": 40, - "end": 96 + "begin": 41, + "end": 97 } } }, "9": { "benchmarks": { "rendering.desktop": { - "begin": 96, - "end": 157 + "begin": 97, + "end": 162 } } }, "10": { "benchmarks": { "rendering.desktop": { - "begin": 157, - "end": 237 + "begin": 162, + "end": 238 } } }, "11": { "benchmarks": { "rendering.desktop": { - "begin": 237 + "begin": 238 }, "rendering.mobile": {}, "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, @@ -133,87 +127,87 @@ "speedometer2-future": {}, "startup.mobile": {}, "system_health.common_desktop": { - "end": 12 + "end": 14 } } }, "12": { "benchmarks": { "system_health.common_desktop": { - "begin": 12, - "end": 52 + "begin": 14, + "end": 70 } } }, "13": { "benchmarks": { "system_health.common_desktop": { - "begin": 52 + "begin": 70 }, "system_health.common_mobile": {}, "system_health.memory_desktop": { - "end": 3 + "end": 5 } } }, "14": { "benchmarks": { "system_health.memory_desktop": { - "begin": 3, - "end": 14 + "begin": 5, + "end": 15 } } }, "15": { "benchmarks": { "system_health.memory_desktop": { - "begin": 14, - "end": 29 + "begin": 15, + "end": 36 } } }, "16": { "benchmarks": { "system_health.memory_desktop": { - "begin": 29, - "end": 50 + "begin": 36, + "end": 62 } } }, "17": { "benchmarks": { "system_health.memory_desktop": { - "begin": 50, - "end": 60 + "begin": 62, + "end": 75 } } }, "18": { "benchmarks": { "system_health.memory_desktop": { - "begin": 60, - "end": 67 + "begin": 75, + "end": 87 } } }, "19": { "benchmarks": { "system_health.memory_desktop": { - "begin": 67 + "begin": 87 }, "system_health.memory_mobile": {}, "system_health.webview_startup": {}, "tab_switching.typical_25": {}, "tracing.tracing_with_background_memory_infra": {}, "v8.browsing_desktop": { - "end": 11 + "end": 12 } } }, "20": { "benchmarks": { "v8.browsing_desktop": { - "begin": 11 + "begin": 12 }, "v8.browsing_desktop-future": { "end": 4 @@ -224,14 +218,14 @@ "benchmarks": { "v8.browsing_desktop-future": { "begin": 4, - "end": 22 + "end": 27 } } }, "22": { "benchmarks": { "v8.browsing_desktop-future": { - "begin": 22 + "begin": 27 }, "v8.browsing_mobile": {}, "v8.browsing_mobile-future": {}, @@ -266,34 +260,34 @@ } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 2436.0, + "num_stories": 1960, + "predicted_min_shard_time": 2466.0, "predicted_min_shard_index": 18, - "predicted_max_shard_time": 3204.0, + "predicted_max_shard_time": 3222.0, "predicted_max_shard_index": 17, - "shard #0": 2874.0, - "shard #1": 2826.0, - "shard #2": 2880.0, - "shard #3": 2892.0, - "shard #4": 2848.0, - "shard #5": 2988.0, - "shard #6": 2728.0, - "shard #7": 2910.0, - "shard #8": 2840.0, - "shard #9": 2846.0, - "shard #10": 2906.0, - "shard #11": 2850.0, - "shard #12": 2844.0, - "shard #13": 2858.0, - "shard #14": 2868.0, - "shard #15": 2844.0, - "shard #16": 2976.0, - "shard #17": 3204.0, - "shard #18": 2436.0, - "shard #19": 2944.0, - "shard #20": 2752.0, - "shard #21": 2990.0, - "shard #22": 2802.0, + "shard #0": 2868.0, + "shard #1": 2870.0, + "shard #2": 2896.0, + "shard #3": 2812.0, + "shard #4": 2888.0, + "shard #5": 2948.0, + "shard #6": 2790.0, + "shard #7": 2898.0, + "shard #8": 2828.0, + "shard #9": 2882.0, + "shard #10": 2922.0, + "shard #11": 2838.0, + "shard #12": 2874.0, + "shard #13": 2866.0, + "shard #14": 2718.0, + "shard #15": 3036.0, + "shard #16": 2850.0, + "shard #17": 3222.0, + "shard #18": 2466.0, + "shard #19": 2970.0, + "shard #20": 2764.0, + "shard #21": 2810.0, + "shard #22": 2996.0, "shard #23": 2826.0, "shard #24": 2878.0, "shard #25": 2860.0
diff --git a/tools/perf/core/shard_maps/smoke_test_benchmark_shard_map.json b/tools/perf/core/shard_maps/smoke_test_benchmark_shard_map.json index ec68f47d..19104bb3 100644 --- a/tools/perf/core/shard_maps/smoke_test_benchmark_shard_map.json +++ b/tools/perf/core/shard_maps/smoke_test_benchmark_shard_map.json
@@ -6,7 +6,7 @@ }, "1": { "benchmarks": { - "dummy_benchmark.histogram_benchmark_1": {} + "dummy_benchmark.noisy_benchmark_1": {} } } }
diff --git a/tools/perf/core/shard_maps/win-10-perf_map.json b/tools/perf/core/shard_maps/win-10-perf_map.json index e8f67e8..7783a7c3 100644 --- a/tools/perf/core/shard_maps/win-10-perf_map.json +++ b/tools/perf/core/shard_maps/win-10-perf_map.json
@@ -9,14 +9,14 @@ "blink_perf.events": {}, "blink_perf.image_decoder": {}, "blink_perf.layout": { - "end": 39 + "end": 40 } } }, "1": { "benchmarks": { "blink_perf.layout": { - "begin": 39 + "begin": 40 }, "blink_perf.owp_storage": {}, "blink_perf.paint": {}, @@ -24,24 +24,27 @@ "blink_perf.shadow_dom": {}, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {}, "jetstream": {}, - "kraken": {} + "kraken": {}, + "loading.desktop": { + "end": 1 + } } }, "2": { "benchmarks": { "loading.desktop": { - "end": 36 + "begin": 1, + "end": 37 } } }, "3": { "benchmarks": { "loading.desktop": { - "begin": 36, + "begin": 37, "end": 65 } } @@ -73,12 +76,17 @@ "begin": 2 }, "memory.long_running_idle_gmail_background_tbmv2": {}, - "memory.long_running_idle_gmail_tbmv2": {} + "memory.long_running_idle_gmail_tbmv2": {}, + "memory.top_10_mobile": { + "end": 2 + } } }, "7": { "benchmarks": { - "memory.top_10_mobile": {}, + "memory.top_10_mobile": { + "begin": 2 + }, "octane": {}, "oortonline_tbmv2": {}, "power.desktop": {}, @@ -86,48 +94,48 @@ "rasterize_and_record_micro.partial_invalidation": {}, "rasterize_and_record_micro.top_25": {}, "rendering.desktop": { - "end": 1 + "end": 2 } } }, "8": { "benchmarks": { "rendering.desktop": { - "begin": 1, - "end": 56 + "begin": 2, + "end": 57 } } }, "9": { "benchmarks": { "rendering.desktop": { - "begin": 56, - "end": 114 + "begin": 57, + "end": 116 } } }, "10": { "benchmarks": { "rendering.desktop": { - "begin": 114, - "end": 181 + "begin": 116, + "end": 185 } } }, "11": { "benchmarks": { "rendering.desktop": { - "begin": 181 + "begin": 185 }, "rendering.mobile": { - "end": 210 + "end": 270 } } }, "12": { "benchmarks": { "rendering.mobile": { - "begin": 210 + "begin": 270 }, "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, "smoothness.tough_pinch_zoom_cases": {}, @@ -137,65 +145,65 @@ "speedometer2-future": {}, "startup.mobile": {}, "system_health.common_desktop": { - "end": 17 + "end": 20 } } }, "13": { "benchmarks": { "system_health.common_desktop": { - "begin": 17, - "end": 59 + "begin": 20, + "end": 74 } } }, "14": { "benchmarks": { "system_health.common_desktop": { - "begin": 59 + "begin": 74 }, "system_health.common_mobile": {}, "system_health.memory_desktop": { - "end": 7 + "end": 8 } } }, "15": { "benchmarks": { "system_health.memory_desktop": { - "begin": 7, - "end": 16 + "begin": 8, + "end": 19 } } }, "16": { "benchmarks": { "system_health.memory_desktop": { - "begin": 16, - "end": 33 + "begin": 19, + "end": 40 } } }, "17": { "benchmarks": { "system_health.memory_desktop": { - "begin": 33, - "end": 54 + "begin": 40, + "end": 69 } } }, "18": { "benchmarks": { "system_health.memory_desktop": { - "begin": 54, - "end": 63 + "begin": 69, + "end": 80 } } }, "19": { "benchmarks": { "system_health.memory_desktop": { - "begin": 63 + "begin": 80 }, "system_health.memory_mobile": {}, "system_health.webview_startup": {}, @@ -216,14 +224,14 @@ "21": { "benchmarks": { "v8.browsing_desktop-future": { - "end": 19 + "end": 24 } } }, "22": { "benchmarks": { "v8.browsing_desktop-future": { - "begin": 19 + "begin": 24 }, "v8.browsing_mobile": {}, "v8.browsing_mobile-future": {}, @@ -244,50 +252,50 @@ "benchmarks": { "v8.runtime_stats.top_25": { "begin": 66, - "end": 106 + "end": 105 } } }, "25": { "benchmarks": { "v8.runtime_stats.top_25": { - "begin": 106 + "begin": 105 }, "wasm": {}, "webrtc": {} } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 2570.0, + "num_stories": 1960, + "predicted_min_shard_time": 2612.0, "predicted_min_shard_index": 19, - "predicted_max_shard_time": 3012.0, - "predicted_max_shard_index": 18, - "shard #0": 2868.0, - "shard #1": 2770.0, - "shard #2": 2852.0, - "shard #3": 2872.0, + "predicted_max_shard_time": 3132.0, + "predicted_max_shard_index": 15, + "shard #0": 2862.0, + "shard #1": 2874.0, + "shard #2": 2820.0, + "shard #3": 2800.0, "shard #4": 2808.0, "shard #5": 2952.0, - "shard #6": 2770.0, - "shard #7": 2836.0, - "shard #8": 2802.0, - "shard #9": 2866.0, - "shard #10": 2842.0, - "shard #11": 2830.0, - "shard #12": 2870.0, - "shard #13": 2912.0, - "shard #14": 2666.0, - "shard #15": 2838.0, - "shard #16": 2970.0, - "shard #17": 2760.0, - "shard #18": 3012.0, - "shard #19": 2570.0, - "shard #20": 2836.0, - "shard #21": 2838.0, - "shard #22": 2978.0, + "shard #6": 2790.0, + "shard #7": 2828.0, + "shard #8": 2850.0, + "shard #9": 2858.0, + "shard #10": 2852.0, + "shard #11": 2834.0, + "shard #12": 2880.0, + "shard #13": 2784.0, + "shard #14": 2690.0, + "shard #15": 3132.0, + "shard #16": 2712.0, + "shard #17": 2808.0, + "shard #18": 3024.0, + "shard #19": 2612.0, + "shard #20": 2850.0, + "shard #21": 2848.0, + "shard #22": 2982.0, "shard #23": 2830.0, - "shard #24": 2856.0, - "shard #25": 2810.0 + "shard #24": 2794.0, + "shard #25": 2872.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/win_7_nvidia_gpu_perf_map.json b/tools/perf/core/shard_maps/win_7_nvidia_gpu_perf_map.json index 92d6488..1e08cdd 100644 --- a/tools/perf/core/shard_maps/win_7_nvidia_gpu_perf_map.json +++ b/tools/perf/core/shard_maps/win_7_nvidia_gpu_perf_map.json
@@ -15,21 +15,20 @@ "blink_perf.shadow_dom": {}, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {}, "jetstream": {}, "kraken": {}, "loading.desktop": {}, "loading.mobile": { - "end": 82 + "end": 90 } } }, "1": { "benchmarks": { "loading.mobile": { - "begin": 82 + "begin": 90 }, "media.desktop": {}, "media.mobile": {}, @@ -44,14 +43,14 @@ "rasterize_and_record_micro.partial_invalidation": {}, "rasterize_and_record_micro.top_25": {}, "rendering.desktop": { - "end": 158 + "end": 161 } } }, "2": { "benchmarks": { "rendering.desktop": { - "begin": 158 + "begin": 161 }, "rendering.mobile": {}, "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, @@ -64,28 +63,28 @@ "system_health.common_desktop": {}, "system_health.common_mobile": {}, "system_health.memory_desktop": { - "end": 16 + "end": 19 } } }, "3": { "benchmarks": { "system_health.memory_desktop": { - "begin": 16 + "begin": 19 }, "system_health.memory_mobile": {}, "system_health.webview_startup": {}, "tab_switching.typical_25": {}, "tracing.tracing_with_background_memory_infra": {}, "v8.browsing_desktop": { - "end": 20 + "end": 25 } } }, "4": { "benchmarks": { "v8.browsing_desktop": { - "begin": 20 + "begin": 25 }, "v8.browsing_desktop-future": {}, "v8.browsing_mobile": {}, @@ -96,15 +95,15 @@ } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 15154.0, - "predicted_min_shard_index": 2, + "num_stories": 1960, + "predicted_min_shard_time": 15184.0, + "predicted_min_shard_index": 4, "predicted_max_shard_time": 15372.0, - "predicted_max_shard_index": 3, - "shard #0": 15232.0, - "shard #1": 15240.0, - "shard #2": 15154.0, - "shard #3": 15372.0, - "shard #4": 15166.0 + "predicted_max_shard_index": 2, + "shard #0": 15256.0, + "shard #1": 15246.0, + "shard #2": 15372.0, + "shard #3": 15226.0, + "shard #4": 15184.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/win_7_perf_map.json b/tools/perf/core/shard_maps/win_7_perf_map.json index 7297c940..9219bf83 100644 --- a/tools/perf/core/shard_maps/win_7_perf_map.json +++ b/tools/perf/core/shard_maps/win_7_perf_map.json
@@ -15,20 +15,19 @@ "blink_perf.shadow_dom": {}, "blink_perf.svg": {}, "dromaeo": {}, - "dummy_benchmark.histogram_benchmark_1": {}, "dummy_benchmark.noisy_benchmark_1": {}, "dummy_benchmark.stable_benchmark_1": {}, "jetstream": {}, "kraken": {}, "loading.desktop": { - "end": 94 + "end": 95 } } }, "1": { "benchmarks": { "loading.desktop": { - "begin": 94 + "begin": 95 }, "loading.mobile": {}, "media.desktop": {}, @@ -44,14 +43,14 @@ "rasterize_and_record_micro.partial_invalidation": {}, "rasterize_and_record_micro.top_25": {}, "rendering.desktop": { - "end": 136 + "end": 138 } } }, "2": { "benchmarks": { "rendering.desktop": { - "begin": 136 + "begin": 138 }, "rendering.mobile": {}, "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, @@ -64,28 +63,28 @@ "system_health.common_desktop": {}, "system_health.common_mobile": {}, "system_health.memory_desktop": { - "end": 12 + "end": 14 } } }, "3": { "benchmarks": { "system_health.memory_desktop": { - "begin": 12 + "begin": 14 }, "system_health.memory_mobile": {}, "system_health.webview_startup": {}, "tab_switching.typical_25": {}, "tracing.tracing_with_background_memory_infra": {}, "v8.browsing_desktop": { - "end": 18 + "end": 22 } } }, "4": { "benchmarks": { "v8.browsing_desktop": { - "begin": 18 + "begin": 22 }, "v8.browsing_desktop-future": {}, "v8.browsing_mobile": {}, @@ -96,15 +95,15 @@ } }, "extra_infos": { - "num_stories": 1904, - "predicted_min_shard_time": 15542.0, - "predicted_min_shard_index": 2, - "predicted_max_shard_time": 15804.0, - "predicted_max_shard_index": 4, - "shard #0": 15666.0, - "shard #1": 15762.0, - "shard #2": 15542.0, - "shard #3": 15764.0, - "shard #4": 15804.0 + "num_stories": 1960, + "predicted_min_shard_time": 15496.0, + "predicted_min_shard_index": 3, + "predicted_max_shard_time": 15890.0, + "predicted_max_shard_index": 2, + "shard #0": 15758.0, + "shard #1": 15698.0, + "shard #2": 15890.0, + "shard #3": 15496.0, + "shard #4": 15824.0 } } \ No newline at end of file
diff --git a/tools/perf/core/undocumented_benchmarks.py b/tools/perf/core/undocumented_benchmarks.py index f20dfa7..e0b9659 100644 --- a/tools/perf/core/undocumented_benchmarks.py +++ b/tools/perf/core/undocumented_benchmarks.py
@@ -9,7 +9,6 @@ 'angle_perftests', 'components_perftests', 'dromaeo', - 'dummy_benchmark.histogram_benchmark_1', 'dummy_benchmark.noisy_benchmark_1', 'dummy_benchmark.stable_benchmark_1', 'gpu_perftests',
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index 8e35bdd..f56cf6e 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -109,6 +109,7 @@ crbug.com/859597 [ Nexus_5 ] loading.mobile/Hongkiat_3g [ Skip ] crbug.com/859597 [ Nexus_5X ] loading.mobile/Hongkiat_3g [ Skip ] crbug.com/859597 [ Nexus5X_Webview ] loading.mobile/Hongkiat_3g [ Skip ] +crbug.com/896088 [ Nexus_5 ] loading.mobile/TribunNews_3g [ Skip ] crbug.com/859597 [ Nexus_5X ] loading.mobile/TribunNews_3g [ Skip ] crbug.com/859597 [ Nexus5X_Webview ] loading.mobile/TribunNews_3g [ Skip ] crbug.com/859597 [ Nexus_5X ] loading.mobile/GoogleIndonesia_3g [ Skip ] @@ -209,8 +210,8 @@ crbug.com/875878 [ Nexus6_Webview ] rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html [ Skip ] # Benchmark: startup.mobile -crbug.com/894744 [ Android ] startup.android/intent:coldish:bbc [ Skip ] -crbug.com/894744 [ Android ] startup.android/intent:warm:bbc [ Skip ] +crbug.com/894744 [ Android ] startup.mobile/intent:coldish:bbc [ Skip ] +crbug.com/894744 [ Android ] startup.mobile/intent:warm:bbc [ Skip ] # Benchmark: system_health.common_desktop crbug.com/828917 [ Mac ] system_health.common_desktop/multitab:misc:typical24 [ Skip ] @@ -228,6 +229,8 @@ crbug.com/877648 [ Android_Go ] system_health.common_mobile/browse:news:toi [ Skip ] crbug.com/877648 [ Android ] system_health.common_mobile/long_running:tools:gmail-background [ Skip ] crbug.com/877648 [ Android ] system_health.common_mobile/long_running:tools:gmail-foreground [ Skip ] +crbug.com/896851 [ Android ] system_health.common_mobile/background:tools:gmail [ Skip ] +crbug.com/896871 [ Android ] system_health.common_mobile/load:tools:gmail [ Skip ] # Benchmark: system_health.memory_desktop crbug.com/728576 [ Mac ] system_health.memory_desktop/browse:news:cnn [ Skip ] @@ -285,6 +288,7 @@ crbug.com/883652 [ Android_One ] system_health.memory_mobile/browse:news:toi [ Skip ] crbug.com/883652 [ Nexus_5 ] system_health.memory_mobile/browse:shopping:avito [ Skip ] crbug.com/893873 [ Nexus_5X ] system_health.memory_mobile/load:news:washingtonpost [ Skip ] +crbug.com/896851 [ Android ] system_health.memory_mobile/background:tools:gmail [ Skip ] # Benchmark: tab_switching.typical_25 crbug.com/747026 [ Mac ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index 1e2170e..c3e99bd 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -298,8 +298,6 @@ "win/message_box_win.h", "win/mouse_wheel_util.cc", "win/mouse_wheel_util.h", - "win/open_file_name_win.cc", - "win/open_file_name_win.h", "win/scoped_ole_initializer.cc", "win/scoped_ole_initializer.h", "win/shell.cc", @@ -940,7 +938,6 @@ "dragdrop/os_exchange_data_win_unittest.cc", "win/direct_manipulation_unittest.cc", "win/hwnd_subclass_unittest.cc", - "win/open_file_name_win_unittest.cc", ] ldflags = [
diff --git a/ui/base/ime/text_input_flags.h b/ui/base/ime/text_input_flags.h index ed3c8511..ba70ea1b 100644 --- a/ui/base/ime/text_input_flags.h +++ b/ui/base/ime/text_input_flags.h
@@ -20,7 +20,8 @@ TEXT_INPUT_FLAG_AUTOCAPITALIZE_NONE = 1 << 6, TEXT_INPUT_FLAG_AUTOCAPITALIZE_CHARACTERS = 1 << 7, TEXT_INPUT_FLAG_AUTOCAPITALIZE_WORDS = 1 << 8, - TEXT_INPUT_FLAG_AUTOCAPITALIZE_SENTENCES = 1 << 9 + TEXT_INPUT_FLAG_AUTOCAPITALIZE_SENTENCES = 1 << 9, + TEXT_INPUT_FLAG_HAS_BEEN_PASSWORD = 1 << 12 }; } // namespace ui
diff --git a/ui/base/win/open_file_name_win.cc b/ui/base/win/open_file_name_win.cc deleted file mode 100644 index ccc7203..0000000 --- a/ui/base/win/open_file_name_win.cc +++ /dev/null
@@ -1,165 +0,0 @@ -// Copyright (c) 2014 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/base/win/open_file_name_win.h" - -#include "base/files/file_path.h" -#include "base/strings/string_util.h" - -namespace ui { -namespace win { - -OpenFileName::OpenFileName(HWND parent_window, DWORD flags) { - ::ZeroMemory(&openfilename_, sizeof(openfilename_)); - openfilename_.lStructSize = sizeof(openfilename_); - - // According to http://support.microsoft.com/?scid=kb;en-us;222003&x=8&y=12, - // The lpstrFile Buffer MUST be NULL Terminated. - filename_buffer_[0] = 0; - openfilename_.lpstrFile = filename_buffer_; - openfilename_.nMaxFile = arraysize(filename_buffer_); - - openfilename_.Flags = flags; - openfilename_.hwndOwner = parent_window; -} - -OpenFileName::~OpenFileName() { -} - -void OpenFileName::SetFilters( - const std::vector<std::tuple<base::string16, base::string16>>& filters) { - openfilename_.lpstrFilter = NULL; - filter_buffer_.clear(); - if (filters.empty()) - return; - for (const auto& filter : filters) { - filter_buffer_.append(std::get<0>(filter)); - filter_buffer_.push_back(0); - filter_buffer_.append(std::get<1>(filter)); - filter_buffer_.push_back(0); - } - filter_buffer_.push_back(0); - openfilename_.lpstrFilter = filter_buffer_.c_str(); -} - -void OpenFileName::SetInitialSelection(const base::FilePath& initial_directory, - const base::FilePath& initial_filename) { - // First reset to the default case. - // According to http://support.microsoft.com/?scid=kb;en-us;222003&x=8&y=12, - // The lpstrFile Buffer MUST be NULL Terminated. - filename_buffer_[0] = 0; - openfilename_.lpstrFile = filename_buffer_; - openfilename_.nMaxFile = arraysize(filename_buffer_); - openfilename_.lpstrInitialDir = NULL; - initial_directory_buffer_.clear(); - - if (initial_directory.empty()) - return; - - initial_directory_buffer_ = initial_directory.value(); - openfilename_.lpstrInitialDir = initial_directory_buffer_.c_str(); - - if (initial_filename.empty()) - return; - - // The filename is ignored if no initial directory is supplied. - base::wcslcpy(filename_buffer_, - initial_filename.value().c_str(), - arraysize(filename_buffer_)); -} - -base::FilePath OpenFileName::GetSingleResult() { - base::FilePath directory; - std::vector<base::FilePath> filenames; - GetResult(&directory, &filenames); - if (filenames.size() != 1 || filenames[0].empty()) - return base::FilePath(); - return directory.Append(filenames[0]); -} - -void OpenFileName::GetResult(base::FilePath* directory, - std::vector<base::FilePath>* filenames) { - DCHECK(filenames->empty()); - const wchar_t* selection = openfilename_.lpstrFile; - // The return value of |openfilename_.lpstrFile| is dependent on the - // value of the Multi-Select flag within |openfilename_|. If the flag is - // not set the return value will be a single null-terminated wide string. - // If it is set it will be more than one null-terminated wide string, itself - // terminated by an empty null-terminated wide string. - if (openfilename_.Flags & OFN_ALLOWMULTISELECT) { - while (*selection) { // Empty string indicates end of list. - filenames->push_back(base::FilePath(selection)); - // Skip over filename and null-terminator. - selection += filenames->back().value().length() + 1; - } - } else { - filenames->push_back(base::FilePath(selection)); - } - if (filenames->size() == 1) { - // When there is one file, it contains the path and filename. - *directory = (*filenames)[0].DirName(); - (*filenames)[0] = (*filenames)[0].BaseName(); - } else if (filenames->size() > 1) { - // Otherwise, the first string is the path, and the remainder are - // filenames. - *directory = (*filenames)[0]; - filenames->erase(filenames->begin()); - } -} - -// static -void OpenFileName::SetResult(const base::FilePath& directory, - const std::vector<base::FilePath>& filenames, - OPENFILENAME* openfilename) { - base::string16 filename_value; - if (filenames.size() == 1) { - filename_value = directory.Append(filenames[0]).value(); - } else { - filename_value = directory.value(); - filename_value.push_back(0); - for (std::vector<base::FilePath>::const_iterator it = filenames.begin(); - it != filenames.end(); - ++it) { - filename_value.append(it->value()); - filename_value.push_back(0); - } - } - if (filename_value.size() + 1 < openfilename->nMaxFile) { - // Because the result has embedded nulls, we must memcpy. - memcpy(openfilename->lpstrFile, - filename_value.c_str(), - (filename_value.size() + 1) * sizeof(filename_value[0])); - } else if (openfilename->nMaxFile) { - openfilename->lpstrFile[0] = 0; - } -} - -// static -std::vector<std::tuple<base::string16, base::string16>> -OpenFileName::GetFilters(const OPENFILENAME* openfilename) { - std::vector<std::tuple<base::string16, base::string16>> filters; - - const base::char16* display_string = openfilename->lpstrFilter; - if (!display_string) - return filters; - - while (*display_string) { - const base::char16* display_string_end = display_string; - while (*display_string_end) - ++display_string_end; - const base::char16* pattern = display_string_end + 1; - const base::char16* pattern_end = pattern; - while (*pattern_end) - ++pattern_end; - filters.push_back( - std::make_tuple(base::string16(display_string, display_string_end), - base::string16(pattern, pattern_end))); - display_string = pattern_end + 1; - } - - return filters; -} - -} // namespace win -} // namespace ui
diff --git a/ui/base/win/open_file_name_win.h b/ui/base/win/open_file_name_win.h deleted file mode 100644 index b0b32a9f..0000000 --- a/ui/base/win/open_file_name_win.h +++ /dev/null
@@ -1,80 +0,0 @@ -// Copyright (c) 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_BASE_WIN_OPEN_FILE_NAME_WIN_H_ -#define UI_BASE_WIN_OPEN_FILE_NAME_WIN_H_ - -#include <Windows.h> -#include <Commdlg.h> - -#include <tuple> -#include <vector> - -#include "base/macros.h" -#include "base/strings/string16.h" -#include "ui/base/ui_base_export.h" - -namespace base { -class FilePath; -} // namespace base - -namespace ui { -namespace win { - -// Encapsulates an OPENFILENAME struct and related buffers. Also provides static -// methods for interpreting the properties of an OPENFILENAME. -class UI_BASE_EXPORT OpenFileName { - public: - // Initializes the OPENFILENAME, which may be accessed using Get(). All fields - // will be NULL except for |lStructSize|, |lpstrFile|, and |nMaxFile|. The - // file buffer will initially contain a null-terminated empty string. - OpenFileName(HWND parent_window, DWORD flags); - ~OpenFileName(); - - // Initializes |lpstrFilter| from the label/pattern pairs in |filters|. - void SetFilters( - const std::vector<std::tuple<base::string16, base::string16>>& filters); - - // Sets |lpstrInitialDir| and |lpstrFile|. - void SetInitialSelection(const base::FilePath& initial_directory, - const base::FilePath& initial_filename); - - // Returns the single selected file, or an empty path if there are more or - // less than one results. - base::FilePath GetSingleResult(); - - // Returns the selected file or files. - void GetResult(base::FilePath* directory, - std::vector<base::FilePath>* filenames); - - // Returns the OPENFILENAME structure. - OPENFILENAME* GetOPENFILENAME() { return &openfilename_; } - - // Returns the OPENFILENAME structure. - const OPENFILENAME* GetOPENFILENAME() const { return &openfilename_; } - - // Stores directory and filenames in the buffer pointed to by - // |openfilename->lpstrFile| and sized |openfilename->nMaxFile|. - static void SetResult(const base::FilePath& directory, - const std::vector<base::FilePath>& filenames, - OPENFILENAME* openfilename); - - // Returns a vector of label/pattern pairs built from - // |openfilename->lpstrFilter|. - static std::vector<std::tuple<base::string16, base::string16>> GetFilters( - const OPENFILENAME* openfilename); - - private: - OPENFILENAME openfilename_; - base::string16 initial_directory_buffer_; - wchar_t filename_buffer_[UNICODE_STRING_MAX_CHARS]; - base::string16 filter_buffer_; - - DISALLOW_COPY_AND_ASSIGN(OpenFileName); -}; - -} // namespace win -} // namespace ui - -#endif // UI_BASE_WIN_OPEN_FILE_NAME_WIN_H_
diff --git a/ui/base/win/open_file_name_win_unittest.cc b/ui/base/win/open_file_name_win_unittest.cc deleted file mode 100644 index a6e6ff1f..0000000 --- a/ui/base/win/open_file_name_win_unittest.cc +++ /dev/null
@@ -1,256 +0,0 @@ -// Copyright (c) 2014 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/base/win/open_file_name_win.h" - -#include <stddef.h> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { -const HWND kHwnd = reinterpret_cast<HWND>(0xDEADBEEF); -const DWORD kFlags = OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_ENABLESIZING; - -void SetResult(const base::string16& result, ui::win::OpenFileName* ofn) { - if (ofn->GetOPENFILENAME()->nMaxFile <= result.size()) { - ADD_FAILURE() << "filename buffer insufficient."; - return; - } - if (result.empty()) { - ofn->GetOPENFILENAME()->lpstrFile[0] = 0; - } else { - // Because the result has embedded nulls, we must memcpy. - memcpy(ofn->GetOPENFILENAME()->lpstrFile, - result.c_str(), - (result.size() + 1) * sizeof(result[0])); - } -} - -void CheckFilters( - const std::vector<std::tuple<base::string16, base::string16>>& expected, - const std::vector<std::tuple<base::string16, base::string16>>& actual) { - if (expected.size() != actual.size()) { - ADD_FAILURE() << "filter count mismatch. Got " << actual.size() - << " expected " << expected.size() << "."; - return; - } - - for (size_t i = 0; i < expected.size(); ++i) { - EXPECT_EQ(std::get<0>(expected[i]), std::get<0>(actual[i])) - << "Mismatch at index " << i; - EXPECT_EQ(std::get<1>(expected[i]), std::get<1>(actual[i])) - << "Mismatch at index " << i; - } -} - -void CheckFilterString(const base::string16& expected, - const ui::win::OpenFileName& ofn) { - if (!ofn.GetOPENFILENAME()->lpstrFilter) { - ADD_FAILURE() << "Filter string is NULL."; - return; - } - if (expected.size() == 0) { - EXPECT_EQ(0, ofn.GetOPENFILENAME()->lpstrFilter[0]); - } else { - EXPECT_EQ(0, - memcmp(expected.c_str(), - ofn.GetOPENFILENAME()->lpstrFilter, - expected.size() + 1 * sizeof(expected[0]))); - } -} - -void CheckResult(const base::string16& expected, - const ui::win::OpenFileName& ofn) { - if (!ofn.GetOPENFILENAME()->lpstrFile) { - ADD_FAILURE() << "File string is NULL."; - return; - } - if (expected.size() == 0) { - EXPECT_EQ(0, ofn.GetOPENFILENAME()->lpstrFile[0]); - } else { - EXPECT_EQ(0, - memcmp(expected.c_str(), - ofn.GetOPENFILENAME()->lpstrFile, - expected.size() + 1 * sizeof(expected[0]))); - } -} - -} // namespace - -TEST(OpenFileNameTest, Initialization) { - ui::win::OpenFileName ofn(kHwnd, kFlags); - EXPECT_EQ(kHwnd, ofn.GetOPENFILENAME()->hwndOwner); - EXPECT_EQ(kFlags, ofn.GetOPENFILENAME()->Flags); - EXPECT_EQ(sizeof(OPENFILENAME), ofn.GetOPENFILENAME()->lStructSize); - ASSERT_TRUE(ofn.GetOPENFILENAME()->lpstrFile); - ASSERT_GT(ofn.GetOPENFILENAME()->nMaxFile, 0u); - EXPECT_EQ(0, ofn.GetOPENFILENAME()->lpstrFile[0]); -} - -TEST(OpenFileNameTest, SetInitialSelection) { - const base::FilePath kDirectory(L"C:\\directory\\child_directory"); - const base::FilePath kFile(L"file_name.ext"); - ui::win::OpenFileName ofn(kHwnd, kFlags); - ofn.SetInitialSelection(kDirectory, kFile); - EXPECT_EQ(kDirectory, base::FilePath(ofn.GetOPENFILENAME()->lpstrInitialDir)); - EXPECT_EQ(kFile, base::FilePath(ofn.GetOPENFILENAME()->lpstrFile)); - - ofn.SetInitialSelection(kDirectory, base::FilePath()); - EXPECT_EQ(kDirectory, base::FilePath(ofn.GetOPENFILENAME()->lpstrInitialDir)); - // Filename buffer will still be a valid pointer, to receive a result. - ASSERT_TRUE(ofn.GetOPENFILENAME()->lpstrFile); - EXPECT_EQ(base::FilePath(), base::FilePath(ofn.GetOPENFILENAME()->lpstrFile)); - - ofn.SetInitialSelection(base::FilePath(), base::FilePath()); - // No initial directory will lead to a NULL buffer. - ASSERT_FALSE(ofn.GetOPENFILENAME()->lpstrInitialDir); - ASSERT_TRUE(ofn.GetOPENFILENAME()->lpstrFile); - EXPECT_EQ(base::FilePath(), base::FilePath(ofn.GetOPENFILENAME()->lpstrFile)); - - // Make sure that both values are cleared when directory is missing. - ofn.SetInitialSelection(kDirectory, kFile); - EXPECT_EQ(kDirectory, base::FilePath(ofn.GetOPENFILENAME()->lpstrInitialDir)); - EXPECT_EQ(kFile, base::FilePath(ofn.GetOPENFILENAME()->lpstrFile)); - ofn.SetInitialSelection(base::FilePath(), base::FilePath()); - ASSERT_FALSE(ofn.GetOPENFILENAME()->lpstrInitialDir); - ASSERT_TRUE(ofn.GetOPENFILENAME()->lpstrFile); - EXPECT_EQ(base::FilePath(), base::FilePath(ofn.GetOPENFILENAME()->lpstrFile)); - - // File is ignored in absence of a directory. - ofn.SetInitialSelection(base::FilePath(), kFile); - ASSERT_FALSE(ofn.GetOPENFILENAME()->lpstrInitialDir); - ASSERT_TRUE(ofn.GetOPENFILENAME()->lpstrFile); - EXPECT_EQ(base::FilePath(), base::FilePath(ofn.GetOPENFILENAME()->lpstrFile)); -} - -TEST(OpenFileNameTest, GetSingleResultFromSingleSelect) { - ui::win::OpenFileName ofn(kHwnd, kFlags); - base::FilePath result; - - SetResult(L"C:\\dir\\file", &ofn); - result = ofn.GetSingleResult(); - EXPECT_EQ(base::FilePath(L"C:\\dir\\file"), result); - - SetResult(L"", &ofn); - result = ofn.GetSingleResult(); - EXPECT_EQ(base::FilePath(), result); -} - -TEST(OpenFileNameTest, GetSingleResultFromMultiSelect) { - const base::string16 kNull(L"\0", 1); - ui::win::OpenFileName ofn(kHwnd, kFlags | OFN_ALLOWMULTISELECT); - base::FilePath result; - - SetResult(L"C:\\dir\\file" + kNull, &ofn); - result = ofn.GetSingleResult(); - EXPECT_EQ(base::FilePath(L"C:\\dir\\file"), result); - - SetResult(L"C:\\dir" + kNull + L"file" + kNull, &ofn); - result = ofn.GetSingleResult(); - EXPECT_EQ(base::FilePath(L"C:\\dir\\file"), result); - - SetResult(L"C:\\dir" + kNull + L"file" + kNull + L"otherfile" + kNull, &ofn); - result = ofn.GetSingleResult(); - EXPECT_EQ(base::FilePath(), result); - - SetResult(L"", &ofn); - result = ofn.GetSingleResult(); - EXPECT_EQ(base::FilePath(), result); -} - -TEST(OpenFileNameTest, GetResult) { - const base::string16 kNull(L"\0", 1); - - ui::win::OpenFileName ofn(kHwnd, kFlags | OFN_ALLOWMULTISELECT); - base::FilePath directory; - std::vector<base::FilePath> filenames; - - SetResult(L"C:\\dir\\file" + kNull, &ofn); - ofn.GetResult(&directory, &filenames); - EXPECT_EQ(base::FilePath(L"C:\\dir"), directory); - ASSERT_EQ(1u, filenames.size()); - EXPECT_EQ(base::FilePath(L"file"), filenames[0]); - - directory.clear(); - filenames.clear(); - - SetResult(L"C:\\dir" + kNull + L"file" + kNull, &ofn); - ofn.GetResult(&directory, &filenames); - EXPECT_EQ(base::FilePath(L"C:\\dir"), directory); - ASSERT_EQ(1u, filenames.size()); - EXPECT_EQ(base::FilePath(L"file"), filenames[0]); - - directory.clear(); - filenames.clear(); - - SetResult(L"C:\\dir" + kNull + L"file" + kNull + L"otherfile" + kNull, &ofn); - ofn.GetResult(&directory, &filenames); - EXPECT_EQ(base::FilePath(L"C:\\dir"), directory); - ASSERT_EQ(2u, filenames.size()); - EXPECT_EQ(base::FilePath(L"file"), filenames[0]); - EXPECT_EQ(base::FilePath(L"otherfile"), filenames[1]); - - directory.clear(); - filenames.clear(); - - SetResult(L"", &ofn); - ofn.GetResult(&directory, &filenames); - EXPECT_EQ(base::FilePath(), directory); - ASSERT_EQ(0u, filenames.size()); -} - -TEST(OpenFileNameTest, SetAndGetFilters) { - const base::string16 kNull(L"\0", 1); - - ui::win::OpenFileName ofn(kHwnd, kFlags); - std::vector<std::tuple<base::string16, base::string16>> filters; - ofn.SetFilters(filters); - EXPECT_FALSE(ofn.GetOPENFILENAME()->lpstrFilter); - CheckFilters(filters, - ui::win::OpenFileName::GetFilters(ofn.GetOPENFILENAME())); - - filters.push_back( - std::make_tuple(base::string16(L"a"), base::string16(L"b"))); - ofn.SetFilters(filters); - CheckFilterString(L"a" + kNull + L"b" + kNull, ofn); - CheckFilters(filters, - ui::win::OpenFileName::GetFilters(ofn.GetOPENFILENAME())); - - filters.push_back( - std::make_tuple(base::string16(L"X"), base::string16(L"Y"))); - ofn.SetFilters(filters); - CheckFilterString(L"a" + kNull + L"b" + kNull + L"X" + kNull + L"Y" + kNull, - ofn); - CheckFilters(filters, - ui::win::OpenFileName::GetFilters(ofn.GetOPENFILENAME())); -} - -TEST(OpenFileNameTest, SetResult) { - const base::string16 kNull(L"\0", 1); - - ui::win::OpenFileName ofn(kHwnd, kFlags); - base::FilePath directory; - std::vector<base::FilePath> filenames; - - ui::win::OpenFileName::SetResult(directory, filenames, ofn.GetOPENFILENAME()); - CheckResult(L"", ofn); - - directory = base::FilePath(L"C:\\dir"); - filenames.push_back(base::FilePath(L"file")); - ui::win::OpenFileName::SetResult(directory, filenames, ofn.GetOPENFILENAME()); - CheckResult(L"C:\\dir\\file" + kNull, ofn); - - filenames.push_back(base::FilePath(L"otherfile")); - ui::win::OpenFileName::SetResult(directory, filenames, ofn.GetOPENFILENAME()); - CheckResult(L"C:\\dir" + kNull + L"file" + kNull + L"otherfile" + kNull, ofn); - - base::char16 short_buffer[10] = L""; - - ofn.GetOPENFILENAME()->lpstrFile = short_buffer; - ofn.GetOPENFILENAME()->nMaxFile = arraysize(short_buffer); - ui::win::OpenFileName::SetResult(directory, filenames, ofn.GetOPENFILENAME()); - CheckResult(L"", ofn); -}
diff --git a/ui/events/devices/device_util_linux.cc b/ui/events/devices/device_util_linux.cc index 91ce80a..95b94d9c 100644 --- a/ui/events/devices/device_util_linux.cc +++ b/ui/events/devices/device_util_linux.cc
@@ -22,8 +22,7 @@ base::AssertBlockingAllowedDeprecated(); std::string event_node = path.BaseName().value(); if (event_node.empty() || - !base::StartsWith(event_node, "event", - base::CompareCase::INSENSITIVE_ASCII)) + !base::StartsWith(event_node, "event", base::CompareCase::SENSITIVE)) return InputDeviceType::INPUT_DEVICE_UNKNOWN; base::FilePath sysfs_path = GetInputPathInSys(path);
diff --git a/ui/events/gesture_detection/gesture_provider.cc b/ui/events/gesture_detection/gesture_provider.cc index ad21fe07..d724b5d 100644 --- a/ui/events/gesture_detection/gesture_provider.cc +++ b/ui/events/gesture_detection/gesture_provider.cc
@@ -196,8 +196,10 @@ break; case ET_GESTURE_PINCH_BEGIN: DCHECK(!pinch_event_sent_); - if (!scroll_event_sent_) + if (!scroll_event_sent_ && + !scale_gesture_detector_.InAnchoredScaleMode()) { Send(GestureEventData(ET_GESTURE_SCROLL_BEGIN, gesture)); + } pinch_event_sent_ = true; break; case ET_GESTURE_PINCH_END:
diff --git a/ui/events/gesture_detection/gesture_provider_unittest.cc b/ui/events/gesture_detection/gesture_provider_unittest.cc index 3207893a..4cf65bc0 100644 --- a/ui/events/gesture_detection/gesture_provider_unittest.cc +++ b/ui/events/gesture_detection/gesture_provider_unittest.cc
@@ -773,7 +773,6 @@ MotionEvent::Action::MOVE, kFakeCoordX, kFakeCoordY + 100); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); - EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN)); ASSERT_EQ(ET_GESTURE_PINCH_BEGIN, GetNthMostRecentGestureEventType(1)); ASSERT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType()); EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale()); @@ -803,7 +802,7 @@ kFakeCoordY - 200); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_END)); - EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType()); + EXPECT_EQ(ET_GESTURE_PINCH_END, GetMostRecentGestureEventType()); EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY - 200), GetMostRecentGestureEvent().details.bounding_box_f()); } @@ -1273,7 +1272,7 @@ MotionEvent::Action::UP, kFakeCoordX, kFakeCoordY + 1); event.SetPrimaryPointerId(motion_event_id); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); - EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType()); + EXPECT_EQ(ET_GESTURE_PINCH_END, GetMostRecentGestureEventType()); EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); EXPECT_FALSE(gesture_provider_->IsDoubleTapInProgress()); @@ -1641,7 +1640,6 @@ MotionEvent::Action::MOVE, kFakeCoordX, kFakeCoordY + 100); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); - EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN)); EXPECT_EQ(ET_GESTURE_PINCH_BEGIN, GetNthMostRecentGestureEventType(1)); EXPECT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType()); EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale()); @@ -1664,7 +1662,7 @@ kFakeCoordY + 200); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_END)); - EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType()); + EXPECT_EQ(ET_GESTURE_PINCH_END, GetMostRecentGestureEventType()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); // The double-tap gesture has finished, but the page scale is fixed. @@ -2094,7 +2092,6 @@ MotionEvent::Action::MOVE, kFakeCoordX, kFakeCoordY - 30); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); - EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN)); EXPECT_EQ(ET_GESTURE_PINCH_BEGIN, GetNthMostRecentGestureEventType(1)); EXPECT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); @@ -2115,9 +2112,7 @@ event = ObtainMotionEvent(down_time_2 + kOneSecond, MotionEvent::Action::UP); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); - EXPECT_EQ(gesture_count + 1, GetReceivedGestureCount()); - EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType()); - EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(ET_GESTURE_PINCH_END, GetMostRecentGestureEventType()); } // Verify that gesture begin and gesture end events are dispatched correctly.
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn index 8810036..285a8aa 100644 --- a/ui/gfx/BUILD.gn +++ b/ui/gfx/BUILD.gn
@@ -492,7 +492,6 @@ "ca_layer_params.cc", "ca_layer_params.h", "client_native_pixmap.h", - "client_native_pixmap_factory.cc", "client_native_pixmap_factory.h", "generic_shared_memory_id.cc", "generic_shared_memory_id.h",
diff --git a/ui/gfx/OWNERS b/ui/gfx/OWNERS index 26eb0a7..a146a9e 100644 --- a/ui/gfx/OWNERS +++ b/ui/gfx/OWNERS
@@ -41,8 +41,8 @@ per-file *buffer_types.*=dcastagna@chromium.org per-file *buffer_types.*=rjkroege@chromium.org per-file *buffer_types.*=spang@chromium.org -per-file *pixmap.*=rjkroege@chromium.org -per-file *pixmap.*=spang@chromium.org +per-file *native_pixmap*=rjkroege@chromium.org +per-file *native_pixmap*=spang@chromium.org # Vector icons. per-file *vector_icon*=estade@chromium.org
diff --git a/ui/gfx/client_native_pixmap_factory.cc b/ui/gfx/client_native_pixmap_factory.cc deleted file mode 100644 index 7a4354f25..0000000 --- a/ui/gfx/client_native_pixmap_factory.cc +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/gfx/client_native_pixmap_factory.h" - -namespace gfx { - -ClientNativePixmapFactory::ClientNativePixmapFactory() {} - -ClientNativePixmapFactory::~ClientNativePixmapFactory() {} - -} // namespace gfx
diff --git a/ui/gfx/client_native_pixmap_factory.h b/ui/gfx/client_native_pixmap_factory.h index fff5b4c..e17e984b 100644 --- a/ui/gfx/client_native_pixmap_factory.h +++ b/ui/gfx/client_native_pixmap_factory.h
@@ -23,25 +23,18 @@ // provide a client pixmap for non-GPU processes. class GFX_EXPORT ClientNativePixmapFactory { public: - virtual ~ClientNativePixmapFactory(); + virtual ~ClientNativePixmapFactory() {} // Returns true if format/usage configuration is supported. virtual bool IsConfigurationSupported(gfx::BufferFormat format, gfx::BufferUsage usage) const = 0; - // TODO(dshwang): implement it. crbug.com/475633 // Import the native pixmap from |handle| to be used in non-GPU processes. // This function takes ownership of any file descriptors in |handle|. virtual std::unique_ptr<ClientNativePixmap> ImportFromHandle( const gfx::NativePixmapHandle& handle, const gfx::Size& size, gfx::BufferUsage usage) = 0; - - protected: - ClientNativePixmapFactory(); - - private: - DISALLOW_COPY_AND_ASSIGN(ClientNativePixmapFactory); }; } // namespace gfx
diff --git a/ui/keyboard/BUILD.gn b/ui/keyboard/BUILD.gn index 384a997..d8eca86 100644 --- a/ui/keyboard/BUILD.gn +++ b/ui/keyboard/BUILD.gn
@@ -139,7 +139,6 @@ mojom("mojom") { sources = [ "public/keyboard_config.mojom", - "public/keyboard_enable_flag.mojom", ] }
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc index fc72d0fe..9ce2bc4a 100644 --- a/ui/keyboard/keyboard_controller.cc +++ b/ui/keyboard/keyboard_controller.cc
@@ -11,7 +11,6 @@ #include "base/macros.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "ui/aura/client/aura_constants.h" @@ -403,68 +402,6 @@ return true; } -void KeyboardController::SetEnableFlag(mojom::KeyboardEnableFlag flag) { - if (!base::ContainsKey(keyboard_enable_flags_, flag)) - keyboard_enable_flags_.insert(flag); - - // If there is a flag that is mutually exclusive with |flag|, clear it. - using mojom::KeyboardEnableFlag; - switch (flag) { - case KeyboardEnableFlag::kPolicyEnabled: - keyboard_enable_flags_.erase(KeyboardEnableFlag::kPolicyDisabled); - break; - case KeyboardEnableFlag::kPolicyDisabled: - keyboard_enable_flags_.erase(KeyboardEnableFlag::kPolicyEnabled); - break; - case KeyboardEnableFlag::kExtensionEnabled: - keyboard_enable_flags_.erase(KeyboardEnableFlag::kExtensionDisabled); - break; - case KeyboardEnableFlag::kExtensionDisabled: - keyboard_enable_flags_.erase(KeyboardEnableFlag::kExtensionEnabled); - break; - default: - break; - } -} - -void KeyboardController::ClearEnableFlag(mojom::KeyboardEnableFlag flag) { - keyboard_enable_flags_.erase(flag); -} - -bool KeyboardController::IsEnableFlagSet(mojom::KeyboardEnableFlag flag) const { - return base::ContainsKey(keyboard_enable_flags_, flag); -} - -bool KeyboardController::IsKeyboardEnableRequested() const { - using mojom::KeyboardEnableFlag; - // Accessibility setting prioritized over policy/arc overrides. - if (IsEnableFlagSet(KeyboardEnableFlag::kAccessibilityEnabled)) - return true; - - // Keyboard can be enabled temporarily by the shelf. - if (IsEnableFlagSet(KeyboardEnableFlag::kShelfEnabled)) - return true; - - if (IsEnableFlagSet(KeyboardEnableFlag::kAndroidDisabled) || - IsEnableFlagSet(KeyboardEnableFlag::kPolicyDisabled)) { - return false; - } - if (IsEnableFlagSet(KeyboardEnableFlag::kPolicyEnabled)) - return true; - - // Command line overrides extension and touch enabled flags. - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableVirtualKeyboard)) { - return true; - } - - if (IsEnableFlagSet(KeyboardEnableFlag::kExtensionDisabled)) - return false; - - return IsEnableFlagSet(KeyboardEnableFlag::kExtensionEnabled) || - IsEnableFlagSet(KeyboardEnableFlag::kTouchEnabled); -} - bool KeyboardController::IsKeyboardOverscrollEnabled() const { if (!keyboard::IsKeyboardEnabled()) return false;
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h index 73dceba1..94e0b6c 100644 --- a/ui/keyboard/keyboard_controller.h +++ b/ui/keyboard/keyboard_controller.h
@@ -6,8 +6,6 @@ #define UI_KEYBOARD_KEYBOARD_CONTROLLER_H_ #include <memory> -#include <set> -#include <vector> #include "base/macros.h" #include "base/observer_list.h" @@ -29,7 +27,6 @@ #include "ui/keyboard/keyboard_ukm_recorder.h" #include "ui/keyboard/notification_manager.h" #include "ui/keyboard/public/keyboard_config.mojom.h" -#include "ui/keyboard/public/keyboard_enable_flag.mojom.h" #include "ui/keyboard/queued_container_type.h" #include "ui/keyboard/queued_display_change.h" @@ -143,21 +140,10 @@ bool InsertText(const base::string16& text); // Updates |keyboard_config_| with |config|. Returns |false| if there is no - // change, otherwise returns true and notifies observers if this is enabled. + // change, otherwise returns true and notifies observers if this is enabled(). bool UpdateKeyboardConfig(const mojom::KeyboardConfig& config); const mojom::KeyboardConfig& keyboard_config() { return keyboard_config_; } - // Sets and clears |keyboard_enable_flags_| entries. - void SetEnableFlag(mojom::KeyboardEnableFlag flag); - void ClearEnableFlag(mojom::KeyboardEnableFlag flag); - bool IsEnableFlagSet(mojom::KeyboardEnableFlag flag) const; - - // Returns true if the keyboard should be enabled, i.e. the current result - // of Set/ClearEnableFlag should cause the keyboard to be enabled. - // TODO(stevenjb/shend): Consider removing this and have all calls to - // Set/ClearEnableFlag always enable or disable the keyboard directly. - bool IsKeyboardEnableRequested() const; - // Returns true if keyboard overscroll is enabled. bool IsKeyboardOverscrollEnabled() const; @@ -417,10 +403,6 @@ // Keyboard configuration associated with the controller. mojom::KeyboardConfig keyboard_config_; - // Set of active enabled request flags. Used to determine whether the keyboard - // should be enabled. - std::set<mojom::KeyboardEnableFlag> keyboard_enable_flags_; - NotificationManager notification_manager_; base::Time time_of_last_blur_ = base::Time::UnixEpoch();
diff --git a/ui/keyboard/keyboard_util.cc b/ui/keyboard/keyboard_util.cc index fc32ade..3e3020fc 100644 --- a/ui/keyboard/keyboard_util.cc +++ b/ui/keyboard/keyboard_util.cc
@@ -18,17 +18,17 @@ #include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/dom/keycode_converter.h" #include "ui/events/keycodes/keyboard_code_conversion.h" -#include "ui/keyboard/keyboard_controller.h" #include "ui/keyboard/keyboard_switches.h" namespace keyboard { namespace { -const char kKeyDown[] = "keydown"; +const char kKeyDown[] ="keydown"; const char kKeyUp[] = "keyup"; -void SendProcessKeyEvent(ui::EventType type, aura::WindowTreeHost* host) { +void SendProcessKeyEvent(ui::EventType type, + aura::WindowTreeHost* host) { ui::KeyEvent event(type, ui::VKEY_PROCESSKEY, ui::DomCode::NONE, ui::EF_IS_SYNTHESIZED, ui::DomKey::PROCESS, ui::EventTimeForNow()); @@ -37,42 +37,44 @@ CHECK(!details.dispatcher_destroyed); } -void SetOrClearEnableFlag(mojom::KeyboardEnableFlag flag, bool enabled) { - if (enabled) { - KeyboardController::Get()->SetEnableFlag(flag); - } else { - KeyboardController::Get()->ClearEnableFlag(flag); - } -} +bool g_accessibility_keyboard_enabled = false; + +bool g_keyboard_enabled_from_shelf = false; + +bool g_touch_keyboard_enabled = false; + +KeyboardState g_requested_keyboard_state = KEYBOARD_STATE_AUTO; + +KeyboardShowOverride g_keyboard_show_override = KEYBOARD_SHOW_OVERRIDE_NONE; } // namespace void SetAccessibilityKeyboardEnabled(bool enabled) { - SetOrClearEnableFlag(mojom::KeyboardEnableFlag::kAccessibilityEnabled, - enabled); + g_accessibility_keyboard_enabled = enabled; } bool GetAccessibilityKeyboardEnabled() { - return KeyboardController::Get()->IsEnableFlagSet( - mojom::KeyboardEnableFlag::kAccessibilityEnabled); + return g_accessibility_keyboard_enabled; } void SetKeyboardEnabledFromShelf(bool enabled) { - SetOrClearEnableFlag(mojom::KeyboardEnableFlag::kShelfEnabled, enabled); + g_keyboard_enabled_from_shelf = enabled; } bool GetKeyboardEnabledFromShelf() { - return KeyboardController::Get()->IsEnableFlagSet( - mojom::KeyboardEnableFlag::kShelfEnabled); + return g_keyboard_enabled_from_shelf; } void SetTouchKeyboardEnabled(bool enabled) { - SetOrClearEnableFlag(mojom::KeyboardEnableFlag::kTouchEnabled, enabled); + g_touch_keyboard_enabled = enabled; } bool GetTouchKeyboardEnabled() { - return KeyboardController::Get()->IsEnableFlagSet( - mojom::KeyboardEnableFlag::kTouchEnabled); + return g_touch_keyboard_enabled; +} + +void SetRequestedKeyboardState(KeyboardState state) { + g_requested_keyboard_state = state; } std::string GetKeyboardLayout() { @@ -82,7 +84,32 @@ } bool IsKeyboardEnabled() { - return KeyboardController::Get()->IsKeyboardEnableRequested(); + // Accessibility setting prioritized over policy setting. + if (g_accessibility_keyboard_enabled) + return true; + // Keyboard can be enabled temporarily by the shelf. + if (g_keyboard_enabled_from_shelf) + return true; + // Policy strictly disables showing a virtual keyboard. + if (g_keyboard_show_override == KEYBOARD_SHOW_OVERRIDE_DISABLED) + return false; + // Policy strictly enables the keyboard. + if (g_keyboard_show_override == KEYBOARD_SHOW_OVERRIDE_ENABLED) + return true; + // Run-time flag to enable keyboard has been included. + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableVirtualKeyboard)) + return true; + // Requested state from the application layer. + if (g_requested_keyboard_state == KEYBOARD_STATE_DISABLED) + return false; + // Check if any of the other flags are enabled. + return g_touch_keyboard_enabled || + g_requested_keyboard_state == KEYBOARD_STATE_ENABLED; +} + +void SetKeyboardShowOverride(KeyboardShowOverride show_override) { + g_keyboard_show_override = show_override; } bool SendKeyEvent(const std::string type, @@ -127,8 +154,8 @@ // Log the rough lengths of characters typed between backspaces. This // metric will be used to determine the error rate for the keyboard. UMA_HISTOGRAM_CUSTOM_COUNTS( - "VirtualKeyboard.KeystrokesBetweenBackspaces", keys_seen, 1, 1000, - 50); + "VirtualKeyboard.KeystrokesBetweenBackspaces", + keys_seen, 1, 1000, 50); keys_seen = 0; } else { ++keys_seen; @@ -139,7 +166,11 @@ if (dom_code == ui::DomCode::NONE) dom_code = ui::UsLayoutKeyboardCodeToDomCode(code); CHECK(dom_code != ui::DomCode::NONE); - ui::KeyEvent event(event_type, code, dom_code, modifiers); + ui::KeyEvent event( + event_type, + code, + dom_code, + modifiers); // Marks the simulated key event is from the Virtual Keyboard. ui::Event::Properties properties;
diff --git a/ui/keyboard/keyboard_util.h b/ui/keyboard/keyboard_util.h index d2b73e5..740259d 100644 --- a/ui/keyboard/keyboard_util.h +++ b/ui/keyboard/keyboard_util.h
@@ -20,6 +20,13 @@ namespace keyboard { +// An enumeration of keyboard policy settings. +enum KeyboardShowOverride { + KEYBOARD_SHOW_OVERRIDE_DISABLED = 0, + KEYBOARD_SHOW_OVERRIDE_ENABLED, + KEYBOARD_SHOW_OVERRIDE_NONE, +}; + // An enumeration of keyboard states. enum KeyboardState { // Default state. System decides whether to show the keyboard or not. @@ -36,6 +43,12 @@ // Gets the state of the a11y onscreen keyboard. KEYBOARD_EXPORT bool GetAccessibilityKeyboardEnabled(); +// Sets the state of the hotrod onscreen keyboard. +KEYBOARD_EXPORT void SetHotrodKeyboardEnabled(bool enabled); + +// Gets the state of the hotrod onscreen keyboard. +KEYBOARD_EXPORT bool GetHotrodKeyboardEnabled(); + // Sets whether the keyboard is enabled from the shelf. KEYBOARD_EXPORT void SetKeyboardEnabledFromShelf(bool enabled); @@ -48,12 +61,29 @@ // Gets the state of the touch onscreen keyboard. KEYBOARD_EXPORT bool GetTouchKeyboardEnabled(); +// Sets the requested state of the keyboard. +KEYBOARD_EXPORT void SetRequestedKeyboardState(KeyboardState state); + +// Gets the requested state of the keyboard. +KEYBOARD_EXPORT int GetRequestedKeyboardState(); + // Gets the default keyboard layout. KEYBOARD_EXPORT std::string GetKeyboardLayout(); // Returns true if the virtual keyboard is enabled. KEYBOARD_EXPORT bool IsKeyboardEnabled(); +// Sets policy override on whether to show the keyboard. +KEYBOARD_EXPORT void SetKeyboardShowOverride( + KeyboardShowOverride show_override); + +// Sets whehther the keyboards is in restricted state - state where advanced +// virtual keyboard features are disabled. +KEYBOARD_EXPORT void SetKeyboardRestricted(bool restricted); + +// Returns whether the keyboard is in restricted state. +KEYBOARD_EXPORT bool GetKeyboardRestricted(); + // Sends a fabricated key event, where |type| is the event type, |key_value| // is the unicode value of the character, |key_code| is the legacy key code // value, |key_name| is the name of the key as defined in the DOM3 key event
diff --git a/ui/keyboard/keyboard_util_unittest.cc b/ui/keyboard/keyboard_util_unittest.cc index a39b21c..5361b06 100644 --- a/ui/keyboard/keyboard_util_unittest.cc +++ b/ui/keyboard/keyboard_util_unittest.cc
@@ -22,45 +22,34 @@ // Sets all flags controlling whether the keyboard should be shown to // their disabled state. void DisableAllFlags() { - ResetAllFlags(); keyboard::SetAccessibilityKeyboardEnabled(false); keyboard::SetTouchKeyboardEnabled(false); - SetEnableFlag(mojom::KeyboardEnableFlag::kPolicyDisabled); - SetEnableFlag(mojom::KeyboardEnableFlag::kExtensionDisabled); + keyboard::SetKeyboardShowOverride( + keyboard::KEYBOARD_SHOW_OVERRIDE_DISABLED); + keyboard::SetRequestedKeyboardState(keyboard::KEYBOARD_STATE_DISABLED); } // Sets all flags controlling whether the keyboard should be shown to - // their enabled flag. + // their enabled state. void EnableAllFlags() { - ResetAllFlags(); keyboard::SetAccessibilityKeyboardEnabled(true); keyboard::SetTouchKeyboardEnabled(true); - SetEnableFlag(mojom::KeyboardEnableFlag::kPolicyEnabled); - SetEnableFlag(mojom::KeyboardEnableFlag::kExtensionEnabled); + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_ENABLED); + keyboard::SetRequestedKeyboardState(keyboard::KEYBOARD_STATE_ENABLED); } // Sets all flags controlling whether the keyboard should be shown to - // their neutral flag. + // their neutral state. void ResetAllFlags() { keyboard::SetAccessibilityKeyboardEnabled(false); keyboard::SetTouchKeyboardEnabled(false); - ClearEnableFlag(mojom::KeyboardEnableFlag::kPolicyDisabled); - ClearEnableFlag(mojom::KeyboardEnableFlag::kExtensionDisabled); - ClearEnableFlag(mojom::KeyboardEnableFlag::kPolicyEnabled); - ClearEnableFlag(mojom::KeyboardEnableFlag::kExtensionEnabled); + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_NONE); + keyboard::SetRequestedKeyboardState(keyboard::KEYBOARD_STATE_AUTO); } void SetUp() override { ResetAllFlags(); } protected: - void SetEnableFlag(mojom::KeyboardEnableFlag flag) { - keyboard_controller_.SetEnableFlag(flag); - } - - void ClearEnableFlag(mojom::KeyboardEnableFlag flag) { - keyboard_controller_.ClearEnableFlag(flag); - } - // Used indirectly by keyboard utils. KeyboardController keyboard_controller_; @@ -85,7 +74,7 @@ EXPECT_FALSE(keyboard::IsKeyboardEnabled()); // If policy is enabled, should ignore other flag values. DisableAllFlags(); - SetEnableFlag(mojom::KeyboardEnableFlag::kPolicyEnabled); + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_ENABLED); EXPECT_TRUE(keyboard::IsKeyboardEnabled()); } @@ -97,32 +86,32 @@ keyboard::SetAccessibilityKeyboardEnabled(false); EXPECT_TRUE(keyboard::IsKeyboardEnabled()); // Disable policy. Keyboard should be disabled. - SetEnableFlag(mojom::KeyboardEnableFlag::kPolicyDisabled); + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_DISABLED); EXPECT_FALSE(keyboard::IsKeyboardEnabled()); } -// Tests that the keyboard shows when requested flag provided higher priority +// Tests that the keyboard shows when requested state provided higher priority // flags have not been set. TEST_F(KeyboardUtilTest, ShowKeyboardWhenRequested) { DisableAllFlags(); // Remove device policy, which has higher precedence than us. - ClearEnableFlag(mojom::KeyboardEnableFlag::kPolicyDisabled); + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_NONE); EXPECT_FALSE(keyboard::IsKeyboardEnabled()); // Requested should have higher precedence than all the remaining flags. - SetEnableFlag(mojom::KeyboardEnableFlag::kExtensionEnabled); + keyboard::SetRequestedKeyboardState(keyboard::KEYBOARD_STATE_ENABLED); EXPECT_TRUE(keyboard::IsKeyboardEnabled()); } -// Tests that the touch keyboard is hidden when requested flag is disabled and +// Tests that the touch keyboard is hidden when requested state is disabled and // higher priority flags have not been set. TEST_F(KeyboardUtilTest, HideKeyboardWhenRequested) { EnableAllFlags(); // Remove higher precedence flags. - ClearEnableFlag(mojom::KeyboardEnableFlag::kPolicyEnabled); + keyboard::SetKeyboardShowOverride(keyboard::KEYBOARD_SHOW_OVERRIDE_NONE); keyboard::SetAccessibilityKeyboardEnabled(false); EXPECT_TRUE(keyboard::IsKeyboardEnabled()); - // Set requested flag to disable. Keyboard should disable. - SetEnableFlag(mojom::KeyboardEnableFlag::kExtensionDisabled); + // Set requested state to disable. Keyboard should disable. + keyboard::SetRequestedKeyboardState(keyboard::KEYBOARD_STATE_DISABLED); EXPECT_FALSE(keyboard::IsKeyboardEnabled()); } @@ -137,7 +126,7 @@ TEST_F(KeyboardUtilTest, UpdateKeyboardConfig) { ResetAllFlags(); - mojom::KeyboardConfig config = keyboard_controller_.keyboard_config(); + auto config = keyboard_controller_.keyboard_config(); EXPECT_TRUE(config.spell_check); EXPECT_FALSE(keyboard_controller_.UpdateKeyboardConfig(config)); @@ -158,16 +147,16 @@ keyboard::SetTouchKeyboardEnabled(true); EXPECT_TRUE(keyboard_controller_.IsKeyboardOverscrollEnabled()); - // Set overscroll enabled flag. - mojom::KeyboardConfig config = keyboard_controller_.keyboard_config(); + // Set overscroll enabled state. + auto config = keyboard::KeyboardController::Get()->keyboard_config(); config.overscroll_behavior = keyboard::mojom::KeyboardOverscrollBehavior::kDisabled; - keyboard_controller_.UpdateKeyboardConfig(config); + keyboard::KeyboardController::Get()->UpdateKeyboardConfig(config); EXPECT_FALSE(keyboard_controller_.IsKeyboardOverscrollEnabled()); config.overscroll_behavior = keyboard::mojom::KeyboardOverscrollBehavior::kDefault; - keyboard_controller_.UpdateKeyboardConfig(config); + keyboard::KeyboardController::Get()->UpdateKeyboardConfig(config); EXPECT_TRUE(keyboard_controller_.IsKeyboardOverscrollEnabled()); // Set keyboard_locked() to true.
diff --git a/ui/keyboard/public/keyboard_config.mojom b/ui/keyboard/public/keyboard_config.mojom index 737671d..1c37f57 100644 --- a/ui/keyboard/public/keyboard_config.mojom +++ b/ui/keyboard/public/keyboard_config.mojom
@@ -4,7 +4,7 @@ module keyboard.mojom; -// Determines how the keyboard overscroll enabled state is set. +// Determines how the keyboard overscroll enabled state is set, enum KeyboardOverscrollBehavior { // Use the default behavior. kDefault,
diff --git a/ui/keyboard/public/keyboard_enable_flag.mojom b/ui/keyboard/public/keyboard_enable_flag.mojom deleted file mode 100644 index 86b8ce1..0000000 --- a/ui/keyboard/public/keyboard_enable_flag.mojom +++ /dev/null
@@ -1,35 +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. - -module keyboard.mojom; - -// Flags that affect whether or not the virtual keyboard should be enabled. -// Enabled/Disabled flag pairs are mutually exclusive, but flags from multiple -// sources may be set. Precedence is determined by the implementation in -// KeyboardController::IsKeyboardEnableRequested. -enum KeyboardEnableFlag { - // Enabled by policy. - kPolicyEnabled, - - // Disabled by policy. - kPolicyDisabled, - - // Disabled by the Android keyboard. - kAndroidDisabled, - - // Enabled by a first-party extension. - kExtensionEnabled, - - // Disabled by a first-party extension. - kExtensionDisabled, - - // Enabled by an a11y controller. - kAccessibilityEnabled, - - // Enabled by the shelf/launcher controller. - kShelfEnabled, - - // Enabled by the touch controller. - kTouchEnabled, -};
diff --git a/ui/ozone/platform/scenic/scenic_window_manager.cc b/ui/ozone/platform/scenic/scenic_window_manager.cc index cf900fe..d29fc4b 100644 --- a/ui/ozone/platform/scenic/scenic_window_manager.cc +++ b/ui/ozone/platform/scenic/scenic_window_manager.cc
@@ -23,7 +23,7 @@ if (!view_manager_) { view_manager_ = base::fuchsia::ComponentContext::GetDefault() ->ConnectToService<fuchsia::ui::viewsv1::ViewManager>(); - view_manager_.set_error_handler([this]() { + view_manager_.set_error_handler([]() { LOG(ERROR) << "The ViewManager channel was unexpectedly terminated."; }); } @@ -34,7 +34,7 @@ fuchsia::ui::scenic::Scenic* ScenicWindowManager::GetScenic() { if (!scenic_) { GetViewManager()->GetScenic(scenic_.NewRequest()); - scenic_.set_error_handler([this]() { + scenic_.set_error_handler([]() { LOG(ERROR) << "The Scenic channel was unexpectedly terminated."; }); }
diff --git a/ui/shell_dialogs/BUILD.gn b/ui/shell_dialogs/BUILD.gn index efe9a83..bd4d92a 100644 --- a/ui/shell_dialogs/BUILD.gn +++ b/ui/shell_dialogs/BUILD.gn
@@ -117,15 +117,12 @@ "//base", "//base/test:test_support", "//testing/gtest", - "//ui/base:base", - "//ui/strings:ui_strings_grit", + "//ui/base", + "//ui/resources:ui_test_pak_data", + "//ui/strings", ] if (is_mac) { deps += [ ":shell_dialogs_unittests_bundle" ] } - - if (is_win) { - deps += [ "//ui/strings:ui_strings_grit" ] - } }
diff --git a/ui/shell_dialogs/execute_select_file_win.cc b/ui/shell_dialogs/execute_select_file_win.cc index 8ce1b31e..7905699 100644 --- a/ui/shell_dialogs/execute_select_file_win.cc +++ b/ui/shell_dialogs/execute_select_file_win.cc
@@ -13,9 +13,9 @@ #include "base/files/file_util.h" #include "base/win/com_init_util.h" #include "base/win/registry.h" +#include "base/win/scoped_co_mem.h" #include "base/win/shortcut.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/base/win/open_file_name_win.h" #include "ui/shell_dialogs/base_shell_dialog_win.h" #include "ui/strings/grit/ui_strings.h" @@ -36,10 +36,92 @@ return extension.empty() ? extension : extension.substr(1); } -struct SelectFolderDialogOptions { - const wchar_t* default_path; - bool is_upload; -}; +// Sets which path is going to be open when the dialog will be shown. If +// |default_path| is not only a directory, also sets the contents of the text +// box equals to the basename of the path. +bool SetDefaultPath(IFileDialog* file_dialog, + const base::FilePath& default_path) { + if (default_path.empty()) + return true; + + base::FilePath default_folder; + base::FilePath default_file_name; + if (IsDirectory(default_path)) { + default_folder = default_path; + } else { + default_folder = default_path.DirName(); + default_file_name = default_path.BaseName(); + } + + // Do not fail the file dialog operation if the specified folder is invalid. + Microsoft::WRL::ComPtr<IShellItem> default_folder_shell_item; + if (SUCCEEDED(SHCreateItemFromParsingName( + default_folder.value().c_str(), nullptr, + IID_PPV_ARGS(&default_folder_shell_item)))) { + if (FAILED(file_dialog->SetFolder(default_folder_shell_item.Get()))) + return false; + } + + return SUCCEEDED(file_dialog->SetFileName(default_file_name.value().c_str())); +} + +// Sets the file extension filters on the dialog. +bool SetFilters(IFileDialog* file_dialog, + const std::vector<FileFilterSpec>& filter, + int filter_index) { + if (filter.empty()) + return true; + + // A COMDLG_FILTERSPEC instance does not own any memory. |filter| must still + // be alive at the time the dialog is shown. + std::vector<COMDLG_FILTERSPEC> comdlg_filterspec(filter.size()); + + for (size_t i = 0; i < filter.size(); ++i) { + comdlg_filterspec[i].pszName = filter[i].description.c_str(); + comdlg_filterspec[i].pszSpec = filter[i].extension_spec.c_str(); + } + + return SUCCEEDED(file_dialog->SetFileTypes(comdlg_filterspec.size(), + comdlg_filterspec.data())) && + SUCCEEDED(file_dialog->SetFileTypeIndex(filter_index)); +} + +// Sets the requested |dialog_options|, making sure to keep the default values +// when not overwritten. +bool SetOptions(IFileDialog* file_dialog, DWORD dialog_options) { + // First retrieve the default options for a file dialog. + DWORD options; + if (FAILED(file_dialog->GetOptions(&options))) + return false; + + options |= dialog_options; + + return SUCCEEDED(file_dialog->SetOptions(options)); +} + +// Configures a |file_dialog| object given the specified parameters. +bool ConfigureDialog(IFileDialog* file_dialog, + const base::string16& title, + const base::string16& ok_button_label, + const base::FilePath& default_path, + const std::vector<FileFilterSpec>& filter, + int filter_index, + DWORD dialog_options) { + // Set title. + if (!title.empty()) { + if (FAILED(file_dialog->SetTitle(title.c_str()))) + return false; + } + + if (!ok_button_label.empty()) { + if (FAILED(file_dialog->SetOkButtonLabel(ok_button_label.c_str()))) + return false; + } + + return SetDefaultPath(file_dialog, default_path) && + SetOptions(file_dialog, dialog_options) && + SetFilters(file_dialog, filter, filter_index); +} // Prompt the user for location to save a file. // Callers should provide the filter string, and also a filter index. @@ -51,112 +133,127 @@ // returns the file name which contains the drive designator, path, file name, // and extension of the user selected file name. |def_ext| is the default // extension to give to the file if the user did not enter an extension. -bool SaveFileAsWithFilter(HWND owner, - const base::FilePath& default_path, - const base::string16& filter, - const base::string16& def_ext, - DWORD* index, - base::FilePath* path) { - DCHECK(path); - // Having an empty filter makes for a bad user experience. We should always - // specify a filter when saving. - DCHECK(!filter.empty()); - - ui::win::OpenFileName save_as(owner, OFN_OVERWRITEPROMPT | OFN_EXPLORER | - OFN_ENABLESIZING | OFN_NOCHANGEDIR | - OFN_PATHMUSTEXIST); - - if (!default_path.empty()) { - base::FilePath suggested_file_name; - base::FilePath suggested_directory; - if (IsDirectory(default_path)) { - suggested_directory = default_path; - } else { - suggested_directory = default_path.DirName(); - suggested_file_name = default_path.BaseName(); - // If the default_path is a root directory, |suggested_file_name| will be - // '\', and the call to GetSaveFileName below will fail. - if (suggested_file_name.value() == L"\\") - suggested_file_name.clear(); - } - save_as.SetInitialSelection(suggested_directory, suggested_file_name); +bool RunSaveFileDialog(HWND owner, + const base::string16& title, + const base::FilePath& default_path, + const std::vector<FileFilterSpec>& filter, + DWORD dialog_options, + const base::string16& def_ext, + int* filter_index, + base::FilePath* path) { + Microsoft::WRL::ComPtr<IFileSaveDialog> file_save_dialog; + if (FAILED(::CoCreateInstance(CLSID_FileSaveDialog, nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&file_save_dialog)))) { + return false; } - save_as.GetOPENFILENAME()->lpstrFilter = - filter.empty() ? nullptr : filter.c_str(); - save_as.GetOPENFILENAME()->nFilterIndex = *index; - save_as.GetOPENFILENAME()->lpstrDefExt = &def_ext[0]; + if (!ConfigureDialog(file_save_dialog.Get(), title, base::string16(), + default_path, filter, *filter_index, dialog_options)) { + return false; + } - BOOL success = ::GetSaveFileName(save_as.GetOPENFILENAME()); + file_save_dialog->SetDefaultExtension(def_ext.c_str()); + + HRESULT hr = file_save_dialog->Show(owner); BaseShellDialogImpl::DisableOwner(owner); - if (!success) + if (FAILED(hr)) return false; - // Return the user's choice. - *path = base::FilePath(save_as.GetOPENFILENAME()->lpstrFile); - *index = save_as.GetOPENFILENAME()->nFilterIndex; + UINT file_type_index; + if (FAILED(file_save_dialog->GetFileTypeIndex(&file_type_index))) + return false; - // Figure out what filter got selected. The filter index is 1-based. - base::string16 filter_selected; - if (*index > 0) { - std::vector<std::tuple<base::string16, base::string16>> filters = - ui::win::OpenFileName::GetFilters(save_as.GetOPENFILENAME()); - if (*index > filters.size()) - NOTREACHED() << "Invalid filter index."; - else - filter_selected = std::get<1>(filters[*index - 1]); + *filter_index = static_cast<int>(file_type_index); + + Microsoft::WRL::ComPtr<IShellItem> result; + if (FAILED(file_save_dialog->GetResult(&result))) + return false; + + base::win::ScopedCoMem<wchar_t> display_name; + if (FAILED(result->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, + &display_name))) { + return false; } - // Get the extension that was suggested to the user (when the Save As dialog - // was opened). - base::string16 suggested_ext = - GetExtensionWithoutLeadingDot(default_path.Extension()); - - // If we can't get the extension from the default_path, we use the default - // extension passed in. This is to cover cases like when saving a web page, - // where we get passed in a name without an extension and a default extension - // along with it. - if (suggested_ext.empty()) - suggested_ext = def_ext; - - *path = base::FilePath( - AppendExtensionIfNeeded(path->value(), filter_selected, suggested_ext)); + *path = base::FilePath(display_name.get()); return true; } -int CALLBACK BrowseCallbackProc(HWND window, - UINT message, - LPARAM parameter, - LPARAM data) { - if (message == BFFM_INITIALIZED) { - SelectFolderDialogOptions* options = - reinterpret_cast<SelectFolderDialogOptions*>(data); - if (options->is_upload) { - SendMessage(window, BFFM_SETOKTEXT, 0, - reinterpret_cast<LPARAM>( - l10n_util::GetStringUTF16( - IDS_SELECT_UPLOAD_FOLDER_DIALOG_UPLOAD_BUTTON) - .c_str())); - } - if (options->default_path) { - SendMessage(window, BFFM_SETSELECTION, TRUE, - reinterpret_cast<LPARAM>(options->default_path)); - } +// Runs an Open file dialog box, with similar semantics for input parameters as +// RunSaveFileDialog. +bool RunOpenFileDialog(HWND owner, + const base::string16& title, + const base::string16& ok_button_label, + const base::FilePath& default_path, + const std::vector<FileFilterSpec>& filter, + DWORD dialog_options, + int* filter_index, + std::vector<base::FilePath>* paths) { + Microsoft::WRL::ComPtr<IFileOpenDialog> file_open_dialog; + if (FAILED(::CoCreateInstance(CLSID_FileOpenDialog, nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&file_open_dialog)))) { + return false; } - return 0; + + if (!ConfigureDialog(file_open_dialog.Get(), title, ok_button_label, + default_path, filter, *filter_index, dialog_options)) { + return false; + } + + HRESULT hr = file_open_dialog->Show(owner); + BaseShellDialogImpl::DisableOwner(owner); + if (FAILED(hr)) + return false; + + UINT file_type_index; + if (FAILED(file_open_dialog->GetFileTypeIndex(&file_type_index))) + return false; + + *filter_index = static_cast<int>(file_type_index); + + Microsoft::WRL::ComPtr<IShellItemArray> selected_items; + if (FAILED(file_open_dialog->GetResults(&selected_items))) + return false; + + DWORD result_count; + if (FAILED(selected_items->GetCount(&result_count))) + return false; + + DCHECK(result_count == 1 || (dialog_options & FOS_ALLOWMULTISELECT) == 0); + + std::vector<base::FilePath> result(result_count); + for (DWORD i = 0; i < result_count; ++i) { + Microsoft::WRL::ComPtr<IShellItem> shell_item; + if (FAILED(selected_items->GetItemAt(i, &shell_item))) + return false; + + base::win::ScopedCoMem<wchar_t> display_name; + if (FAILED(shell_item->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, + &display_name))) { + return false; + } + + result[i] = base::FilePath(display_name.get()); + } + + // Only modify the out parameter if the enumeration didn't fail. + *paths = std::move(result); + return !paths->empty(); } // Runs a Folder selection dialog box, passes back the selected folder in |path| // and returns true if the user clicks OK. If the user cancels the dialog box // the value in |path| is not modified and returns false. Run on the dialog // thread. -bool RunSelectFolderDialog(HWND owner, - SelectFileDialog::Type type, - const base::string16& title, - const base::FilePath& default_path, - base::FilePath* path) { - base::win::AssertComInitialized(); - DCHECK(path); +bool ExecuteSelectFolder(HWND owner, + SelectFileDialog::Type type, + const base::string16& title, + const base::FilePath& default_path, + std::vector<base::FilePath>* paths) { + DCHECK(paths); + base::string16 new_title = title; if (new_title.empty() && type == SelectFileDialog::SELECT_UPLOAD_FOLDER) { // If it's for uploading don't use default dialog title to @@ -165,123 +262,65 @@ l10n_util::GetStringUTF16(IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE); } - wchar_t dir_buffer[MAX_PATH + 1]; - - bool result = false; - BROWSEINFO browse_info = {}; - browse_info.hwndOwner = owner; - browse_info.lpszTitle = new_title.c_str(); - browse_info.pszDisplayName = dir_buffer; - browse_info.ulFlags = BIF_USENEWUI | BIF_RETURNONLYFSDIRS; - - // If uploading or a default path was provided, update the BROWSEINFO - // and set the callback function for the dialog so the strings can be set in - // the callback. - SelectFolderDialogOptions dialog_options = {}; - if (!default_path.empty()) - dialog_options.default_path = default_path.value().c_str(); - dialog_options.is_upload = type == SelectFileDialog::SELECT_UPLOAD_FOLDER; - if (type == SelectFileDialog::SELECT_UPLOAD_FOLDER || - type == SelectFileDialog::SELECT_EXISTING_FOLDER) { - browse_info.ulFlags |= BIF_NONEWFOLDERBUTTON; - } - if (dialog_options.is_upload || dialog_options.default_path) { - browse_info.lParam = reinterpret_cast<LPARAM>(&dialog_options); - browse_info.lpfn = &BrowseCallbackProc; + base::string16 ok_button_label; + if (type == SelectFileDialog::SELECT_UPLOAD_FOLDER) { + ok_button_label = l10n_util::GetStringUTF16( + IDS_SELECT_UPLOAD_FOLDER_DIALOG_UPLOAD_BUTTON); } - LPITEMIDLIST list = SHBrowseForFolder(&browse_info); - BaseShellDialogImpl::DisableOwner(owner); - if (list) { - STRRET out_dir_buffer = {}; - out_dir_buffer.uType = STRRET_WSTR; - Microsoft::WRL::ComPtr<IShellFolder> shell_folder; - if (SUCCEEDED(SHGetDesktopFolder(&shell_folder))) { - HRESULT hr = shell_folder->GetDisplayNameOf(list, SHGDN_FORPARSING, - &out_dir_buffer); - if (SUCCEEDED(hr) && out_dir_buffer.uType == STRRET_WSTR) { - *path = base::FilePath(out_dir_buffer.pOleStr); - CoTaskMemFree(out_dir_buffer.pOleStr); - result = true; - } else { - // Use old way if we don't get what we want. - wchar_t old_out_dir_buffer[MAX_PATH + 1]; - if (SHGetPathFromIDList(list, old_out_dir_buffer)) { - *path = base::FilePath(old_out_dir_buffer); - result = true; - } - } + DWORD dialog_options = FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM; - // According to MSDN, Win2000 will not resolve shortcuts, so we do it - // ourselves. - base::win::ResolveShortcut(*path, path, nullptr); - } - CoTaskMemFree(list); - } - return result; + std::vector<FileFilterSpec> no_filter; + int filter_index = 0; + + return RunOpenFileDialog(owner, new_title, ok_button_label, default_path, + no_filter, dialog_options, &filter_index, paths); } -// Runs an Open file dialog box, with similar semantics for input parameters as -// RunSelectFolderDialog. -bool RunOpenFileDialog(HWND owner, - const base::string16& title, - const base::FilePath& default_path, - const base::string16& filter, - base::FilePath* path) { - // We use OFN_NOCHANGEDIR so that the user can rename or delete the - // directory without having to close Chrome first. - ui::win::OpenFileName ofn(owner, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR); - if (!default_path.empty()) { - if (IsDirectory(default_path)) - ofn.SetInitialSelection(default_path, base::FilePath()); - else - ofn.SetInitialSelection(default_path.DirName(), default_path.BaseName()); - } - if (!filter.empty()) - ofn.GetOPENFILENAME()->lpstrFilter = filter.c_str(); - - BOOL success = ::GetOpenFileName(ofn.GetOPENFILENAME()); - BaseShellDialogImpl::DisableOwner(owner); - if (success) - *path = ofn.GetSingleResult(); - return success; +bool ExecuteSelectSingleFile(HWND owner, + const base::string16& title, + const base::FilePath& default_path, + const std::vector<FileFilterSpec>& filter, + int* filter_index, + std::vector<base::FilePath>* paths) { + // Note: The title is not passed down for historical reasons. + // TODO(pmonette): Figure out if it's a worthwhile improvement. + return RunOpenFileDialog(owner, base::string16(), base::string16(), + default_path, filter, 0, filter_index, paths); } -// Runs an Open file dialog box that supports multi-select, with similar -// semantics for input parameters as RunOpenFileDialog. -bool RunOpenMultiFileDialog(HWND owner, - const base::string16& title, - const base::FilePath& default_path, - const base::string16& filter, - std::vector<base::FilePath>* paths) { - // We use OFN_NOCHANGEDIR so that the user can rename or delete the directory - // without having to close Chrome first. - ui::win::OpenFileName ofn(owner, OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | - OFN_EXPLORER | OFN_HIDEREADONLY | - OFN_ALLOWMULTISELECT | OFN_NOCHANGEDIR); - if (!default_path.empty()) { - if (IsDirectory(default_path)) - ofn.SetInitialSelection(default_path, base::FilePath()); - else - ofn.SetInitialSelection(default_path.DirName(), base::FilePath()); - } - if (!filter.empty()) - ofn.GetOPENFILENAME()->lpstrFilter = filter.c_str(); +bool ExecuteSelectMultipleFile(HWND owner, + const base::string16& title, + const base::FilePath& default_path, + const std::vector<FileFilterSpec>& filter, + int* filter_index, + std::vector<base::FilePath>* paths) { + DWORD dialog_options = FOS_ALLOWMULTISELECT; - base::FilePath directory; - std::vector<base::FilePath> filenames; + // Note: The title is not passed down for historical reasons. + // TODO(pmonette): Figure out if it's a worthwhile improvement. + return RunOpenFileDialog(owner, base::string16(), base::string16(), + default_path, filter, dialog_options, filter_index, + paths); +} - BOOL success = ::GetOpenFileName(ofn.GetOPENFILENAME()); - BaseShellDialogImpl::DisableOwner(owner); - if (success) - ofn.GetResult(&directory, &filenames); +bool ExecuteSaveFile(HWND owner, + const base::FilePath& default_path, + const std::vector<FileFilterSpec>& filter, + const base::string16& def_ext, + int* filter_index, + base::FilePath* path) { + DCHECK(path); + // Having an empty filter for a bad user experience. We should always + // specify a filter when saving. + DCHECK(!filter.empty()); - for (std::vector<base::FilePath>::iterator it = filenames.begin(); - it != filenames.end(); ++it) { - paths->push_back(directory.Append(*it)); - } + DWORD dialog_options = FOS_OVERWRITEPROMPT; - return !paths->empty(); + // Note: The title is not passed down for historical reasons. + // TODO(pmonette): Figure out if it's a worthwhile improvement. + return RunSaveFileDialog(owner, base::string16(), default_path, filter, + dialog_options, def_ext, filter_index, path); } } // namespace @@ -330,45 +369,39 @@ SelectFileDialog::Type type, const base::string16& title, const base::FilePath& default_path, - const base::string16& filter, + const std::vector<FileFilterSpec>& filter, int file_type_index, const base::string16& default_extension, HWND owner) { + base::win::AssertComInitialized(); std::vector<base::FilePath> paths; - - DWORD filter_index = file_type_index; - switch (type) { case SelectFileDialog::SELECT_FOLDER: case SelectFileDialog::SELECT_UPLOAD_FOLDER: - case SelectFileDialog::SELECT_EXISTING_FOLDER: { - base::FilePath path; - if (RunSelectFolderDialog(owner, type, title, default_path, &path)) - paths.push_back(std::move(path)); + case SelectFileDialog::SELECT_EXISTING_FOLDER: + ExecuteSelectFolder(owner, type, title, default_path, &paths); break; - } case SelectFileDialog::SELECT_SAVEAS_FILE: { base::FilePath path; - if (SaveFileAsWithFilter(owner, default_path, filter, default_extension, - &filter_index, &path)) { + if (ExecuteSaveFile(owner, default_path, filter, default_extension, + &file_type_index, &path)) { paths.push_back(std::move(path)); } break; } - case SelectFileDialog::SELECT_OPEN_FILE: { - base::FilePath path; - if (RunOpenFileDialog(owner, title, default_path, filter, &path)) - paths.push_back(std::move(path)); + case SelectFileDialog::SELECT_OPEN_FILE: + ExecuteSelectSingleFile(owner, title, default_path, filter, + &file_type_index, &paths); break; - } case SelectFileDialog::SELECT_OPEN_MULTI_FILE: - RunOpenMultiFileDialog(owner, title, default_path, filter, &paths); + ExecuteSelectMultipleFile(owner, title, default_path, filter, + &file_type_index, &paths); break; case SelectFileDialog::SELECT_NONE: NOTREACHED(); } - return std::make_pair(std::move(paths), filter_index); + return std::make_pair(std::move(paths), file_type_index); } } // namespace ui
diff --git a/ui/shell_dialogs/execute_select_file_win.h b/ui/shell_dialogs/execute_select_file_win.h index 1a9c3ac..0fa7d93 100644 --- a/ui/shell_dialogs/execute_select_file_win.h +++ b/ui/shell_dialogs/execute_select_file_win.h
@@ -25,6 +25,16 @@ const base::string16& filter_selected, const base::string16& suggested_ext); +// Describes a filter for a file dialog. +struct FileFilterSpec { + // A human readable description of this filter. E.g. "HTML Files." + base::string16 description; + // The different extensions that map to this spec. This is a semicolon- + // separated list of extensions that contains a wildcard and the separator. + // E.g. "*.html;*.htm" + base::string16 extension_spec; +}; + // Shows the file selection dialog modal to |owner| returns the selected // file(s) and file type index via the return value. The file path vector will // be empty on failure. @@ -33,7 +43,7 @@ SelectFileDialog::Type type, const base::string16& title, const base::FilePath& default_path, - const base::string16& filter, + const std::vector<FileFilterSpec>& filter, int file_type_index, const base::string16& default_extension, HWND owner);
diff --git a/ui/shell_dialogs/run_all_unittests.cc b/ui/shell_dialogs/run_all_unittests.cc index f6cd8cfe4..f5d80c1 100644 --- a/ui/shell_dialogs/run_all_unittests.cc +++ b/ui/shell_dialogs/run_all_unittests.cc
@@ -53,8 +53,10 @@ // Setup resource bundle. ui::MaterialDesignController::Initialize(); ui::RegisterPathProvider(); - ui::ResourceBundle::InitSharedInstanceWithLocale( - "en-US", nullptr, ui::ResourceBundle::LOAD_COMMON_RESOURCES); + + base::FilePath ui_test_pak_path; + base::PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path); + ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path); } void ShellDialogsTestSuite::Shutdown() {
diff --git a/ui/shell_dialogs/select_file_dialog_win.cc b/ui/shell_dialogs/select_file_dialog_win.cc index a8f60a4a..aecd81c 100644 --- a/ui/shell_dialogs/select_file_dialog_win.cc +++ b/ui/shell_dialogs/select_file_dialog_win.cc
@@ -49,23 +49,17 @@ return false; } -// Set up a filter for a Save/Open dialog, which will consist of |file_ext| file -// extensions (internally separated by semicolons), |ext_desc| as the text -// descriptions of the |file_ext| types (optional), and (optionally) the default -// 'All Files' view. The purpose of the filter is to show only files of a -// particular type in a Windows Save/Open dialog box. The resulting filter is -// returned. The filters created here are: +// Set up a filter for a Save/Open dialog, |ext_desc| as the text descriptions +// of the |file_ext| types (optional), and (optionally) the default 'All Files' +// view. The purpose of the filter is to show only files of a particular type in +// a Windows Save/Open dialog box. The resulting filter is returned. The filter +// created here are: // 1. only files that have 'file_ext' as their extension // 2. all files (only added if 'include_all_files' is true) -// Example: -// file_ext: { "*.txt", "*.htm;*.html" } -// ext_desc: { "Text Document" } -// returned: "Text Document\0*.txt\0HTML Document\0*.htm;*.html\0" -// "All Files\0*.*\0\0" (in one big string) // If a description is not provided for a file extension, it will be retrieved // from the registry. If the file extension does not exist in the registry, it // will be omitted from the filter, as it is likely a bogus extension. -base::string16 FormatFilterForExtensions( +std::vector<FileFilterSpec> FormatFilterForExtensions( const std::vector<base::string16>& file_ext, const std::vector<base::string16>& ext_desc, bool include_all_files) { @@ -78,7 +72,11 @@ if (file_ext.empty()) include_all_files = true; - base::string16 result; + std::vector<FileFilterSpec> result; + + // Precompute the final size of the resulting vector. + size_t final_size = file_ext.size() + (include_all_files ? 1 : 0); + result.resize(final_size); for (size_t i = 0; i < file_ext.size(); ++i) { base::string16 ext = file_ext[i]; @@ -119,16 +117,12 @@ desc = L"*." + ext_name; } - result.append(desc.c_str(), desc.size() + 1); // Append NULL too. - result.append(ext.c_str(), ext.size() + 1); + result[i] = {desc, ext}; } - if (include_all_files) { - result.append(all_desc.c_str(), all_desc.size() + 1); - result.append(all_ext.c_str(), all_ext.size() + 1); - } + if (include_all_files) + result.back() = {all_desc, all_ext}; - result.append(1, '\0'); // Double NULL required. return result; } @@ -171,18 +165,13 @@ void* params, std::pair<std::vector<base::FilePath>, int> result); - // The callback function for when the select folder dialog is opened. - static int CALLBACK BrowseCallbackProc(HWND window, - UINT message, - LPARAM parameter, - LPARAM data); - bool HasMultipleFileTypeChoicesImpl() override; // Returns the filter to be used while displaying the open/save file dialog. // This is computed from the extensions for the file types being opened. // |file_types| can be NULL in which case the returned filter will be empty. - static base::string16 GetFilterForFileTypes(const FileTypeInfo* file_types); + static std::vector<FileFilterSpec> GetFilterForFileTypes( + const FileTypeInfo* file_types); bool has_multiple_file_type_choices_; ExecuteSelectFileCallback execute_select_file_callback_; @@ -213,7 +202,7 @@ has_multiple_file_type_choices_ = file_types ? file_types->extensions.size() > 1 : true; - base::string16 filter = GetFilterForFileTypes(file_types); + std::vector<FileFilterSpec> filter = GetFilterForFileTypes(file_types); HWND owner = owning_window && owning_window->GetRootWindow() ? owning_window->GetHost()->GetAcceleratedWidget() : NULL; @@ -282,10 +271,10 @@ } // static -base::string16 SelectFileDialogImpl::GetFilterForFileTypes( +std::vector<FileFilterSpec> SelectFileDialogImpl::GetFilterForFileTypes( const FileTypeInfo* file_types) { if (!file_types) - return base::string16(); + return std::vector<FileFilterSpec>(); std::vector<base::string16> exts; for (size_t i = 0; i < file_types->extensions.size(); ++i) {
diff --git a/ui/shell_dialogs/select_file_dialog_win.h b/ui/shell_dialogs/select_file_dialog_win.h index 5b45d30b..a09c8955b 100644 --- a/ui/shell_dialogs/select_file_dialog_win.h +++ b/ui/shell_dialogs/select_file_dialog_win.h
@@ -22,13 +22,14 @@ namespace ui { class SelectFilePolicy; +struct FileFilterSpec; using ExecuteSelectFileCallback = base::RepeatingCallback<std::pair<std::vector<base::FilePath>, int>( SelectFileDialog::Type type, const base::string16& title, const base::FilePath& default_path, - const base::string16& filter, + const std::vector<FileFilterSpec>& filter, int file_type_index, const base::string16& default_extension, HWND owner)>;
diff --git a/ui/shell_dialogs/select_file_dialog_win_unittest.cc b/ui/shell_dialogs/select_file_dialog_win_unittest.cc index 5cccfb2..2f8d4f3 100644 --- a/ui/shell_dialogs/select_file_dialog_win_unittest.cc +++ b/ui/shell_dialogs/select_file_dialog_win_unittest.cc
@@ -29,7 +29,7 @@ namespace { // The default title for the various dialogs. -constexpr wchar_t kSelectFolderDefaultTitle[] = L"Browse For Folder"; +constexpr wchar_t kSelectFolderDefaultTitle[] = L"Select Folder"; constexpr wchar_t kSelectFileDefaultTitle[] = L"Open"; constexpr wchar_t kSaveFileDefaultTitle[] = L"Save As"; @@ -237,9 +237,8 @@ } } -// Folder selection is implemented using a different API. The only difference -// is that the title can be set but it doesn't change the title of the dialog, -// but sets an extra text label at the top of the dialog. +// When using SELECT_UPLOAD_FOLDER, the title and the ok button strings are +// modified to put emphasis on the fact that the whole folder will be uploaded. TEST_F(SelectFileDialogWinTest, UploadFolderCheckStrings) { base::ScopedTempDir scoped_temp_dir; ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir()); @@ -251,15 +250,13 @@ base::string16(), default_path, nullptr, 0, L"", native_window(), nullptr); - // Wait for the window to open. The title of the dialog is still the default. - HWND window = WaitForDialogWindow(kSelectFolderDefaultTitle); + // Wait for the window to open and make sure the window title was changed from + // the default title for a regular select folder operation. + HWND window = WaitForDialogWindow( + l10n_util::GetStringUTF16(IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE)); + EXPECT_NE(GetWindowTitle(window), kSelectFolderDefaultTitle); - // But the dialog contains a extra text label that contains a custom title - // set by Chrome. - EXPECT_EQ(GetDialogItemText(window, 0), - l10n_util::GetStringUTF16(IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE)); - // The OK button is also modified to put emphasis on the fact that the whole - // folder will be uploaded. + // Check the OK button text. EXPECT_EQ( GetDialogItemText(window, 1), l10n_util::GetStringUTF16(IDS_SELECT_UPLOAD_FOLDER_DIALOG_UPLOAD_BUTTON));
diff --git a/webrunner/net_http/BUILD.gn b/webrunner/net_http/BUILD.gn index 5c51d980..1c36b48 100644 --- a/webrunner/net_http/BUILD.gn +++ b/webrunner/net_http/BUILD.gn
@@ -10,15 +10,14 @@ import("//testing/test.gni") import("//tools/grit/repack.gni") -executable("http_service") { +component("http_lib") { sources = [ - "service/http_service_impl.cc", - "service/http_service_impl.h", - "service/http_service_main.cc", - "service/url_loader_impl.cc", - "service/url_loader_impl.h", + "http_service_impl.cc", + "http_service_impl.h", + "url_loader_impl.cc", + "url_loader_impl.h", ] - deps = [ + public_deps = [ "//base:base", "//net:net", "//third_party/fuchsia-sdk/sdk:oldhttp", @@ -26,6 +25,15 @@ ] } +executable("http_service") { + sources = [ + "http_service_main.cc", + ] + deps = [ + ":http_lib", + ] +} + fuchsia_package("http_pkg") { binary = ":http_service" package_name_override = "http" @@ -36,3 +44,18 @@ package = ":http_pkg" package_name_override = "http" } + +test("http_service_tests") { + sources = [ + "http_service_test_main.cc", + "http_service_unittest.cc", + ] + deps = [ + ":http_lib", + "//net:test_support", + "//testing/gtest", + ] + data = [ + "testdata/", + ] +}
diff --git a/webrunner/net_http/service/http_service_impl.cc b/webrunner/net_http/http_service_impl.cc similarity index 77% rename from webrunner/net_http/service/http_service_impl.cc rename to webrunner/net_http/http_service_impl.cc index 36027dd..25145da 100644 --- a/webrunner/net_http/service/http_service_impl.cc +++ b/webrunner/net_http/http_service_impl.cc
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "webrunner/net_http/service/http_service_impl.h" +#include "webrunner/net_http/http_service_impl.h" #include "net/url_request/url_request_context_builder.h" -#include "webrunner/net_http/service/url_loader_impl.h" +#include "webrunner/net_http/url_loader_impl.h" -namespace net { +namespace net_http { HttpServiceImpl::HttpServiceImpl() { // TODO: Set the right options in the URLRequestContextBuilder. @@ -19,8 +19,8 @@ fidl::InterfaceRequest<fuchsia::net::oldhttp::URLLoader> request) { // The URLLoaderImpl objects lifespan is tied to their binding, which is set // in their constructor. - URLRequestContextBuilder builder; + net::URLRequestContextBuilder builder; new URLLoaderImpl(builder.Build(), std::move(request)); } -} // namespace net +} // namespace net_http
diff --git a/webrunner/net_http/service/http_service_impl.h b/webrunner/net_http/http_service_impl.h similarity index 77% rename from webrunner/net_http/service/http_service_impl.h rename to webrunner/net_http/http_service_impl.h index ed1c6fa..1742c7d 100644 --- a/webrunner/net_http/service/http_service_impl.h +++ b/webrunner/net_http/http_service_impl.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef WEBRUNNER_NET_HTTP_SERVICE_HTTP_SERVICE_IMPL_H_ -#define WEBRUNNER_NET_HTTP_SERVICE_HTTP_SERVICE_IMPL_H_ +#ifndef WEBRUNNER_NET_HTTP_HTTP_SERVICE_IMPL_H_ +#define WEBRUNNER_NET_HTTP_HTTP_SERVICE_IMPL_H_ #include <fuchsia/net/oldhttp/cpp/fidl.h> #include <lib/fidl/cpp/interface_request.h> #include "net/url_request/url_request_context.h" -namespace net { +namespace net_http { // Implements the Fuchsia HttpService API, using the //net library. class HttpServiceImpl : public ::fuchsia::net::oldhttp::HttpService { @@ -27,6 +27,6 @@ DISALLOW_COPY_AND_ASSIGN(HttpServiceImpl); }; -} // namespace net +} // namespace net_http -#endif // WEBRUNNER_NET_HTTP_SERVICE_HTTP_SERVICE_IMPL_H_ +#endif // WEBRUNNER_NET_HTTP_HTTP_SERVICE_IMPL_H_
diff --git a/webrunner/net_http/service/http_service_main.cc b/webrunner/net_http/http_service_main.cc similarity index 93% rename from webrunner/net_http/service/http_service_main.cc rename to webrunner/net_http/http_service_main.cc index d22e460..76c9403 100644 --- a/webrunner/net_http/service/http_service_main.cc +++ b/webrunner/net_http/http_service_main.cc
@@ -10,7 +10,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/task/task_scheduler/task_scheduler.h" -#include "webrunner/net_http/service/http_service_impl.h" +#include "webrunner/net_http/http_service_impl.h" int main(int argc, char** argv) { // Instantiate various global structures. @@ -23,7 +23,7 @@ // publish the HTTP service into it. base::fuchsia::ServiceDirectory* directory = base::fuchsia::ServiceDirectory::GetDefault(); - net::HttpServiceImpl http_service; + net_http::HttpServiceImpl http_service; base::fuchsia::ScopedServiceBinding<::fuchsia::net::oldhttp::HttpService> binding(directory, &http_service);
diff --git a/webrunner/net_http/http_service_test_main.cc b/webrunner/net_http/http_service_test_main.cc new file mode 100644 index 0000000..9bc6b476 --- /dev/null +++ b/webrunner/net_http/http_service_test_main.cc
@@ -0,0 +1,21 @@ +// 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/at_exit.h" +#include "base/bind.h" +#include "base/command_line.h" +#include "base/message_loop/message_loop.h" +#include "base/task/task_scheduler/task_scheduler.h" +#include "testing/gtest/include/gtest/gtest.h" + +int main(int argc, char** argv) { + // Instantiate various global structures. + base::TaskScheduler::CreateAndStartWithDefaultParams("HTTP Service Test"); + base::CommandLine::Init(argc, argv); + base::MessageLoopForIO loop; + base::AtExitManager exit_manager; + + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}
diff --git a/webrunner/net_http/http_service_unittest.cc b/webrunner/net_http/http_service_unittest.cc new file mode 100644 index 0000000..4a1f7e2 --- /dev/null +++ b/webrunner/net_http/http_service_unittest.cc
@@ -0,0 +1,406 @@ +// 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 <fuchsia/net/oldhttp/cpp/fidl.h> +#include <lib/fidl/cpp/binding.h> + +#include "base/fuchsia/component_context.h" +#include "base/fuchsia/scoped_service_binding.h" +#include "base/fuchsia/service_directory.h" +#include "base/run_loop.h" +#include "net/base/net_errors.h" +#include "net/test/embedded_test_server/default_handlers.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "webrunner/net_http/http_service_impl.h" +#include "webrunner/net_http/url_loader_impl.h" + +namespace net_http { + +namespace oldhttp = ::fuchsia::net::oldhttp; + +namespace { + +const base::FilePath::CharType kTestFilePath[] = + FILE_PATH_LITERAL("webrunner/net_http/testdata"); + +// Capacity, in bytes, for buffers used to read data off the URLResponse. +const size_t kBufferCapacity = 1024; + +using ResponseHeaders = std::multimap<std::string, std::string>; + +class HttpServiceTest : public ::testing::Test { + public: + HttpServiceTest() : binding_(&http_service_server_) { + // Initialize the test server. + test_server_.AddDefaultHandlers( + base::FilePath(FILE_PATH_LITERAL(kTestFilePath))); + net::test_server::RegisterDefaultHandlers(&test_server_); + } + + protected: + void SetUp() override { + ASSERT_TRUE(test_server_.Start()); + + // Bind the service with the client-side interface. + binding_.Bind(http_service_interface_.NewRequest()); + } + + void TearDown() override { + // Disconnect the client and wait for the service to shut down. + base::RunLoop run_loop; + binding_.set_error_handler([&run_loop]() { run_loop.Quit(); }); + http_service_interface_.Unbind(); + run_loop.Run(); + binding_.set_error_handler(nullptr); + + // Check there are no pending requests. + EXPECT_EQ(URLLoaderImpl::GetNumActiveRequestsForTests(), 0); + } + + // Helper method to start |request| on |url_loader| + void ExecuteRequest(const oldhttp::URLLoaderPtr& url_loader, + oldhttp::URLRequest request) { + base::RunLoop run_loop; + + url_loader->Start(std::move(request), + [this, &run_loop](oldhttp::URLResponse response) { + run_loop.Quit(); + url_response_ = std::move(response); + }); + run_loop.Run(); + } + + net::EmbeddedTestServer* http_test_server() { return &test_server_; } + oldhttp::HttpServicePtr& http_service() { return http_service_interface_; } + oldhttp::URLResponse& url_response() { return url_response_; } + + private: + net::EmbeddedTestServer test_server_; + + HttpServiceImpl http_service_server_; + oldhttp::HttpServicePtr http_service_interface_; + fidl::Binding<oldhttp::HttpService> binding_; + oldhttp::URLResponse url_response_; + + DISALLOW_COPY_AND_ASSIGN(HttpServiceTest); +}; + +void CheckResponseStream(const oldhttp::URLResponse& response, + const std::string& expected_response) { + EXPECT_TRUE(response.body->is_stream()); + + zx::socket stream = std::move(response.body->stream()); + size_t offset = 0; + + while (true) { + std::array<char, kBufferCapacity> buffer; + size_t size = 0; + zx_status_t result = stream.read(0, buffer.data(), kBufferCapacity, &size); + + if (result == ZX_ERR_SHOULD_WAIT) { + zx_signals_t observed; + stream.wait_one(ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, + zx::time::infinite(), &observed); + if (observed & ZX_SOCKET_READABLE) { + // Attempt to read again now that the socket is readable. + continue; + } else if (observed & ZX_SOCKET_PEER_CLOSED) { + // Done reading. + break; + } else { + NOTREACHED(); + } + } else if (result == ZX_ERR_PEER_CLOSED) { + // Done reading. + break; + } + EXPECT_EQ(result, ZX_OK); + + EXPECT_TRUE(std::equal(buffer.begin(), buffer.begin() + size, + expected_response.begin() + offset)); + offset += size; + } + + EXPECT_EQ(offset, expected_response.length()); +} + +void CheckResponseBuffer(const oldhttp::URLResponse& response, + const std::string& expected_response) { + EXPECT_TRUE(response.body->is_buffer()); + + fuchsia::mem::Buffer mem_buffer = std::move(response.body->buffer()); + size_t response_size = mem_buffer.size; + EXPECT_EQ(mem_buffer.size, expected_response.length()); + + std::array<char, kBufferCapacity> buffer; + size_t offset = 0; + while (offset != mem_buffer.size) { + size_t length = std::min(response_size - offset, kBufferCapacity); + zx_status_t result = mem_buffer.vmo.read(buffer.data(), offset, length); + EXPECT_EQ(result, ZX_OK); + + EXPECT_TRUE(std::equal(buffer.begin(), buffer.begin() + response_size, + expected_response.begin() + offset)); + offset += response_size; + } + + EXPECT_EQ(offset, expected_response.length()); +} + +void CheckResponseHeaders(const oldhttp::URLResponse& response, + ResponseHeaders* expected_headers) { + for (auto& header : response.headers.get()) { + const std::string header_name = header.name->data(); + const std::string header_value = header.value->data(); + auto iter = std::find_if(expected_headers->begin(), expected_headers->end(), + [&header_name, &header_value](auto& elt) -> bool { + return elt.first.compare(header_name) == 0 && + elt.second.compare(header_value) == 0; + }); + EXPECT_NE(iter, expected_headers->end()) + << "Unexpected header: \"" << header_name << "\" with value: \"" + << header_value << "\"."; + if (iter != expected_headers->end()) { + expected_headers->erase(iter); + } + } + EXPECT_TRUE(expected_headers->empty()); +} + +} // namespace + +// Check a basic end-to-end request resolution with the response being streamed +// is handled properly. +TEST_F(HttpServiceTest, BasicRequestStream) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = http_test_server()->GetURL("/simple.html").spec(); + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().status_code, 200u); + CheckResponseStream(url_response(), "hello"); +} + +// Check a basic end-to-end request resolution with the response being +// buffered is handled properly. +TEST_F(HttpServiceTest, BasicRequestBuffer) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = http_test_server()->GetURL("/simple.html").spec(); + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::BUFFER; + + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().status_code, 200u); + CheckResponseBuffer(url_response(), "hello"); +} + +// Check network request headers are received properly. +TEST_F(HttpServiceTest, RequestWithHeaders) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = http_test_server()->GetURL("/with-headers.html").spec(); + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().status_code, 200u); + CheckResponseStream( + url_response(), + "This file is boring; all the action's in the .mock-http-headers.\n"); + ResponseHeaders expected_headers = { + {"Cache-Control", "private"}, + {"Content-Type", "text/html; charset=ISO-8859-1"}, + {"X-Multiple-Entries", "a"}, + {"X-Multiple-Entries", "b"}, + }; + CheckResponseHeaders(url_response(), &expected_headers); +} + +// Check duplicate network request headers are received properly. +TEST_F(HttpServiceTest, RequestWithDuplicateHeaders) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = + http_test_server()->GetURL("/with-duplicate-headers.html").spec(); + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().status_code, 200u); + CheckResponseStream( + url_response(), + "This file is boring; all the action's in the .mock-http-headers.\n"); + ResponseHeaders expected_headers = { + {"Cache-Control", "private"}, + {"Content-Type", "text/html; charset=ISO-8859-1"}, + {"X-Multiple-Entries", "a"}, + {"X-Multiple-Entries", "a"}, + {"X-Multiple-Entries", "b"}, + }; + CheckResponseHeaders(url_response(), &expected_headers); +} + +// Check a request with automatic redirect resolution is handled properly. +TEST_F(HttpServiceTest, AutoRedirect) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = http_test_server()->GetURL("/redirect-test.html").spec(); + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + request.auto_follow_redirects = true; + + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().status_code, 200u); + EXPECT_EQ(url_response().url, + http_test_server()->GetURL("/with-headers.html").spec()); +} + +// Check a request with manual redirect resolution is handled properly. +TEST_F(HttpServiceTest, ManualRedirect) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + std::string request_url = + http_test_server()->GetURL("/redirect-test.html").spec(); + + oldhttp::URLRequest request; + request.url = request_url; + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + request.auto_follow_redirects = false; + + ExecuteRequest(url_loader, std::move(request)); + std::string final_url = + http_test_server()->GetURL("/with-headers.html").spec(); + EXPECT_EQ(url_response().status_code, 302u); + EXPECT_EQ(url_response().url, request_url); + EXPECT_EQ(url_response().redirect_url, final_url); + + base::RunLoop run_loop; + url_loader->FollowRedirect( + [&run_loop, &final_url](oldhttp::URLResponse response) { + EXPECT_EQ(response.status_code, 200u); + EXPECT_EQ(response.url, final_url); + run_loop.Quit(); + }); + run_loop.Run(); +} + +// Check HTTP error codes are properly populated. +TEST_F(HttpServiceTest, HttpErrorCode) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = http_test_server() + ->base_url() + .Resolve("/non_existent_cooper.html") + .spec(); + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().status_code, 404u); +} + +// Check network error codes are properly populated. +TEST_F(HttpServiceTest, InvalidURL) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = "ht\\tp://test.test/"; + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().error->code, net::ERR_INVALID_URL); +} + +// Ensure the service can handle multiple concurrent requests. +TEST_F(HttpServiceTest, MultipleRequests) { + oldhttp::URLLoaderPtr url_loaders[100]; + for (int i = 0; i < 100; i++) { + http_service()->CreateURLLoader(url_loaders[i].NewRequest()); + } + + base::RunLoop run_loop; + int requests_done = 0; + for (int i = 0; i < 100; i++) { + oldhttp::URLRequest request; + request.url = http_test_server()->GetURL("/simple.html").spec(); + request.method = "GET"; + request.response_body_mode = (i % 2) == 0 + ? oldhttp::ResponseBodyMode::STREAM + : oldhttp::ResponseBodyMode::BUFFER; + url_loaders[i]->Start( + std::move(request), + [&requests_done, &run_loop](oldhttp::URLResponse response) { + EXPECT_EQ(response.status_code, 200u); + if (response.body->is_buffer()) { + CheckResponseBuffer(response, "hello"); + } else { + CheckResponseStream(response, "hello"); + } + requests_done++; + if (requests_done == 100) { + // Last request signals the run_loop to exit. + run_loop.Quit(); + } + }); + } + run_loop.Run(); +} + +// Check QueryStatus works as expected when a request is loading. +// Also checks the request is properly deleted after the binding is destroyed. +TEST_F(HttpServiceTest, QueryStatus) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = http_test_server()->GetURL("/hung-after-headers").spec(); + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + + // In socket mode, we should still get the response headers. + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().status_code, 200u); + + base::RunLoop run_loop; + url_loader->QueryStatus([&run_loop](oldhttp::URLLoaderStatus status) { + EXPECT_TRUE(status.is_loading); + run_loop.Quit(); + }); + run_loop.Run(); +} + +// Check the response error is properly set if the server disconnects early. +TEST_F(HttpServiceTest, CloseSocket) { + oldhttp::URLLoaderPtr url_loader; + http_service()->CreateURLLoader(url_loader.NewRequest()); + + oldhttp::URLRequest request; + request.url = http_test_server()->GetURL("/close-socket").spec(); + request.method = "GET"; + request.response_body_mode = oldhttp::ResponseBodyMode::STREAM; + + ExecuteRequest(url_loader, std::move(request)); + EXPECT_EQ(url_response().error->code, net::ERR_EMPTY_RESPONSE); +} + +} // namespace net_http
diff --git a/webrunner/net_http/testdata/redirect-test.html b/webrunner/net_http/testdata/redirect-test.html new file mode 100644 index 0000000..ce01362 --- /dev/null +++ b/webrunner/net_http/testdata/redirect-test.html
@@ -0,0 +1 @@ +hello
diff --git a/webrunner/net_http/testdata/redirect-test.html.mock-http-headers b/webrunner/net_http/testdata/redirect-test.html.mock-http-headers new file mode 100644 index 0000000..c59ef58 --- /dev/null +++ b/webrunner/net_http/testdata/redirect-test.html.mock-http-headers
@@ -0,0 +1,3 @@ +HTTP/1.1 302 Redirect +Location: with-headers.html +Cache-Control: max-age=10000
diff --git a/webrunner/net_http/testdata/simple.html b/webrunner/net_http/testdata/simple.html new file mode 100644 index 0000000..ce01362 --- /dev/null +++ b/webrunner/net_http/testdata/simple.html
@@ -0,0 +1 @@ +hello
diff --git a/webrunner/net_http/testdata/simple.html.mock-http-headers b/webrunner/net_http/testdata/simple.html.mock-http-headers new file mode 100644 index 0000000..be8f7b5 --- /dev/null +++ b/webrunner/net_http/testdata/simple.html.mock-http-headers
@@ -0,0 +1,3 @@ +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 5
diff --git a/webrunner/net_http/testdata/with-duplicate-headers.html b/webrunner/net_http/testdata/with-duplicate-headers.html new file mode 100644 index 0000000..364322d --- /dev/null +++ b/webrunner/net_http/testdata/with-duplicate-headers.html
@@ -0,0 +1 @@ +This file is boring; all the action's in the .mock-http-headers.
diff --git a/webrunner/net_http/testdata/with-duplicate-headers.html.mock-http-headers b/webrunner/net_http/testdata/with-duplicate-headers.html.mock-http-headers new file mode 100644 index 0000000..82a6d1e --- /dev/null +++ b/webrunner/net_http/testdata/with-duplicate-headers.html.mock-http-headers
@@ -0,0 +1,6 @@ +HTTP/1.1 200 OK +Cache-Control: private +Content-Type: text/html; charset=ISO-8859-1 +X-Multiple-Entries: a +X-Multiple-Entries: a +X-Multiple-Entries: b
diff --git a/webrunner/net_http/testdata/with-headers.html b/webrunner/net_http/testdata/with-headers.html new file mode 100644 index 0000000..364322d --- /dev/null +++ b/webrunner/net_http/testdata/with-headers.html
@@ -0,0 +1 @@ +This file is boring; all the action's in the .mock-http-headers.
diff --git a/webrunner/net_http/testdata/with-headers.html.mock-http-headers b/webrunner/net_http/testdata/with-headers.html.mock-http-headers new file mode 100644 index 0000000..ba8c15f8 --- /dev/null +++ b/webrunner/net_http/testdata/with-headers.html.mock-http-headers
@@ -0,0 +1,5 @@ +HTTP/1.1 200 OK +Cache-Control: private +Content-Type: text/html; charset=ISO-8859-1 +X-Multiple-Entries: a +X-Multiple-Entries: b
diff --git a/webrunner/net_http/service/url_loader_impl.cc b/webrunner/net_http/url_loader_impl.cc similarity index 80% rename from webrunner/net_http/service/url_loader_impl.cc rename to webrunner/net_http/url_loader_impl.cc index 343826ce..2badff00 100644 --- a/webrunner/net_http/service/url_loader_impl.cc +++ b/webrunner/net_http/url_loader_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "webrunner/net_http/service/url_loader_impl.h" +#include "webrunner/net_http/url_loader_impl.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/message_loop/message_loop_current.h" @@ -12,7 +12,7 @@ #include "net/http/http_response_headers.h" #include "net/url_request/redirect_info.h" -namespace net { +namespace net_http { namespace oldhttp = ::fuchsia::net::oldhttp; @@ -21,7 +21,11 @@ // server responses. const size_t kReadCapacity = 1024; -// Converts |buffer| into a URLBody with the body set to a buffer. +// The number of active requests. Used for testing. +int g_active_requests = 0; + +// Converts |buffer| into a URLBody with the body set to a buffer. Returns +// nullptr when an error occurs. oldhttp::URLBodyPtr CreateURLBodyFromBuffer(net::GrowableIOBuffer* buffer) { oldhttp::URLBodyPtr body = oldhttp::URLBody::New(); @@ -31,7 +35,13 @@ ::fuchsia::mem::Buffer mem_buffer; mem_buffer.size = total_size; zx_status_t result = - mem_buffer.vmo.write(buffer->StartOfBuffer(), 0, total_size); + zx::vmo::create(total_size, ZX_VMO_NON_RESIZABLE, &mem_buffer.vmo); + if (result != ZX_OK) { + ZX_DLOG(WARNING, result) << "zx_vmo_create"; + return nullptr; + } + + result = mem_buffer.vmo.write(buffer->StartOfBuffer(), 0, total_size); if (result != ZX_OK) { ZX_DLOG(WARNING, result) << "zx_vmo_write"; return nullptr; @@ -48,7 +58,7 @@ } oldhttp::HttpErrorPtr BuildError(int net_error) { - if (net_error == OK) { + if (net_error == net::OK) { return nullptr; } @@ -58,11 +68,11 @@ return error; } -std::unique_ptr<UploadDataStream> UploadDataStreamFromZxSocket( +std::unique_ptr<net::UploadDataStream> UploadDataStreamFromZxSocket( zx::socket stream) { // TODO(http://crbug.com/875534): Write a ZxStreamUploadStream class. - std::unique_ptr<ChunkedUploadDataStream> upload_stream = - std::make_unique<ChunkedUploadDataStream>(0); + std::unique_ptr<net::ChunkedUploadDataStream> upload_stream = + std::make_unique<net::ChunkedUploadDataStream>(0); char buffer[kReadCapacity]; size_t size = 0; zx_status_t result = ZX_OK; @@ -82,10 +92,10 @@ return upload_stream; } -std::unique_ptr<UploadDataStream> UploadDataStreamFromMemBuffer( +std::unique_ptr<net::UploadDataStream> UploadDataStreamFromMemBuffer( fuchsia::mem::Buffer mem_buffer) { // TODO(http://crbug.com/875534): Write a ZxMemBufferUploadStream class. - std::unique_ptr<ChunkedUploadDataStream> upload_stream = + std::unique_ptr<net::ChunkedUploadDataStream> upload_stream = std::make_unique<net::ChunkedUploadDataStream>(0); char buffer[kReadCapacity]; @@ -108,29 +118,36 @@ } // namespace -URLLoaderImpl::URLLoaderImpl(std::unique_ptr<URLRequestContext> context, +URLLoaderImpl::URLLoaderImpl(std::unique_ptr<net::URLRequestContext> context, fidl::InterfaceRequest<oldhttp::URLLoader> request) : binding_(this, std::move(request)), context_(std::move(context)), - buffer_(new GrowableIOBuffer()), + buffer_(new net::GrowableIOBuffer()), write_watch_(FROM_HERE) { binding_.set_error_handler([this] { delete this; }); + g_active_requests++; } -URLLoaderImpl::~URLLoaderImpl() = default; +URLLoaderImpl::~URLLoaderImpl() { + g_active_requests--; +} + +int URLLoaderImpl::GetNumActiveRequestsForTests() { + return g_active_requests; +} void URLLoaderImpl::Start(oldhttp::URLRequest request, Callback callback) { if (net_request_) { - callback(BuildResponse(ERR_IO_PENDING)); + callback(BuildResponse(net::ERR_IO_PENDING)); return; } done_callback_ = std::move(callback); - net_error_ = OK; + net_error_ = net::OK; // Create the URLRequest and set this object as the delegate. net_request_ = context_->CreateRequest(GURL(request.url.get()), - RequestPriority::MEDIUM, this); + net::RequestPriority::MEDIUM, this); net_request_->set_method(request.method); // Set extra headers. @@ -145,7 +162,7 @@ false); } - std::unique_ptr<UploadDataStream> upload_stream; + std::unique_ptr<net::UploadDataStream> upload_stream; // Set body. if (request.body) { if (request.body->is_stream()) { @@ -157,7 +174,7 @@ } if (!upload_stream) { - std::move(done_callback_)(BuildResponse(ERR_ACCESS_DENIED)); + std::move(done_callback_)(BuildResponse(net::ERR_ACCESS_DENIED)); return; } net_request_->set_upload(std::move(upload_stream)); @@ -173,7 +190,7 @@ void URLLoaderImpl::FollowRedirect(Callback callback) { if (!net_request_ || auto_follow_redirects_ || !net_request_->is_redirecting()) { - callback(BuildResponse(ERR_INVALID_HANDLE)); + callback(BuildResponse(net::ERR_INVALID_HANDLE)); } done_callback_ = std::move(callback); @@ -195,15 +212,15 @@ callback(std::move(status)); } -void URLLoaderImpl::OnReceivedRedirect(URLRequest* request, - const RedirectInfo& redirect_info, +void URLLoaderImpl::OnReceivedRedirect(net::URLRequest* request, + const net::RedirectInfo& redirect_info, bool* defer_redirect) { DCHECK_EQ(net_request_.get(), request); // Follow redirect depending on policy. *defer_redirect = !auto_follow_redirects_; if (!auto_follow_redirects_) { - oldhttp::URLResponse response = BuildResponse(OK); + oldhttp::URLResponse response = BuildResponse(net::OK); response.redirect_method = redirect_info.new_method; response.redirect_url = redirect_info.new_url.spec(); response.redirect_referrer = redirect_info.new_referrer; @@ -211,35 +228,35 @@ } } -void URLLoaderImpl::OnAuthRequired(URLRequest* request, - AuthChallengeInfo* auth_info) { +void URLLoaderImpl::OnAuthRequired(net::URLRequest* request, + net::AuthChallengeInfo* auth_info) { NOTIMPLEMENTED(); DCHECK_EQ(net_request_.get(), request); request->CancelAuth(); } void URLLoaderImpl::OnCertificateRequested( - URLRequest* request, - SSLCertRequestInfo* cert_request_info) { + net::URLRequest* request, + net::SSLCertRequestInfo* cert_request_info) { NOTIMPLEMENTED(); DCHECK_EQ(net_request_.get(), request); request->ContinueWithCertificate(nullptr, nullptr); } -void URLLoaderImpl::OnSSLCertificateError(URLRequest* request, - const SSLInfo& ssl_info, +void URLLoaderImpl::OnSSLCertificateError(net::URLRequest* request, + const net::SSLInfo& ssl_info, bool fatal) { NOTIMPLEMENTED(); DCHECK_EQ(net_request_.get(), request); request->Cancel(); } -void URLLoaderImpl::OnResponseStarted(URLRequest* request, int net_error) { +void URLLoaderImpl::OnResponseStarted(net::URLRequest* request, int net_error) { DCHECK_EQ(net_request_.get(), request); net_error_ = net_error; // Return early if the request failed. - if (net_error_ != OK) { + if (net_error_ != net::OK) { std::move(done_callback_)(BuildResponse(net_error_)); return; } @@ -251,10 +268,10 @@ zx_status_t result = zx::socket::create(0, &read_socket, &write_socket_); if (result != ZX_OK) { ZX_DLOG(WARNING, result) << "zx_socket_create"; - std::move(done_callback_)(BuildResponse(ERR_INSUFFICIENT_RESOURCES)); + std::move(done_callback_)(BuildResponse(net::ERR_INSUFFICIENT_RESOURCES)); return; } - oldhttp::URLResponse response = BuildResponse(OK); + oldhttp::URLResponse response = BuildResponse(net::OK); response.body = oldhttp::URLBody::New(); response.body->set_stream(std::move(read_socket)); std::move(done_callback_)(std::move(response)); @@ -267,7 +284,7 @@ ReadNextBuffer(); } -void URLLoaderImpl::OnReadCompleted(URLRequest* request, int bytes_read) { +void URLLoaderImpl::OnReadCompleted(net::URLRequest* request, int bytes_read) { DCHECK_EQ(net_request_.get(), request); if (WriteResponseBytes(bytes_read)) { ReadNextBuffer(); @@ -293,7 +310,7 @@ int net_result; do { net_result = net_request_->Read(buffer_.get(), kReadCapacity); - if (net_result == ERR_IO_PENDING) { + if (net_result == net::ERR_IO_PENDING) { return; } } while (WriteResponseBytes(net_result)); @@ -330,11 +347,12 @@ // In buffer mode, build the response and call the callback. oldhttp::URLBodyPtr body = CreateURLBodyFromBuffer(buffer_.get()); if (body) { - oldhttp::URLResponse response = BuildResponse(result); + oldhttp::URLResponse response = BuildResponse(net::OK); response.body = std::move(body); std::move(done_callback_)(std::move(response)); } else { - std::move(done_callback_)(BuildResponse(ERR_INSUFFICIENT_RESOURCES)); + std::move(done_callback_)( + BuildResponse(net::ERR_INSUFFICIENT_RESOURCES)); } } return false; @@ -345,9 +363,9 @@ DCHECK(response_body_mode_ == oldhttp::ResponseBodyMode::STREAM || response_body_mode_ == oldhttp::ResponseBodyMode::BUFFER_OR_STREAM); // In socket mode, attempt to write to the socket. - zx_status_t zx_result = + zx_status_t status = write_socket_.write(0, buffer_->data(), result, nullptr); - if (zx_result == ZX_ERR_SHOULD_WAIT) { + if (status == ZX_ERR_SHOULD_WAIT) { // Wait until the socket is writable again. buffered_bytes_ = result; base::MessageLoopCurrentForIO::Get()->WatchZxHandle( @@ -355,9 +373,9 @@ ZX_SOCKET_WRITABLE | ZX_SOCKET_PEER_CLOSED, &write_watch_, this); return false; } - if (result != ZX_OK) { + if (status != ZX_OK) { // Something went wrong, attempt to shut down the socket and close it. - ZX_DLOG(WARNING, result) << "zx_socket_write"; + ZX_DLOG(WARNING, status) << "zx_socket_write"; write_socket_ = zx::socket(); return false; } @@ -411,4 +429,4 @@ return response; } -} // namespace net \ No newline at end of file +} // namespace net_http \ No newline at end of file
diff --git a/webrunner/net_http/service/url_loader_impl.h b/webrunner/net_http/url_loader_impl.h similarity index 77% rename from webrunner/net_http/service/url_loader_impl.h rename to webrunner/net_http/url_loader_impl.h index fad1ff3..d412f750 100644 --- a/webrunner/net_http/service/url_loader_impl.h +++ b/webrunner/net_http/url_loader_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef WEBRUNNER_NET_HTTP_SERVICE_URL_LOADER_IMPL_H_ -#define WEBRUNNER_NET_HTTP_SERVICE_URL_LOADER_IMPL_H_ +#ifndef WEBRUNNER_NET_HTTP_URL_LOADER_IMPL_H_ +#define WEBRUNNER_NET_HTTP_URL_LOADER_IMPL_H_ #include <fuchsia/net/oldhttp/cpp/fidl.h> #include <fuchsia/sys/cpp/fidl.h> @@ -15,7 +15,7 @@ #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" -namespace net { +namespace net_http { // URLLoader implementation. This class manages one network request per // instance. Internally, this class uses a |net::URLRequest| object to handle @@ -23,16 +23,19 @@ // |binding_|. // TODO(https://crbug.com/875532): Implement cache-mode. class URLLoaderImpl : public ::fuchsia::net::oldhttp::URLLoader, - public URLRequest::Delegate, + public net::URLRequest::Delegate, base::MessagePumpForIO::ZxHandleWatcher { public: using Callback = ::fuchsia::net::oldhttp::URLLoader::StartCallback; URLLoaderImpl( - std::unique_ptr<URLRequestContext> context, + std::unique_ptr<net::URLRequestContext> context, ::fidl::InterfaceRequest<::fuchsia::net::oldhttp::URLLoader> request); ~URLLoaderImpl() override; + // Returns the number of active requests. Used for testing. + static int GetNumActiveRequestsForTests(); + private: // URLLoader methods: void Start(::fuchsia::net::oldhttp::URLRequest request, @@ -42,18 +45,19 @@ callback) override; // URLRequest::Delegate methods: - void OnReceivedRedirect(URLRequest* request, - const RedirectInfo& redirect_info, + void OnReceivedRedirect(net::URLRequest* request, + const net::RedirectInfo& redirect_info, bool* defer_redirect) override; - void OnAuthRequired(URLRequest* request, - AuthChallengeInfo* auth_info) override; - void OnCertificateRequested(URLRequest* request, - SSLCertRequestInfo* cert_request_info) override; - void OnSSLCertificateError(URLRequest* request, - const SSLInfo& ssl_info, + void OnAuthRequired(net::URLRequest* request, + net::AuthChallengeInfo* auth_info) override; + void OnCertificateRequested( + net::URLRequest* request, + net::SSLCertRequestInfo* cert_request_info) override; + void OnSSLCertificateError(net::URLRequest* request, + const net::SSLInfo& ssl_info, bool fatal) override; - void OnResponseStarted(URLRequest* request, int net_error) override; - void OnReadCompleted(URLRequest* request, int bytes_read) override; + void OnResponseStarted(net::URLRequest* request, int net_error) override; + void OnReadCompleted(net::URLRequest* request, int bytes_read) override; // MessagePumpForIO::ZxHandleWatcher method: void OnZxHandleSignalled(zx_handle_t handle, zx_signals_t signals) override; @@ -77,10 +81,10 @@ ::fidl::Binding<::fuchsia::net::oldhttp::URLLoader> binding_; // Holds the net::URLRequestContext associated with the |net_request_| - std::unique_ptr<URLRequestContext> context_; + std::unique_ptr<net::URLRequestContext> context_; // Holds the net::URLRequest used to perform the network operation. - std::unique_ptr<URLRequest> net_request_; + std::unique_ptr<net::URLRequest> net_request_; // Callback from a Start or FollowRedirect call. Callback done_callback_; @@ -116,6 +120,6 @@ DISALLOW_COPY_AND_ASSIGN(URLLoaderImpl); }; -} // namespace net +} // namespace net_http -#endif // WEBRUNNER_NET_HTTP_SERVICE_URL_LOADER_IMPL_H_ \ No newline at end of file +#endif // WEBRUNNER_NET_HTTP_URL_LOADER_IMPL_H_ \ No newline at end of file