diff --git a/DEPS b/DEPS index 4d5ccc1a..0be49ac04 100644 --- a/DEPS +++ b/DEPS
@@ -129,7 +129,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'fde841de44a63701b0a4396da35893f348559ce9', + 'skia_revision': '652b007a4cbb0b8c716510949456243573129ff4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -141,7 +141,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': 'e0da9cefcd5adebee2de8857c577bb86a882922a', + 'angle_revision': 'c832cdd75f75d56b1133c93b4bd8bc7c79481699', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -196,7 +196,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': '73185de866a94754509ec0a9737685525d8cb27e', + 'catapult_revision': 'acbf095c15e9524a0a1116792c3b6698f8e9b85b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -805,7 +805,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '4375b4659b71ed479fb98f9f63d1a3093e0f10ea', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'e72d09e780cedba24bdb63637f9be30a0ba6af7e', 'condition': 'checkout_linux', }, @@ -1183,7 +1183,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '1e504391033b86e26e63412f1773137a2a8a7bb7', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '57f20d73b85e4f912bad14acb368e3ee8f1ba414', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78', @@ -1354,7 +1354,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '3f6583d3fee4ab71866ade794504a20eb6f63f88', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '5111c338ca5704459bb2962a8d32c30ec4831913', + Var('webrtc_git') + '/src.git' + '@' + 'a1a93fba364d91ad4f662bba43d13f298f2d9aa3', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1395,7 +1395,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3ba785c802b9c256e7ffc0d9b4f2de6b90dc71c0', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@212f149cf830ea936e8d25ca9b80c701e4e77336', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/net/aw_url_request_context_getter.cc b/android_webview/browser/net/aw_url_request_context_getter.cc index 19fe287f..f338f478 100644 --- a/android_webview/browser/net/aw_url_request_context_getter.cc +++ b/android_webview/browser/net/aw_url_request_context_getter.cc
@@ -207,19 +207,20 @@ // For net-log, use default capture mode and no channel information. // WebView can enable net-log only using commandline in userdebug // devices so there is no need to complicate things here. The net_log - // file is written under app_webview directory. The user is required to - // provide a file name using --log-net-log=<filename.json> and then - // pull the file to desktop and then import it to chrome://net-internals - // There is no good way to shutdown net-log at the moment. The file will - // always be truncated. + // file is written at an absolute path specified by the user using + // --log-net-log=<filename.json>. Note: the absolute path should be a + // subdirectory of the app's data directory, otherwise multiple WebView apps + // may write to the same file. The user should then 'adb pull' the file to + // desktop and then import it to chrome://net-internals There is no good way + // to shutdown net-log at the moment. The file will always be truncated. const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); - if (command_line.HasSwitch(network::switches::kLogNetLog)) { - FilePath net_log_path; - base::PathService::Get(base::DIR_ANDROID_APP_DATA, &net_log_path); - FilePath log_name = + // Note: Netlog is handled by the Network Service when that is enabled. + if (command_line.HasSwitch(network::switches::kLogNetLog) && + !base::FeatureList::IsEnabled(network::features::kNetworkService)) { + // Assume the user gave us a path we can write to + FilePath net_log_path = command_line.GetSwitchValuePath(network::switches::kLogNetLog); - net_log_path = net_log_path.Append(log_name); std::unique_ptr<base::DictionaryValue> constants_dict = net::GetNetConstants();
diff --git a/android_webview/docs/net-debugging.md b/android_webview/docs/net-debugging.md index 6068b46..2de1b883 100644 --- a/android_webview/docs/net-debugging.md +++ b/android_webview/docs/net-debugging.md
@@ -16,7 +16,17 @@ production builds of Android. *** -1. Pick a name for the JSON file (any name will work, e.g., `jsonFile=foo.json`) +1. Figure out the app's data directory + ```sh + # appPackageName is the package name of whatever app you're interested (ex. + # WebView shell is "org.chromium.webview_shell"). + appDataDir="$(adb shell dumpsys package ${appPackageName} | grep 'dataDir=' | sed 's/^ *dataDir=//')" && \ + ``` +1. Pick a name for the JSON file. This must be under the WebView folder in the + app's data directory (ex. `jsonFile="${appDataDir}/app_webview/foo.json"`). + **Note:** it's important this is inside the data directory, otherwise + multiple WebView apps might try (and succeed) to write to the file + simultaneously. 1. Kill the app, if running 1. Set the netlog flag: ```sh @@ -26,9 +36,6 @@ when finished 1. Get the netlog off the device: ```sh - # appPackageName is the package name of whatever app you're interested (ex. - # WebView shell is "org.chromium.webview_shell"). - appDataDir="$(adb shell pm dump ${appPackageName} | grep 'dataDir=' | sed 's/^ *dataDir=//')" && \ adb pull "${appDataDir}/app_webview/${jsonFile}" ``` 1. Import the JSON file into [the NetLog
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc index 24d9588..05d2da1 100644 --- a/ash/app_list/views/app_list_view.cc +++ b/ash/app_list/views/app_list_view.cc
@@ -192,13 +192,10 @@ ~StateAnimationMetricsReporter() override = default; - void SetTargetState(ash::mojom::AppListViewState target_state) { - target_state_ = target_state; - } - - void Start() { -#if defined(DCHECK) + void Start(bool is_in_tablet_mode) { DCHECK(!started_); + is_in_tablet_mode_ = is_in_tablet_mode; +#if defined(DCHECK) started_ = ui::ScopedAnimationDurationScaleMode::duration_scale_mode() != ui::ScopedAnimationDurationScaleMode::ZERO_DURATION; #endif @@ -206,36 +203,13 @@ void Report(int value) override { UMA_HISTOGRAM_PERCENTAGE("Apps.StateTransition.AnimationSmoothness", value); - switch (*target_state_) { - case ash::mojom::AppListViewState::kClosed: - UMA_HISTOGRAM_PERCENTAGE( - "Apps.StateTransition.AnimationSmoothness.Close.ClamshellMode", - value); - break; - case ash::mojom::AppListViewState::kPeeking: - UMA_HISTOGRAM_PERCENTAGE( - "Apps.StateTransition.AnimationSmoothness.Peeking.ClamshellMode", - value); - break; - case ash::mojom::AppListViewState::kHalf: - UMA_HISTOGRAM_PERCENTAGE( - "Apps.StateTransition.AnimationSmoothness.Half.ClamshellMode", - value); - break; - case ash::mojom::AppListViewState::kFullscreenAllApps: - UMA_HISTOGRAM_PERCENTAGE( - "Apps.StateTransition.AnimationSmoothness.FullscreenAllApps." - "ClamshellMode", - value); - break; - case ash::mojom::AppListViewState::kFullscreenSearch: - UMA_HISTOGRAM_PERCENTAGE( - "Apps.StateTransition.AnimationSmoothness.FullscreenSearch." - "ClamshellMode", - value); - break; + if (is_in_tablet_mode_) { + UMA_HISTOGRAM_PERCENTAGE( + "Apps.StateTransition.AnimationSmoothness.TabletMode", value); + } else { + UMA_HISTOGRAM_PERCENTAGE( + "Apps.StateTransition.AnimationSmoothness.ClamshellMode", value); } - target_state_.reset(); view_->OnStateTransitionAnimationCompleted(); #if defined(DCHECK) started_ = false; @@ -246,7 +220,7 @@ #if defined(DCHECK) bool started_ = false; #endif - base::Optional<ash::mojom::AppListViewState> target_state_; + bool is_in_tablet_mode_ = false; AppListView* view_; DISALLOW_COPY_AND_ASSIGN(StateAnimationMetricsReporter); @@ -1396,7 +1370,6 @@ settings.SetTweenType(gfx::Tween::EASE_OUT); settings.SetPreemptionStrategy( ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); - state_animation_metrics_reporter_->SetTargetState(target_state); settings.SetAnimationMetricsReporter(state_animation_metrics_reporter_.get()); settings.AddObserver(transition_animation_observer_.get()); @@ -1419,8 +1392,6 @@ animation_duration /= 2; } - state_animation_metrics_reporter_->SetTargetState( - ash::mojom::AppListViewState::kClosed); SetState(ash::mojom::AppListViewState::kClosed); app_list_main_view_->contents_view()->FadeOutOnClose(animation_duration); } @@ -1635,7 +1606,7 @@ } ui::AnimationMetricsReporter* AppListView::GetStateTransitionMetricsReporter() { - state_animation_metrics_reporter_->Start(); + state_animation_metrics_reporter_->Start(is_tablet_mode_); return state_animation_metrics_reporter_.get(); }
diff --git a/ash/app_list/views/assistant/assistant_page_view.cc b/ash/app_list/views/assistant/assistant_page_view.cc index 173c094..3d853900 100644 --- a/ash/app_list/views/assistant/assistant_page_view.cc +++ b/ash/app_list/views/assistant/assistant_page_view.cc
@@ -179,8 +179,8 @@ } void AssistantPageView::OnUiModeChanged(ash::AssistantUiMode ui_mode) { - for (int i = 0; i < child_count(); ++i) - child_at(i)->SetVisible(false); + for (auto* child : children()) + child->SetVisible(false); switch (ui_mode) { case ash::AssistantUiMode::kLauncherEmbeddedUi:
diff --git a/ash/app_list/views/search_result_actions_view.cc b/ash/app_list/views/search_result_actions_view.cc index 1fb7785..e736dfe 100644 --- a/ash/app_list/views/search_result_actions_view.cc +++ b/ash/app_list/views/search_result_actions_view.cc
@@ -12,6 +12,7 @@ #include "ash/app_list/views/search_result_actions_view_delegate.h" #include "ash/app_list/views/search_result_view.h" #include "ash/public/cpp/app_list/app_list_config.h" +#include "base/numerics/ranges.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" #include "ui/gfx/color_palette.h" @@ -243,8 +244,7 @@ } void SearchResultActionsView::SetSelectedAction(int action_index) { - // Clamp |action_index| in [-1, child_count()]. - action_index = std::min(int{children().size()}, std::max(-1, action_index)); + action_index = base::ClampToRange(action_index, -1, int{children().size()}); if (selected_action_ == action_index) return;
diff --git a/ash/app_list/views/search_result_tile_item_list_view_unittest.cc b/ash/app_list/views/search_result_tile_item_list_view_unittest.cc index 3f6afd75..1bfd473 100644 --- a/ash/app_list/views/search_result_tile_item_list_view_unittest.cc +++ b/ash/app_list/views/search_result_tile_item_list_view_unittest.cc
@@ -26,7 +26,6 @@ namespace app_list { namespace { -constexpr size_t kMaxNumSearchResultTiles = 6; constexpr size_t kInstalledApps = 4; constexpr size_t kPlayStoreApps = 2; constexpr size_t kRecommendedApps = 1; @@ -139,8 +138,7 @@ } size_t GetOpenResultCount(int ranking) { - size_t result = view_delegate_.open_search_result_counts()[ranking]; - return result; + return view_delegate_.open_search_result_counts()[ranking]; } void ResetOpenResultCount() { @@ -176,6 +174,7 @@ if (IsReinstallAppRecommendationEnabled()) { expected_results += kRecommendedApps; } + constexpr size_t kMaxNumSearchResultTiles = 6; expected_results = std::min(kMaxNumSearchResultTiles, expected_results); ASSERT_EQ(expected_results, results); @@ -184,15 +183,12 @@ IsPlayStoreAppSearchEnabled() || IsReinstallAppRecommendationEnabled(); // When the Play Store app search feature or app reinstallation feature is // enabled, for each result, we added a separator for result type grouping. - const size_t expected_child_count = separators_enabled - ? kMaxNumSearchResultTiles * 2 - : kMaxNumSearchResultTiles; - EXPECT_EQ(expected_child_count, view()->children().size()); + const size_t child_step = separators_enabled ? 2 : 1; + const size_t expected_num_children = kMaxNumSearchResultTiles * child_step; + EXPECT_EQ(expected_num_children, view()->children().size()); /// Test accessibility descriptions of tile views. - const size_t first_child = separators_enabled ? 1 : 0; - const size_t child_step = separators_enabled ? 2 : 1; - + const size_t first_child = child_step - 1; for (size_t i = 0; i < kInstalledApps; ++i) { ui::AXNodeData node_data; view()->children()[first_child + i * child_step]->GetAccessibleNodeData( @@ -206,30 +202,28 @@ expected_results - (IsReinstallAppRecommendationEnabled() ? kRecommendedApps : 0) - kInstalledApps; - for (size_t i = kInstalledApps; i < (kInstalledApps + expected_install_apps); - ++i) { + for (size_t i = 0; i < expected_install_apps; ++i) { ui::AXNodeData node_data; - view()->children()[first_child + i * child_step]->GetAccessibleNodeData( - &node_data); + view() + ->children()[first_child + (i + kInstalledApps) * child_step] + ->GetAccessibleNodeData(&node_data); EXPECT_EQ(ax::mojom::Role::kButton, node_data.role); - EXPECT_EQ("PlayStoreApp " + base::NumberToString(i - kInstalledApps) + - ", Star rating " + - base::NumberToString(i + 1 - kInstalledApps) + ".0, Price " + - base::NumberToString(i - kInstalledApps), + EXPECT_EQ("PlayStoreApp " + base::NumberToString(i) + ", Star rating " + + base::NumberToString(i + 1) + ".0, Price " + + base::NumberToString(i), node_data.GetStringAttribute(ax::mojom::StringAttribute::kName)); } // Recommendations. const size_t start_index = kInstalledApps + expected_install_apps; - for (size_t i = kInstalledApps + expected_install_apps; i < expected_results; - ++i) { + for (size_t i = 0; i < expected_results - start_index; ++i) { ui::AXNodeData node_data; - view()->children()[first_child + i * child_step]->GetAccessibleNodeData( - &node_data); + view() + ->children()[first_child + (i + start_index) * child_step] + ->GetAccessibleNodeData(&node_data); EXPECT_EQ(ax::mojom::Role::kButton, node_data.role); - EXPECT_EQ("RecommendedApp " + base::NumberToString(i - start_index) + - ", Star rating " + base::NumberToString(i + 1 - start_index) + - ".0, App recommendation", + EXPECT_EQ("RecommendedApp " + base::NumberToString(i) + ", Star rating " + + base::NumberToString(i + 1) + ".0, App recommendation", node_data.GetStringAttribute(ax::mojom::StringAttribute::kName)); }
diff --git a/ash/assistant/ui/assistant_container_view.cc b/ash/assistant/ui/assistant_container_view.cc index 9e94993d..b8b8ec6a 100644 --- a/ash/assistant/ui/assistant_container_view.cc +++ b/ash/assistant/ui/assistant_container_view.cc
@@ -201,9 +201,7 @@ const int host_center_x = host->GetBoundsInScreen().CenterPoint().x(); const int host_height = host->height(); - for (int i = 0; i < host->child_count(); ++i) { - views::View* child = host->child_at(i); - + for (auto* child : host->children()) { const gfx::Size child_size = child->GetPreferredSize(); // Children are horizontally centered. This means that both the |host| @@ -393,9 +391,8 @@ } void AssistantContainerView::OnUiModeChanged(AssistantUiMode ui_mode) { - for (int i = 0; i < child_count(); ++i) { - child_at(i)->SetVisible(false); - } + for (auto* child : children()) + child->SetVisible(false); switch (ui_mode) { case AssistantUiMode::kMiniUi:
diff --git a/ash/assistant/ui/main_stage/assistant_main_stage.cc b/ash/assistant/ui/main_stage/assistant_main_stage.cc index b268eb3c..144a040 100644 --- a/ash/assistant/ui/main_stage/assistant_main_stage.cc +++ b/ash/assistant/ui/main_stage/assistant_main_stage.cc
@@ -160,9 +160,7 @@ const int host_width = host->GetContentsBounds().width(); const int host_height = host->GetContentsBounds().height(); - for (int i = 0; i < host->child_count(); ++i) { - views::View* child = host->child_at(i); - + for (auto* child : host->children()) { int child_width = host_width; int child_height = host_height;
diff --git a/ash/assistant/ui/main_stage/assistant_progress_indicator.cc b/ash/assistant/ui/main_stage/assistant_progress_indicator.cc index 899901d..3b24684 100644 --- a/ash/assistant/ui/main_stage/assistant_progress_indicator.cc +++ b/ash/assistant/ui/main_stage/assistant_progress_indicator.cc
@@ -28,16 +28,6 @@ constexpr int kEmbeddedUiPreferredHeightDip = 9; constexpr int kSpacingDip = 4; -// Animation. -constexpr base::TimeDelta kAnimationOffsetDuration = - base::TimeDelta::FromMilliseconds(216); -constexpr base::TimeDelta kAnimationPauseDuration = - base::TimeDelta::FromMilliseconds(500); -constexpr base::TimeDelta kAnimationScaleUpDuration = - base::TimeDelta::FromMilliseconds(266); -constexpr base::TimeDelta kAnimationScaleDownDuration = - base::TimeDelta::FromMilliseconds(450); - // Transformation. constexpr float kScaleFactor = kDotLargeSizeDip / kDotSmallSizeDip; constexpr float kTranslationDip = -(kDotLargeSizeDip - kDotSmallSizeDip) / 2.f; @@ -117,9 +107,8 @@ if (!is_drawn_) { // Stop all animations. - for (int i = 0; i < child_count(); ++i) { - child_at(i)->layer()->GetAnimator()->StopAnimating(); - } + for (auto* child : children()) + child->layer()->GetAnimator()->StopAnimating(); return; } @@ -133,28 +122,29 @@ transform.Translate(kTranslationDip, kTranslationDip); transform.Scale(kScaleFactor, kScaleFactor); - for (int i = 0; i < child_count(); ++i) { - views::View* view = child_at(i); - - if (i > 0) { + base::TimeDelta start_offset; + for (auto* child : children()) { + if (!start_offset.is_zero()) { // Schedule the animations to start after an offset. - view->layer()->GetAnimator()->SchedulePauseForProperties( - i * kAnimationOffsetDuration, + child->layer()->GetAnimator()->SchedulePauseForProperties( + start_offset, ui::LayerAnimationElement::AnimatableProperty::TRANSFORM); } + start_offset += base::TimeDelta::FromMilliseconds(216); // Schedule transformation animation. - view->layer()->GetAnimator()->ScheduleAnimation( + child->layer()->GetAnimator()->ScheduleAnimation( CreateLayerAnimationSequence( // Animate scale up. - CreateTransformElement(transform, kAnimationScaleUpDuration), + CreateTransformElement(transform, + base::TimeDelta::FromMilliseconds(266)), // Animate scale down. CreateTransformElement(gfx::Transform(), - kAnimationScaleDownDuration), + base::TimeDelta::FromMilliseconds(450)), // Pause before next iteration. ui::LayerAnimationElement::CreatePauseElement( ui::LayerAnimationElement::AnimatableProperty::TRANSFORM, - kAnimationPauseDuration), + base::TimeDelta::FromMilliseconds(500)), // Animation parameters. {.is_cyclic = true})); }
diff --git a/ash/components/shortcut_viewer/views/bubble_view.cc b/ash/components/shortcut_viewer/views/bubble_view.cc index f5d6ebe..25fb752 100644 --- a/ash/components/shortcut_viewer/views/bubble_view.cc +++ b/ash/components/shortcut_viewer/views/bubble_view.cc
@@ -85,8 +85,8 @@ int width = 0; int height = 0; if (!children().empty()) { - for (int i = 0; i < child_count(); ++i) { - const auto child_size = child_at(i)->GetPreferredSize(); + for (const auto* child : children()) { + const auto child_size = child->GetPreferredSize(); height = std::max(height, child_size.height()); width += child_size.width(); } @@ -98,7 +98,7 @@ // To avoid text and icon bubbles have different heights in a row. constexpr int kMinimumHeight = 32; preferred_size.SetToMax(gfx::Size(kMinimumHeight, kMinimumHeight)); - // Make the width to be at lease as large as the height. + // Make the width to be at least as large as the height. preferred_size.set_width( std::max(preferred_size.width(), preferred_size.height())); return preferred_size;
diff --git a/ash/login/ui/login_menu_view.cc b/ash/login/ui/login_menu_view.cc index ffdc32e9..d4ebca6 100644 --- a/ash/login/ui/login_menu_view.cc +++ b/ash/login/ui/login_menu_view.cc
@@ -4,6 +4,8 @@ #include "ash/login/ui/login_menu_view.h" +#include <algorithm> +#include <iterator> #include <memory> #include <utility> @@ -181,22 +183,6 @@ contents_->SchedulePaint(); } -int LoginMenuView::FindNextItem(bool reverse) { - int delta = reverse ? -1 : 1; - int current_index = selected_index_ + delta; - while (current_index >= 0 && current_index < contents_->child_count()) { - MenuItemView* menu_view = - static_cast<MenuItemView*>(contents_->child_at(current_index)); - if (!menu_view->item().is_group) - break; - current_index += delta; - } - - if (current_index < 0 || current_index == contents_->child_count()) - return selected_index_; - return current_index; -} - LoginButton* LoginMenuView::GetBubbleOpener() const { return opener_; } @@ -209,7 +195,7 @@ bool LoginMenuView::OnKeyPressed(const ui::KeyEvent& event) { const ui::KeyboardCode key = event.key_code(); if (key == ui::VKEY_UP || key == ui::VKEY_DOWN) { - contents_->child_at(FindNextItem(key == ui::VKEY_UP))->RequestFocus(); + FindNextItem(key == ui::VKEY_UP)->RequestFocus(); return true; } @@ -221,4 +207,21 @@ contents_->child_at(selected_index_)->RequestFocus(); } +views::View* LoginMenuView::FindNextItem(bool reverse) { + const auto& children = contents_->children(); + const auto is_item = [](views::View* v) { + return !static_cast<MenuItemView*>(v)->item().is_group; + }; + const auto begin = std::next(children.begin(), selected_index_); + if (reverse) { + // Subtle: make_reverse_iterator() will result in an iterator that refers to + // the element before its argument, which is what we want. + const auto i = std::find_if(std::make_reverse_iterator(begin), + children.rend(), is_item); + return (i == children.rend()) ? *begin : *i; + } + const auto i = std::find_if(std::next(begin), children.end(), is_item); + return (i == children.end()) ? *begin : *i; +} + } // namespace ash
diff --git a/ash/login/ui/login_menu_view.h b/ash/login/ui/login_menu_view.h index 8bea9c2..12ddd88 100644 --- a/ash/login/ui/login_menu_view.h +++ b/ash/login/ui/login_menu_view.h
@@ -52,7 +52,6 @@ ~LoginMenuView() override; void OnHighLightChange(int item_index, bool by_selection); - int FindNextItem(bool reverse); // LoginBaseBubbleView: LoginButton* GetBubbleOpener() const override; @@ -63,6 +62,8 @@ void VisibilityChanged(View* starting_from, bool is_visible) override; private: + views::View* FindNextItem(bool reverse); + // Owned by this class. views::ScrollView* scroller_ = nullptr;
diff --git a/ash/login/ui/login_test_utils.cc b/ash/login/ui/login_test_utils.cc index 08dbdd1..63eb9db 100644 --- a/ash/login/ui/login_test_utils.cc +++ b/ash/login/ui/login_test_utils.cc
@@ -4,6 +4,7 @@ #include "ash/login/ui/login_test_utils.h" #include "ash/login/ui/login_big_user_view.h" +#include "base/containers/adapters.h" #include "base/strings/string_split.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/test/event_generator.h" @@ -119,8 +120,7 @@ // Performs a DFS for the first button in the views hierarchy // The last child is on the top of the z layer stack views::View* FindTopButton(views::View* current_view) { - for (int i = current_view->child_count() - 1; i >= 0; i--) { - views::View* child = current_view->child_at(i); + for (auto* child : base::Reversed(current_view->children())) { if (views::Button::AsButton(child)) return child; if (!child->children().empty()) {
diff --git a/ash/media/media_notification_view.cc b/ash/media/media_notification_view.cc index 52d6629..cd497fb4 100644 --- a/ash/media/media_notification_view.cc +++ b/ash/media/media_notification_view.cc
@@ -370,10 +370,8 @@ std::set<MediaSessionAction> visible_actions = CalculateVisibleActions(IsActuallyExpanded()); - for (int i = 0; i < button_row_->child_count(); ++i) { - views::Button* action_button = - views::Button::AsButton(button_row_->child_at(i)); - + for (auto* view : button_row_->children()) { + views::Button* action_button = views::Button::AsButton(view); action_button->SetVisible(base::ContainsKey( visible_actions, static_cast<MediaSessionAction>(action_button->tag())));
diff --git a/ash/media/media_notification_view_unittest.cc b/ash/media/media_notification_view_unittest.cc index 57f3578d..1f46974 100644 --- a/ash/media/media_notification_view_unittest.cc +++ b/ash/media/media_notification_view_unittest.cc
@@ -315,15 +315,13 @@ EXPECT_EQ(5u, button_row()->children().size()); - for (int i = 0; i < button_row()->child_count(); ++i) { - const views::Button* child = - views::Button::AsButton(button_row()->child_at(i)); + for (auto* child : button_row()->children()) { ASSERT_TRUE(IsMediaButtonType(child->GetClassName())); EXPECT_TRUE(child->visible()); EXPECT_LT(kMediaButtonIconSize, child->width()); EXPECT_LT(kMediaButtonIconSize, child->height()); - EXPECT_FALSE(child->GetAccessibleName().empty()); + EXPECT_FALSE(views::Button::AsButton(child)->GetAccessibleName().empty()); } EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPlay));
diff --git a/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc b/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc index 35aa67c..4b01419 100644 --- a/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc +++ b/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc
@@ -349,8 +349,9 @@ // Slide all buttons to the left of the size button. Usually this is just the // minimize button but it can also include a PWA menu button. int previous_x = 0; - for (int i = 0; i < child_count() && child_at(i) != size_button_; ++i) { - views::View* button = child_at(i); + for (auto* button : children()) { + if (button == size_button_) + break; button->SetX(previous_x + x_slide); previous_x += button->width(); }
diff --git a/ash/shelf/login_shelf_view.cc b/ash/shelf/login_shelf_view.cc index f36f517..e5eaff4 100644 --- a/ash/shelf/login_shelf_view.cc +++ b/ash/shelf/login_shelf_view.cc
@@ -605,8 +605,8 @@ if (session_state == SessionState::ACTIVE) { // The entire view was set invisible. The buttons are also set invisible // to avoid affecting calculation of the shelf size. - for (int i = 0; i < child_count(); ++i) - child_at(i)->SetVisible(false); + for (auto* child : children()) + child->SetVisible(false); return; }
diff --git a/ash/shell/widgets.cc b/ash/shell/widgets.cc index a9b3bfe..593c943 100644 --- a/ash/shell/widgets.cc +++ b/ash/shell/widgets.cc
@@ -106,8 +106,7 @@ const int kVerticalPad = 5; int left = 5; int top = kVerticalPad; - for (int i = 0; i < child_count(); ++i) { - views::View* view = child_at(i); + for (auto* view : children()) { gfx::Size preferred = view->GetPreferredSize(); view->SetBounds(left, top, preferred.width(), preferred.height()); top += preferred.height() + kVerticalPad;
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index d035d27..3f184e8 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">የእርስዎ መሣሪያዎች እንዲያውም የተሻለ ይሠራሉ</translation> <translation id="112308213915226829">መደርደሪያን በራስ ሰር ደብቅ</translation> <translation id="1153356358378277386">የተጣመሩ መሣሪያዎች</translation> +<translation id="1178581264944972037">ለአፍታ አቁም</translation> <translation id="1195412055398077112">ትርፍ ቅኝት</translation> <translation id="119944043368869598">ሁሉንም አጽዳ</translation> <translation id="123828989343052515">አዲስ ዴስክ</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">ኃይል</translation> <translation id="6751826523481687655">የአፈጻጸም ክትትል በርቷል</translation> <translation id="6785414152754474415">ባትሪው <ph name="PERCENTAGE" />% ሙሉ ሆኖ በተጨማሪም ኃይል እየሞላ ነው።</translation> +<translation id="6790428901817661496">አጫውት</translation> <translation id="6803622936009808957">ምንም የሚደገፉ ጥራቶች ስላልተገኙ ማሳያዎችን ማሳየት አልተቻለም። ይልቁንስ ወደ የተስፋፋ ዴስክቶፕ ሁነታ ተገብቷል።</translation> <translation id="6820676911989879663">እረፍት ይውሰዱ!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index a0280da7..924d237 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">تعمل أجهزتك بشكل أفضل وهي مرتبطة معًا</translation> <translation id="112308213915226829">الإخفاء التلقائي للرف</translation> <translation id="1153356358378277386">الأجهزة المقترنة</translation> +<translation id="1178581264944972037">الإيقاف مؤقتًا</translation> <translation id="1195412055398077112">الخروج عن إطار الشاشة</translation> <translation id="119944043368869598">محو الكل</translation> <translation id="123828989343052515">مكتب جديد</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">الطاقة</translation> <translation id="6751826523481687655">تتبّع الأداء قيْد التفعيل</translation> <translation id="6785414152754474415">اكتمل شحن <ph name="PERCENTAGE" />% من البطارية ويجري شحنها.</translation> +<translation id="6790428901817661496">التشغيل</translation> <translation id="6803622936009808957">تعذر إجراء النسخ المطابق للعروض نظرًا لعدم العثور على درجات دقة متوافقة. تم الدخول إلى سطح المكتب الممتد بدلاً من ذلك.</translation> <translation id="6820676911989879663">حان وقت الاستراحة</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 1bda5d8..fe882e5 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Устройствата ви работят още по-добре заедно</translation> <translation id="112308213915226829">Автоматично скриване на лавицата</translation> <translation id="1153356358378277386">Сдвоени устройства</translation> +<translation id="1178581264944972037">Пауза</translation> <translation id="1195412055398077112">допълнителна област</translation> <translation id="119944043368869598">Изчистване на всички</translation> <translation id="123828989343052515">Нов работен кът</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Захранване</translation> <translation id="6751826523481687655">Проследяването на ефективността е включено</translation> <translation id="6785414152754474415">Батерията е <ph name="PERCENTAGE" />% пълна и се зарежда.</translation> +<translation id="6790428901817661496">Пускане</translation> <translation id="6803622936009808957">Дисплеите не можаха да се дублират, тъй като не бяха намерени поддържани разделителни способности. Вместо това влязохте в режима за разширен работен плот.</translation> <translation id="6820676911989879663">Време е за почивка!</translation> <translation id="683971173229319003">търсене + L</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index cf2699f..7cc2be94 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">আপনার ডিভাইসগুলি একসাথে আরও ভাল কাজ করে</translation> <translation id="112308213915226829">তাককে স্বয়ংক্রিয়ভাবে লুকান</translation> <translation id="1153356358378277386">যুক্ত করা ডিভাইসগুলি</translation> +<translation id="1178581264944972037">বিরতি</translation> <translation id="1195412055398077112">ওভারস্ক্যান</translation> <translation id="119944043368869598">সব পরিষ্কার করুন</translation> <translation id="123828989343052515">নতুন ডেস্ক</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">পাওয়ার</translation> <translation id="6751826523481687655">পারফরম্যান্স ট্রেস করার বিকল্প চালু আছে</translation> <translation id="6785414152754474415">ব্যাটারি <ph name="PERCENTAGE" />% পূর্ণ এবং চার্জ হচ্ছে৷</translation> +<translation id="6790428901817661496">চালু করুন</translation> <translation id="6803622936009808957">সমর্থিত রেসুলিউশানগুলি খুঁজে না পাওয়ায় প্রদর্শনগুলি মিরর মানে প্রতিবিম্বিত করতে পারেনি। এর পরিবর্তে প্রসারিত ডেস্কটপে প্রবেশ করেছে।</translation> <translation id="6820676911989879663">বিরতি নিন!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 0b46ab4..232be278 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Els teus dispositius funcionen encara millor junts</translation> <translation id="112308213915226829">Amaga el prestatge automàticament</translation> <translation id="1153356358378277386">Dispositius vinculats</translation> +<translation id="1178581264944972037">Posa en pausa</translation> <translation id="1195412055398077112">ajusta la mida</translation> <translation id="119944043368869598">Esborra-ho tot</translation> <translation id="123828989343052515">Escriptori nou</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Bateria</translation> <translation id="6751826523481687655">La traça del rendiment està activada</translation> <translation id="6785414152754474415">La bateria està carregada fins al <ph name="PERCENTAGE" />% i s'està carregant.</translation> +<translation id="6790428901817661496">Reprodueix</translation> <translation id="6803622936009808957">No s'ha pogut fer la rèplica de les pantalles, perquè no s'ha trobat cap resolució compatible. S'està entrant al mode d'escriptori ampliat.</translation> <translation id="6820676911989879663">Fes una pausa</translation> <translation id="683971173229319003">Cerca + L</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 2504ffa..5ca50e08 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Společně budou vaše zařízení fungovat ještě lépe</translation> <translation id="112308213915226829">Automaticky skrývat poličku</translation> <translation id="1153356358378277386">Spárovaná zařízení</translation> +<translation id="1178581264944972037">Pozastavit</translation> <translation id="1195412055398077112">přesah obrazu</translation> <translation id="119944043368869598">Vymazat vše</translation> <translation id="123828989343052515">Nová plocha</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Napájení</translation> <translation id="6751826523481687655">Trasování výkonu je zapnuté</translation> <translation id="6785414152754474415">Baterie je nabita na <ph name="PERCENTAGE" /> % a nabíjí se.</translation> +<translation id="6790428901817661496">Přehrát</translation> <translation id="6803622936009808957">Zobrazení nelze zrcadlit, protože nebyla nalezena podporovaná rozlišení. Místo toho se spustil režim rozšířené pracovní plochy.</translation> <translation id="6820676911989879663">Dejte si pauzu.</translation> <translation id="683971173229319003">Hledat+L</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index bf076ed0..5f80fd8 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Dine enheder fungerer endnu bedre sammen</translation> <translation id="112308213915226829">Skjul hylde automatisk</translation> <translation id="1153356358378277386">Parrede enheder</translation> +<translation id="1178581264944972037">Pause</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Ryd alle</translation> <translation id="123828989343052515">Nyt skrivebord</translation> @@ -235,7 +236,7 @@ <translation id="4544944664594876241">Genvejen til at låse skærmen er ændret. Brug <ph name="NEW_SHORTCUT" /> i stedet for <ph name="OLD_SHORTCUT" />.</translation> <translation id="4561267230861221837">3G</translation> <translation id="4570957409596482333">Knap for Tekstoplæsning</translation> -<translation id="4585337515783392668">Stop med at caste på en ukendt modtager</translation> +<translation id="4585337515783392668">Stop cast på en ukendt modtager</translation> <translation id="4628757576491864469">Enheder</translation> <translation id="4659419629803378708">ChromeVox er aktiveret</translation> <translation id="4696813013609194136">Lås enheden op med forældrekode</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Strøm</translation> <translation id="6751826523481687655">Sporing af effektivitet er slået til</translation> <translation id="6785414152754474415">Batteriet er <ph name="PERCENTAGE" /> % opladet og oplades nu.</translation> +<translation id="6790428901817661496">Afspil</translation> <translation id="6803622936009808957">Skærmene kunne ikke spejles, da der ikke fandtes en understøttet opløsning. I stedet anvendes Udvidet skrivebord.</translation> <translation id="6820676911989879663">Hold en pause</translation> <translation id="683971173229319003">Søg+L</translation> @@ -445,7 +447,7 @@ <translation id="8030169304546394654">Afbrudt</translation> <translation id="8054466585765276473">Beregner batteritid.</translation> <translation id="8061464966246066292">Høj kontrast</translation> -<translation id="8098591350844501178">Stop cast skærmen til <ph name="RECEIVER_NAME" /></translation> +<translation id="8098591350844501178">Stop skærmcast til <ph name="RECEIVER_NAME" /></translation> <translation id="8113423164597455979">Aktiveret, alle apps</translation> <translation id="8132793192354020517">Forbundet til <ph name="NAME" /></translation> <translation id="813913629614996137">Initialiserer...</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index e433331..6043b3d 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vorteile durch das Verbinden Ihrer Geräte</translation> <translation id="112308213915226829">Ablage automatisch ausblenden</translation> <translation id="1153356358378277386">Gekoppelte Geräte</translation> +<translation id="1178581264944972037">Anhalten</translation> <translation id="1195412055398077112">Overscan</translation> <translation id="119944043368869598">Alle löschen</translation> <translation id="123828989343052515">Neuer Arbeitsbereich</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Akkuleistung</translation> <translation id="6751826523481687655">Leistungsverfolgung ist aktiviert</translation> <translation id="6785414152754474415">Akku ist zu <ph name="PERCENTAGE" /> % geladen und wird geladen.</translation> +<translation id="6790428901817661496">Wiedergabe</translation> <translation id="6803622936009808957">Der Bildschirm konnte nicht gespiegelt werden, da die Auflösung nicht unterstützt wird. Stattdessen wurde der Modus für den erweiterten Desktop gestartet.</translation> <translation id="6820676911989879663">Zeit für eine Pause.</translation> <translation id="683971173229319003">Suche + L</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index aade37e..22406bf 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Οι συσκευές σας λειτουργούν ακόμα καλύτερα συνδυαστικά</translation> <translation id="112308213915226829">Αυτόματη απόκρυψη ραφιού</translation> <translation id="1153356358378277386">Συσκευές σε σύζευξη</translation> +<translation id="1178581264944972037">Παύση</translation> <translation id="1195412055398077112">υπερσάρωση</translation> <translation id="119944043368869598">Διαγραφή όλων</translation> <translation id="123828989343052515">Νέο γραφείο</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Ενεργοποίηση</translation> <translation id="6751826523481687655">Η παρακολούθηση απόδοσης έχει ενεργοποιηθεί</translation> <translation id="6785414152754474415">Η μπαταρία είναι πλήρης <ph name="PERCENTAGE" />% και φορτίζει.</translation> +<translation id="6790428901817661496">Αναπαραγωγή</translation> <translation id="6803622936009808957">Δεν ήταν δυνατός ο αντικατοπτρισμός των οθονών καθώς δεν βρέθηκαν υποστηριζόμενες αναλύσεις. Έχει ενεργοποιηθεί εναλλακτικά η εκτεταμένη επιφάνεια εργασίας.</translation> <translation id="6820676911989879663">Κάντε ένα διάλειμμα!</translation> <translation id="683971173229319003">Πλήκτρο αναζήτησης+L</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 6eb0b52..9770d374 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Your devices work even better together</translation> <translation id="112308213915226829">Autohide shelf</translation> <translation id="1153356358378277386">Paired devices</translation> +<translation id="1178581264944972037">Pause</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Clear all</translation> <translation id="123828989343052515">New Desk</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Power</translation> <translation id="6751826523481687655">Performance tracing is turned on</translation> <translation id="6785414152754474415">Battery is <ph name="PERCENTAGE" />% full and charging.</translation> +<translation id="6790428901817661496">Play</translation> <translation id="6803622936009808957">Could not mirror displays since no supported resolutions found. Entered extended desktop instead.</translation> <translation id="6820676911989879663">Take a break!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index eaaba86..7ab797a3 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Tus dispositivos funcionan incluso mejor juntos</translation> <translation id="112308213915226829">Ocultar la biblioteca automáticamente</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> +<translation id="1178581264944972037">Detener</translation> <translation id="1195412055398077112">desajuste de dimensiones</translation> <translation id="119944043368869598">Borrar todo</translation> <translation id="123828989343052515">Nuevo escritorio</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Alimentación</translation> <translation id="6751826523481687655">Se activó el registro del rendimiento</translation> <translation id="6785414152754474415">La batería tiene un <ph name="PERCENTAGE" /> % de carga y se está cargando.</translation> +<translation id="6790428901817661496">Reproducir</translation> <translation id="6803622936009808957">No se pudieron reflejar las pantallas porque no se encontraron resoluciones compatibles. En su lugar, se activó el escritorio extendido.</translation> <translation id="6820676911989879663">Toma un descanso</translation> <translation id="683971173229319003">Tecla de búsqueda + L</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index cb8ce34..7c21be8 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Tus dispositivos funcionan aún mejor juntos</translation> <translation id="112308213915226829">Ocultar estantería automáticamente</translation> <translation id="1153356358378277386">Dispositivos vinculados</translation> +<translation id="1178581264944972037">Pausar</translation> <translation id="1195412055398077112">reajustar</translation> <translation id="119944043368869598">Eliminar todo</translation> <translation id="123828989343052515">Nuevo escritorio</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Batería</translation> <translation id="6751826523481687655">El control del rendimiento está activado</translation> <translation id="6785414152754474415">La batería se está cargando y está al <ph name="PERCENTAGE" />%.</translation> +<translation id="6790428901817661496">Reproducir</translation> <translation id="6803622936009808957">No se han podido duplicar las pantallas porque no se han encontrado resoluciones compatibles. Se ha utilizado el modo de escritorio ampliado en su lugar.</translation> <translation id="6820676911989879663">Haz una pausa</translation> <translation id="683971173229319003">Buscar+L</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index c88c8a40..42db42a 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Teie seadmed töötavad koos veelgi paremini</translation> <translation id="112308213915226829">Riiuli automaatne peitmine</translation> <translation id="1153356358378277386">Seotud seadmed</translation> +<translation id="1178581264944972037">Peata</translation> <translation id="1195412055398077112">liighälvitus</translation> <translation id="119944043368869598">Tühjenda kõik</translation> <translation id="123828989343052515">Uus laud</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Toide</translation> <translation id="6751826523481687655">Toimivuse jälgimine on sisse lülitatud</translation> <translation id="6785414152754474415">Aku on <ph name="PERCENTAGE" />% täis ja seda laetakse.</translation> +<translation id="6790428901817661496">Esita</translation> <translation id="6803622936009808957">Ei saanud kuvasid peegeldada, kuna toetatud eraldusvõimeid ei leitud. Selle asemel siseneti laiendatud töölaua režiimi.</translation> <translation id="6820676911989879663">Tehke paus!</translation> <translation id="683971173229319003">Otsing + L</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 9065451c..7a7edd4f3 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">دستگاههایتان باهم بهمراتب بهتر کار میکنند</translation> <translation id="112308213915226829">پنهان کردن خودکار قفسه</translation> <translation id="1153356358378277386">دستگاههای مرتبطشده</translation> +<translation id="1178581264944972037">مکث</translation> <translation id="1195412055398077112">بزرگتر از صفحه</translation> <translation id="119944043368869598">پاک کردن همه</translation> <translation id="123828989343052515">فضای کار جدید</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">نیرو</translation> <translation id="6751826523481687655">ردیابی عملکرد روشن است</translation> <translation id="6785414152754474415">باتری <ph name="PERCENTAGE" /> درصد پر و درحال شارژ است.</translation> +<translation id="6790428901817661496">پخش</translation> <translation id="6803622936009808957">نمایش یک تصویر واحد در چند صفحه نمایش ممکن نیست زیرا وضوح تصویر پشتیبانی شدهای وجود ندارد. بجای آن حالت نمایش دسکتاپ چند بخشی استفاده میشود.</translation> <translation id="6820676911989879663">استراحت کنید!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index a208f3c1..3e54128 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Laitteesi toimivat entistä paremmin yhdessä</translation> <translation id="112308213915226829">Piilota hylly automaattisesti</translation> <translation id="1153356358378277386">Laiteparit</translation> +<translation id="1178581264944972037">Tauko</translation> <translation id="1195412055398077112">kuvasta rajataan pois osa</translation> <translation id="119944043368869598">Tyhjennä kaikki</translation> <translation id="123828989343052515">Uusi työtila</translation> @@ -367,6 +368,7 @@ <translation id="6723839937902243910">Virta</translation> <translation id="6751826523481687655">Tehokkuuden seuranta on käytössä</translation> <translation id="6785414152754474415">Akussa on virtaa <ph name="PERCENTAGE" /> %, ja laite on kytketty laturiin.</translation> +<translation id="6790428901817661496">Toista</translation> <translation id="6803622936009808957">Näyttöjen peilaaminen ei onnistunut, sillä tuettua resoluutiota ei löytynyt. Sen sijaan valittiin työpöydän laajennus.</translation> <translation id="6820676911989879663">Pidä tauko</translation> <translation id="683971173229319003">Haku+L</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 3e83cd3c..21172807 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Gagana nang mas maayos ang iyong mga device kung magkakasama</translation> <translation id="112308213915226829">Awtomatikong itago ang shelf</translation> <translation id="1153356358378277386">Mga nakapares na device</translation> +<translation id="1178581264944972037">I-pause</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">I-clear lahat</translation> <translation id="123828989343052515">New Desk</translation> @@ -29,6 +30,7 @@ <translation id="1301069673413256657">GSM</translation> <translation id="1302880136325416935">Ipakita ang mga setting ng Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1316069254387866896">Palaging ipakita ang shelf</translation> +<translation id="1341651618736211726">Overflow</translation> <translation id="1346748346194534595">Kanan</translation> <translation id="1351937230027495976">I-collapse ang menu</translation> <translation id="1383876407941801731">Hanapin</translation> @@ -363,6 +365,7 @@ <translation id="6723839937902243910">Power</translation> <translation id="6751826523481687655">Naka-on ang pag-trace ng performance</translation> <translation id="6785414152754474415">Ang baterya ay <ph name="PERCENTAGE" />% na puno at nagcha-charge.</translation> +<translation id="6790428901817661496">I-play</translation> <translation id="6803622936009808957">Hindi ma-mirror ang mga display dahil walang mga sinusuportahang resolusyon na nakita. Pumasok na lang sa pinalawak na desktop.</translation> <translation id="6820676911989879663">Magpahinga!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 939df58..13f07d68 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vos appareils fonctionnent encore mieux ensemble</translation> <translation id="112308213915226829">Masquer automatiquement l'étagère</translation> <translation id="1153356358378277386">Appareils associés</translation> +<translation id="1178581264944972037">Suspendre</translation> <translation id="1195412055398077112">Surbalayage</translation> <translation id="119944043368869598">Tout effacer</translation> <translation id="123828989343052515">Nouveau bureau</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Alimentation</translation> <translation id="6751826523481687655">Le suivi des performances est activé</translation> <translation id="6785414152754474415">La batterie est chargée à <ph name="PERCENTAGE" /> % et en charge.</translation> +<translation id="6790428901817661496">Lire</translation> <translation id="6803622936009808957">Impossible de dupliquer les écrans, car aucune résolution compatible n'a été détectée. Le bureau étendu a été activé à la place.</translation> <translation id="6820676911989879663">Faites une pause !</translation> <translation id="683971173229319003">Recherche+L</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index cad6eed..90103e7c 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">તમારા ઉપકરણો એક સાથે હોય ત્યારે વધુ કાર્યક્ષમ હોય છે</translation> <translation id="112308213915226829">સ્વતઃછુપાવો શેલ્ફ</translation> <translation id="1153356358378277386">જોડી કરેલા ઉપકરણો</translation> +<translation id="1178581264944972037">થોભો</translation> <translation id="1195412055398077112">ઓવરસ્કૅન</translation> <translation id="119944043368869598">બધા દૂર કરો</translation> <translation id="123828989343052515">નવું ડેસ્ક</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">પાવર</translation> <translation id="6751826523481687655">કાર્યપ્રદર્શનની નોંધ રાખવાનું ચાલુ કરેલું છે</translation> <translation id="6785414152754474415">બેટરી <ph name="PERCENTAGE" /> % પૂર્ણ અને ચાર્જ થઈ રહી છે.</translation> +<translation id="6790428901817661496">ચલાવો</translation> <translation id="6803622936009808957">કોઈ સમર્થિત રિઝોલ્યૂશન મળ્યું ન હોવાથી, પ્રદર્શનોને પ્રતિબિંબિત કરી શકાયા નથી. તેને બદલે વિસ્તૃત ડેસ્કટૉપ દાખલ કર્યું.</translation> <translation id="6820676911989879663">વિરામ લો!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index b9a222c..250cda2d 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">साथ मिलकर आपके डिवाइस और बेहतर काम करते हैं</translation> <translation id="112308213915226829">अलमारी को स्वत: छिपाएं</translation> <translation id="1153356358378277386">युग्मित डिवाइस</translation> +<translation id="1178581264944972037">रोकें</translation> <translation id="1195412055398077112">ओवरस्कैन</translation> <translation id="119944043368869598">सारा डेटा साफ़ करें</translation> <translation id="123828989343052515">नई डेस्क</translation> @@ -42,13 +43,13 @@ <translation id="1537254971476575106">फ़ुलस्क्रीन पर सामग्री को बड़ा दिखाने की सुविधा</translation> <translation id="15373452373711364">बड़ा माउस कर्सर</translation> <translation id="1546492247443594934">डेस्क 2</translation> -<translation id="1550523713251050646">अधिक विकल्पों के लिए क्लिक करें</translation> +<translation id="1550523713251050646">ज़्यादा विकल्पों के लिए क्लिक करें</translation> <translation id="1570871743947603115">ब्लूटूथ टॉगल करें. <ph name="STATE_TEXT" /></translation> <translation id="1589090746204042747">इस सत्र में अपनी सभी गतिविधि एक्सेस करें</translation> <translation id="1608626060424371292">इस उपयोगकर्ता को हटाएं</translation> <translation id="1621499497873603021">बैटरी के खाली होने में शेष समय, <ph name="TIME_LEFT" /></translation> <translation id="1654477262762802994">बोलकर खोजना शुरू करें</translation> -<translation id="1658406695958299976">माफ़ करें, आपके पासवर्ड की अभी भी पुष्टि नहीं हो पाई है. नोट: अगर आपने हाल ही में अपना पासवर्ड बदला है, तो आपके साइन आउट होते ही आपका नया पासवर्ड लागू हो जाएगा, कृपया यहां पुराने पासवर्ड का इस्तेमाल करें.</translation> +<translation id="1658406695958299976">माफ़ करें, आपके पासवर्ड की अब भी पुष्टि नहीं हो पाई है. नोट: अगर आपने हाल ही में अपना पासवर्ड बदला है, तो आपके साइन आउट होते ही आपका नया पासवर्ड लागू हो जाएगा, कृपया यहां पुराने पासवर्ड का इस्तेमाल करें.</translation> <translation id="1677472565718498478"><ph name="TIME" /> शेष</translation> <translation id="1698760176351776263">IPv6 पता: <ph name="ADDRESS" /></translation> <translation id="1743570585616704562">उंगली की पहचान नहीं हो सकी</translation> @@ -156,7 +157,7 @@ <translation id="3236488194889173876">कोई मोबाइल नेटवर्क उपलब्ध नहीं</translation> <translation id="3255483164551725916">तुम क्या-क्या कर सकती हो?</translation> <translation id="3294437725009624529">अतिथि</translation> -<translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> अभी भी बाद में साइन इन कर सकते हैं.</translation> +<translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> अब भी बाद में साइन इन कर सकते हैं.</translation> <translation id="3321628682574733415">माता-पिता वाला कोड गलत है</translation> <translation id="332587331255250389">कृपया बैटरी बदलें</translation> <translation id="3351879221545518001">आप इस समय स्क्रीन कास्ट कर रहे हैं.</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">पावर</translation> <translation id="6751826523481687655">'परफ़ॉर्मेंस ट्रेसिंग' चालू कर दी गई है</translation> <translation id="6785414152754474415">बैटरी <ph name="PERCENTAGE" />% भरी हुई है और चार्ज हो रही है.</translation> +<translation id="6790428901817661496">चलाएं</translation> <translation id="6803622936009808957">प्रदर्शनों को मिरर नहीं किया जा सका क्योंकि कोई समर्थित रिज़ॉल्यूशन नहीं मिला. इसके बजाय विस्तारित डेस्कटॉप में चला गया है.</translation> <translation id="6820676911989879663">आज के लिए इतना ही!</translation> <translation id="683971173229319003">Search+L</translation> @@ -377,7 +379,7 @@ <translation id="7025533177575372252">अपने <ph name="DEVICE_NAME" /> को अपने फ़ोन से कनेक्ट करें</translation> <translation id="7029814467594812963">सत्र से बाहर निकलें</translation> <translation id="7066646422045619941">यह नेटवर्क आपके व्यवस्थापक द्वारा अक्षम किया गया है.</translation> -<translation id="7067196344162293536">स्वत: घुमाएं</translation> +<translation id="7067196344162293536">अपने आप घूमना</translation> <translation id="7068360136237591149">फ़ाइल खोलो</translation> <translation id="7076293881109082629">प्रवेश किया जा रहा है...</translation> <translation id="7092922358121866860">नाइट लाइट की सेटिंग दिखाएं</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 2ec1325e..1edbd982 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vaši uređaji funkcioniraju još bolje zajedno</translation> <translation id="112308213915226829">Automatski sakrij policu</translation> <translation id="1153356358378277386">Upareni uređaji</translation> +<translation id="1178581264944972037">Pauziraj</translation> <translation id="1195412055398077112">rubno područje zaslona</translation> <translation id="119944043368869598">Očisti sve</translation> <translation id="123828989343052515">Novi radni stol</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Napajanje</translation> <translation id="6751826523481687655">Uključeno je praćenje izvedbe</translation> <translation id="6785414152754474415">Baterija je <ph name="PERCENTAGE" />% puna i puni se.</translation> +<translation id="6790428901817661496">Reproduciraj</translation> <translation id="6803622936009808957">Nije bilo moguće zrcaliti zaslone jer nije pronađena nijedna podržana razlučivost. Umjesto toga proširena je radna površina.</translation> <translation id="6820676911989879663">Odmorite se!</translation> <translation id="683971173229319003">Pretraživanje + L</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 728d63a5..901ffefe 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Eszközei együtt még jobban működnek</translation> <translation id="112308213915226829">Polc automatikus elrejtése</translation> <translation id="1153356358378277386">Párosított eszközök</translation> +<translation id="1178581264944972037">Szünet</translation> <translation id="1195412055398077112">túlpásztázás</translation> <translation id="119944043368869598">Összes törlése</translation> <translation id="123828989343052515">Új asztal</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Energiaellátás</translation> <translation id="6751826523481687655">A teljesítménykövetés be van kapcsolva</translation> <translation id="6785414152754474415">Az akkumulátor töltöttsége <ph name="PERCENTAGE" />%, és töltődik.</translation> +<translation id="6790428901817661496">Játék</translation> <translation id="6803622936009808957">A kijelzők tükrözése sikertelen, mivel nem található támogatott felbontás. Ehelyett kiterjesztett asztal módba váltott a rendszer.</translation> <translation id="6820676911989879663">Tartson egy kis szünetet!</translation> <translation id="683971173229319003">Keresés+L</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 05925191..5e31928 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Perangkat berfungsi lebih baik jika digunakan bersama</translation> <translation id="112308213915226829">Sembunyikan otomatis rak</translation> <translation id="1153356358378277386">Perangkat dihubungkan</translation> +<translation id="1178581264944972037">Jeda</translation> <translation id="1195412055398077112">pemindaian berlebih</translation> <translation id="119944043368869598">Hapus semua</translation> <translation id="123828989343052515">Halaman Kerja Baru</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Daya</translation> <translation id="6751826523481687655">Pelacakan performa diaktifkan</translation> <translation id="6785414152754474415">Baterai sudah terisi <ph name="PERCENTAGE" />% dan masih mengisi.</translation> +<translation id="6790428901817661496">Putar</translation> <translation id="6803622936009808957">Tidak dapat menggandakan tampilan karena tidak ditemukan resolusi yang didukung. Memasuki desktop yang diperluas sebagai gantinya.</translation> <translation id="6820676911989879663">Istirahatlah sebentar</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 80ea922..a2c5dc6 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">I tuoi dispositivi funzionano ancora meglio insieme</translation> <translation id="112308213915226829">Nascondi automaticamente shelf</translation> <translation id="1153356358378277386">Dispositivi accoppiati</translation> +<translation id="1178581264944972037">Pausa</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Cancella tutto</translation> <translation id="123828989343052515">Nuova scrivania</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Alimentazione</translation> <translation id="6751826523481687655">La traccia delle prestazioni è attiva</translation> <translation id="6785414152754474415">Percentuale di caricamento batteria: <ph name="PERCENTAGE" />%. La batteria è in carica.</translation> +<translation id="6790428901817661496">Play</translation> <translation id="6803622936009808957">Impossibile duplicare i display perché non sono state trovate risoluzioni supportate. È stato attivato il desktop esteso.</translation> <translation id="6820676911989879663">Fai una pausa!</translation> <translation id="683971173229319003">Tasto di ricerca+L</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 5e7ac42a..aab586c 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">ביחד, המכשירים שלך יוכלו לעבוד עוד יותר טוב</translation> <translation id="112308213915226829">הסתרה אוטומטית של המדף</translation> <translation id="1153356358378277386">מכשירים מותאמים</translation> +<translation id="1178581264944972037">השהה</translation> <translation id="1195412055398077112">סריקת יתר</translation> <translation id="119944043368869598">ניקוי הכל</translation> <translation id="123828989343052515">שולחן עבודה חדש</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">חשמל</translation> <translation id="6751826523481687655">מעקב הביצועים פועל</translation> <translation id="6785414152754474415">הסוללה טעונה ברמה של <ph name="PERCENTAGE" />% ומתבצעת טעינה.</translation> +<translation id="6790428901817661496">הפעל</translation> <translation id="6803622936009808957">לא ניתן היה לשקף מסכים מכיוון שלא נמצאה רזולוציה נתמכת. במקום זאת התצוגה עברה למצב שולחן עבודה מורחב.</translation> <translation id="6820676911989879663">הגיע הזמן להפסקה</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index d2e0e21..53f3530 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">デバイスを連携させると活用の幅が広がります</translation> <translation id="112308213915226829">シェルフを自動的に隠す</translation> <translation id="1153356358378277386">ペア設定されたデバイス</translation> +<translation id="1178581264944972037">一時停止</translation> <translation id="1195412055398077112">オーバースキャン</translation> <translation id="119944043368869598">すべて削除</translation> <translation id="123828989343052515">新しいデスク</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">電源</translation> <translation id="6751826523481687655">パフォーマンス追跡機能が有効になっています</translation> <translation id="6785414152754474415">バッテリー残量: <ph name="PERCENTAGE" />%、充電しています。</translation> +<translation id="6790428901817661496">再生</translation> <translation id="6803622936009808957">サポートされている解像度が見つからなかったため、ディスプレイをミラーリングできませんでした。代わりに拡張デスクトップ モードに切り替えました。</translation> <translation id="6820676911989879663">休憩の時間です!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index feeacf4e..1cde546 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">ನಿಮ್ಮ ಸಾಧನಗಳು ಜೊತೆಯಲ್ಲಿ ಇನ್ನೂ ಚೆನ್ನಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತವೆ</translation> <translation id="112308213915226829">ಶೆಲ್ಫ್ ಅನ್ನು ಸ್ವಯಂಮರೆಮಾಡು</translation> <translation id="1153356358378277386">ಜೋಡಿ ಮಾಡಲಾದ ಸಾಧನಗಳು</translation> +<translation id="1178581264944972037">ವಿರಾಮ</translation> <translation id="1195412055398077112">ಓವರ್ಸ್ಕ್ಯಾನ್</translation> <translation id="119944043368869598">ಎಲ್ಲವನ್ನೂ ತೆಗೆದುಹಾಕಿ</translation> <translation id="123828989343052515">ಹೊಸ ಡೆಸ್ಕ್</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">ಪವರ್</translation> <translation id="6751826523481687655">ಕಾರ್ಯಕ್ಷಮತೆಯ ಟ್ರೇಸಿಂಗ್ ಅನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="6785414152754474415">ಬ್ಯಾಟರಿ <ph name="PERCENTAGE" />% ಪೂರ್ಣಗೊಂಡಿದೆ ಮತ್ತು ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ.</translation> +<translation id="6790428901817661496">ಪ್ಲೇ ಮಾಡು</translation> <translation id="6803622936009808957">ಯಾವುದೇ ಬೆಂಬಲಿತ ಪರಿಹಾರಗಳು ಕಂಡುಬರದ ಕಾರಣ ಪ್ರದರ್ಶನಗಳನ್ನು ಪ್ರತಿಬಿಂಬಿಸಲಾಗಲಿಲ್ಲ. ಬದಲಿಗೆ ವಿಸ್ತರಿತ ಡೆಸ್ಕ್ಟಾಪ್ ಅನ್ನು ನಮೂದಿಸಲಾಗಿದೆ.</translation> <translation id="6820676911989879663">ವಿರಾಮ ತೆಗೆದುಕೊಳ್ಳಿ!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index c30b4b86..fe98e15 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">연결된 기기가 더욱 원활하게 작동합니다</translation> <translation id="112308213915226829">실행기 자동 숨김</translation> <translation id="1153356358378277386">페어링된 기기</translation> +<translation id="1178581264944972037">일시중지</translation> <translation id="1195412055398077112">오버스캔</translation> <translation id="119944043368869598">모두 삭제</translation> <translation id="123828989343052515">새 데스크</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">전원</translation> <translation id="6751826523481687655">성능 추적이 사용 설정되어 있습니다.</translation> <translation id="6785414152754474415">배터리가 <ph name="PERCENTAGE" />% 충전되었으며 충전 중입니다.</translation> +<translation id="6790428901817661496">재생</translation> <translation id="6803622936009808957">지원되는 해상도가 없으므로 디스플레이를 그대로 반영할 수 없습니다. 대신 확장 데스크톱을 시작했습니다.</translation> <translation id="6820676911989879663">잠시 쉬어 가세요.</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index f731aa8..fab5da87 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Jūsų įrenginiai kartu veikia dar geriau</translation> <translation id="112308213915226829">Automatiškai slėpti lentyną</translation> <translation id="1153356358378277386">Susieti įrenginiai</translation> +<translation id="1178581264944972037">Pristabdyti</translation> <translation id="1195412055398077112">sritis aplink vaizdo kraštus</translation> <translation id="119944043368869598">Valyti viską</translation> <translation id="123828989343052515">Naujas pultas</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Maitinimas</translation> <translation id="6751826523481687655">Našumo stebėjimas įjungtas</translation> <translation id="6785414152754474415">Likusi akumuliatoriaus įkrova: <ph name="PERCENTAGE" /> %. Jis įkraunamas.</translation> +<translation id="6790428901817661496">Žaisti</translation> <translation id="6803622936009808957">Nepavyko dubliuoti vaizdų, nes nepavyko rasti palaikomų skyrų. Vietoje to įjungtas išplėstinio darbalaukio režimas.</translation> <translation id="6820676911989879663">Padarykite pertrauką!</translation> <translation id="683971173229319003">Paieškos klavišas + L</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 0a92bd4..7c3e3bf 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Kopā jūsu ierīces darbojas vēl labāk</translation> <translation id="112308213915226829">Automātiski slēpt plauktu</translation> <translation id="1153356358378277386">Pārī savienotās ierīces</translation> +<translation id="1178581264944972037">Pauzēt</translation> <translation id="1195412055398077112">attēla izvērse</translation> <translation id="119944043368869598">Notīrīt visu</translation> <translation id="123828989343052515">Jauns galds</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Strāvas padeve</translation> <translation id="6751826523481687655">Veiktspējas izsekošana ir ieslēgta.</translation> <translation id="6785414152754474415">Akumulatora uzlādes līmenis: <ph name="PERCENTAGE" />%; uzlāde tiek turpināta.</translation> +<translation id="6790428901817661496">Atskaņot</translation> <translation id="6803622936009808957">Nevarēja spoguļot displejus, jo netika atrasta atbalstīta izšķirtspēja. Tā vietā tika aktivizēts paplašinātās darbvirsmas režīms.</translation> <translation id="6820676911989879663">Laiks pārtraukumam</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index e870597..88ec534 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">നിങ്ങളുടെ ഉപകരണങ്ങൾ 'ഒരുമിച്ചും' നന്നായി പ്രവർത്തിക്കും</translation> <translation id="112308213915226829">ഷെൽഫ് സ്വയമേവ മറയ്ക്കുക</translation> <translation id="1153356358378277386">ജോടിയാക്കിയ ഉപകരണങ്ങൾ</translation> +<translation id="1178581264944972037">അല്പംനിര്ത്തൂ</translation> <translation id="1195412055398077112">ഓവർസ്കാൻ</translation> <translation id="119944043368869598">എല്ലാം നീക്കുക</translation> <translation id="123828989343052515">പുതിയ ഡെസ്ക്</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">പവർ</translation> <translation id="6751826523481687655">പ്രകടനം പിന്തുടരൽ ഓണാണ്</translation> <translation id="6785414152754474415">ബാറ്ററി <ph name="PERCENTAGE" />% നിറഞ്ഞിരിക്കുന്നു, ചാർജുചെയ്യൽ തുടരുന്നു.</translation> +<translation id="6790428901817661496">പ്ലേചെയ്യുക</translation> <translation id="6803622936009808957">പിന്തുണയ്ക്കുന്ന മിഴിവുകൾ കണ്ടെത്താത്തതിനാൽ പ്രദർശനങ്ങൾ പ്രതിഫലിപ്പിക്കാനായില്ല. പകരം വിപുലീകൃത ഡെസ്ക്ടോപ്പ് നൽകി.</translation> <translation id="6820676911989879663">ഒരു ഇടവേള എടുക്കൂ!</translation> <translation id="683971173229319003">തിരയൽ+L</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 86a6839..cae407b 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">तुमची डिव्हाइस एकत्र आणखी चांगले काम करतात</translation> <translation id="112308213915226829">शेल्फ स्वयं लपवा</translation> <translation id="1153356358378277386">जोडलेली डिव्हाइस</translation> +<translation id="1178581264944972037">विराम द्या</translation> <translation id="1195412055398077112">ओव्हरस्कॅन</translation> <translation id="119944043368869598">सर्व साफ करा</translation> <translation id="123828989343052515">नवीन डेस्क</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">सामर्थ्य</translation> <translation id="6751826523481687655">परफॉर्मंस ट्रेसिंग चालू आहे</translation> <translation id="6785414152754474415">बॅटरी <ph name="PERCENTAGE" />% भरली आहे आणि चार्ज होत आहे.</translation> +<translation id="6790428901817661496">प्ले करा</translation> <translation id="6803622936009808957">समर्थित रिजोल्यूशन न आढळल्यामुळे प्रदर्शने मिरर करू शकली नाहीत. त्याऐवजी विस्तारित डेस्कटॉप एंटर केला.</translation> <translation id="6820676911989879663">ब्रेक घ्या!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index b5b51d3..ea44a93 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Peranti anda akan berfungsi lebih baik bersama-sama</translation> <translation id="112308213915226829">Autosembunyi rak</translation> <translation id="1153356358378277386">Peranti digandingkan</translation> +<translation id="1178581264944972037">Jeda</translation> <translation id="1195412055398077112">imbas lampau</translation> <translation id="119944043368869598">Kosongkan semua</translation> <translation id="123828989343052515">Meja Baharu</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Kuasa</translation> <translation id="6751826523481687655">Pengesanan prestasi dihidupkan</translation> <translation id="6785414152754474415">Bateri <ph name="PERCENTAGE" />% penuh dan sedang dicas.</translation> +<translation id="6790428901817661496">Mainkan</translation> <translation id="6803622936009808957">Tidak dapat membalikkan paparan memandangkan tiada peleraian disokong ditemui. Sebaliknya, memasuki mod desktop yang dilanjutkan.</translation> <translation id="6820676911989879663">Berehatlah!</translation> <translation id="683971173229319003">Carian+L</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 0f869ad..1ab75ff 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Je apparaten werken samen nog beter</translation> <translation id="112308213915226829">Plank automatisch verbergen</translation> <translation id="1153356358378277386">Gekoppelde apparaten</translation> +<translation id="1178581264944972037">Onderbreken</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Alles wissen</translation> <translation id="123828989343052515">Nieuw bureau</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Voeding</translation> <translation id="6751826523481687655">Bijhouden van prestaties is ingeschakeld</translation> <translation id="6785414152754474415">De batterij is <ph name="PERCENTAGE" />% vol en wordt opgeladen.</translation> +<translation id="6790428901817661496">Spelen</translation> <translation id="6803622936009808957">Kan schermen niet spiegelen, omdat er geen ondersteunde resoluties zijn gevonden. Het uitgebreide bureaublad is geactiveerd.</translation> <translation id="6820676911989879663">Neem een pauze</translation> <translation id="683971173229319003">Zoeken+L</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 34fa61d..e83f020a 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Enhetene fungerer enda bedre sammen</translation> <translation id="112308213915226829">Skjul hyllen automatisk</translation> <translation id="1153356358378277386">Tilkoblede enheter</translation> +<translation id="1178581264944972037">Stans midlertidig</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Fjern alle</translation> <translation id="123828989343052515">Nytt arbeidsområde</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Strøm</translation> <translation id="6751826523481687655">Ytelsessporing er slått på</translation> <translation id="6785414152754474415">Batteriet er <ph name="PERCENTAGE" /> % fullt og til lading.</translation> +<translation id="6790428901817661496">Spill av</translation> <translation id="6803622936009808957">Kunne ikke speile skjermene fordi ingen støttede oppløsninger ble funnet. Utvidet skrivebord ble brukt i stedet.</translation> <translation id="6820676911989879663">Ta en pause!</translation> <translation id="683971173229319003">Søk+L</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index e049355..2c069dd 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Razem Twoje urządzenia mogą jeszcze więcej</translation> <translation id="112308213915226829">Autoukrywanie półki</translation> <translation id="1153356358378277386">Sparowane urządzenia</translation> +<translation id="1178581264944972037">Wstrzymaj</translation> <translation id="1195412055398077112">nadmiarowość obrazu</translation> <translation id="119944043368869598">Wyczyść wszystko</translation> <translation id="123828989343052515">Nowy pulpit</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Zasilanie</translation> <translation id="6751826523481687655">Śledzenie wydajności jest włączone</translation> <translation id="6785414152754474415">Naładowanie baterii: <ph name="PERCENTAGE" />%. Trwa ładowanie.</translation> +<translation id="6790428901817661496">Odtwórz</translation> <translation id="6803622936009808957">Nie można wyświetlić odbicia lustrzanego, ponieważ nie znaleziono obsługiwanych rozdzielczości. Zamiast tego został włączony pulpit rozszerzony.</translation> <translation id="6820676911989879663">Zrób sobie przerwę</translation> <translation id="683971173229319003">Szukaj+L</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 4d108f34..53fe2989 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Seus dispositivos funcionam ainda melhor juntos</translation> <translation id="112308213915226829">Ocultar estante automaticamente</translation> <translation id="1153356358378277386">Dispositivos pareados</translation> +<translation id="1178581264944972037">Pausar</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Limpar tudo</translation> <translation id="123828989343052515">Nova área</translation> @@ -366,6 +367,7 @@ <translation id="6723839937902243910">Energia</translation> <translation id="6751826523481687655">O acompanhamento de desempenho está ativado</translation> <translation id="6785414152754474415">A bateria está <ph name="PERCENTAGE" />% cheia e carregando.</translation> +<translation id="6790428901817661496">Reproduzir</translation> <translation id="6803622936009808957">Não foi possível espelhar os displays porque não foram encontradas resoluções suportadas. Em vez disso, foi ativada a área de trabalho estendida.</translation> <translation id="6820676911989879663">Faça uma pausa</translation> <translation id="683971173229319003">Pesquisa+L</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index ae5aec3..af9a7e4 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Os seus dispositivos funcionam ainda melhor juntos</translation> <translation id="112308213915226829">Ocultar prateleira automaticamente</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> +<translation id="1178581264944972037">Pausa</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Limpar tudo</translation> <translation id="123828989343052515">Novo espaço de trabalho</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Alimentação</translation> <translation id="6751826523481687655">O rastreio do desempenho está ativado.</translation> <translation id="6785414152754474415">A bateria está <ph name="PERCENTAGE" />% cheia e a carregar.</translation> +<translation id="6790428901817661496">Reproduzir</translation> <translation id="6803622936009808957">Não foi possível espelhar os ecrãs, porque não foram encontradas resoluções suportadas. Em vez disso, entrou no ambiente de trabalho expandido.</translation> <translation id="6820676911989879663">Faça uma pausa!</translation> <translation id="683971173229319003">Pesquisa+L</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 8ea80fe0..28eb526 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Dispozitivele funcționează și mai bine împreună</translation> <translation id="112308213915226829">Ascundeți automat raftul</translation> <translation id="1153356358378277386">Dispozitive asociate</translation> +<translation id="1178581264944972037">Întrerupe</translation> <translation id="1195412055398077112">suprascanare</translation> <translation id="119944043368869598">Șterge-le pe toate</translation> <translation id="123828989343052515">Birou nou</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Alimentare</translation> <translation id="6751826523481687655">Urmărirea performanțelor este activată</translation> <translation id="6785414152754474415">Nivelul bateriei este de <ph name="PERCENTAGE" />% și se încarcă.</translation> +<translation id="6790428901817661496">Redă</translation> <translation id="6803622936009808957">Afișajele nu au putut fi oglindite, deoarece nu au fost găsite rezoluții acceptate. Ați intrat, în schimb, în modul monitor extins.</translation> <translation id="6820676911989879663">Fă o pauză!</translation> <translation id="683971173229319003">Tasta de căutare + L</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 87c21404..59a67c1 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Вместе ваши устройства будут работать ещё лучше</translation> <translation id="112308213915226829">Автоматически скрывать панель запуска</translation> <translation id="1153356358378277386">Сопряженные устройства</translation> +<translation id="1178581264944972037">Пауза</translation> <translation id="1195412055398077112">Каемка экрана</translation> <translation id="119944043368869598">Удалить все</translation> <translation id="123828989343052515">Добавить рабочий стол</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Питание</translation> <translation id="6751826523481687655">Отслеживание эффективности включено.</translation> <translation id="6785414152754474415">Батарея заряжена на <ph name="PERCENTAGE" />% и подключена к источнику питания.</translation> +<translation id="6790428901817661496">Воспроизвести</translation> <translation id="6803622936009808957">Не удалось дублировать изображение экрана, т. к. указанное разрешение не поддерживается. Включен режим расширенного рабочего стола.</translation> <translation id="6820676911989879663">Пора отдохнуть!</translation> <translation id="683971173229319003">Клавиша поиска + L</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index e387d72..c8ca8433 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vaše zariadenia fungujú spoločne ešte lepšie</translation> <translation id="112308213915226829">Automatické skrývanie poličky</translation> <translation id="1153356358378277386">Spárované zariadenia</translation> +<translation id="1178581264944972037">Pozastaviť</translation> <translation id="1195412055398077112">presah obsahu</translation> <translation id="119944043368869598">Vymazať všetko</translation> <translation id="123828989343052515">Nový pracovný priestor</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Napájanie</translation> <translation id="6751826523481687655">Trasovanie výkonnosti je zapnuté</translation> <translation id="6785414152754474415">Batéria je nabitá na <ph name="PERCENTAGE" /> % a nabíja sa.</translation> +<translation id="6790428901817661496">Prehrať</translation> <translation id="6803622936009808957">Obraz na monitoroch sa nedá zrkadliť, pretože sa nenašli podporované rozlíšenia. Namiesto toho sa spustil režim rozšírenej pracovnej plochy.</translation> <translation id="6820676911989879663">Urobte si prestávku.</translation> <translation id="683971173229319003">Hľadať+L</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 92b415d6..94ad111 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Naprave delujejo še bolje skupaj</translation> <translation id="112308213915226829">Samodejno skrivanje police</translation> <translation id="1153356358378277386">Seznanjene naprave</translation> +<translation id="1178581264944972037">Prekini</translation> <translation id="1195412055398077112">upodabljanje čez rob zaslona</translation> <translation id="119944043368869598">Izbriši vse</translation> <translation id="123828989343052515">Nova delovna miza</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Napajanje</translation> <translation id="6751826523481687655">Sledenje učinkovitosti delovanja je vklopljeno</translation> <translation id="6785414152754474415">Napolnjenost akumulatorja: <ph name="PERCENTAGE" /> % – polnjenje še poteka.</translation> +<translation id="6790428901817661496">Predvajanje</translation> <translation id="6803622936009808957">Zaslonov ni bilo mogoče zrcaliti, ker ni bilo najdene nobene podprte ločljivosti. Uporabljeno je razširjeno namizje.</translation> <translation id="6820676911989879663">Čas za odmor!</translation> <translation id="683971173229319003">Iskanje + L</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index ecd07b8..2558c2e0 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Уређаји заједно функционишу још боље</translation> <translation id="112308213915226829">Аутоматски сакриј полицу</translation> <translation id="1153356358378277386">Упарени уређаји</translation> +<translation id="1178581264944972037">Паузирај</translation> <translation id="1195412055398077112">ивично подручје екрана</translation> <translation id="119944043368869598">Обриши све</translation> <translation id="123828989343052515">Нов радни сто</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Енергија</translation> <translation id="6751826523481687655">Праћење учинка је укључено</translation> <translation id="6785414152754474415">Батерија је <ph name="PERCENTAGE" />% пуна и још увек се пуни.</translation> +<translation id="6790428901817661496">Пусти</translation> <translation id="6803622936009808957">Није могуће пресликати екране зато што није пронађена ниједна подржана резолуција. Уместо тога, приказује се проширена радна површина.</translation> <translation id="6820676911989879663">Направите паузу!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 65c2738..4ed4387 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Dina enheter fungerar ännu bättre tillsammans</translation> <translation id="112308213915226829">Dölj hyllan automatiskt</translation> <translation id="1153356358378277386">Kopplade enheter</translation> +<translation id="1178581264944972037">Paus</translation> <translation id="1195412055398077112">överskanning</translation> <translation id="119944043368869598">Ta bort alla</translation> <translation id="123828989343052515">Ny arbetsyta</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Batteri</translation> <translation id="6751826523481687655">Prestandaspårning har aktiverats</translation> <translation id="6785414152754474415">Batteriet är fullt till <ph name="PERCENTAGE" /> % och laddas.</translation> +<translation id="6790428901817661496">Spela</translation> <translation id="6803622936009808957">Det gick inte att spegla visningar eftersom inga upplösningar som stöds hittades. Utökat skrivbordsläge används i stället.</translation> <translation id="6820676911989879663">Ta en paus!</translation> <translation id="683971173229319003">Sök+L</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index b7fcdb2c..4543308 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vifaa vyako vitafanya kazi vizuri vikiwa pamoja</translation> <translation id="112308213915226829">Ficha rafu kiotomatiki</translation> <translation id="1153356358378277386">Vifaa vilivyooanishwa</translation> +<translation id="1178581264944972037">Sitisha</translation> <translation id="1195412055398077112">angalia kwa ujumla:</translation> <translation id="119944043368869598">Ondoa vyote</translation> <translation id="123828989343052515">Sehemu Mpya ya Kufanyia Kazi</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Nishati</translation> <translation id="6751826523481687655">Kipengele cha ufuatiliaji wa utendaji kimewashwa</translation> <translation id="6785414152754474415">Betri imejaa <ph name="PERCENTAGE" />% na inachaji.</translation> +<translation id="6790428901817661496">Cheza</translation> <translation id="6803622936009808957">Haikuweza kuakisi maonyesho kwa kuwa hakuna misongo inayoweza kutumiwa iliyopatikana. Badala yake imeingia eneo-kazi lililopanuliwa.</translation> <translation id="6820676911989879663">Pumzika kidogo!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 7ab24d4..fa74f9e4 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">இணைத்தால், உங்கள் சாதனங்கள் இன்னும் சிறப்பாக வேலை செய்யும்</translation> <translation id="112308213915226829">அடுக்கைத் தானாக மறை</translation> <translation id="1153356358378277386">இணைத்த சாதனங்கள்</translation> +<translation id="1178581264944972037">இடைநிறுத்து</translation> <translation id="1195412055398077112">ஓவர்ஸ்கேன்</translation> <translation id="119944043368869598">அனைத்தையும் அழி</translation> <translation id="123828989343052515">புதிய டெஸ்க்</translation> @@ -357,6 +358,7 @@ <translation id="6723839937902243910">ஆற்றல்</translation> <translation id="6751826523481687655">செயல்திறன் டிரேஸிங் இயக்கத்தில் உள்ளது</translation> <translation id="6785414152754474415">பேட்டரி <ph name="PERCENTAGE" />% நிரம்பியது, மேலும் சார்ஜ் ஆகிறது.</translation> +<translation id="6790428901817661496">இயக்கு</translation> <translation id="6803622936009808957">ஆதரிக்கும் தெளிவுகள் கிடைக்காததால் காட்சிகளைப் பிரதிபலிக்க முடியவில்லை. பதிலாக நீட்டிக்கப்பட்ட டெஸ்க்டாப்பிற்குச் சென்றது.</translation> <translation id="6820676911989879663">சிறிது நேரம் இடைவேளை எடுத்துக்கொள்ளவும்!</translation> <translation id="683971173229319003">தேடல்+L</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 115430e..ef48874f 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">మీ పరికరాలు కలిసికట్టుగా మరింత బాగా పనిచేస్తాయి</translation> <translation id="112308213915226829">అరను స్వయంచాలకంగా దాచు</translation> <translation id="1153356358378277386">జత చేసిన పరికరాలు</translation> +<translation id="1178581264944972037">పాజ్ చేయి</translation> <translation id="1195412055398077112">ఓవర్స్కాన్</translation> <translation id="119944043368869598">అన్ని క్లియర్ చెయ్యి</translation> <translation id="123828989343052515">కొత్త డెస్క్</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">పవర్</translation> <translation id="6751826523481687655">పనితీరు స్థితిగతి కనుగొనడం ఆన్లో ఉంది</translation> <translation id="6785414152754474415">బ్యాటరీ <ph name="PERCENTAGE" />% నిండింది. ఛార్జ్ అవుతోంది.</translation> +<translation id="6790428901817661496">ప్లే చేయి</translation> <translation id="6803622936009808957">మద్దతు ఉన్న రిజల్యూషన్లు కనుగొనబడనందున ప్రదర్శనలను ప్రతిబింబించడం సాధ్యపడలేదు. దానికి బదులుగా విస్తారిత డెస్క్టాప్కు మారారు.</translation> <translation id="6820676911989879663">విరామం తీసుకోండి!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 7d434d1e..edae169 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">อุปกรณ์จะทำงานได้ดียิ่งขึ้นเมื่อใช้ร่วมกัน</translation> <translation id="112308213915226829">ซ่อนชั้นวางโดยอัตโนมัติ</translation> <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation> +<translation id="1178581264944972037">หยุดชั่วคราว</translation> <translation id="1195412055398077112">โอเวอร์สแกน</translation> <translation id="119944043368869598">ล้างทั้งหมด</translation> <translation id="123828989343052515">พื้นที่ทำงานใหม่</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">พลังงาน</translation> <translation id="6751826523481687655">การติดตามประสิทธิภาพเปิดอยู่</translation> <translation id="6785414152754474415">มีแบตเตอรี่ <ph name="PERCENTAGE" />% และกำลังชาร์จ</translation> +<translation id="6790428901817661496">เล่น</translation> <translation id="6803622936009808957">ไม่สามารถแสดงผลคู่ขนานได้เนื่องจากไม่พบความละเอียดที่สนับสนุน เข้าสู่เดสก์ท็อปแบบขยายแทน</translation> <translation id="6820676911989879663">พักสายตาหน่อย</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index ed7be45..077c07a 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Cihazlarınız birlikte daha da iyi çalışır</translation> <translation id="112308213915226829">Rafı otomatik gizle</translation> <translation id="1153356358378277386">Eşlenen cihazlar</translation> +<translation id="1178581264944972037">Duraklat</translation> <translation id="1195412055398077112">fazla tarama</translation> <translation id="119944043368869598">Tümünü temizle</translation> <translation id="123828989343052515">Yeni Masa</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Güç</translation> <translation id="6751826523481687655">Performans izleme açık</translation> <translation id="6785414152754474415">Pil %<ph name="PERCENTAGE" /> dolu ve şarj oluyor.</translation> +<translation id="6790428901817661496">Oynat</translation> <translation id="6803622936009808957">Desteklenen bir çözünürlük bulunamadığı için ekranlar yansıtılamıyor. Bunun yerine genişletilmiş masaüstüne geçiliyor.</translation> <translation id="6820676911989879663">Mola verin!</translation> <translation id="683971173229319003">Ara+L</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index ecd3133..25514b2 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Ваші пристрої працюватимуть разом ще краще</translation> <translation id="112308213915226829">Автоматично ховати полицю</translation> <translation id="1153356358378277386">Підключені пристрої</translation> +<translation id="1178581264944972037">Пауза</translation> <translation id="1195412055398077112">облямівка екрана</translation> <translation id="119944043368869598">Очистити все</translation> <translation id="123828989343052515">Новий робочий стіл</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">Заряд</translation> <translation id="6751826523481687655">Відстеження ефективності ввімкнено</translation> <translation id="6785414152754474415">Акумулятор заряджений на <ph name="PERCENTAGE" />% і заряджається.</translation> +<translation id="6790428901817661496">Відтворити</translation> <translation id="6803622936009808957">Не вдалося дублювати зображення екранів, оскільки не знайдено підтримувані значення роздільної здатності. Натомість запущено режим розширеного робочого столу.</translation> <translation id="6820676911989879663">Зробіть перерву!</translation> <translation id="683971173229319003">Search (Пошук)+L</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index f96961eb..3b23879 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Các thiết bị của bạn hoạt động hiệu quả hơn khi kết nối với nhau</translation> <translation id="112308213915226829">Tự động ẩn giá</translation> <translation id="1153356358378277386">Thiết bị được ghép nối</translation> +<translation id="1178581264944972037">Tạm dừng</translation> <translation id="1195412055398077112">quét quá mức</translation> <translation id="119944043368869598">Xóa tất cả</translation> <translation id="123828989343052515">Không gian làm việc mới</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">Nguồn</translation> <translation id="6751826523481687655">Tính năng theo dõi hiệu suất đang bật</translation> <translation id="6785414152754474415">Pin đầy <ph name="PERCENTAGE" />% và đang sạc.</translation> +<translation id="6790428901817661496">Phát</translation> <translation id="6803622936009808957">Không thể phản chiếu màn hình do không tìm thấy độ phân giải được hỗ trợ. Thay vào đó, đã chuyển sang chế độ màn hình mở rộng.</translation> <translation id="6820676911989879663">Hãy nghỉ giải lao!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index e60b937..c63f39d 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">协同运作可使您的各部设备更好地发挥作用</translation> <translation id="112308213915226829">自动隐藏任务栏</translation> <translation id="1153356358378277386">已配对的设备</translation> +<translation id="1178581264944972037">暂停</translation> <translation id="1195412055398077112">过扫描</translation> <translation id="119944043368869598">全部清除</translation> <translation id="123828989343052515">新桌面</translation> @@ -365,6 +366,7 @@ <translation id="6723839937902243910">电源</translation> <translation id="6751826523481687655">已启用性能跟踪</translation> <translation id="6785414152754474415">电池电量为<ph name="PERCENTAGE" />%(正在充电)。</translation> +<translation id="6790428901817661496">播放</translation> <translation id="6803622936009808957">找不到系统支持的分辨率,因此无法镜像显示屏。已改为进入扩展桌面。</translation> <translation id="6820676911989879663">休息一下!</translation> <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index bf7bf41..aeda052 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">完成連結可進一步提升裝置效能</translation> <translation id="112308213915226829">自動隱藏檔案櫃</translation> <translation id="1153356358378277386">配對裝置</translation> +<translation id="1178581264944972037">暫停</translation> <translation id="1195412055398077112">遮視區域</translation> <translation id="119944043368869598">全部清除</translation> <translation id="123828989343052515">新工作檯</translation> @@ -364,6 +365,7 @@ <translation id="6723839937902243910">電源</translation> <translation id="6751826523481687655">效能追蹤已啟用</translation> <translation id="6785414152754474415">電池電量為 <ph name="PERCENTAGE" />% (充電中)。</translation> +<translation id="6790428901817661496">播放</translation> <translation id="6803622936009808957">找不到系統支援的解析度,因此無法顯示鏡像。已改為進入延伸桌面。</translation> <translation id="6820676911989879663">目前禁止使用裝置!</translation> <translation id="683971173229319003">搜尋鍵 + L 鍵</translation>
diff --git a/ash/system/message_center/unified_message_list_view.cc b/ash/system/message_center/unified_message_list_view.cc index 9018c16..c9d34b57 100644 --- a/ash/system/message_center/unified_message_list_view.cc +++ b/ash/system/message_center/unified_message_list_view.cc
@@ -175,8 +175,8 @@ MessageCenter::Get()->RemoveObserver(this); model_->ClearNotificationChanges(); - for (int i = 0; i < child_count(); ++i) - GetContainer(i)->StoreExpandedState(model_); + for (auto* view : children()) + AsMVC(view)->StoreExpandedState(model_); } void UnifiedMessageListView::Init() { @@ -236,8 +236,8 @@ } void UnifiedMessageListView::Layout() { - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); + for (auto* child : children()) { + auto* view = AsMVC(child); view->SetBoundsRect(gfx::Tween::RectValueBetween( GetCurrentValue(), view->start_bounds(), view->ideal_bounds())); } @@ -245,15 +245,10 @@ gfx::Rect UnifiedMessageListView::GetNotificationBounds( const std::string& notification_id) const { - if (!notification_id.empty()) { - for (int i = 0; i < child_count(); i++) { - if (GetContainer(i)->GetNotificationId() == notification_id) - return GetContainer(i)->bounds(); - } - } - - // Fallback to the last notification. - return GetLastNotificationBounds(); + const MessageViewContainer* child = nullptr; + if (!notification_id.empty()) + child = GetNotificationById(notification_id); + return child ? child->bounds() : GetLastNotificationBounds(); } gfx::Rect UnifiedMessageListView::GetLastNotificationBounds() const { @@ -263,7 +258,7 @@ gfx::Rect UnifiedMessageListView::GetNotificationBoundsBelowY( int y_offset) const { for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); + auto* view = child_at(i); if (view->bounds().bottom() >= y_offset) return view->bounds(); } @@ -301,13 +296,9 @@ InterruptClearAll(); ResetBounds(); - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); - if (view->GetNotificationId() == id) { - view->set_is_removed(); - break; - } - } + auto* child = GetNotificationById(id); + if (child) + child->set_is_removed(); UpdateBounds(); @@ -322,13 +313,9 @@ InterruptClearAll(); - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); - if (view->GetNotificationId() == id) { - view->UpdateWithNotification(*notification); - break; - } - } + auto* child = GetNotificationById(id); + if (child) + child->UpdateWithNotification(*notification); ResetBounds(); } @@ -337,11 +324,10 @@ const std::string& notification_id) { // When the swipe control for |notification_id| is shown, hide all other swipe // controls. - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); - if (view->GetNotificationId() == notification_id) - continue; - view->CloseSwipeControl(); + for (auto* child : children()) { + auto* view = AsMVC(child); + if (view->GetNotificationId() != notification_id) + view->CloseSwipeControl(); } } @@ -390,49 +376,54 @@ return message_center_view_->GetStackedNotificationCount(); } -UnifiedMessageListView::MessageViewContainer* -UnifiedMessageListView::GetContainer(int index) { - return const_cast<MessageViewContainer*>( - const_cast<const UnifiedMessageListView*>(this)->GetContainer(index)); +// static +const UnifiedMessageListView::MessageViewContainer* +UnifiedMessageListView::AsMVC(const views::View* v) { + return static_cast<const MessageViewContainer*>(v); +} + +// static +UnifiedMessageListView::MessageViewContainer* UnifiedMessageListView::AsMVC( + views::View* v) { + return static_cast<MessageViewContainer*>(v); } const UnifiedMessageListView::MessageViewContainer* -UnifiedMessageListView::GetContainer(int index) const { - return static_cast<const MessageViewContainer*>(child_at(index)); +UnifiedMessageListView::GetNotificationById(const std::string& id) const { + const auto i = std::find_if( + children().cbegin(), children().cend(), + [id](const auto* v) { return AsMVC(v)->GetNotificationId() == id; }); + return (i == children().cend()) ? nullptr : AsMVC(*i); } UnifiedMessageListView::MessageViewContainer* UnifiedMessageListView::GetNextRemovableNotification() { - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); - if (!view->IsPinned()) - return view; - } - return nullptr; + const auto i = + std::find_if(children().cbegin(), children().cend(), + [](const auto* v) { return !AsMVC(v)->IsPinned(); }); + return (i == children().cend()) ? nullptr : AsMVC(*i); } void UnifiedMessageListView::CollapseAllNotifications() { base::AutoReset<bool> auto_reset(&ignore_size_change_, true); - for (int i = 0; i < child_count(); ++i) - GetContainer(i)->Collapse(); + for (auto* child : children()) + AsMVC(child)->Collapse(); } void UnifiedMessageListView::UpdateBorders() { // When the stacking bar is shown, there should never be a top notification. bool is_top = !features::IsNotificationStackingBarRedesignEnabled() || children().size() == 1; - for (int i = 0; i < child_count(); ++i) { - auto* child = GetContainer(i); - const bool is_bottom = child == children().back(); - child->UpdateBorder(is_top, is_bottom); + for (auto* child : children()) { + AsMVC(child)->UpdateBorder(is_top, child == children().back()); is_top = false; } } void UnifiedMessageListView::UpdateBounds() { int y = 0; - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); + for (auto* child : children()) { + auto* view = AsMVC(child); const int height = view->GetHeightForWidth(kTrayMenuWidth); const int direction = view->GetSlideDirection(); view->set_start_bounds(view->ideal_bounds()); @@ -462,8 +453,8 @@ if (state_ != State::CLEAR_ALL_STACKED && state_ != State::CLEAR_ALL_VISIBLE) return; - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); + for (auto* child : children()) { + auto* view = AsMVC(child); if (!view->IsPinned()) view->set_is_removed(); } @@ -472,17 +463,15 @@ } void UnifiedMessageListView::DeleteRemovedNotifications() { - std::vector<MessageViewContainer*> removed_views; - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); - if (view->is_removed()) - removed_views.push_back(view); - } + views::View::Views removed_views; + std::copy_if(children().cbegin(), children().cend(), + std::back_inserter(removed_views), + [](const auto* v) { return AsMVC(v)->is_removed(); }); { base::AutoReset<bool> auto_reset(&is_deleting_removed_notifications_, true); for (auto* view : removed_views) { - model_->RemoveNotificationExpanded(view->GetNotificationId()); + model_->RemoveNotificationExpanded(AsMVC(view)->GetNotificationId()); delete view; } } @@ -526,8 +515,8 @@ DeleteRemovedNotifications(); UpdateBounds(); start_height_ = ideal_height_; - for (int i = 0; i < child_count(); ++i) { - auto* view = GetContainer(i); + for (auto* child : children()) { + auto* view = AsMVC(child); view->set_start_bounds(view->ideal_bounds()); }
diff --git a/ash/system/message_center/unified_message_list_view.h b/ash/system/message_center/unified_message_list_view.h index b5e59d43..120d5295 100644 --- a/ash/system/message_center/unified_message_list_view.h +++ b/ash/system/message_center/unified_message_list_view.h
@@ -122,8 +122,17 @@ CLEAR_ALL_VISIBLE }; - MessageViewContainer* GetContainer(int index); - const MessageViewContainer* GetContainer(int index) const; + // Syntactic sugar to downcast. + static const MessageViewContainer* AsMVC(const views::View* v); + static MessageViewContainer* AsMVC(views::View* v); + + // Returns the notification with the provided |id|. + const MessageViewContainer* GetNotificationById(const std::string& id) const; + MessageViewContainer* GetNotificationById(const std::string& id) { + return const_cast<MessageViewContainer*>( + static_cast<const UnifiedMessageListView*>(this)->GetNotificationById( + id)); + } // Returns the first removable notification from the top. MessageViewContainer* GetNextRemovableNotification();
diff --git a/ash/system/network/network_state_list_detailed_view.cc b/ash/system/network/network_state_list_detailed_view.cc index 73f2c6c9..7022e61f 100644 --- a/ash/system/network/network_state_list_detailed_view.cc +++ b/ash/system/network/network_state_list_detailed_view.cc
@@ -138,8 +138,7 @@ void Layout(views::View* host) override { gfx::Size max_size(GetMaxChildSize(host)); // Center each child view within |max_size|. - for (int i = 0; i < host->child_count(); ++i) { - views::View* child = host->child_at(i); + for (auto* child : host->children()) { if (!child->visible()) continue; gfx::Size child_size = child->GetPreferredSize(); @@ -161,16 +160,12 @@ private: gfx::Size GetMaxChildSize(const views::View* host) const { - int width = 0, height = 0; - for (int i = 0; i < host->child_count(); ++i) { - const views::View* child = host->child_at(i); - if (!child->visible()) - continue; - gfx::Size child_size = child->GetPreferredSize(); - width = std::max(width, child_size.width()); - height = std::max(height, child_size.width()); + gfx::Size max_size; + for (const auto* child : host->children()) { + if (child->visible()) + max_size.SetToMax(child->GetPreferredSize()); } - return gfx::Size(width, height); + return max_size; } DISALLOW_COPY_AND_ASSIGN(InfoThrobberLayout);
diff --git a/ash/system/status_area_widget_delegate.cc b/ash/system/status_area_widget_delegate.cc index 4b062d16..fbd0e00 100644 --- a/ash/system/status_area_widget_delegate.cc +++ b/ash/system/status_area_widget_delegate.cc
@@ -122,8 +122,7 @@ // Update tray border based on layout. bool is_child_on_edge = true; - for (int c = 0; c < child_count(); ++c) { - views::View* child = child_at(c); + for (auto* child : children()) { if (!child->visible()) continue; SetBorderOnChild(child, is_child_on_edge); @@ -133,8 +132,7 @@ views::ColumnSet* columns = layout->AddColumnSet(0); if (shelf_->IsHorizontalAlignment()) { - for (int c = 0; c < child_count(); ++c) { - views::View* child = child_at(c); + for (auto* child : children()) { if (!child->visible()) continue; columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::FILL, @@ -142,8 +140,7 @@ views::GridLayout::USE_PREF, 0, 0); } layout->StartRow(0, 0); - for (int c = 0; c < child_count(); ++c) { - views::View* child = child_at(c); + for (auto* child : children()) { if (child->visible()) layout->AddView(child); } @@ -151,8 +148,7 @@ columns->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 0, /* resize percent */ views::GridLayout::USE_PREF, 0, 0); - for (int c = 0; c < child_count(); ++c) { - views::View* child = child_at(c); + for (auto* child : children()) { if (!child->visible()) continue; layout->StartRow(0, 0);
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc index 52f49fa..8bcf49d 100644 --- a/ash/system/tray/tray_bubble_view.cc +++ b/ash/system/tray/tray_bubble_view.cc
@@ -101,9 +101,10 @@ } int consumed_height = 0; - for (int i = host->child_count() - 1; - i >= 0 && consumed_height < host->height(); --i) { - View* child = host->child_at(i); + for (auto i = host->children().rbegin(); + i != host->children().rend() && consumed_height < host->height(); + ++i) { + View* child = *i; if (!child->visible()) continue; gfx::Size size = child->GetPreferredSize();
diff --git a/ash/system/tray/tray_detailed_view.cc b/ash/system/tray/tray_detailed_view.cc index 5eb98fb..a1b80a3a 100644 --- a/ash/system/tray/tray_detailed_view.cc +++ b/ash/system/tray/tray_detailed_view.cc
@@ -87,15 +87,13 @@ clip_rect.Inset(clip_insets.Scale(paint_info.paint_recording_scale_x(), paint_info.paint_recording_scale_y())); clip_recorder.ClipRect(clip_rect); - for (int i = 0; i < child_count(); ++i) { - auto* child = child_at(i); + for (auto* child : children()) { if (child->id() != VIEW_ID_STICKY_HEADER && !child->layer()) child->Paint(paint_info); } } // Paint sticky headers. - for (int i = 0; i < child_count(); ++i) { - auto* child = child_at(i); + for (auto* child : children()) { if (child->id() == VIEW_ID_STICKY_HEADER && !child->layer()) child->Paint(paint_info); } @@ -118,10 +116,9 @@ void Layout() override { views::View::Layout(); headers_.clear(); - for (int i = 0; i < child_count(); ++i) { - views::View* view = child_at(i); - if (view->id() == VIEW_ID_STICKY_HEADER) - headers_.emplace_back(view); + for (auto* child : children()) { + if (child->id() == VIEW_ID_STICKY_HEADER) + headers_.emplace_back(child); } PositionHeaderRows(); }
diff --git a/ash/system/unified/feature_pods_container_view.cc b/ash/system/unified/feature_pods_container_view.cc index 5b06311..d284eeee 100644 --- a/ash/system/unified/feature_pods_container_view.cc +++ b/ash/system/unified/feature_pods_container_view.cc
@@ -20,21 +20,15 @@ return; expanded_amount_ = expanded_amount; - for (int i = 0; i < child_count(); ++i) { - auto* child = static_cast<FeaturePodButton*>(child_at(i)); - child->SetExpandedAmount(expanded_amount_); - } + for (auto* view : children()) + static_cast<FeaturePodButton*>(view)->SetExpandedAmount(expanded_amount_); UpdateChildVisibility(); // We have to call Layout() explicitly here. Layout(); } int FeaturePodsContainerView::GetExpandedHeight() const { - int visible_count = 0; - for (int i = 0; i < child_count(); ++i) { - if (static_cast<const FeaturePodButton*>(child_at(i))->visible_preferred()) - ++visible_count; - } + const int visible_count = GetVisibleCount(); // floor(visible_count / kUnifiedFeaturePodItemsInRow) int number_of_lines = (visible_count + kUnifiedFeaturePodItemsInRow - 1) / @@ -96,8 +90,7 @@ UpdateCollapsedSidePadding(); int visible_count = 0; - for (int i = 0; i < child_count(); ++i) { - views::View* child = child_at(i); + for (auto* child : children()) { if (!child->visible()) continue; @@ -124,8 +117,8 @@ changing_visibility_ = true; int visible_count = 0; - for (int i = 0; i < child_count(); ++i) { - auto* child = static_cast<FeaturePodButton*>(child_at(i)); + for (auto* view : children()) { + auto* child = static_cast<FeaturePodButton*>(view); bool visible = child->visible_preferred() && (expanded_amount_ > 0.0 || visible_count < kUnifiedFeaturePodMaxItemsInCollapsed); @@ -137,6 +130,15 @@ changing_visibility_ = false; } +int FeaturePodsContainerView::GetVisibleCount() const { + int visible_count = 0; + for (int i = 0; i < child_count(); ++i) { + if (static_cast<const FeaturePodButton*>(child_at(i))->visible_preferred()) + ++visible_count; + } + return visible_count; +} + gfx::Point FeaturePodsContainerView::GetButtonPosition( int visible_index) const { int row = visible_index / kUnifiedFeaturePodItemsInRow; @@ -176,14 +178,8 @@ } void FeaturePodsContainerView::UpdateCollapsedSidePadding() { - int visible_count = 0; - for (int i = 0; i < child_count(); ++i) { - if (static_cast<const FeaturePodButton*>(child_at(i))->visible_preferred()) - ++visible_count; - } - - visible_count = - std::min(visible_count, kUnifiedFeaturePodMaxItemsInCollapsed); + const int visible_count = + std::min(GetVisibleCount(), kUnifiedFeaturePodMaxItemsInCollapsed); int contents_width = visible_count * kUnifiedFeaturePodCollapsedSize.width() +
diff --git a/ash/system/unified/feature_pods_container_view.h b/ash/system/unified/feature_pods_container_view.h index 880f36bc..ef10e7f 100644 --- a/ash/system/unified/feature_pods_container_view.h +++ b/ash/system/unified/feature_pods_container_view.h
@@ -46,6 +46,9 @@ private: void UpdateChildVisibility(); + // Returns the number of children that prefer to be visible. + int GetVisibleCount() const; + // Calculate the current position of the button from |visible_index| and // |expanded_amount_|. gfx::Point GetButtonPosition(int visible_index) const;
diff --git a/ash/system/unified/top_shortcuts_view.cc b/ash/system/unified/top_shortcuts_view.cc index 9603838..db622f6b 100644 --- a/ash/system/unified/top_shortcuts_view.cc +++ b/ash/system/unified/top_shortcuts_view.cc
@@ -117,8 +117,7 @@ gfx::Size TopShortcutButtonContainer::CalculatePreferredSize() const { int total_horizontal_size = 0; int num_visible = 0; - for (int i = 0; i < child_count(); i++) { - const views::View* child = child_at(i); + for (const auto* child : children()) { if (!child->visible()) continue; int child_horizontal_size = child->GetPreferredSize().width();
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc index 2267dc48..2945784 100644 --- a/ash/system/unified/unified_system_tray_view.cc +++ b/ash/system/unified/unified_system_tray_view.cc
@@ -111,8 +111,8 @@ // views::View: void Layout() override { - for (int i = 0; i < child_count(); ++i) - child_at(i)->SetBoundsRect(GetContentsBounds()); + for (auto* child : children()) + child->SetBoundsRect(GetContentsBounds()); views::View::Layout(); } @@ -147,8 +147,7 @@ void UnifiedSlidersContainerView::Layout() { int y = 0; - for (int i = 0; i < child_count(); ++i) { - views::View* child = child_at(i); + for (auto* child : children()) { int height = child->GetHeightForWidth(kTrayMenuWidth); child->SetBounds(0, y, kTrayMenuWidth, height); y += height; @@ -161,8 +160,7 @@ void UnifiedSlidersContainerView::UpdateOpacity() { const int height = GetPreferredSize().height(); - for (int i = 0; i < child_count(); ++i) { - views::View* child = child_at(i); + for (auto* child : children()) { double opacity = 1.0; if (child->y() > height) { opacity = 0.0;
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni index f9bb893..3bdd85b 100644 --- a/build/config/compiler/compiler.gni +++ b/build/config/compiler/compiler.gni
@@ -194,11 +194,8 @@ # in turn is important for goma compile hit rate. # Setting this to true may make it harder to debug binaries on Linux, see # https://chromium.googlesource.com/chromium/src/+/master/docs/linux_debugging.md#Source-level-debug-with-fdebug_compilation_dir - # So only enable this on linux if use_goma. Elsewhere, there are no - # drawbacks to using it, so always enable it there. strip_absolute_paths_from_debug_symbols = - is_android || is_fuchsia || is_nacl || (is_win && use_lld) || - (use_goma && is_linux) + is_android || is_fuchsia || is_nacl || (is_win && use_lld) || is_linux } # If it wasn't manually set, set to an appropriate default.
diff --git a/build/fuchsia/fidlgen_js/runtime/zircon.cc b/build/fuchsia/fidlgen_js/runtime/zircon.cc index 3ef2e97..6dd1b19 100644 --- a/build/fuchsia/fidlgen_js/runtime/zircon.cc +++ b/build/fuchsia/fidlgen_js/runtime/zircon.cc
@@ -243,7 +243,7 @@ uint32_t data_size; uint32_t num_handles; zx_status_t status = - ch->read(0, nullptr, 0, &data_size, nullptr, 0, &num_handles); + ch->rea2(0, nullptr, nullptr, 0, 0, &data_size, &num_handles); DCHECK_EQ(status, ZX_ERR_BUFFER_TOO_SMALL); std::vector<zx_handle_t> handles; @@ -252,8 +252,8 @@ v8::Local<v8::ArrayBuffer> buf = v8::ArrayBuffer::New(args->isolate(), data_size); uint32_t actual_bytes, actual_handles; - status = ch->read(0, buf->GetContents().Data(), data_size, &actual_bytes, - handles.data(), handles.size(), &actual_handles); + status = ch->rea2(0, buf->GetContents().Data(), handles.data(), data_size, + handles.size(), &actual_bytes, &actual_handles); DCHECK_EQ(actual_bytes, data_size); DCHECK_EQ(actual_handles, num_handles);
diff --git a/build/fuchsia/fidlgen_js/test/fidlgen_js_unittest.cc b/build/fuchsia/fidlgen_js/test/fidlgen_js_unittest.cc index e0f6cc7e..ed025c8 100644 --- a/build/fuchsia/fidlgen_js/test/fidlgen_js_unittest.cc +++ b/build/fuchsia/fidlgen_js/test/fidlgen_js_unittest.cc
@@ -543,9 +543,10 @@ uint8_t data[1024]; zx_handle_t handles[1]; uint32_t actual_bytes, actual_handles; - ASSERT_EQ(helper.server().read(0, data, base::size(data), &actual_bytes, - handles, base::size(handles), &actual_handles), - ZX_OK); + ASSERT_EQ( + helper.server().rea2(0, data, handles, base::size(data), + base::size(handles), &actual_bytes, &actual_handles), + ZX_OK); EXPECT_EQ(actual_bytes, 16u); EXPECT_EQ(actual_handles, 0u); @@ -575,9 +576,10 @@ uint8_t data[1024]; zx_handle_t handles[1]; uint32_t actual_bytes, actual_handles; - ASSERT_EQ(helper.server().read(0, data, base::size(data), &actual_bytes, - handles, base::size(handles), &actual_handles), - ZX_OK); + ASSERT_EQ( + helper.server().rea2(0, data, handles, base::size(data), + base::size(handles), &actual_bytes, &actual_handles), + ZX_OK); // 24 rather than 20 because everything's 8 aligned. EXPECT_EQ(actual_bytes, 24u); EXPECT_EQ(actual_handles, 0u); @@ -608,9 +610,10 @@ uint8_t data[1024]; zx_handle_t handles[1]; uint32_t actual_bytes, actual_handles; - ASSERT_EQ(helper.server().read(0, data, base::size(data), &actual_bytes, - handles, base::size(handles), &actual_handles), - ZX_OK); + ASSERT_EQ( + helper.server().rea2(0, data, handles, base::size(data), + base::size(handles), &actual_bytes, &actual_handles), + ZX_OK); EXPECT_EQ(actual_handles, 0u); fidl::Message message( @@ -639,9 +642,10 @@ uint8_t data[1024]; zx_handle_t handles[1]; uint32_t actual_bytes, actual_handles; - ASSERT_EQ(helper.server().read(0, data, base::size(data), &actual_bytes, - handles, base::size(handles), &actual_handles), - ZX_OK); + ASSERT_EQ( + helper.server().rea2(0, data, handles, base::size(data), + base::size(handles), &actual_bytes, &actual_handles), + ZX_OK); EXPECT_EQ(actual_handles, 0u); fidl::Message message(
diff --git a/chrome/VERSION b/chrome/VERSION index 73a903c..15e70ad 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=75 MINOR=0 -BUILD=3768 +BUILD=3769 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 3f0aae7..8b0b3e8 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -391,7 +391,7 @@ "//components/favicon_base:favicon_base_enums_java", "//components/dom_distiller/core:distiller_type_java", "//components/infobars/core:infobar_enums_java", - "//components/image_fetcher/core:cached_image_fetcher_java_enums_srcjar", + "//components/image_fetcher/core:java_enums_srcjar", "//components/ntp_snippets:ntp_snippets_java_enums_srcjar", "//components/ntp_tiles:ntp_tiles_enums_java", "//components/offline_pages/core:offline_page_model_enums_java",
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java index 3bfe86c..9b1c2cf3 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java
@@ -27,7 +27,7 @@ private static final String FEED_SERVER_ENDPOINT = "feed_server_endpoint"; /** Default value for server endpoint. */ public static final String FEED_SERVER_ENDPOINT_DEFAULT = - "https://www.google.com/httpservice/noretry/NowStreamService/FeedQuery"; + "https://www.google.com/httpservice/noretry/DiscoverClankService/FeedQuery"; private static final String FEED_SERVER_METHOD = "feed_server_method"; /** Default value for feed server method. */ @@ -67,6 +67,10 @@ /** Default value for session lifetime. */ public static final int SESSION_LIFETIME_MS_DEFAULT = 3600000; + private static final String SNIPPETS_ENABLED = "snippets_enabled"; + /** Default value for whether to show article snippets. */ + public static final boolean SNIPPETS_ENABLED_DEFAULT = false; + private static final String TRIGGER_IMMEDIATE_PAGINATION = "trigger_immediate_pagination"; /** Default value for triggering immediate pagination. */ public static final boolean TRIGGER_IMMEDIATE_PAGINATION_DEFAULT = false; @@ -228,6 +232,14 @@ VIEW_LOG_THRESHOLD_DEFAULT); } + /** @return Whether the article snippets feature is enabled. */ + @VisibleForTesting + static boolean getSnippetsEnabled() { + return ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( + ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS, SNIPPETS_ENABLED, + SNIPPETS_ENABLED_DEFAULT); + } + /** * @return A fully built {@link Configuration}, ready to be given to the Feed. */ @@ -250,6 +262,7 @@ FeedConfiguration.getNonCachedMinPageSize()) .put(ConfigKey.NON_CACHED_PAGE_SIZE, FeedConfiguration.getNonCachedPageSize()) .put(ConfigKey.SESSION_LIFETIME_MS, FeedConfiguration.getSessionLifetimeMs()) + .put(ConfigKey.SNIPPETS_ENABLED, FeedConfiguration.getSnippetsEnabled()) .put(ConfigKey.TRIGGER_IMMEDIATE_PAGINATION, FeedConfiguration.getTriggerImmediatePagination()) .put(ConfigKey.UNDOABLE_ACTIONS_ENABLED,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java index fadbb49..afff8f2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java
@@ -64,7 +64,7 @@ BaseGifImage cachedGif, long startTimeMillis) { if (cachedGif != null) { callback.onResult(cachedGif); - reportEvent(clientName, CachedImageFetcherEvent.JAVA_DISK_CACHE_HIT); + reportEvent(clientName, ImageFetcherEvent.JAVA_DISK_CACHE_HIT); mImageFetcherBridge.reportCacheHitTime(clientName, startTimeMillis); } else { mImageFetcherBridge.fetchGif(url, clientName, (BaseGifImage gifFromNative) -> { @@ -97,7 +97,7 @@ Callback<Bitmap> callback, Bitmap cachedBitmap, long startTimeMillis) { if (cachedBitmap != null) { callback.onResult(cachedBitmap); - reportEvent(clientName, CachedImageFetcherEvent.JAVA_DISK_CACHE_HIT); + reportEvent(clientName, ImageFetcherEvent.JAVA_DISK_CACHE_HIT); mImageFetcherBridge.reportCacheHitTime(clientName, startTimeMillis); } else { mImageFetcherBridge.fetchImage(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java index 79450e1..d05a052 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java
@@ -57,8 +57,7 @@ * @param clientName Name of the cached image fetcher client to report UMA metrics for. * @param eventId The event to be reported */ - // TODO(crbug.com/947210): Rename this enum to ImageFetcherEvent. - public void reportEvent(String clientName, @CachedImageFetcherEvent int eventId) { + public void reportEvent(String clientName, @ImageFetcherEvent int eventId) { ImageFetcherBridge.getInstance().reportEvent(clientName, eventId); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherBridge.java index 3a40d623..8f6afaf3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherBridge.java
@@ -102,7 +102,7 @@ * @param clientName The UMA client name to report the metrics to. * @param eventId The event to report. */ - public void reportEvent(String clientName, @CachedImageFetcherEvent int eventId) { + public void reportEvent(String clientName, @ImageFetcherEvent int eventId) { assert mNativeImageFetcherBridge != 0; nativeReportEvent(mNativeImageFetcherBridge, clientName, eventId); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java index b6f2d9a7..e1bc4b8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java
@@ -105,7 +105,7 @@ callback.onResult(bitmap); }); } else { - reportEvent(clientName, CachedImageFetcherEvent.JAVA_IN_MEMORY_CACHE_HIT); + reportEvent(clientName, ImageFetcherEvent.JAVA_IN_MEMORY_CACHE_HIT); callback.onResult(cachedBitmap); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java index b188a49..966772f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java
@@ -13,8 +13,7 @@ import org.chromium.chrome.browser.preferences.themes.ThemePreferences.ThemeSetting; import org.chromium.chrome.browser.widget.RadioButtonWithDescription; -import java.util.Arrays; -import java.util.List; +import java.util.ArrayList; /** * A radio button group Preference used for Themes. Currently, it has 3 options: System default, @@ -23,15 +22,14 @@ public class RadioButtonGroupThemePreference extends Preference implements RadioButtonWithDescription.OnCheckedChangeListener { private @ThemeSetting int mSetting; - - private RadioButtonWithDescription mSystemDefault; - private RadioButtonWithDescription mLight; - private RadioButtonWithDescription mDark; + private ArrayList<RadioButtonWithDescription> mButtons; public RadioButtonGroupThemePreference(Context context, AttributeSet attrs) { super(context, attrs); // Inflating from XML. setLayoutResource(R.layout.radio_button_group_theme_preference); + + mButtons = new ArrayList<>(ThemeSetting.NUM_ENTRIES); } /** @@ -45,45 +43,27 @@ protected void onBindView(View view) { super.onBindView(view); - mSystemDefault = view.findViewById(R.id.system_default); - mLight = view.findViewById(R.id.light); - mDark = view.findViewById(R.id.dark); + assert ThemeSetting.NUM_ENTRIES == 3; + mButtons.set(ThemeSetting.SYSTEM_DEFAULT, view.findViewById(R.id.system_default)); + mButtons.set(ThemeSetting.LIGHT, view.findViewById(R.id.light)); + mButtons.set(ThemeSetting.DARK, view.findViewById(R.id.dark)); - List<RadioButtonWithDescription> radioGroup = Arrays.asList(mSystemDefault, mLight, mDark); - for (RadioButtonWithDescription option : radioGroup) { - option.setRadioButtonGroup(radioGroup); - option.setOnCheckedChangeListener(this); + for (int i = 0; i < ThemeSetting.NUM_ENTRIES; i++) { + mButtons.get(i).setRadioButtonGroup(mButtons); + mButtons.get(i).setOnCheckedChangeListener(this); } - RadioButtonWithDescription radioButton = findRadioButton(mSetting); - if (radioButton != null) radioButton.setChecked(true); + mButtons.get(mSetting).setChecked(true); } @Override public void onCheckedChanged() { - if (mSystemDefault.isChecked()) { - mSetting = ThemeSetting.SYSTEM_DEFAULT; - } else if (mLight.isChecked()) { - mSetting = ThemeSetting.LIGHT; - } else if (mDark.isChecked()) { - mSetting = ThemeSetting.DARK; + for (int i = 0; i < ThemeSetting.NUM_ENTRIES; i++) { + if (mButtons.get(i).isChecked()) { + mSetting = i; + break; + } } - callChangeListener(mSetting); } - - /** - * @param setting The setting to find RadioButton for. - */ - private RadioButtonWithDescription findRadioButton(@ThemeSetting int setting) { - if (setting == ThemeSetting.SYSTEM_DEFAULT) { - return mSystemDefault; - } else if (setting == ThemeSetting.LIGHT) { - return mLight; - } else if (setting == ThemeSetting.DARK) { - return mDark; - } else { - return null; - } - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java index 1029c9d..051d431 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java
@@ -28,9 +28,12 @@ @IntDef({ThemeSetting.SYSTEM_DEFAULT, ThemeSetting.LIGHT, ThemeSetting.DARK}) @Retention(RetentionPolicy.SOURCE) public @interface ThemeSetting { + // Values are used for indexing tables - should start from 0 and can't have gaps. int SYSTEM_DEFAULT = 0; int LIGHT = 1; int DARK = 2; + + int NUM_ENTRIES = 3; } static final String PREF_UI_THEME_PREF = "ui_theme_pref";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/PageViewObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/PageViewObserver.java index 9a5430d8..7513e1f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/PageViewObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/PageViewObserver.java
@@ -107,14 +107,13 @@ /** Notify PageViewObserver that {@code fqdn} was just suspended or un-suspended. */ public void notifySiteSuspensionChanged(String fqdn, boolean isSuspended) { - if (mLastFqdn != null && mLastFqdn.equals(fqdn)) { + if (fqdn.equals(mLastFqdn)) { + SuspendedTab suspendedTab = SuspendedTab.from(mCurrentTab); if (isSuspended) { - SuspendedTab.from(mCurrentTab).show(fqdn); + suspendedTab.show(fqdn); return; - } - - SuspendedTab suspendedTab = SuspendedTab.get(mCurrentTab); - if (suspendedTab != null && !isSuspended && suspendedTab.getFqdn().equals(fqdn)) { + } else if (!isSuspended && suspendedTab.isShowing() + && fqdn.equals(suspendedTab.getFqdn())) { suspendedTab.removeIfPresent(); mCurrentTab.reload(); } @@ -126,9 +125,15 @@ boolean didSuspend = false; boolean sameDomain = mLastFqdn != null && mLastFqdn.equals(newFqdn); - if (newFqdn != null && mSuspensionTracker.isWebsiteSuspended(newFqdn)) { - SuspendedTab.from(mCurrentTab).show(newFqdn); + SuspendedTab suspendedTab = SuspendedTab.from(mCurrentTab); + if (mSuspensionTracker.isWebsiteSuspended(newFqdn)) { + suspendedTab.show(newFqdn); didSuspend = true; + } else if (suspendedTab.isShowing()) { + suspendedTab.removeIfPresent(); + if (!mCurrentTab.isLoading()) { + mCurrentTab.reload(); + } } if (sameDomain) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/SuspendedTab.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/SuspendedTab.java index e3c7061..9ebf611b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/SuspendedTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/SuspendedTab.java
@@ -59,7 +59,7 @@ mFqdn = fqdn; mTab.addObserver(this); mTab.stopLoading(); - if (isShowing()) { + if (isViewAttached()) { updateFqdnText(); } else { attachView(); @@ -75,11 +75,16 @@ mFqdn = null; } - /** @return the fqdn this SuspendedTab was last shown for. */ + /** @return the fqdn this SuspendedTab is currently showing for; null if not showing. */ public String getFqdn() { return mFqdn; } + /** @return Whether this SuspendedTab is currently showing. */ + public boolean isShowing() { + return mFqdn != null; + } + private View createView() { Context context = mTab.getContext(); LayoutInflater inflater = LayoutInflater.from(context); @@ -116,6 +121,10 @@ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); } + private boolean isViewAttached() { + return mView != null && mView.getParent() == mTab.getContentView(); + } + private void updateFqdnText() { Context context = mTab.getContext(); TextView explanationText = (TextView) mView.findViewById(R.id.suspended_tab_explanation); @@ -124,15 +133,11 @@ } private void removeViewIfPresent() { - if (isShowing()) { + if (isViewAttached()) { mTab.getContentView().removeView(mView); } } - private boolean isShowing() { - return mView != null && mView.getParent() == mTab.getContentView(); - } - private void removeSelfIfFqdnChanged(String url) { String newFqdn = Uri.parse(url).getHost(); if (newFqdn == null || !newFqdn.equals(mFqdn)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java index 2b0aa23..d7795d8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java
@@ -11,6 +11,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.PackageUtils; +import org.chromium.base.StrictModeContext; import org.chromium.base.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.task.AsyncTask; @@ -307,8 +308,13 @@ } private static SharedPreferences openSharedPreferences() { - return ContextUtils.getApplicationContext().getSharedPreferences( - REGISTRY_FILE_NAME, Context.MODE_PRIVATE); + // TODO(peconn): Don't open general WebappRegistry preferences when we just need the + // TrustedWebActivityPermissionStore. + // This is required to fix https://crbug.com/952841. + try (StrictModeContext unused = StrictModeContext.allowDiskReads()) { + return ContextUtils.getApplicationContext().getSharedPreferences( + REGISTRY_FILE_NAME, Context.MODE_PRIVATE); + } } private void initStorages(String idToInitialize, boolean replaceExisting) {
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 384fad8..01d50be 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -119,6 +119,7 @@ <translation id="1891331835972267886">Bubukas ang <ph name="APP_NAME" /> sa Chrome. Sa pamamagitan ng pagpapatuloy, sumasang-ayon ka sa <ph name="BEGIN_LINK1" />Mga Tuntunin ng Serbisyo<ph name="END_LINK1" /> at <ph name="BEGIN_LINK2" />Notification ng Privacy<ph name="END_LINK2" /> ng Chrome.</translation> <translation id="1919345977826869612">Mga Ad</translation> <translation id="1919950603503897840">Pumili ng mga contact</translation> +<translation id="1922076542920281912">Para payagan ang Chrome na i-access ang iyong lokasyon, i-on din ang lokasyon sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation> <translation id="19288952978244135">Muling buksan ang Chrome.</translation> <translation id="1933845786846280168">Napiling Tab</translation> @@ -144,6 +145,7 @@ <translation id="2018707881002649255">Ibabahagi sa website na <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ang mga contact na pipiliin mo sa ibaba.</translation> <translation id="2021896219286479412">Control ng full screen sa site</translation> <translation id="2038563949887743358">I-on ang Hilingin ang site sa desktop</translation> +<translation id="2041019821020695769">Para payagan ang Chrome na magpadala sa iyo ng mga notification, i-on din ang mga notification sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="204321170514947529">May data rin ang <ph name="APP_NAME" /> sa Chrome</translation> <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB na iba pang mga app</translation> <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> @@ -359,6 +361,7 @@ <translation id="3712575778697986964">I-reset ang Data Saver?</translation> <translation id="3714981814255182093">Buksan ang Bar sa Paghahanap</translation> <translation id="3716182511346448902">Masyadong malaki ang ginagamit na memory ng page na ito kaya na-pause ito ng Chrome.</translation> +<translation id="3730075448226062617">Para payagang i-access ng Chrome ang iyong mikropono, i-on din ang mikropono sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="3739899004075612870">Naka-bookmark sa <ph name="PRODUCT_NAME" /></translation> <translation id="3744111309925758534"><ph name="MEGABYTES" /> MB na iba pang mga app</translation> <translation id="3744111561329211289">Pag-sync sa background</translation> @@ -672,6 +675,7 @@ <translation id="5937580074298050696"><ph name="AMOUNT" /> ang natipid</translation> <translation id="5939518447894949180">I-reset</translation> <translation id="5942872142862698679">Ginagamit ang Google para sa paghahanap</translation> +<translation id="5944669582486359588">Sa Lite mode, mas mabilis na nilo-load ng Chrome ang mga page at gumagamit ng hanggang 60 porsyentong mas kaunting data. Ino-optimize ng Cloud technology ng Google ang mga page na binibisita mo.</translation> <translation id="5952764234151283551">Ipinapadala sa Google ang URL ng page na sinusubukan mong puntahan</translation> <translation id="5956665950594638604">Buksan ang Help Center ng Chrome sa bagong tab</translation> <translation id="5958275228015807058">Hanapin ang iyong mga file at page sa Mga Download</translation> @@ -702,6 +706,7 @@ <translation id="618993374665929060">Nakabukas sa buong screen ang higit pang tulad nito</translation> <translation id="6192333916571137726">File ng download</translation> <translation id="6192792657125177640">Mga Pagbubukod</translation> +<translation id="6194112207524046168">Para payagang i-access ng Chrome ang iyong camera, i-on din ang camera sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">I-block ang mga third-party na cookie</translation> <translation id="6206551242102657620">Secure ang koneksyon. Impormasyon ng site</translation> <translation id="6210748933810148297">Hindi si <ph name="EMAIL" />?</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 ad2753e..bd5864f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -34,7 +34,7 @@ <translation id="1209206284964581585">अभी छिपाएं</translation> <translation id="1231733316453485619">क्या सिंक करना चालू करें?</translation> <translation id="123724288017357924">कैश सामग्री को अनदेखा कर, मौजूदा पेज फिर लोड करें</translation> -<translation id="124116460088058876">अधिक भाषाएं</translation> +<translation id="124116460088058876">ज़्यादा भाषाएं</translation> <translation id="124678866338384709">वर्तमान टैब को बंद करें</translation> <translation id="125153950246128346">कोई दूसरा टैब देखने के लिए टैप करें</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> @@ -129,7 +129,7 @@ <translation id="1952172573699511566">जब संभव होगा, वेबसाइटें आपकी पसंदीदा भाषा में टेक्स्ट दिखाएंगी.</translation> <translation id="1960290143419248813">Chrome अपडेट, अब Android के इस वर्शन पर काम नहीं करते हैं.</translation> <translation id="1966710179511230534">कृपया अपने साइन इन के विवरण अपडेट करें.</translation> -<translation id="1974060860693918893">उन्नत</translation> +<translation id="1974060860693918893">बेहतर</translation> <translation id="1984705450038014246">अपना Chrome डेटा सिंक करें</translation> <translation id="1984937141057606926">तृतीय-पक्ष को छोड़कर अनुमति है</translation> <translation id="1986685561493779662">नाम पहले से मौजूद है</translation> @@ -221,7 +221,7 @@ <translation id="257931822824936280">विस्तारित - संक्षिप्त करने के लिए क्लिक करें.</translation> <translation id="2581165646603367611">यह साइट की कुकी, संचय और अन्य डेटा निकाल देगा जो Chrome के विचार में महत्वपूर्ण नहीं है.</translation> <translation id="2586657967955657006">क्लिपबोर्ड</translation> -<translation id="2587052924345400782">अधिक नया वर्शन उपलब्ध है</translation> +<translation id="2587052924345400782">ज़्यादा नया वर्शन उपलब्ध है</translation> <translation id="2593272815202181319">मोनोस्पेस</translation> <translation id="2610239185026711824">पासवर्ड सुझाएं</translation> <translation id="2612676031748830579">कार्ड संख्या</translation> @@ -289,7 +289,7 @@ <translation id="3137521801621304719">गुप्त मोड छोड़ें</translation> <translation id="3143515551205905069">लिंक करना रोक दें</translation> <translation id="3148434565183091099">अपने सभी डिवाइस पर अपने बुकमार्क पाने के लिए, Chrome में साइन इन करें.</translation> -<translation id="3157842584138209013">अधिक विकल्प बटन से देखें कि आपने कितना डेटा बचाया है</translation> +<translation id="3157842584138209013">ज़्यादा विकल्प बटन से देखें कि आपने कितना डेटा बचाया है</translation> <translation id="3166827708714933426">टैब और विंडो शॉर्टकट</translation> <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में Chrome के लिए अनुमतियां चालू करें.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> संग्रहित डेटा</translation> @@ -332,16 +332,16 @@ <translation id="3452612588551937789">अपने सभी डिवाइस पर अपने बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग पाने के लिए, अपने Google खाते से साइन इन करें.</translation> <translation id="3478363558367712427">आप अपना सर्च इंजन चुन सकते हैं</translation> <translation id="3492207499832628349">नया गुप्त टैब</translation> -<translation id="3493531032208478708">सुझाई गई सामग्री के बारे में <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation> +<translation id="3493531032208478708">सुझाई गई सामग्री के बारे में <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="3513704683820682405">ऑगमेंटेड रिएलिटी (AR)</translation> <translation id="3518985090088779359">स्वीकार करें और जारी रखें</translation> -<translation id="3522247891732774234">अपडेट उपलब्ध है. अधिक विकल्प</translation> +<translation id="3522247891732774234">अपडेट उपलब्ध है. ज़्यादा विकल्प</translation> <translation id="3527085408025491307">फ़ोल्डर</translation> <translation id="3542235761944717775"><ph name="KILOBYTES" /> केबी उपलब्ध</translation> <translation id="3549657413697417275">अपने इतिहास में खोजें</translation> <translation id="3552151358455404883"><ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> में जाकर Chrome सिंक और वैयक्तिकरण प्रबंधित करें</translation> <translation id="3557336313807607643">संपर्कों में जोड़ें</translation> -<translation id="3566923219790363270">Chrome अभी भी VR के लिए तैयारी कर रहा है. Chrome को बाद में रीस्टार्ट करें.</translation> +<translation id="3566923219790363270">Chrome अब भी VR के लिए तैयारी कर रहा है. Chrome को बाद में रीस्टार्ट करें.</translation> <translation id="3568688522516854065">अपने दूसरे डिवाइस से अपने टैब पाने के लिए, साइन इन करें और 'सिंक करें' को चालू करें</translation> <translation id="3587482841069643663">सभी</translation> <translation id="358794129225322306">किसी साइट को अपने आप एक से ज़्यादा फ़ाइलें लोड करने की मंज़ूरी दें.</translation> @@ -589,7 +589,7 @@ <translation id="5400569084694353794">इस ऐप्लिकेशन का इस्तेमाल करके, आप Chrome की <ph name="BEGIN_LINK1" />सेवा की शर्तों<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />निजता सूचना<ph name="END_LINK2" /> से सहमत होते हैं.</translation> <translation id="5403644198645076998">सिर्फ़ कुछ निश्चित साइटों को ही अनुमति दें</translation> <translation id="5414836363063783498">सत्यापन हो रहा है...</translation> -<translation id="5423934151118863508">आपके द्वारा सबसे अधिक देखे गए पेज यहां दिखाई देंगे</translation> +<translation id="5423934151118863508">आपके द्वारा सबसे ज़्यादा देखे गए पेज यहां दिखाई देंगे</translation> <translation id="5424588387303617268"><ph name="GIGABYTES" /> जीबी उपलब्ध है</translation> <translation id="5433691172869980887">उपयोगकर्ता नाम कॉपी किया गया</translation> <translation id="543509235395288790"><ph name="COUNT" /> फ़ाइलें डाउनलोड हो रही हैं (<ph name="MEGABYTES" />).</translation> @@ -621,9 +621,9 @@ <translation id="5578795271662203820">इस चित्र के लिए <ph name="SEARCH_ENGINE" /> खोजें</translation> <translation id="5581519193887989363">आप जब चाहें तब <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> में जाकर किसी भी चीज़ को सिंक करने का विकल्प चुन सकते हैं.</translation> <translation id="5595485650161345191">पता संपादित करें</translation> -<translation id="5596627076506792578">अधिक विकल्प</translation> +<translation id="5596627076506792578">ज़्यादा विकल्प</translation> <translation id="5620299005957670886">साइटों को अपने डिवाइस के सेंसर एक्सेस करने दें (सुझाया गया)</translation> -<translation id="5620928963363755975">अधिक विकल्प बटन से डाउनलोड में जाकर अपनी फ़ाइलें और पेज पाएं</translation> +<translation id="5620928963363755975">ज़्यादा विकल्प बटन से डाउनलोड में जाकर अपनी फ़ाइलें और पेज पाएं</translation> <translation id="5626134646977739690">नाम:</translation> <translation id="5639724618331995626">सभी साइटों को अनुमति दें</translation> <translation id="5648166631817621825">पिछले 7 दिन</translation> @@ -752,7 +752,7 @@ <translation id="6508722015517270189">Chrome को फिर से शुरू करें</translation> <translation id="6527303717912515753">शेयर करें</translation> <translation id="6532866250404780454">आप Chrome में जिन साइटों पर जाते हैं, वे नहीं दिखाई देंगी. साइट के सभी टाइमर मिटा दिए जाएंगे.</translation> -<translation id="6534565668554028783">Google को प्रतिक्रिया देने में बहुत अधिक समय लगा</translation> +<translation id="6534565668554028783">Google को प्रतिक्रिया देने में बहुत ज़्यादा समय लगा</translation> <translation id="6538442820324228105"><ph name="GBS" /> जीबी डाउनलोड किया गया</translation> <translation id="654446541061731451">बीम के लिए टैब को चुनें</translation> <translation id="6545017243486555795">सभी डेटा साफ़ करें</translation> @@ -860,7 +860,7 @@ <translation id="729975465115245577">आपके डिवाइस में पासवर्ड फ़ाइल को संग्रहित करने वाला कोई ऐप्लिकेशन नहीं है.</translation> <translation id="7302081693174882195">जानकारी: बचाए गए डेटा की मात्रा के अनुसार क्रम से लगाया गया</translation> <translation id="7328017930301109123">'लाइट मोड' में, Chrome पेजों को ज़्यादा तेज़ी से लोड करता है और 60 प्रतिशत तक कम डेटा इस्तेमाल करता है.</translation> -<translation id="7333031090786104871">पिछली साइट अभी भी जोड़ी जा रही है</translation> +<translation id="7333031090786104871">पिछली साइट अब भी जोड़ी जा रही है</translation> <translation id="7352939065658542140">वीडियो</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{1 चयनित आइटम शेयर करें}one{# चयनित आइटम शेयर करें}other{# चयनित आइटम शेयर करें}}</translation> <translation id="7359002509206457351">भुगतान के तरीकों को एक्सेस करें</translation> @@ -1005,7 +1005,7 @@ <translation id="8339163506404995330"><ph name="LANGUAGE" /> भाषा के पेज का अनुवाद नहीं किया जाएगा</translation> <translation id="8349013245300336738">इस्तेमाल किए गए डेटा की मात्रा के हिसाब से क्रम में लगाएं</translation> <translation id="8372893542064058268">किसी विशिष्ट साइट के लिए पृष्ठभूमि समन्वयन की अनुमति दें.</translation> -<translation id="8374821112118309944">आपको TalkBack को अधिक नए वर्शन से अपडेट करना होगा.</translation> +<translation id="8374821112118309944">आपको TalkBack को ज़्यादा नए वर्शन से अपडेट करना होगा.</translation> <translation id="8378714024927312812">आपके संगठन की ओर से प्रबंधित</translation> <translation id="8380167699614421159">इस साइट में तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं</translation> <translation id="8393700583063109961">संदेश भेजें</translation> @@ -1052,7 +1052,7 @@ <translation id="8676374126336081632">इनपुट साफ़ करें</translation> <translation id="8687353297350450808">{N_BARS,plural, =1{सिग्नल सशक्तता का स्तर: # बार}one{सिग्नल सशक्तता का स्तर: # बार}other{सिग्नल सशक्तता का स्तर: # बार}}</translation> <translation id="868929229000858085">अपने संपर्क खोजें</translation> -<translation id="869891660844655955">समय समाप्ति दिनांक</translation> +<translation id="869891660844655955">समय समाप्ति तारीख</translation> <translation id="8719023831149562936">वर्तमान टैब को बीम नहीं किया जा सकता</translation> <translation id="8725066075913043281">फिर से कोशिश करें</translation> <translation id="8728487861892616501">इस ऐप्लिकेशन का उपयोग करके, आप Chrome की <ph name="BEGIN_LINK1" />सेवा की शर्तों<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />निजता सूचना<ph name="END_LINK2" /> और <ph name="BEGIN_LINK3" />Family Link से प्रबंधित होने वाले Google खातों के लिए निजता सूचना<ph name="END_LINK3" /> से सहमत होते हैं.</translation> @@ -1074,7 +1074,7 @@ <translation id="8909135823018751308">शेयर करें…</translation> <translation id="8912362522468806198">Google खाता</translation> <translation id="8920114477895755567">अभिभावकों के विवरण की प्रतीक्षा कर रहे हैं.</translation> -<translation id="8922289737868596582">पेज का ऑफ़लाइन उपयोग करने के लिए उन्हें अधिक विकल्प बटन से डाउनलोड करें</translation> +<translation id="8922289737868596582">पेज का ऑफ़लाइन उपयोग करने के लिए उन्हें ज़्यादा विकल्प बटन से डाउनलोड करें</translation> <translation id="8937772741022875483">'डिजिटल वेलबीइंग' से अपनी Chrome गतिविधि हटाना चाहते हैं?</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8942627711005830162">दूसरी विंडो में खोलें</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb index e73c31a1..8df6249 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -675,7 +675,7 @@ <translation id="5937580074298050696"><ph name="AMOUNT" /> సేవ్ చేయబడింది</translation> <translation id="5939518447894949180">రీసెట్ చేయి</translation> <translation id="5942872142862698679">శోధన కోసం Googleను ఉపయోగిస్తోంది</translation> -<translation id="5944669582486359588">లైట్ మోడ్లో, Chrome పేజీలను వేగంగా లోడ్ చేస్తుంది, అలాగే 60 శాతం వరకు తక్కువ డేటాను ఉపయోగిస్తుంది. Google క్లౌడ్ సాంకేతికత మీరు సందర్శించే పేజీలను ఆప్టిమైజ్ చేస్తుంది.</translation> +<translation id="5944669582486359588">లైట్ మోడ్లో, Chrome పేజీలను మరింత వేగంగా లోడ్ చేస్తుంది, అలాగే 60 శాతం వరకు తక్కువ డేటాను ఉపయోగిస్తుంది. Google క్లౌడ్ సాంకేతికత మీరు సందర్శించే పేజీలను ఆప్టిమైజ్ చేస్తుంది.</translation> <translation id="5952764234151283551">మీరు చేరుకోవాలని ప్రయత్నిస్తున్న పేజీ URLని Googleకి పంపుతుంది</translation> <translation id="5956665950594638604">Chrome సహాయ కేంద్రాన్ని కొత్త ట్యాబ్లో తెరవండి</translation> <translation id="5958275228015807058">డౌన్లోడ్లలో మీ ఫైల్లు మరియు పేజీలను కనుగొనండి</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java index 22c0269..be3cb73 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java
@@ -56,6 +56,8 @@ FeedConfiguration.getNonCachedPageSize()); Assert.assertEquals(FeedConfiguration.SESSION_LIFETIME_MS_DEFAULT, FeedConfiguration.getSessionLifetimeMs()); + Assert.assertEquals( + FeedConfiguration.SNIPPETS_ENABLED_DEFAULT, FeedConfiguration.getSnippetsEnabled()); Assert.assertEquals(FeedConfiguration.TRIGGER_IMMEDIATE_PAGINATION_DEFAULT, FeedConfiguration.getTriggerImmediatePagination()); Assert.assertEquals(FeedConfiguration.UNDOABLE_ACTIONS_ENABLED_DEFAULT, @@ -183,6 +185,16 @@ @Feature({"Feed"}) @CommandLineFlags. Add({"enable-features=InterestFeedContentSuggestions<Trial", "force-fieldtrials=Trial/Group", + "force-fieldtrial-params=Trial.Group:snippets_enabled/true"}) + public void + testSnippetsEnabled() { + Assert.assertTrue(FeedConfiguration.getSnippetsEnabled()); + } + + @Test + @Feature({"Feed"}) + @CommandLineFlags. + Add({"enable-features=InterestFeedContentSuggestions<Trial", "force-fieldtrials=Trial/Group", "force-fieldtrial-params=Trial.Group:trigger_immediate_pagination/true"}) public void testTriggerImmedatePagination() { @@ -257,6 +269,7 @@ configuration.getValueOrDefault(ConfigKey.NON_CACHED_PAGE_SIZE, 0)); Assert.assertEquals(Long.valueOf(FeedConfiguration.SESSION_LIFETIME_MS_DEFAULT), configuration.getValueOrDefault(ConfigKey.SESSION_LIFETIME_MS, 0l)); + Assert.assertFalse(configuration.getValueOrDefault(ConfigKey.SNIPPETS_ENABLED, true)); Assert.assertFalse( configuration.getValueOrDefault(ConfigKey.TRIGGER_IMMEDIATE_PAGINATION, true)); Assert.assertFalse(
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcherTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcherTest.java index 20afb67..95247dc 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcherTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcherTest.java
@@ -81,7 +81,7 @@ // Verify metrics have been reported. verify(mImageFetcherBridge) - .reportEvent(eq(UMA_CLIENT_NAME), eq(CachedImageFetcherEvent.JAVA_DISK_CACHE_HIT)); + .reportEvent(eq(UMA_CLIENT_NAME), eq(ImageFetcherEvent.JAVA_DISK_CACHE_HIT)); verify(mImageFetcherBridge).reportCacheHitTime(eq(UMA_CLIENT_NAME), eq(START_TIME)); } @@ -119,7 +119,7 @@ // Verify metrics have been reported. verify(mImageFetcherBridge) - .reportEvent(eq(UMA_CLIENT_NAME), eq(CachedImageFetcherEvent.JAVA_DISK_CACHE_HIT)); + .reportEvent(eq(UMA_CLIENT_NAME), eq(ImageFetcherEvent.JAVA_DISK_CACHE_HIT)); verify(mImageFetcherBridge).reportCacheHitTime(eq(UMA_CLIENT_NAME), anyLong()); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcherTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcherTest.java index ee9440be..caecb51b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcherTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcherTest.java
@@ -113,7 +113,7 @@ // Verify metrics are reported. verify(mBridge).reportEvent( - eq(UMA_CLIENT_NAME), eq(CachedImageFetcherEvent.JAVA_IN_MEMORY_CACHE_HIT)); + eq(UMA_CLIENT_NAME), eq(ImageFetcherEvent.JAVA_IN_MEMORY_CACHE_HIT)); } @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java index 8060470..82ca60b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java
@@ -74,12 +74,14 @@ private TabObserver mTabObserver; private UserDataHost mUserDataHost; + private UserDataHost mUserDataHostTab2; @Before public void setUp() { MockitoAnnotations.initMocks(this); mUserDataHost = new UserDataHost(); + mUserDataHostTab2 = new UserDataHost(); doReturn(false).when(mTab).isIncognito(); doReturn(null).when(mTab).getUrl(); @@ -87,6 +89,7 @@ doReturn(Arrays.asList(mTabModel)).when(mTabModelSelector).getModels(); doReturn(mTab).when(mTabModelSelector).getCurrentTab(); doReturn(mUserDataHost).when(mTab).getUserDataHost(); + doReturn(mUserDataHostTab2).when(mTab2).getUserDataHost(); doReturn(Promise.fulfilled("1")).when(mTokenTracker).getTokenForFqdn(anyString()); } @@ -273,6 +276,23 @@ } @Test + public void eagerSuspension_reshowSameDomain_nowUnsuspended() { + PageViewObserver observer = createPageViewObserver(); + onUpdateUrl(mTab, STARTING_URL); + + doReturn(STARTING_URL).when(mTab).getUrl(); + observer.notifySiteSuspensionChanged(STARTING_FQDN, true); + + verify(mTab, times(2)).addObserver(mTabObserverCaptor.capture()); + assertTrue(mTabObserverCaptor.getValue() instanceof SuspendedTab); + SuspendedTab suspendedTab = (SuspendedTab) mTabObserverCaptor.getValue(); + + doReturn(false).when(mSuspensionTracker).isWebsiteSuspended(STARTING_FQDN); + onShown(mTab, TabSelectionType.FROM_USER); + verify(mTab, times(1)).removeObserver(suspendedTab); + } + + @Test public void eagerUnsuspension() { PageViewObserver observer = createPageViewObserver(); onUpdateUrl(mTab, STARTING_URL);
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index e6b4539..fe9fff2 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-75.0.3757.0_rc-r1-merged.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-75.0.3767.0_rc-r1-merged.afdo.bz2 \ No newline at end of file
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn index 345279b5..37e326b 100644 --- a/chrome/app/BUILD.gn +++ b/chrome/app/BUILD.gn
@@ -624,6 +624,7 @@ "//ash/public/cpp:manifest", "//chrome/browser/chromeos:ash_pref_connector_manifest", "//chrome/services/cups_ipp_parser/public/cpp:manifest", + "//chromeos/services/cellular_setup/public/cpp:manifest", "//chromeos/services/ime/public/cpp:manifest", "//chromeos/services/secure_channel/public/cpp:manifest", "//services/ws/public/mojom/input_devices",
diff --git a/chrome/app/DEPS b/chrome/app/DEPS index 9491a52..3f37e93e 100644 --- a/chrome/app/DEPS +++ b/chrome/app/DEPS
@@ -94,6 +94,7 @@ "+chrome/services/util_win/public", "+chrome/services/wifi_util_win/public", "+chrome/utility/importer/profile_import_manifest.h", + "+chromeos/services/cellular_setup", "+chromeos/services/ime", "+chromeos/services/secure_channel", "+components/mirroring/service",
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc index 14d266a..34c4f81 100644 --- a/chrome/app/chrome_content_browser_overlay_manifest.cc +++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -144,6 +144,7 @@ // Only used in the classic Ash case .RequireCapability("ash_pref_connector", "pref_connector") .RequireCapability("assistant", "assistant") + .RequireCapability("cellular_setup", "cellular_setup") // Only used in the classic Ash case .RequireCapability("chrome", "input_device_controller") .RequireCapability("chrome_printing", "converter")
diff --git a/chrome/app/chrome_packaged_service_manifests.cc b/chrome/app/chrome_packaged_service_manifests.cc index ebcb8717..f9500f9f 100644 --- a/chrome/app/chrome_packaged_service_manifests.cc +++ b/chrome/app/chrome_packaged_service_manifests.cc
@@ -27,6 +27,7 @@ #include "ash/public/cpp/manifest.h" #include "chrome/browser/chromeos/prefs/ash_pref_connector_manifest.h" #include "chrome/services/cups_ipp_parser/public/cpp/manifest.h" // nogncheck +#include "chromeos/services/cellular_setup/public/cpp/manifest.h" #include "chromeos/services/ime/public/cpp/manifest.h" #include "chromeos/services/secure_channel/public/cpp/manifest.h" #include "services/ws/public/mojom/input_devices/input_device_controller.mojom.h" @@ -169,6 +170,7 @@ ash::GetManifest(), GetAshPrefConnectorManifest(), GetCupsIppParserManifest(), + chromeos::cellular_setup::GetManifest(), chromeos::ime::GetManifest(), chromeos::secure_channel::GetManifest(), ui::GetAXHostManifest(),
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index c501187..befcbf0 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -32,6 +32,7 @@ <translation id="1929939181775079593">Hindi gumagana ang Chromium. Muling ilunsad ngayon?</translation> <translation id="1966382378801805537">Hindi matukoy o maitakda ng Chromium ang default na browser</translation> <translation id="2008474315282236005">Magde-delete ito ng 1 item sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chromium bilang <ph name="USER_EMAIL" />.</translation> +<translation id="2037988709973327241">Mapanganib ang <ph name="FILE_NAME" /> kaya na-block ito ng Chrome. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="2117378023188580026">Hinihiling sa iyo ng administrator mo na muli mong ilunsad ang Chromium para malapat ang update na ito</translation> <translation id="2119636228670142020">Tungkol sa &Chromium OS</translation> <translation id="2178765360243863853">Dapat mo nang i-restart ang Chromium</translation> @@ -63,6 +64,7 @@ <translation id="3068515742935458733">Tumulong na gawing mas mahusay ang Chromium sa pamamagitan ng pagpapadala ng mga ulat ng pag-crash at <ph name="UMA_LINK" /> sa Google</translation> <translation id="3103660991484857065">Nabigong i-uncompress ng installer ang archive. Mangyaring i-download muli ang Chromium.</translation> <translation id="3130323860337406239">Ginagamit ng Chromium ang iyong mikropono.</translation> +<translation id="3154325651427862069">Puwedeng mapanganib ang <ph name="FILE_NAME" /> kaya na-block ito ng Chromium. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="3155163173539279776">Muling ilunsad ang Chromium</translation> <translation id="3179665906251668410">Buksan ang Link sa Inco&gnito Window ng Chromium</translation> <translation id="3190315855212034486">Whoa! Nag-crash ang Chromium. Muling ilunsad ngayon?</translation> @@ -90,6 +92,7 @@ <translation id="388648406173476553">I-customize at kontrolin ang Chromium. May kailangan kang pagtuunan ng pansin - mag-click para sa mga detalye.</translation> <translation id="3889543394854987837">I-click ang iyong pangalan upang buksan ang Chromium at simulan ang pagba-browse.</translation> <translation id="3898493977366060150">Pag-browse sa web gamit ang mga smart na feature ng Google</translation> +<translation id="3931244652999881512">Puwedeng mapanganib ang file na ito kaya na-block ito ng Chromium. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="3965668104013180445">{0,plural, =1{Magre-restart ang Chromium OS sa loob ng isang oras}one{Magre-restart ang Chromium OS sa loob ng # oras}other{Magre-restart ang Chromium OS sa loob ng # na oras}}</translation> <translation id="4036079820698952681">Tulungang pahusayin ang Chromium sa pamamagitan ng pag-ulat sa <ph name="BEGIN_LINK" />mga kasalukuyang setting<ph name="END_LINK" /></translation> <translation id="4050175100176540509">May available na mahahalagang pagpapahusay sa seguridad at mga bagong feature sa pinakabagong bersyon.</translation> @@ -140,6 +143,7 @@ <translation id="5680901439334282664">mag-sign in sa Chromium</translation> <translation id="5698481217667032250">Ipakita ang Chromium sa wikang ito</translation> <translation id="5712253116097046984">Hinihiling sa iyo ng administrator mo na i-restart ang Chromium OS para mailapat ang update na ito</translation> +<translation id="5726979195371243087">Puwedeng mapanganib ang file na ito kaya na-block ito ng Chromium. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="5756484659843248772">Ginagamit ang wikang ito para ipakita ang Chromium OS UI</translation> <translation id="5768914737813585044">Ipakita ang Chromium OS sa wikang ito</translation> <translation id="5796460469508169315">Halos handa na ang Chromium.</translation> @@ -254,6 +258,7 @@ <translation id="8667808506758191620">Napapanahon ang iyong <ph name="DEVICE_TYPE" />.</translation> <translation id="8697124171261953979">Kinokontrol din nito kung anong pahina ang ipinapakita kapag sinimulan mo ang Chromium o naghanap mula sa Omnibox.</translation> <translation id="8704119203788522458">Ito ang iyong Chromium</translation> +<translation id="8704255848199359374">Ginagamit nito ang parehong spellchecker na ginagamit sa paghahanap sa Google. Ipinapadala sa Google ang text na tina-type mo sa browser. Puwede mong baguhin palagi ang gawing ito sa mga setting.</translation> <translation id="8796602469536043152">Kailangan ng Chromium ng pahintulot na i-access ang iyong camera at mikropono para sa site na ito</translation> <translation id="8803635938069941624">Mga tuntunin ng Chromium OS</translation> <translation id="8821041990367117597">Hindi mai-sync ng Chromium ang iyong data dahil hindi napapanahon ang mga detalye sa pag-sign in ng iyong account.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index 50407a5..8ec52bfb5 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -21,9 +21,9 @@ <translation id="1708666629004767631">क्रोमियम का एक नया और सुरक्षित वर्शन उपलब्ध है.</translation> <translation id="1766096484055239003">आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें</translation> <translation id="1774152462503052664">क्रोमियम को पृष्ठभूमि में चलने दें</translation> -<translation id="1779356040007214683">Chromium को अधिक सुरक्षित बनाने के लिए, हमने ऐसे कुछ एक्सटेंशन अक्षम कर दिए हैं जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं हैं और आपकी जानकारी के बिना जोड़े गए हो सकते हैं.</translation> +<translation id="1779356040007214683">Chromium को ज़्यादा सुरक्षित बनाने के लिए, हमने ऐसे कुछ एक्सटेंशन अक्षम कर दिए हैं जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं हैं और आपकी जानकारी के बिना जोड़े गए हो सकते हैं.</translation> <translation id="1808667845054772817">क्रोमियम को फिर से इंस्टॉल करें</translation> -<translation id="1869480248812203386">आप Google को संभावित सुरक्षा घटनाओं के विवरणों की अपने आप रिपोर्ट करके क्रोमियम को अधिक सुरक्षित और आसान बनाने में सहायता कर सकते हैं.</translation> +<translation id="1869480248812203386">आप Google को संभावित सुरक्षा घटनाओं के विवरणों की अपने आप रिपोर्ट करके क्रोमियम को ज़्यादा सुरक्षित और आसान बनाने में सहायता कर सकते हैं.</translation> <translation id="1881322772814446296">आप प्रबंधित खाते से प्रवेश कर रहे हैं और उसके व्यवस्थापक को अपनी क्रोमियम प्रोफ़ाइल पर नियंत्रण दे रहे हैं. आपका क्रोमियम डेटा, जैसे आपके ऐप्स , बुकमार्क, इतिहास, पासवर्ड, औऱ अन्य सेटिंग स्थायी रूप से <ph name="USER_NAME" /> से जुड़ जाएंगी. आप Google खाता डैशबोर्ड के माध्यम से इस डेटा को हटा सकेंगे, लेकिन अन्य किसी खाते से इस डेटा को संबद्ध नहीं कर सकेंगे. आप अपने मौजूदा क्रोमियम डेटा को अलग रखने के लिए वैकल्पिक रूप से एक नई प्रोफ़ाइल बना सकते हैं. <ph name="LEARN_MORE" /></translation> <translation id="1895626441344023878">{0,plural, =0{क्रोमियम का एक अपडेट उपलब्ध है}=1{क्रोमियम का एक अपडेट उपलब्ध है}one{क्रोमियम का एक अपडेट # दिनों से उपलब्ध है}other{क्रोमियम का एक अपडेट # दिनों से उपलब्ध है}}</translation> <translation id="1911763535808217981">इसे बंद करके, आप क्रोमियम में साइन इन किए बिना Gmail जैसी Google साइटों में साइन इन कर सकते हैं</translation> @@ -34,7 +34,7 @@ <translation id="2117378023188580026">आपके एडमिन का कहना है कि यह अपडेट लागू करने के लिए आप क्रोमियम को फिर से लॉन्च करें</translation> <translation id="2119636228670142020">&क्रोमियम OS के बारे में</translation> <translation id="2178765360243863853">आपको क्रोमियम को अभी रीस्टार्ट करना चाहिए</translation> -<translation id="2241627712206172106">अगर आप किसी कंप्यूटर को शेयर करते हैं, तो मित्र और परिवार अलग-अलग ब्राउज़ कर सकते हैं और क्रोमियम को जैसा चाहें सेट कर सकते हैं.</translation> +<translation id="2241627712206172106">अगर आप किसी कंप्यूटर को शेयर करते हैं, तो दोस्त और परिवार अलग-अलग ब्राउज़ कर सकते हैं और क्रोमियम को जैसा चाहें सेट कर सकते हैं.</translation> <translation id="2265088490657775772">अपने iPhone पर क्रोमियम पाएं</translation> <translation id="2347108572062610441">इस एक्सटेंशन ने यह बदल दिया है कि जब आप क्रोमियम प्रारंभ करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> <translation id="2396765026452590966">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने यह बदल दिया है कि जब आप क्रोमियम प्रारंभ करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> @@ -153,7 +153,7 @@ <translation id="5987687638152509985">सिंक शुरू करने के लिए क्रोमियम अपडेट करें</translation> <translation id="6013050204643758987">क्रोमियम ओएस को <ph name="BEGIN_LINK_LINUX_OSS" />Linux (बीटा)<ph name="END_LINK_LINUX_OSS" /> की तरह ही, अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> के ज़रिए कारगर बनाया गया है.</translation> <translation id="6040143037577758943">बंद करें</translation> -<translation id="6055895534982063517">क्रोमियम का एक नया वर्शन उपलब्ध है और यह पहले से अधिक तेज़ है.</translation> +<translation id="6055895534982063517">क्रोमियम का एक नया वर्शन उपलब्ध है और यह पहले से ज़्यादा तेज़ है.</translation> <translation id="6063093106622310249">&क्रोमियम में खोलें</translation> <translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> को क्रोमियम में जोड़ा गया</translation> <translation id="608189560609172163">प्रवेश करने में किसी गड़बड़ी के कारण क्रोमियम आपका डेटा समन्वयित नहीं कर सका.</translation> @@ -161,7 +161,7 @@ <translation id="6120345080069858279">क्रोमियम इस पासवर्ड को आपके Google खाते में सेव कर लेगा. आपको इसे याद रखने की ज़रूरत नहीं है.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> खतरनाक है, इसलिए क्रोमियम ने उसे अवरोधित कर दिया है.</translation> <translation id="620022061217911843">आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम OS को रीस्टार्ट करें</translation> -<translation id="6212496753309875659">इस कंप्यूटर में पहले से क्रोमियम का अधिक नया वर्शन है. अगर सॉफ़्टवेयर कार्य नहीं कर रहा है, तो कृपया क्रोमियम अनइंस्टॉल करें और फिर से प्रयास करें.</translation> +<translation id="6212496753309875659">इस कंप्यूटर में पहले से क्रोमियम का ज़्यादा नया वर्शन है. अगर सॉफ़्टवेयर कार्य नहीं कर रहा है, तो कृपया क्रोमियम अनइंस्टॉल करें और फिर से प्रयास करें.</translation> <translation id="6248213926982192922">क्रोमियम को डिफ़ॉल्ट ब्राउज़र बनाएं</translation> <translation id="6268381023930128611">क्रोमियम से प्रस्थान करें?</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> खतरनाक हो सकता है, इसलिए क्रोमियम ने उसे अवरोधित कर दिया है.</translation> @@ -170,7 +170,7 @@ <translation id="6334986366598267305">अब अपने Google खाते के साथ और शेयर किए गए कंप्यूटर पर क्रोमियम का उपयोग करना आसान हो गया है.</translation> <translation id="6373523479360886564">क्या आप वाकई क्रोमियम को अनइंस्टाल करना चाहते हैं?</translation> <translation id="6400072781405947421">हो सकता है कि क्रोमियम ठीक से काम ना करे क्योंकि अब Mac OS X 10.9 पर इसकी सुविधा नहीं है.</translation> -<translation id="6403826409255603130">क्रोमियम वेब ब्राउज़र है जो बहुत तेज़ी से वेबपेज और ऐप्लिकेशन चलाता है. यह तेज़, स्थिर, और उपयोग में आसान है. क्रोमियम में अंतर्निहित मैलवेयर और फ़ीशिंग सुरक्षा के साथ अधिक आसानी से वेब ब्राउज़ करें.</translation> +<translation id="6403826409255603130">क्रोमियम वेब ब्राउज़र है जो बहुत तेज़ी से वेबपेज और ऐप्लिकेशन चलाता है. यह तेज़, स्थिर, और उपयोग में आसान है. क्रोमियम में अंतर्निहित मैलवेयर और फ़ीशिंग सुरक्षा के साथ ज़्यादा आसानी से वेब ब्राउज़ करें.</translation> <translation id="6434250628340475518">क्रोमियम OS सिस्टम</translation> <translation id="6457450909262716557">{SECONDS,plural, =1{क्रोमियम 1 सेकंड में रीस्टार्ट होगा}one{क्रोमियम # सेकंड में रीस्टार्ट होगा}other{क्रोमियम # सेकंड में रीस्टार्ट होगा}}</translation> <translation id="6475912303565314141">इससे यह भी नियंत्रित होता है कि जब आप क्रोमियम प्रारंभ करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> @@ -209,7 +209,7 @@ <translation id="7344413941077984497">यह सेट करने के लिए कि <ph name="NEW_PROFILE_NAME" /> द्वारा कौन सी वेबसाइट देखी जा सकती है, आप <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" /> पर जाकर प्रतिबंध और सेटिंग कॉन्फ़िगर कर सकते हैं. अगर आप डिफ़ॉल्ट सेटिंग नहीं बदलते हैं, तो <ph name="NEW_PROFILE_NAME" /> द्वारा वेब प्रोफ़ाइल पर सब कुछ ब्राउज़ किया जा सकता है. <ph name="NEW_PROFILE_NAME" /> को अपना खाता एक्सेस करने से रोकने के लिए, जब आप क्रोमियम का उपयोग नहीं कर रहे हों तो अपनी प्रोफ़ाइल को अवश्य लॉक कर दें. ऐसा करने के लिए, ब्राउज़र के ऊपर-दाएं कोने में स्थित अपना प्रोफ़ाइल नाम क्लिक करें और "बाहर निकलें और चाइल्ड लॉक करें" चुनें. -<ph name="BEGIN_LINK_2" />अधिक जानें<ph name="END_LINK_2" /> +<ph name="BEGIN_LINK_2" />ज़्यादा जानें<ph name="END_LINK_2" /> कृपया अतिरिक्त निर्देशों के लिए <ph name="ACCOUNT_EMAIL" /> पर अपना ईमेल देखें.</translation> <translation id="7448255348454382571">क्रोमियम OS को रीस्टार्ट करें</translation> @@ -267,7 +267,7 @@ <translation id="8985587603644336029">इस कंप्यूटर पर पहले किसी अन्य व्यक्ति ने <ph name="ACCOUNT_EMAIL_LAST" /> के रूप में Chromium में साइन इन किया. अगर वह आपका खाता नहीं है तो, अपनी जानकारी अलग रखने के लिए कृपया नया Chromium उपयोगकर्ता बनाएं. किसी भी तरह साइन इन करने से बुकमार्क, इतिहास और अन्य सेटिंग से जुड़ी Chromium की जानकारियां <ph name="ACCOUNT_EMAIL_NEW" /> में मिल जाएंगी.</translation> -<translation id="9019929317751753759">क्रोमियम को अधिक सुरक्षित बनाने के लिए, हमने निम्न एक्सटेंशन को अक्षम कर दिया है जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं है और आपकी जानकारी के बिना जोड़ा गया हो सकता है.</translation> +<translation id="9019929317751753759">क्रोमियम को ज़्यादा सुरक्षित बनाने के लिए, हमने निम्न एक्सटेंशन को अक्षम कर दिया है जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं है और आपकी जानकारी के बिना जोड़ा गया हो सकता है.</translation> <translation id="9022552996538154597">क्रोमियम में साइन इन करें</translation> <translation id="9025992965467895364">यह पेज बहुत ज़्यादा मेमोरी का इस्तेमाल करता है, इसलिए क्रोमियम ने इसे रोक दिया है.</translation> <translation id="9036189287518468038">क्रोमियम ऐप चलाने का साधन</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index cc1633f..d59c03c 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">የእርስዎን መሣሪያ፣ መተግበሪያዎች እና ድር ይፈልጉ።</translation> <translation id="114721135501989771">Google ዘመናዊ ነገሮችን በChrome ላይ ያግኙ</translation> <translation id="1149401351239820326">ጊዜው የሚያልፍበት ወር</translation> +<translation id="1150565364351027703">የጸሐይ መነጽሮች</translation> <translation id="1151917987301063366"><ph name="HOST" /> ሁልጊዜ ዳሳሾችን እንዲደርስ ፍቀድ</translation> <translation id="1153356358378277386">የተጣመሩ መሣሪያዎች</translation> <translation id="1156488781945104845">የአሁኑ ሰዓት</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">የቁልፍ ሰሌዳ አቋራጭ አጋዥ</translation> <translation id="2045969484888636535">ኩኪዎች ማገዱን ይቀጥሉ</translation> <translation id="204622017488417136">የእርስዎ መሣሪያ ወደ ቀደም ሲል ተጭኖ የነበረው የChrome ስሪት እንዲመለስ ይደረጋል። ሁሉም የተጠቃሚ መለያዎች እና የአካባቢ ውሂብ ይወገዳሉ። ይህ አንዴ ከተደረገ በኋላ ሊቀለበስ አይችልም።</translation> +<translation id="2046702855113914483">ራመን</translation> <translation id="2048182445208425546">የእርስዎን የአውታረ መረብ ትራፊክ ይድረስበት</translation> <translation id="2048653237708779538">እርምጃ አይገኝም</translation> <translation id="2050339315714019657">በቁመት</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> ታክሏል</translation> <translation id="2464089476039395325">የኤችቲቲፒ ተኪ</translation> <translation id="2468205691404969808">የእርስዎን ምርጫዎች ለማስታወስ ኩኪዎችን ይጠቀማል፣ እነዚያን ገጾች ባይጎበኙም እንኳ</translation> +<translation id="2468402215065996499">ታማጎቺ</translation> <translation id="2469375675106140201">ፊደል ማረሚያን አብጅ</translation> <translation id="247051149076336810">የፋይል ማጋራት ዩአርኤል</translation> <translation id="2470702053775288986">የማይደገፉ ቅጥያዎች ተሰናክለዋል</translation> @@ -1131,6 +1134,7 @@ <translation id="2770465223704140727">ከዝርዝር አስወግድ</translation> <translation id="2770690685823456775">የእርስዎን የይለፍ ቃላት ወደ ሌላ አቃፊ ይላኩ</translation> <translation id="2771268254788431918">የተንቀሳቃሽ ስልክ ውሂብ ገቢር ሆኗል</translation> +<translation id="2771816809568414714">ቺዝ</translation> <translation id="2772936498786524345">Sneaky</translation> <translation id="2773288106548584039">የቆየ የአሳሽ ድጋፍ</translation> <translation id="2773802008104670137">ይህ የፋይል ዓይነት የእርስዎን ኮምፒውተር ሊጎዳ ይችላል።</translation> @@ -1654,6 +1658,7 @@ <translation id="3616113530831147358">ድምጽ</translation> <translation id="3616741288025931835">&የአሰሳ ውሂብ አጽዳ…</translation> <translation id="3617891479562106823">ዳራዎች አይገኙም። ቆይተው እንደገና ይሞክሩ።</translation> +<translation id="3619115746895587757">ካፑቺኖ</translation> <translation id="3623574769078102674">ይህ ክትትል የሚደረግበት ተጠቃሚ በ<ph name="MANAGER_EMAIL" /> ነው የሚተዳደረው።</translation> <translation id="3624567683873126087">መሣሪያን ይክፈቱ እና ወደ Google በመለያ ይግቡ</translation> <translation id="3625258641415618104">ቅጽበታዊ-ገጽ እይታዎች ተሰናክለዋል</translation> @@ -2130,6 +2135,7 @@ <translation id="4359717112757026264">ሲቲስኬፕ</translation> <translation id="4361142739114356624">የዚህ ደንበኛ የእውቅና ማረጋገጫ የሆነው የግል ቁልፍ ይጎድላል ወይም አይሠራም</translation> <translation id="4363771538994847871">ምንም የCast መድረሻዎች አልተገኙም። እገዛ አስፈለገዎት?</translation> +<translation id="4364327530094270451">ሐብሐብ</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> አንድ መስኮት እያጋራ ነው።</translation> <translation id="4364830672918311045">ማሳወቂያዎችን አሳይ</translation> <translation id="4365673000813822030">ውይ፣ ማመሳሰል መስራት አቁሟል።</translation> @@ -2319,6 +2325,7 @@ <translation id="4690091457710545971"><አራት ፋይሎች በIntel Wi-Fi ፈርምዌር መንጭተዋል፦ csr.lst፣ fh_regs.lst፣ radio_reg.lst፣ monitor.lst.sysmon። የመጀመሪያዎቹ ሦስት የመዝገብ ተወጋጆችን የያዙ የሁለትዮሽ ፋይሎች ናቸው፣ እና ምንም የግል ወይም መሣሪያን ለይቶ የሚያሳውቅ መረጃን እንዳልያዙ በIntel የተረጋገጡ ናቸው። የመጨረሻው ፋይል ከIntel ፈርምዌር የሥራ ማስፈጸሚያ ዱካ ነው፤ ማናቸውም የግል ወይም መሣሪያን ለይቶ የሚያሳውቅ መረጃው እንዲራገፍ ተደርጓል። እነዚህ ፋይሎች የመነጩት በቅርቡ በእርስዎ መሣሪያ ላይ ከWi-Fi ጋር ለነበሩ ችግሮች እንደ ምላሽ ነው፣ እና ለእነዚህ ችግሮች መላ ለመፈለግ ለIntel ይጋራሉ።></translation> <translation id="469230890969474295">የኦኢኤም አቃፊ</translation> <translation id="4692623383562244444">የፍለጋ ፕሮግራሞች</translation> +<translation id="4693155481716051732">ሱሺ</translation> <translation id="4694024090038830733">የአታሚ ውቅረት በአስተዳዳሪው ነው የሚሰራው።</translation> <translation id="4694604912444486114">ጦጣ</translation> <translation id="4697551882387947560">የአሰሳ ክፍለ-ጊዜው ሲያልቅ</translation> @@ -2373,6 +2380,7 @@ <translation id="4776917500594043016">የ<ph name="USER_EMAIL_ADDRESS" /> ይለፍ ቃል</translation> <translation id="4777825441726637019">Play መደብር</translation> <translation id="4779083564647765204">ማጉሊያ</translation> +<translation id="4779136857077979611">ኦኒጊሪ</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{ብቅ-ባይ ታግዷል}one{# ብቅ-ባዮች ታግዷል}other{# ብቅ-ባዮች ታግዷል}}</translation> <translation id="4780321648949301421">ገጽ አስቀምጥ እንደ…</translation> <translation id="4785719467058219317">በዚህ ድር ጣቢያ ያልተመዘገበ የደህንነት ቁልፍ እየተጠቀሙ ነው</translation> @@ -2385,6 +2393,7 @@ <translation id="4801448226354548035">መለያዎችን ደብቅ</translation> <translation id="4801512016965057443">የተንቀሳቃሽ ስልክ ውሂብ ዝውውር ይፍቀዱ</translation> <translation id="4804818685124855865">ግንኙነት አቋርጥ</translation> +<translation id="4804827417948292437">አቮካዶ</translation> <translation id="4807098396393229769">በካርድ ላይ ያለ ስም</translation> <translation id="4808667324955055115">ብቅ-ባዮች ታግደዋል፦</translation> <translation id="480990236307250886">መነሻ ገጹን ክፈት</translation> @@ -2479,6 +2488,7 @@ <translation id="4941246025622441835">መሣሪያው ለድርጅት አስተዳደር ሲያስመዘግቡት ይህን የመሣሪያ መውረሻ ይጠቀሙ፦</translation> <translation id="4941627891654116707">የቅርፀ-ቁምፊ መጠን</translation> <translation id="494286511941020793">የተኪ ውቅር እገዛ</translation> +<translation id="4943368462779413526">የአሜሪካ እግር ኳስ</translation> <translation id="4943691134276646401">«<ph name="CHROME_EXTENSION_NAME" />» ወደ ተከታታይ ወደብ መገናኘት ይፈልጋል</translation> <translation id="495170559598752135">እርምጃዎች</translation> <translation id="4953689047182316270">ለተደራሽነት ክስተቶች ምላሽ መስጠት</translation> @@ -2548,6 +2558,7 @@ <translation id="5067399438976153555">ሁሌም አብራ</translation> <translation id="5067867186035333991"><ph name="HOST" /> ማይክሮፎንዎን መድረስ የሚፈልግ ከሆነ ይጠይቅ</translation> <translation id="5068918910148307423">በቅርቡ የተዘጉ ጣቢያዎች ውሂብን መላክ እና መቀበል እንዲጨርሱ አትፍቀድ</translation> +<translation id="5068919226082848014">ፒዛ</translation> <translation id="5072052264945641674">የጠቋሚ መጠንን አስተካክል</translation> <translation id="5072836811783999860">የሚቀናበሩ ዕልባቶችን አሳይ</translation> <translation id="5074318175948309511">አዲሶቹ ቅንብሮች ከመተግበራቸው በፊት ይህ ገጽ ዳግም መጫን ሊኖርበት ይችላል።</translation> @@ -2582,6 +2593,7 @@ <translation id="5117930984404104619">የተጎበኙ ዩ አር ኤሎችንም ጨምሮ የሌሎች ቅጥያዎች ባህሪ ይከታተሉ</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">ደረቅ አንጻፊዎ ሙሉ ነው። እባክዎ ሌላ ቦታ ላይ ያስቀምጡ ወይም ደረቅ አንጻፊው ላይ ቦታ ያስለቅቁ።</translation> +<translation id="5123433949759960244">ቅርጫት ኳስ</translation> <translation id="5125751979347152379">ልክ ያልሆነ URL።</translation> <translation id="5127805178023152808">አመሳስል ጠፍቷል</translation> <translation id="5127881134400491887">የአውታረ መረብ ግንኙነቶች አቀናብር</translation> @@ -3265,6 +3277,7 @@ <translation id="6166185671393271715">የይለፍ ቃላትን ወደ Chrome ያስመጡ</translation> <translation id="6169040057125497443">እባክዎ ማይክሮፎንዎን ይፈትሹ።</translation> <translation id="6169666352732958425">ዴስክቶፕን cast ማድረግ አልተቻለም።</translation> +<translation id="6170470584681422115">ሳንድዊች</translation> <translation id="6171948306033499786">ማተምን ባለበት አቁም</translation> <translation id="6173623053897475761">የእርስዎን ፒን እንደገና ይተይቡት</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3695,6 +3708,7 @@ <translation id="6870888490422746447">የሚያጋሩትን መተግበሪያ ይምረጡ፦</translation> <translation id="6871644448911473373">OCSP ምላሽ ሰጪ፦ <ph name="LOCATION" /></translation> <translation id="6872781471649843364">ያስገቡት የይለፍ ቃል በአገልጋዩ ተቀባይነት አላገኘም።</translation> +<translation id="6876155724392614295">ቢስክሌት</translation> <translation id="6878422606530379992">ዳሳሾች ተፈቅደዋል</translation> <translation id="6880587130513028875">በዚህ ገጽ ላይ ምስሎች ታግደዋል።</translation> <translation id="6883319974225028188">ውይ! ሥርዓቱ የመሣሪያ ውቅረቱን ማስቀመጥ አልቻለም።</translation> @@ -4261,6 +4275,7 @@ <translation id="7772127298218883077">ስለ <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">የእርስዎን የChromebook ሁኔታ ይፈትሹ</translation> <translation id="7773726648746946405">የክፍለ-ጊዜ ማከማቻ</translation> +<translation id="7774365994322694683">ወፍ</translation> <translation id="7776701556330691704">ምንም ድምጾች አልተገኙም</translation> <translation id="7781335840981796660">ሁሉም የተጠቃሚ መለያዎች እና አካባቢያዊ ውሂብ ይወገዳሉ።</translation> <translation id="7782102568078991263">ከGoogle ተጨማሪ የጥቆማ አስተያየቶች የሉም</translation> @@ -4670,6 +4685,7 @@ <translation id="8386903983509584791">መቃኘት ተጠናቅቋል</translation> <translation id="8389492867173948260">ይህ ቅጥያ በሚጎበኟቸው ድር ጣቢያዎች ላይ ያለው ሁሉም ውሂብዎን እንዲያነብብ እና እንዲቀይር ይፍቀዱ፦</translation> <translation id="8390449457866780408">አገልጋይ አይገኝም።</translation> +<translation id="8391218455464584335">ቪኒል</translation> <translation id="8391712576156218334">ምስል ሊገኝ አይችልም። ቆይተው እንደገና ይሞክሩ።</translation> <translation id="8392234662362215700">የቁልፍ ሰሌዳ አቀማመጥን ለመቀየር Control-Shift-Space ይምቱ።</translation> <translation id="8392451568018454956">የ<ph name="USER_EMAIL_ADDRESS" /> አማራጮች ምናሌ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index f5788da..066923a 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">البحث في جهازك والتطبيقات والويب.</translation> <translation id="114721135501989771">الحصول على ميزات Google الذكية في Chrome</translation> <translation id="1149401351239820326">شهر انتهاء الصلاحية</translation> +<translation id="1150565364351027703">نظارات شمسية</translation> <translation id="1151917987301063366">السماح دائمًا لـ <ph name="HOST" /> بالوصول إلى أجهزة الاستشعار</translation> <translation id="1153356358378277386">الأجهزة المقترنة</translation> <translation id="1156488781945104845">الوقت الحالي</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">مساعد اختصارات لوحة المفاتيح</translation> <translation id="2045969484888636535">متابعة حظر تشغيل ملفات تعريف الارتباط</translation> <translation id="204622017488417136">سيتم إرجاع جهازك إلى إصدار Chrome المثبت مسبقًا. ستتم إزالة كل حسابات المستخدمين والبيانات المحلية. ولا يمكن التراجع عن ذلك.</translation> +<translation id="2046702855113914483">رامن</translation> <translation id="2048182445208425546">الدخول إلى عدد زيارات شبكتك</translation> <translation id="2048653237708779538">الإجراء غير متاح</translation> <translation id="2050339315714019657">رأسي</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">تمت إضافة <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">خادم وكيل HTTP</translation> <translation id="2468205691404969808">يتم استخدام ملفات تعريف الارتباط لتذكّر اهتماماتك حتى لو لم تزُر تلك الصفحات.</translation> +<translation id="2468402215065996499">تماغوتشي</translation> <translation id="2469375675106140201">تخصيص التدقيق الإملائي</translation> <translation id="247051149076336810">عنوان URL لخادم مشاركة الملفات</translation> <translation id="2470702053775288986">تم إيقاف الإضافات غير المدعومة</translation> @@ -1131,6 +1134,7 @@ <translation id="2770465223704140727">إزالة من القائمة</translation> <translation id="2770690685823456775">تصدير كلمات المرور إلى مجلد آخر</translation> <translation id="2771268254788431918">تم تفعيل بيانات الجوّال</translation> +<translation id="2771816809568414714">جبن</translation> <translation id="2772936498786524345">التسلل</translation> <translation id="2773288106548584039">دعم المتصفِّحات القديمة</translation> <translation id="2773802008104670137">قد يضرّ نوع الملف هذا بجهاز الكمبيوتر.</translation> @@ -1653,6 +1657,7 @@ <translation id="3616113530831147358">المقاطع الصوتية</translation> <translation id="3616741288025931835">&محو بيانات التصفح...</translation> <translation id="3617891479562106823">الخلفيات غير متاحة. يُرجى إعادة المحاولة لاحقًا.</translation> +<translation id="3619115746895587757">كابتشينو</translation> <translation id="3623574769078102674">هذا المستخدم الذي يخضع للإشراف ستتم إدارته عن طريق <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">إلغاء قفل الجهاز وتسجيل الدخول إلى حساب Google</translation> <translation id="3625258641415618104">تم إيقاف لقطات الشاشة</translation> @@ -2128,6 +2133,7 @@ <translation id="4359717112757026264">مناظر المدن</translation> <translation id="4361142739114356624">المفتاح الخاص لشهادة العميل هذه مفقود أو غير صالح</translation> <translation id="4363771538994847871">لم يتم العثور على وجهات الإرسال. هل تريد المساعدة؟</translation> +<translation id="4364327530094270451">شمام</translation> <translation id="4364567974334641491">يشارك <ph name="APP_NAME" /> نافذة.</translation> <translation id="4364830672918311045">عرض الإشعارات</translation> <translation id="4365673000813822030">عذرًا، توقفت المزامنة.</translation> @@ -2317,6 +2323,7 @@ <translation id="4690091457710545971"><تم إنشاء أربعة ملفات من خلال برامج Intel Wi-Fi الثابتة وهي كما يلي: csr.lst وfh_regs.lst وradio_reg.lst وmonitor.lst.sysmon. والملفات الثلاثة الأولى هي ملفات ثنائية تحتوي على عمليات تفريغ للسجلّات وهي لا تحتوي على أي معلومات شخصية أو معلومات تحديد هوية الجهاز، حسب تقييم Intel.وأما الملف الأخير فهو عبارة عن تتبُّع تنفيذ من البرامج الثابتة Intel، وتم تنقيحه للتأكّد من خلوه من أي معلومات شخصية أو معلومات تحديد هوية الجهاز، ولكنه لم يُعرض هنا لكبر حجمه. وتم إنشاء هذه الملفات استجابةً لمشاكل Wi-Fi الأخيرة في جهازك، وستتم مشاركتها مع Intel للمساعدة في تحرّي هذه المشاكل وإصلاحها.></translation> <translation id="469230890969474295">مجلد OEM</translation> <translation id="4692623383562244444">محرّكات البحث</translation> +<translation id="4693155481716051732">سوشي</translation> <translation id="4694024090038830733">يُسمح للمشرف فقط بتهيئة الطابعة.</translation> <translation id="4694604912444486114">قرد</translation> <translation id="4697551882387947560">عند انتهاء جلسة التصفح</translation> @@ -2371,6 +2378,7 @@ <translation id="4776917500594043016">كلمة مرور <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">متجر Play</translation> <translation id="4779083564647765204">تكبير/تصغير</translation> +<translation id="4779136857077979611">كرات الأرز</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{تم حظر نافذة منبثقة}zero{تم حظر # نافذة منبثقة}two{تم حظر نافذتين منبثقتين (#)}few{تم حظر # نوافذ منبثقة}many{تم حظر # نافذةً منبثقةً}other{تم حظر # نافذة منبثقة}}</translation> <translation id="4780321648949301421">حفظ صفحة باسم...</translation> <translation id="4785719467058219317">أنت تستخدم مفتاح أمان غير مُسجَّل مع هذا الموقع الإلكتروني</translation> @@ -2383,6 +2391,7 @@ <translation id="4801448226354548035">إخفاء الحسابات</translation> <translation id="4801512016965057443">السماح بتجوال بيانات الجوال</translation> <translation id="4804818685124855865">قطع الاتصال</translation> +<translation id="4804827417948292437">أفوكادو</translation> <translation id="4807098396393229769">الاسم كما على البطاقة</translation> <translation id="4808667324955055115">تمّ حظر النوافذ المنبثقة:</translation> <translation id="480990236307250886">فتح الصفحة الرئيسية</translation> @@ -2477,6 +2486,7 @@ <translation id="4941246025622441835">استخدام طلب الجهاز عند تسجيل الجهاز في إدارة المؤسسات:</translation> <translation id="4941627891654116707">حجم الخط</translation> <translation id="494286511941020793">مساعدة تهيئة الخادم الوكيل</translation> +<translation id="4943368462779413526">كرة القدم</translation> <translation id="4943691134276646401">يجب ربط "<ph name="CHROME_EXTENSION_NAME" />" بمنفذ تسلسلي</translation> <translation id="495170559598752135">إجراءات</translation> <translation id="4953689047182316270">الاستجابة لأحداث إمكانية الوصول</translation> @@ -2546,6 +2556,7 @@ <translation id="5067399438976153555">قيد التشغيل دائمًا</translation> <translation id="5067867186035333991">الرجوع إليك عند رغبة <ph name="HOST" /> في الدخول إلى الميكروفون</translation> <translation id="5068918910148307423">عدم السماح لمواقع الويب التي تم إغلاقها مؤخرًا بإنهاء إرسال البيانات واستلامها</translation> +<translation id="5068919226082848014">بيتزا</translation> <translation id="5072052264945641674">ضبط حجم مؤشر الماوس</translation> <translation id="5072836811783999860">عرض الإشارات المرجعية المدارة</translation> <translation id="5074318175948309511">قد تحتاج هذه الصفحة إلى إعادة التحميل قبل تنفيذ الإعدادات الجديدة.</translation> @@ -2580,6 +2591,7 @@ <translation id="5117930984404104619">مراقبة سلوك الإضافات الأخرى، بما في ذلك عناوين URL التي تم الانتقال إليها</translation> <translation id="5119173345047096771">موزيلا فايرفوكس</translation> <translation id="5121130586824819730">القرص الصلب ممتلئ. يُرجى الحفظ في مكان آخر أو توفير مساحة أكبر على القرص الصلب.</translation> +<translation id="5123433949759960244">كرة السلة</translation> <translation id="5125751979347152379">عنوان URL غير صالح.</translation> <translation id="5127805178023152808">المزامنة غير مفعّلة</translation> <translation id="5127881134400491887">إدارة اتصالات الشبكة</translation> @@ -3264,6 +3276,7 @@ <translation id="6166185671393271715">استيراد كلمات المرور إلى Chrome</translation> <translation id="6169040057125497443">الرجاء التحقق من الميكروفون.</translation> <translation id="6169666352732958425">تعذر إرسال سطح المكتب.</translation> +<translation id="6170470584681422115">ساندويتش</translation> <translation id="6171948306033499786">إيقاف الطباعة مؤقتًا</translation> <translation id="6173623053897475761">كتابة رقم التعريف الشخصي مرة أخرى</translation> <translation id="6175314957787328458">المعرّف الفريد العمومي لنطاق Microsoft</translation> @@ -3694,6 +3707,7 @@ <translation id="6870888490422746447">اختيار تطبيق للمشاركة في:</translation> <translation id="6871644448911473373">مستجيب OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">رفض الخادم كلمة المرور التي أدخلتَها.</translation> +<translation id="6876155724392614295">دراجة</translation> <translation id="6878422606530379992">استخدام أجهزة الاستشعار مسموح به</translation> <translation id="6880587130513028875">تم منع عرض الصور في هذه الصفحة.</translation> <translation id="6883319974225028188">عفوًا! تعذّر النظام في حفظ تهيئة الجهاز.</translation> @@ -4260,6 +4274,7 @@ <translation id="7772127298218883077">حول <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">التحقق من حالة جهاز Chromebook</translation> <translation id="7773726648746946405">مساحة تخزين الجلسة</translation> +<translation id="7774365994322694683">طائر</translation> <translation id="7776701556330691704">لم يتم العثور على الإعدادات الصوتية في ميزة "تحويل النص إلى كلام"</translation> <translation id="7781335840981796660">ستتم إزالة جميع حسابات المستخدمين والبيانات المحلية.</translation> <translation id="7782102568078991263">ليس هناك المزيد من الاقتراحات من Google</translation> @@ -4665,6 +4680,7 @@ <translation id="8386903983509584791">اكتملت عملية الفحص.</translation> <translation id="8389492867173948260">السماح لهذه الإضافة بقراءة جميع بياناتك وتغييرها على المواقع الإلكترونية التي تزورها:</translation> <translation id="8390449457866780408">الخادم غير متاح.</translation> +<translation id="8391218455464584335">أسطوانة موسيقية</translation> <translation id="8391712576156218334">الصورة غير متاحة. يُرجى إعادة المحاولة لاحقًا.</translation> <translation id="8392234662362215700">انقر على Control-Shift-Space لتبديل تخطيط لوحة المفاتيح.</translation> <translation id="8392451568018454956">قائمة الخيارات لـ <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index ac4fded..1f467d2c 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Търсете в устройството си, приложенията и мрежата.</translation> <translation id="114721135501989771">Chrome с интелекта на Google</translation> <translation id="1149401351239820326">Месец на валидност</translation> +<translation id="1150565364351027703">Слънчеви очила</translation> <translation id="1151917987301063366">Достъпът на <ph name="HOST" /> до сензорите винаги да е разрешен</translation> <translation id="1153356358378277386">Сдвоени устройства</translation> <translation id="1156488781945104845">Текущ час</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">Помощ за клавишните комбинации</translation> <translation id="2045969484888636535">Блокирането на „бисквитките“ да продължи</translation> <translation id="204622017488417136">Устройството ви ще се върне към предишната инсталирана версия на Chrome. Всички профили на потребители и локални данни ще бъдат премахнати. Това действие не може да се отмени.</translation> +<translation id="2046702855113914483">Супа „Рамен“</translation> <translation id="2048182445208425546">Достъп до трафика ви в мрежата</translation> <translation id="2048653237708779538">Действието не може да се извърши</translation> <translation id="2050339315714019657">Вертикално</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187">Добавихте <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP прокси сървър</translation> <translation id="2468205691404969808">Използва „бисквитки“ за запомняне на предпочитанията ви дори ако не посещавате тези страници</translation> +<translation id="2468402215065996499">Тамагочи</translation> <translation id="2469375675106140201">Персонализиране на проверката на правописа</translation> <translation id="247051149076336810">URL адрес на споделено хранилище</translation> <translation id="2470702053775288986">Неподдържаните разширения са деактивирани</translation> @@ -1129,6 +1132,7 @@ <translation id="2770465223704140727">Премахване от списъка</translation> <translation id="2770690685823456775">Експортирайте паролите си в друга папка.</translation> <translation id="2771268254788431918">Мобилните данни са активирани</translation> +<translation id="2771816809568414714">Сирене</translation> <translation id="2772936498786524345">Нинджа</translation> <translation id="2773288106548584039">Поддръжка на наследени браузъри</translation> <translation id="2773802008104670137">Този тип файл може да навреди на компютъра ви.</translation> @@ -1652,6 +1656,7 @@ <translation id="3616113530831147358">Аудио</translation> <translation id="3616741288025931835">&Изчистване на данните за сърфирането...</translation> <translation id="3617891479562106823">Фоновете не са налице. Опитайте отново по-късно.</translation> +<translation id="3619115746895587757">Капучино</translation> <translation id="3623574769078102674">Този контролиран потребител ще се управлява от <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Отключване на устройството и влизане в профила в Google</translation> <translation id="3625258641415618104">Екранните снимки са деактивирани</translation> @@ -2132,6 +2137,7 @@ <translation id="4359717112757026264">Градски пейзажи</translation> <translation id="4361142739114356624">Частният ключ за този клиентски сертификат липсва или е невалиден</translation> <translation id="4363771538994847871">Няма намерени местоназначения за Cast. Нуждаете ли се от помощ?</translation> +<translation id="4364327530094270451">Пъпеш</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> споделя прозорец.</translation> <translation id="4364830672918311045">Показване на известия</translation> <translation id="4365673000813822030">Ами сега! Синхронизирането спря да работи.</translation> @@ -2321,6 +2327,7 @@ <translation id="4690091457710545971"><Фърмуерът на Intel за Wi-Fi генерира четири файла: csr.lst, fh_regs.lst, radio_reg.lst и monitor.lst.sysmon. Първите три са двоични файлове с копия на данни от системния регистър и според Intel не съдържат лични данни или информация, идентифицираща устройството. Последният е файл за трасиране на изпълнението от фърмуера на Intel. Личните данни и идентифициращата устройството информация са премахнати от него, но той е твърде голям, за да бъде показан тук. Тези файлове са генерирани поради скорошните проблеми с Wi-Fi на устройството ви и ще бъдат споделени с Intel с цел по-лесното им отстраняване.></translation> <translation id="469230890969474295">OEM папка</translation> <translation id="4692623383562244444">Търсещи машини</translation> +<translation id="4693155481716051732">Суши</translation> <translation id="4694024090038830733">Конфигурирането на принтери се управлява от администратора.</translation> <translation id="4694604912444486114">Маймуна</translation> <translation id="4697551882387947560">При приключване на сесията на сърфиране</translation> @@ -2375,6 +2382,7 @@ <translation id="4776917500594043016">Парола за <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Google Play Магазин</translation> <translation id="4779083564647765204">Промяна на мащаба</translation> +<translation id="4779136857077979611">Онигири</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Блокиран е изскачащ прозорец}other{Блокирани са # изскач. прозореца}}</translation> <translation id="4780321648949301421">Запазване на страницата като...</translation> <translation id="4785719467058219317">Използвате ключ за сигурност, който не е регистриран в този уебсайт</translation> @@ -2387,6 +2395,7 @@ <translation id="4801448226354548035">Скриване на профилите</translation> <translation id="4801512016965057443">Разрешаване на роуминг за данни</translation> <translation id="4804818685124855865">Изключване</translation> +<translation id="4804827417948292437">Авокадо</translation> <translation id="4807098396393229769">Име върху картата</translation> <translation id="4808667324955055115">Изскачащите прозорци са блокирани:</translation> <translation id="480990236307250886">Отваряне на началната страница</translation> @@ -2481,6 +2490,7 @@ <translation id="4941246025622441835">Използване на заявката за устройството при записването му за корпоративно управление:</translation> <translation id="4941627891654116707">Размер на шрифта</translation> <translation id="494286511941020793">Помощ за конфигурация на прокси сървър</translation> +<translation id="4943368462779413526">Футболна топка</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />“ иска да се свърже със сериен порт</translation> <translation id="495170559598752135">Действия</translation> <translation id="4953689047182316270">Реагиране на събития за достъпност</translation> @@ -2550,6 +2560,7 @@ <translation id="5067399438976153555">Винаги включено</translation> <translation id="5067867186035333991">Да се получава запитване, ако <ph name="HOST" /> иска достъп до микрофона ви</translation> <translation id="5068918910148307423">Забраняване на наскоро затворените сайтове да завършват изпращането и получаването на данни</translation> +<translation id="5068919226082848014">Пица</translation> <translation id="5072052264945641674">Коригиране на размера на курсора</translation> <translation id="5072836811783999860">Показване на управляваните отметки</translation> <translation id="5074318175948309511">Може да се наложи тази страница да бъде презаредена, преди да влязат в сила новите настройки.</translation> @@ -2584,6 +2595,7 @@ <translation id="5117930984404104619">Наблюдение на поведението на други разширения, включително посетените URL адреси</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Твърдият ви диск е пълен. Моля, запазете на друго място или освободете още пространство на диска.</translation> +<translation id="5123433949759960244">Баскетболна топка</translation> <translation id="5125751979347152379">Невалиден URL адрес.</translation> <translation id="5127805178023152808">Синхронизирането е изключено</translation> <translation id="5127881134400491887">Управление на мрежовите връзки</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Импортиране на пароли в Chrome</translation> <translation id="6169040057125497443">Моля, проверете микрофона си.</translation> <translation id="6169666352732958425">Предаването на работния плот не е възможно.</translation> +<translation id="6170470584681422115">Сандвич</translation> <translation id="6171948306033499786">Поставяне на отпечатването на пауза</translation> <translation id="6173623053897475761">Въведете отново ПИН кода си</translation> <translation id="6175314957787328458">GUID на домейн от Microsoft</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Изберете приложение, с което да споделите:</translation> <translation id="6871644448911473373">OCSP респондер: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Въведената от вас парола бе отхвърлена от сървъра.</translation> +<translation id="6876155724392614295">Колело</translation> <translation id="6878422606530379992">Достъпът до сензорите е разрешен</translation> <translation id="6880587130513028875">Изображенията са блокирани на тази страница.</translation> <translation id="6883319974225028188">Ами сега! Системата не успя да запази конфигурацията на устройството.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">Всичко за <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Проверка на състоянието на вашия Chromebook</translation> <translation id="7773726648746946405">Хранилище за сесията</translation> +<translation id="7774365994322694683">Птица</translation> <translation id="7776701556330691704">Няма намерени гласове</translation> <translation id="7781335840981796660">Всички профили на потребители и локални данни ще бъдат премахнати.</translation> <translation id="7782102568078991263">Няма повече предложения от Google</translation> @@ -4669,6 +4684,7 @@ <translation id="8386903983509584791">Сканирането завърши</translation> <translation id="8389492867173948260">Разрешаване на това разширение да чете и променя всичките ви данни в посещаваните от вас уебсайтове:</translation> <translation id="8390449457866780408">Няма достъп до сървъра.</translation> +<translation id="8391218455464584335">Грамофонна плоча</translation> <translation id="8391712576156218334">Изображението не е налице. Опитайте отново по-късно.</translation> <translation id="8392234662362215700">Натиснете „Control-Shift-интервал“ за превключване на клавиатурната подредба.</translation> <translation id="8392451568018454956">Меню с опции за <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 51a6dce..01338188 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">আপনার ডিভাইস, অ্যাপ এবং ওয়েব সার্চ করুন</translation> <translation id="114721135501989771">Chrome-এ Google স্মার্ট পান</translation> <translation id="1149401351239820326">মেয়াদ শেষের মাস</translation> +<translation id="1150565364351027703">সানগ্লাস</translation> <translation id="1151917987301063366"><ph name="HOST" />কে সর্বদা সেন্সর অ্যাক্সেস করতে অনুমতি দিন</translation> <translation id="1153356358378277386">যুক্ত করা ডিভাইসগুলি</translation> <translation id="1156488781945104845">বর্তমান সময়</translation> @@ -660,6 +661,7 @@ <translation id="2045117674524495717">কীবোর্ড শর্টকাট সাহায্যকারী</translation> <translation id="2045969484888636535">কুকিজ অবরুদ্ধ করা চালিয়ে যান</translation> <translation id="204622017488417136">আপনার ডিভাইসটি পূর্বে ইনস্টল করা Chrome-এর ভার্সনে নিয়ে যাওয়া হবে। সকল ব্যবহারকারীর অ্যাকাউন্ট এবং স্থানীয় ডেটা মুছে ফেলা হবে। এটিকে পূর্বাবস্থায় ফেরানো যাবে না।</translation> +<translation id="2046702855113914483">রামেন</translation> <translation id="2048182445208425546">আপনার নেটওয়ার্ক ট্রাফিক অ্যাক্সেস করে</translation> <translation id="2048653237708779538">অ্যাকশন উপলভ্য নেই</translation> <translation id="2050339315714019657">প্রতিকৃতি</translation> @@ -926,6 +928,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> যোগ করা হয়েছে</translation> <translation id="2464089476039395325">HTTP প্রক্সী</translation> <translation id="2468205691404969808">আপনার পছন্দ মনে রাখার জন্য কুকি ব্যবহার করুন, সেই সমস্ত পৃষ্ঠায় যদি না যান, তাহলেও</translation> +<translation id="2468402215065996499">তামাগচি</translation> <translation id="2469375675106140201">বানান পরীক্ষা কাস্টমাইজ করুন</translation> <translation id="247051149076336810">ফাইল শেয়ার করার ইউআরএল</translation> <translation id="2470702053775288986">অসমর্থিত এক্সটেনশানগুলি নিষ্ক্রিয় করা আছে</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">তালিকা থেকে সরান</translation> <translation id="2770690685823456775">আপনার পাসওয়ার্ড অন্য ফোল্ডারে এক্সপোর্ট করুন</translation> <translation id="2771268254788431918">মোবাইল ডেটা সক্রিয় করা হয়েছে</translation> +<translation id="2771816809568414714">চিজ</translation> <translation id="2772936498786524345">নিনজা</translation> <translation id="2773288106548584039">পুরনো ব্রাউজারের জন্য সমর্থন</translation> <translation id="2773802008104670137">এই ধরনের ফাইল আপনার কম্পিউটারের ক্ষতি করতে পারে।</translation> @@ -1652,6 +1656,7 @@ <translation id="3616113530831147358">অডিও</translation> <translation id="3616741288025931835">ব্রাউজ করা ডেটা &সাফ করুন...</translation> <translation id="3617891479562106823">ব্যাকগ্রাউন্ডগুলি উপলভ্য নয়। পরে আবার চেষ্টা করুন।</translation> +<translation id="3619115746895587757">ক্যাপুচিনো</translation> <translation id="3623574769078102674">তত্ত্বাবধানে থাকা এই ব্যবহারকারী <ph name="MANAGER_EMAIL" /> এর দ্বারা পরিচালিত হবে৷</translation> <translation id="3624567683873126087">ডিভাইস আনলক করে Google অ্যাকাউন্টে সাইন-ইন করুন</translation> <translation id="3625258641415618104">স্ক্রীনশট অক্ষম হয়েছে</translation> @@ -2129,6 +2134,7 @@ <translation id="4359717112757026264">শহরের দৃশ্য</translation> <translation id="4361142739114356624">এই ক্লায়েন্ট সার্টিফিকেটের জন্য ব্যক্তিগত কী পাওয়া যাচ্ছে না বা এটি ভুল</translation> <translation id="4363771538994847871">কোনো Cast গন্তব্য পাওয়া যায়নি। সাহায্য দরকার?</translation> +<translation id="4364327530094270451">ফুটি</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> একটি উইন্ডো শেয়ার করছে।</translation> <translation id="4364830672918311045">বিজ্ঞপ্তিগুলি প্রদর্শন করুন</translation> <translation id="4365673000813822030">উপস, সিঙ্ক কাজ করা বন্ধ করে দিয়েছে৷</translation> @@ -2318,6 +2324,7 @@ <translation id="4690091457710545971"><Intel Wi-Fi ফার্মওয়্যার চারটি ফাইল তৈরী করেছে: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. প্রথম তিনটি হচ্ছে রেজিস্টার ডাম্প সম্বলিত বাইনারি ফাইল, যেগুলির মধ্যে কোনও ব্যক্তিগত বা ডিভাইস শনাক্তকারী তথ্য থাকে না বলে Intel দাবি করে। শেষ ফাইলটি Intel ফার্মওয়্যার চালানোর সময় তৈরি ট্রেস; এটির মধ্যে থাকা কোনও ব্যক্তিগত বা ডিভাইস শনাক্তকারী তথ্য মুছে ফেলা হয়েছে, কিন্তু এখানে দেখানোর ক্ষেত্রে এটি খুবই বড়। আপনার ডিভাইসের সাম্প্রতিক Wi-Fi সমস্যাগুলির জন্য এই ফাইলগুলি তৈরি করা হয়েছিল এবং এই সমস্যাগুলির সমাধান করার জন্য Intel-এর সাথে শেয়ার করা হবে।></translation> <translation id="469230890969474295">OEM ফোল্ডার</translation> <translation id="4692623383562244444">সার্চ ইঞ্জিনসমূহ</translation> +<translation id="4693155481716051732">সুশি</translation> <translation id="4694024090038830733">অ্যাডমিনিস্ট্রেটরের দ্বারা প্রিন্টার কনফিগারেশন পরিচালিত হয়।</translation> <translation id="4694604912444486114">বাঁদর</translation> <translation id="4697551882387947560">যখন ব্রাউজিং সেশন সমাপ্ত হয়</translation> @@ -2372,6 +2379,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />-এর জন্য পাসওয়ার্ড</translation> <translation id="4777825441726637019">Play স্টোর</translation> <translation id="4779083564647765204">জুম</translation> +<translation id="4779136857077979611">ওনিগিরি</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{পপ-আপ ব্লক করা হয়েছে}one{#টি পপ-আপ ব্লক করা হয়েছে}other{#টি পপ-আপ ব্লক করা হয়েছে}}</translation> <translation id="4780321648949301421">এইভাবে পৃষ্ঠা সেভ করুন...</translation> <translation id="4785719467058219317">আপনি এমন একটি নিরাপত্তা কী ব্যবহার করছেন যেটি এই ওয়েবসাইটের সাথে রেজিস্টার করা নেই</translation> @@ -2384,6 +2392,7 @@ <translation id="4801448226354548035">অ্যাকাউন্টগুলি লুকান</translation> <translation id="4801512016965057443">মোবাইল ডেটা রোমিংয়ের অনুমতি দিন</translation> <translation id="4804818685124855865">সংযোগ বিচ্ছিন্ন</translation> +<translation id="4804827417948292437">অ্যাভোকাডো</translation> <translation id="4807098396393229769">কার্ডে থাকা নাম</translation> <translation id="4808667324955055115">পপ-আপগুলি ব্লক করা হয়েছে:</translation> <translation id="480990236307250886">হোম পৃষ্ঠাটি খুলুন</translation> @@ -2478,6 +2487,7 @@ <translation id="4941246025622441835">এন্টারপ্রাইজ ব্যবস্থাপনার জন্য নথিভুক্ত করার সময় এই ডিভাইস দাবি ব্যবহার করুন:</translation> <translation id="4941627891654116707">হরফের মাপ</translation> <translation id="494286511941020793">প্রক্সি কনফিগারেশন সহায়তা</translation> +<translation id="4943368462779413526">ফুটবল</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" সিরিয়াল পোর্টে কানেক্ট করতে চাইছে</translation> <translation id="495170559598752135">ক্রিয়াসমূহ</translation> <translation id="4953689047182316270">অ্যাক্সেসযোগ্যতা সংক্রান্ত ইভেন্টে প্রতিক্রিয়া দিতে চায়</translation> @@ -2547,6 +2557,7 @@ <translation id="5067399438976153555">সর্বদা চালু</translation> <translation id="5067867186035333991"><ph name="HOST" /> আপনার মাইক্রোফোন অ্যাক্সেস করতে চায় কিনা জিজ্ঞাসা করুন</translation> <translation id="5068918910148307423">সম্প্রতি বন্ধ করা সাইটগুলিকে ডেটা পাঠানো ও গ্রহণ শেষ করতে মঞ্জুরি দেবেন না</translation> +<translation id="5068919226082848014">পিৎজা</translation> <translation id="5072052264945641674">কার্সারের আকার অ্যাডজ্যাস্ট করুন</translation> <translation id="5072836811783999860">পরিচালিত বুকমার্কগুলি দেখান</translation> <translation id="5074318175948309511">নতুন সেটিংস কার্যকর করার আগে এই পৃষ্ঠাটি পুনরায় লোড করার প্রয়োজন হতে পারে৷</translation> @@ -2581,6 +2592,7 @@ <translation id="5117930984404104619">পরিদর্শিত URL গুলি সহ অন্যান্য এক্সটেনশানগুলির আচরণ নিরীক্ষণ করুন</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">আপনার হার্ড ডিস্ক পূর্ণ৷ দয়া করে অন্য কোনো স্থানে সেভ করুন অথবা হার্ড ডিস্কে আরও জায়গা তৈরী করুন৷</translation> +<translation id="5123433949759960244">বাস্কেটবল</translation> <translation id="5125751979347152379">অকার্যকর URL৷</translation> <translation id="5127805178023152808">সিঙ্ক বন্ধ রয়েছে</translation> <translation id="5127881134400491887">নেটওয়ার্ক সংযোগগুলি পরিচালনা করুন</translation> @@ -3266,6 +3278,7 @@ <translation id="6166185671393271715">Chrome এ পাসওয়ার্ড আমদানি করুন</translation> <translation id="6169040057125497443">অনুগ্রহ করে আপনার মাইক্রোফোন ভালকরে দেখে নিন।</translation> <translation id="6169666352732958425">ডেস্কটপ কাস্ট করতে ব্যর্থ হয়েছে।</translation> +<translation id="6170470584681422115">স্যান্ডউইচ</translation> <translation id="6171948306033499786">মুদ্রণে বিরাম দিন</translation> <translation id="6173623053897475761">আপনার পিনটি আবার লিখুন</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3696,6 +3709,7 @@ <translation id="6870888490422746447">যে অ্যাপ্লিকেশানে শেয়ার করবেন সেটি বেছে নিন:</translation> <translation id="6871644448911473373">OCSP প্রতিক্রিয়াকারী: <ph name="LOCATION" /> </translation> <translation id="6872781471649843364">আপনার দেওয়া পাসওয়ার্ডটি সার্ভার থেকে প্রত্যাখ্যান করা হয়েছে।</translation> +<translation id="6876155724392614295">সাইকেল</translation> <translation id="6878422606530379992">সেন্সর ব্যবহারের অনুমতি দেওয়া হয়েছে</translation> <translation id="6880587130513028875">এই পৃষ্ঠাতে ছবিগুলি ব্লক করা হয়েছে৷</translation> <translation id="6883319974225028188">ওহো! সিস্টেম ডিভাইস কনফিগারেশন সংরক্ষণ করতে ব্যর্থ হয়েছে।</translation> @@ -4262,6 +4276,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> সম্বন্ধে</translation> <translation id="7772773261844472235">আপনার Chromebook স্টেটাস দেখে নিন</translation> <translation id="7773726648746946405">সেশন স্টোরেজ</translation> +<translation id="7774365994322694683">পাখি</translation> <translation id="7776701556330691704">কোনও ভয়েস নেই</translation> <translation id="7781335840981796660">সব ব্যবহারকারী অ্যাকাউন্ট ও স্থানীয় ডেটা সরানো হবে।</translation> <translation id="7782102568078991263">Google থেকে আর কোনো পরামর্শ নেই</translation> @@ -4666,6 +4681,7 @@ <translation id="8386903983509584791">স্ক্যান করা সম্পন্ন হয়েছে</translation> <translation id="8389492867173948260">আপনার দেখা ওয়েবসাইটে আপনার সমস্ত ডেটা পড়ার এবং পরিবর্তন করার জন্য এই এক্সটেনশনটিকে অনুমতি দিন:</translation> <translation id="8390449457866780408">সার্ভার অনুপলব্ধ৷</translation> +<translation id="8391218455464584335">ভিনাইল</translation> <translation id="8391712576156218334">ইমেজ এখন উপলভ্য নয়। পরে আবার চেষ্টা করুন।</translation> <translation id="8392234662362215700">কীবোর্ড লেআউট স্যুইচ করতে Control-Shift-Space</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> এর জন্য বিকল্পগুলির মেনু</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index ded2256..a6a57cf 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Cerca al dispositiu, en aplicacions i al web.</translation> <translation id="114721135501989771">Eines intel·ligents a Chrome</translation> <translation id="1149401351239820326">Mes de caducitat</translation> +<translation id="1150565364351027703">Ulleres de sol</translation> <translation id="1151917987301063366">Permet sempre que <ph name="HOST" /> accedeixi als sensors</translation> <translation id="1153356358378277386">Dispositius vinculats</translation> <translation id="1156488781945104845">Hora actual</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Aplicació d'ajuda de les tecles de drecera</translation> <translation id="2045969484888636535">Continua bloquejant les galetes</translation> <translation id="204622017488417136">Es restablirà la versió de Chrome que hi havia instal·lada anteriorment al dispositiu. S'eliminaran tots els comptes d'usuari i les dades desades al dispositiu. Aquesta acció no es pot desfer.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Accedir al trànsit de xarxa</translation> <translation id="2048653237708779538">Acció no disponible</translation> <translation id="2050339315714019657">Vertical</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187">S'ha afegit <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Servidor intermediari HTTP</translation> <translation id="2468205691404969808">Utilitza galetes per recordar les teves preferències, fins i tot si no visites aquestes pàgines</translation> +<translation id="2468402215065996499">Tamagotxi</translation> <translation id="2469375675106140201">Personalitza el corrector ortogràfic</translation> <translation id="247051149076336810">URL de fitxers compartits</translation> <translation id="2470702053775288986">Extensions no compatibles desactivades</translation> @@ -1130,6 +1133,7 @@ <translation id="2770465223704140727">Suprimeix de la llista</translation> <translation id="2770690685823456775">Exporta les contrasenyes a una altra carpeta</translation> <translation id="2771268254788431918">Dades mòbils activades</translation> +<translation id="2771816809568414714">Formatge</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Compatibilitat amb el navegador heretat</translation> <translation id="2773802008104670137">Aquest tipus de fitxer pot malmetre l'ordinador.</translation> @@ -1650,6 +1654,7 @@ <translation id="3616113530831147358">Àudio</translation> <translation id="3616741288025931835">&Elimina les dades de navegació...</translation> <translation id="3617891479562106823">Els fons de pantalla no estan disponibles. Torna-ho a provar més tard.</translation> +<translation id="3619115746895587757">Caputxino</translation> <translation id="3623574769078102674"><ph name="MANAGER_EMAIL" /> gestionarà aquest usuari supervisat.</translation> <translation id="3624567683873126087">Desbloqueja el dispositiu i inicia la sessió al Compte de Google</translation> <translation id="3625258641415618104">Captures de pantalla desactivades</translation> @@ -2127,6 +2132,7 @@ <translation id="4359717112757026264">Paisatge urbà</translation> <translation id="4361142739114356624">Falta la clau privada d'aquest certificat del client o no és vàlida</translation> <translation id="4363771538994847871">No s'ha trobat cap destinació per a Cast. Necessites ajuda?</translation> +<translation id="4364327530094270451">Meló</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> està compartint una finestra.</translation> <translation id="4364830672918311045">Mostra les notificacions</translation> <translation id="4365673000813822030">La sincronització ha deixat de funcionar.</translation> @@ -2316,6 +2322,7 @@ <translation id="4690091457710545971"><Quatre fitxers generats pel microprogramari per a Wi-Fi d'Intel: csr.lst, fh_regs.lst, radio_reg.lst i monitor.lst.sysmon. Els tres primers són fitxers binaris que contenen abocaments de registres i que Intel ha confirmat que no contenen informació personal ni dades que permetin identificar el dispositiu. L'últim fitxer és una traça d'execució del microprogramari d'Intel. Se n'ha suprimit tota la informació personal i les dades que permeten identificar el dispositiu, però és massa gran per mostrar-lo aquí. Aquests fitxers s'han generat per respondre a problemes recents relacionats amb la connexió Wi-Fi del dispositiu i es compartiran amb Intel per ajudar a resoldre'ls.></translation> <translation id="469230890969474295">Carpeta OEM</translation> <translation id="4692623383562244444">Motors de cerca</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">L'administrador gestiona la configuració de la impressora.</translation> <translation id="4694604912444486114">Mico</translation> <translation id="4697551882387947560">Quan finalitza la sessió de navegació</translation> @@ -2370,6 +2377,7 @@ <translation id="4776917500594043016">Contrasenya per a <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Finestra emergent bloquejada}other{# finestres emergents bloquejades}}</translation> <translation id="4780321648949301421">Anomena i desa la pàgina...</translation> <translation id="4785719467058219317">Estàs utilitzant una clau de seguretat que no està registrada en aquest lloc web</translation> @@ -2382,6 +2390,7 @@ <translation id="4801448226354548035">Amaga els comptes</translation> <translation id="4801512016965057443">Permet la itinerància de dades mòbils</translation> <translation id="4804818685124855865">Desconnecta</translation> +<translation id="4804827417948292437">Alvocat</translation> <translation id="4807098396393229769">Titular de la targeta</translation> <translation id="4808667324955055115">S'han bloquejat les finestres emergents:</translation> <translation id="480990236307250886">Obre la pàgina d'inici</translation> @@ -2476,6 +2485,7 @@ <translation id="4941246025622441835">Feu servir aquesta sol·licitud de dispositiu en inscriure el dispositiu per a la gestió d'empresa:</translation> <translation id="4941627891654116707">Mida de la lletra</translation> <translation id="494286511941020793">Ajuda per configurar servidors intermediaris</translation> +<translation id="4943368462779413526">Pilota de futbol americà</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" vol connectar-se a un port en sèrie</translation> <translation id="495170559598752135">Accions</translation> <translation id="4953689047182316270">Respondre als esdeveniments d'accessibilitat</translation> @@ -2545,6 +2555,7 @@ <translation id="5067399438976153555">Sempre activat</translation> <translation id="5067867186035333991">Pregunta si <ph name="HOST" /> vol accedir al micròfon</translation> <translation id="5068918910148307423">No permetis que els llocs tancats recentment acabin d'enviar i rebre dades</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Ajusta la mida del cursor</translation> <translation id="5072836811783999860">Mostra les adreces d'interès gestionades</translation> <translation id="5074318175948309511">És possible que hàgiu de tornar a carregar aquesta pàgina perquè s'apliqui la configuració nova.</translation> @@ -2579,6 +2590,7 @@ <translation id="5117930984404104619">Control del comportament d'altres extensions, inclosos els URL visitats</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">El vostre disc dur és ple. Deseu-ho en una altra ubicació o allibereu espai del disc dur.</translation> +<translation id="5123433949759960244">Pilota de bàsquet</translation> <translation id="5125751979347152379">URL no vàlid.</translation> <translation id="5127805178023152808">Sincronització desactivada</translation> <translation id="5127881134400491887">Gestionar les connexions de xarxa</translation> @@ -3264,6 +3276,7 @@ <translation id="6166185671393271715">Importeu contrasenyes a Chrome</translation> <translation id="6169040057125497443">Comprova el micròfon.</translation> <translation id="6169666352732958425">L'escriptori no es pot emetre.</translation> +<translation id="6170470584681422115">Entrepà</translation> <translation id="6171948306033499786">Posa en pausa la impressió</translation> <translation id="6173623053897475761">Torna a escriure el PIN</translation> <translation id="6175314957787328458">GUID de domini de Microsoft</translation> @@ -3694,6 +3707,7 @@ <translation id="6870888490422746447">Tria una aplicació per compartir a:</translation> <translation id="6871644448911473373">Resposta OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">El servidor ha rebutjat la contrasenya que has introduït.</translation> +<translation id="6876155724392614295">Bicicleta</translation> <translation id="6878422606530379992">Sensors permesos</translation> <translation id="6880587130513028875">S'han bloquejat imatges en aquesta pàgina.</translation> <translation id="6883319974225028188">El sistema no ha pogut desar la configuració del dispositiu.</translation> @@ -4258,6 +4272,7 @@ <translation id="7772127298218883077">Informació sobre <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Consulta l'estat de Chromebook</translation> <translation id="7773726648746946405">Emmagatzematge de sessions</translation> +<translation id="7774365994322694683">Ocell</translation> <translation id="7776701556330691704">No s'ha trobat cap veu</translation> <translation id="7781335840981796660">Se suprimiran tots els comptes d'usuari i totes les dades locals.</translation> <translation id="7782102568078991263">Cap suggeriment més de Google</translation> @@ -4662,6 +4677,7 @@ <translation id="8386903983509584791">S'ha completat la cerca</translation> <translation id="8389492867173948260">Permet que aquesta extensió llegeixi i modifiqui totes les dades dels llocs web que visitis.</translation> <translation id="8390449457866780408">El servidor no està disponible.</translation> +<translation id="8391218455464584335">Vinil</translation> <translation id="8391712576156218334">La imatge no està disponible. Torna-ho a provar més tard.</translation> <translation id="8392234662362215700">Premeu Ctrl+Maj+espai per canviar la disposició del teclat.</translation> <translation id="8392451568018454956">Menú d'opcions per a <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 69764808..0c6dbde 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Prohledejte zařízení, aplikace a internet.</translation> <translation id="114721135501989771">Získejte do Chromu chytré funkce Google</translation> <translation id="1149401351239820326">Měsíc vypršení platnosti</translation> +<translation id="1150565364351027703">Sluneční brýle</translation> <translation id="1151917987301063366">Vždy povolit webu <ph name="HOST" /> přístup k senzorům</translation> <translation id="1153356358378277386">Spárovaná zařízení</translation> <translation id="1156488781945104845">Aktuální čas</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Nápověda ke klávesovým zkratkám</translation> <translation id="2045969484888636535">Pokračovat v blokování souborů cookie</translation> <translation id="204622017488417136">V zařízení bude obnovena předchozí verze prohlížeče Chrome. Budou odstraněny všechny uživatelské účty a místní data. Tuto operaci nelze vrátit zpět.</translation> +<translation id="2046702855113914483">Polévka ramen</translation> <translation id="2048182445208425546">Přístup k provozu na síti</translation> <translation id="2048653237708779538">Akce není k dispozici</translation> <translation id="2050339315714019657">Na výšku</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187">Byla přidána tiskárna <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Proxy server protokolu HTTP</translation> <translation id="2468205691404969808">Používá soubory cookie k uložení vašeho nastavení i v případě, že stránky nenavštívíte</translation> +<translation id="2468402215065996499">Tamagoči</translation> <translation id="2469375675106140201">Přizpůsobit kontrolu pravopisu</translation> <translation id="247051149076336810">Adresa URL sdíleného úložiště</translation> <translation id="2470702053775288986">Nepodporovaná rozšíření byla zakázána</translation> @@ -1131,6 +1134,7 @@ <translation id="2770465223704140727">Odstranit ze seznamu</translation> <translation id="2770690685823456775">Exportujte hesla do jiné složky</translation> <translation id="2771268254788431918">Mobilní datové připojení aktivováno</translation> +<translation id="2771816809568414714">Sýr</translation> <translation id="2772936498786524345">Nindža</translation> <translation id="2773288106548584039">Podpora starších prohlížečů</translation> <translation id="2773802008104670137">Tento typ souboru může poškodit váš počítač.</translation> @@ -1652,6 +1656,7 @@ <translation id="3616113530831147358">Zvuk</translation> <translation id="3616741288025931835">&Smazat údaje o prohlížení...</translation> <translation id="3617891479562106823">Pozadí nejsou k dispozici. Zkuste to znovu později.</translation> +<translation id="3619115746895587757">Kapučíno</translation> <translation id="3623574769078102674">Tento dozorovaný uživatel bude spravován uživatelem <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Odemknout zařízení a přihlásit se k účtu Google</translation> <translation id="3625258641415618104">Snímky obrazovky zakázány</translation> @@ -2129,6 +2134,7 @@ <translation id="4359717112757026264">Města</translation> <translation id="4361142739114356624">Soukromý klíč tohoto klientského certifikátu chybí nebo je neplatný</translation> <translation id="4363771538994847871">Nebyly nalezeny žádné cíle odesílání. Potřebujete pomoci?</translation> +<translation id="4364327530094270451">Meloun</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> sdílí okno.</translation> <translation id="4364830672918311045">Zobrazování oznámení</translation> <translation id="4365673000813822030">Jejda, synchronizace přestala fungovat.</translation> @@ -2318,6 +2324,7 @@ <translation id="4690091457710545971"><Čtyři soubory vygenerované firmwarem Wi-Fi od společnosti Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. První tři jsou binární soubory s výpisy z registru a společnost Intel o nich prohlašuje, že neobsahují žádné informace umožňující identifikaci osob ani zařízení. Poslední soubor obsahuje trasovací informace z firmwaru Intel. Byly z něj odstraněny všechny informace umožňující identifikaci osob nebo zařízení, ale je příliš velký na to, aby jej zde bylo možné zobrazit. Tyto soubory byly vygenerovány v reakci na nedávné problémy se sítí Wi-Fi ve vašem zařízení a budou poskytnuty společnosti Intel, aby tyto problémy mohla odstranit.></translation> <translation id="469230890969474295">Složka OEM</translation> <translation id="4692623383562244444">Vyhledávače</translation> +<translation id="4693155481716051732">Suši</translation> <translation id="4694024090038830733">Konfiguraci tiskáren spravuje administrátor.</translation> <translation id="4694604912444486114">Opice</translation> <translation id="4697551882387947560">Při ukončení návštěvy prohlížení</translation> @@ -2372,6 +2379,7 @@ <translation id="4776917500594043016">Heslo pro účet <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Obchod Play</translation> <translation id="4779083564647765204">Lupa</translation> +<translation id="4779136857077979611">Rýže onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Zablokováno vyskakovací okno}few{Zablokována # vyskakovací okna}many{Zablokováno # vyskakovacího okna}other{Zablokováno # vyskakovacích oken}}</translation> <translation id="4780321648949301421">Uložit stránku jako...</translation> <translation id="4785719467058219317">Používáte bezpečnostní klíč, který pro tento web není zaregistrován</translation> @@ -2384,6 +2392,7 @@ <translation id="4801448226354548035">Skrýt účty</translation> <translation id="4801512016965057443">Povolit roaming pro mobilní data</translation> <translation id="4804818685124855865">Odpojit</translation> +<translation id="4804827417948292437">Avokádo</translation> <translation id="4807098396393229769">Jméno na kartě</translation> <translation id="4808667324955055115">Byla zablokována vyskakovací okna:</translation> <translation id="480990236307250886">Otevřít domovskou stránku</translation> @@ -2478,6 +2487,7 @@ <translation id="4941246025622441835">Použít tento požadavek zařízení při registraci zařízení do podnikové správy.</translation> <translation id="4941627891654116707">Velikost písma</translation> <translation id="494286511941020793">Nápověda ke konfiguraci proxy serveru</translation> +<translation id="4943368462779413526">Americký fotbal</translation> <translation id="4943691134276646401">Rozšíření <ph name="CHROME_EXTENSION_NAME" /> se chce připojit k sériovému portu</translation> <translation id="495170559598752135">Akce</translation> <translation id="4953689047182316270">Reagovat na události přístupnosti</translation> @@ -2547,6 +2557,7 @@ <translation id="5067399438976153555">Vždy zapnuto</translation> <translation id="5067867186035333991">Zobrazit dotaz, pokud bude chtít web <ph name="HOST" /> používat mikrofon</translation> <translation id="5068918910148307423">Nepovolovat nedávno zavřeným webům dokončit odeslání a příjem dat</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Velikost kurzoru</translation> <translation id="5072836811783999860">Zobrazit spravované záložky</translation> <translation id="5074318175948309511">Aby nové nastavení vstoupilo v platnost, pravděpodobně bude nutné načíst stránku znovu.</translation> @@ -2581,6 +2592,7 @@ <translation id="5117930984404104619">Sledovat chování ostatních rozšíření (včetně navštívených adres URL)</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Pevný disk je plný. Uložte prosím soubor do jiného umístění nebo uvolněte místo na disku.</translation> +<translation id="5123433949759960244">Basketbal</translation> <translation id="5125751979347152379">Neplatná adresa URL.</translation> <translation id="5127805178023152808">Synchronizace je vypnuta</translation> <translation id="5127881134400491887">Správa síťových připojení</translation> @@ -3264,6 +3276,7 @@ <translation id="6166185671393271715">Import hesel do Chromu</translation> <translation id="6169040057125497443">Zkontrolujte mikrofon.</translation> <translation id="6169666352732958425">Plochu nelze odeslat.</translation> +<translation id="6170470584681422115">Sendvič</translation> <translation id="6171948306033499786">Pozastavit tisk</translation> <translation id="6173623053897475761">Znovu zadejte PIN</translation> <translation id="6175314957787328458">Identifikátor GUID domény Microsoft</translation> @@ -3694,6 +3707,7 @@ <translation id="6870888490422746447">Vyberte aplikaci, se kterou obsah chcete sdílet:</translation> <translation id="6871644448911473373">Odpovídač OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Zadané heslo bylo serverem odmítnuto.</translation> +<translation id="6876155724392614295">Kolo</translation> <translation id="6878422606530379992">Použití senzorů je povoleno</translation> <translation id="6880587130513028875">Na této stránce byly zablokovány obrázky.</translation> <translation id="6883319974225028188">Jejda! Systému se nepodařilo uložit konfiguraci zařízení.</translation> @@ -4258,6 +4272,7 @@ <translation id="7772127298218883077">O aplikaci <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Zkontrolujte stav Chromebooku</translation> <translation id="7773726648746946405">Úložiště návštěvy</translation> +<translation id="7774365994322694683">Pták</translation> <translation id="7776701556330691704">Nebyly nalezeny žádné hlasy</translation> <translation id="7781335840981796660">Veškeré uživatelské účty a místní data budou odebrána.</translation> <translation id="7782102568078991263">Žádné další návrhy z Googlu</translation> @@ -4662,6 +4677,7 @@ <translation id="8386903983509584791">Vyhledávání je dokončeno</translation> <translation id="8389492867173948260">Povolit tomuto rozšíření číst a měnit všechna vaše data na navštívených webech:</translation> <translation id="8390449457866780408">Server není dostupný.</translation> +<translation id="8391218455464584335">Vinyl</translation> <translation id="8391712576156218334">Vybraný obrázek není k dispozici. Zkuste to znovu později.</translation> <translation id="8392234662362215700">Rozložení klávesnice přepnete stisknutím kláves Ctrl + Shift + mezerník.</translation> <translation id="8392451568018454956">Nabídka možností pro uživatele <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 3c37e3b..2e082f3 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Søg på din enhed, i apps og på nettet.</translation> <translation id="114721135501989771">Få Googles smarte funktioner i Chrome</translation> <translation id="1149401351239820326">Udløbsmåned</translation> +<translation id="1150565364351027703">Solbriller</translation> <translation id="1151917987301063366">Tillad altid, at <ph name="HOST" /> kan få adgang til sensorer</translation> <translation id="1153356358378277386">Parrede enheder</translation> <translation id="1156488781945104845">Aktuel tid</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">Hjælp til tastaturgenveje</translation> <translation id="2045969484888636535">Fortsæt med at blokere cookies</translation> <translation id="204622017488417136">Enheden nulstilles til sin forrige installerede version af Chrome. Alle brugerkonti og lokale data fjernes. Du kan ikke fortryde denne handling.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Få adgang til din netværkstrafik</translation> <translation id="2048653237708779538">Handlingen er ikke tilgængelig</translation> <translation id="2050339315714019657">Stående</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> blev tilføjet</translation> <translation id="2464089476039395325">HTTP-proxy</translation> <translation id="2468205691404969808">Bruger cookies til at huske dine indstillinger, også selvom du ikke besøger siderne</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Tilpas stavekontrol</translation> <translation id="247051149076336810">Webadresse til fildeling</translation> <translation id="2470702053775288986">Understøttede udvidelser er blevet deaktiveret</translation> @@ -1130,6 +1133,7 @@ <translation id="2770465223704140727">Fjern fra listen</translation> <translation id="2770690685823456775">Eksportér dine adgangskoder til en anden mappe</translation> <translation id="2771268254788431918">Mobildata er aktiveret</translation> +<translation id="2771816809568414714">Ost</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Understøttelse af ældre browsere</translation> <translation id="2773802008104670137">Denne type fil kan skade din computer.</translation> @@ -1653,6 +1657,7 @@ <translation id="3616113530831147358">Lyd</translation> <translation id="3616741288025931835">&Slet browserdata...</translation> <translation id="3617891479562106823">Baggrunde er utilgængelige. Prøv igen senere.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Denne administrerede bruger administreres af <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Lås enheden op, og log ind på Google-kontoen</translation> <translation id="3625258641415618104">Screenshots er deaktiveret</translation> @@ -2131,6 +2136,7 @@ <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">Den private nøgle til dette klientcertifikat mangler eller er ugyldig</translation> <translation id="4363771538994847871">Der blev ikke fundet nogen Cast-destinationer. Har du brug for hjælp?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindue.</translation> <translation id="4364830672918311045">Vis notifikationer</translation> <translation id="4365673000813822030">Ups, synkroniseringen fungerer ikke.</translation> @@ -2320,6 +2326,7 @@ <translation id="4690091457710545971"><Fire filer er genereret af Intel Wi-Fi-firmware: Csr.lst, fh_regs.lst, radio_reg.lst og monitor.lst.sysmon. De første tre er binære filer, der indeholder register dumps, og som ifølge Intel ikke indeholder nogen personlige eller enhedsidentificerende oplysninger. Den sidste fil er et udførelsesspor fra Intel-firmwaren. De personlige eller enhedsidentificerende oplysninger er blevet ryddet fra denne fil, men fylder for meget til at blive vist her. Disse filer blev genereret som følge af nyligt registrerede problemer med Wi-Fi-forbindelsen på din enhed og deles med Intel for at hjælpe med at løse de pågældende problemer.></translation> <translation id="469230890969474295">OEM-mappe</translation> <translation id="4692623383562244444">Søgemaskiner</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Printerkonfigurationen håndteres af administratoren.</translation> <translation id="4694604912444486114">Abe</translation> <translation id="4697551882387947560">Når browsersessionen afsluttes</translation> @@ -2374,6 +2381,7 @@ <translation id="4776917500594043016">Adgangskode for <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Butik</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pop op-vinduet er blokeret}one{# pop op-vindue er blokeret}other{# pop op-vinduer er blokeret}}</translation> <translation id="4780321648949301421">Gem side som...</translation> <translation id="4785719467058219317">Du bruger en sikkerhedsnøgle, som ikke er registreret på dette website</translation> @@ -2386,6 +2394,7 @@ <translation id="4801448226354548035">Skjul konti</translation> <translation id="4801512016965057443">Tillad dataroaming for mobil</translation> <translation id="4804818685124855865">Afbryd</translation> +<translation id="4804827417948292437">Avocado</translation> <translation id="4807098396393229769">Navn på kort</translation> <translation id="4808667324955055115">Pop op-vinduer er blokeret:</translation> <translation id="480990236307250886">Åbn startsiden</translation> @@ -2480,6 +2489,7 @@ <translation id="4941246025622441835">Anvend denne enhedsrekvisition, når du tilmelder enheden til virksomhedsadministration.</translation> <translation id="4941627891654116707">Skriftstørrelse</translation> <translation id="494286511941020793">Hjælp til proxykonfiguration</translation> +<translation id="4943368462779413526">Amerikansk fodbold</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" anmoder om at oprette forbindelse til en seriel port</translation> <translation id="495170559598752135">Handlinger</translation> <translation id="4953689047182316270">Reagere på hændelser med hjælpefunktioner</translation> @@ -2549,6 +2559,7 @@ <translation id="5067399438976153555">Altid aktiveret</translation> <translation id="5067867186035333991">Spørg, om <ph name="HOST" /> vil have adgang til din mikrofon</translation> <translation id="5068918910148307423">Tillad ikke, at nyligt lukkede websites sender og modtager data</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Juster markørens størrelse</translation> <translation id="5072836811783999860">Vis administrerede bogmærker</translation> <translation id="5074318175948309511">Det kan være nødvendigt at genindlæse siden, så de nye indstillinger kan træde i kraft.</translation> @@ -2583,6 +2594,7 @@ <translation id="5117930984404104619">Overvåge adfærden for andre udvidelser, herunder de webadresser, du har besøgt.</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Din harddisk er fuld. Gem på en anden placering, eller frigør mere plads på harddisken.</translation> +<translation id="5123433949759960244">Basketball</translation> <translation id="5125751979347152379">Ugyldig webadresse.</translation> <translation id="5127805178023152808">Synkronisering er slået fra</translation> <translation id="5127881134400491887">Administrere netværksforbindelser</translation> @@ -3267,6 +3279,7 @@ <translation id="6166185671393271715">Importér adgangskoder til Chrome</translation> <translation id="6169040057125497443">Tjek din mikrofon.</translation> <translation id="6169666352732958425">Skrivebordet kunne ikke castes.</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">Sæt udskrivning på pause</translation> <translation id="6173623053897475761">Angiv din pinkode igen</translation> <translation id="6175314957787328458">Microsoft-domæne-GUID</translation> @@ -3697,6 +3710,7 @@ <translation id="6870888490422746447">Vælg en app, du vil dele med:</translation> <translation id="6871644448911473373">OCSP-responder: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Den angivne adgangskode blev afvist af serveren.</translation> +<translation id="6876155724392614295">Cykel</translation> <translation id="6878422606530379992">Der er givet adgang til sensorer</translation> <translation id="6880587130513028875">Billeder blev blokeret på denne side.</translation> <translation id="6883319974225028188">Ups! Systemet kunne ikke gemme enhedskonfigurationen.</translation> @@ -4263,6 +4277,7 @@ <translation id="7772127298218883077">Om <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Tjek din Chromebook-status</translation> <translation id="7773726648746946405">Sessionlagring</translation> +<translation id="7774365994322694683">Fugl</translation> <translation id="7776701556330691704">Der blev ikke fundet nogen stemmer</translation> <translation id="7781335840981796660">Alle brugerkonti og lokale data fjernes.</translation> <translation id="7782102568078991263">Ikke flere forslag fra Google</translation> @@ -4667,6 +4682,7 @@ <translation id="8386903983509584791">Scanningen er udført</translation> <translation id="8389492867173948260">Tillad, at denne udvidelse læser og ændrer alle dine data på websites, du besøger:</translation> <translation id="8390449457866780408">Serveren er utilgængelig.</translation> +<translation id="8391218455464584335">Vinylplade</translation> <translation id="8391712576156218334">Billedet er ikke tilgængeligt. Prøv igen senere.</translation> <translation id="8392234662362215700">Tryk på Ctrl+Shift+mellemrumstasten for at skifte tastaturlayout.</translation> <translation id="8392451568018454956">Menuen Indstillinger for <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 221c9b6..e3c442c 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Durchsuchen Sie Ihr Gerät, Ihre Apps und das Web.</translation> <translation id="114721135501989771">Chrome cleverer nutzen – dank Google</translation> <translation id="1149401351239820326">Ablaufmonat</translation> +<translation id="1150565364351027703">Sonnenbrille</translation> <translation id="1151917987301063366"><ph name="HOST" /> immer den Zugriff auf Sensoren erlauben</translation> <translation id="1153356358378277386">Gekoppelte Geräte</translation> <translation id="1156488781945104845">Aktuelle Uhrzeit</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">Assistent für Tastenkombinationen</translation> <translation id="2045969484888636535">Cookies weiterhin blockieren</translation> <translation id="204622017488417136">Ihr Gerät wird auf die zuvor installierte Chrome-Version zurückgesetzt und alle Nutzerkonten und lokalen Daten werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Auf Ihren Netzwerkverkehr zugreifen</translation> <translation id="2048653237708779538">Aktion nicht verfügbar</translation> <translation id="2050339315714019657">Hochformat</translation> @@ -924,6 +926,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> hinzugefügt</translation> <translation id="2464089476039395325">HTTP-Proxy</translation> <translation id="2468205691404969808">Zum Speichern Ihrer Einstellungen werden Cookies verwendet, auch wenn Sie diese Seiten nicht besuchen</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Rechtschreibprüfung anpassen</translation> <translation id="247051149076336810">Netzwerkfreigabe-URL</translation> <translation id="2470702053775288986">Nicht unterstützte Erweiterungen deaktiviert</translation> @@ -1127,6 +1130,7 @@ <translation id="2770465223704140727">Aus Liste entfernen</translation> <translation id="2770690685823456775">Exportieren Sie Ihre Passwörter in einen anderen Ordner</translation> <translation id="2771268254788431918">Mobile Daten aktiviert</translation> +<translation id="2771816809568414714">Käse</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Unterstützung für ältere Browser</translation> <translation id="2773802008104670137">Diese Art von Datei kann Schaden auf Ihrem Computer anrichten.</translation> @@ -1650,6 +1654,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Browserdaten löschen...</translation> <translation id="3617891479562106823">Hintergründe sind nicht verfügbar. Bitte versuchen Sie es später noch einmal.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Dieser betreute Nutzer wird von <ph name="MANAGER_EMAIL" /> verwaltet.</translation> <translation id="3624567683873126087">Gerät entsperren und im Google-Konto anmelden</translation> <translation id="3625258641415618104">Screenshot-Funktion deaktiviert</translation> @@ -2128,6 +2133,7 @@ <translation id="4359717112757026264">Stadtlandschaft</translation> <translation id="4361142739114356624">Der private Schlüssel für dieses Clientzertifikat fehlt oder ist ungültig</translation> <translation id="4363771538994847871">Kein Cast-Empfänger gefunden. Benötigen Sie Hilfe?</translation> +<translation id="4364327530094270451">Melone</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> hat ein Fenster freigegeben.</translation> <translation id="4364830672918311045">Benachrichtigungen einblenden</translation> <translation id="4365673000813822030">Hoppla, die Synchronisierung funktioniert nicht mehr.</translation> @@ -2317,6 +2323,7 @@ <translation id="4690091457710545971"><Vier Dateien wurden von der Intel-WLAN-Firmware erstellt: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Bei den ersten drei handelt es sich um Binärdateien mit Registrierungsabbildern, für die Intel angibt, dass sie keine personenbezogenen oder zur Geräteidentifikation nutzbaren Informationen enthält. Die letzte Datei ist eine Ablaufverfolgungsdatei von der Intel-Firmware, aus der alle personenbezogenen oder zur Geräteidentifikation nutzbaren Informationen entfernt wurden. Sie ist allerdings zu groß, um hier angezeigt zu werden. Diese Dateien wurden wegen WLAN-Problemen auf Ihrem Gerät erstellt, die kürzlich aufgetreten sind. Sie werden zur Fehlerbehebung an Intel weitergegeben.></translation> <translation id="469230890969474295">OEM-Ordner</translation> <translation id="4692623383562244444">Suchmaschinen</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Um die Druckerkonfiguration kümmert sich der Administrator.</translation> <translation id="4694604912444486114">Affe</translation> <translation id="4697551882387947560">Beim Beenden der Browsersitzung</translation> @@ -2371,6 +2378,7 @@ <translation id="4776917500594043016">Passwort für <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Google Play Store</translation> <translation id="4779083564647765204">Zoomen</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pop-up blockiert}other{# Pop-ups blockiert}}</translation> <translation id="4780321648949301421">Seite speichern unter...</translation> <translation id="4785719467058219317">Sie verwenden einen Sicherheitsschlüssel, der nicht auf dieser Website registriert ist</translation> @@ -2383,6 +2391,7 @@ <translation id="4801448226354548035">Konten ausblenden</translation> <translation id="4801512016965057443">Mobilfunk-Roaming zulassen</translation> <translation id="4804818685124855865">Verbindung trennen</translation> +<translation id="4804827417948292437">Avocado</translation> <translation id="4807098396393229769">Name auf Karte</translation> <translation id="4808667324955055115">Pop-ups blockiert:</translation> <translation id="480990236307250886">Startseite öffnen</translation> @@ -2477,6 +2486,7 @@ <translation id="4941246025622441835">Diese Geräteanforderung beim Registrieren des Geräts für die Unternehmensverwaltung verwenden:</translation> <translation id="4941627891654116707">Schriftgröße</translation> <translation id="494286511941020793">Proxy-Konfigurationshilfe</translation> +<translation id="4943368462779413526">Fußball</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" möchte eine Verbindung mit einem seriellen Port herstellen</translation> <translation id="495170559598752135">Aktionen</translation> <translation id="4953689047182316270">Auf Bedienungshilfen reagieren</translation> @@ -2546,6 +2556,7 @@ <translation id="5067399438976153555">Immer aktiviert</translation> <translation id="5067867186035333991">Nachfragen, wenn <ph name="HOST" /> auf Ihr Mikrofon zugreifen möchte</translation> <translation id="5068918910148307423">Fertigstellen des Datenversands und -empfangs von kürzlich geschlossen Websites nicht erlauben</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Cursorgröße anpassen</translation> <translation id="5072836811783999860">Verwaltete Lesezeichen anzeigen</translation> <translation id="5074318175948309511">Damit die neuen Einstellungen wirksam werden, muss die Seite eventuell neu geladen werden.</translation> @@ -2580,6 +2591,7 @@ <translation id="5117930984404104619">Verhalten anderer Erweiterungen überwachen, einschließlich besuchter URLs</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Ihre Festplatte ist voll. Wählen Sie bitte einen anderen Speicherort aus oder geben Sie Speicherplatz auf der Festplatte frei.</translation> +<translation id="5123433949759960244">Basketball</translation> <translation id="5125751979347152379">Ungültige URL</translation> <translation id="5127805178023152808">Synchronisierung ist deaktiviert</translation> <translation id="5127881134400491887">Netzwerkverbindungen verwalten</translation> @@ -3263,6 +3275,7 @@ <translation id="6166185671393271715">Passwörter in Chrome importieren</translation> <translation id="6169040057125497443">Überprüfen Sie Ihr Mikrofon.</translation> <translation id="6169666352732958425">Der Desktop kann nicht übertragen werden</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">Druckvorgang pausieren</translation> <translation id="6173623053897475761">PIN noch einmal eingeben</translation> <translation id="6175314957787328458">Microsoft-Domain-GUID</translation> @@ -3412,7 +3425,7 @@ <translation id="641081527798843608">subject-match</translation> <translation id="6412931879992742813">Neues Inkognitofenster</translation> <translation id="6415900369006735853">Internetverbindung über Ihr Smartphone herstellen</translation> -<translation id="6416743254476733475">Auf dem Computer zulassen oder blockieren.</translation> +<translation id="6416743254476733475">Wechseln Sie auf den Computer, um sie zuzulassen oder zu blockieren.</translation> <translation id="6417265370957905582">Google Assistant</translation> <translation id="6418160186546245112">Zuvor installierte Version von <ph name="IDS_SHORT_PRODUCT_NAME" /> wird wiederhergestellt...</translation> <translation id="6418481728190846787">Zugriff für alle Apps dauerhaft entfernen</translation> @@ -3693,6 +3706,7 @@ <translation id="6870888490422746447">App wählen, um sie zu teilen über:</translation> <translation id="6871644448911473373">OCSP-Antwortdienst: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Das eingegebene Passwort wurde vom Server zurückgewiesen.</translation> +<translation id="6876155724392614295">Fahrrad</translation> <translation id="6878422606530379992">Sensorennutzung erlaubt</translation> <translation id="6880587130513028875">Bilder wurden auf dieser Seite blockiert.</translation> <translation id="6883319974225028188">Hoppla! Das System konnte die Gerätekonfiguration nicht speichern.</translation> @@ -4259,6 +4273,7 @@ <translation id="7772127298218883077">Über <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Ihren Chromebook-Status prüfen</translation> <translation id="7773726648746946405">Sitzungsspeicher</translation> +<translation id="7774365994322694683">Vogel</translation> <translation id="7776701556330691704">Keine Stimmen gefunden</translation> <translation id="7781335840981796660">Alle Benutzerkonten und lokalen Daten werden entfernt.</translation> <translation id="7782102568078991263">Keine weiteren Vorschläge von Google</translation> @@ -4664,6 +4679,7 @@ <translation id="8386903983509584791">Suche abgeschlossen</translation> <translation id="8389492867173948260">Dieser Erweiterung erlauben, alle meine Daten auf von mir besuchten Websites zu lesen und zu ändern:</translation> <translation id="8390449457866780408">Der Server ist nicht verfügbar.</translation> +<translation id="8391218455464584335">Schallplatte</translation> <translation id="8391712576156218334">Bild ist nicht verfügbar. Versuchen Sie es später noch einmal.</translation> <translation id="8392234662362215700">Drücken Sie Strg + Umschalttaste + Leertaste, um das Tastaturlayout zu ändern.</translation> <translation id="8392451568018454956">Optionsmenü für <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -4994,7 +5010,7 @@ <translation id="8893801527741465188">Deinstallation abgeschlossen</translation> <translation id="8893928184421379330">Das Gerät <ph name="DEVICE_LABEL" /> wurde nicht erkannt.</translation> <translation id="8895454554629927345">Lesezeichenliste</translation> -<translation id="8896022254727357590">Die PIN aus mindestens 4 Zeichen bestehen</translation> +<translation id="8896022254727357590">Die PIN muss aus mindestens 4 Zeichen bestehen</translation> <translation id="8898786835233784856">Nächsten Tab auswählen</translation> <translation id="8898840733695078011">Signalstärke</translation> <translation id="8899851313684471736">Link in neuem &Fenster öffnen</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index f2972cde..561d58c 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Κάντε αναζήτηση στη συσκευή, στις εφαρμογές και στον ιστό.</translation> <translation id="114721135501989771">Έξυπνες λειτουργίες Google στο Chrome</translation> <translation id="1149401351239820326">Μήνας λήξης</translation> +<translation id="1150565364351027703">Γυαλιά ηλίου</translation> <translation id="1151917987301063366">Να επιτρέπεται πάντα στο <ph name="HOST" /> να έχει πρόσβαση στους αισθητήρες</translation> <translation id="1153356358378277386">Συσκευές σε σύζευξη</translation> <translation id="1156488781945104845">Τρέχουσα ώρα</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Πρόγραμμα βοήθειας συντομεύσεων πληκτρολογίου</translation> <translation id="2045969484888636535">Συνέχεια αποκλεισμού cookie</translation> <translation id="204622017488417136">Η συσκευή σας θα πρέπει να επανέλθει στην προηγούμενη εγκατεστημένη έκδοση του Chrome. Θα καταργηθούν όλοι οι λογαριασμοί χρηστών και τα τοπικά δεδομένα. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.</translation> +<translation id="2046702855113914483">Ράμεν</translation> <translation id="2048182445208425546">Πρόσβαση στην επισκεψιμότητά σας δικτύου</translation> <translation id="2048653237708779538">Η ενέργεια δεν είναι διαθέσιμη</translation> <translation id="2050339315714019657">Κάθετα</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Προστέθηκε <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Διακομιστής μεσολάβησης HTTP</translation> <translation id="2468205691404969808">Χρησιμοποιεί cookie για την απομνημόνευση των προτιμήσεών σας, ακόμα κι αν δεν επισκέπτεστε αυτές τις σελίδες</translation> +<translation id="2468402215065996499">Ταμαγκότσι</translation> <translation id="2469375675106140201">Προσαρμογή ορθογραφικού ελέγχου</translation> <translation id="247051149076336810">URL κοινής χρήσης αρχείου</translation> <translation id="2470702053775288986">Απενεργοποίηση μη υποστηριζόμενων επεκτάσεων</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Κατάργηση από τη λίστα</translation> <translation id="2770690685823456775">Εξαγάγετε τους κωδικούς πρόσβασης σε άλλο φάκελο</translation> <translation id="2771268254788431918">Τα δεδομένα κινητής τηλεφωνίας ενεργοποιήθηκαν</translation> +<translation id="2771816809568414714">Τυρί</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Υποστήριξη προγράμματος περιήγησης παλαιού τύπου</translation> <translation id="2773802008104670137">Ενδέχεται αυτός ο τύπος αρχείου να βλάψει τον υπολογιστή σας.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Ήχος</translation> <translation id="3616741288025931835">&Διαγραφή δεδομένων περιήγησης...</translation> <translation id="3617891479562106823">Τα φόντα δεν είναι διαθέσιμα. Δοκιμάστε ξανά αργότερα.</translation> +<translation id="3619115746895587757">Καπουτσίνο</translation> <translation id="3623574769078102674">Η διαχείριση αυτού του εποπτευόμενου χρήστη θα γίνεται από το χρήστη <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Ξεκλείδωμα συσκευής και σύνδεση σε Λογαριασμό Google</translation> <translation id="3625258641415618104">Τα στιγμιότυπα οθόνης απενεργοποιήθηκαν</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Αστικό τοπίο</translation> <translation id="4361142739114356624">Το Ιδιωτικό κλειδί για αυτό το Πιστοποιητικό πελάτη λείπει ή δεν είναι έγκυρο</translation> <translation id="4363771538994847871">Δεν βρέθηκαν προορισμοί μετάδοσης. Χρειάζεστε βοήθεια;</translation> +<translation id="4364327530094270451">Πεπόνι</translation> <translation id="4364567974334641491">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται ένα παράθυρο.</translation> <translation id="4364830672918311045">Εμφάνιση ειδοποιήσεων</translation> <translation id="4365673000813822030">Ωχ, ο συγχρονισμός σταμάτησε να λειτουργεί.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Δημιουργήθηκαν τέσσερα αρχεία από το υλικολογισμικό Intel Wi-Fi: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Τα τρία πρώτα είναι δυαδικά αρχεία τα οποία περιέχουν αρχεία ένδειξης σφαλμάτων εγγραφής και η Intel διαβεβαιώνει ότι δεν περιέχουν στοιχεία προσωπικής ταυτοποίησης ή ταυτοποίησης συσκευής. Το τελευταίο αρχείο αποτελεί ίχνος εκτέλεσης από το υλικολογισμικό της Intel. Έχει εκκαθαριστεί από τυχόν στοιχεία προσωπικής ταυτοποίησης ή ταυτοποίησης συσκευής, αλλά είναι πάρα πολύ μεγάλο για να προβληθεί εδώ. Αυτά τα αρχεία δημιουργήθηκαν ως απόκριση στα προβλήματα σχετικά με τη σύνδεση Wi-Fi που αντιμετώπισε η συσκευή σας και θα κοινοποιηθεί στην Intel προκειμένου να λάβετε βοήθεια για την αντιμετώπιση αυτών των προβλημάτων.></translation> <translation id="469230890969474295">Φάκελος OEM</translation> <translation id="4692623383562244444">Μηχανές αναζήτησης</translation> +<translation id="4693155481716051732">Σούσι</translation> <translation id="4694024090038830733">Η διαμόρφωση του εκτυπωτή γίνεται από τον διαχειριστή.</translation> <translation id="4694604912444486114">Πίθηκος</translation> <translation id="4697551882387947560">Όταν η περίοδος περιήγησης λήξει</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Κωδικός πρόσβασης για <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Μεγέθυνση</translation> +<translation id="4779136857077979611">Ονιγκίρι</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Το αναδυόμενο παράθυρο αποκλ.}other{# αναδυόμενα παράθυρα αποκλείστηκαν}}</translation> <translation id="4780321648949301421">Αποθήκευση σελίδας &ως...</translation> <translation id="4785719467058219317">Χρησιμοποιείτε ένα κλειδί ασφαλείας το οποίο δεν είναι εγγεγραμμένο σε αυτόν τον ιστότοπο</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Απόκρυψη λογαριασμών</translation> <translation id="4801512016965057443">Να επιτρέπεται η περιαγωγή δεδομένων κινητών συσκευών</translation> <translation id="4804818685124855865">Αποσύνδεση</translation> +<translation id="4804827417948292437">Αβοκάντο</translation> <translation id="4807098396393229769">Όνομα στην κάρτα</translation> <translation id="4808667324955055115">Αναδυόμενα παράθυρα που αποκλείστηκαν:</translation> <translation id="480990236307250886">Άνοιγμα της αρχικής σελίδας</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Χρησιμοποιήστε αυτήν την επίταξη συσκευής κατά την εγγραφή της συσκευής στο πρόγραμμα εταιρικής διαχείρισης:</translation> <translation id="4941627891654116707">Μέγεθος γραμματοσειράς</translation> <translation id="494286511941020793">Βοήθεια για τη διαμόρφωση διακομιστή μεσολάβησης</translation> +<translation id="4943368462779413526">Αμερικάνικο ποδόσφαιρο</translation> <translation id="4943691134276646401">Το "<ph name="CHROME_EXTENSION_NAME" />" θέλει να συνδεθεί σε μια σειριακή θύρα</translation> <translation id="495170559598752135">Ενέργειες</translation> <translation id="4953689047182316270">Απάντηση σε συμβάντα προσβασιμότητας</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Πάντα ενεργό</translation> <translation id="5067867186035333991">Ερώτηση αν το <ph name="HOST" /> επιθυμεί να αποκτήσει πρόσβαση στο μικρόφωνό σας</translation> <translation id="5068918910148307423">Να μην επιτρέπεται στους ιστότοπους που έκλεισαν πρόσφατα να ολοκληρώνουν την αποστολή και τη λήψη δεδομένων</translation> +<translation id="5068919226082848014">Πίτσα</translation> <translation id="5072052264945641674">Προσαρμογή μεγέθους δείκτη ποντικιού</translation> <translation id="5072836811783999860">Εμφάνιση διαχειριζόμενων σελιδοδεικτών</translation> <translation id="5074318175948309511">Αυτή η σελίδα ενδεχομένως να πρέπει να φορτωθεί εκ νέου προτού ενεργοποιηθούν οι νέες ρυθμίσεις.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Παρακολούθηση της συμπεριφοράς άλλων επεκτάσεων, συμπεριλαμβανομένων των διευθύνσεων URL που έχουν δεχτεί επίσκεψη</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Ο σκληρός σας δίσκος είναι πλήρης. Αποθηκεύστε σε άλλη τοποθεσία ή αδειάστε τον σκληρό δίσκο.</translation> +<translation id="5123433949759960244">Μπάλα μπάσκετ</translation> <translation id="5125751979347152379">Μη έγκυρη διεύθυνση URL.</translation> <translation id="5127805178023152808">Ο συγχρονισμός είναι απενεργοποιημένος</translation> <translation id="5127881134400491887">Διαχείριση συνδέσεων δικτύου</translation> @@ -3269,6 +3281,7 @@ <translation id="6166185671393271715">Εισαγωγή κωδικών πρόσβασης στο Chrome</translation> <translation id="6169040057125497443">Ελέγξτε το μικρόφωνό σας.</translation> <translation id="6169666352732958425">Αδυναμία μετάδοσης επιφάνειας εργασίας.</translation> +<translation id="6170470584681422115">Σάντουιτς</translation> <translation id="6171948306033499786">Παύση εκτύπωσης</translation> <translation id="6173623053897475761">Πληκτρολογήστε το PIN ξανά</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3699,6 +3712,7 @@ <translation id="6870888490422746447">Επιλέξτε μια εφαρμογή για κοινοποίηση:</translation> <translation id="6871644448911473373">Απόκριση OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Ο κωδικός πρόσβασης που εισαγάγατε απορρίφθηκε από τον διακομιστή.</translation> +<translation id="6876155724392614295">Ποδήλατο</translation> <translation id="6878422606530379992">Επιτρέπονται οι αισθητήρες</translation> <translation id="6880587130513028875">Έγινε αποκλεισμός των εικόνων σε αυτήν τη σελίδα.</translation> <translation id="6883319974225028188">Δυστυχώς, το σύστημα δεν κατάφερε να αποθηκεύσει τη διαμόρφωση της συσκευής.</translation> @@ -4265,6 +4279,7 @@ <translation id="7772127298218883077">Σχετικά με το <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Έλεγχος κατάστασης του Chromebook</translation> <translation id="7773726648746946405">Αποθηκευτικός χώρος περιόδου σύνδεσης</translation> +<translation id="7774365994322694683">Πουλί</translation> <translation id="7776701556330691704">Δεν βρέθηκαν φωνές</translation> <translation id="7781335840981796660">Θα καταργηθούν όλοι οι λογαριασμοί χρηστών και τα τοπικά δεδομένα.</translation> <translation id="7782102568078991263">Δεν υπάρχουν άλλες προτάσεις από την Google</translation> @@ -4670,6 +4685,7 @@ <translation id="8386903983509584791">Η σάρωση ολοκληρώθηκε</translation> <translation id="8389492867173948260">Να επιτρέπεται σε αυτήν την επέκταση να διαβάζει και να αλλάζει όλα τα δεδομένα σας στους ιστοτόπους που επισκέπτεστε:</translation> <translation id="8390449457866780408">Ο διακομιστής δεν είναι διαθέσιμος.</translation> +<translation id="8391218455464584335">Βινύλιο</translation> <translation id="8391712576156218334">Η εικόνα δεν είναι διαθέσιμη. Δοκιμάστε ξανά αργότερα.</translation> <translation id="8392234662362215700">Πατήστε Control-Shift-Space για εναλλαγή διάταξης πληκτρολογίου.</translation> <translation id="8392451568018454956">Μενού επιλογών για τη διεύθυνση <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index b1c4013..459eb21 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Search your device, apps and web.</translation> <translation id="114721135501989771">Get Google smarts in Chrome</translation> <translation id="1149401351239820326">Expiry month</translation> +<translation id="1150565364351027703">Sunglasses</translation> <translation id="1151917987301063366">Always allow <ph name="HOST" /> to access sensors</translation> <translation id="1153356358378277386">Paired devices</translation> <translation id="1156488781945104845">Current time</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Keyboard Shortcut Helper</translation> <translation id="2045969484888636535">Continue blocking cookies</translation> <translation id="204622017488417136">Your device will be returned to the previously installed version of Chrome. All user accounts and local data will be removed. This cannot be undone.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Access your network traffic</translation> <translation id="2048653237708779538">Action not available</translation> <translation id="2050339315714019657">Portrait</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Added <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP Proxy</translation> <translation id="2468205691404969808">Uses cookies to remember your preferences, even if you don’t visit those pages</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Customise spell check</translation> <translation id="247051149076336810">File share URL</translation> <translation id="2470702053775288986">Unsupported extensions disabled</translation> @@ -1131,6 +1134,7 @@ <translation id="2770465223704140727">Remove from list</translation> <translation id="2770690685823456775">Export your passwords to another folder</translation> <translation id="2771268254788431918">Mobile data activated</translation> +<translation id="2771816809568414714">Cheese</translation> <translation id="2772936498786524345">Sneaky</translation> <translation id="2773288106548584039">Legacy Browser Support</translation> <translation id="2773802008104670137">This type of file may harm your computer.</translation> @@ -1654,6 +1658,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Clear Browsing Data...</translation> <translation id="3617891479562106823">Backgrounds are unavailable. Try again later.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">This supervised user will be managed by <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Unlock device and sign in to Google Account</translation> <translation id="3625258641415618104">Screenshots disabled</translation> @@ -2132,6 +2137,7 @@ <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">The Private Key for this Client Certificate is missing or invalid</translation> <translation id="4363771538994847871">No Cast destinations found. Need help?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> is sharing a window.</translation> <translation id="4364830672918311045">Display notifications</translation> <translation id="4365673000813822030">Whoops, Sync has stopped working.</translation> @@ -2321,6 +2327,7 @@ <translation id="4690091457710545971"><Four files generated by Intel Wi-Fi firmware: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. The first three are binary files containing register dumps, and are asserted by Intel to contain no personal or device-identifying information. The last file is an execution trace from the Intel firmware; it has been scrubbed of any personal or device-identifying information, but is too large to display here. These files were generated in response to recent Wi-Fi problems with your device, and will be shared with Intel to help troubleshoot these problems.></translation> <translation id="469230890969474295">OEM Folder</translation> <translation id="4692623383562244444">Search engines</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Printer configuration is handled by the administrator.</translation> <translation id="4694604912444486114">Monkey</translation> <translation id="4697551882387947560">When the browsing session ends</translation> @@ -2375,6 +2382,7 @@ <translation id="4776917500594043016">Password for <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pop-up blocked}other{# pop-ups blocked}}</translation> <translation id="4780321648949301421">Save Page As...</translation> <translation id="4785719467058219317">You're using a security key that's not registered with this website</translation> @@ -2387,6 +2395,7 @@ <translation id="4801448226354548035">Hide accounts</translation> <translation id="4801512016965057443">Allow mobile data roaming</translation> <translation id="4804818685124855865">Disconnect</translation> +<translation id="4804827417948292437">Avocado</translation> <translation id="4807098396393229769">Name on card</translation> <translation id="4808667324955055115">Pop-ups blocked:</translation> <translation id="480990236307250886">Open the homepage</translation> @@ -2481,6 +2490,7 @@ <translation id="4941246025622441835">Use this device requisition when enrolling the device for enterprise management:</translation> <translation id="4941627891654116707">Font size</translation> <translation id="494286511941020793">Proxy Configuration Help</translation> +<translation id="4943368462779413526">Football</translation> <translation id="4943691134276646401">'<ph name="CHROME_EXTENSION_NAME" />' wants to connect to a serial port</translation> <translation id="495170559598752135">Actions</translation> <translation id="4953689047182316270">Respond to Accessibility Events</translation> @@ -2550,6 +2560,7 @@ <translation id="5067399438976153555">Always on</translation> <translation id="5067867186035333991">Ask if <ph name="HOST" /> wants to access your microphone</translation> <translation id="5068918910148307423">Do not allow recently closed sites to finish sending and receiving data</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Adjust cursor size</translation> <translation id="5072836811783999860">Show managed bookmarks</translation> <translation id="5074318175948309511">This page may need to be reloaded before the new settings take effect.</translation> @@ -2584,6 +2595,7 @@ <translation id="5117930984404104619">Monitor the behaviour of other extensions, including visited URLs</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Your hard disk is full. Please save to another location or make more room on the hard disk.</translation> +<translation id="5123433949759960244">Basketball</translation> <translation id="5125751979347152379">Invalid URL.</translation> <translation id="5127805178023152808">Sync is off</translation> <translation id="5127881134400491887">Manage network connections</translation> @@ -3267,6 +3279,7 @@ <translation id="6166185671393271715">Import Passwords To Chrome</translation> <translation id="6169040057125497443">Please check your microphone.</translation> <translation id="6169666352732958425">Unable to cast desktop.</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">Pause printing</translation> <translation id="6173623053897475761">Type your PIN again</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3697,6 +3710,7 @@ <translation id="6870888490422746447">Choose an app to share to:</translation> <translation id="6871644448911473373">OCSP Responder: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">The password that you entered was rejected by the server.</translation> +<translation id="6876155724392614295">Cycle</translation> <translation id="6878422606530379992">Sensors allowed</translation> <translation id="6880587130513028875">Images were blocked on this page.</translation> <translation id="6883319974225028188">Oops! The system failed to save device configuration.</translation> @@ -4263,6 +4277,7 @@ <translation id="7772127298218883077">About <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Check your Chromebook status</translation> <translation id="7773726648746946405">Session Storage</translation> +<translation id="7774365994322694683">Bird</translation> <translation id="7776701556330691704">No voices found</translation> <translation id="7781335840981796660">All user accounts and local data will be removed.</translation> <translation id="7782102568078991263">No more suggestions from Google</translation> @@ -4668,6 +4683,7 @@ <translation id="8386903983509584791">Scan completed</translation> <translation id="8389492867173948260">Allow this extension to read and change all your data on websites that you visit:</translation> <translation id="8390449457866780408">Server unavailable.</translation> +<translation id="8391218455464584335">Vinyl</translation> <translation id="8391712576156218334">Image is unavailable. Try again later.</translation> <translation id="8392234662362215700">Tap Control-Shift-Space to switch keyboard layout.</translation> <translation id="8392451568018454956">Options menu for <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 7a5be6b9..dcc687b 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Busca en tu dispositivo, la Web y las apps.</translation> <translation id="114721135501989771">Obtén las mejores funciones de Google en Chrome</translation> <translation id="1149401351239820326">Mes de vencimiento</translation> +<translation id="1150565364351027703">Gafas de sol</translation> <translation id="1151917987301063366">Siempre permitir que <ph name="HOST" /> acceda a los sensores</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> <translation id="1156488781945104845">Hora actual</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">Asistente de combinaciones de teclas</translation> <translation id="2045969484888636535">Continuar bloqueando las cookies</translation> <translation id="204622017488417136">El dispositivo volverá a la versión de Chrome instalada anteriormente. Se eliminarán todas las cuentas de usuario y los datos locales. Esta acción no se puede deshacer.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Acceder al tráfico de la red</translation> <translation id="2048653237708779538">La acción no está disponible</translation> <translation id="2050339315714019657">Vertical</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187">Se agregó <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Usa cookies para recordar tus preferencias, incluso si no visitas esas páginas</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Personalizar el corrector ortográfico</translation> <translation id="247051149076336810">URL de archivos compartidos</translation> <translation id="2470702053775288986">Extensiones no admitidas inhabilitadas</translation> @@ -1129,6 +1132,7 @@ <translation id="2770465223704140727">Eliminar de la lista</translation> <translation id="2770690685823456775">Exporta tus contraseñas a otra carpeta</translation> <translation id="2771268254788431918">Datos móviles activados</translation> +<translation id="2771816809568414714">Queso</translation> <translation id="2772936498786524345">Sigiloso</translation> <translation id="2773288106548584039">Compatibilidad con navegadores heredados</translation> <translation id="2773802008104670137">Este tipo de archivo puede dañar tu computadora.</translation> @@ -1652,6 +1656,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">Eliminar datos de navega&ción...</translation> <translation id="3617891479562106823">Los fondos no están disponibles. Vuelve a intentarlo más tarde.</translation> +<translation id="3619115746895587757">Capuchino</translation> <translation id="3623574769078102674">Este usuario supervisado será administrado por <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Desbloquear el dispositivo y acceder a la cuenta de Google</translation> <translation id="3625258641415618104">Capturas de pantalla inhabilitadas</translation> @@ -2130,6 +2135,7 @@ <translation id="4359717112757026264">Paisaje urbano</translation> <translation id="4361142739114356624">Falta la clave privada para este Certificado de cliente o no es válida</translation> <translation id="4363771538994847871">No se encontraron destinos de transmisión. ¿Necesitas ayuda?</translation> +<translation id="4364327530094270451">Melón</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> comparte una ventana.</translation> <translation id="4364830672918311045">Mostrar notificaciones</translation> <translation id="4365673000813822030">¡Vaya! La sincronización ha dejado de funcionar.</translation> @@ -2319,6 +2325,7 @@ <translation id="4690091457710545971"><El firmware de Wi-Fi de Intel generó cuatro archivos: csr.lst, fh_regs.lst, radio_reg.lst y monitor.lst.sysmon. Intel utiliza los primeros tres, archivos binarios con volcados de registros, para incluir información que no identifique personas ni dispositivos. El último archivo es un rastro de ejecución del firmware de Intel del cual se eliminan los datos de identificación personal o de dispositivo; sin embargo, es demasiado grande para mostrarlo aquí. Se generaron estos archivos en respuesta a los recientes problemas de conectividad Wi-Fi en tu dispositivo y se compartirán con Intel para solucionarlos.></translation> <translation id="469230890969474295">Carpeta OEM</translation> <translation id="4692623383562244444">Motores de búsqueda</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">El administrador controla la configuración de la impresora.</translation> <translation id="4694604912444486114">Mono</translation> <translation id="4697551882387947560">Al finalizar la sesión de navegación</translation> @@ -2373,6 +2380,7 @@ <translation id="4776917500594043016">Contraseña para <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Se bloqueó una ventana emergente}other{Se bloquearon # vent. emergentes}}</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4785719467058219317">Estás usando una llave de seguridad que no se registró con este sitio web</translation> @@ -2385,6 +2393,7 @@ <translation id="4801448226354548035">Ocultar cuentas</translation> <translation id="4801512016965057443">Permitir itinerancia de datos móviles</translation> <translation id="4804818685124855865">Desconectar</translation> +<translation id="4804827417948292437">Aguacate</translation> <translation id="4807098396393229769">Nombre en la tarjeta</translation> <translation id="4808667324955055115">Se bloquearon ventanas emergentes:</translation> <translation id="480990236307250886">Abrir la página principal</translation> @@ -2479,6 +2488,7 @@ <translation id="4941246025622441835">Utiliza esta solicitud de dispositivo al registrar el dispositivo para la administración empresarial:</translation> <translation id="4941627891654116707">Tamaño de fuente</translation> <translation id="494286511941020793">Ayuda para la configuración de proxy</translation> +<translation id="4943368462779413526">Fútbol americano</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" quiere conectarse a un puerto en serie</translation> <translation id="495170559598752135">Acciones</translation> <translation id="4953689047182316270">Responder a los eventos de accesibilidad</translation> @@ -2548,6 +2558,7 @@ <translation id="5067399438976153555">Siempre activado</translation> <translation id="5067867186035333991">Preguntar si <ph name="HOST" /> quiere acceder al micrófono</translation> <translation id="5068918910148307423">No permitir que los sitios cerrados recientemente terminen de enviar y recibir datos</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Ajustar el tamaño del cursor</translation> <translation id="5072836811783999860">Mostrar favoritos administrados</translation> <translation id="5074318175948309511">Es posible que debas actualizar la página para que se aplique la nueva configuración.</translation> @@ -2582,6 +2593,7 @@ <translation id="5117930984404104619">Supervisar el comportamiento de otras extensiones (incluidas las URL visitadas)</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Tu disco duro está lleno. Guarda en otra ubicación o libera espacio en el disco duro.</translation> +<translation id="5123433949759960244">Básquet</translation> <translation id="5125751979347152379">URL no válido.</translation> <translation id="5127805178023152808">La sincronización está desactivada.</translation> <translation id="5127881134400491887">Administrar conexiones de red</translation> @@ -3265,6 +3277,7 @@ <translation id="6166185671393271715">Importar contraseñas a Chrome</translation> <translation id="6169040057125497443">Comprueba el micrófono.</translation> <translation id="6169666352732958425">No se puede transmitir el escritorio</translation> +<translation id="6170470584681422115">Sándwich</translation> <translation id="6171948306033499786">Pausar impresión</translation> <translation id="6173623053897475761">Vuelve a escribir tu PIN</translation> <translation id="6175314957787328458">GUID de dominio de Microsoft</translation> @@ -3695,6 +3708,7 @@ <translation id="6870888490422746447">Elegir una app para compartir contenido:</translation> <translation id="6871644448911473373">Respondedor de OCSP:<ph name="LOCATION" /></translation> <translation id="6872781471649843364">El servidor rechazó la contraseña que ingresaste.</translation> +<translation id="6876155724392614295">Bicicleta</translation> <translation id="6878422606530379992">Se permite el acceso a los sensores</translation> <translation id="6880587130513028875">Se bloquearon las imágenes en esta página.</translation> <translation id="6883319974225028188">El sistema no pudo guardar la configuración del dispositivo.</translation> @@ -4261,6 +4275,7 @@ <translation id="7772127298218883077">Acerca de <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Comprueba el estado de tu Chromebook</translation> <translation id="7773726648746946405">Almacenamiento de sesión</translation> +<translation id="7774365994322694683">Pájaro</translation> <translation id="7776701556330691704">No se encontraron voces</translation> <translation id="7781335840981796660">Se eliminarán todas las cuentas de usuario y todos los datos locales.</translation> <translation id="7782102568078991263">No hay más sugerencias de Google.</translation> @@ -4667,6 +4682,7 @@ <translation id="8386903983509584791">Finalizó la búsqueda</translation> <translation id="8389492867173948260">Permitir que esta extensión lea y cambie todos tus datos en los sitios web que visitas:</translation> <translation id="8390449457866780408">El servidor no está disponible.</translation> +<translation id="8391218455464584335">Vinilo</translation> <translation id="8391712576156218334">La imagen no está disponible. Vuelve a intentarlo más tarde.</translation> <translation id="8392234662362215700">Presiona Control-Mayúscula-Espacio para cambiar el diseño del teclado.</translation> <translation id="8392451568018454956">Menú de opciones para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 0b7ef0f3..db77bad 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Busca en el dispositivo, las aplicaciones y la Web.</translation> <translation id="114721135501989771">Obtén funciones inteligentes en Chrome</translation> <translation id="1149401351239820326">Mes de caducidad</translation> +<translation id="1150565364351027703">Gafas de sol</translation> <translation id="1151917987301063366">Permitir siempre que <ph name="HOST" /> acceda a los sensores</translation> <translation id="1153356358378277386">Dispositivos vinculados</translation> <translation id="1156488781945104845">Hora actual</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Asistente de combinaciones de teclas</translation> <translation id="2045969484888636535">Continuar bloqueando las cookies</translation> <translation id="204622017488417136">Se restaurará la versión de Chrome instalada previamente en el dispositivo y se eliminarán todas las cuentas de usuario y todos los datos locales. Esta acción no se puede deshacer.</translation> +<translation id="2046702855113914483">Fideos</translation> <translation id="2048182445208425546">Acceder a tu tráfico de red</translation> <translation id="2048653237708779538">Acción no disponible</translation> <translation id="2050339315714019657">Vertical</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Se ha añadido la impresora <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Usa cookies para recordar tus preferencias aunque no visites esas páginas</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Personalizar la revisión ortográfica</translation> <translation id="247051149076336810">URL del sistema de archivos compartidos</translation> <translation id="2470702053775288986">Extensiones no admitidas inhabilitadas</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Eliminar de la lista</translation> <translation id="2770690685823456775">Exporta tus contraseñas a otra carpeta</translation> <translation id="2771268254788431918">Datos móviles activados</translation> +<translation id="2771816809568414714">Queso</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Compatibilidad con navegadores antiguos</translation> <translation id="2773802008104670137">Este tipo de archivo puede dañar tu ordenador.</translation> @@ -1653,6 +1657,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Borrar datos de navegación...</translation> <translation id="3617891479562106823">Los fondos no están disponibles. Inténtalo de nuevo más tarde.</translation> +<translation id="3619115746895587757">Capuchino</translation> <translation id="3623574769078102674">Este usuario supervisado será administrado por <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Desbloquear el dispositivo e iniciar sesión en la cuenta de Google</translation> <translation id="3625258641415618104">Capturas de pantalla inhabilitadas</translation> @@ -2130,6 +2135,7 @@ <translation id="4359717112757026264">Paisaje urbano</translation> <translation id="4361142739114356624">Falta la clave privada de este certificado de cliente o no es válida</translation> <translation id="4363771538994847871">No se han encontrado destinos para enviar contenido. ¿Necesitas ayuda?</translation> +<translation id="4364327530094270451">Melón</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> está compartiendo una ventana.</translation> <translation id="4364830672918311045">Mostrar notificaciones</translation> <translation id="4365673000813822030">¡Ups! La sincronización ha dejado de funcionar.</translation> @@ -2319,6 +2325,7 @@ <translation id="4690091457710545971"><El firmware del Wi‑Fi de Intel ha generado cuatro archivos: csr.lst, fh_regs.lst, radio_reg.lst y monitor.lst.sysmon. Los tres primeros son archivos binarios que contienen volcados de registro, e Intel afirma que no contienen información personal o que identifique el dispositivo. El último archivo es un seguimiento de ejecución del firmware de Intel del cual se ha eliminado toda la información personal o que identifique el dispositivo, pero es demasiado grande para mostrarse aquí. Estos archivos se han generado como respuesta a los problemas recientes de tu dispositivo con la conexión Wi‑Fi y se compartirán con Intel para que ayude a solucionarlos.></translation> <translation id="469230890969474295">Carpeta OEM</translation> <translation id="4692623383562244444">Buscadores</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">El administrador se encarga de configurar la impresora.</translation> <translation id="4694604912444486114">Mono</translation> <translation id="4697551882387947560">Al finalizar la sesión de navegación</translation> @@ -2373,6 +2380,7 @@ <translation id="4776917500594043016">Contraseña de <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Ventana emergente bloqueada}other{# ventanas emergentes bloqueadas}}</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4785719467058219317">Estás usando una llave de seguridad que no se ha registrado en este sitio web</translation> @@ -2385,6 +2393,7 @@ <translation id="4801448226354548035">Ocultar cuentas</translation> <translation id="4801512016965057443">Permitir la itinerancia de datos móviles</translation> <translation id="4804818685124855865">Desvincular</translation> +<translation id="4804827417948292437">Aguacate</translation> <translation id="4807098396393229769">Titular de la tarjeta</translation> <translation id="4808667324955055115">Pop-ups bloqueados</translation> <translation id="480990236307250886">Abrir página de inicio</translation> @@ -2479,6 +2488,7 @@ <translation id="4941246025622441835">Utiliza esta solicitud de dispositivo al registrar el dispositivo para la administración empresarial:</translation> <translation id="4941627891654116707">Tamaño de la fuente</translation> <translation id="494286511941020793">Ayuda para la configuración de proxy</translation> +<translation id="4943368462779413526">Balón de fútbol</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" solicita conectarse a un puerto serie</translation> <translation id="495170559598752135">Acciones</translation> <translation id="4953689047182316270">Responder a eventos de accesibilidad</translation> @@ -2548,6 +2558,7 @@ <translation id="5067399438976153555">Siempre activado</translation> <translation id="5067867186035333991">Preguntar si <ph name="HOST" /> quiere acceder al micrófono</translation> <translation id="5068918910148307423">No permitir que los sitios web cerrados recientemente terminen de enviar y recibir datos</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Ajustar el tamaño del cursor</translation> <translation id="5072836811783999860">Mostrar marcadores administrados</translation> <translation id="5074318175948309511">Es posible que debas actualizar la página para que se aplique la nueva configuración.</translation> @@ -2582,6 +2593,7 @@ <translation id="5117930984404104619">Controlar el comportamiento de otras extensiones, incluidas las URL visitadas</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Tu disco duro está lleno. Guarda el archivo en otra ubicación o libera espacio en el disco duro.</translation> +<translation id="5123433949759960244">Balón de baloncesto</translation> <translation id="5125751979347152379">La URL no es válida.</translation> <translation id="5127805178023152808">La sincronización está desactivada</translation> <translation id="5127881134400491887">Administrar conexiones de red</translation> @@ -3265,6 +3277,7 @@ <translation id="6166185671393271715">Importar contraseñas a Chrome</translation> <translation id="6169040057125497443">Comprueba el micrófono.</translation> <translation id="6169666352732958425">No se ha podido enviar el escritorio.</translation> +<translation id="6170470584681422115">Bocadillo</translation> <translation id="6171948306033499786">Poner en pausa la impresión</translation> <translation id="6173623053897475761">Vuelve a escribir tu PIN</translation> <translation id="6175314957787328458">GUID de dominio de Microsoft</translation> @@ -3695,6 +3708,7 @@ <translation id="6870888490422746447">Elige una aplicación con la que compartir el contenido:</translation> <translation id="6871644448911473373">Respuesta de OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">El servidor ha rechazado la contraseña que has introducido.</translation> +<translation id="6876155724392614295">Bici</translation> <translation id="6878422606530379992">Sensores permitidos</translation> <translation id="6880587130513028875">Se han bloqueado las imágenes en esta página.</translation> <translation id="6883319974225028188">¡Vaya! El sistema no ha podido guardar la configuración del dispositivo.</translation> @@ -4261,6 +4275,7 @@ <translation id="7772127298218883077">Información de <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Comprueba el estado de tu Chromebook</translation> <translation id="7773726648746946405">Almacenamiento de sesión</translation> +<translation id="7774365994322694683">Pájaro</translation> <translation id="7776701556330691704">No se ha encontrado ninguna voz</translation> <translation id="7781335840981796660">Se eliminarán todas las cuentas de usuario y todos los datos locales.</translation> <translation id="7782102568078991263">No hay más sugerencias de Google.</translation> @@ -4666,6 +4681,7 @@ <translation id="8386903983509584791">Búsqueda completada</translation> <translation id="8389492867173948260">Permitir que esta extensión lea y cambie todos los datos de los sitios web que visites:</translation> <translation id="8390449457866780408">Servidor no disponible</translation> +<translation id="8391218455464584335">Vinilo</translation> <translation id="8391712576156218334">La imagen no está disponible. Inténtalo de nuevo más tarde.</translation> <translation id="8392234662362215700">Pulsa Control+Mayús+Espacio para cambiar de diseño de teclado.</translation> <translation id="8392451568018454956">Menú de opciones de <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index c37dc094..5f771fa 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Otsige oma seadmest, rakendustest ja veebist.</translation> <translation id="114721135501989771">Google'i nutikus Chrome'is</translation> <translation id="1149401351239820326">Aegumiskuu</translation> +<translation id="1150565364351027703">Päikeseprillid</translation> <translation id="1151917987301063366">Luba saidi <ph name="HOST" /> jaoks alati juurdepääs anduritele</translation> <translation id="1153356358378277386">Seotud seadmed</translation> <translation id="1156488781945104845">Praegune kellaaeg</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Klaviatuuri otseteede abiline</translation> <translation id="2045969484888636535">Jätka küpsiste blokeerimist</translation> <translation id="204622017488417136">Teie seadmes taastatakse varem installitud Chrome'i versioon. Kõik kasutajakontod ja kohalikud andmed kustutatakse. Seda ei saa tagasi võtta.</translation> +<translation id="2046702855113914483">Rāmen</translation> <translation id="2048182445208425546">Juurdepääs võrguliiklusele</translation> <translation id="2048653237708779538">Toiming pole saadaval</translation> <translation id="2050339315714019657">Vertikaalpaigutus</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> on lisatud</translation> <translation id="2464089476039395325">HTTP-puhverserver</translation> <translation id="2468205691404969808">Kasutage küpsisefaile, et oma eelistusi meeles pidada, isegi kui te neid lehti ei külasta</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Õigekirjakontrolli kohandamine</translation> <translation id="247051149076336810">Failide võrguhoidla URL</translation> <translation id="2470702053775288986">Toetamata laiendused on keelatud</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Eemalda loendist</translation> <translation id="2770690685823456775">Eksportige paroolid muusse kausta</translation> <translation id="2771268254788431918">Mobiilne andmeside on aktiveeritud</translation> +<translation id="2771816809568414714">Juust</translation> <translation id="2772936498786524345">Hiiliv</translation> <translation id="2773288106548584039">Pärandbrauserite tugi</translation> <translation id="2773802008104670137">Seda tüüpi fail võib teie arvutit kahjustada.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Heli</translation> <translation id="3616741288025931835">Kustuta sirvi&mise andmed...</translation> <translation id="3617891479562106823">Taustad pole saadaval. Proovige hiljem uuesti</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Seda valvatavat kasutajat haldab <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Avage seade ja logige oma Google'i kontole sisse</translation> <translation id="3625258641415618104">Ekraanipildid on keelatud</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Linna panoraam</translation> <translation id="4361142739114356624">Selle kliendi sertifikaadi privaatvõti puudub või on sobimatu</translation> <translation id="4363771538994847871">Ülekande sihtkohti ei leitud. Kas vajate abi?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491">Rakendus <ph name="APP_NAME" /> jagab akent.</translation> <translation id="4364830672918311045">Kuva märguanded</translation> <translation id="4365673000813822030">Vabandust, sünkroonimine on lakanud töötamast.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Inteli WiFi püsivara lõi neli faili: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Esimesed kolm on binaarfailid, mis sisaldavad registritõmmiseid, ja Intel kinnitab, et need ei hõlma isiklikke andmeid ega seadme tuvastamist võimaldavat teavet. Viimane fail on Inteli püsivara käivitusjälg, kust on eemaldatud kõik isiklikud ja seadme andmed, ent fail on siin kuvamiseks liiga suur. Need failid loodi seadmes hiljuti esinenud WiFi probleemide tõttu ning neid jagatakse Inteliga, et hõlbustada probleemide veaotsingut.></translation> <translation id="469230890969474295">OEM-i kaust</translation> <translation id="4692623383562244444">Otsingumootorid</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Printeri seadistust haldab administraator.</translation> <translation id="4694604912444486114">Pärdik</translation> <translation id="4697551882387947560">Sirvimisseansi lõpus</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Kasutaja <ph name="USER_EMAIL_ADDRESS" /> parool</translation> <translation id="4777825441726637019">Play pood</translation> <translation id="4779083564647765204">Suumi</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Hüpikaken blokeeriti}other{# hüpikakent blokeeriti}}</translation> <translation id="4780321648949301421">Salvesta leht &nimega...</translation> <translation id="4785719467058219317">Kasutate turvavõtit, mis ei ole sellel veebisaidil registreeritud</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Peida kontod</translation> <translation id="4801512016965057443">Luba mobiiliandmete rändlus</translation> <translation id="4804818685124855865">Katkesta ühendus</translation> +<translation id="4804827417948292437">Avokaado</translation> <translation id="4807098396393229769">Kaardil olev nimi</translation> <translation id="4808667324955055115">Hüpikaknad on blokeeritud</translation> <translation id="480990236307250886">Ava avaleht</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Kasutage seadme registreerimisel ettevõttehalduses seda seadmenõuet:</translation> <translation id="4941627891654116707">Fondi suurus</translation> <translation id="494286511941020793">Puhverserveri konfigureerimise abi</translation> +<translation id="4943368462779413526">Jalgpall</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />” soovib järjestikpordiga ühendust luua</translation> <translation id="495170559598752135">Toimingud</translation> <translation id="4953689047182316270">Juurdepääsetavuse sündmustele vastamine</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Alati sees</translation> <translation id="5067867186035333991">Küsi, kui sait <ph name="HOST" /> soovib juurdepääsu mikrofonile</translation> <translation id="5068918910148307423">Ära luba hiljuti suletud saitidel lõpetada andmete saatmist ega vastuvõtmist</translation> +<translation id="5068919226082848014">Pitsa</translation> <translation id="5072052264945641674">Kursori suuruse kohandamine</translation> <translation id="5072836811783999860">Kuva hallatud järjehoidjad</translation> <translation id="5074318175948309511">Uute seadete jõustamiseks peate lehe võib-olla uuesti laadima.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Muude laienduste käitumise, sh külastatud URL-ide jälgimine</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Teie kõvaketas on täis. Salvestage muusse asukohta või vabastage kõvakettaruumi.</translation> +<translation id="5123433949759960244">Korvpall</translation> <translation id="5125751979347152379">Vale URL.</translation> <translation id="5127805178023152808">Sünkroonimine on välja lülitatud</translation> <translation id="5127881134400491887">Võrguühenduste haldamine</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Paroolide importimine Chrome'i</translation> <translation id="6169040057125497443">Kontrollige mikrofoni.</translation> <translation id="6169666352732958425">Töölauda ei saa üle kanda.</translation> +<translation id="6170470584681422115">Võileib</translation> <translation id="6171948306033499786">Peata printimine</translation> <translation id="6173623053897475761">Sisestage PIN-kood uuesti</translation> <translation id="6175314957787328458">Microsofti domeeni GUID</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Valige rakendus, mille kaudu jagada:</translation> <translation id="6871644448911473373">OCSP vastaja: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Server lükkas sisestatud parooli tagasi.</translation> +<translation id="6876155724392614295">Jalgratas</translation> <translation id="6878422606530379992">Andurid on lubatud</translation> <translation id="6880587130513028875">Pildid blokeeriti sellel lehel.</translation> <translation id="6883319974225028188">Vabandust! Süsteemil ei õnnestunud seadme seadistust salvestada.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">Teave <ph name="PRODUCT_NAME" /> kohta</translation> <translation id="7772773261844472235">Vaadake oma Chromebooki olekut</translation> <translation id="7773726648746946405">Seansi talletusruum</translation> +<translation id="7774365994322694683">Lind</translation> <translation id="7776701556330691704">Hääli ei leitud</translation> <translation id="7781335840981796660">Kõik kasutajakontod ja kohalikud andmed eemaldatakse.</translation> <translation id="7782102568078991263">Google'ilt ei ole rohkem soovitusi</translation> @@ -4670,6 +4685,7 @@ <translation id="8386903983509584791">Skannimine jõudis lõpule</translation> <translation id="8389492867173948260">Lubage sellel laiendusel lugeda ja muuta külastatavate veebisaitide andmeid:</translation> <translation id="8390449457866780408">Server ei ole saadaval.</translation> +<translation id="8391218455464584335">Vinüül</translation> <translation id="8391712576156218334">Pilt pole saadaval. Proovige hiljem uuesti.</translation> <translation id="8392234662362215700">Klaviatuuripaigutuse vahetamiseks vajutage korraga juhtklahvi, tõstuklahvi ja tühikut.</translation> <translation id="8392451568018454956">Konto <ph name="USER_EMAIL_ADDRESS" /> valikute menüü</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 54943f8..2c14363 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">دستگاه، برنامهها و وب را جستجو کنید.</translation> <translation id="114721135501989771">هوشمندیهای Google را در Chrome دریافت کنید</translation> <translation id="1149401351239820326">ماه انقضا</translation> +<translation id="1150565364351027703">عینک آفتابی</translation> <translation id="1151917987301063366">همیشه اجازه دسترسی به حسگرها به <ph name="HOST" /> داده شود</translation> <translation id="1153356358378277386">دستگاههای مرتبطشده</translation> <translation id="1156488781945104845">زمان کنونی</translation> @@ -208,7 +209,7 @@ <translation id="131364520783682672">Caps Lock</translation> <translation id="1313705515580255288">نشانکها، سابقه و سایر تنظیماتتان با حساب Google شما همگام خواهند شد.</translation> <translation id="1314565355471455267">Android VPN</translation> -<translation id="131461803491198646">شبکه اصلی، بدون رومینگ</translation> +<translation id="131461803491198646">شبکه اصلی، بدون فراگردی</translation> <translation id="1316136264406804862">در حال جستجو...</translation> <translation id="1316495628809031177">همگامسازی موقتاً متوقف شده است</translation> <translation id="1322046419516468189">در <ph name="SAVED_PASSWORDS_STORE" /> گذرواژههای ذخیرهشدهتان را مشاهده و مدیریت کنید</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">راهنمای میانبر صفحهکلید</translation> <translation id="2045969484888636535">ادامه مسدود کردن کوکیها</translation> <translation id="204622017488417136">دستگاه شما به نسخه قبلاً نصب شده Chrome باز میگردد. همه حسابهای کاربری و دادههای محلی حذف میشوند. این کار قابل بازگشت نیست.</translation> +<translation id="2046702855113914483">رامن</translation> <translation id="2048182445208425546">دسترسی به ترافیک شبکه شما</translation> <translation id="2048653237708779538">کنش دردسترس نیست</translation> <translation id="2050339315714019657">عمودی</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> اضافه شد</translation> <translation id="2464089476039395325">پروکسی HTTP</translation> <translation id="2468205691404969808">از کوکیها برای به خاطر سپردن اولویتهای شما استفاده میکند؛ حتی اگر از آن صفحهها بازدید نکنید</translation> +<translation id="2468402215065996499">تاماگوچی</translation> <translation id="2469375675106140201">سفارشی کردن غلطگیر املا</translation> <translation id="247051149076336810">نشانی وب دستگاه ذخیرهسازی متصل به شبکه</translation> <translation id="2470702053775288986">افزونههای پشتیبانی نشده غیرفعال شدند.</translation> @@ -1128,6 +1131,7 @@ <translation id="2770465223704140727">حذف از فهرست</translation> <translation id="2770690685823456775">گذرواژهها را به پوشه دیگری صادر کنید</translation> <translation id="2771268254788431918">داده تلفن همراه فعال شد</translation> +<translation id="2771816809568414714">پنیر</translation> <translation id="2772936498786524345">مأمور مخفی</translation> <translation id="2773288106548584039">پشتیبانی از مرورگر قدیمی</translation> <translation id="2773802008104670137">این نوع فایل ممکن است به رایانه شما صدمه بزند.</translation> @@ -1651,6 +1655,7 @@ <translation id="3616113530831147358">صوتی</translation> <translation id="3616741288025931835">&پاک کردن دادههای مرور...</translation> <translation id="3617891479562106823">پسزمینهها دردسترس نیست. بعداً دوباره امتحان کنید.</translation> +<translation id="3619115746895587757">کاپوچینو</translation> <translation id="3623574769078102674"><ph name="MANAGER_EMAIL" />، این کاربر نظارتشده را مدیریت خواهد کرد.</translation> <translation id="3624567683873126087">باز کردن قفل دستگاه و ورود به سیستم حساب Google</translation> <translation id="3625258641415618104">عکس از صفحهنمایش غیرفعال است</translation> @@ -2129,6 +2134,7 @@ <translation id="4359717112757026264">نمای شهر</translation> <translation id="4361142739114356624">کلید خصوصی برای این گواهی کارخواه موجود نیست یا نامعتبر است</translation> <translation id="4363771538994847871">هیچ مقصدی برای ارسال محتوا پیدا نشد. نیاز به راهنمایی دارید؟</translation> +<translation id="4364327530094270451">خربزه</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> در حال اشتراکگذاری یک پنجره است.</translation> <translation id="4364830672918311045">نمایش اعلانها</translation> <translation id="4365673000813822030">وای، همگامسازی متوقف شده است.</translation> @@ -2318,6 +2324,7 @@ <translation id="4690091457710545971"><سفتافزار Wi-Fi Intel چهار فایل ایجاد میکند: csr.lst، fh_regs.lst، radio_reg.lst، monitor.lst.sysmon. سه فایل اول فایلهای دودویی حاوی رونوشتهای ثبت هستند و Intel تصریح کرده این فایلها حاوی اطلاعات شخصی یا اطلاعات هویتی دستگاه نیست. فایل آخر ردیابی اجرا از سفتافزار Intel است؛ هرگونه اطلاعات شخصی یا هویتی دستگاه از این فایل حذف شده اما برای نمایش در اینجا بسیار حجیم است. این فایلها جهت رفع مشکلات اخیر Wi-Fi در دستگاهتان ایجاد شده است و با Intel همرسانی خواهد شد تا به عیبیابی این مشکلات کمک کند.></translation> <translation id="469230890969474295">پوشه OEM</translation> <translation id="4692623383562244444">موتورهای جستجو</translation> +<translation id="4693155481716051732">سوشی</translation> <translation id="4694024090038830733">سرپرست سیستم، پیکربندی چاپگر را انجام میدهد.</translation> <translation id="4694604912444486114">میمون</translation> <translation id="4697551882387947560">هنگام پایان جلسه مرور</translation> @@ -2372,6 +2379,7 @@ <translation id="4776917500594043016">گذرواژه <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">فروشگاه Play</translation> <translation id="4779083564647765204">بزرگنمایی</translation> +<translation id="4779136857077979611">اونیگیری</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{پنجره بازشو مسدود شد}one{# پنجره بازشو مسدود شد}other{# پنجره بازشو مسدود شد}}</translation> <translation id="4780321648949301421">ذخیره صفحه بهعنوان...</translation> <translation id="4785719467058219317">شما از کلید امنیتی استفاده میکنید که در این وبسایت ثبت نشده است</translation> @@ -2382,8 +2390,9 @@ <translation id="479536056609751218">صفحهٔ وب، فقط HTML</translation> <translation id="4798236378408895261">پیوست <ph name="BEGIN_LINK" />گزارشهای بلوتوث<ph name="END_LINK" /> (داخلی Google)</translation> <translation id="4801448226354548035">پنهانسازی حسابها</translation> -<translation id="4801512016965057443">اجازه دادن رومینگ داده تلفن همراه</translation> +<translation id="4801512016965057443">اجازه دادن فراگردی داده تلفن همراه</translation> <translation id="4804818685124855865">قطع اتصال</translation> +<translation id="4804827417948292437">آووکادو</translation> <translation id="4807098396393229769">نام روی کارت</translation> <translation id="4808667324955055115">پنجرههای بازشو مسدود هستند:</translation> <translation id="480990236307250886">باز کردن صفحه اصلی</translation> @@ -2478,6 +2487,7 @@ <translation id="4941246025622441835">هنگام ثبتنام دستگاه برای مدیریت سازمانی، از این درخواست دستگاه استفاده کنید:</translation> <translation id="4941627891654116707">اندازه قلم</translation> <translation id="494286511941020793">راهنمای پیکربندی پراکسی</translation> +<translation id="4943368462779413526">فوتبال</translation> <translation id="4943691134276646401">«<ph name="CHROME_EXTENSION_NAME" />» میخواهد به یک درگاه سریالی متصل شود</translation> <translation id="495170559598752135">کنشها</translation> <translation id="4953689047182316270">پاسخ دادن به رویدادهای مربوط به دسترسپذیری</translation> @@ -2547,6 +2557,7 @@ <translation id="5067399438976153555">همیشه روشن</translation> <translation id="5067867186035333991">اگر <ph name="HOST" /> میخواهد به میکروفن شما دسترسی داشته باشد از من سوال شود</translation> <translation id="5068918910148307423">به سایتهای اخیراً بستهشده امکان داده نشود ارسال و دریافت داده را تکمیل کنند</translation> +<translation id="5068919226082848014">پیتزا</translation> <translation id="5072052264945641674">تنظیم اندازه نشانگر</translation> <translation id="5072836811783999860">نمایش نشانکهای مدیریت شده</translation> <translation id="5074318175948309511">شاید لازم باشد که این صفحه قبل از اعمال شدن تنظیمات جدید، بارگذاری مجدد شود.</translation> @@ -2581,6 +2592,7 @@ <translation id="5117930984404104619">کنترل رفتار افزودنیهای دیگر از جمله نشانیهای وب بازدید شده</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">دیسک سخت پر است. لطفاً در محل دیگری ذخیره کنید یا فضای بیشتری در دیسک سخت ایجاد کنید.</translation> +<translation id="5123433949759960244">بسکتبال</translation> <translation id="5125751979347152379">نشانی وب نامعتبر است.</translation> <translation id="5127805178023152808">همگامسازی خاموش است</translation> <translation id="5127881134400491887">مدیریت اتصالات شبکه</translation> @@ -2652,7 +2664,7 @@ <translation id="5247051749037287028">نام نمایشی (اختیاری)</translation> <translation id="5249624017678798539">مرورگر پیش از تکمیل بارگیری ناگهان خارج شد.</translation> <translation id="5250372599208556903"><ph name="SEARCH_ENGINE_NAME" /> از مکانتان برای ارائه محتوای محلی استفاده میکند. میتوانید در <ph name="SETTINGS_LINK" /> آن را تغییر دهید.</translation> -<translation id="5252456968953390977">رومینگ</translation> +<translation id="5252456968953390977">فراگردی</translation> <translation id="5252653240322147470">کد پین باید کمتر از <ph name="MAXIMUM" /> رقم باشد</translation> <translation id="5254368820972107711">نمایش فایلهای موردنظر برای پاک کردن</translation> <translation id="52550593576409946">برنامه کیوسک راهاندازی نشد.</translation> @@ -3234,7 +3246,7 @@ <translation id="6122095009389448667">دسترسی این سایت به بریدهدان همچنان مسدود باشد</translation> <translation id="6122875415561139701">عملیات نوشتن در این دستگاه مجاز نیست: «<ph name="DEVICE_NAME" />».</translation> <translation id="6124650939968185064">افزودنههای زیر به این برنامه افزودنی وابسته هستند:</translation> -<translation id="6124698108608891449">این سایت مجوزهای بیشتری لازم دارد.</translation> +<translation id="6124698108608891449">این سایت به مجوزهای بیشتری نیاز دارد.</translation> <translation id="6125479973208104919">متأسفانه دوباره باید حسابتان را به این <ph name="DEVICE_TYPE" /> اضافه کنید.</translation> <translation id="6129691635767514872">دادههای انتخابشده از Chrome و دستگاههای همگامسازیشده برداشته شدهاند. ممکن است حساب Google شما در <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> شکلهای دیگری از سابقه مرور (مانند جستجوها و فعالیت از سایر سرویسهای Google) داشته باشد.</translation> <translation id="6129938384427316298">نظر گواهی Netscape</translation> @@ -3264,6 +3276,7 @@ <translation id="6166185671393271715">وارد کردن گذرواژهها به Chrome</translation> <translation id="6169040057125497443">لطفاً میکروفون را بررسی کنید.</translation> <translation id="6169666352732958425">ارسال محتوای میز کار امکانپذیر نیست.</translation> +<translation id="6170470584681422115">ساندویچ</translation> <translation id="6171948306033499786">توقف موقت چاپ</translation> <translation id="6173623053897475761">پین خود را دوباره تایپ کنید</translation> <translation id="6175314957787328458">GUID دامنه Microsoft</translation> @@ -3694,6 +3707,7 @@ <translation id="6870888490422746447">انتخاب برنامهای برای اشتراکگذاری در:</translation> <translation id="6871644448911473373">پاسخگوی OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">سرور گذرواژهای را که وارد کردید نپذیرفته است.</translation> +<translation id="6876155724392614295">دوچرخه</translation> <translation id="6878422606530379992">دسترسی به حسگرها مجاز شده است</translation> <translation id="6880587130513028875">تصاویر این صفحه مسدود شدهاند.</translation> <translation id="6883319974225028188">وای! سیستم نتوانست پیکربندی دستگاه را ذخیره کند.</translation> @@ -4260,6 +4274,7 @@ <translation id="7772127298218883077">درباره <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">بررسی وضعیت Chromebook</translation> <translation id="7773726648746946405">ذخیره جلسه</translation> +<translation id="7774365994322694683">پرنده</translation> <translation id="7776701556330691704">صدایی پیدا نشد</translation> <translation id="7781335840981796660">همه حسابهای کاربر و دادههای محلی حذف میشوند.</translation> <translation id="7782102568078991263">پیشنهاد دیگری از Google وجود ندارد</translation> @@ -4665,6 +4680,7 @@ <translation id="8386903983509584791">اسکن کامل شد</translation> <translation id="8389492867173948260">به این افزونه اجازه دهید همه دادههایتان را در وبسایتهایی که بازدید میکنید بخواند و تغییر دهد:</translation> <translation id="8390449457866780408">سرور در دسترس نیست.</translation> +<translation id="8391218455464584335">صفحه گرامافون</translation> <translation id="8391712576156218334">تصویر دردسترس نیست. بعداً دوباره امتحان کنید.</translation> <translation id="8392234662362215700">برای تغییر طرح کلی صفحهکلید، Control-Shift و فاصله را فشار دهید.</translation> <translation id="8392451568018454956">منوی گزینهها برای <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -4798,7 +4814,7 @@ <translation id="8610103157987623234">قالب نادرست است، لطفاً دوباره امتحان کنید</translation> <translation id="8615618338313291042">برنامه ناشناس: <ph name="APP_NAME" /></translation> <translation id="8619892228487928601"><ph name="CERTIFICATE_NAME" />: <ph name="ERROR" /></translation> -<translation id="8620617069779373398">وضعیت رومینگ</translation> +<translation id="8620617069779373398">وضعیت فراگردی</translation> <translation id="8620765578342452535">پیکربندی اتصالات شبکه</translation> <translation id="8621866727807194849">نرمافزار مضری در رایانهتان وجود دارد. Chrome آن را برمیدارد، تنظیمات شما را بازنشانی میکند و افزونهها را غیرفعال میکند. این کار باعث میشود مرورگرتان دوباره بهطور معمول کار کند.</translation> <translation id="862542460444371744">&برنامه های افزودنی</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 466afea..cd6db63f 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Hae laitteeltasi, sovelluksistasi ja verkosta.</translation> <translation id="114721135501989771">Googlen älykkäitä ratkaisuja Chromeen</translation> <translation id="1149401351239820326">Viimeinen voimassaolokuukausi</translation> +<translation id="1150565364351027703">Aurinkolasit</translation> <translation id="1151917987301063366"><ph name="HOST" /> saa aina luvan käyttää tunnistimia</translation> <translation id="1153356358378277386">Laiteparit</translation> <translation id="1156488781945104845">Nykyinen aika</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Pikanäppäinapuri</translation> <translation id="2045969484888636535">Estä evästeet edelleen</translation> <translation id="204622017488417136">Laitteeseesi palautetaan aiemmin asennettu Chromen versio. Kaikki käyttäjätilit ja paikalliset tiedot poistetaan. Tätä ei voi kumota.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Käyttää verkkoliikennettäsi</translation> <translation id="2048653237708779538">Toiminto ei ole käytettävissä</translation> <translation id="2050339315714019657">Pystysuunta</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Lisättiin <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP-välityspalvelin</translation> <translation id="2468205691404969808">Käyttää evästeitä asetustesi muistamiseen, vaikka et kävisi kyseisillä sivuilla</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Personoi oikeinkirjoituksen tarkistusta</translation> <translation id="247051149076336810">Tiedostonjaon URL-osoite</translation> <translation id="2470702053775288986">Ei-tuetut laajennukset poistettu käytöstä</translation> @@ -1133,6 +1136,7 @@ <translation id="2770465223704140727">Poista luettelosta</translation> <translation id="2770690685823456775">Vie salasanasi toiseen kansioon</translation> <translation id="2771268254788431918">Mobiilidata aktivoitu</translation> +<translation id="2771816809568414714">Juusto</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Vanhojen selaimien tuki</translation> <translation id="2773802008104670137">Tämäntyyppinen tiedosto voi vahingoittaa tietokonettasi.</translation> @@ -1656,6 +1660,7 @@ <translation id="3616113530831147358">Ääni</translation> <translation id="3616741288025931835">&Poista selaustiedot...</translation> <translation id="3617891479562106823">Taustat eivät ole käytettävissä. Yritä myöhemmin uudelleen.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Tätä valvottua käyttäjää hallinnoi <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Avaa laitteen lukitus ja kirjaudu Google-tilille</translation> <translation id="3625258641415618104">Kuvakaappaukset poissa käytöstä</translation> @@ -2131,6 +2136,7 @@ <translation id="4359717112757026264">Kaupunkimaisema</translation> <translation id="4361142739114356624">Tämän käyttöoikeusvarmenteen yksityinen avain puuttuu tai on virheellinen.</translation> <translation id="4363771538994847871">Cast-kohteita ei löytynyt. Tarvitsetko apua?</translation> +<translation id="4364327530094270451">Meloni</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> jakaa ikkunan.</translation> <translation id="4364830672918311045">Näytä ilmoitukset</translation> <translation id="4365673000813822030">Hups, synkronointi on lakannut toimimasta.</translation> @@ -2320,6 +2326,7 @@ <translation id="4690091457710545971"><Intelin Wi-Fi-laiteohjelmisto loi neljä tiedostoa: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Ensimmäiset kolmet ovat rekisterivedoksia sisältäviä binääritiedostoja, jotka eivät Intelin mukaan sisällä mitään henkilötietoja tai laitetta yksilöiviä tietoja. Viimeinen tiedosto on Intel-laiteohjelmiston luoma suoritusluettelo, josta on poistettu henkilötiedot tai laitetta yksilöivät tiedot. Se on liian suuri täällä näytettäväksi. Tiedostot luotiin laitteesi viimeaikaisten Wi-Fi-ongelmien ratkaisemiseksi ja jaetaan Intelin kanssa vianetsinnän tukemiseksi.></translation> <translation id="469230890969474295">Alkuperäisten laitevalmistajien kansio</translation> <translation id="4692623383562244444">Hakukoneet</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Järjestelmänvalvoja vastaa tulostinten määrityksestä.</translation> <translation id="4694604912444486114">Apina</translation> <translation id="4697551882387947560">Kun selausistunto päättyy</translation> @@ -2374,6 +2381,7 @@ <translation id="4776917500594043016">Osoitteen <ph name="USER_EMAIL_ADDRESS" /> salasana</translation> <translation id="4777825441726637019">Play Kauppa</translation> <translation id="4779083564647765204">Lähennä</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Ponnahdusikkuna estetty}other{# ponnahdusikkunaa estetty}}</translation> <translation id="4780321648949301421">Tallenna sivu nimellä...</translation> <translation id="4785719467058219317">Käytät suojausavainta, jota ei ole rekisteröity tällä sivustolla.</translation> @@ -2386,6 +2394,7 @@ <translation id="4801448226354548035">Piilota tilit</translation> <translation id="4801512016965057443">Salli mobiilitiedonsiirto roaming-tilassa</translation> <translation id="4804818685124855865">Katkaise yhteys</translation> +<translation id="4804827417948292437">Avokado</translation> <translation id="4807098396393229769">Kortissa oleva nimi</translation> <translation id="4808667324955055115">Ponnahdusikkunat estetty:</translation> <translation id="480990236307250886">Avaa oma etusivu</translation> @@ -2480,6 +2489,7 @@ <translation id="4941246025622441835">Käytä tätä laitepyyntöä, kun rekisteröit laitteen yrityshallintaan:</translation> <translation id="4941627891654116707">Kirjasinkoko</translation> <translation id="494286511941020793">Välityspalvelinmäärityksen ohje</translation> +<translation id="4943368462779413526">Jalkapallo</translation> <translation id="4943691134276646401"><ph name="CHROME_EXTENSION_NAME" /> haluaa yhdistää sarjaporttiin</translation> <translation id="495170559598752135">Toiminnot</translation> <translation id="4953689047182316270">Vastata esteettömyystapahtumiin</translation> @@ -2549,6 +2559,7 @@ <translation id="5067399438976153555">Aina käytössä</translation> <translation id="5067867186035333991">Kysy, jos <ph name="HOST" /> haluaa käyttää mikrofoniasi</translation> <translation id="5068918910148307423">Älä anna äskettäin suljettujen sivustojen suorittaa tietojen lähettämista ja vastaanottamista loppuun</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Säädä osoittimen kokoa</translation> <translation id="5072836811783999860">Näytä hallinnoidut kirjanmerkit</translation> <translation id="5074318175948309511">Tämä sivu on ehkä ladattava uudelleen, ennen kuin uudet asetukset tulevat voimaan.</translation> @@ -2583,6 +2594,7 @@ <translation id="5117930984404104619">Seuraa muiden laajennusten toimia, mukaan lukien käydyt URL-osoitteet</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Kiintolevy on täynnä. Tallenna muuhun sijaintiin tai vapauta levytilaa.</translation> +<translation id="5123433949759960244">Koripallo</translation> <translation id="5125751979347152379">Virheellinen URL-osoite.</translation> <translation id="5127805178023152808">Synkronointi ei ole käytössä</translation> <translation id="5127881134400491887">hallinnoida verkkoyhteyksiä</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Tuo salasanat Chromeen</translation> <translation id="6169040057125497443">Tarkista mikrofonisi.</translation> <translation id="6169666352732958425">Työpöydän suoratoisto ei onnistu.</translation> +<translation id="6170470584681422115">Voileipä</translation> <translation id="6171948306033499786">Keskeytä tulostus</translation> <translation id="6173623053897475761">Kirjoita PIN-koodi uudelleen</translation> <translation id="6175314957787328458">Microsoftin toimialueen GUID-tunnus</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Valitse jakamisen kohdesovellus:</translation> <translation id="6871644448911473373">OCSP-vastaus: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Palvelin hylkäsi antamasi salasanan.</translation> +<translation id="6876155724392614295">Pyörä</translation> <translation id="6878422606530379992">Tunnistimet sallittu</translation> <translation id="6880587130513028875">Kuvat estettiin tällä sivulla.</translation> <translation id="6883319974225028188">Hups – laitteen kokoonpanon tallentaminen epäonnistui.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">Tietoja tuotteesta <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Tarkista Chromebookin tila</translation> <translation id="7773726648746946405">Käyttökerran tallennustila</translation> +<translation id="7774365994322694683">Lintu</translation> <translation id="7776701556330691704">Ääniä ei löydy</translation> <translation id="7781335840981796660">Kaikki käyttäjätilit ja paikalliset tiedot poistetaan.</translation> <translation id="7782102568078991263">Ei enää ehdotuksia Googlelta</translation> @@ -4668,6 +4683,7 @@ <translation id="8386903983509584791">Etsintä valmis</translation> <translation id="8389492867173948260">Salli tämän laajennuksen lukea ja muuttaa kaikkea dataasi avatuilla verkkosivustoilla:</translation> <translation id="8390449457866780408">Palvelin ei ole käytettävissä.</translation> +<translation id="8391218455464584335">Vinyyli</translation> <translation id="8391712576156218334">Kuva ei ole saatavilla. Yritä myöhemmin uudelleen.</translation> <translation id="8392234662362215700">Vaihda näppäimistöasettelua painamalla Control + Shift + välilyönti.</translation> <translation id="8392451568018454956">Tilin <ph name="USER_EMAIL_ADDRESS" /> vaihtoehtovalikko</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index e3831bf..ae95a20 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -92,6 +92,7 @@ <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">I-edit ang search engine</translation> <translation id="1134009406053225289">Buksan sa incognito window</translation> +<translation id="1136712381129578788">Na-lock ang security key dahil napakaraming beses nang nailagay ang maling PIN. Para i-unlock ito, alisin at muling ipasok ito.</translation> <translation id="1137673463384776352">Buksan ang link sa <ph name="APP" /></translation> <translation id="1140351953533677694">I-access ang iyong mga Bluetooth at Serial device</translation> <translation id="1140610710803014750">Para mailagay ang iyong mga bookmark sa lahat ng device mo, mag-sign in at i-on ang sync.</translation> @@ -101,6 +102,7 @@ <translation id="1145532888383813076">Maghanap sa iyong device, mga app, at web.</translation> <translation id="114721135501989771">Magkaroon ng mga smart na feature ng Google sa Chrome</translation> <translation id="1149401351239820326">Buwan ng pag-expire</translation> +<translation id="1150565364351027703">Sunglasses</translation> <translation id="1151917987301063366">Palaging payagan ang <ph name="HOST" /> na i-access ang mga sensor</translation> <translation id="1153356358378277386">Mga nakapares na device</translation> <translation id="1156488781945104845">Kasalukuyang oras</translation> @@ -159,6 +161,7 @@ <translation id="1227507814927581609">Nabigo ang pagpapatunay habang kumokonekta sa "<ph name="DEVICE_NAME" />".</translation> <translation id="1231733316453485619">I-on ang pag-sync?</translation> <translation id="1232569758102978740">Walang pamagat</translation> +<translation id="1233497634904001272">Pinduting muli ang iyong security key para kumpletuhin ang kahilingan.</translation> <translation id="1233721473400465416">Lokal</translation> <translation id="1234808891666923653">Mga Service Worker</translation> <translation id="1235458158152011030">Mga kilalang network</translation> @@ -200,6 +203,7 @@ <translation id="1303671224831497365">Walang nakitang Bluetooth device</translation> <translation id="130491383855577612">Matagumpay na napalitan ang mga app at file ng Linux</translation> <translation id="1306606229401759371">Baguhin ang mga setting</translation> +<translation id="1307165550267142340">Nagawa ang iyong PIN</translation> <translation id="1307559529304613120">Oops! Nabigo ang system na i-imbak ang pangmatagalang token sa pag-access sa API para sa device na ito.</translation> <translation id="1313405956111467313">Awtomatikong proxy configuration</translation> <translation id="131364520783682672">Caps Lock</translation> @@ -254,6 +258,7 @@ <translation id="1399511500114202393">Walang certificate ng user</translation> <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (Pinangangasiwaan)</translation> <translation id="1406500794671479665">Bine-verify...</translation> +<translation id="140723521119632973">Pag-activate ng Cellular Network</translation> <translation id="1407489512183974736">Gitnang Naka-crop</translation> <translation id="1408504635543854729">I-explore ang content ng device sa Files app. Pinaghihigpitan ng isang admin ang content at hindi maaaring baguhin.</translation> <translation id="1408789165795197664">Advanced...</translation> @@ -441,6 +446,7 @@ <translation id="1688935057616748272">Mag-type ng titik</translation> <translation id="168991973552362966">Magdagdag ng kalapit na printer</translation> <translation id="1689945336726856614">Kopyahin ang &URL</translation> +<translation id="1692109533452028989">Ipinapadala ng Chrome ang text na tina-type mo sa browser patungong Google</translation> <translation id="1692115862433274081">Gumamit ng ibang account</translation> <translation id="1692602667007917253">Oops, nagkaroon ng problema</translation> <translation id="1692799361700686467">Pinayagan ang cookies mula sa maraming site.</translation> @@ -656,6 +662,7 @@ <translation id="2045117674524495717">Keyboard Shortcut Helper</translation> <translation id="2045969484888636535">Ipagpatuloy ang pag-block ng cookies</translation> <translation id="204622017488417136">Ibabalik ang iyong device sa dating naka-install na bersyon ng Chrome. Aalisin ang lahat ng user account at lokal na data. Hindi na ito maaaring bawiin.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">I-access ang trapiko ng iyong network</translation> <translation id="2048653237708779538">Hindi available ang pagkilos</translation> <translation id="2050339315714019657">Portrait</translation> @@ -723,6 +730,7 @@ <translation id="2154710561487035718">Kopyahin ang URL</translation> <translation id="2155772377859296191">Mukhang <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation> <translation id="2156283799932971644">Makakatulong ka sa pagpapahusay ng Ligtas na Pag-browse sa pamamagitan ng pagpapadala ng ilang impormasyon ng system at content ng page sa Google.</translation> +<translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation> <translation id="215753907730220065">Umalis sa Full Screen</translation> <translation id="2157875535253991059">Full screen na ngayon ang pahinang ito.</translation> <translation id="216169395504480358">Magdagdag ng Wi-Fi...</translation> @@ -730,6 +738,7 @@ <translation id="2163470535490402084">Mangyaring kumonekta sa Internet upang mag-sign in sa iyong <ph name="DEVICE_TYPE" />.</translation> <translation id="2166369534954157698">The quick brown fox jumps over the lazy dog</translation> <translation id="2169062631698640254">Mag-sign in pa rin</translation> +<translation id="2172784515318616985">Magpatuloy</translation> <translation id="2173801458090845390">Magdagdag ng requisition ID sa device na ito</translation> <translation id="2175042898143291048">Palagi itong gawin</translation> <translation id="2175607476662778685">Quick launch bar</translation> @@ -921,6 +930,7 @@ <translation id="2462752602710430187">Idinagdag ang <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP Proxy</translation> <translation id="2468205691404969808">Gumamit ng mga cookie para matandaan ang iyong mga kagustuhan kahit na hindi mo binibisita ang mga page na iyon</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">I-customize ang spell check</translation> <translation id="247051149076336810">URL ng file share</translation> <translation id="2470702053775288986">Na-disable ang mga hindi sinusuportahang extension</translation> @@ -974,6 +984,7 @@ <translation id="253434972992662860">I-&pause</translation> <translation id="2534460670861217804">Secure na HTTP Proxy</translation> <translation id="253557089021624350">Bilang ng keepalive</translation> +<translation id="2535799430745250929">Walang cellular network</translation> <translation id="2538361623464451692">Naka-disable ang pag-sync</translation> <translation id="2540449034743108469">Pindutin ang "Simulan" para makinig sa mga aktibidad ng extension</translation> <translation id="2541002089857695151">I-optimize ang fullscreen na pag-cast?</translation> @@ -1037,6 +1048,7 @@ <translation id="2635094637295383009">Twitter</translation> <translation id="2635276683026132559">Paglagda</translation> <translation id="2636625531157955190">Hindi ma-access ng Chrome ang larawan.</translation> +<translation id="2637400434494156704">Maling PIN. May isa kang pagtatangkang natitira.</translation> <translation id="2638087589890736295">Kinakailangan ang passphrase upang masimulan ang pag-sync</translation> <translation id="2642111877055905627">Bola ng soccer</translation> <translation id="2643698698624765890">Pamahalaan ang iyong mga extension sa pamamagitan ng pag-click sa Mga Extension sa menu na Window.</translation> @@ -1123,6 +1135,7 @@ <translation id="2770465223704140727">Alisin sa listahan</translation> <translation id="2770690685823456775">I-export ang iyong mga password sa isa pang folder</translation> <translation id="2771268254788431918">Na-activate ang mobile data</translation> +<translation id="2771816809568414714">Keso</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Suporta sa Legacy Browser</translation> <translation id="2773802008104670137">Maaaring maapektuhan ng ganitong uri ng file ang iyong computer.</translation> @@ -1466,6 +1479,7 @@ <translation id="3334632933872291866"><ph name="WINDOW_TITLE" /> - Nagpe-play ang video sa picture-in-picture mode</translation> <translation id="3335947283844343239">Muling buksan ang Nakasarang Tab</translation> <translation id="3336664756920573711">I-unlock ang iyong <ph name="DEVICE_TYPE" /> gamit ang Android phone mo</translation> +<translation id="3341699307020049241">Maling PIN. Mayroon kang <ph name="RETRIES" /> pagtatangkang natitira.</translation> <translation id="3341703758641437857">Payagan ang access na mag-file ng mga URL</translation> <translation id="3342361181740736773">Gustong alisin ng "<ph name="TRIGGERING_EXTENSION_NAME" />" ang extension na ito.</translation> <translation id="3345886924813989455">Walang natagpuang suportadong browser</translation> @@ -1492,6 +1506,7 @@ <translation id="3382200254148930874">Inihihinto ang pagsubaybay...</translation> <translation id="3385092118218578224"><ph name="DISPLAY_ZOOM" />%</translation> <translation id="338583716107319301">Separator</translation> +<translation id="3387614642886316601">Gumamit ng pinahusay na pang-check ng pagbabaybay</translation> <translation id="3389312115541230716">I-right click ang icon na <ph name="SMALL_PRODUCT_LOGO" /> sa taskbar</translation> <translation id="3393352139658145068">I-activate ang Assistant kapag may sinumang nagsabi ng “Ok Google”. Para makatipid ng baterya, naka-on lang ang “Ok Google” kapag nakakonekta ang iyong device sa isang pinagmumulan ng kuryente.</translation> <translation id="3396800784455899911">Sa pamamagitan ng pag-click sa button na "Tanggapin at magpatuloy," sumasang-ayon ka sa pagpoproseso na inilarawan sa itaas para sa mga serbisyong ito ng Google.</translation> @@ -1644,6 +1659,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&I-clear ang Data sa Pag-browse...</translation> <translation id="3617891479562106823">Hindi available ang mga background. Subukang muli sa ibang pagkakataon.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Pamamahalaan ang pinangangasiwaang user na ito ng <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">I-unlock ang device at mag-sign in sa Google Account</translation> <translation id="3625258641415618104">Naka-disable ang mga screenshot</translation> @@ -1726,6 +1742,7 @@ <translation id="3729506734996624908">Mga pinapahintulutang site</translation> <translation id="3731997362820527097">Piliin ang iyong security key</translation> <translation id="3732078975418297900">Error sa linya <ph name="ERROR_LINE" /></translation> +<translation id="3732530910372558017">Dapat ang PIN ay hindi lalampas sa 63 character</translation> <translation id="3733127536501031542">SSL Server na may Step-up</translation> <translation id="3735740477244556633">Pagbukud-bukurin ayon sa</translation> <translation id="3737274407993947948">Nagkaroon ng error sa pag-install ng Linux...</translation> @@ -1758,6 +1775,7 @@ <translation id="3776796446459804932">Lumalabag ang extension na ito sa patakaran ng Chrome Web Store.</translation> <translation id="3777806571986431400">Pinagana na ang Extension</translation> <translation id="3778152852029592020">Kinansela ang pag-download.</translation> +<translation id="3778208826288864398">Na-lock ang security key dahil napakaraming beses nang nailagay ang maling PIN. Kakailanganin mong i-reset ang security key.</translation> <translation id="3778740492972734840">Mga tool ng Nag-&develop</translation> <translation id="3778868487658107119">Tanungin ito. Utusan ito. Ito ang iyong personal na Google, laging handang tumulong.</translation> <translation id="378312418865624974">Magbasa ng natatanging identifier para sa computer na ito</translation> @@ -1768,6 +1786,7 @@ <translation id="3789841737615482174">Mag-install</translation> <translation id="379082410132524484">Nag-expire na ang iyong card</translation> <translation id="3792890930871100565">Idiskonekta ang mga printer</translation> +<translation id="3792938779249970121">Pumili ng account</translation> <translation id="3796648294839530037">Mga Paboritong Network:</translation> <translation id="3797739167230984533">Ang iyong <ph name="BEGIN_LINK" /><ph name="DEVICE_TYPE" /> ay pinapamahalaan<ph name="END_LINK" /> ng iyong organisasyon</translation> <translation id="3797900183766075808">&Maghanap sa <ph name="SEARCH_ENGINE" /> ng “<ph name="SEARCH_TERMS" />”</translation> @@ -1959,6 +1978,7 @@ <translation id="407520071244661467">Scale</translation> <translation id="4075639477629295004">Hindi ma-cast ang <ph name="FILE_NAME" />.</translation> <translation id="4077917118009885966">Naka-block ang mga ad sa site na ito</translation> +<translation id="4079140982534148664">Gumamit ng Pinahusay na Pang-check ng Pagbabaybay</translation> <translation id="4081242589061676262">Hindi ma-cast ang file.</translation> <translation id="4084682180776658562">Bookmark</translation> <translation id="4084835346725913160">Isara ang <ph name="TAB_NAME" /></translation> @@ -1974,6 +1994,7 @@ <translation id="4090947011087001172">I-reset ang mga pahintulot sa site para sa <ph name="SITE" />?</translation> <translation id="4091434297613116013">mga sheet ng papel</translation> <translation id="4093955363990068916">Lokal na file:</translation> +<translation id="4095264805865317199">Buksan ang UI sa Pag-activate ng Cellular Network</translation> <translation id="4095507791297118304">Pangunahing display</translation> <translation id="409579654357498729">Idagdag sa Cloud Print</translation> <translation id="4096508467498758490">I-disable ang mga extension ng developer mode</translation> @@ -1991,8 +2012,10 @@ <translation id="4115002065223188701">Hindi nasasagap ang network</translation> <translation id="4115080753528843955">Gumagamit ang ilang serbisyo ng content ng mga natatanging identifier para sa pagpapahintulot ng access sa pinoprotektahang content</translation> <translation id="4118579674665737931">Paki-reboot ang device at subukang muli.</translation> +<translation id="4120388883569225797">Hindi puwedeng i-reset ang security key na ito</translation> <translation id="4120817667028078560">Masyadong mahaba ang path</translation> <translation id="4121428309786185360">Mag-e-expire Sa</translation> +<translation id="4124823734405044952">Na-reset ang iyong security key</translation> <translation id="4124935795427217608">Unicorn</translation> <translation id="412730574613779332">Superhero</translation> <translation id="412940972494182898">Patakbuhin ang Flash sa pagkakataong ito</translation> @@ -2115,6 +2138,7 @@ <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">Nawawala o di-wasto ang Pribadong Key para sa Client Certificate na ito</translation> <translation id="4363771538994847871">Walang nakitang mga patutunguhan ng Pag-cast. Kailangan mo ba ng tulong?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491">Nagbabahagi ng window ang <ph name="APP_NAME" />.</translation> <translation id="4364830672918311045">Ipakita ang mga notification</translation> <translation id="4365673000813822030">Oops, tumigil sa paggana ang Sync.</translation> @@ -2304,6 +2328,7 @@ <translation id="4690091457710545971"><Apat na file na ginawa ng Intel Wi-Fi firmware: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Ang unang tatlo ay mga binary file na may mga dump sa pagpaparehistro at iginiit ng Intel na walang personal na impormasyon o impormasyong nakakapagpakilala sa device. Ang panghuling file ay isang execution trace mula sa Intel firmware; tinanggalan ito ng anumang personal na impormasyon o impormasyong nakakapagpakilala sa device, ngunit masyado itong malaki para maipakita rito. Nagawa ang mga file na ito bilang tugon sa mga kamakailang naging problema sa Wi-Fi sa iyong device, at ibabahagi ito sa Intel para makatulong sa pag-troubleshoot ng mga problemang ito.></translation> <translation id="469230890969474295">Folder ng OEM</translation> <translation id="4692623383562244444">Mga search engine</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Pinapangasiwaan ng administrator ang pag-configure ng printer.</translation> <translation id="4694604912444486114">Unggoy</translation> <translation id="4697551882387947560">Kapag nagtapos ang session ng pagba-browse</translation> @@ -2317,6 +2342,7 @@ <translation id="4711638718396952945">Ipanumbalik ang mga setting</translation> <translation id="4715553623069266137">napakaikli (0.8s)</translation> <translation id="4716483597559580346">Powerwash para sa pinaigting na seguridad</translation> +<translation id="4718490098585891067">Pumili ng account para mag-sign in:</translation> <translation id="4720113199587244118">Magdagdag ng Mga Device</translation> <translation id="4720185134442950733">Network ng mobile data</translation> <translation id="4722735765955348426">Password ni <ph name="USERNAME" /></translation> @@ -2357,6 +2383,7 @@ <translation id="4776917500594043016">Password para sa <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Na-block ang pop-up}one{# pop-up ang na-block}other{# na pop-up ang na-block}}</translation> <translation id="4780321648949301421">I-save ang Page Bilang...</translation> <translation id="4785719467058219317">Gumagamit ka ng security key na hindi nakarehistro sa website na ito</translation> @@ -2369,6 +2396,7 @@ <translation id="4801448226354548035">Itago ang mga account</translation> <translation id="4801512016965057443">Payagan ang pag-roam ng mobile data</translation> <translation id="4804818685124855865">I-disconnect</translation> +<translation id="4804827417948292437">Abukado</translation> <translation id="4807098396393229769">Pangalang makikita sa card</translation> <translation id="4808667324955055115">Naka-block ang mga pop-up</translation> <translation id="480990236307250886">Buksan ang home page</translation> @@ -2463,6 +2491,7 @@ <translation id="4941246025622441835">Gamitin ang paghihingi sa device na ito kapag ine-enroll ang device para sa enterprise management:</translation> <translation id="4941627891654116707">Laki ng font</translation> <translation id="494286511941020793">Tulong sa Configuration ng Proxy</translation> +<translation id="4943368462779413526">Football</translation> <translation id="4943691134276646401">Gustong kumonekta ng "<ph name="CHROME_EXTENSION_NAME" />" sa isang serial port</translation> <translation id="495170559598752135">Mga Pagkilos</translation> <translation id="4953689047182316270">Tumugon sa Mga Kaganapan ng Pagiging Naa-access</translation> @@ -2532,6 +2561,7 @@ <translation id="5067399438976153555">Palaging naka-on</translation> <translation id="5067867186035333991">Itanong kung gustong i-access ng <ph name="HOST" /> ang iyong mikropono</translation> <translation id="5068918910148307423">Huwag payagan ang mga kamakailang isinarang site na tapusin ang pagpapadala at pagtanggap ng data</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Ayusin ang laki ng cursor</translation> <translation id="5072836811783999860">Ipakita ang mga pinamamahalaang bookmark</translation> <translation id="5074318175948309511">Maaaring kailangan na muling i-load ang page na ito bago gumana ang mga bagong setting.</translation> @@ -2557,6 +2587,7 @@ <translation id="5111692334209731439">&Bookmark Manager</translation> <translation id="5112577000029535889">&Mga Tool ng Nag-develop</translation> <translation id="5113739826273394829">Kung iki-click mo ang icon na ito, manu-mano mong ila-lock ang <ph name="DEVICE_TYPE" /> na ito. Sa susunod, kakailanganin mong i-type ang iyong password upang makapasok.</translation> +<translation id="51143538739122961">Ipasok ang iyong security key at pindutin ito</translation> <translation id="5115309401544567011">Isaksak ang iyong <ph name="DEVICE_TYPE" /> sa isang pinagmumulan ng kuryente.</translation> <translation id="5115338116365931134">SSO</translation> <translation id="5116628073786783676">I-Sa&ve ang Audio Bilang...</translation> @@ -2565,6 +2596,7 @@ <translation id="5117930984404104619">Subaybayan ang pagkilos ng iba pang mga extension, kasama ang mga binisitang URL</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Puno na ang iyong hard disk. Mangyaring i-save sa isa pang lokasyon o magbakante ng espasyo sa hard disk.</translation> +<translation id="5123433949759960244">Basketball</translation> <translation id="5125751979347152379">Di-wastong URL.</translation> <translation id="5127805178023152808">Naka-off ang pag-sync</translation> <translation id="5127881134400491887">Pamahalaan ang mga koneksyon ng network</translation> @@ -2680,6 +2712,7 @@ <translation id="5305688511332277257">Walang naka-install</translation> <translation id="5307030433605830021">Hindi sinusuportahan ang source</translation> <translation id="5308380583665731573">Kumonekta</translation> +<translation id="5310281978693206542">Ipadala ang Link sa Iyong Mga Device</translation> <translation id="5311304534597152726">Nagsa-sign in bilang</translation> <translation id="5315873049536339193">Pagkatao</translation> <translation id="5317780077021120954">I-save</translation> @@ -3116,6 +3149,7 @@ <translation id="5973605538625120605">Magpalit ng PIN</translation> <translation id="5975792506968920132">Porsyento ng Charge ng Baterya</translation> <translation id="5976160379964388480">Iba Pa</translation> +<translation id="5978277834170881274">&Gumamit ng pangunahing pang-check ng pagbabaybay</translation> <translation id="5979421442488174909">&Isalin sa <ph name="LANGUAGE" /></translation> <translation id="5979469435153841984">Upang mag-bookmark ng mga page, i-click ang star sa address bar</translation> <translation id="5984222099446776634">Kamakailang Binisita</translation> @@ -3172,6 +3206,7 @@ <translation id="6057381398996433816">Na-block ang site na ito sa paggamit ng sensor ng paggalaw at liwanag.</translation> <translation id="6059652578941944813">Pagkakasunud-sunod ng Certificate</translation> <translation id="6059925163896151826">Mga USB device</translation> +<translation id="6061882183774845124">Ipadala ang link sa iyong mga device</translation> <translation id="6064217302520318294">Lock ng screen</translation> <translation id="6065289257230303064">Mga Katangian ng Direktoryo ng Paksa ng Certificate</translation> <translation id="6069671174561668781">Magtakda ng Wallpaper</translation> @@ -3245,6 +3280,7 @@ <translation id="6166185671393271715">Mag-import ng Mga Password sa Chrome</translation> <translation id="6169040057125497443">Pakisuri ang iyong mikropono.</translation> <translation id="6169666352732958425">Hindi ma-cast ang desktop.</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">I-pause ang pag-print</translation> <translation id="6173623053897475761">I-type muli ang iyong PIN</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3493,6 +3529,7 @@ <translation id="6564072216966459757">Alisin ang Mga Linux App para sa <ph name="DEVICE_TYPE" /></translation> <translation id="6567688344210276845">Maaaring hindi mai-load ang icon '<ph name="ICON" />' para sa pagkilos sa pahina.</translation> <translation id="6571979863037191371">Idiskonekta ang iyong telepono sa Chromebook mo. Hindi na awtomatikong makokonekta ang mga ito.</translation> +<translation id="6573998787994398565">Ang <ph name="FILE_NAME" /> ay hindi karaniwang dina-download at puwedeng mapanganib. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="657402800789773160">&I-reload ang Pahinang Ito</translation> <translation id="6577284282025554716">Nakansela ang pag-download: <ph name="FILE_NAME" /></translation> <translation id="6578664922716508575">I-encrypt ang mga naka-sync na password sa iyong username at password sa Google</translation> @@ -3674,6 +3711,7 @@ <translation id="6870888490422746447">Pumili ng app na pagbabahagian:</translation> <translation id="6871644448911473373">OCSP Responder: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Tinanggihan ng server ang password na inilagay mo.</translation> +<translation id="6876155724392614295">Bisikleta</translation> <translation id="6878422606530379992">Pinapayagan ang mga sensor</translation> <translation id="6880587130513028875">Hinarangan ang mga larawan sa pahinang ito.</translation> <translation id="6883319974225028188">Oops! Hindi na-save ng system ang configuration ng device.</translation> @@ -3720,6 +3758,7 @@ <translation id="6951153907720526401">Mga Tagapangasiwa ng Pagbabayad</translation> <translation id="6953878494808481632">Nauugnay na impormasyon</translation> <translation id="6955446738988643816">Siyasatin ang Popup</translation> +<translation id="6957044667612803194">Hindi sinusuportahan ng security key na ito ang mga PIN</translation> <translation id="6957231940976260713">Pangalan ng serbisyo</translation> <translation id="6964390816189577014">Bayani</translation> <translation id="6964760285928603117">Alisin Sa Grupo</translation> @@ -3745,6 +3784,7 @@ <translation id="6985607387932385770">Mga Printer</translation> <translation id="6990778048354947307">Madilim na Tema</translation> <translation id="6991665348624301627">Pumili ng patutunguhan</translation> +<translation id="6992554835374084304">I-on ang pinahusay na pang-check ng pagbabaybay</translation> <translation id="6997642619627518301"><ph name="NAME_PH" /> - Log ng Aktibidad</translation> <translation id="6997707937646349884">Sa iyong mga device:</translation> <translation id="6998793565256476099">Magpatala ng device para sa pakikipagkumperensya gamit ang video</translation> @@ -3886,6 +3926,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Umalis sa Page}one{Umalis sa Mga Page}other{Umalis sa Mga Page}}</translation> <translation id="7207631048330366454">Maghanap ng mga app</translation> <translation id="7210499381659830293">Mga extension na printer</translation> +<translation id="7212097698621322584">Ilagay ang kasalukuyan mong PIN para palitan ito. Kung hindi mo alam ang iyong PIN, kakailanganin mong i-reset ang security key, pagkatapos ay gumawa ng bagong PIN.</translation> <translation id="721467499098558573">Pindutin ang button sa iyong security key sa loob ng hindi bababa sa 5 segundo</translation> <translation id="7216409898977639127">Cellular provider</translation> <translation id="7216595297012131718">Pagsunud-sunurin ang mga wika batay sa iyong kagustuhan</translation> @@ -3909,6 +3950,7 @@ <translation id="7241443820034350811">Kung hindi nakalista ang iyong security key, pindutin ang button nito nang hindi bababa sa 5 segundo.</translation> <translation id="7243632151880336635">I-clear at Mag-sign Out</translation> <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Pinakamainam)</translation> +<translation id="7246230585855757313">Muling ipasok ang iyong security key at subukang muli</translation> <translation id="7246947237293279874">FTP Proxy</translation> <translation id="725109152065019550">Paumanhin, hindi pinagana ng iyong administrator ang panlabas na storage sa iyong account.</translation> <translation id="7251346854160851420">Default na wallpaper</translation> @@ -4058,6 +4100,7 @@ <translation id="748138892655239008">Mga Limitasyon sa Pangunahing Certificate</translation> <translation id="7487067081878637334">Teknolohiya</translation> <translation id="7487099628810939106">Pagkaantala bago ang pag-click:</translation> +<translation id="7487141338393529395">I-on ang Pinahusay na Pang-check ng Pagbabaybay</translation> <translation id="7487969577036436319">Walang naka-install na mga bahagi</translation> <translation id="7489355918927585587">{COUNT,plural, =0{&Buksan lahat}=1{&Buksan ang bookmark}one{&Buksan lahat (#)}other{&Buksan lahat (#)}}</translation> <translation id="749028671485790643">Tao <ph name="VALUE" /></translation> @@ -4168,9 +4211,11 @@ <translation id="7663719505383602579">Tatanggap: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="7664620655576155379">Hindi sinusuportahang Bluetooth device: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665369617277396874">Magdagdag ng account</translation> +<translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{Maling PIN. May isa kang pagtatangkang natitira.}one{Maling PIN. Mayroon kang # natitirang pagtatangka.}other{Maling PIN. Mayroon kang # na natitirang pagtatangka.}}</translation> <translation id="7671130400130574146">Gumamit ng system title bar at mga hangganan</translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, sa <ph name="PAGE_TITLE" />.</translation> <translation id="7676867886086876795">Ipinapadala ang iyong boses sa Google para mabigyang-daan ang dictation sa anumang field ng text.</translation> +<translation id="7678280409648629969">Iso-store ang data ng pag-sign in sa Chrome pagkatapos mong lumabas sa Incognito mode. Nagbibigay-daan ito sa iyong gamiting muli ang Touch ID sa website na ito sa ibang pagkakataon.</translation> <translation id="7681095912841365527">Maaaring gumamit ng bluetooth ang site</translation> <translation id="7683373461016844951">Upang magpatuloy, i-click ang OK, pagkatapos ay i-click ang Magdagdag ng Tao upang gumawa ng bagong profile para sa iyong email address sa <ph name="DOMAIN" />.</translation> <translation id="7684212569183643648">Na-install ng Iyong Administrator</translation> @@ -4181,6 +4226,7 @@ <translation id="7690294790491645610">Kumpirmahin ang bagong password</translation> <translation id="7690378713476594306">Pumili sa listahan</translation> <translation id="7690853182226561458">Magdagdag ng &folder...</translation> +<translation id="7691077781194517083">Hindi puwedeng i-reset ang security key na ito. Error <ph name="ERROR_CODE" />.</translation> <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME" /> (nasa device na)</translation> <translation id="7696063401938172191">Sa iyong '<ph name="PHONE_NAME" />':</translation> <translation id="7698408911093959127">{COUNT,plural, =1{1 item sa listahan ng bookmark}one{# item sa listahan ng bookmark}other{# na item sa listahan ng bookmark}}</translation> @@ -4232,6 +4278,7 @@ <translation id="7772127298218883077">Tungkol sa <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Tingnan ang status ng iyong Chromebook</translation> <translation id="7773726648746946405">Storage ng session</translation> +<translation id="7774365994322694683">Ibon</translation> <translation id="7776701556330691704">Walang nakitang boses</translation> <translation id="7781335840981796660">Aalisin ang lahat ng user account at lokal na data.</translation> <translation id="7782102568078991263">Wala nang mga suhestiyon mula sa Google</translation> @@ -4394,6 +4441,7 @@ <translation id="7982083145464587921">Paki-restart ang iyong device upang ayusin ang error na ito.</translation> <translation id="7982789257301363584">Network</translation> <translation id="7984068253310542383">I-mirror ang <ph name="DISPLAY_NAME" /></translation> +<translation id="7985283639530788531">Gusto mo bang gamitin ang Touch ID sa <ph name="APP_NAME" /> gamit ang Incognito mode?</translation> <translation id="7986295104073916105">Basahin at baguhin ang mga setting ng naka-save na password</translation> <translation id="7987814697832569482">Palaging kumonekta sa pamamagitan ng VPN na ito</translation> <translation id="798835209536175951">Magpadala at makatanggap ng mga text message mula sa iyong Chromebook. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> @@ -4491,6 +4539,7 @@ <translation id="8131740175452115882">Kumpirmahin</translation> <translation id="8133676275609324831">&Ipakita sa folder</translation> <translation id="8135557862853121765"><ph name="NUM_KILOBYTES" />K</translation> +<translation id="8136269678443988272">Hindi tugma ang mga PIN na inilagay mo</translation> <translation id="8137559199583651773">Pamahalaan ang mga extension</translation> <translation id="8138082791834443598">Opsyonal — maglagay ng bago o mag-update ng umiiral nang impormasyon na iuugnay sa device na ito.</translation> <translation id="813913629614996137">Sinisimulan...</translation> @@ -4554,6 +4603,7 @@ <translation id="8242426110754782860">Magpatuloy</translation> <translation id="8244514732452879619">Malapit nang magpatay ng ilaw</translation> <translation id="8246209727385807362">Hindi kilalang carrier</translation> +<translation id="8246776524656196770">Protektahan ang iyong security key gamit ang isang PIN (Personal Identification Number)</translation> <translation id="8248050856337841185">I-&paste</translation> <translation id="8249048954461686687">Folder ng OEM</translation> <translation id="8249615410597138718">Ipadala sa Iyong Mga Device</translation> @@ -4634,6 +4684,7 @@ <translation id="8386903983509584791">Nakumpleto ang pag-scan</translation> <translation id="8389492867173948260">Pahintulutan ang extension na ito na i-read at baguhin ang lahat ng iyong data sa mga website na binibisita mo:</translation> <translation id="8390449457866780408">Hindi available ang server.</translation> +<translation id="8391218455464584335">Vinyl</translation> <translation id="8391712576156218334">Hindi available ang larawan. Subukang muli sa ibang pagkakataon.</translation> <translation id="8392234662362215700">Pindutin ang Control-Shift-Space upang magpalit ng layout ng keyboard.</translation> <translation id="8392451568018454956">Menu ng mga pagpipilian para sa <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -4784,6 +4835,7 @@ <translation id="8642171459927087831">Token ng Access</translation> <translation id="8642947597466641025">Gawing Mas Malaki Ang Teksto</translation> <translation id="8643418457919840804">Para magpatuloy, pumili ng opsyon:</translation> +<translation id="8644655801811752511">Hindi puwedeng i-reset ang security key na ito. Subukang i-reset kaagad ang key pagkatapos muling ipasok ito.</translation> <translation id="8645354835496065562">Patuloy na payagan ang access sa sensor</translation> <translation id="8647834505253004544">Di-wastong email address</translation> <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> o <ph name="RE_SCAN_LINK" /></translation> @@ -4965,6 +5017,7 @@ <translation id="8893801527741465188">Tapos nang mag-uninstall</translation> <translation id="8893928184421379330">Paumanhin, hindi makilala ang device na <ph name="DEVICE_LABEL" />.</translation> <translation id="8895454554629927345">Listahan ng bookmark</translation> +<translation id="8896022254727357590">Dapat ay hindi bababa sa 4 na character ang PIN</translation> <translation id="8898786835233784856">Select Next Tab</translation> <translation id="8898840733695078011">Lakas ng signal</translation> <translation id="8899851313684471736">Buksan ang link sa bagong &window</translation> @@ -4999,6 +5052,7 @@ <translation id="8944964446326379280">Nagbabahagi ang <ph name="APP_NAME" /> ng window sa <ph name="TAB_NAME" />.</translation> <translation id="8946359700442089734">Ang mga feature para sa pagde-debug ay hindi ganap na na-enable sa <ph name="IDS_SHORT_PRODUCT_NAME" /> device na ito.</translation> <translation id="894871326938397531">Umalis sa incognito mode?</translation> +<translation id="8948939328578167195">Gusto ng <ph name="WEBSITE" /> na makita ang manufacturer at modelo ng iyong security key</translation> <translation id="8951256747718668828">Hindi makumpleto ang pag-restore dahil sa error</translation> <translation id="895347679606913382">Nagsisimula...</translation> <translation id="895944840846194039">Memory ng JavaScript</translation> @@ -5055,6 +5109,7 @@ <translation id="9039663905644212491">PEAP</translation> <translation id="9040661932550800571">I-update ang password para sa <ph name="ORIGIN" />?</translation> <translation id="9041692268811217999">Na-disable ng iyong administrator ang access sa mga lokal na file sa iyong machine</translation> +<translation id="9041909613332246191">Hindi karaniwang dina-download ang file na ito at puwedeng mapanganib. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="9042893549633094279">Privacy at seguridad</translation> <translation id="904451693890288097">Pakilagay ang passkey para sa "<ph name="DEVICE_NAME" />":</translation> <translation id="9044646465488564462">Nabigong kumonekta sa network: <ph name="DETAILS" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 7dcfdab..51f87da 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Effectuez des recherches sur votre appareil, dans vos applications et sur le Web.</translation> <translation id="114721135501989771">Profitez des fonctionnalités intelligentes de Google dans Chrome</translation> <translation id="1149401351239820326">Mois d'expiration</translation> +<translation id="1150565364351027703">Lunettes de soleil</translation> <translation id="1151917987301063366">Toujours autoriser <ph name="HOST" /> à accéder aux capteurs</translation> <translation id="1153356358378277386">Appareils associés</translation> <translation id="1156488781945104845">Heure actuelle</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Aide relative aux raccourcis clavier</translation> <translation id="2045969484888636535">Continuer à bloquer les cookies</translation> <translation id="204622017488417136">La version de Chrome précédemment installée va être rétablie sur votre appareil. Les données locales et les comptes utilisateur vont être supprimés. Cette opération est irréversible.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Accéder au trafic de votre réseau</translation> <translation id="2048653237708779538">Action non disponible</translation> <translation id="2050339315714019657">Portrait</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">L'imprimante <ph name="PRINTER_NAME" /> a bien été ajoutée.</translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Utilise des cookies pour mémoriser vos préférences, même si vous n'accédez pas à ces pages</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Personnaliser le correcteur orthographique</translation> <translation id="247051149076336810">URL de partage de fichiers</translation> <translation id="2470702053775288986">Désactivation des extensions non compatibles</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Retirer de la liste</translation> <translation id="2770690685823456775">Exportez vos mots de passe dans un autre dossier</translation> <translation id="2771268254788431918">Données mobiles activées</translation> +<translation id="2771816809568414714">Fromage</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Compatibilité avec les anciens navigateurs</translation> <translation id="2773802008104670137">Ce fichier risque d'endommager votre ordinateur.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Effacer les données de navigation...</translation> <translation id="3617891479562106823">Les arrière-plans sont indisponibles. Réessayez plus tard.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Cet utilisateur supervisé va être géré par <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Déverrouiller l'appareil et se connecter au compte Google</translation> <translation id="3625258641415618104">Captures d'écran désactivées</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Paysage urbain</translation> <translation id="4361142739114356624">La clé privée de ce certificat client est manquante ou incorrecte</translation> <translation id="4363771538994847871">Aucune destination Cast trouvée. Besoin d'aide?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> partage une fenêtre.</translation> <translation id="4364830672918311045">Afficher les notifications</translation> <translation id="4365673000813822030">Petit problème… La synchronisation s'est arrêtée.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Le micrologiciel Wi-Fi d'Intel a généré quatre fichiers : csr.lst, fh_regs.lst, radio_reg.lst et monitor.lst.sysmon. Les trois premiers sont des fichiers binaires qui contiennent des images mémoire de registres. Intel certifie que ces fichiers ne possèdent pas d'informations personnelles ni de données permettant d'identifier les appareils. Le dernier fichier est une trace d'exécution du micrologiciel Intel. Toutes les informations personnelles ainsi que les données permettant d'identifier les appareils qu'il pouvait contenir ont été supprimées. Toutefois, il est trop volumineux pour s'afficher ici. Ces fichiers ont été créés suite aux problèmes que votre appareil a récemment rencontrés avec le Wi-Fi, et seront partagés avec Intel pour qu'une solution soit trouvée.></translation> <translation id="469230890969474295">Dossier OEM</translation> <translation id="4692623383562244444">Moteurs de recherche</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">La configuration de l'imprimante est gérée par l'administrateur.</translation> <translation id="4694604912444486114">Singe</translation> <translation id="4697551882387947560">Lorsque vous quittez la session de navigation.</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Mot de passe de <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{ fenêtre pop-up bloquée}one{# fenêtre pop-up bloquée}other{# fenêtres pop-up bloquées}}</translation> <translation id="4780321648949301421">Enregistrer la page sous...</translation> <translation id="4785719467058219317">La clé de sécurité n'est pas enregistrée auprès de ce site Web</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Masquer les comptes</translation> <translation id="4801512016965057443">Autoriser l'itinérance des données mobiles</translation> <translation id="4804818685124855865">Se déconnecter</translation> +<translation id="4804827417948292437">Avocat</translation> <translation id="4807098396393229769">Titulaire de la carte</translation> <translation id="4808667324955055115">Pop-up bloqués :</translation> <translation id="480990236307250886">Ouvrir la page d'accueil</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Utiliser cette réquisition pour l'enregistrement de l'appareil dans le cadre de la gestion d'entreprise :</translation> <translation id="4941627891654116707">Taille de police</translation> <translation id="494286511941020793">Aide pour la configuration de proxy</translation> +<translation id="4943368462779413526">Football américain</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" tente de se connecter à un port de série</translation> <translation id="495170559598752135">Actions</translation> <translation id="4953689047182316270">Répondre aux événements d'accessibilité</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Toujours activé</translation> <translation id="5067867186035333991">Demander si l'accès à votre micro est requis sur <ph name="HOST" /></translation> <translation id="5068918910148307423">Ne pas autoriser les sites fermés récemment à terminer l'envoi et la réception de données</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Ajuster la taille du curseur</translation> <translation id="5072836811783999860">Afficher les favoris gérés</translation> <translation id="5074318175948309511">Vous devrez peut-être actualiser cette page pour que les nouveaux paramètres soient appliqués.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Surveiller le comportement des autres extensions, y compris des URL consultées</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Votre disque dur est saturé. Veuillez enregistrer à un autre emplacement ou libérer de l'espace sur le disque dur.</translation> +<translation id="5123433949759960244">Basket-ball</translation> <translation id="5125751979347152379">URL incorrecte</translation> <translation id="5127805178023152808">La synchronisation est désactivée.</translation> <translation id="5127881134400491887">Gérer les connexions réseau</translation> @@ -3269,6 +3281,7 @@ <translation id="6166185671393271715">Importer des mots de passe dans Chrome</translation> <translation id="6169040057125497443">Veuillez vérifier votre micro.</translation> <translation id="6169666352732958425">Impossible de caster le bureau</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">Suspendre l'impression</translation> <translation id="6173623053897475761">Saisir à nouveau votre code</translation> <translation id="6175314957787328458">GUID de domaine Microsoft</translation> @@ -3699,6 +3712,7 @@ <translation id="6870888490422746447">Sélectionnez une application pour le partage :</translation> <translation id="6871644448911473373">Répondeur OCSP : <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Le serveur a refusé le mot de passe que vous avez saisi.</translation> +<translation id="6876155724392614295">Vélo</translation> <translation id="6878422606530379992">Capteurs autorisés</translation> <translation id="6880587130513028875">Des images ont été bloquées sur cette page.</translation> <translation id="6883319974225028188">Petit problème… Échec de l'enregistrement de la configuration de l'appareil par le système.</translation> @@ -4265,6 +4279,7 @@ <translation id="7772127298218883077">À propos de <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Vérifiez l'état de votre Chromebook</translation> <translation id="7773726648746946405">Stockage de session</translation> +<translation id="7774365994322694683">Oiseau</translation> <translation id="7776701556330691704">Aucune voix trouvée</translation> <translation id="7781335840981796660">Tous les comptes utilisateur et toutes les données locales seront supprimés.</translation> <translation id="7782102568078991263">Aucune autre suggestion de Google</translation> @@ -4670,6 +4685,7 @@ <translation id="8386903983509584791">Recherche terminée</translation> <translation id="8389492867173948260">Autorisez cette extension à lire et à modifier toutes vos données sur les sites Web que vous consultez :</translation> <translation id="8390449457866780408">Serveur indisponible.</translation> +<translation id="8391218455464584335">Vinyle</translation> <translation id="8391712576156218334">L'image n'est pas disponible. Réessayez plus tard.</translation> <translation id="8392234662362215700">Appuyez sur Ctrl+Maj+Espace pour changer la disposition du clavier.</translation> <translation id="8392451568018454956">Menu "Options" de l'adresse e-mail <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 358937a..d10cfec4 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">તમારું ઉપકરણ, ઍપ અને વેબ શોધો.</translation> <translation id="114721135501989771">Chromeમાં Google સ્માર્ટ મેળવો</translation> <translation id="1149401351239820326">સમય સમાપ્તિ મહિનો</translation> +<translation id="1150565364351027703">ગોગલ્સ</translation> <translation id="1151917987301063366"><ph name="HOST" />ને હંમેશાં સેન્સર ઍક્સેસ કરવાની મંજૂરી આપો</translation> <translation id="1153356358378277386">જોડી કરેલા ઉપકરણો</translation> <translation id="1156488781945104845">હાલનો સમય</translation> @@ -657,6 +658,7 @@ <translation id="2045117674524495717">કીબોર્ડ શૉર્ટકટ સહાયક</translation> <translation id="2045969484888636535">કૂકીઝ અવરોધિત કરવાનું ચાલુ રાખો</translation> <translation id="204622017488417136">તમારું ડિવાઇસ Chromeના અગાઉ ઇન્ટોલ કરેલા વર્ઝન પર પરત ફરશે. તમામ વપરાશકર્તા એકાઉન્ટ અને સ્થાનિક ડેટા દૂર કરવામાં આવશે. આ પહેલાંના જેવું કરી શકાતું નથી.</translation> +<translation id="2046702855113914483">રામેન - જાપાનના એક પ્રકારના નૂડલ</translation> <translation id="2048182445208425546">તમારા નેટવર્ક ટ્રાફિકની ઍક્સેસ</translation> <translation id="2048653237708779538">ક્રિયા ઉપલબ્ધ નથી</translation> <translation id="2050339315714019657">પોર્ટ્રેટ</translation> @@ -924,6 +926,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> ઉમેર્યું</translation> <translation id="2464089476039395325">HTTP પ્રૉક્સી</translation> <translation id="2468205691404969808">તમારી પસંદગીઓ યાદ રાખવા માટે કુકીનો ઉપયોગ કરે છે, પછી ભલે તમે તે પેજની મુલાકાત ન પણ લો</translation> +<translation id="2468402215065996499">ટેમાગોચી</translation> <translation id="2469375675106140201">જોડણીની તપાસને કસ્ટમાઇઝ કરો</translation> <translation id="247051149076336810">ફાઇલ શેર URL</translation> <translation id="2470702053775288986">અસમર્થિત એક્સ્ટેન્શન્સ અક્ષમ કર્યાં</translation> @@ -1128,6 +1131,7 @@ <translation id="2770465223704140727">સૂચિમાંથી દૂર કરો</translation> <translation id="2770690685823456775">એક બીજા ફોલ્ડરમાં તમારા બધા પાસવર્ડની નિકાસ કરો</translation> <translation id="2771268254788431918">મોબાઇલ ડેટા ચાલુ કર્યો</translation> +<translation id="2771816809568414714">ચીઝ</translation> <translation id="2772936498786524345">સ્નીકી</translation> <translation id="2773288106548584039">લેગસી બ્રાઉઝર સહાય</translation> <translation id="2773802008104670137">આ પ્રકારની ફાઇલ તમારા કમ્પ્યુટરને નુકસાન પહોંચાડી શકે છે.</translation> @@ -1651,6 +1655,7 @@ <translation id="3616113530831147358">ઑડિઓ</translation> <translation id="3616741288025931835">બ્રાઉઝિંગ ડેટા &સાફ કરો...</translation> <translation id="3617891479562106823">બૅકગ્રાઉન્ડ અનુપલબ્ધ છે. થોડા સમય પછી ફરી પ્રયાસ કરો.</translation> +<translation id="3619115746895587757">કૅપુચિનો</translation> <translation id="3623574769078102674">આ નિરીક્ષણ કરેલ વપરાશકર્તાનું સંચાલન <ph name="MANAGER_EMAIL" /> દ્વારા કરવામાં આવશે.</translation> <translation id="3624567683873126087">ઉપકરણ અનલૉક કરો અને Google એકાઉન્ટમાં સાઇન ઇન કરો</translation> <translation id="3625258641415618104">સ્ક્રીનશોટ્સ અક્ષમ કર્યા</translation> @@ -2129,6 +2134,7 @@ <translation id="4359717112757026264">સિટિસ્કેપ</translation> <translation id="4361142739114356624">આ ક્લાઇન્ટ પ્રમાણપત્ર માટેની ખાનગી કી ખૂટે છે અથવા તો અમાન્ય છે</translation> <translation id="4363771538994847871">કોઈ કાસ્ટ ગંતવ્યો મળ્યાં ન હતાં. સહાયની જરૂર છે?</translation> +<translation id="4364327530094270451">ટેટી</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />, એક વિંડો શેર કરી રહી છે.</translation> <translation id="4364830672918311045">નોટિફિકેશન બતાવો</translation> <translation id="4365673000813822030">ઊફ્ફ, સમન્વયન કામ કરતું બંધ થઈ ગયું છે. </translation> @@ -2318,6 +2324,7 @@ <translation id="4690091457710545971"><Intel વાઇ-ફાઇ ફર્મવેયર દ્વારા ચાર ફાઇલ જનરેટ થઈ: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. પહેલી ત્રણ રજિસ્ટર ડમ્પ ધરાવતી બાઇનરી ફાઇલો છે અને Intel દ્વારા ખાતરી આપવામાં આવી છે કે તેમાં વ્યક્તિગત કે ઉપકરણની ઓળખ છતી કરે તેવી કોઈ માહિતી નથી. છેલ્લી ફાઇલ Intel ફર્મવેયરનો અમલ બજાવણી ટ્રેસ છે; જેમાં કોઈપણ વ્યક્તિગત અથવા ઉપકરણની ઓળખ છતી કરતી માહિતીને સ્ક્રબ કરવામાં આવેલ છે, પણ તે અહીં પ્રદર્શિત કરવા માટે ખૂબ મોટી છે. આ ફાઇલો તમારા ઉપકરણમાં તાજેતરની વાઇ-ફાઇ સમસ્યાઓના પ્રતિસાદમાં જનરેટ કરવામાં આવી છે અને આ સમસ્યાઓનું નિવારણ કરવામાં સહાય કરવા માટે તેને Intel સાથે શેર કરવામાં આવી શકે છે.></translation> <translation id="469230890969474295">OEM ફોલ્ડર</translation> <translation id="4692623383562244444">શોધ એંજીન્સ</translation> +<translation id="4693155481716051732">સુશી - માછલીની એક જાપાની વાનગી</translation> <translation id="4694024090038830733">પ્રિન્ટરની ગોઠવણી વ્યવસ્થાપક દ્વારા સંભાળવામાં આવે છે.</translation> <translation id="4694604912444486114">વાનર</translation> <translation id="4697551882387947560">જ્યારે બ્રાઉઝિંગ સત્ર સમાપ્ત થાય</translation> @@ -2372,6 +2379,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> માટેનો પાસવર્ડ </translation> <translation id="4777825441726637019">Play સ્ટોર</translation> <translation id="4779083564647765204">ઝૂમ કરો</translation> +<translation id="4779136857077979611">ઓનિગિરી - ભાતની એક જાપાની વાનગી</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{પૉપ-અપ બ્લૉક કર્યુંં છે}one{# પૉપ-અપ બ્લૉક કર્યુંં છે}other{# પૉપ-અપ બ્લૉક કર્યુંં છે}}</translation> <translation id="4780321648949301421">પેજ આ રીતે સાચવો...</translation> <translation id="4785719467058219317">તમે આ વેબસાઇટમાં રજિસ્ટર ન થયેલા સુરક્ષા કોડનો ઉપયોગ કરી રહ્યા છો</translation> @@ -2384,6 +2392,7 @@ <translation id="4801448226354548035">એકાઉન્ટ્સ છુપાવો</translation> <translation id="4801512016965057443">મોબાઇલ ડેટા રોમિંગને મંજૂરી આપો</translation> <translation id="4804818685124855865">ડિસ્કનેક્ટ કરો</translation> +<translation id="4804827417948292437">એવોકેડો</translation> <translation id="4807098396393229769">કાર્ડ પરનું નામ</translation> <translation id="4808667324955055115">પૉપ-અપ બ્લૉક કરેલ છે:</translation> <translation id="480990236307250886">હોમ પેજ ખોલો</translation> @@ -2478,6 +2487,7 @@ <translation id="4941246025622441835">જ્યારે ઉપકરણની એન્ટરપ્રાઇઝ મેનેજમેન્ટ માટે નોંધણી કરાવો ત્યારે આ ઉપકરણ માગણીનો ઉપયોગ કરો:</translation> <translation id="4941627891654116707">ફૉન્ટનું કદ</translation> <translation id="494286511941020793">પ્રૉક્સી ગોઠવણી સહાય</translation> +<translation id="4943368462779413526">ફૂટબૉલ</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" સિરીઅલ પોર્ટ સાથે કનેક્ટ કરવા માગે છે</translation> <translation id="495170559598752135">ક્રિયાઓ</translation> <translation id="4953689047182316270">ઍક્સેસિબિલિટી ઇવેન્ટનો જવાબ આપો</translation> @@ -2547,6 +2557,7 @@ <translation id="5067399438976153555">હંમેશાં ચાલુ</translation> <translation id="5067867186035333991"><ph name="HOST" /> તમારા માઇક્રોફોનને ઍક્સેસ કરવા માંગે છે કે કેમ તે પૂછો</translation> <translation id="5068918910148307423">ડેટા મોકલવાનું અને પ્રાપ્ત કરવાનું સમાપ્ત કરવા માટે તાજેતરમાં બંધ કરેલ સાઇટ્સને મંજૂરી આપશો નહીં</translation> +<translation id="5068919226082848014">પિઝા</translation> <translation id="5072052264945641674">કર્સરનું કદ સમાયોજિત કરો</translation> <translation id="5072836811783999860">સંચાલિત બુકમાર્ક્સ દર્શાવો</translation> <translation id="5074318175948309511">નવી સેટિંગ્સ પ્રભાવમાં આવે તે પહેલાં આ પૃષ્ઠને ફરીથી લોડ કરવાની જરૂર પડી શકે છે.</translation> @@ -2581,6 +2592,7 @@ <translation id="5117930984404104619">મુલાકાત લીધેલ URL સહિત, અન્ય એક્સ્ટેન્શન્સની વર્તણૂકનું નિરીક્ષણ કરો</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">તમારી હાર્ડ ડિસ્ક પૂરેપૂરી ભરેલી છે. કૃપા કરીને બીજી જગ્યાએ સાચવો અથવા હાર્ડ ડિસ્કમાં વધારે જગ્યા કરી આપો.</translation> +<translation id="5123433949759960244">બાસ્કેટબૉલ</translation> <translation id="5125751979347152379">અમાન્ય URL.</translation> <translation id="5127805178023152808">સમન્વયન બંધ છે</translation> <translation id="5127881134400491887">નેટવર્ક કનેક્શન્સનું સંચાલન કરો</translation> @@ -3266,6 +3278,7 @@ <translation id="6166185671393271715">Chrome માં પાસવર્ડ્સને આયાત કરો</translation> <translation id="6169040057125497443">કૃપા કરીને તમારો માઇક્રોફોન તપાસો.</translation> <translation id="6169666352732958425">ડેસ્કટૉપને કાસ્ટ કરવામાં અસમર્થ.</translation> +<translation id="6170470584681422115">સેન્ડવિચ</translation> <translation id="6171948306033499786">છાપવાનું થોભાવો</translation> <translation id="6173623053897475761">તમારો પિન ફરી ટાઇપ કરો</translation> <translation id="6175314957787328458">Microsoft ડોમેન GUID</translation> @@ -3696,6 +3709,7 @@ <translation id="6870888490422746447">આના પર શેર કરવા માટે એક ઍપ્લિકેશન પસંદ કરો:</translation> <translation id="6871644448911473373">OCSP પ્રતિસાદકર્તા: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">તમે દાખલ કરેલ પાસવર્ડ સર્વર દ્વારા નકારવામાં આવ્યો હતો.</translation> +<translation id="6876155724392614295">બાઇક</translation> <translation id="6878422606530379992">સેન્સરને મંજૂરી છે</translation> <translation id="6880587130513028875">આ પૃષ્ઠ પર છબીઓ અવરોધિત હતી.</translation> <translation id="6883319974225028188">અરેરે! ડિવાઇસ ગોઠવણી સાચવવામાં સિસ્ટમ નિષ્ફળ ગઈ.</translation> @@ -4262,6 +4276,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> વિશે</translation> <translation id="7772773261844472235">તમારા Chromebookની સ્થિતિ તપાસો</translation> <translation id="7773726648746946405">સત્ર સ્ટોરેજ</translation> +<translation id="7774365994322694683">પક્ષી</translation> <translation id="7776701556330691704">કોઈ વૉઇસ મળ્યાં નથી</translation> <translation id="7781335840981796660">બધા વપરાશકર્તા એકાઉન્ટ્સ અને સ્થાનિક ડેટા દૂર કરવામાં આવશે.</translation> <translation id="7782102568078991263">Google દ્વારા કોઈ વધુ સૂચનો</translation> @@ -4661,6 +4676,7 @@ <translation id="8386903983509584791">સ્કૅન પૂર્ણ થયું</translation> <translation id="8389492867173948260">આ એક્સટેંશનને તમે મુલાકાત લો તે વેબસાઇટ પરનો તમારો બધો ડેટા વાંચવાની અને બદલવાની મંજૂરી આપો:</translation> <translation id="8390449457866780408">સર્વર અનુપલબ્ધ.</translation> +<translation id="8391218455464584335">વિનાઇલ</translation> <translation id="8391712576156218334">છબી અનુપલબ્ધ. થોડા સમય પછી ફરી પ્રયાસ કરો.</translation> <translation id="8392234662362215700">કીબોર્ડ લેઆઉટ સ્વિચ કરવા માટે Control-Shift-Space દબાવો</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> માટે વિકલ્પો મેનૂ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 6f2a9d7..073b9bde 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">अपने डिवाइस, ऐप और वेब पर खोजें.</translation> <translation id="114721135501989771">Chrome में Google स्मार्ट पाएं</translation> <translation id="1149401351239820326">समाप्ति माह</translation> +<translation id="1150565364351027703">धूप के चश्मे</translation> <translation id="1151917987301063366"><ph name="HOST" /> को सेंसर एक्सेस करने की हमेशा मंज़ूरी दें</translation> <translation id="1153356358378277386">युग्मित डिवाइस</translation> <translation id="1156488781945104845">मौजूदा समय</translation> @@ -165,7 +166,7 @@ <translation id="1235458158152011030">ज्ञात नेटवर्क</translation> <translation id="123578888592755962">डिस्क भरी हुई है</translation> <translation id="1238191093934674082">खुला VPN</translation> -<translation id="124116460088058876">अधिक भाषाएं</translation> +<translation id="124116460088058876">ज़्यादा भाषाएं</translation> <translation id="1241753985463165747">लागू किए जाने पर अभी वाली वेबसाइट पर मौजूद अपना सभी डेटा पढ़ें और बदलें</translation> <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> आपकी सेटिंग को रीसेट करना चाहता है.</translation> <translation id="1243314992276662751">अपलोड करें</translation> @@ -259,7 +260,7 @@ <translation id="140723521119632973">सेल्युलर एक्टिवेशन</translation> <translation id="1407489512183974736">मध्य में काटा गया</translation> <translation id="1408504635543854729">डिवाइस की सामग्री फ़ाइल ऐप्लिकेशन में एक्सप्लोर करें. सामग्री किसी व्यवस्थापक ने प्रतिबंधित की है और उसे बदला नहीं जा सकता.</translation> -<translation id="1408789165795197664">उन्नत...</translation> +<translation id="1408789165795197664">बेहतर...</translation> <translation id="1409390508152595145">'निगरानी में रखा गया उपयोगकर्ता' बनाएं</translation> <translation id="1410197035576869800">ऐप्लिकेशन आइकॉन</translation> <translation id="1410616244180625362"><ph name="HOST" /> को अपना कैमरा एक्सेस करते रहने दें</translation> @@ -480,7 +481,7 @@ <translation id="1744108098763830590">पेजभूमि पेज</translation> <translation id="1745520510852184940">हमेशा ऐसा करें</translation> <translation id="175196451752279553">बंद किए गए टैब पु&न: खोलें</translation> -<translation id="1753905327828125965">सबसे अधिक देखे गए</translation> +<translation id="1753905327828125965">सबसे ज़्यादा देखे गए</translation> <translation id="1756681705074952506">इनपुट का तरीका</translation> <translation id="1757301747492736405">अनइंस्टॉल करना बाकी है</translation> <translation id="175772926354468439">थीम सक्षम करें</translation> @@ -595,7 +596,7 @@ <translation id="1924559387127953748"><ph name="IDS_SHORT_PRODUCT_NAME" /> में Google की स्मार्ट सुविधाएं पाएं</translation> <translation id="192494336144674234">इसके साथ खोलें</translation> <translation id="1925021887439448749">कस्टम वेब पता डालें</translation> -<translation id="1926339101652878330">ये सेटिंग एंटरप्राइज़ नीति द्वारा नियंत्रित होती हैं. कृपया अधिक जानकारी के लिए अपने नियंत्रक से संपर्क करें.</translation> +<translation id="1926339101652878330">ये सेटिंग एंटरप्राइज़ नीति द्वारा नियंत्रित होती हैं. कृपया ज़्यादा जानकारी के लिए अपने नियंत्रक से संपर्क करें.</translation> <translation id="1927632033341042996">उंगली <ph name="NEW_FINGER_NUMBER" /></translation> <translation id="1928202201223835302">पुराना पिन डालें</translation> <translation id="1929546189971853037">अपने प्रवेश किए हुए सभी डिवाइस पर अपना ब्राउज़िंग इतिहास पढ़ें</translation> @@ -617,7 +618,7 @@ <translation id="1970368523891847084">आप वीडियो मोड में हैं</translation> <translation id="197288927597451399">रखें</translation> <translation id="1974043046396539880">CRL वितरण बिंदु</translation> -<translation id="1974060860693918893">उन्नत</translation> +<translation id="1974060860693918893">बेहतर</translation> <translation id="1974821797477522211">नेटवर्क से कनेक्ट करें</translation> <translation id="1975841812214822307">निकालें...</translation> <translation id="1976150099241323601">सुरक्षा डिवाइस में साइन इन करें</translation> @@ -646,7 +647,7 @@ <translation id="2019718679933488176">ऑडियो नए टैब में &खोलें</translation> <translation id="2020183425253392403">नेटवर्क पता सेटिंग दिखाएं</translation> <translation id="2023167225947895179">पिन का अनुमान लगाना आसान हो सकता है</translation> -<translation id="202352106777823113">डाउनलोड बहुत अधिक समय ले रहा था और उसे नेटवर्क द्वारा रोक दिया गया था.</translation> +<translation id="202352106777823113">डाउनलोड बहुत ज़्यादा समय ले रहा था और उसे नेटवर्क द्वारा रोक दिया गया था.</translation> <translation id="2025632980034333559"><ph name="APP_NAME" /> क्रैश हो गया है. एक्सटेंशन को फिर से लोड करने के लिए यह गुब्बारा क्लिक करें.</translation> <translation id="2034346955588403444">अन्य वाई-फ़ाई नेटवर्क जोड़ें</translation> <translation id="203574396658008164">लॉक स्क्रीन से नोट लेना सक्षम करें</translation> @@ -656,6 +657,7 @@ <translation id="2045117674524495717">कीबोर्ड शॉर्टकट सहायक</translation> <translation id="2045969484888636535">कुकी अवरोधित करना जारी रखें</translation> <translation id="204622017488417136">आपके डिवाइस को Chrome के इसे पहले इंस्टॉल किए गए वर्शन पर वापस ले जाया जाएगा. सभी उपयोगकर्ता खाते और स्थानीय डेटा हटा दिइ जाएंगे. इसे पहले जैसा नहीं किया जा सकता.</translation> +<translation id="2046702855113914483">रेमन</translation> <translation id="2048182445208425546">अपना नेटवर्क ट्रैफ़िक ऐक्सेस करें</translation> <translation id="2048653237708779538">कार्रवाई उपलब्ध नहीं है</translation> <translation id="2050339315714019657">पोर्ट्रेट</translation> @@ -673,7 +675,7 @@ <translation id="2078019350989722914">छोड़ने के पहले चेतावनी दें (<ph name="KEY_EQUIVALENT" />)</translation> <translation id="2079053412993822885">अगर आप अपने प्रमाणपत्रों में से किसी एक को हटाते हैं, तो आप आगे इसका उपयोग स्वयं की पहचान करने के लिए नहीं कर सकते हैं.</translation> <translation id="2079545284768500474">वापस लाएं</translation> -<translation id="2080070583977670716">अधिक सेटिंग</translation> +<translation id="2080070583977670716">ज़्यादा सेटिंग</translation> <translation id="2087822576218954668">प्रिंट: <ph name="PRINT_NAME" /></translation> <translation id="2089566709556890888">Google Chrome के ज़रिए सुरक्षित रूप से ब्राउज़ करें</translation> <translation id="2089795179672254991">जब कोई साइट क्लिपबोर्ड पर कॉपी किए गए लेख और इमेज देखना चाहे, तो इसके लिए पूछें (सुझाया गया)</translation> @@ -707,7 +709,7 @@ <translation id="2136372518715274136">नया पासवर्ड डालें</translation> <translation id="2136476978468204130">आपने जो पासफ़्रेज़ डाला है वह गलत है</translation> <translation id="2137068468602026500">वेब ब्राउज़र के अंतर्गत <ph name="BEGIN_BOLD" />Microsoft Edge<ph name="END_BOLD" /> क्लिक करें</translation> -<translation id="2138398485845393913">"<ph name="DEVICE_NAME" />" से कनेक्शन अभी भी प्रगति में है</translation> +<translation id="2138398485845393913">"<ph name="DEVICE_NAME" />" से कनेक्शन अब भी प्रगति में है</translation> <translation id="214169863967063661">प्रकटन सेटिंग खोलें</translation> <translation id="2142328300403846845">लिंक को इस रूप में खोलें</translation> <translation id="2143765403545170146">टूलबार को हमेशा पूर्ण स्क्रीन में दिखाएं</translation> @@ -776,7 +778,7 @@ <translation id="2224551243087462610">फ़ोल्डर का नाम संपादित करें</translation> <translation id="2226449515541314767">इस साइट को MIDI डिवाइस का पूर्ण नियंत्रण रखने से अवरोधित कर दिया गया है.</translation> <translation id="2226720438730111184">हमें बताएं कि क्या हो रहा है</translation> -<translation id="2229161054156947610">1 घंटा से अधिक शेष है</translation> +<translation id="2229161054156947610">1 घंटा से ज़्यादा शेष है</translation> <translation id="222931766245975952">फ़ाइल छोटी हो गई</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="223106756035922488">आज का डूडल देखने के लिए क्लिक करें</translation> @@ -809,7 +811,7 @@ <translation id="2270450558902169558"><ph name="DOMAIN" /> डोमेन के किसी भी डिवाइस से डेटा का आदान-प्रदान करें</translation> <translation id="2270627217422354837">इन डोमेन के किसी भी डिवाइस से डेटा का आदान-प्रदान करें: <ph name="DOMAINS" /></translation> <translation id="2272570998639520080">मार्टिनी ग्लास</translation> -<translation id="2276503375879033601">अधिक ऐप्स जोड़ें</translation> +<translation id="2276503375879033601">ज़्यादा ऐप्स जोड़ें</translation> <translation id="2277255602909579701">सभी कुकी और साइट डेटा</translation> <translation id="2277769717710009150">{COUNT,plural, =1{1 आइटम कॉपी किया गया}one{# आइटम कॉपी किए गए}other{# आइटम कॉपी किए गए}}</translation> <translation id="2278562042389100163">ब्राउज़र विंडो खोलें</translation> @@ -901,7 +903,7 @@ <translation id="2435248616906486374">नेटवर्क डिस्कनेक्ट है</translation> <translation id="2435457462613246316">पासवर्ड दिखाएं</translation> <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> को सभी <ph name="PROTOCOL" /> लिंक खोलने दें?</translation> -<translation id="2436707352762155834">न्यूनतम</translation> +<translation id="2436707352762155834">कम से कम</translation> <translation id="2440604414813129000">&स्रोत देखें</translation> <translation id="2445081178310039857">एक्सटेंशन मूल निर्देशिका आवश्यक है.</translation> <translation id="2445484935443597917">नई प्रोफ़ाइल बनाएं</translation> @@ -921,6 +923,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> जोड़ा गया</translation> <translation id="2464089476039395325">HTTP प्रॉक्सी</translation> <translation id="2468205691404969808">आपकी पसंद याद रखने के लिए कुकी का इस्तेमाल करती है, भले ही आप उन पेजों पर नहीं जाते</translation> +<translation id="2468402215065996499">तमागोची</translation> <translation id="2469375675106140201">स्पेलिंग जाँचने वाली सुविधा पसंद के मुताबिक बनाएं</translation> <translation id="247051149076336810">फ़ाइल शेयर यूआरएल</translation> <translation id="2470702053775288986">असमर्थित एक्सटेंशन अक्षम</translation> @@ -940,7 +943,7 @@ <translation id="2490782392574942205">अपने सभी कंप्यूटर पर अपने एक्सटेंशन पाने के लिए, साइन इन करें और सिंक चालू करें</translation> <translation id="249113932447298600">क्षमा करें, डिवाइस <ph name="DEVICE_LABEL" /> इस समय समर्थित नहीं है.</translation> <translation id="249303669840926644">पंजीकरण पूरा नहीं किया जा सका</translation> -<translation id="2495777824269688114">अधिक सुविधाएं खोजें या उत्तर पाएं. सहायता के लिए “?” चुनें.</translation> +<translation id="2495777824269688114">ज़्यादा सुविधाएं खोजें या उत्तर पाएं. सहायता के लिए “?” चुनें.</translation> <translation id="2496180316473517155">ब्राउज़िंग इतिहास...</translation> <translation id="2497229222757901769">माउस की गति</translation> <translation id="2497852260688568942">सिंक को आपके व्यवस्थापक ने अक्षम कर दिया है</translation> @@ -989,7 +992,7 @@ <translation id="255747371423522804">मौजूदा समूह में जोड़ें</translation> <translation id="2558896001721082624">सिस्टम मेन्यू में सुलभता विकल्प हमेशा दिखाएं</translation> <translation id="2562743677925229011"><ph name="SHORT_PRODUCT_NAME" /> में प्रवेश नहीं है</translation> -<translation id="2564520396658920462">AppleScript के ज़रिए JavaScript काम में लेने की सुविधा बंद है. उसे चालू करने के लिए, मेन्यू बार से, View > Developer > Allow JavaScript from Apple Events पर जाएं. अधिक जानकारी के लिए: https://support.google.com/chrome/?p=applescript</translation> +<translation id="2564520396658920462">AppleScript के ज़रिए JavaScript काम में लेने की सुविधा बंद है. उसे चालू करने के लिए, मेन्यू बार से, View > Developer > Allow JavaScript from Apple Events पर जाएं. ज़्यादा जानकारी के लिए: https://support.google.com/chrome/?p=applescript</translation> <translation id="2564653188463346023">स्पेलिंग की बेहतर जांच</translation> <translation id="2566124945717127842">अपने <ph name="IDS_SHORT_PRODUCT_NAME" /> डिवाइस को बिल्कुल नए जैसा रीसेट करने के लिए पावरवॉश करें.</translation> <translation id="2568774940984945469">जानकारी बार कंटेनर</translation> @@ -1081,7 +1084,7 @@ <translation id="270516211545221798">टचपैड की गति</translation> <translation id="2705736684557713153">स्क्रीन के सबसे नीचे तक स्क्रोल करें और अगर 'झटपट टेदरिंग' की सुविधा दिखाई देती है, तो उसे चालू करें. अगर वह नहीं दिखाई देती, तो आप पूरी तरह तैयार हैं.</translation> <translation id="2707024448553392710">घटक डाउनलोड करना</translation> -<translation id="270921614578699633">औसत से अधिक</translation> +<translation id="270921614578699633">औसत से ज़्यादा</translation> <translation id="2709453993673701466">सिंक और मनमुताबिक बनाने की सुविधा के चालू होने से पहले उन्हें प्रबंधित करना चाहते हैं? <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> पर जाएं.</translation> <translation id="2709516037105925701">ऑटोमैटिक भरना</translation> <translation id="271033894570825754">नया</translation> @@ -1124,6 +1127,7 @@ <translation id="2770465223704140727">सूची से निकालें</translation> <translation id="2770690685823456775">अपने पासवर्ड किसी दूसरे फ़ोल्डर में निर्यात करें</translation> <translation id="2771268254788431918">मोबाइल डेटा चालू किया गया</translation> +<translation id="2771816809568414714">पनीर</translation> <translation id="2772936498786524345">स्नीकी</translation> <translation id="2773288106548584039">पुराने ब्राउज़र के लिए मदद</translation> <translation id="2773802008104670137">इस प्रकार की फ़ाइल आपके कंप्यूटर को हानि पहुंचा सकती है.</translation> @@ -1187,7 +1191,7 @@ <translation id="2861941300086904918">नेटिव क्लाइंट सुरक्षा प्रबंधक</translation> <translation id="2864601841139725659">अपना प्रोफ़ाइल चित्र सेट करें</translation> <translation id="2867768963760577682">छोटे टैब के रूप में खोलें</translation> -<translation id="2868746137289129307">यह एक्सटेंशन पुराना हो चुका है और एंटरप्राइज़ नीति द्वारा अक्षम कर दिया गया है. अधिक नया वर्शन उपलब्ध हो जाने पर वह अपने आप सक्षम हो सकता है.</translation> +<translation id="2868746137289129307">यह एक्सटेंशन पुराना हो चुका है और एंटरप्राइज़ नीति द्वारा अक्षम कर दिया गया है. ज़्यादा नया वर्शन उपलब्ध हो जाने पर वह अपने आप सक्षम हो सकता है.</translation> <translation id="2870560284913253234">साइट</translation> <translation id="2870909136778269686">अपडेट हो रहे हैं...</translation> <translation id="2871813825302180988">यह खाता पहले से ही इस डिवाइस पर उपयोग किया जा रहा है.</translation> @@ -1198,7 +1202,7 @@ <translation id="2876336351874743617">उंगली दो</translation> <translation id="288042212351694283">अपने यूनीवर्सल सेकंड फ़ैक्टर डिवाइस एक्सेस करें</translation> <translation id="2881076733170862447">जब आप एक्सटेंशन को क्लिक करते हैं</translation> -<translation id="2881966438216424900">अंतिम बार पहुंच प्राप्त करने की तिथि:</translation> +<translation id="2881966438216424900">अंतिम बार पहुंच प्राप्त करने की तारीख:</translation> <translation id="2882943222317434580"><ph name="IDS_SHORT_PRODUCT_NAME" /> फिर से प्रारंभ होगा और जल्दी ही रीेसेट हो जाएगा</translation> <translation id="2885378588091291677">काम का प्रबंधक</translation> <translation id="2885729872133513017">सर्वर के जवाब को डिकोड करते समय कोई परेशानी हुई.</translation> @@ -1326,7 +1330,7 @@ <translation id="3090193911106258841">ऑडियो और वीडियो इनपुट ऐक्सेस हो रहा है</translation> <translation id="3090819949319990166">बाहरी crx फ़ाइल की <ph name="TEMP_CRX_FILE" /> में कॉपी नहीं बनाई जा सकती.</translation> <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" युग्मित किया गया</translation> -<translation id="3101709781009526431">दिनांक और समय</translation> +<translation id="3101709781009526431">तारीख और समय</translation> <translation id="310671807099593501">साइट ब्लूटूथ का इस्तेमाल कर रही है</translation> <translation id="3115147772012638511">संचय की प्रतीक्षा कर रहा है...</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" />सहायता</translation> @@ -1361,7 +1365,7 @@ <translation id="3151786313568798007">अभिविन्यास</translation> <translation id="3153862085237805241">कार्ड सेव करें</translation> <translation id="3154351730702813399">डिवाइस व्यवस्थापक आपकी ब्राउज़िंग गतिविधि की निगरानी कर सकता है.</translation> -<translation id="3154429428035006212">एक माह से अधिक समय से ऑफ़लाइन</translation> +<translation id="3154429428035006212">एक माह से ज़्यादा समय से ऑफ़लाइन</translation> <translation id="3156531245809797194">Chrome का इस्तेमाल करने के लिए, कृपया साइन इन करें</translation> <translation id="3157931365184549694">पुनर्स्थापित करें</translation> <translation id="3158033540161634471">अपना फ़िंगरप्रिंट सेट अप करें</translation> @@ -1505,7 +1509,7 @@ <translation id="3405763860805964263">...</translation> <translation id="3406605057700382950">बुकमार्क बार &दिखाएं</translation> <translation id="3409785640040772790">मैप</translation> -<translation id="3410832398355316179">इस उपयोगकर्ता को हटाए जाने पर, इससे जुड़ीं सभी फ़ाइलों और स्थानीय डेटा को हमेशा के लिए मिटा दिया जाएगा. <ph name="USER_EMAIL" /> अभी भी बाद में साइन इन कर सकते हैं.</translation> +<translation id="3410832398355316179">इस उपयोगकर्ता को हटाए जाने पर, इससे जुड़ीं सभी फ़ाइलों और स्थानीय डेटा को हमेशा के लिए मिटा दिया जाएगा. <ph name="USER_EMAIL" /> अब भी बाद में साइन इन कर सकते हैं.</translation> <translation id="3412265149091626468">चयन पर जाएं</translation> <translation id="3413122095806433232">CA जारीकर्ता: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">आकार:</translation> @@ -1549,7 +1553,7 @@ <translation id="3468999815377931311">Android फ़ोन</translation> <translation id="3470442499439619530">इस उपयोगकर्ता को हटाएं</translation> <translation id="3473479545200714844">स्क्रीन आवर्द्धक</translation> -<translation id="3475843873335999118">माफ़ कीजिए, आपके फ़िंगरप्रिंट की अभी भी पहचान नहीं हुई हैैै. कृपया अपना पासवर्ड डालें.</translation> +<translation id="3475843873335999118">माफ़ कीजिए, आपके फ़िंगरप्रिंट की अब भी पहचान नहीं हुई हैैै. कृपया अपना पासवर्ड डालें.</translation> <translation id="3476303763173086583">इस्तेमाल और निदान से जुड़ा डेटा भेजें. Google को निदान, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने आप भेजकर, अपने बच्चे के Android अनुभव को बेहतर बनाने में मदद करें. इसका इस्तेमाल आपके बच्चे की पहचान करने के लिए नहीं किया जाएगा. यह सिस्टम और ऐप्लिकेशन की स्थिरता और दूसरे सुधारों में मदद करेगा. कुछ एग्रीगेट डेटा Google ऐप्लिकेशन और पार्टनर, जैसे कि Android डेवलपरों की भी मदद करेगा. यह <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> डिवाइस के मालिक ने लागू की है. डिवाइस का मालिक यह चुन सकता है कि निदान और इस डिवाइस के इस्तेमाल से जुड़ा डेटा Google को भेजना है. अगर आपके बच्चे के लिए दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है. <ph name="BEGIN_LINK2" />ज़्यादा जानें<ph name="END_LINK2" /></translation> <translation id="347670947055184738">ओह! सिस्टम आपके डिवाइस की नीति फ़ेच नहीं कर सका.</translation> <translation id="347785443197175480"><ph name="HOST" /> को अपने कैमरे और माइक्रोफ़ोन को एक्सेस करते रहन दें</translation> @@ -1644,6 +1648,7 @@ <translation id="3616113530831147358">ऑडियो</translation> <translation id="3616741288025931835">ब्राउज़िंग डेटा &साफ़ करें...</translation> <translation id="3617891479562106823">बैकग्राउंड उपलब्ध नहीं हैं. बाद में फिर से कोशिश करें.</translation> +<translation id="3619115746895587757">कैपुचिनो</translation> <translation id="3623574769078102674">'निगरानी में रखे गए इस उपयोगकर्ता' को <ph name="MANAGER_EMAIL" /> प्रबंधित करेगा.</translation> <translation id="3624567683873126087">डिवाइस अनलॉक करें और 'Google खाते' में साइन इन करें</translation> <translation id="3625258641415618104">स्क्रीनशॉट अक्षम हैं</translation> @@ -1686,7 +1691,7 @@ <translation id="3678156199662914018">एक्सटेंशन: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">आपके फ़ीडबैक के लिए धन्यवाद. आप अब ऑफ़लाइन हैं और आपकी रिपोर्ट बाद में भेज दी जाएगी.</translation> <translation id="3682824389861648626">माउस की गति की सीमा</translation> -<translation id="3683023058278427253">हमें आपके डोमेन के लिए एक से अधिक प्रकार के लाइसेंस मिले हैं. कृपया जारी रखने के लिए एक को चुनें.</translation> +<translation id="3683023058278427253">हमें आपके डोमेन के लिए एक से ज़्यादा प्रकार के लाइसेंस मिले हैं. कृपया जारी रखने के लिए एक को चुनें.</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> स्क्रीन शेयर करने का अनुरोध</translation> <translation id="368789413795732264">फ़ाइल में लिखने का प्रयास करते समय कोई गड़बड़ी आई: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">आपके द्वारा ऐप्लिकेशन में खोली गईं फ़ाइलों और फ़ोल्डर में लिखें</translation> @@ -1803,7 +1808,7 @@ <translation id="3834775135533257713">"<ph name="TO_INSTALL_APP_NAME" />" ऐप्लिकेशन जोड़ा नहीं जा सका क्योंकि उसका "<ph name="INSTALLED_APP_NAME" />" से विरोध है.</translation> <translation id="3835522725882634757">ओह, नहीं! यह सर्वर ऐसे डेटा भेज रहा है जो <ph name="PRODUCT_NAME" /> नहीं समझ सकता. कृपया <ph name="BEGIN_LINK" />किसी बग की रिपोर्ट करें<ph name="END_LINK" />, और <ph name="BEGIN2_LINK" />अपूर्ण सूची<ph name="END2_LINK" /> शामिल करें.</translation> <translation id="3838085852053358637">एक्सटेंशन लोड नहीं हो सका</translation> -<translation id="3838486795898716504">अधिक <ph name="PAGE_TITLE" /></translation> +<translation id="3838486795898716504">ज़्यादा <ph name="PAGE_TITLE" /></translation> <translation id="3838543471119263078">कुकी और अन्य साइट और प्लग इन डेटा</translation> <translation id="383891835335927981">कोई भी साइट ज़ूम इन या ज़ूम आउट नहीं की गई है</translation> <translation id="3839516600093027468"><ph name="HOST" /> को क्लिपबोर्ड देखने से हमेशा ब्लॉक करें</translation> @@ -1829,7 +1834,7 @@ <translation id="3869917919960562512">गलत इंडेक्स.</translation> <translation id="3870931306085184145"><ph name="DOMAIN" /> के लिए सेव किया गया कोई पासवर्ड नहीं है</translation> <translation id="3871092408932389764">सबसे कम</translation> -<translation id="3872220884670338524">अधिक कार्रवाइयां, <ph name="DOMAIN" /> पर <ph name="USERNAME" /> के लिए सेव किया गया खाता</translation> +<translation id="3872220884670338524">ज़्यादा कार्रवाइयां, <ph name="DOMAIN" /> पर <ph name="USERNAME" /> के लिए सेव किया गया खाता</translation> <translation id="3872991219937722530">डिस्क में स्पेस खाली करें अन्यथा डिवाइस प्रतिक्रिया नहीं देगा.</translation> <translation id="3873315167136380065">इसे चालू करने के लिए, <ph name="BEGIN_LINK" />सिंक रीसेट करें<ph name="END_LINK" /> ताकि आपका सिंक करने का लंबा पासवर्ड हटाया जा सके</translation> <translation id="3873915545594852654">एआरसी++ के साथ कोई समस्या हुई.</translation> @@ -1844,7 +1849,7 @@ <translation id="389589731200570180">अतिथियों से शेयर करें</translation> <translation id="3898521660513055167">टोकन स्थिति</translation> <translation id="389901847090970821">कीबोर्ड चुनें</translation> -<translation id="3899879303189199559">एक वर्ष से अधिक समय से ऑफ़लाइन</translation> +<translation id="3899879303189199559">एक वर्ष से ज़्यादा समय से ऑफ़लाइन</translation> <translation id="3900966090527141178">पासवर्ड निर्यात करें</translation> <translation id="3901991538546252627"><ph name="NAME" /> से कनेक्ट हो रहा है</translation> <translation id="3905761538810670789">ऐप को ठीक करें</translation> @@ -1967,7 +1972,7 @@ <translation id="4087089424473531098">एक्सटेंशमन बनाया गया: <ph name="EXTENSION_FILE" /></translation> -<translation id="4087470595660267445">अपने Chromebook पर Google Play से ऐप्लिकेशन और गेम इंस्टॉल करें. <a target="_blank" href="<ph name="URL" />">अधिक जानें</a></translation> +<translation id="4087470595660267445">अपने Chromebook पर Google Play से ऐप्लिकेशन और गेम इंस्टॉल करें. <a target="_blank" href="<ph name="URL" />">ज़्यादा जानें</a></translation> <translation id="4088095054444612037">समूह के लिए स्वीकार करें</translation> <translation id="4089235344645910861">सेटिंग सेव की गई. सिंक शुरू हो गया.</translation> <translation id="4090103403438682346">सत्यापित एक्सेस सक्षम करें</translation> @@ -1994,7 +1999,7 @@ <translation id="4118579674665737931">कृपया डिवाइस को फिर से चालू करें और दोबारा कोशिश करें.</translation> <translation id="4120388883569225797">यह सुरक्षा कुंजी रीसेट नहीं हो पा रही है</translation> <translation id="4120817667028078560">पथ बहुत बड़ा है</translation> -<translation id="4121428309786185360">इस तिथि को खत्म</translation> +<translation id="4121428309786185360">इस तारीख को खत्म</translation> <translation id="4124823734405044952">आपकी सुरक्षा कुंजी रीसेट कर दी गई है</translation> <translation id="4124935795427217608">यूनिकॉर्न</translation> <translation id="412730574613779332">स्पैंडेक्स</translation> @@ -2050,8 +2055,8 @@ <translation id="4235965441080806197">साइन इन रद्द करें</translation> <translation id="4242533952199664413">सेटिंग खोलें</translation> <translation id="4242577469625748426">डिवाइस पर नीति सेटिंग इंस्टॉल करने में विफल रहा: <ph name="VALIDATION_ERROR" />.</translation> -<translation id="4244238649050961491">और अधिक स्टाइलस ऐप ढूंढें</translation> -<translation id="424546999567421758">अधिक डिस्क उपयोग का पता चला</translation> +<translation id="4244238649050961491">और ज़्यादा स्टाइलस ऐप ढूंढें</translation> +<translation id="424546999567421758">ज़्यादा डिस्क उपयोग का पता चला</translation> <translation id="424726838611654458">हमेशा Adobe Reader में खोलें</translation> <translation id="4247901771970415646"><ph name="USERNAME" /> से सिंक नहीं किया जा सकता</translation> <translation id="4249248555939881673">नेटवर्क कनेक्शन के लिए प्रतीक्षारत...</translation> @@ -2079,7 +2084,7 @@ <translation id="4285418559658561636">पासवर्ड अपडेट करें</translation> <translation id="4285498937028063278">टैब बड़ी करें</translation> <translation id="428565720843367874">इस फ़ाइल को स्कैन करते समय एंटी-वायरस साफ़्टवेयर अनपेक्षित रूप से विफल रहा.</translation> -<translation id="4287502004382794929">इस डिवाइस का नामांकन करने के लिए आपके पास काफ़ी सॉफ़्टवेयर लाइसेंस नहीं हैं. कृपया और अधिक खरीदने के लिए विक्रय विभाग से संपर्क करें. अगर आपको लगता है कि आपको यह संदेश त्रुटिवश दिखाई दे रहा है, तो कृपया सहायता से संपर्क करें.</translation> +<translation id="4287502004382794929">इस डिवाइस का नामांकन करने के लिए आपके पास काफ़ी सॉफ़्टवेयर लाइसेंस नहीं हैं. कृपया और ज़्यादा खरीदने के लिए विक्रय विभाग से संपर्क करें. अगर आपको लगता है कि आपको यह संदेश त्रुटिवश दिखाई दे रहा है, तो कृपया सहायता से संपर्क करें.</translation> <translation id="4289540628985791613">संक्षिप्त विवरण</translation> <translation id="4291934469232591280">वर्शन: <ph name="VERSION" /></translation> <translation id="4295072614469448764">ऐप्लिकेशन आपके 'टर्मिनल' में उपलब्ध है. आपके 'लॉन्चर' में एक आइकॉन भी मौजूद हो सकता है.</translation> @@ -2088,7 +2093,7 @@ <translation id="4297322094678649474">भाषाएं बदलें</translation> <translation id="4303079906735388947">अपनी 'सुरक्षा कुंजी' के लिए नया पिन सेट अप करें</translation> <translation id="4305227814872083840">लंबा (2 सेकंड)</translation> -<translation id="4306119971288449206">एप्लिकेशन को सामग्री-प्रकार "<ph name="CONTENT_TYPE" />" के साथ दिया जाना चाहिए</translation> +<translation id="4306119971288449206">ऐप्लिकेशन को सामग्री-प्रकार "<ph name="CONTENT_TYPE" />" के साथ दिया जाना चाहिए</translation> <translation id="4309420042698375243"><ph name="NUM_KILOBYTES" />K (<ph name="NUM_KILOBYTES_LIVE" />K लाइव)</translation> <translation id="4310139701823742692">फ़ाइल का फ़ॉर्मेट गलत है. PPD फ़ाइल देखें और फिर से कोशिश करें.</translation> <translation id="431076611119798497">&विवरण</translation> @@ -2116,12 +2121,13 @@ <translation id="4359717112757026264">सिटीस्केप</translation> <translation id="4361142739114356624">इस क्लाइंट प्रमाणपत्र की निजी कुंजी मौजूद नहीं है या अमान्य है</translation> <translation id="4363771538994847871">कोई कास्ट गंतव्य नहीं मिला. सहायता चाहिए?</translation> +<translation id="4364327530094270451">खरबूजा</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> किसी विंडो को शेयर कर रहा है.</translation> <translation id="4364830672918311045">प्रदर्शन नोटिफ़िकेशन</translation> <translation id="4365673000813822030">ओह, समन्वयन ने कार्य करना बंद कर दिया.</translation> <translation id="4366956553771076218"><ph name="APP_NAME" /> के ज़रिए <ph name="ACTION_NAME" />.</translation> <translation id="4370975561335139969">आपके द्वारा डाले गए ईमेल और पासवर्ड का मिलान नहीं हो रहा</translation> -<translation id="437184764829821926">उन्नत फ़ॉन्ट सेटिंग</translation> +<translation id="437184764829821926">बेहतर फ़ॉन्ट सेटिंग</translation> <translation id="4374831787438678295">Linux इंस्टॉलर</translation> <translation id="4375035964737468845">डाउनलोड की गई फ़ाइलें खोलें</translation> <translation id="4377363674125277448">सर्वर के प्रमाणपत्र में कोई समस्या थी.</translation> @@ -2239,7 +2245,7 @@ <translation id="4570387585180509432">पते, फ़ोन नंबर और दूसरी जानकारी</translation> <translation id="4572659312570518089">"<ph name="DEVICE_NAME" />" से कनेक्ट होते समय प्रमाणीकरण रद्द हो गया.</translation> <translation id="4572779512957829735">अपनी 'सुरक्षा कुंजी' का पिन डालें</translation> -<translation id="457386861538956877">अधिक...</translation> +<translation id="457386861538956877">ज़्यादा...</translation> <translation id="4574741712540401491">• <ph name="LIST_ITEM_TEXT" /></translation> <translation id="4576541033847873020">ब्लूटूथ डिवाइस युग्मित करें</translation> <translation id="4579581181964204535"><ph name="HOST_NAME" /> को कास्ट करने में असमर्थ.</translation> @@ -2252,7 +2258,7 @@ <translation id="4595560905247879544">ऐप्स और एक्सटेंशन केवल प्रबंधक (<ph name="CUSTODIAN_NAME" />) के द्वारा बदले जा सकते हैं.</translation> <translation id="4596295440756783523">इन सर्वर की पहचान करने वाले प्रमाणपत्र आपके रिकॉर्ड में हैं</translation> <translation id="4598556348158889687">जगह प्रबंधन</translation> -<translation id="4598776695426288251">एक से अधिक डिवाइस के ज़रिए वाई-फ़ाई उपलब्ध है</translation> +<translation id="4598776695426288251">एक से ज़्यादा डिवाइस के ज़रिए वाई-फ़ाई उपलब्ध है</translation> <translation id="4602466770786743961"><ph name="HOST" /> को अपना कैमरा और माइक्रोफ़ोन हमेशा एक्सेस करने दें</translation> <translation id="4608500690299898628">&ढूंढें...</translation> <translation id="4608520674724523647">सफल नामांकन का चित्र</translation> @@ -2304,6 +2310,7 @@ <translation id="4690091457710545971"><'Intel वाई-फ़ाई फ़र्मवेयर' की जनरेट की हुई चार फ़ाइलें: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. पहली तीन फ़ाइलें बाइनरी हैं जिनमें रजिस्टर डंप शामिल हैं और Intel का दावा है कि इनमें कोई भी निजी या डिवाइस की पहचान करने वाली जानकारी शामिल नहीं है. आखिरी फ़ाइल Intel फ़र्मवेयर का एक एक्ज़ीक्यूशन ट्रेस है जिसमें से किसी भी निजी या डिवाइस की पहचान करने वाली जानकारी को हटा दिया गया है लेकिन यहां दिखाने के लिए उसका आकार बहुत ही बड़ा है. ये फ़ाइलें आपके डिवाइस में वाई-फ़ाई से जुड़ी हाल ही की समस्याओं के जवाब में जनरेट हुई हैं और इन्हें Intel के साथ शेयर किया जाएगा ताकि इन समस्याओं का हल निकालने में मदद मिल सके.></translation> <translation id="469230890969474295">OEM फ़ोल्डर</translation> <translation id="4692623383562244444">सर्च इंजन</translation> +<translation id="4693155481716051732">सुशी</translation> <translation id="4694024090038830733">प्रिंटर कॉन्फ़िगरेशन का काम एडमिन संभालता है.</translation> <translation id="4694604912444486114">बंदर</translation> <translation id="4697551882387947560">ब्राउज़िंग सत्र के खत्म होने पर</translation> @@ -2358,6 +2365,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> के लिए पासवर्ड</translation> <translation id="4777825441726637019">Play स्टोर</translation> <translation id="4779083564647765204">ज़ूम</translation> +<translation id="4779136857077979611">ओनिगिरी</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{पॉप-अप ब्लॉक किया गया}one{# पॉप-अप ब्लॉक किए गए हैं}other{# पॉप-अप ब्लॉक किए गए हैं}}</translation> <translation id="4780321648949301421">इस रूप में पेज सेव करें...</translation> <translation id="4785719467058219317">आप एक ऐसी 'सुरक्षा चाबी' इस्तेमाल कर रहे हैं जिसे इस वेबसाइट पर रजिस्टर नहीं किया गया है</translation> @@ -2370,6 +2378,7 @@ <translation id="4801448226354548035">खाते छिपाएं</translation> <translation id="4801512016965057443">मोबाइल डेटा रोमिंग की अनुमति दें</translation> <translation id="4804818685124855865">डिसकनेक्ट करें</translation> +<translation id="4804827417948292437">एवोकैडो</translation> <translation id="4807098396393229769">कार्ड पर नाम</translation> <translation id="4808667324955055115">पॉप-अप ब्लॉक किए गए हैं:</translation> <translation id="480990236307250886">मुख्यपृष्ठ खोलें</translation> @@ -2430,7 +2439,7 @@ <translation id="4885705234041587624">MSCHAPv2</translation> <translation id="4887424188275796356">सिस्टम दर्शक के साथ खोलें</translation> <translation id="488785315393301722">विवरण दिखाएं</translation> -<translation id="4890773143211625964">उन्नत प्रिंटर विकल्प दिखाएं</translation> +<translation id="4890773143211625964">बेहतर प्रिंटर विकल्प दिखाएं</translation> <translation id="4891089016822695758">बीटा फ़ोरम</translation> <translation id="4893336867552636863">इससे इस डिवाइस से आपका संपूर्ण ब्राउज़िंग डेटा स्थायी रूप से हट जाएगा.</translation> <translation id="4893522937062257019">लॉक स्क्रीन पर</translation> @@ -2458,12 +2467,13 @@ <translation id="4927846293686536410">अपने सभी डिवाइस पर बुकमार्क, इतिहास, पासवर्ड और दूसरी तरह की सेटिंग पाने के लिए साइन इन करें. आप Google सेवाओं में भी अपने आप साइन इन कर लेंगे.</translation> <translation id="4929386379796360314">प्रिंट करने की जगहें</translation> <translation id="4931132176527519925">हमेशा स्क्रीन शेयर करें</translation> -<translation id="4932733599132424254">दिनांक</translation> +<translation id="4932733599132424254">तारीख</translation> <translation id="4933484234309072027"><ph name="URL" /> पर एम्बेड किया गया</translation> <translation id="493571969993549666">'निगरानी में रखा गया उपयोगकर्ता' जोड़ें</translation> <translation id="4941246025622441835">एंटरप्राइज़ प्रबंधन के लिए डिवाइस को नामांकित करते समय इस डिवाइस अनुरोध का उपयोग करें:</translation> <translation id="4941627891654116707">फ़ॉन्ट का आकार</translation> <translation id="494286511941020793">प्रॉक्सी कॉन्फ़िगरेशन सहायता</translation> +<translation id="4943368462779413526">फ़ुटबॉल</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" किसी सीरियल पोर्ट से कनेक्ट करना चाहता है</translation> <translation id="495170559598752135">क्रियाएं</translation> <translation id="4953689047182316270">सुलभता इवेंट का जवाब दें</translation> @@ -2532,6 +2542,7 @@ <translation id="5067399438976153555">हमेशा चालू</translation> <translation id="5067867186035333991">अगर <ph name="HOST" /> आपका कैमरा एक्सेस करना चाहे, तो पूछें</translation> <translation id="5068918910148307423">हाल ही में बंद की गई साइट को डेटा भेजने और प्राप्त करने की प्रकिया को पूरा करने की अनुमति ना दें</translation> +<translation id="5068919226082848014">पिज़्ज़ा</translation> <translation id="5072052264945641674">कर्सर का आकार एडजस्ट करें</translation> <translation id="5072836811783999860">प्रबंधित बुकमार्क दिखाएं</translation> <translation id="5074318175948309511">नई सेटिंग के प्रभावी होने से पहले इस पृष्ठ को रीलोड करने की आवश्यकता हो सकती है.</translation> @@ -2566,6 +2577,7 @@ <translation id="5117930984404104619">विज़िट किए गए यूआरएल के साथ-साथ दूसरे एक्सटेंशन के व्यवहार की निगरानी करें</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">आपकी हार्ड डिस्क भर गई है. कृपया किसी अन्य स्थान पर सेव करें या हार्ड डिस्क पर जगह बनाएं.</translation> +<translation id="5123433949759960244">बास्केटबॉल</translation> <translation id="5125751979347152379">गलत यूआरएल.</translation> <translation id="5127805178023152808">समन्वयन बंद है</translation> <translation id="5127881134400491887">नेटवर्क कनेक्शन प्रबंधित करें</translation> @@ -2599,7 +2611,7 @@ <translation id="5181140330217080051">डाउनलोड हो रहा है</translation> <translation id="5184063094292164363">&JavaScript कंसोल</translation> <translation id="5184662919967270437">आपका डिवाइस अपडेट हो रहा है</translation> -<translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" का नवीनतम वर्शन अक्षम कर दिया गया है क्योंकि इसे अधिक अनुमतियों की आवश्यकता है.</translation> +<translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" का नवीनतम वर्शन अक्षम कर दिया गया है क्योंकि इसे ज़्यादा अनुमतियों की आवश्यकता है.</translation> <translation id="5187295959347858724">आप अब <ph name="SHORT_PRODUCT_NAME" /> में प्रवेश हो गए हैं. आपके बुकमार्क, इतिहास, और अन्य सेटिंग आपके Google खाते में समन्वयित की जा रही हैं.</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> एक से ज़्यादा फ़ाइलें डाउनलोड करना चाहते हैं</translation> @@ -2648,7 +2660,7 @@ <translation id="5261683757250193089">वेब स्टोर में खोलें</translation> <translation id="5264148714798105376">इसमें एक मिनट या कुछ ज़्यादा समय लग सकता है.</translation> <translation id="5264252276333215551">किओस्क मोड में अपने ऐप्लिकेशन लॉन्च करने के लिए कृपया इंटरनेट से कनेक्ट करें.</translation> -<translation id="5265562206369321422">एक सप्ताह से अधिक समय से ऑफ़लाइन</translation> +<translation id="5265562206369321422">एक सप्ताह से ज़्यादा समय से ऑफ़लाइन</translation> <translation id="5265797726250773323">इंस्टॉल करते समय गड़बड़ी हुई</translation> <translation id="5266113311903163739">प्रमाणन प्राधिकरण आयात गड़बड़ी</translation> <translation id="5269977353971873915">प्रिंट विफल</translation> @@ -2871,7 +2883,7 @@ <translation id="5593357315997824387">मेरी फ़ाइलों को सिंक करें</translation> <translation id="5595152862129936745">बहुत दूर</translation> <translation id="5595485650161345191">पता संपादित करें</translation> -<translation id="5596627076506792578">अधिक विकल्प</translation> +<translation id="5596627076506792578">ज़्यादा विकल्प</translation> <translation id="5600706100022181951">अपडेट को डाउनलोड करने में <ph name="UPDATE_SIZE_MB" /> एमबी मोबाइल डेटा का उपयोग होगा. क्या आप जारी रखना चाहते हैं?</translation> <translation id="5601503069213153581">पिन</translation> <translation id="5602765853043467355">इस डिवाइस से बुकमार्क, इतिहास, पासवर्ड वगैरह साफ़ करें</translation> @@ -2881,7 +2893,7 @@ <translation id="5609231933459083978">ऐप्लिकेशन अमान्य मालूम होता है.</translation> <translation id="5610038042047936818">कैमरा मोड में स्विच करें</translation> <translation id="5612720917913232150"><ph name="URL" /> आपके कंप्यूटर के स्थान का उपयोग करना चाहता है</translation> -<translation id="5612734644261457353">क्षमा करें, आपका पासवर्ड अभी भी सत्यापित नहीं किया जा सकता. ध्यान दें: अगर आपने हाल ही में अपना पासवर्ड बदला है, तो आपके प्रस्थान करते ही आपका नया पासवर्ड लागू हो जाएगा, कृपया यहां पुराने पासवर्ड का उपयोग करें.</translation> +<translation id="5612734644261457353">क्षमा करें, आपका पासवर्ड अब भी सत्यापित नहीं किया जा सकता. ध्यान दें: अगर आपने हाल ही में अपना पासवर्ड बदला है, तो आपके प्रस्थान करते ही आपका नया पासवर्ड लागू हो जाएगा, कृपया यहां पुराने पासवर्ड का उपयोग करें.</translation> <translation id="5614190747811328134">उपयोगकर्ता सूचना</translation> <translation id="5614553682702429503">पासवर्ड सेव करें?</translation> <translation id="561698261642843490">Firefox बंद करें</translation> @@ -2959,7 +2971,7 @@ <translation id="5739458112391494395">बहुत बड़ा</translation> <translation id="574209121243317957">पिच</translation> <translation id="5746169159649715125">PDF के तौर पर सेव करें</translation> -<translation id="5747552184818312860">समय सीमा समाप्ति दिनांक</translation> +<translation id="5747552184818312860">समय सीमा समाप्ति तारीख</translation> <translation id="5747785204778348146">डेवलपर - अस्थिर</translation> <translation id="5747809636523347288"><ph name="URL" /> चिपकाएं और इस पर जाएं</translation> <translation id="5750324801516359607">दूर</translation> @@ -2968,7 +2980,7 @@ <translation id="5763315388120433852">'नेटवर्क फ़ाइल शेयर' सेट अप करें या प्रबंधित करें.</translation> <translation id="5763751966069581670">कोई USB डिवाइस नहीं मिला</translation> <translation id="5764483294734785780">इस रूप में ऑडियो स&हेजें...</translation> -<translation id="57646104491463491">संशोधन की तिथि</translation> +<translation id="57646104491463491">संशोधन की तारीख</translation> <translation id="5764797882307050727">कृपया अपने डिवाइस पर कुछ जगह खाली करें.</translation> <translation id="5765425701854290211">माफ़ करें, कुछ फ़ाइलों को नुकसान पहुंचा है और अपडेट सफल नहीं रहा. आपकी सिंक की हुई फ़ाइलें सुरक्षित हैं.</translation> <translation id="5765491088802881382">कोई नेटवर्क उपलब्ध नहीं हैं</translation> @@ -3022,7 +3034,7 @@ <translation id="5835754902560991078">अत्यधिक कम समय (0.6 सेकंड)</translation> <translation id="5838456317242088717">वर्तमान गुप्त सत्र</translation> <translation id="5842497610951477805">ब्लूटूथ सक्षम</translation> -<translation id="5843250171025351504">आपका डिवाइस अब आपके एडमिन के बताए गए न्यूनतम क्लाइंट वर्शन का अनुपालन नहीं करता है. कृपया लॉगिन करने के लिए अपडेट करें.</translation> +<translation id="5843250171025351504">आपका डिवाइस अब आपके एडमिन के बताए गए कम से कम क्लाइंट वर्शन का अनुपालन नहीं करता है. कृपया लॉगिन करने के लिए अपडेट करें.</translation> <translation id="5849212445710944278">पहले ही जोड़ा जा चुका है</translation> <translation id="5849570051105887917">होम प्रदाता कोड</translation> <translation id="5851868085455377790">जारीकर्ता</translation> @@ -3059,7 +3071,7 @@ <translation id="5886009770935151472">उंगली एक</translation> <translation id="5889282057229379085">मध्यवर्ती CA की अधिकतम संख्या: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5895138241574237353">फिर से प्रारंभ करें</translation> -<translation id="5895187275912066135">जारी करने की तिथि</translation> +<translation id="5895187275912066135">जारी करने की तारीख</translation> <translation id="5900302528761731119">Google प्रोफ़ाइल फ़ोटो</translation> <translation id="5906655207909574370">करीब अप टू डेट हो गया है! अपडेट करना पूरा करने के लिए अपना डिवाइस फिर से प्रारंभ करें.</translation> <translation id="5906732635754427568">इस ऐप्लिकेशन से जुड़े डेटा को इस डिवाइस से हटा दिया जाएगा.</translation> @@ -3100,7 +3112,7 @@ <translation id="5955282598396714173">आपके पासवर्ड की समय-सीमा खत्म हो गई है. इसे बदलने के लिए कृपया साइन आउट करें उसके बाद फिर से प्रवेश करें.</translation> <translation id="5955809630138889698">शायद इस डिवाइस पर सिर्फ़ ऑनलाइन डेमो मोड ही चलाया जा सकता है. कृपया ज़्यादा जानकारी के लिए अपने सहायता प्रतिनिधि से संपर्क करें.</translation> <translation id="5956585768868398362">क्या यह वही खोज पेज है जिसकी आप अपेक्षा कर रहे थे?</translation> -<translation id="5957613098218939406">अधिक विकल्प</translation> +<translation id="5957613098218939406">ज़्यादा विकल्प</translation> <translation id="5957987129450536192">अपनी प्रोफ़ाइल इमेज के पास वाले 'चुनें और सुनें' आइकॉन पर टैप करें, फिर आप जो सुनना चाहते हैं उसे चुनें.</translation> <translation id="5958529069007801266">निगरानी में रखा गया उपयोगकर्ता</translation> <translation id="5959471481388474538">नेटवर्क उपलब्ध नहीं</translation> @@ -3246,6 +3258,7 @@ <translation id="6166185671393271715">Chrome में पासवर्ड आयात करें</translation> <translation id="6169040057125497443">कृपया अपना माइक्रोफ़ोन जाँचें.</translation> <translation id="6169666352732958425">डेस्कटॉप कास्ट करने में असमर्थ.</translation> +<translation id="6170470584681422115">सैंडविच</translation> <translation id="6171948306033499786">प्रिंटिंग रोकें</translation> <translation id="6173623053897475761">अपना पिन दोबारा लिखें</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3266,7 +3279,7 @@ <translation id="6207282396926186323"><ph name="APP_NAME" /> (Linux ऐप्लिकेशन) इंस्टॉल करना</translation> <translation id="6207937957461833379">देश/क्षेत्र</translation> <translation id="6211495400987308581"><ph name="PROFILE_NAME" />: सिंक सुविधा काम नहीं कर रही है</translation> -<translation id="6212039847102026977">उन्नत नेटवर्क प्रॉपर्टी दिखाएं</translation> +<translation id="6212039847102026977">बेहतर नेटवर्क प्रॉपर्टी दिखाएं</translation> <translation id="6212168817037875041">प्रदर्शन बंद करें</translation> <translation id="6212752530110374741">लिंक ईमेल करें</translation> <translation id="6216696360484424239">अपने आप साइन इन करें</translation> @@ -3277,7 +3290,7 @@ <translation id="622537739776246443">प्रोफ़ाइल मिटा दी जाएगी</translation> <translation id="6225475702458870625">आपके <ph name="PHONE_NAME" /> से डेटा कनेक्शन उपलब्ध है</translation> <translation id="6226777517901268232">निजी कुंजी फ़ाइल (वैकल्पिक)</translation> -<translation id="6228516488918914827">पेज अधिक तेज़ी से लोड हुआ</translation> +<translation id="6228516488918914827">पेज ज़्यादा तेज़ी से लोड हुआ</translation> <translation id="6228691855869374890">इस साइट के पास MIDI डिवाइस का पूर्ण नियंत्रण है.</translation> <translation id="6229890768313448549">Google Play सेवा की शर्तें लोड नहीं की जा सकतीं. कृपया फिर से कोशिश करें.</translation> <translation id="6231881193380278751">पेज को अपने आप रीफ्रेश करने के लिए URL में एक क्वेरी पैरामीटर जोड़ें: chrome://device-log/?refresh=<sec></translation> @@ -3412,7 +3425,7 @@ <translation id="6436164536244065364">वेब स्टोर में देखें</translation> <translation id="6438992844451964465"><ph name="WINDOW_TITLE" /> - ऑडियो चलाया जा रहा है</translation> <translation id="6442187272350399447">अद्भुत</translation> -<translation id="6444070574980481588">दिनांक और समय सेट करें</translation> +<translation id="6444070574980481588">तारीख और समय सेट करें</translation> <translation id="6445450263907939268">अगर आप इन बदलावों को नहीं चाहते हैं, तो आप अपनी पिछली सेटिंग फिर से स्थापित कर सकते हैं.</translation> <translation id="6447842834002726250">कुकी</translation> <translation id="6449285849137521213">"<ph name="EXTENSION_NAME" />" ऐप्स जोड़ा गया.</translation> @@ -3451,7 +3464,7 @@ <translation id="6498249116389603658">&आपकी सभी भाषाएं</translation> <translation id="6499143127267478107">प्रॉक्सी स्क्रिप्ट में होस्ट का समाधान किया जा रहा है...</translation> <translation id="6499681088828539489">शेयर किए गए नेटवर्क के लिए प्रॉक्सी की अनुमति नहीं है</translation> -<translation id="6503077044568424649">सबसे अधिक देखे गए</translation> +<translation id="6503077044568424649">सबसे ज़्यादा देखे गए</translation> <translation id="6504611359718185067">प्रिंटर जोड़ने के लिए इंटरनेट से कनेक्ट करें</translation> <translation id="6506374932220792071">SHA-256 के साथ X9.62 ECDSA हस्ताक्षर</translation> <translation id="6508248480704296122"><ph name="NAME_PH" /> से संबंधित</translation> @@ -3512,7 +3525,7 @@ <translation id="659934686219830168">आपके इस पेज को छोड़ने के बाद सिंक होना चालू होगा</translation> <translation id="6602956230557165253">नेविगेट करने के लिए बाईं और दाईं तीर कुंजियों का उपयोग करें.</translation> <translation id="6605847144724004692">किसी भी उपयोगकर्ता ने अभी तक रेट नहीं किया है.</translation> -<translation id="6607831829715835317">अधिक टू&ल</translation> +<translation id="6607831829715835317">ज़्यादा टू&ल</translation> <translation id="6610147964972079463">निजी टैब बंद करें</translation> <translation id="6612358246767739896">सुरक्षित सामग्री</translation> <translation id="6613452264606394692">इस पेज को बुकमार्क करके झटपट यहां वापस पहुंचें</translation> @@ -3675,6 +3688,7 @@ <translation id="6870888490422746447">शेयर करने के लिए कोई ऐप चुनें:</translation> <translation id="6871644448911473373">OCSP प्रतिसादी: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">आपने जो पासवर्ड डाला है उसे सर्वर ने अस्वीकार कर दिया है.</translation> +<translation id="6876155724392614295">बाइक</translation> <translation id="6878422606530379992">सेंसर को मंज़ूरी दी गई है</translation> <translation id="6880587130513028875">इस पेज पर चित्र अवरोधित कर दी गई थीं.</translation> <translation id="6883319974225028188">ओह! सिस्टम, डिवाइस कॉन्फ़िगरेशन को नहीं सहेज सका.</translation> @@ -3863,7 +3877,7 @@ <translation id="716640248772308851">"<ph name="EXTENSION" />" चेक किए गए स्थानों में चित्रों, वीडियो, और ध्वनि फ़ाइलों को पढ़ सकता है.</translation> <translation id="7167486101654761064">इस प्रकार की फ़ाइलें &हमेशा खोलें</translation> <translation id="716810439572026343"><ph name="FILE_NAME" /> डाउनलोड हो रही है</translation> -<translation id="7168109975831002660">न्यूनतम अक्षरों का आकार</translation> +<translation id="7168109975831002660">कम से कम अक्षरों का आकार</translation> <translation id="7170041865419449892">सीमा से बाहर</translation> <translation id="7171559745792467651">अपने दूसरे डिवाइस से ऐप्लिकेशन इंस्टॉल करें</translation> <translation id="7175037578838465313"><ph name="NAME" /> को कॉन्फ़िगर करें</translation> @@ -4233,6 +4247,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> के बारे में</translation> <translation id="7772773261844472235">अपने Chromebook की स्थिति देखें</translation> <translation id="7773726648746946405">सत्र संग्ररण</translation> +<translation id="7774365994322694683">पक्षी</translation> <translation id="7776701556330691704">कोई आवाज़ नहीं मिली</translation> <translation id="7781335840981796660">सभी 'उपयोगकर्ता खातों' और 'स्थानीय डेटा' को हटा दिया जाएगा.</translation> <translation id="7782102568078991263">Google की ओर से कोई और सुझाव नहीं</translation> @@ -4307,7 +4322,7 @@ <translation id="784934925303690534">समय सीमा</translation> <translation id="7851457902707056880">साइन इन की सिर्फ़ मालिक के खाते तक पाबंदी लगाई गई है. कृपया रीबूट करें और मालिक खाते से साइन इन करें. मशीन 30 सेकंड में अपने आप रीबूट हो जाएगी.</translation> <translation id="7851716364080026749">कैमरा और माइक्रोफ़ोन एक्सेस हमेशा अवरुद्ध करें</translation> -<translation id="7853747251428735">अधिक टू&ल</translation> +<translation id="7853747251428735">ज़्यादा टू&ल</translation> <translation id="7857117644404132472">अपवाद जोड़ें</translation> <translation id="7857949311770343000">क्या यह वही नया टैब पेज है जिसकी आप अपेक्षा कर रहे थे?</translation> <translation id="786073089922909430">सेवा: <ph name="ARC_PROCESS_NAME" /></translation> @@ -4315,7 +4330,7 @@ <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 कुकी}one{# कुकी}other{# कुकी}}</translation> <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - युग्मित किया गया</translation> <translation id="7870730066603611552">सेटअप के बाद सिंक विकल्पों की समीक्षा करें</translation> -<translation id="7870790288828963061">अधिक नए वर्शन वाला कोई भी कियोस्क ऐप नहीं मिला. अपडेट करने के लिए कुछ नहीं है. कृपया USB स्टिक को निकालें.</translation> +<translation id="7870790288828963061">ज़्यादा नए वर्शन वाला कोई भी कियोस्क ऐप नहीं मिला. अपडेट करने के लिए कुछ नहीं है. कृपया USB स्टिक को निकालें.</translation> <translation id="7874257161694977650">Chrome बैकग्राउंड</translation> <translation id="7877451762676714207">अज्ञात सर्वर गड़बड़ी. कृपया फिर से प्रयास करें, या सर्वर व्यवस्थापक से संपर्क करें.</translation> <translation id="7877680364634660272">यात्रा</translation> @@ -4465,7 +4480,7 @@ <translation id="8076835018653442223">आपके एडमिन ने आपके डिवाइस की स्थानीय फ़ाइलों की एक्सेस बंद कर दी है</translation> <translation id="8084114998886531721">सहेजा गया पासवर्ड</translation> <translation id="8086015605808120405"><ph name="PRINTER_NAME" /> कॉन्फ़िगर किया जा रहा है ...</translation> -<translation id="8090234456044969073">अपनी सबसे अधिक देखी गई वेबसाइटों की सूची पढ़ें</translation> +<translation id="8090234456044969073">अपनी सबसे ज़्यादा देखी गई वेबसाइटों की सूची पढ़ें</translation> <translation id="8093359998839330381"><ph name="PLUGIN_NAME" /> जवाब नहीं दे रहा है</translation> <translation id="8095105960962832018"><ph name="BEGIN_PARAGRAPH1" />'Google डिस्क' में बैक अप लें. किसी भी समय अपना डेटा आसानी से बहाल करें या डिवाइस बदलें. आपके बैकअप में आपका ऐप्लिकेशन डेटा शामिल होता है.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />आपके बैकअप आपके Google खाते के पासवर्ड से सुरक्षित करके Google पर अपलोड किए जाते हैं.<ph name="END_PARAGRAPH2" /> @@ -4521,7 +4536,7 @@ <translation id="8182664696082410784"><ph name="REASON" /> मुझे नहीं लगता कि इस साइट को ब्लॉक किया जाना चाहिए!</translation> <translation id="8184288427634747179"><ph name="AVATAR_NAME" /> पर जाएं</translation> -<translation id="8184318863960255706">अधिक जानकारी</translation> +<translation id="8184318863960255706">ज़्यादा जानकारी</translation> <translation id="8185331656081929126">नेटवर्क पर नए प्रिंटर का पता लगाए जाने पर सूचनाएं दिखाएं</translation> <translation id="8186609076106987817">सर्वर को फ़ाइल नहीं मिल सकी.</translation> <translation id="8188389033983459049">अपनी डिवाइस सेटिंग जांचें और जारी रखने के लिए उसे चालू करें</translation> @@ -4581,7 +4596,7 @@ <translation id="8270242299912238708">PDF दस्तावेज़</translation> <translation id="827097179112817503">होम बटन दिखाएं</translation> <translation id="8271246892936492311">{COUNT,plural, =1{1 बुकमार्क हटाया गया}one{# बुकमार्क हटाए गए}other{# बुकमार्क हटाए गए}}</translation> -<translation id="8272443605911821513">"अधिक टूल" मेनू में एक्सटेंशन पर क्लिक करके अपने एक्सटेंशन प्रबंधित करें.</translation> +<translation id="8272443605911821513">"ज़्यादा टूल" मेनू में एक्सटेंशन पर क्लिक करके अपने एक्सटेंशन प्रबंधित करें.</translation> <translation id="8272966760965438857">अपने Google खातों को एक ही जगह से प्रबंधित करें</translation> <translation id="8274332263553132018">फ़ाइल कास्ट करें</translation> <translation id="8274924778568117936">अपडेट पूरा होने तक अपना <ph name="DEVICE_TYPE" /> बंद न करें. इंस्टॉलेशन पूरा हो जाने के बाद आपका <ph name="DEVICE_TYPE" /> फिर से चालू हो जाएगा.</translation> @@ -4637,6 +4652,7 @@ <translation id="8386903983509584791">स्कैन पूरा हुआ</translation> <translation id="8389492867173948260">इस एक्सटेंशन को आपकी देखी जाने वाली इन वेबसाइटों पर मौजूद अपना सभी डेटा पढ़ने और बदलने दें:</translation> <translation id="8390449457866780408">सर्वर अनुपलब्ध है.</translation> +<translation id="8391218455464584335">विनाइल</translation> <translation id="8391712576156218334">इमेज उपलब्ध नहीं है. बाद में फिर से कोशिश करें.</translation> <translation id="8392234662362215700">कीबोर्ड लेआउट बदलने के लिए Control-Shift-Space दबाएं.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> के लिए विकल्प मेनू</translation> @@ -4779,7 +4795,7 @@ <translation id="8627795981664801467">केवल सुरक्षित कनेक्शन</translation> <translation id="8630903300770275248">'निगरानी में रखे गए उपयोगकर्ता' को यहां लेकर आएं</translation> <translation id="8631032106121706562">पेटल्स</translation> -<translation id="8637542770513281060">आपके कंप्यूटर में एक ऐसा सुरक्षित मॉड्यूल है, जिसका उपयोग Chrome OS की कई महत्वपूर्ण सुरक्षा सुविधाओं को लागू करने में किया जाता है. अधिक जानने के लिए Chromebook सहायता केंद्र पर जाएं: https://support.google.com/chromebook/?p=sm</translation> +<translation id="8637542770513281060">आपके कंप्यूटर में एक ऐसा सुरक्षित मॉड्यूल है, जिसका उपयोग Chrome OS की कई महत्वपूर्ण सुरक्षा सुविधाओं को लागू करने में किया जाता है. ज़्यादा जानने के लिए Chromebook सहायता केंद्र पर जाएं: https://support.google.com/chromebook/?p=sm</translation> <translation id="8637688295594795546">सिस्टम अपडेट उपलब्ध है. डाउनलोड करने के लिए तैयार हो रहा है...</translation> <translation id="8639047128869322042">नुकसान पहुंचाने वाला सॉफ़्टवेयर ढूंढा जा रहा है...</translation> <translation id="8642171459927087831">पहुंच टोकन</translation> @@ -4827,9 +4843,9 @@ <translation id="8688672835843460752">उपलब्ध</translation> <translation id="8695825812785969222">&स्थान खोलें...</translation> <translation id="869884720829132584">ऐप्स मेनू</translation> -<translation id="869891660844655955">समय समाप्ति दिनांक</translation> +<translation id="869891660844655955">समय समाप्ति तारीख</translation> <translation id="8703346390800944767">विज्ञापन छोड़ें</translation> -<translation id="8704521619148782536">इसमें सामान्य से अधिक समय लग रहा है. आप प्रतीक्षा कर सकते हैं, या रद्द कर सकते हैं और बाद में फिर से प्रयास कर सकते हैं.</translation> +<translation id="8704521619148782536">इसमें सामान्य से ज़्यादा समय लग रहा है. आप प्रतीक्षा कर सकते हैं, या रद्द कर सकते हैं और बाद में फिर से प्रयास कर सकते हैं.</translation> <translation id="8705331520020532516">क्रम संख्या</translation> <translation id="8705580154597116082">फ़ोन के ज़रिए वाई-फ़ाई उपलब्ध है</translation> <translation id="8708000541097332489">बाहर निकलने पर साफ़ करें</translation> @@ -4926,7 +4942,7 @@ <translation id="8823514049557262177">लिंक ले&ख को कॉपी करें</translation> <translation id="8823704566850948458">पासवर्ड सुझाएं...</translation> <translation id="8824701697284169214">पृ&ष्ठ जोड़ें...</translation> -<translation id="8827752199525959199">अधिक कार्रवाइयां, <ph name="DOMAIN" /> पर <ph name="USERNAME" /> के लिए पासवर्ड</translation> +<translation id="8827752199525959199">ज़्यादा कार्रवाइयां, <ph name="DOMAIN" /> पर <ph name="USERNAME" /> के लिए पासवर्ड</translation> <translation id="8828933418460119530">DNS नाम</translation> <translation id="8830796635868321089">वर्तमान प्रॉक्सी सेटिंग के उपयोग से अपडेट जाँच विफल रही. कृपया अपनी <ph name="PROXY_SETTINGS_LINK_START" />प्रॉक्सी सेटिंग<ph name="PROXY_SETTINGS_LINK_END" /> एडजस्ट करें.</translation> <translation id="8831664945713891930">एक्सटेंशन सेटिंग खोलें</translation> @@ -5050,10 +5066,10 @@ <translation id="9026731007018893674">डाउनलोड करें</translation> <translation id="9026852570893462412">इस प्रोसेस में कुछ मिनट लग सकते हैं. वर्चुअल मशीन को डाउनलोड किया जा रहा है.</translation> <translation id="9027459031423301635">नए &टैब में लिंक खोलें</translation> -<translation id="9030515284705930323">आपके संगठन ने आपके खाते के लिए Google Play स्टोर को सक्षम नहीं किया है. अधिक जानकारी के लिए अपने व्यवस्थापक से संपर्क करें.</translation> +<translation id="9030515284705930323">आपके संगठन ने आपके खाते के लिए Google Play स्टोर को सक्षम नहीं किया है. ज़्यादा जानकारी के लिए अपने व्यवस्थापक से संपर्क करें.</translation> <translation id="9033857511263905942">&चिपकाएं</translation> <translation id="9037965129289936994">मूल दिखाएं</translation> -<translation id="9038649477754266430">अधिक तेज़ी से पेज लोड करने के लिए किसी पूर्वानुमान सेवा का उपयोग करें</translation> +<translation id="9038649477754266430">ज़्यादा तेज़ी से पेज लोड करने के लिए किसी पूर्वानुमान सेवा का उपयोग करें</translation> <translation id="9039663905644212491">PEAP</translation> <translation id="9040661932550800571"><ph name="ORIGIN" /> के लिए पासवर्ड अपडेट करें?</translation> <translation id="9041692268811217999">आपके एडमिन ने आपकी मशीन पर स्थानीय फ़ाइलों की एक्सेस बंद कर दी है</translation> @@ -5161,7 +5177,7 @@ <translation id="932508678520956232">प्रिंटिंग आरंभ नहीं कर सका.</translation> <translation id="93343527085570547">कानूनी वजहों से सामग्री में बदलाव का अनुरोध करने के लिए <ph name="BEGIN_LINK1" />कानूनी मदद पेज<ph name="END_LINK1" /> पर जाएं. खाते और सिस्टम की कुछ जानकारी Google को भेजी जा सकती है. हम आपसे मिलने वाली जानकारी का इस्तेमाल तकनीकी समस्याएं ठीक करने और अपनी सेवाओं को बेहतर बनाने के लिए करेंगे. यह हमारी <ph name="BEGIN_LINK2" />निजता नीति<ph name="END_LINK2" /> और <ph name="BEGIN_LINK3" />सेवा की शर्तों<ph name="END_LINK3" /> के तहत किया जाएगा.</translation> <translation id="93393615658292258">केवल पासवर्ड</translation> -<translation id="934503638756687833">ऐसे आइटम जिनके नाम यहां शामिल नहीं हैं, ज़रूरत पड़ने पर उन्हें भी हटाया जा सकता है. Chrome निजता श्वेत पत्र में <a href="<ph name="URL" />">अनचाहे सॉफ़्टवेयर से सुरक्षा</a> के बारे में अधिक जानें.</translation> +<translation id="934503638756687833">ऐसे आइटम जिनके नाम यहां शामिल नहीं हैं, ज़रूरत पड़ने पर उन्हें भी हटाया जा सकता है. Chrome निजता श्वेत पत्र में <a href="<ph name="URL" />">अनचाहे सॉफ़्टवेयर से सुरक्षा</a> के बारे में ज़्यादा जानें.</translation> <translation id="935490618240037774">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग को आपके Google खाते में समन्वयित किया जाएगा ताकि आप उनका उपयोग अपने सभी डिवाइस पर कर सकें.</translation> <translation id="935854577147268200">Smart Lock वाला फ़ोन बदल गया है. Smart Lock अपडेट करने के लिए अपना पासवर्ड डालें. अगली बार, आपका फ़ोन आपके <ph name="DEVICE_TYPE" /> को अनलॉक कर देगा. आप सेटिंग में जाकर Smart Lock को बंद कर सकते हैं</translation> <translation id="936801553271523408">सिस्टम का गड़बड़ी संबंधी डेटा</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 596c419..153e30ec 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Pretražite uređaj, aplikacije i web.</translation> <translation id="114721135501989771">Googleove značajke za Chrome</translation> <translation id="1149401351239820326">Mjesec isteka</translation> +<translation id="1150565364351027703">Sunčane naočale</translation> <translation id="1151917987301063366">Hostu <ph name="HOST" /> uvijek dopusti pristup senzorima</translation> <translation id="1153356358378277386">Upareni uređaji</translation> <translation id="1156488781945104845">Trenutačno vrijeme</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Pomoć za tipkovničke prečace</translation> <translation id="2045969484888636535">Nastavi blokirati kolačiće</translation> <translation id="204622017488417136">Uređaj će se vratiti na prethodno instaliranu verziju Chromea, a svi korisnički računi i lokalni podaci bit će uklonjeni. Tu radnju nije moguće poništiti.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">pristupiti vašem mrežnom prometu</translation> <translation id="2048653237708779538">Radnja nije dostupna</translation> <translation id="2050339315714019657">Portret</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Dodano: <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP proxy</translation> <translation id="2468205691404969808">Upotrebljava kolačiće za pamćenje vaših postavki, čak i ako ne posjetite te stranice</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Prilagodi provjeru pravopisa</translation> <translation id="247051149076336810">URL za dijeljenje datoteka</translation> <translation id="2470702053775288986">Onemogućena su nepodržana proširenja</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Ukloni s popisa</translation> <translation id="2770690685823456775">Izvezite zaporke u neku drugu mapu</translation> <translation id="2771268254788431918">Mobilni podaci aktivirani</translation> +<translation id="2771816809568414714">Sir</translation> <translation id="2772936498786524345">Podlac</translation> <translation id="2773288106548584039">Podrška za stare preglednike</translation> <translation id="2773802008104670137">Ta vrsta datoteke može oštetiti vaše računalo.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Obriši podatke o pregledavanju...</translation> <translation id="3617891479562106823">Pozadine nisu dostupne. Pokušajte ponovo kasnije.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Tim nadziranim korisnikom upravljat će <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Otključajte uređaj i prijavite se na Google račun</translation> <translation id="3625258641415618104">Snimke zaslona onemogućene su</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Gradski krajolik</translation> <translation id="4361142739114356624">Privatni ključ za ovaj certifikat klijenta nedostaje ili nije važeći</translation> <translation id="4363771538994847871">Nije pronađeno nijedno odredište za Cast. Trebate li pomoć?</translation> +<translation id="4364327530094270451">Dinja</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> dijeli prozor.</translation> <translation id="4364830672918311045">Prikaži obavijesti</translation> <translation id="4365673000813822030">Ups, sinkronizacija je prekinuta.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Četiri datoteke koje je generirala Intelova oprema za Wi-Fi: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Prve su tri datoteke binarne i sadrže ispis registra, a Intel potvrđuje da ne sadrže osobne podatke ni podatke za identifikaciju uređaja. Zadnja je datoteka zapis izvedbe Intelove opreme; iz nje su izbrisani svi osobni podaci i podaci za identifikaciju uređaja, no prevelika je da bi se prikazala ovdje. Te su datoteke generirane zbog nedavnih poteškoća s Wi-Fi-jem na vašem uređaju i podijelit će se s Intelom radi rješavanja tih problema.></translation> <translation id="469230890969474295">OEM mapa</translation> <translation id="4692623383562244444">Tražilice</translation> +<translation id="4693155481716051732">Suši</translation> <translation id="4694024090038830733">Konfiguracijom pisača upravlja administrator.</translation> <translation id="4694604912444486114">Majmun</translation> <translation id="4697551882387947560">Kad završi sesija pregledavanja</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Zaporka za adresu <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Trgovina Play</translation> <translation id="4779083564647765204">Zumiranje</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Skočni prozor blokiran}one{# skočni prozor blokiran}few{# skočna prozora blokirana}other{# skočnih prozora blokirano}}</translation> <translation id="4780321648949301421">Spremi stranicu kao...</translation> <translation id="4785719467058219317">Upotrebljavate sigurnosni ključ koji nije registriran na toj web-lokaciji</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Sakrij račune</translation> <translation id="4801512016965057443">Omogući roaming mobilnih podataka</translation> <translation id="4804818685124855865">Prekini vezu</translation> +<translation id="4804827417948292437">Avokado</translation> <translation id="4807098396393229769">Ime na kartici</translation> <translation id="4808667324955055115">Skočni su prozori blokirani:</translation> <translation id="480990236307250886">Otvori početnu stranicu</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Upotrijebite taj zahtjev uređaja kada prijavljujete uređaj za poslovno upravljanje:</translation> <translation id="4941627891654116707">Veličina fonta</translation> <translation id="494286511941020793">Pomoć za proxy konfiguraciju</translation> +<translation id="4943368462779413526">Američki nogomet</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" želi se povezati sa serijskim priključkom</translation> <translation id="495170559598752135">Radnje</translation> <translation id="4953689047182316270">Odgovori na događaje pristupačnosti</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Uvijek uključeno</translation> <translation id="5067867186035333991">Pitaj ako <ph name="HOST" /> želi pristupiti mikrofonu</translation> <translation id="5068918910148307423">Ne dopuštaj nedavno zatvorenim web-lokacijama dovršetak slanja i primanja podataka</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Prilagodba veličine pokazivača</translation> <translation id="5072836811783999860">Prikaži upravljane oznake</translation> <translation id="5074318175948309511">Ovu stranicu možda će biti potrebno ponovo učitati kako bi nove postavke stupile na snagu.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">nadzirati ponašanje drugih proširenja, uključujući posjećene URL-ove</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Vaš je tvrdi disk pun. Spremite na neku drugu lokaciju ili oslobodite prostor na tvrdom disku.</translation> +<translation id="5123433949759960244">Košarka</translation> <translation id="5125751979347152379">Nevažeći URL.</translation> <translation id="5127805178023152808">Sinkronizacija je isključena</translation> <translation id="5127881134400491887">upravljati mrežnim vezama</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Uvoz zaporki u Chrome</translation> <translation id="6169040057125497443">Provjerite mikrofon.</translation> <translation id="6169666352732958425">Emitiranje radne površine nije moguće.</translation> +<translation id="6170470584681422115">Sendvič</translation> <translation id="6171948306033499786">Pauziraj ispis</translation> <translation id="6173623053897475761">Ponovo unesite PIN</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Odaberite aplikaciju za dijeljenje:</translation> <translation id="6871644448911473373">OCSP odgovaratelj: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Poslužitelj je odbio zaporku koju ste unijeli.</translation> +<translation id="6876155724392614295">Voziti bicikl</translation> <translation id="6878422606530379992">Senzori su dopušteni</translation> <translation id="6880587130513028875">Na ovoj su stranici blokirane slike.</translation> <translation id="6883319974225028188">Ups! Sustav nije uspio spremiti konfiguraciju uređaja.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">O proizvodu <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Provjerite status Chromebooka</translation> <translation id="7773726648746946405">Pohrana sesije</translation> +<translation id="7774365994322694683">Ptica</translation> <translation id="7776701556330691704">Nije pronađen nijedan glas</translation> <translation id="7781335840981796660">Uklonit će se svi korisnički računi i lokalni podaci.</translation> <translation id="7782102568078991263">Nema više prijedloga iz Googlea</translation> @@ -4670,6 +4685,7 @@ <translation id="8386903983509584791">Traženje je dovršeno</translation> <translation id="8389492867173948260">Dopustite ovom proširenju da čita i mijenja sve vaše podatke na web-lokacijama koje posjećujete:</translation> <translation id="8390449457866780408">Poslužitelj nije dostupan.</translation> +<translation id="8391218455464584335">Vinil</translation> <translation id="8391712576156218334">Slika nije dostupna. Pokušajte ponovo kasnije.</translation> <translation id="8392234662362215700">Pritisnite Control, Shift i razmaknicu za promjenu rasporeda tipkovnice.</translation> <translation id="8392451568018454956">Izbornik opcija za korisnika <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 0304815..a3fb8a1 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Kereshet az eszközén, az alkalmazások között és az interneten.</translation> <translation id="114721135501989771">Google-funkciók a Chrome-ban</translation> <translation id="1149401351239820326">Lejárat hónapja</translation> +<translation id="1150565364351027703">Napszemüveg</translation> <translation id="1151917987301063366">A(z) <ph name="HOST" /> mindig hozzáférhet az érzékelőkhöz</translation> <translation id="1153356358378277386">Párosított eszközök</translation> <translation id="1156488781945104845">Pontos idő</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Billentyűparancsokat ismertető súgó</translation> <translation id="2045969484888636535">Cookie-k tiltásának folytatása</translation> <translation id="204622017488417136">Eszköze visszatér a Chrome korábban telepített példányához. A rendszer minden felhasználói fiókot és helyi adatot eltávolít. A műveletet nem lehet visszavonni.</translation> +<translation id="2046702855113914483">Rámen</translation> <translation id="2048182445208425546">A hálózati forgalom elérése</translation> <translation id="2048653237708779538">A művelet nem végezhető el</translation> <translation id="2050339315714019657">Álló</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> hozzáadva</translation> <translation id="2464089476039395325">HTTP-proxy</translation> <translation id="2468205691404969808">Cookie-kat használ a preferenciák megjegyzésére még akkor is, ha Ön nem keresi fel azokat az oldalakat</translation> +<translation id="2468402215065996499">Tamagocsi</translation> <translation id="2469375675106140201">Helyesírás-ellenőrzés személyre szabása</translation> <translation id="247051149076336810">Fájlmegosztási URL</translation> <translation id="2470702053775288986">Nem támogatott kiterjesztések kikapcsolva</translation> @@ -1133,6 +1136,7 @@ <translation id="2770465223704140727">Eltávolítás a listából</translation> <translation id="2770690685823456775">Exportálja a jelszavakat egy másik mappába</translation> <translation id="2771268254788431918">Mobiladat-forgalom aktiválva</translation> +<translation id="2771816809568414714">Sajt</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Régi böngészők támogatása</translation> <translation id="2773802008104670137">Ez a fájltípus árthat a számítógépnek.</translation> @@ -1656,6 +1660,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Böngészés adatainak törlése...</translation> <translation id="3617891479562106823">A hátterek nem állnak rendelkezésre. Próbálja újra később.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">A felügyelt felhasználó felettese <ph name="MANAGER_EMAIL" /> lesz.</translation> <translation id="3624567683873126087">Eszköz feloldása, és bejelentkezés Google-fiókba</translation> <translation id="3625258641415618104">Képernyőképek letiltva</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Városkép</translation> <translation id="4361142739114356624">Az ügyféltanúsítvány privát kulcsa hiányzik vagy érvénytelen</translation> <translation id="4363771538994847871">Nem található átküldési cél. Segítségre van szüksége?</translation> +<translation id="4364327530094270451">Dinnye</translation> <translation id="4364567974334641491">A(z) <ph name="APP_NAME" /> megoszt egy ablakot.</translation> <translation id="4364830672918311045">Értesítések megjelenítése</translation> <translation id="4365673000813822030">Hoppá, a szinkronizálás leállt.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Négy, az Intel Wi-Fi firmware által generált fájl: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Az első három bináris fájl, melyek regisztertartalmakat tárolnak. Az Intel biztosítja, hogy nincs bennük eszköz- és személyazonosításra alkalmas adat. Az utolsó fájl végrehajtási lánc az Intel firmware-ből; mentes az eszköz- és személyazonosításra alkalmas adatoktól, de túl nagy ahhoz, hogy itt szerepeljen. Ezek a fájlok azért jöttek létre, mert eszközén az elmúlt időszakban Wi-Fi-vel kapcsolatos problémák adódtak. A probléma megoldása érdekében a rendszer megosztja a fájlokat az Intellel.></translation> <translation id="469230890969474295">OEM mappa</translation> <translation id="4692623383562244444">Keresők</translation> +<translation id="4693155481716051732">Szusi</translation> <translation id="4694024090038830733">A nyomtató konfigurálását a rendszergazda végzi.</translation> <translation id="4694604912444486114">Majom</translation> <translation id="4697551882387947560">Amikor a böngészési programfolyamat véget ér</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">A(z) <ph name="USER_EMAIL_ADDRESS" /> fiókhoz tartozó jelszó</translation> <translation id="4777825441726637019">Play Áruház</translation> <translation id="4779083564647765204">Nagyítás</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Előugró ablak letiltva}other{# előugró ablak letiltva}}</translation> <translation id="4780321648949301421">Oldal mentése &másként...</translation> <translation id="4785719467058219317">Olyan biztonsági hardverkulcsot használ, amely nincs regisztrálva ezen a webhelyen</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Fiókok elrejtése</translation> <translation id="4801512016965057443">Mobil adatbarangolás engedélyezése</translation> <translation id="4804818685124855865">Kapcsolat bontása</translation> +<translation id="4804827417948292437">Avokádó</translation> <translation id="4807098396393229769">A kártyán feltüntetett név</translation> <translation id="4808667324955055115">Előugró ablakok letiltva:</translation> <translation id="480990236307250886">A kezdőoldal megnyitása</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Jelen eszközigénylés használata az eszköz regisztrálásakor vállalati felügyelet céljából:</translation> <translation id="4941627891654116707">Betűméret</translation> <translation id="494286511941020793">Proxykonfigurációs súgó</translation> +<translation id="4943368462779413526">Focilabda</translation> <translation id="4943691134276646401">A(z) „<ph name="CHROME_EXTENSION_NAME" />” soros porthoz szeretne csatlakozni</translation> <translation id="495170559598752135">Műveletek</translation> <translation id="4953689047182316270">Válasz kisegítő lehetőségekkel kapcsolatos eseményekre</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Mindig bekapcsolva</translation> <translation id="5067867186035333991">Kérdezzen rá, ha a(z) <ph name="HOST" /> hozzá szeretne férni a mikrofonhoz</translation> <translation id="5068918910148307423">Ne engedélyezze a nemrég bezárt webhelyek számára az adatküldés és -fogadás befejezését</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Egérmutató méretének beállítása</translation> <translation id="5072836811783999860">Kezelt könyvjelzők megjelenítése</translation> <translation id="5074318175948309511">Előfordulhat, hogy az új beállítások életbe lépéséhez az oldal újratöltése szükséges.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Más bővítmények viselkedésének megfigyelése, beleértve a felkeresett URL-eket</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">A merevlemez megtelt. Kérjük, mentsen másik helyre, vagy szabadítson fel elegendő helyet a merevlemezen.</translation> +<translation id="5123433949759960244">Kosárlabda</translation> <translation id="5125751979347152379">Érvénytelen URL</translation> <translation id="5127805178023152808">Szinkronizálás kikapcsolva</translation> <translation id="5127881134400491887">Hálózati kapcsolatok kezelése</translation> @@ -3270,6 +3282,7 @@ <translation id="6166185671393271715">Jelszavak importálása a Chrome-ba</translation> <translation id="6169040057125497443">Ellenőrizze a mikrofont.</translation> <translation id="6169666352732958425">Nem lehet átküldeni az asztalt.</translation> +<translation id="6170470584681422115">Szendvics</translation> <translation id="6171948306033499786">A nyomtatás szüneteltetése</translation> <translation id="6173623053897475761">Írja be újra a PIN-kódját</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3700,6 +3713,7 @@ <translation id="6870888490422746447">Alkalmazás kiválasztása és megosztása itt:</translation> <translation id="6871644448911473373">OCSP válaszadó: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">A szerver elutasította a megadott jelszót.</translation> +<translation id="6876155724392614295">Kerékpár</translation> <translation id="6878422606530379992">Érzékelők engedélyezve</translation> <translation id="6880587130513028875">A képek le vannak tiltva ezen az oldalon.</translation> <translation id="6883319974225028188">Hoppá! A rendszer nem tudta menteni az eszközkonfigurációt.</translation> @@ -4266,6 +4280,7 @@ <translation id="7772127298218883077">A <ph name="PRODUCT_NAME" /> névjegye</translation> <translation id="7772773261844472235">A Chromebook állapotának ellenőrzése</translation> <translation id="7773726648746946405">Programfolyamat-tárolás</translation> +<translation id="7774365994322694683">Madár</translation> <translation id="7776701556330691704">Nem található hang</translation> <translation id="7781335840981796660">Az összes felhasználói fiók és helyi adat törlődik.</translation> <translation id="7782102568078991263">Nincs több javaslat a Google-tól</translation> @@ -4671,6 +4686,7 @@ <translation id="8386903983509584791">Keresés befejezve</translation> <translation id="8389492867173948260">Engedélyezi az alkalmazás számára az Ön által felkeresett webhelyeken lévő valamennyi adatának olvasását és módosítását:</translation> <translation id="8390449457866780408">A szerver nem érhető el.</translation> +<translation id="8391218455464584335">Bakelitlemez</translation> <translation id="8391712576156218334">A kép nem hozzáférhető. Próbálja újra később.</translation> <translation id="8392234662362215700">A Control + Shift + szóköz billentyűk megnyomásával válthat a billentyűzetkiosztások között.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> beállításainak menüje</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index b38718d..00825bd 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Telusuri perangkat, aplikasi, dan web.</translation> <translation id="114721135501989771">Dapatkan kecanggihan Google di Chrome</translation> <translation id="1149401351239820326">Bulan akhir masa berlaku</translation> +<translation id="1150565364351027703">Kacamata Hitam</translation> <translation id="1151917987301063366">Selalu izinkan <ph name="HOST" /> mengakses sensor</translation> <translation id="1153356358378277386">Perangkat dihubungkan</translation> <translation id="1156488781945104845">Waktu saat ini</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Bantuan Pintasan Keyboard</translation> <translation id="2045969484888636535">Lanjutkan pencekalan cookie</translation> <translation id="204622017488417136">Perangkat Anda akan dikembalikan ke versi Chrome yang terpasang sebelumnya. Semua akun pengguna dan data lokal akan dihapus. Tindakan ini tidak dapat diurungkan.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Mengakses lalu lintas jaringan Anda</translation> <translation id="2048653237708779538">Tindakan tidak tersedia</translation> <translation id="2050339315714019657">Potret</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> ditambahkan</translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Menggunakan cookie untuk mengingat preferensi, meski Anda tidak membuka halaman tersebut</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Sesuaikan pemeriksaan ejaan</translation> <translation id="247051149076336810">URL berbagi file</translation> <translation id="2470702053775288986">Ekstensi yang tidak didukung dinonaktifkan</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Hapus dari daftar</translation> <translation id="2770690685823456775">Ekspor sandi Anda ke folder lain</translation> <translation id="2771268254788431918">Data seluler diaktifkan</translation> +<translation id="2771816809568414714">Keju</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Dukungan Browser Lama</translation> <translation id="2773802008104670137">Jenis file ini dapat membahayakan komputer.</translation> @@ -1653,6 +1657,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Hapus Data browsing...</translation> <translation id="3617891479562106823">Background tidak tersedia. Coba lagi nanti.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Pengguna yang diawasi ini akan dikelola oleh <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Buka kunci perangkat dan login ke Akun Google</translation> <translation id="3625258641415618104">Screenshot dinonaktifkan</translation> @@ -2131,6 +2136,7 @@ <translation id="4359717112757026264">Pemandangan Kota</translation> <translation id="4361142739114356624">Kunci Pribadi untuk Sertifikat Klien ini tidak ditemukan atau tidak valid</translation> <translation id="4363771538994847871">Tujuan Transmisi tidak ditemukan. Perlu bantuan?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> membagikan jendela.</translation> <translation id="4364830672918311045">Tampilkan notifikasi</translation> <translation id="4365673000813822030">Ups, Sinkronisasi berhenti bekerja.</translation> @@ -2320,6 +2326,7 @@ <translation id="4690091457710545971"><Empat file dibuat oleh firmware Wi-Fi Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Ketiga file pertama adalah file biner yang berisi dump pendaftaran, dan dinyatakan oleh Intel tidak berisi informasi pribadi atau yang mengidentifikasi perangkat. File terakhir adalah pelacakan eksekusi dari firmware Intel; file tersebut telah dibersihkan dari informasi pribadi atau yang mengidentifikasi perangkat, namun terlalu besar untuk ditampilkan di sini. Semua file tersebut dibuat untuk merespons masalah Wi-Fi baru-baru ini di perangkat Anda, dan akan dibagikan kepada Intel untuk membantu memecahkan masalah tersebut.></translation> <translation id="469230890969474295">Folder OEM</translation> <translation id="4692623383562244444">Mesin telusur</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Konfigurasi printer ditangani oleh administrator.</translation> <translation id="4694604912444486114">Kera</translation> <translation id="4697551882387947560">Saat sesi menjelajah berakhir</translation> @@ -2374,6 +2381,7 @@ <translation id="4776917500594043016">Sandi untuk <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pop-up diblokir}other{# pop-up diblokir}}</translation> <translation id="4780321648949301421">Simpan Halaman Sebagai...</translation> <translation id="4785719467058219317">Anda menggunakan kunci keamanan yang tidak terdaftar di situs ini</translation> @@ -2386,6 +2394,7 @@ <translation id="4801448226354548035">Sembunyikan akun</translation> <translation id="4801512016965057443">Izinkan roaming data seluler</translation> <translation id="4804818685124855865">Putuskan</translation> +<translation id="4804827417948292437">Avokad</translation> <translation id="4807098396393229769">Nama di kartu</translation> <translation id="4808667324955055115">Pop-up diblokir:</translation> <translation id="480990236307250886">Buka beranda</translation> @@ -2480,6 +2489,7 @@ <translation id="4941246025622441835">Gunakan permintaan perangkat ini saat mendaftarkan perangkat untuk pengelolaan perusahaan:</translation> <translation id="4941627891654116707">Ukuran font</translation> <translation id="494286511941020793">Bantuan Konfigurasi Proxy</translation> +<translation id="4943368462779413526">Sepak bola</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ingin terhubung ke port serial</translation> <translation id="495170559598752135">Tindakan</translation> <translation id="4953689047182316270">Merespons Acara Aksesibilitas</translation> @@ -2549,6 +2559,7 @@ <translation id="5067399438976153555">Selalu aktif</translation> <translation id="5067867186035333991">Tanyakan jika <ph name="HOST" /> ingin mengakses mikrofon Anda</translation> <translation id="5068918910148307423">Jangan izinkan situs yang baru ditutup untuk menyelesaikan pengiriman dan penerimaan data</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Sesuaikan ukuran kursor</translation> <translation id="5072836811783999860">Tampilkan bookmark yang dikelola</translation> <translation id="5074318175948309511">Halaman ini mungkin perlu dimuat ulang sebelum setelan baru berpengaruh.</translation> @@ -2583,6 +2594,7 @@ <translation id="5117930984404104619">Memantau perilaku ekstensi lain, termasuk URL yang dikunjungi</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Hard disk Anda sudah penuh. Simpan ke lokasi lain atau kosongkan lebih banyak ruang pada hard disk.</translation> +<translation id="5123433949759960244">Bola basket</translation> <translation id="5125751979347152379">URL tidak valid.</translation> <translation id="5127805178023152808">Sinkronisasi nonaktif</translation> <translation id="5127881134400491887">Mengelola sambungan jaringan</translation> @@ -3266,6 +3278,7 @@ <translation id="6166185671393271715">Impor Sandi ke Chrome</translation> <translation id="6169040057125497443">Harap periksa mikrofon Anda.</translation> <translation id="6169666352732958425">Tidak dapat mentransmisi desktop.</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">Jeda pencetakan</translation> <translation id="6173623053897475761">Ketik PIN Anda lagi</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3696,6 +3709,7 @@ <translation id="6870888490422746447">Pilih aplikasi untuk membagikan:</translation> <translation id="6871644448911473373">Penanggap OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Sandi yang Anda masukkan ditolak oleh server.</translation> +<translation id="6876155724392614295">Sepeda</translation> <translation id="6878422606530379992">Sensor diizinkan</translation> <translation id="6880587130513028875">Gambar diblokir di halaman ini.</translation> <translation id="6883319974225028188">Maaf! Sistem gagal menyimpan konfigurasi ponsel.</translation> @@ -4262,6 +4276,7 @@ <translation id="7772127298218883077">Tentang <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Periksa status Chromebook Anda</translation> <translation id="7773726648746946405">Penyimpanan sesi</translation> +<translation id="7774365994322694683">Burung</translation> <translation id="7776701556330691704">Suara tidak ditemukan</translation> <translation id="7781335840981796660">Semua akun dan data lokal pengguna akan dihapus.</translation> <translation id="7782102568078991263">Tidak ada lagi saran dari Google</translation> @@ -4667,6 +4682,7 @@ <translation id="8386903983509584791">Pemindaian selesai</translation> <translation id="8389492867173948260">Mengizinkan ekstensi ini membaca dan mengubah semua data Anda di situs yang dibuka:</translation> <translation id="8390449457866780408">Server tidak tersedia.</translation> +<translation id="8391218455464584335">Piringan hitam</translation> <translation id="8391712576156218334">Gambar tidak tersedia. Coba lagi nanti.</translation> <translation id="8392234662362215700">Tekan Control-Shift-Space untuk mengubah tata letak keyboard.</translation> <translation id="8392451568018454956">Menu opsi untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 1dded297..7be9d7e3 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Cerca sul dispositivo, nelle app e sul Web.</translation> <translation id="114721135501989771">Tutta l'intelligenza Google in Chrome</translation> <translation id="1149401351239820326">Mese di scadenza</translation> +<translation id="1150565364351027703">Occhiali da sole</translation> <translation id="1151917987301063366">Consenti sempre a <ph name="HOST" /> di accedere ai sensori</translation> <translation id="1153356358378277386">Dispositivi accoppiati</translation> <translation id="1156488781945104845">Ora corrente</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Guida alle scorciatoie da tastiera</translation> <translation id="2045969484888636535">Continua a bloccare i cookie</translation> <translation id="204622017488417136">Sul dispositivo verrà ripristinata la versione di Chrome installata precedentemente. Tutti gli account utente e i dati locali verranno rimossi. L'operazione non può essere annullata.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Accesso al traffico di rete</translation> <translation id="2048653237708779538">Azione non disponibile</translation> <translation id="2050339315714019657">Verticale</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187">È stata aggiunta la stampante <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Utilizza i cookie per memorizzare le tue preferenze, anche se non visiti quelle pagine</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Personalizza controllo ortografico</translation> <translation id="247051149076336810">URL condivisione file</translation> <translation id="2470702053775288986">Estensioni non supportate disattivate</translation> @@ -1130,6 +1133,7 @@ <translation id="2770465223704140727">Rimuovi dall'elenco</translation> <translation id="2770690685823456775">Esporta le password in un'altra cartella</translation> <translation id="2771268254788431918">Dati mobili attivati</translation> +<translation id="2771816809568414714">Formaggio</translation> <translation id="2772936498786524345">Molla</translation> <translation id="2773288106548584039">Supporto dei browser precedenti</translation> <translation id="2773802008104670137">Questo tipo di file potrebbe danneggiare il computer.</translation> @@ -1651,6 +1655,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Cancella dati di navigazione...</translation> <translation id="3617891479562106823">Gli sfondi non sono disponibili. Riprova più tardi.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Questo utente supervisionato verrà gestito da <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Sblocca il dispositivo e accedi all'Account Google</translation> <translation id="3625258641415618104">Screenshot disabilitati</translation> @@ -2129,6 +2134,7 @@ <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">La chiave privata per il certificato client manca o non è valida</translation> <translation id="4363771538994847871">Nessuna destinazione trovata per Cast. Hai bisogno di assistenza?</translation> +<translation id="4364327530094270451">Melone</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> condivide una finestra.</translation> <translation id="4364830672918311045">Mostra notifiche</translation> <translation id="4365673000813822030">Spiacenti, la sincronizzazione si è interrotta.</translation> @@ -2318,6 +2324,7 @@ <translation id="4690091457710545971"><Quattro file generati dal firmware Intel Wi-Fi: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. I primi tre sono file binari che contengono dump di registro e che, secondo quanto dichiarato da Intel, non contengono informazioni personali o di identificazione del dispositivo. L'ultimo file è una traccia di esecuzione dal firmware Intel, privato di ogni informazione personale o di identificazione del dispositivo, ma troppo grande per essere mostrato qui. Questi file sono stati generati in risposta ai recenti problemi del tuo dispositivo con la rete Wi-Fi e verranno condivisi con Intel per agevolare la risoluzione di tali problemi.></translation> <translation id="469230890969474295">Cartella OEM</translation> <translation id="4692623383562244444">Motori di ricerca</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Le stampanti vengono configurate dall'amministratore.</translation> <translation id="4694604912444486114">Scimmia</translation> <translation id="4697551882387947560">Quando termina la sessione di navigazione</translation> @@ -2372,6 +2379,7 @@ <translation id="4776917500594043016">Password per <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Popup bloccato}other{# popup bloccati}}</translation> <translation id="4780321648949301421">Salva pagina con nome...</translation> <translation id="4785719467058219317">Stai usando un token di sicurezza non registrato su questo sito web</translation> @@ -2384,6 +2392,7 @@ <translation id="4801448226354548035">Nascondi account</translation> <translation id="4801512016965057443">Consenti roaming dati mobile</translation> <translation id="4804818685124855865">Disconnetti</translation> +<translation id="4804827417948292437">Avocado</translation> <translation id="4807098396393229769">Nome sulla carta di credito</translation> <translation id="4808667324955055115">Popup bloccati</translation> <translation id="480990236307250886">Apri pagina iniziale</translation> @@ -2478,6 +2487,7 @@ <translation id="4941246025622441835">Utilizza questa richiesta dispositivo durante la registrazione del dispositivo per la gestione aziendale:</translation> <translation id="4941627891654116707">Dimensioni carattere</translation> <translation id="494286511941020793">Guida configurazione proxy</translation> +<translation id="4943368462779413526">Calcio</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" vuole collegarsi a una porta seriale</translation> <translation id="495170559598752135">Azioni</translation> <translation id="4953689047182316270">Rispondi agli eventi di accessibilità</translation> @@ -2547,6 +2557,7 @@ <translation id="5067399438976153555">Sempre attivo</translation> <translation id="5067867186035333991">Chiedi conferma se <ph name="HOST" /> vuole accedere al microfono</translation> <translation id="5068918910148307423">Non consentire ai siti chiusi di recente di terminare l'invio e la ricezione di dati</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Regola dimensioni puntatore</translation> <translation id="5072836811783999860">Mostra Preferiti gestiti</translation> <translation id="5074318175948309511">Potrebbe essere necessario ricaricare la pagina per applicare le nuove impostazioni.</translation> @@ -2581,6 +2592,7 @@ <translation id="5117930984404104619">Monitoraggio del comportamento di altre estensioni, compresi gli URL visitati</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Il disco rigido è pieno. Salva in un'altra posizione o libera spazio sul disco rigido.</translation> +<translation id="5123433949759960244">Basket</translation> <translation id="5125751979347152379">URL non valido.</translation> <translation id="5127805178023152808">La sincronizzazione è disattivata</translation> <translation id="5127881134400491887">Gestione di connessioni di rete</translation> @@ -3264,6 +3276,7 @@ <translation id="6166185671393271715">Importa le password in Chrome</translation> <translation id="6169040057125497443">Controlla il microfono.</translation> <translation id="6169666352732958425">Impossibile trasmettere il desktop.</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">Metti in pausa la stampa</translation> <translation id="6173623053897475761">Digita di nuovo il PIN</translation> <translation id="6175314957787328458">GUID di dominio Microsoft</translation> @@ -3413,7 +3426,7 @@ <translation id="641081527798843608">Corrispondenza oggetto</translation> <translation id="6412931879992742813">Nuova finestra di navigazione in incognito</translation> <translation id="6415900369006735853">Connettiti a Internet tramite il telefono</translation> -<translation id="6416743254476733475">Consenti o blocca sul computer.</translation> +<translation id="6416743254476733475">Consenti o blocca sul tuo computer.</translation> <translation id="6417265370957905582">Assistente Google</translation> <translation id="6418160186546245112">Ripristino della versione precedente installata di <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="6418481728190846787">Rimuovi definitivamente accesso per tutte le app</translation> @@ -3694,6 +3707,7 @@ <translation id="6870888490422746447">Scegli un'app per la condivisione:</translation> <translation id="6871644448911473373">Risponditore OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">La password inserita è stata rifiutata dal server.</translation> +<translation id="6876155724392614295">Bicicletta</translation> <translation id="6878422606530379992">Sensori consentiti</translation> <translation id="6880587130513028875">Le immagini sono state bloccate in questa pagina.</translation> <translation id="6883319974225028188">Spiacenti. Impossibile salvare la configurazione del dispositivo.</translation> @@ -4258,6 +4272,7 @@ <translation id="7772127298218883077">Informazioni su <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Controlla lo stato del Chromebook</translation> <translation id="7773726648746946405">Session storage</translation> +<translation id="7774365994322694683">Uccellino</translation> <translation id="7776701556330691704">Nessuna voce trovata</translation> <translation id="7781335840981796660">Tutti gli account utente e i dati locali verranno rimossi.</translation> <translation id="7782102568078991263">Nessun altro suggerimento da Google</translation> @@ -4662,6 +4677,7 @@ <translation id="8386903983509584791">Scansione completata</translation> <translation id="8389492867173948260">Permetti a questa estensione di leggere e modificare tutti i dati relativi ai siti web che hai visitato:</translation> <translation id="8390449457866780408">Server non disponibile.</translation> +<translation id="8391218455464584335">Vinile</translation> <translation id="8391712576156218334">Immagine non disponibile. Riprova più tardi.</translation> <translation id="8392234662362215700">Premi CTRL + MAIUSC + barra spaziatrice per cambiare il layout della tastiera.</translation> <translation id="8392451568018454956">Menu Opzioni per <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 9ddc602c..48eab49 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">אפשר לחפש במכשיר, באפליקציות ובאינטרנט.</translation> <translation id="114721135501989771">תכונות חכמות של Google</translation> <translation id="1149401351239820326">חודש פקיעת התוקף</translation> +<translation id="1150565364351027703">משקפי שמש</translation> <translation id="1151917987301063366">לאפשר תמיד ל-<ph name="HOST" /> לגשת אל חיישנים</translation> <translation id="1153356358378277386">מכשירים מותאמים</translation> <translation id="1156488781945104845">שעה נוכחית</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">כלי העזרה למקשי קיצור</translation> <translation id="2045969484888636535">המשך לחסום קובצי Cookie</translation> <translation id="204622017488417136">המכשיר שלך יוחזר לגרסה הקודמת המותקנת של Chrome. כל חשבונות המשתמשים והנתונים המקומיים יוסרו. לא ניתן לבטל פעולה זו.</translation> +<translation id="2046702855113914483">ראמן</translation> <translation id="2048182445208425546">גישה לתנועת הרשת שלך</translation> <translation id="2048653237708779538">הפעולה לא זמינה</translation> <translation id="2050339315714019657">לאורך</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187">המדפסת <ph name="PRINTER_NAME" /> נוספה</translation> <translation id="2464089476039395325">שרת proxy של HTTP</translation> <translation id="2468205691404969808">שימוש בקובצי cookie כדי לשמור את ההעדפות שלך, גם אם לא נכנסת אל הדפים האלה</translation> +<translation id="2468402215065996499">טמגוצ'י</translation> <translation id="2469375675106140201">התאמה אישית של בדיקת האיות</translation> <translation id="247051149076336810">כתובת אתר של התקן רשת לשיתוף קבצים</translation> <translation id="2470702053775288986">תוספים שלא נתמכים הושבתו</translation> @@ -1129,6 +1132,7 @@ <translation id="2770465223704140727">הסר מהרשימה</translation> <translation id="2770690685823456775">אפשר לייצא את הסיסמאות לתיקייה אחרת</translation> <translation id="2771268254788431918">חבילת גלישה הופעלה</translation> +<translation id="2771816809568414714">גבינה</translation> <translation id="2772936498786524345">מתגנב</translation> <translation id="2773288106548584039">תמיכה בדפדפן מדור קודם</translation> <translation id="2773802008104670137">קובץ מהסוג הזה עלול לגרום נזק למחשב שלך.</translation> @@ -1652,6 +1656,7 @@ <translation id="3616113530831147358">אודיו</translation> <translation id="3616741288025931835">&נקה נתוני גלישה...</translation> <translation id="3617891479562106823">רקעים אינם זמינים. צריך לנסות שוב מאוחר יותר.</translation> +<translation id="3619115746895587757">קפוצ'ינו</translation> <translation id="3623574769078102674">משתמש בפיקוח זה ינוהל על ידי <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">ביטול נעילת המכשיר וכניסה אל חשבון Google</translation> <translation id="3625258641415618104">צילומי מסך מושבתים</translation> @@ -2130,6 +2135,7 @@ <translation id="4359717112757026264">נוף עירוני</translation> <translation id="4361142739114356624">המפתח הפרטי לאישור לקוח זה חסר או אינו חוקי</translation> <translation id="4363771538994847871">לא נמצא יעד להעברה. רוצה עזרה?</translation> +<translation id="4364327530094270451">מלון</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> משתף חלון.</translation> <translation id="4364830672918311045">הצגת הודעות</translation> <translation id="4365673000813822030">אופס, הסינכרון הפסיק לפעול.</translation> @@ -2319,6 +2325,7 @@ <translation id="4690091457710545971"><קושחת ה-Wi-Fi של Intel יצרה ארבעה קבצים: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. שלושת הקבצים הראשונים הם קובצי Dump בינאריים של הרישום, והמערכת של Intel מטפלת בהם מתוך הנחה שהם לא מכילים מידע שמאפשר זיהוי אישי או זיהוי של המכשיר. הקובץ האחרון הוא מעקב ביצוע מהקושחה של Intel. נמחק ממנו מידע שמאפשר זיהוי אישי או זיהוי של המכשיר, אבל הוא גדול מדי מכדי להציג אותו כאן. הקבצים האלה נוצרו בתגובה לבעיות שאירעו לאחרונה בחיבור ה-Wi-Fi של המכשיר שלך, והם ישותפו עם Intel בניסיון לפתור את הבעיות האלה.></translation> <translation id="469230890969474295">תיקיית OEM</translation> <translation id="4692623383562244444">מנועי חיפוש</translation> +<translation id="4693155481716051732">סושי</translation> <translation id="4694024090038830733">מנהל המערכת קובע את תצורת המדפסת.</translation> <translation id="4694604912444486114">קוף</translation> <translation id="4697551882387947560">כאשר הפעלת הגלישה מסתיימת</translation> @@ -2373,6 +2380,7 @@ <translation id="4776917500594043016">סיסמה עבור <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">חנות Play</translation> <translation id="4779083564647765204">מרחק מתצוגה</translation> +<translation id="4779136857077979611">אוניגירי</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{חלון קופץ נחסם}two{# חלונות קופצים נחסמו}many{# חלונות קופצים נחסמו}other{# חלונות קופצים נחסמו}}</translation> <translation id="4780321648949301421">שמירת הדף בשם...</translation> <translation id="4785719467058219317">בחרת להשתמש במפתח אבטחה שלא רשום עבור האתר הזה</translation> @@ -2385,6 +2393,7 @@ <translation id="4801448226354548035">הסתר חשבונות</translation> <translation id="4801512016965057443">אפשר נדידת נתונים לנייד </translation> <translation id="4804818685124855865">נתק</translation> +<translation id="4804827417948292437">אבוקדו</translation> <translation id="4807098396393229769">שם על הכרטיס</translation> <translation id="4808667324955055115">חלונות קופצים חסומים</translation> <translation id="480990236307250886">פתח את דף הבית</translation> @@ -2479,6 +2488,7 @@ <translation id="4941246025622441835">השתמש במכשיר זה בעת הרשמת המכשיר לניהול ארגוני:</translation> <translation id="4941627891654116707">גודל גופן</translation> <translation id="494286511941020793">עזרה של תצורת שרת Proxy</translation> +<translation id="4943368462779413526">פוטבול</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" רוצה להתחבר אל יציאה טורית</translation> <translation id="495170559598752135">פעולות</translation> <translation id="4953689047182316270">להגיב לאירועי נגישות</translation> @@ -2548,6 +2558,7 @@ <translation id="5067399438976153555">תמיד פועל</translation> <translation id="5067867186035333991">שאל אם <ph name="HOST" /> רוצה לגשת למיקרופון שלך</translation> <translation id="5068918910148307423">אל תתיר לאתרים שנסגרו לאחרונה לסיים שליחה וקבלה של נתונים</translation> +<translation id="5068919226082848014">פיצה</translation> <translation id="5072052264945641674">התאם את גודל הסמן</translation> <translation id="5072836811783999860">הצג סימניות מנוהלות</translation> <translation id="5074318175948309511">ייתכן שיהיה צורך לטעון מחדש דף זה על מנת שההגדרות החדשות ייכנסו לתוקף.</translation> @@ -2582,6 +2593,7 @@ <translation id="5117930984404104619">מעקב אחר ההתנהגות של תוספים אחרים, כולל כתובות אתרים שמבקרים בהם</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">הדיסק הקשיח מלא. שמור במיקום אחר או פנה מקום בדיסק הקשיח.</translation> +<translation id="5123433949759960244">כדורסל</translation> <translation id="5125751979347152379">כתובת אתר לא חוקית.</translation> <translation id="5127805178023152808">סנכרון כבוי</translation> <translation id="5127881134400491887">ניהול חיבורי רשת</translation> @@ -3265,6 +3277,7 @@ <translation id="6166185671393271715">ייבוא סיסמאות אל Chrome</translation> <translation id="6169040057125497443">יש לבדוק את המיקרופון.</translation> <translation id="6169666352732958425">לא ניתן להעביר את שולחן העבודה.</translation> +<translation id="6170470584681422115">כריך</translation> <translation id="6171948306033499786">השהה הדפסה</translation> <translation id="6173623053897475761">יש להקליד שוב את הקוד</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3695,6 +3708,7 @@ <translation id="6870888490422746447">בחר אפליקציה לשיתוף:</translation> <translation id="6871644448911473373">מגיב OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">השרת דחה את הסיסמה שהזנת.</translation> +<translation id="6876155724392614295">אופניים</translation> <translation id="6878422606530379992">השימוש בחיישנים מותר</translation> <translation id="6880587130513028875">תמונות נחסמו בדף זה</translation> <translation id="6883319974225028188">אופס! המערכת לא הצליחה לשמור את תצורת המכשיר.</translation> @@ -4259,6 +4273,7 @@ <translation id="7772127298218883077">מידע על <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">בדיקת הסטטוס של ה-Chromebook</translation> <translation id="7773726648746946405">אחסון הפעלה</translation> +<translation id="7774365994322694683">ציפור</translation> <translation id="7776701556330691704">לא נמצאו קולות</translation> <translation id="7781335840981796660">תתבצע הסרה של כל חשבונות המשתמש והנתונים השמורים במכשיר.</translation> <translation id="7782102568078991263">אין יותר הצעות מ-Google</translation> @@ -4665,6 +4680,7 @@ <translation id="8386903983509584791">הסריקה הושלמה</translation> <translation id="8389492867173948260">מתן הרשאה לתוסף הזה לקרוא ולשנות את כל הנתונים שלך באתרים שאליהם נכנסת:</translation> <translation id="8390449457866780408">השרת אינו זמין.</translation> +<translation id="8391218455464584335">וייניל</translation> <translation id="8391712576156218334">התמונה לא זמינה. צריך לנסות שוב מאוחר יותר.</translation> <translation id="8392234662362215700">כדי להחליף את פריסת המקלדת, הקש על Control-Shift-מקש הרווח.</translation> <translation id="8392451568018454956">תפריט אפשרויות עבור <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 373273b..09e4a46 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">デバイス、アプリ、ウェブを検索します。</translation> <translation id="114721135501989771">Chrome で Google の最先端技術を活用</translation> <translation id="1149401351239820326">有効期限(月)</translation> +<translation id="1150565364351027703">サングラス</translation> <translation id="1151917987301063366"><ph name="HOST" /> によるセンサーへのアクセスを常に許可する</translation> <translation id="1153356358378277386">ペア設定されたデバイス</translation> <translation id="1156488781945104845">現在の時刻</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">キーボード ショートカット ヘルパー</translation> <translation id="2045969484888636535">Cookie のブロックを続行する</translation> <translation id="204622017488417136">以前インストールしたバージョンの Chrome にデバイスを戻します。すべてのユーザー アカウントとローカルデータは削除されます。この操作は元に戻せません。</translation> +<translation id="2046702855113914483">ラーメン</translation> <translation id="2048182445208425546">ユーザーのネットワーク トラフィックへのアクセス</translation> <translation id="2048653237708779538">操作できません</translation> <translation id="2050339315714019657">縦</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> を追加しました</translation> <translation id="2464089476039395325">HTTP プロキシ</translation> <translation id="2468205691404969808">Cookie を使って設定を保存する(これらのページにアクセスしない場合も Cookie が保持されます)</translation> +<translation id="2468402215065996499">たまごっち</translation> <translation id="2469375675106140201">スペルチェックをカスタマイズ</translation> <translation id="247051149076336810">ファイル共有 URL</translation> <translation id="2470702053775288986">サポートされていない拡張機能が無効</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">リストから削除</translation> <translation id="2770690685823456775">パスワードを別のフォルダにエクスポートしてください</translation> <translation id="2771268254788431918">モバイルデータ有効</translation> +<translation id="2771816809568414714">チーズ</translation> <translation id="2772936498786524345">スニーキー</translation> <translation id="2773288106548584039">従来のブラウザのサポート</translation> <translation id="2773802008104670137">この種類のファイルはパソコンに危害を及ぼす可能性があります。</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">音声</translation> <translation id="3616741288025931835">閲覧履歴を消去(&C)...</translation> <translation id="3617891479562106823">背景を利用できません。しばらくしてからもう一度お試しください。</translation> +<translation id="3619115746895587757">カプチーノ</translation> <translation id="3623574769078102674">この監視対象ユーザーは <ph name="MANAGER_EMAIL" /> によって管理されます。</translation> <translation id="3624567683873126087">デバイスのロックを解除して Google アカウントにログインする</translation> <translation id="3625258641415618104">スクリーンショットが無効</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">このクライアント証明書には秘密鍵がないか、秘密鍵が無効です</translation> <translation id="4363771538994847871">キャスト先が見つかりません。ヘルプを表示しますか?</translation> +<translation id="4364327530094270451">メロン</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> がウィンドウを共有しています。</translation> <translation id="4364830672918311045">通知を表示</translation> <translation id="4365673000813822030">同期は停止されました。</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Intel Wi-Fi ファームウェアにより生成された 4 つのファイル: csr.lst、fh_regs.lst、radio_reg.lst、monitor.lst.sysmon。最初の 3 つはレジスタダンプを含むバイナリ ファイルで、個人情報や端末を特定できる情報を一切含まないことが Intel により表明されています。最後の 1 つは Intel ファームウェアからの実行トレースで、個人情報や端末を特定できる情報は除かれていますが、サイズが大きいためここには表示できません。これらのファイルはご使用の端末で最近発生した Wi-Fi の問題への応答として生成されたもので、問題を調査するために Intel と共有されます。></translation> <translation id="469230890969474295">OEM フォルダ</translation> <translation id="4692623383562244444">検索エンジン</translation> +<translation id="4693155481716051732">お寿司</translation> <translation id="4694024090038830733">プリンタの設定を行えるのは管理者のみです。</translation> <translation id="4694604912444486114">サル</translation> <translation id="4697551882387947560">ブラウザ セッションの終了時</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> のパスワード</translation> <translation id="4777825441726637019">Play ストア</translation> <translation id="4779083564647765204">ズーム</translation> +<translation id="4779136857077979611">おにぎり</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{ポップアップがブロックされました}other{# 件のポップアップがブロックされました}}</translation> <translation id="4780321648949301421">ページを別名で保存...</translation> <translation id="4785719467058219317">このウェブサイトに登録されていないセキュリティ キーを使用しています</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">アカウントを非表示にする</translation> <translation id="4801512016965057443">モバイル データ ローミングを許可する</translation> <translation id="4804818685124855865">切断</translation> +<translation id="4804827417948292437">アボカド</translation> <translation id="4807098396393229769">カード名義人(半角英文字)</translation> <translation id="4808667324955055115">ポップアップがブロックされました:</translation> <translation id="480990236307250886">ホームページを開く</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">エンタープライズ管理のためにデバイスを登録するときにこのデバイス利用申請を使用する:</translation> <translation id="4941627891654116707">フォントサイズ</translation> <translation id="494286511941020793">プロキシ設定ヘルプ</translation> +<translation id="4943368462779413526">フットボール</translation> <translation id="4943691134276646401">「<ph name="CHROME_EXTENSION_NAME" />」がシリアルポートへの接続を要求しています</translation> <translation id="495170559598752135">操作</translation> <translation id="4953689047182316270">ユーザー補助機能のイベントへの応答</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">常にオン</translation> <translation id="5067867186035333991"><ph name="HOST" /> がマイクへのアクセスを必要としているときは確認画面を表示する</translation> <translation id="5068918910148307423">最近閉じたサイトがデータの送受信を完了できないようにする</translation> +<translation id="5068919226082848014">ピザ</translation> <translation id="5072052264945641674">カーソルのサイズを調整</translation> <translation id="5072836811783999860">管理対象のブックマークを表示</translation> <translation id="5074318175948309511">新しい設定を有効にするには、ページの再読み込みが必要な可能性があります。</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">他の拡張機能の動作を監視(アクセスした URL を含む)</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">ハード ディスクがいっぱいです。別の場所に保存するか、ハード ディスクの空き容量を増やしてください。</translation> +<translation id="5123433949759960244">バスケットボール</translation> <translation id="5125751979347152379">URL が無効です。</translation> <translation id="5127805178023152808">同期は無効です</translation> <translation id="5127881134400491887">ネットワーク接続の管理</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Chrome にパスワードをインポート</translation> <translation id="6169040057125497443">マイクを確認してください。</translation> <translation id="6169666352732958425">デスクトップをキャストできません。</translation> +<translation id="6170470584681422115">サンドイッチ</translation> <translation id="6171948306033499786">印刷を一時停止</translation> <translation id="6173623053897475761">もう一度 PIN を入力してください</translation> <translation id="6175314957787328458">Microsoft ドメイン GUID</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">共有するアプリを選択してください:</translation> <translation id="6871644448911473373">OCSP レスポンダ: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">入力したパスワードはサーバーによって拒否されました。</translation> +<translation id="6876155724392614295">自転車</translation> <translation id="6878422606530379992">センサーが許可されました</translation> <translation id="6880587130513028875">このページの画像はブロックされました。</translation> <translation id="6883319974225028188">デバイスの設定を保存できませんでした。</translation> @@ -4265,6 +4279,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> について</translation> <translation id="7772773261844472235">Chromebook のステータスを確認</translation> <translation id="7773726648746946405">セッション ストレージ</translation> +<translation id="7774365994322694683">鳥</translation> <translation id="7776701556330691704">音声が見つかりません</translation> <translation id="7781335840981796660">すべてのユーザー アカウントとローカル データは削除されます。</translation> <translation id="7782102568078991263">候補は以上です</translation> @@ -4670,6 +4685,7 @@ <translation id="8386903983509584791">スキャンが完了しました</translation> <translation id="8389492867173948260">アクセスしたウェブサイト上にある自分の全データの読み取りと変更をこの拡張機能に許可します。</translation> <translation id="8390449457866780408">サーバーを使用できません。</translation> +<translation id="8391218455464584335">レコード</translation> <translation id="8391712576156218334">画像を利用できません。しばらくしてからもう一度お試しください。</translation> <translation id="8392234662362215700">キーボードのレイアウトを切り替えるには Ctrl+Shift+Space を押してください。</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> のオプション メニュー</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 533624a..2eb11f1f 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">ನಿಮ್ಮ ಸಾಧನ, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ನಲ್ಲಿ ಹುಡುಕಿ.</translation> <translation id="114721135501989771">Chrome ನಲ್ಲಿ Google ಸ್ಮಾರ್ಟ್ಗಳನ್ನು ಪಡೆಯಿರಿ</translation> <translation id="1149401351239820326">ಮುಕ್ತಾಯದ ತಿಂಗಳು</translation> +<translation id="1150565364351027703">ಸನ್ಗ್ಲಾಸ್ಗಳು</translation> <translation id="1151917987301063366">ಸೆನ್ಸರ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಗೆ ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ</translation> <translation id="1153356358378277386">ಜೋಡಿ ಮಾಡಲಾದ ಸಾಧನಗಳು</translation> <translation id="1156488781945104845">ಪ್ರಸ್ತುತ ಸಮಯ</translation> @@ -662,6 +663,7 @@ <translation id="2045117674524495717">ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ ಸಹಾಯಕ</translation> <translation id="2045969484888636535">ಕುಕೀಸ್ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸು</translation> <translation id="204622017488417136">ನಿಮ್ಮ ಸಾಧನವನ್ನು ಹಿಂದೆ ಸ್ಥಾಪಿಸಲಾದ Chrome ನ ಆವೃತ್ತಿಗೆ ಹಿಂತಿರುಗಿಸಲಾಗುತ್ತದೆ. ಎಲ್ಲ ಬಳಕೆದಾರರ ಖಾತೆಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. ಇದನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> +<translation id="2046702855113914483">ರಾಮೆನ್</translation> <translation id="2048182445208425546">ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಟ್ರ್ಯಾಫಿಕ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ</translation> <translation id="2048653237708779538">ಯಾವುದೇ ಕ್ರಿಯೆ ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="2050339315714019657">ಪೋಟ್ರೇಟ್</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> ಸೇರಿಸಲಾಗಿದೆ</translation> <translation id="2464089476039395325">HTTP ಪ್ರಾಕ್ಸಿ</translation> <translation id="2468205691404969808">ನೀವು ಆ ಪುಟಗಳಿಗೆ ಭೇಟಿ ನೀಡದಿದ್ದರೂ, ನಿಮ್ಮ ಆದ್ಯತೆಗಳನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲು ಕುಕೀಗಳನ್ನು ಬಳಸುತ್ತದೆ</translation> +<translation id="2468402215065996499">ತಮಗೋಟ್ಚಿ</translation> <translation id="2469375675106140201">ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ</translation> <translation id="247051149076336810">ಫೈಲ್ ಹಂಚಿಕೊಳ್ಳುವ URL</translation> <translation id="2470702053775288986">ಬೆಂಬಲವಿರದ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕಿ</translation> <translation id="2770690685823456775">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಇನ್ನೊಂದು ಫೋಲ್ಡರ್ಗೆ ಎಕ್ಸ್ಪೋರ್ಟ್ ಮಾಡಿ</translation> <translation id="2771268254788431918">ಮೊಬೈಲ್ ಡೇಟಾ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> +<translation id="2771816809568414714">ಚೀಸ್</translation> <translation id="2772936498786524345">ಸ್ನೀಕಿ</translation> <translation id="2773288106548584039">ಪಾರಂಪರಿಕ ಬ್ರೌಸರ್ ಬೆಂಬಲ</translation> <translation id="2773802008104670137">ಈ ಪ್ರಕಾರದ ಫೈಲ್ ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ಗೆ ಹಾನಿ ಮಾಡಬಹುದು.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">ಆಡಿಯೋ</translation> <translation id="3616741288025931835">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು &ತೆರವುಗೊಳಿಸಿ...</translation> <translation id="3617891479562106823">ಹಿನ್ನೆಲೆಗಳ ಕಸ್ಟಮೈಸೇಶನ್ ಲಭ್ಯವಿಲ್ಲ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> +<translation id="3619115746895587757">ಕ್ಯಾಪಚಿನೊ</translation> <translation id="3623574769078102674">ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು <ph name="MANAGER_EMAIL" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="3624567683873126087">ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ ಮತ್ತು Google ಖಾತೆಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="3625258641415618104">ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">ಈ ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರಕ್ಕೆ ವೈಯಕ್ತಿಕ ಕೀ ಕಾಣೆಯಾಗಿದೆ ಅಥವಾ ಅಮಾನ್ಯವಾಗಿದೆ</translation> <translation id="4363771538994847871">ಯಾವುದೇ ಬಿತ್ತರಿಸುವಿಕೆ ಗಮ್ಯಸ್ಥಾನಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ಸಹಾಯ ಬೇಕೇ?</translation> +<translation id="4364327530094270451">ಕರಬೂಜ ಹಣ್ಣು</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> ವಿಂಡೋವನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="4364830672918311045">ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಿ</translation> <translation id="4365673000813822030">ಓಹ್, ಸಿಂಕ್ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿದೆ.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Intel ವೈ-ಫೈ ಫರ್ಮ್ವೇರ್, ನಾಲ್ಕು ಫೈಲ್ಗಳನ್ನು ಉತ್ಪಾದಿಸಿದೆ: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. ಮೊದಲ ಮೂರು ಫೈಲ್ಗಳು, ರಿಜಿಸ್ಟರ್ ಡಂಪ್ಗಳನ್ನು ಹೊಂದಿರುವ ಬೈನರಿ ಫೈಲ್ಗಳಾಗಿವೆ ಮತ್ತು ಇವುಗಳಲ್ಲಿ ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿ ಅಥವಾ ಸಾಧನವನ್ನು-ಗುರುತಿಸುವ ಮಾಹಿತಿ ಇಲ್ಲವೆಂದು Intel ಪ್ರತಿಪಾದಿಸುತ್ತದೆ. ಕೊನೆಯ ಫೈಲ್, Intel ಫರ್ಮ್ವೇರ್ ಒದಗಿಸಿದ ಎಕ್ಸಿಕ್ಯೂಷನ್ ಟ್ರೇಸ್ ಆಗಿದೆ; ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿ ಅಥವಾ ಸಾಧನವನ್ನು-ಗುರುತಿಸುವ ಮಾಹಿತಿಯನ್ನು ಅದರಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ, ಆದರೆ ಅದು ತೀರಾ ದೊಡ್ಡದಾಗಿರುವುದರಿಂದ ಅದನ್ನು ಇಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಇತ್ತೀಚೆಗೆ ಉಂಟಾದ ವೈ-ಫೈ ಸಮಸ್ಯೆಗಳಿಗೆ ಪ್ರತಿಯಾಗಿ ಈ ಫೈಲ್ಗಳನ್ನು ಉತ್ಪಾದಿಸಲಾಗಿದೆ ಮತ್ತು ಈ ಸಮಸ್ಯೆಗಳನ್ನು ನಿವಾರಿಸಲು ನೆರವಾಗುವುದಕ್ಕಾಗಿ, Intel ನೊಂದಿಗೆ ಇವುಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.></translation> <translation id="469230890969474295">OEM ಫೋಲ್ಡರ್</translation> <translation id="4692623383562244444">ಹುಡುಕಾಟ ಎಂಜಿನ್ಗಳು</translation> +<translation id="4693155481716051732">ಸುಶಿ</translation> <translation id="4694024090038830733">ಪ್ರಿಂಟರ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿರ್ವಾಹಕರು ನಿಯಂತ್ರಿಸುತ್ತಿದ್ದಾರೆ.</translation> <translation id="4694604912444486114">ಕೋತಿ</translation> <translation id="4697551882387947560">ಬ್ರೌಸಿಂಗ್ ಸೆಷನ್ ಯಾವಾಗ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> ಗಾಗಿ ಪಾಸ್ವರ್ಡ್</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">ಝೂಮ್</translation> +<translation id="4779136857077979611">ಒನಿಗಿರಿ</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{ಪಾಪ್-ಅಪ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}one{# ಪಾಪ್-ಅಪ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}other{# ಪಾಪ್-ಅಪ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}}</translation> <translation id="4780321648949301421">ಇದರಂತೆ ಪುಟವನ್ನು ಉಳಿಸು...</translation> <translation id="4785719467058219317">ಈ ವೆಬ್ಸೈಟ್ನೊಂದಿಗೆ ನೋಂದಾಯಿಸಿಲ್ಲದ ಭದ್ರತೆ ಕೀಯನ್ನು ನೀವು ಬಳಸುತ್ತಿದ್ದೀರಿ</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">ಖಾತೆಗಳನ್ನು ಮರೆಮಾಡು</translation> <translation id="4801512016965057443">ಮೊಬೈಲ್ ಡೇಟಾ ರೋಮಿಂಗ್ ಅನ್ನು ಅನುಮತಿಸಿ</translation> <translation id="4804818685124855865">ಡಿಸ್ಕನೆಕ್ಟ್</translation> +<translation id="4804827417948292437">ಆವಕಾಡೊ</translation> <translation id="4807098396393229769">ಕಾರ್ಡ್ನಲ್ಲಿರುವ ಹೆಸರು</translation> <translation id="4808667324955055115">ಪಾಪ್-ಅಪ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ:</translation> <translation id="480990236307250886">ಮುಖ ಪುಟ ತೆರೆಯಿರಿ</translation> @@ -2483,6 +2492,7 @@ <translation id="4941246025622441835">ಎಂಟರ್ಪ್ರೈಸ್ ನಿರ್ವಹಣೆಗಾಗಿ ಸಾಧನವನ್ನು ದಾಖಲಿಸುತ್ತಿರುವಾಗ ಈ ಸಾಧನದ ನಿಯೋಜನೆಯನ್ನು ಬಳಸಿ:</translation> <translation id="4941627891654116707">ಫಾಂಟ್ ಗಾತ್ರ</translation> <translation id="494286511941020793">ಪ್ರಾಕ್ಸಿ ಕಾನ್ಫಿಗರೇಶನ್ ಸಹಾಯ</translation> +<translation id="4943368462779413526">ಫುಟ್ಬಾಲ್</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ಒಂದು ಸೀರಿಯಲ್ ಪೋರ್ಟ್ಗೆ ಸಂಪರ್ಕಿಸಲು ಬಯಸುತ್ತದೆ</translation> <translation id="495170559598752135">ಕ್ರಿಯೆಗಳು</translation> <translation id="4953689047182316270">ಪ್ರವೇಶಿಸುವಿಕೆ ಈವೆಂಟ್ಗಳಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸಿ</translation> @@ -2552,6 +2562,7 @@ <translation id="5067399438976153555">ಯಾವಾಗಲೂ ಆನ್</translation> <translation id="5067867186035333991">ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಬಯಸುತ್ತದೆಯೇ ಎಂಬುದನ್ನು ಕೇಳಿ</translation> <translation id="5068918910148307423">ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಮತ್ತು ಸ್ವೀಕರಿಸುವುದನ್ನು ಮುಕ್ತಾಯಗೊಳಿಸಲು ಇತ್ತೀಚಿಗೆ ಮುಚ್ಚಿದ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಬೇಡ</translation> +<translation id="5068919226082848014">ಪಿಜ್ಜಾ</translation> <translation id="5072052264945641674">ಕರ್ಸರ್ ಗಾತ್ರವನ್ನು ಹೊಂದಿಸಿ</translation> <translation id="5072836811783999860">ನಿರ್ವಹಿಸಲಾದ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ತೋರಿಸು</translation> <translation id="5074318175948309511">ಹೊಸ ಸೆಟ್ಟಿಂಗ್ಗಳು ಪರಿಣಾಮಕಾರಿಯಾಗುವುದಕ್ಕೆ ಮೊದಲು ಈ ಪುಟವನ್ನು ರಿಲೋಡ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation> @@ -2586,6 +2597,7 @@ <translation id="5117930984404104619">ಭೇಟಿ ನೀಡಿದ URL ಗಳು ಸೇರಿದಂತೆ, ಇತರ ವಿಸ್ತರಣೆಗಳ ವರ್ತನೆಯ ಮೇಲೆ ನಿಗಾವಹಿಸಿ</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">ನಿಮ್ಮ ಹಾರ್ಡ್ ಡಿಸ್ಕ್ ಭರ್ತಿಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ಸ್ಥಳದಲ್ಲಿ ಉಳಿಸಿ ಇಲ್ಲವೇ ಹಾರ್ಡ್ ಡಿಸ್ಕ್ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಅವಕಾಶ ಕಲ್ಪಿಸಿ.</translation> +<translation id="5123433949759960244">ಬ್ಯಾಸ್ಕೆಟ್ಬಾಲ್</translation> <translation id="5125751979347152379">ಅಮಾನ್ಯವಾದ URL.</translation> <translation id="5127805178023152808">ಸಿಂಕ್ ಆಫ್ ಆಗಿದೆ</translation> <translation id="5127881134400491887">ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> @@ -3270,6 +3282,7 @@ <translation id="6166185671393271715">Chrome ಗೆ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಆಮದು ಮಾಡಿ</translation> <translation id="6169040057125497443">ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ.</translation> <translation id="6169666352732958425">ಡೆಸ್ಕ್ಟಾಪ್ ಬಿತ್ತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> +<translation id="6170470584681422115">ಸ್ಯಾಂಡ್ವಿಚ್</translation> <translation id="6171948306033499786">ಮುದ್ರಿಸುವಿಕೆಯನ್ನು ವಿರಾಮಗೊಳಿಸಿ</translation> <translation id="6173623053897475761">ನಿಮ್ಮ ಪಿನ್ ಅನ್ನು ಪುನಃ ಟೈಪ್ ಮಾಡಿ</translation> <translation id="6175314957787328458">Microsoft ಡೊಮೇನ್ GUID</translation> @@ -3701,6 +3714,7 @@ <translation id="6870888490422746447">ಇದಕ್ಕೆ ಹಂಚಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ:</translation> <translation id="6871644448911473373">OCSP ಪ್ರತಿಕ್ರಿಯೆ ನೀಡುಗ: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">ನೀವು ನಮೂದಿಸಿದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸರ್ವರ್ ನಿಂದ ತಿರಸ್ಕರಿಸಲಾಗಿದೆ.</translation> +<translation id="6876155724392614295">ಬೈಕ್</translation> <translation id="6878422606530379992">ಸೆನ್ಸರ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="6880587130513028875">ಈ ಪುಟದಲ್ಲಿ ಚಿತ್ರಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation> <translation id="6883319974225028188">ಓಹ್! ಸಾಧನದ ಕಾನ್ಫಿಗರೇಶನ್ ಉಳಿಸಲು ಸಿಸ್ಟಂ ವಿಫಲವಾಗಿದೆ.</translation> @@ -4268,6 +4282,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> ಬಗ್ಗೆ</translation> <translation id="7772773261844472235">ನಿಮ್ಮ Chromebook ಸ್ಥಿತಿಯನ್ನು ಪರಿಶೀಲಿಸಿ</translation> <translation id="7773726648746946405">ಸೆಶನ್ ಸಂಗ್ರಹಣೆ</translation> +<translation id="7774365994322694683">ಪಕ್ಷಿ</translation> <translation id="7776701556330691704">ಯಾವುದೇ ಧ್ವನಿಗಳು ಕಂಡುಬಂದಿಲ್ಲ</translation> <translation id="7781335840981796660">ಎಲ್ಲ ಬಳಕೆದಾರ ಖಾತೆಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.</translation> <translation id="7782102568078991263">Google ನಿಂದ ಇನ್ಯಾವುದೇ ಸಲಹೆಗಳಿಲ್ಲ</translation> @@ -4671,6 +4686,7 @@ <translation id="8386903983509584791">ಸ್ಕ್ಯಾನ್ ಪೂರ್ಣಗೊಂಡಿದೆ</translation> <translation id="8389492867173948260">ನೀವು ಭೇಟಿ ನೀಡುವ ವೆಬ್ಸೈಟ್ಗಳಲ್ಲಿ ನಿಮ್ಮ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಓದಲು ಮತ್ತು ಬದಲಾಯಿಸಲು ಈ ವಿಸ್ತರಣೆಯನ್ನು ಅನುಮತಿಸಿ:</translation> <translation id="8390449457866780408">ಸರ್ವರ್ ಲಭ್ಯವಿಲ್ಲ.</translation> +<translation id="8391218455464584335">ವಿನೈಲ್</translation> <translation id="8391712576156218334">ಚಿತ್ರ ಲಭ್ಯವಿಲ್ಲ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8392234662362215700">ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಬದಲಾಯಿಸಲು Control-Shift-Space ಒತ್ತಿರಿ.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> ಅವರಿಗಾಗಿ ಆಯ್ಕೆಗಳ ಮೆನು</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index c135040..7e957d7 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">기기, 앱, 웹에서 검색하세요.</translation> <translation id="114721135501989771">Google로 Chrome을 더욱 스마트하게</translation> <translation id="1149401351239820326">유효기간 월</translation> +<translation id="1150565364351027703">선글라스</translation> <translation id="1151917987301063366"><ph name="HOST" />에서 센서에 액세스하도록 항상 허용</translation> <translation id="1153356358378277386">페어링된 기기</translation> <translation id="1156488781945104845">현재 시간</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">단축키 도움말</translation> <translation id="2045969484888636535">쿠키 계속 차단</translation> <translation id="204622017488417136">기기가 이전에 설치된 버전의 Chrome으로 돌아갑니다. 사용자 계정과 로컬 데이터가 모두 삭제됩니다. 이 작업은 취소할 수 없습니다.</translation> +<translation id="2046702855113914483">라면</translation> <translation id="2048182445208425546">네트워크 트래픽에 액세스</translation> <translation id="2048653237708779538">실행할 수 없는 작업</translation> <translation id="2050339315714019657">세로 방향</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> 추가됨</translation> <translation id="2464089476039395325">HTTP 프록시</translation> <translation id="2468205691404969808">페이지를 방문하지 않더라도 쿠키를 통해 환경설정 저장</translation> +<translation id="2468402215065996499">다마고치</translation> <translation id="2469375675106140201">맞춤법 검사 맞춤설정</translation> <translation id="247051149076336810">파일 공유 URL</translation> <translation id="2470702053775288986">지원되지 않는 확장 프로그램이 사용 중지됨</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">목록에서 삭제</translation> <translation id="2770690685823456775">비밀번호를 다른 폴더로 내보냅니다.</translation> <translation id="2771268254788431918">모바일 데이터 활성화됨</translation> +<translation id="2771816809568414714">치즈</translation> <translation id="2772936498786524345">닌자</translation> <translation id="2773288106548584039">이전 브라우저 지원</translation> <translation id="2773802008104670137">컴퓨터에 유해할 수 있는 파일 유형입니다.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">오디오</translation> <translation id="3616741288025931835">인터넷 사용 기록 삭제(&C)...</translation> <translation id="3617891479562106823">배경을 사용할 수 없습니다. 나중에 다시 시도하세요.</translation> +<translation id="3619115746895587757">카푸치노</translation> <translation id="3623574769078102674">이 관리 대상 사용자는 <ph name="MANAGER_EMAIL" />에서 관리합니다.</translation> <translation id="3624567683873126087">기기를 잠금 해제하고 Google 계정에 로그인합니다.</translation> <translation id="3625258641415618104">스크린샷 캡쳐 사용 중지됨</translation> @@ -2131,6 +2136,7 @@ <translation id="4359717112757026264">도시 풍경</translation> <translation id="4361142739114356624">이 클라이언트 인증서의 비공개 키가 없거나 잘못되었습니다.</translation> <translation id="4363771538994847871">전송 대상을 찾을 수 없습니다. 도움이 필요하세요?</translation> +<translation id="4364327530094270451">멜론</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />이(가) 창을 공유합니다.</translation> <translation id="4364830672918311045">알림 표시</translation> <translation id="4365673000813822030">동기화 작업이 중지되었습니다.</translation> @@ -2320,6 +2326,7 @@ <translation id="4690091457710545971"><Intel Wi-Fi 펌웨어에서 csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon 의 4개 파일을 생성하였습니다. 처음 3개 파일은 레지스터 덤프를 포함하는 바이너리 파일로 Intel에서 개인정보나 기기 식별 정보를 포함하지 않도록 선언되었습니다. 4번째 파일은 Intel 펌웨어의 실행 기록으로 모든 개인정보나 기기 식별 정보가 삭제되었지만 너무 커서 여기에 표시할 수 없습니다. 이러한 4개 파일은 최근에 발생한 기기의 Wi-Fi 문제로 인해 생성되었으며 관련 문제를 해결하기 위해 Intel과 공유됩니다.></translation> <translation id="469230890969474295">OEM 폴더</translation> <translation id="4692623383562244444">검색엔진</translation> +<translation id="4693155481716051732">초밥</translation> <translation id="4694024090038830733">프린터 구성은 관리자가 처리합니다.</translation> <translation id="4694604912444486114">원숭이</translation> <translation id="4697551882387947560">탐색 세션이 종료될 때</translation> @@ -2374,6 +2381,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />의 비밀번호</translation> <translation id="4777825441726637019">Play 스토어</translation> <translation id="4779083564647765204">글꼴 크기</translation> +<translation id="4779136857077979611">오니기리</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{팝업 1개 차단됨}other{팝업 #개 차단됨}}</translation> <translation id="4780321648949301421">페이지를 다른 이름으로 저장...</translation> <translation id="4785719467058219317">이 웹사이트에 등록되지 않은 보안 키를 사용하고 있습니다.</translation> @@ -2386,6 +2394,7 @@ <translation id="4801448226354548035">계정 숨기기</translation> <translation id="4801512016965057443">모바일 데이터 로밍 허용</translation> <translation id="4804818685124855865">연결 해제</translation> +<translation id="4804827417948292437">아보카도</translation> <translation id="4807098396393229769">카드 명의</translation> <translation id="4808667324955055115">팝업 차단됨</translation> <translation id="480990236307250886">홈페이지 열기</translation> @@ -2480,6 +2489,7 @@ <translation id="4941246025622441835">다음과 같이 기기를 엔터프라이즈 관리용으로 등록할 때 이 기기 요청을 사용합니다.</translation> <translation id="4941627891654116707">글꼴 크기</translation> <translation id="494286511941020793">프록시 설정 도움말</translation> +<translation id="4943368462779413526">풋볼</translation> <translation id="4943691134276646401">'<ph name="CHROME_EXTENSION_NAME" />'에서 시리얼 포트에 연결하려고 합니다.</translation> <translation id="495170559598752135">작업</translation> <translation id="4953689047182316270">접근성 이벤트에 응답</translation> @@ -2549,6 +2559,7 @@ <translation id="5067399438976153555">항상 사용</translation> <translation id="5067867186035333991"><ph name="HOST" />에서 마이크에 액세스하려는 경우 메시지 표시</translation> <translation id="5068918910148307423">최근에 닫은 사이트에서 데이터 전송 및 수신을 완료하는 것을 허용하지 않음</translation> +<translation id="5068919226082848014">피자</translation> <translation id="5072052264945641674">커서 크기 조정</translation> <translation id="5072836811783999860">관리 북마크 표시</translation> <translation id="5074318175948309511">새로운 설정을 적용하기 전에 페이지를 다시 로드해야 할 수도 있습니다.</translation> @@ -2583,6 +2594,7 @@ <translation id="5117930984404104619">방문한 URL을 포함하여 다른 확장 프로그램의 동작을 모니터링합니다.</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">하드 디스크가 가득 찼습니다. 다른 위치에 저장하거나 하드 디스크에 더 많은 공간을 확보하시기 바랍니다.</translation> +<translation id="5123433949759960244">농구공</translation> <translation id="5125751979347152379">잘못된 URL입니다.</translation> <translation id="5127805178023152808">동기화 사용 안함</translation> <translation id="5127881134400491887">네트워크 연결 관리</translation> @@ -3266,6 +3278,7 @@ <translation id="6166185671393271715">Chrome으로 비밀번호 가져오기</translation> <translation id="6169040057125497443">마이크를 확인하세요.</translation> <translation id="6169666352732958425">데스크톱을 전송할 수 없음</translation> +<translation id="6170470584681422115">샌드위치</translation> <translation id="6171948306033499786">인쇄 일시중지</translation> <translation id="6173623053897475761">PIN을 다시 입력하세요</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3696,6 +3709,7 @@ <translation id="6870888490422746447">공유할 앱 선택:</translation> <translation id="6871644448911473373">OCSP 응답자: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">입력한 비밀번호가 서버에 의해 거부되었습니다.</translation> +<translation id="6876155724392614295">자전거</translation> <translation id="6878422606530379992">센서가 허용됨</translation> <translation id="6880587130513028875">이 페이지에서 이미지가 차단되었습니다.</translation> <translation id="6883319974225028188">시스템에서 기기 구성을 저장하지 못했습니다.</translation> @@ -4262,6 +4276,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> 정보</translation> <translation id="7772773261844472235">Chromebook 상태 확인</translation> <translation id="7773726648746946405">세션 저장소</translation> +<translation id="7774365994322694683">새</translation> <translation id="7776701556330691704">음성을 찾을 수 없음</translation> <translation id="7781335840981796660">모든 사용자 계정과 로컬 데이터가 삭제됩니다.</translation> <translation id="7782102568078991263">Google의 추천 단어 없음</translation> @@ -4667,6 +4682,7 @@ <translation id="8386903983509584791">검색 완료</translation> <translation id="8389492867173948260">이 확장 프로그램이 내가 방문하는 다음 웹사이트의 모든 데이터를 읽고 변경하도록 허용합니다.</translation> <translation id="8390449457866780408">서버를 사용할 수 없습니다.</translation> +<translation id="8391218455464584335">레코드판</translation> <translation id="8391712576156218334">이미지를 사용할 수 없습니다. 나중에 다시 시도하세요.</translation> <translation id="8392234662362215700">키보드 레이아웃을 전환하려면 Control-Shift-Space 키를 누르세요.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" />의 옵션 메뉴</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 9468b14..3e0ec4f 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Ieškokite įrenginyje, programose, žiniatinklyje.</translation> <translation id="114721135501989771">„Google“ išm. funkc. „Chrome“</translation> <translation id="1149401351239820326">Galiojimo laiko pabaigos mėnuo</translation> +<translation id="1150565364351027703">Akiniai nuo saulės</translation> <translation id="1151917987301063366">Visada leisti <ph name="HOST" /> pasiekti jutiklius</translation> <translation id="1153356358378277386">Susieti įrenginiai</translation> <translation id="1156488781945104845">Dabartinis laikas</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Sparčiųjų klavišų pagalbos priemonė</translation> <translation id="2045969484888636535">Tęsti slapukų blokavimą</translation> <translation id="204622017488417136">Įrenginyje bus grąžinta anksčiau įdiegta „Chrome“ versija. Visos naudotojų paskyros ir vietiniai duomenys bus pašalinti. Šio veiksmo anuliuoti negalėsite.</translation> +<translation id="2046702855113914483">Ramenai</translation> <translation id="2048182445208425546">Pasiekti tinklo srautą</translation> <translation id="2048653237708779538">Negalima atlikti veiksmo</translation> <translation id="2050339315714019657">Stačias</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Pridėtas „<ph name="PRINTER_NAME" />“</translation> <translation id="2464089476039395325">HTTP tarpinis serveris</translation> <translation id="2468205691404969808">Naudoja slapukus, kad primintų jums apie nuostatas, net jei nesilankote tuose puslapiuose</translation> +<translation id="2468402215065996499">Tamagočis</translation> <translation id="2469375675106140201">Tinkinti rašybos tikrinimą</translation> <translation id="247051149076336810">Failo bendrinimo URL</translation> <translation id="2470702053775288986">Nepalaikomi plėtiniai išjungti</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Pašalinti iš sąrašo</translation> <translation id="2770690685823456775">Eksportuokite slaptažodžius į kitą aplanką</translation> <translation id="2771268254788431918">Mobiliojo ryšio duomenys suaktyvinti</translation> +<translation id="2771816809568414714">Sūris</translation> <translation id="2772936498786524345">Pasalūnas</translation> <translation id="2773288106548584039">Pasenusių naršyklių palaikymas</translation> <translation id="2773802008104670137">Šio tipo failas gali pažeisti kompiuterį.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Garsas</translation> <translation id="3616741288025931835">&Išvalyti naršymo duomenis...</translation> <translation id="3617891479562106823">Fonai nepasiekiami. Vėliau bandykite dar kartą.</translation> +<translation id="3619115746895587757">Kapučino kava</translation> <translation id="3623574769078102674">Šį prižiūrimą naudotoją tvarkys <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Atrakinti įrenginį ir prisijungti prie „Google“ paskyros</translation> <translation id="3625258641415618104">Ekrano kopijos išjungtos</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Miesto architektūra</translation> <translation id="4361142739114356624">Trūksta šio kliento sertifikato privataus rakto arba jis netinkamas</translation> <translation id="4363771538994847871">Nerasta jokių „Cast“ paskirties vietų. Reikia pagalbos?</translation> +<translation id="4364327530094270451">Melionas</translation> <translation id="4364567974334641491">„<ph name="APP_NAME" />“ bendrina langą.</translation> <translation id="4364830672918311045">Pateikti pranešimus</translation> <translation id="4365673000813822030">Deja, sinchronizavimas sustabdytas.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Keturi „Intel“ „Wi-Fi“ programinės aparatinės įrangos sugeneruoti failai: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Pirmieji trys yra dvejetainiai failai, kuriuose yra registro išklotinės ir kuriuos „Intel“ įvertino, kad nustatytų, ar nėra asmens ar įrenginį identifikuojančios informacijos. Paskutinis failas yra vykdymo pėdsakas iš „Intel“ programinės aparatinės įrangos. Jame išvalyta visa asmens ar įrenginį identifikuojanti informacija, bet jis per didelis, kad būtų galima čia pateikti. Šie failai sugeneruoti reaguojant į pastarąsias „Wi-Fi“ problemas, susijusias su įrenginiu, ir bus bendrinami su „Intel“, siekiant padėti pašalinti šias triktis.></translation> <translation id="469230890969474295">OEM aplankas</translation> <translation id="4692623383562244444">Paieškos varikliai</translation> +<translation id="4693155481716051732">Sušis</translation> <translation id="4694024090038830733">Spausdintuvą konfigūruoja administratorius.</translation> <translation id="4694604912444486114">Beždžionė</translation> <translation id="4697551882387947560">Pasibaigus naršymo sesijai</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> slaptažodis</translation> <translation id="4777825441726637019">„Play“ parduotuvė</translation> <translation id="4779083564647765204">Keisti mastelį</translation> +<translation id="4779136857077979611">Onigiris</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Iššokantysis langas užblokuotas}one{# iššokantysis langas užblokuotas}few{# iššokantieji langai užblokuoti}many{# iššokančiojo lango užblokuota}other{# iššokančiųjų langų užblokuota}}</translation> <translation id="4780321648949301421">Išsaugoti puslapį kaip...</translation> <translation id="4785719467058219317">Naudojate saugos raktą, kuris nėra užregistruotas šioje svetainėje</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Slėpti paskyras</translation> <translation id="4801512016965057443">Leisti mobiliųjų duomenų tarptinklinį ryšį</translation> <translation id="4804818685124855865">Atsijungti</translation> +<translation id="4804827417948292437">Avokadas</translation> <translation id="4807098396393229769">Kortelėje nurodytas vardas ir pavardė</translation> <translation id="4808667324955055115">Iššokantieji langai užblokuoti:</translation> <translation id="480990236307250886">Atidaryti pagrindinį puslapį</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Naudoti šio įrenginio užklausas registruojant įrenginį įmonei valdyti:</translation> <translation id="4941627891654116707">Šrifto dydis</translation> <translation id="494286511941020793">Tarpinio serverio konfigūracijos pagalba</translation> +<translation id="4943368462779413526">Futbolas</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />“ nori prisijungti prie nuosekliojo prievado</translation> <translation id="495170559598752135">Veiksmai</translation> <translation id="4953689047182316270">Reaguoti į pritaikymo neįgaliesiems įvykius</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Visada įjungta</translation> <translation id="5067867186035333991">Klausti, jei <ph name="HOST" /> nori pasiekti mikrofoną</translation> <translation id="5068918910148307423">Neleisti pastaruoju metu uždarytoms svetainėms baigti duomenų siuntimo ir gavimo</translation> +<translation id="5068919226082848014">Pica</translation> <translation id="5072052264945641674">Koreguoti žymeklio dydį</translation> <translation id="5072836811783999860">Rodyti tvarkomas žymes</translation> <translation id="5074318175948309511">Kad nauji nustatymai įsigaliotų, šį puslapį gali tekti įkelti iš naujo.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Stebėti kitų plėtinių veikimą, įskaitant aplankytus URL</translation> <translation id="5119173345047096771">„Mozilla Firefox“</translation> <translation id="5121130586824819730">Jūsų standusis diskas pilnas. Išsaugokite kitoje vietoje arba atlaisvinkite vietos standžiajame diske.</translation> +<translation id="5123433949759960244">Krepšinis</translation> <translation id="5125751979347152379">Negaliojantis URL.</translation> <translation id="5127805178023152808">Sinchronizavimas išjungtas</translation> <translation id="5127881134400491887">Valdyti tinklo ryšius</translation> @@ -3269,6 +3281,7 @@ <translation id="6166185671393271715">Slaptažodžių importavimas į „Chrome“</translation> <translation id="6169040057125497443">Patikrinkite mikrofoną.</translation> <translation id="6169666352732958425">Nepavyko perduoti stalinio kompiuterio ekrano.</translation> +<translation id="6170470584681422115">Sumuštinis</translation> <translation id="6171948306033499786">Pristabdyti spausdinimą</translation> <translation id="6173623053897475761">Įveskite PIN kodą dar kartą</translation> <translation id="6175314957787328458">„Microsoft“ domeno GUID</translation> @@ -3699,6 +3712,7 @@ <translation id="6870888490422746447">Pasirinkti programą bendrinti su:</translation> <translation id="6871644448911473373">OCSP atsakiklis: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Serveris atmetė įvestą slaptažodį.</translation> +<translation id="6876155724392614295">Dviratis</translation> <translation id="6878422606530379992">Jutikliai leidžiami</translation> <translation id="6880587130513028875">Šiame puslapyje vaizdai buvo užblokuoti.</translation> <translation id="6883319974225028188">Oi! Sistemai nepavyko išsaugoti įrenginio konfigūracijos.</translation> @@ -4265,6 +4279,7 @@ <translation id="7772127298218883077">Apie „<ph name="PRODUCT_NAME" />“</translation> <translation id="7772773261844472235">„Chromebook“ įrenginio būsenos tikrinimas</translation> <translation id="7773726648746946405">Sesijų atmintinė</translation> +<translation id="7774365994322694683">Paukštis</translation> <translation id="7776701556330691704">Balsų nerasta</translation> <translation id="7781335840981796660">Bus pašalintos visos naudotojo paskyros ir vietiniai duomenys.</translation> <translation id="7782102568078991263">Daugiau „Google“ pasiūlymų nėra</translation> @@ -4670,6 +4685,7 @@ <translation id="8386903983509584791">Nuskaitymas baigtas</translation> <translation id="8389492867173948260">Leisti šiam plėtiniui skaityti ir keisti visus lankomų svetainių duomenis:</translation> <translation id="8390449457866780408">Serveris nepasiekiamas.</translation> +<translation id="8391218455464584335">Plokštelė</translation> <translation id="8391712576156218334">Vaizdas nepasiekiamas. Vėliau bandykite dar kartą.</translation> <translation id="8392234662362215700">Paspauskite „Control“–„Shift“–tarpo klavišą, kad perjungtumėte klaviatūros išdėstymą.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> skirtų parinkčių meniu</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index aa90303..9b16510 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Meklējiet ierīcē, lietotnēs un tīmeklī.</translation> <translation id="114721135501989771">Google viedās tehnoloģijas pārlūkā Chrome</translation> <translation id="1149401351239820326">Derīguma termiņa mēnesis</translation> +<translation id="1150565364351027703">Saulesbrilles</translation> <translation id="1151917987301063366">Vienmēr atļaut <ph name="HOST" /> piekļuvi sensoriem</translation> <translation id="1153356358378277386">Pārī savienotās ierīces</translation> <translation id="1156488781945104845">Pašreizējais laiks</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Īsinājumtaustiņu palīgs</translation> <translation id="2045969484888636535">Turpināt bloķēt sīkfailus</translation> <translation id="204622017488417136">Ierīcē tiks atjaunota iepriekš instalētā Chrome versija. Visi lietotāju konti un ierīcē glabātie dati tiks noņemti. Šo darbību nevar atsaukt.</translation> +<translation id="2046702855113914483">Nūdeļu zupa</translation> <translation id="2048182445208425546">Piekļūt jūsu tīkla datplūsmai</translation> <translation id="2048653237708779538">Darbība nav pieejama</translation> <translation id="2050339315714019657">Portrets</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> pievienots</translation> <translation id="2464089476039395325">HTTP starpniekserveris</translation> <translation id="2468205691404969808">Izmanto sīkfailus, lai iegaumētu jūsu preferences, pat ja neapmeklējāt šīs lapas</translation> +<translation id="2468402215065996499">Tamagoči</translation> <translation id="2469375675106140201">Pielāgot pareizrakstības pārbaudītāju</translation> <translation id="247051149076336810">Failu kopīgošanas URL</translation> <translation id="2470702053775288986">Tika atspējoti neatbalstīti paplašinājumi</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Noņemt no saraksta</translation> <translation id="2770690685823456775">Eksportējiet paroles citā mapē.</translation> <translation id="2771268254788431918">Aktivizēti mobilie dati</translation> +<translation id="2771816809568414714">Siers</translation> <translation id="2772936498786524345">Ninzja</translation> <translation id="2773288106548584039">Mantoto pārlūku atbalsts</translation> <translation id="2773802008104670137">Šāda veida faili var kaitēt datoram.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Dzēst pārlūkošanas datus...</translation> <translation id="3617891479562106823">Fona attēli nav pieejami. Vēlāk mēģiniet vēlreiz.</translation> +<translation id="3619115746895587757">Kapučīno</translation> <translation id="3623574769078102674">Šo uzraudzīto lietotāju pārvaldīs <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Atbloķēt ierīci un pierakstīties Google kontā</translation> <translation id="3625258641415618104">Ekrānuzņēmumi atspējoti</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Pilsētu fotoattēli</translation> <translation id="4361142739114356624">Nav norādīta šī klienta sertifikāta privātā atslēga, vai tā nav derīga.</translation> <translation id="4363771538994847871">Netika atrasta neviens Cast galamērķis. Vai jums ir nepieciešama palīdzība?</translation> +<translation id="4364327530094270451">Melone</translation> <translation id="4364567974334641491">Lietotne <ph name="APP_NAME" /> koplieto logu.</translation> <translation id="4364830672918311045">Parādīt paziņojumus</translation> <translation id="4365673000813822030">Hmm! Sinhronizācija ir pārtraukusi darboties.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Četri Intel Wi-Fi aparātprogrammatūras ģenerēti faili: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Pirmie trīs ir binārie faili, kas ietver reģistra izmetes; Intel apliecina, ka tie neietver personas informāciju vai ierīci identificējošu informāciju. Pēdējais fails ir Intel programmaparatūras izpildes trasējums; no tā ir noņemta personas informācija un ierīci identificējoša informācija, taču to nevar parādīt šeit, jo fails ir pārāk liels. Šie faili tika ģenerēti, reaģējot uz nesenām Wi-Fi problēmām jūsu ierīcē, un tie tiks kopīgoti ar Intel, lai palīdzētu novērst šīs problēmas.></translation> <translation id="469230890969474295">OEM mape</translation> <translation id="4692623383562244444">Meklētājprogrammas</translation> +<translation id="4693155481716051732">Suši</translation> <translation id="4694024090038830733">Printera konfigurāciju pārvalda administrators.</translation> <translation id="4694604912444486114">Pērtiķis</translation> <translation id="4697551882387947560">Beidzot pārlūkošanas sesiju</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Parole e-pasta adresei <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play veikals</translation> <translation id="4779083564647765204">Tālummaiņa</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Uznirstošais logs ir bloķēts}zero{# uznirstošie logi ir bloķēti}one{# uznirstošais logs ir bloķēts}other{# uznirstošie logi ir bloķēti}}</translation> <translation id="4780321648949301421">Saglabāt lapu kā...</translation> <translation id="4785719467058219317">Jūs izmantojat drošības atslēgu, kas nav reģistrēta šajā vietnē</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Slēpt kontus</translation> <translation id="4801512016965057443">Ļaut mobilo datu viesabonēšanu</translation> <translation id="4804818685124855865">Atvienot</translation> +<translation id="4804827417948292437">Avokado</translation> <translation id="4807098396393229769">Vārds uz kartes</translation> <translation id="4808667324955055115">Uznirstošie logi ir bloķēti</translation> <translation id="480990236307250886">Atvērt sākumlapu</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Izmantot šo ierīces pieprasījumu, reģistrējot ierīci uzņēmuma pārvaldībai:</translation> <translation id="4941627891654116707">Fonta lielums</translation> <translation id="494286511941020793">Starpniekservera konfigurācijas palīdzība</translation> +<translation id="4943368462779413526">Futbols</translation> <translation id="4943691134276646401">Paplašinājums “<ph name="CHROME_EXTENSION_NAME" />” vēlas izveidot savienojumu ar seriālo pieslēgvietu</translation> <translation id="495170559598752135">Darbības</translation> <translation id="4953689047182316270">Atbildēt uz pieejamības notikumiem</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Vienmēr iespējots</translation> <translation id="5067867186035333991">Vaicāt, vai vietne <ph name="HOST" /> vēlas piekļūt mikrofonam</translation> <translation id="5068918910148307423">Neļaut nesen aizvērtajām vietnēm pabeigt datu sūtīšanu un saņemšanu</translation> +<translation id="5068919226082848014">Pica</translation> <translation id="5072052264945641674">Pielāgot kursora lielumu</translation> <translation id="5072836811783999860">Rādīt pārvaldītās grāmatzīmes</translation> <translation id="5074318175948309511">Lai jaunie iestatījumi tiktu piemēroti, iespējams, šī lapa būs jāielādē atkārtoti.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Pārraudzīt citu paplašinājumu, tostarp apmeklēto vietrāžu URL, darbību</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Cietais disks ir pilns. Saglabājiet citā atrašanās vietā vai atbrīvojiet vietu cietajā diskā.</translation> +<translation id="5123433949759960244">Basketbols</translation> <translation id="5125751979347152379">Nederīgs URL.</translation> <translation id="5127805178023152808">Sinhronizācija izslēgta</translation> <translation id="5127881134400491887">Pārvaldīt tīkla savienojumus</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Paroļu importēšana pārlūkā Chrome</translation> <translation id="6169040057125497443">Lūdzu, pārbaudiet savu mikrofonu.</translation> <translation id="6169666352732958425">Nevar apraidīt darbvirsmu.</translation> +<translation id="6170470584681422115">Sviestmaize</translation> <translation id="6171948306033499786">Apturēt drukāšanu</translation> <translation id="6173623053897475761">Ierakstiet PIN kodu vēlreiz</translation> <translation id="6175314957787328458">Microsoft domēna GUID</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Izvēlieties koplietojamo lietotni:</translation> <translation id="6871644448911473373">OCSP atbildētājs: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Ievadīto paroli noraidīja serveris.</translation> +<translation id="6876155724392614295">Velosipēds</translation> <translation id="6878422606530379992">Atļauti sensori</translation> <translation id="6880587130513028875">Attēli šajā lapā tika bloķēti.</translation> <translation id="6883319974225028188">Diemžēl sistēmai neizdevās saglabāt ierīces konfigurāciju.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">Par <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Skatiet sava Chromebook datora statusu</translation> <translation id="7773726648746946405">Sesijas saglabāšana</translation> +<translation id="7774365994322694683">Putns</translation> <translation id="7776701556330691704">Nav atrasta neviena balss</translation> <translation id="7781335840981796660">Visi lietotāju konti un vietējie dati tiks dzēsti.</translation> <translation id="7782102568078991263">Vairāk ieteikumu no Google nav pieejams</translation> @@ -4669,6 +4684,7 @@ <translation id="8386903983509584791">Meklēšana ir pabeigta</translation> <translation id="8389492867173948260">Ļaut šim paplašinājumam lasīt un mainīt visus jūsu datus jūsu apmeklētajās vietnēs:</translation> <translation id="8390449457866780408">Serveris nav pieejams.</translation> +<translation id="8391218455464584335">Vinils</translation> <translation id="8391712576156218334">Attēls nav pieejams. Vēlāk mēģiniet vēlreiz.</translation> <translation id="8392234662362215700">Lai pārslēgtu tastatūras izkārtojumu, nospiediet taustiņus Control-Shift-Space.</translation> <translation id="8392451568018454956">Opciju izvēlne kontam <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 92a41ec..78cb743 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">നിങ്ങളുടെ ഉപകരണം, ആപ്പുകൾ, വെബ് എന്നിവ തിരയുക.</translation> <translation id="114721135501989771">Chrome-ൽ Google സ്മാർട്സ് നേടുക</translation> <translation id="1149401351239820326">കാലാവധി കഴിയുന്ന മാസം</translation> +<translation id="1150565364351027703">സൺഗ്ലാസുകൾ</translation> <translation id="1151917987301063366">സെൻസറുകൾ ആക്സസ് ചെയ്യാൻ എപ്പോഴും <ph name="HOST" />-നെ അനുവദിക്കുക</translation> <translation id="1153356358378277386">ജോടിയാക്കിയ ഉപകരണങ്ങൾ</translation> <translation id="1156488781945104845">നിലവിലെ സമയം</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">കീബോർഡ് കുറുക്കുവഴി സഹായി</translation> <translation id="2045969484888636535">കുക്കികളെ തടയുന്നത് തുടരുക</translation> <translation id="204622017488417136">നിങ്ങളുടെ ഉപകരണം Chrome-ന്റെ മുമ്പ് ഇൻസ്റ്റാളുചെയ്ത പതിപ്പിലേക്ക് മടങ്ങും. എല്ലാ ഉപയോക്തൃ അക്കൗണ്ടുകളും പ്രാദേശിക ഡാറ്റയും നീക്കംചെയ്യും. ഇത് പഴയപടിയാക്കാനാകില്ല.</translation> +<translation id="2046702855113914483">റാമെൻ</translation> <translation id="2048182445208425546">നിങ്ങളുടെ നെറ്റ്വർക്ക് ട്രാഫിക്ക് ആക്സസ്സുചെയ്യുക</translation> <translation id="2048653237708779538">പ്രവർത്തനം ലഭ്യമല്ല</translation> <translation id="2050339315714019657">ഛായാചിത്രം</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> ചേർത്തു</translation> <translation id="2464089476039395325">HTTP പ്രോക്സി</translation> <translation id="2468205691404969808">നിങ്ങൾ ആ പേജുകൾ സന്ദർശിക്കുന്നില്ലെങ്കിൽ പോലും, നിങ്ങളുടെ മുൻഗണനകൾ ഓർമ്മിക്കുന്നതിന് കുക്കികളെ ഉപയോഗിക്കുന്നു</translation> +<translation id="2468402215065996499">താമഗോച്ചി</translation> <translation id="2469375675106140201">അക്ഷരത്തെറ്റ് പരിശോധന ഇഷ്ടാനുസൃതമാക്കുക</translation> <translation id="247051149076336810">ഫയൽ പങ്കിടൽ URL</translation> <translation id="2470702053775288986">പിന്തുണയ്ക്കാത്ത വിപുലീകരണങ്ങൾ പ്രവർത്തനരഹിതമായി</translation> @@ -1129,6 +1132,7 @@ <translation id="2770465223704140727">പട്ടികയില് നിന്നും നീക്കംചെയ്യുക</translation> <translation id="2770690685823456775">നിങ്ങളുടെ പാസ്വേഡുകൾ മറ്റൊരു ഫോൾഡറിലേക്ക് എക്സ്പോർട്ട് ചെയ്യുക</translation> <translation id="2771268254788431918">മൊബൈൽ ഡാറ്റ സജീവമാക്കി</translation> +<translation id="2771816809568414714">ചീസ്</translation> <translation id="2772936498786524345">സ്നീക്കി</translation> <translation id="2773288106548584039">പഴയ ബ്രൗസർ പിന്തുണ</translation> <translation id="2773802008104670137">ഇത്തരത്തിലുള്ള ഫയൽ നിങ്ങളുടെ കമ്പ്യൂട്ടറിനെ കേടാക്കാനിടയുണ്ട്.</translation> @@ -1652,6 +1656,7 @@ <translation id="3616113530831147358">ഓഡിയോ</translation> <translation id="3616741288025931835">&ബ്രൌസിംഗ് ഡാറ്റ ഇല്ലാതാക്കുക...</translation> <translation id="3617891479562106823">പശ്ചാത്തലങ്ങൾ ലഭ്യമല്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="3619115746895587757">കാപ്പുചീനോ</translation> <translation id="3623574769078102674">സൂപ്പർവൈസ് ചെയ്ത ഈ ഉപയോക്താവിനെ <ph name="MANAGER_EMAIL" /> നിയന്ത്രിക്കും.</translation> <translation id="3624567683873126087">ഉപകരണം അൺലോക്ക് ചെയ്ത് Google അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="3625258641415618104">സ്ക്രീൻഷോട്ടുകൾ പ്രവർത്തനരഹിതമാക്കി</translation> @@ -2129,6 +2134,7 @@ <translation id="4359717112757026264">സിറ്റിസ്കേപ്പ്</translation> <translation id="4361142739114356624">ഈ ക്ലയന്റ് സർട്ടിഫിക്കറ്റിന്റെ സ്വകാര്യ കീ നഷ്ടമായി അല്ലെങ്കിൽ അസാധുവാണ്</translation> <translation id="4363771538994847871">കാസ്റ്റുചെയ്യാനുള്ള ലക്ഷ്യസ്ഥാനങ്ങളൊന്നും കണ്ടെത്തിയില്ല. സഹായം ആവശ്യമാണോ?</translation> +<translation id="4364327530094270451">മത്തങ്ങ</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />, ഒരു വിൻഡോ പങ്കിടുന്നു.</translation> <translation id="4364830672918311045">അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുക</translation> <translation id="4365673000813822030">ക്ഷമിക്കണം, സമന്വയം പ്രവർത്തനം നിർത്തി.</translation> @@ -2318,6 +2324,7 @@ <translation id="4690091457710545971"><Intel വൈഫൈ ഫേംവെയർ നാല് ഫയലുകൾ സൃഷ്ടിച്ചു: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. ആദ്യത്തെ മൂന്നെണ്ണം രജിസ്റ്റർ ഡമ്പുകൾ അടങ്ങുന്ന ബൈനറി ഫയലുകളാണ്. ഇതിൽ, വ്യക്തിപരമായ വിവരങ്ങളോ ഉപകരണത്തെ തിരിച്ചറിയാനാകുന്ന വിവരങ്ങളോ ഉൾപ്പെട്ടിട്ടില്ലെന്ന് Intel സമർത്ഥിക്കുന്നു. അവസാനത്തേത് Intel ഫേംവെയറിൽ നിന്നുള്ള ഒരു എക്സിക്യൂഷൻ ട്രെയ്സ് ആണ്; അതിലുള്ള മുഴുവൻ വ്യക്തിപര വിവരങ്ങളോ ഉപകരണത്തെ തിരിച്ചറിയാനാകുന്ന വിവരങ്ങളോ മായ്ച്ചുകളഞ്ഞിട്ടുണ്ടാകും, എന്നാൽ അത് ഇവിടെ പ്രദർശിപ്പിക്കാൻ കഴിയുന്നതിലും വലുതാണ്. നിങ്ങളുടെ ഉപകരണത്തിൽ അടുത്തിടെയുണ്ടായ വൈഫൈ പ്രശ്നങ്ങളുടെ അടിസ്ഥാനത്തിൽ സൃഷ്ടിക്കപ്പെട്ടവയാണ് ഈ ഫയലുകൾ, ഈ പ്രശ്നങ്ങൾ പരിഹരിക്കാനായി ഇവ Intel-മായി പങ്കിടുന്നതാണ്.></translation> <translation id="469230890969474295">OEM ഫോൾഡർ</translation> <translation id="4692623383562244444">സെര്ച് എഞ്ചിനുകള്</translation> +<translation id="4693155481716051732">സുഷി</translation> <translation id="4694024090038830733">അഡ്മിനിസ്ട്രേറ്ററാണ് പ്രിന്റർ കോൺഫിഗറേഷൻ കൈകാര്യം ചെയ്യുന്നത്.</translation> <translation id="4694604912444486114">കുരങ്ങൻ</translation> <translation id="4697551882387947560">ബ്രൗസിംഗ് സെഷൻ അവസാനിക്കുമ്പോൾ</translation> @@ -2372,6 +2379,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> എന്നതിനായുള്ള പാസ്വേഡ്</translation> <translation id="4777825441726637019">Play സ്റ്റോർ</translation> <translation id="4779083564647765204">സൂം ചെയ്യുക</translation> +<translation id="4779136857077979611">ഒണിഗിരി</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{പോപ്പ്-അപ്പ് തടഞ്ഞു}other{# പോപ്പ്-അപ്പുകൾ തടഞ്ഞു}}</translation> <translation id="4780321648949301421">പേജ് ഇതുപോലെ സംരക്ഷിക്കുക...</translation> <translation id="4785719467058219317">ഈ വെബ്സൈറ്റിൽ രജിസ്റ്റർ ചെയ്തിട്ടില്ലാത്ത ഒരു സുരക്ഷാ കീ ആണ് നിങ്ങൾ ഉപയോഗിക്കുന്നത്</translation> @@ -2384,6 +2392,7 @@ <translation id="4801448226354548035">അക്കൗണ്ടുകൾ മറയ്ക്കുക</translation> <translation id="4801512016965057443">മൊബൈല് ഡാറ്റ റോമിംഗ് അനുവദിക്കുക</translation> <translation id="4804818685124855865">വിച്ഛേദിക്കുക</translation> +<translation id="4804827417948292437">അവൊക്കാഡോ</translation> <translation id="4807098396393229769">കാര്ഡിലെ നാമം</translation> <translation id="4808667324955055115">പോപ്-അപ്പുകൾ ബ്ലോക്ക് ചെയ്തു</translation> <translation id="480990236307250886">ഹോംപേജ് തുറക്കുക</translation> @@ -2478,6 +2487,7 @@ <translation id="4941246025622441835">ഉപകരണ എന്റർപ്രൈസ് മാനേജുമെന്റിനായി എൻറോൾ ചെയ്യുമ്പോൾ ഈ ഉപകരണ അഭ്യർത്ഥന ഉപയോഗിക്കുക:</translation> <translation id="4941627891654116707">ഫോണ്ട് വലുപ്പം</translation> <translation id="494286511941020793">പ്രോക്സി ക്രമീകരണ സഹായം</translation> +<translation id="4943368462779413526">ഫുട്ബോള്</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />", ഒരു സീരിയല് പോർട്ടിലേക്ക് കണക്റ്റ് ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു</translation> <translation id="495170559598752135">പ്രവര്ത്തനങ്ങള്</translation> <translation id="4953689047182316270">ഉപയോഗസഹായി ഇവന്റുകളോട് പ്രതികരിക്കുക</translation> @@ -2547,6 +2557,7 @@ <translation id="5067399438976153555">എല്ലായ്പ്പോഴും ഓണാക്കുക</translation> <translation id="5067867186035333991"><ph name="HOST" />-ന് നിങ്ങളുടെ മൈക്രോഫോൺ ആക്സസ്സുചെയ്യണോ എന്ന് ചോദിക്കുക</translation> <translation id="5068918910148307423">അടുത്തിടെ അടച്ച സൈറ്റുകളെ, ഡാറ്റ അയയ്ക്കുന്നതും സ്വീകരിക്കുന്നതും പൂർത്തിയാക്കാൻ അനുവദിക്കരുത്</translation> +<translation id="5068919226082848014">പിസ്സ</translation> <translation id="5072052264945641674">കഴ്സറിന്റെ വലുപ്പം ക്രമീകരിക്കുക</translation> <translation id="5072836811783999860">നിയന്ത്രിത ബുക്ക്മാർക്കുകൾ കാണിക്കുക</translation> <translation id="5074318175948309511">പുതിയ ക്രമീകരണങ്ങൾ പ്രയോഗത്തിൽ വരുന്നതിന് മുമ്പ് ഈ പേജ് വീണ്ടും ലോഡുചെയ്യേണ്ടതായി വരാം.</translation> @@ -2581,6 +2592,7 @@ <translation id="5117930984404104619">സന്ദർശിച്ച URL-കൾ അടക്കം വിപുലീകരണങ്ങളുടെ പ്രവർത്തനരീതി നിരീക്ഷിക്കുക</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">നിങ്ങളുടെ ഹാർഡ് ഡിസ്ക് നിറഞ്ഞു. മറ്റൊരു ലൊക്കേഷനിലേക്ക് സംരക്ഷിക്കുകയോ ഹാർഡ് ഡിസ്കിൽ കൂടുതൽ ഇടം സൃഷ്ടിക്കുകയോ ചെയ്യുക.</translation> +<translation id="5123433949759960244">ബാസ്ക്കറ്റ്ബോൾ</translation> <translation id="5125751979347152379">അസാധുവായ URL.</translation> <translation id="5127805178023152808">സമന്വയം ഓഫാണ്</translation> <translation id="5127881134400491887">നെറ്റ്വർക്ക് കണക്ഷനുകൾ നിയന്ത്രിക്കുക</translation> @@ -3266,6 +3278,7 @@ <translation id="6166185671393271715">Chrome-ലേക്ക് പാസ്വേഡുകൾ ഇമ്പോർട്ടുചെയ്യുക</translation> <translation id="6169040057125497443">നിങ്ങളുടെ മൈക്രോഫോൺ പരിശോധിക്കുക.</translation> <translation id="6169666352732958425">ഡെസ്ക്ടോപ്പ് കാസ്റ്റുചെയ്യാനാകുന്നില്ല.</translation> +<translation id="6170470584681422115">സാന്ഡ്വിച്ച്</translation> <translation id="6171948306033499786">പ്രിന്റിംഗ് താൽക്കാലികമായി നിർത്തുക</translation> <translation id="6173623053897475761">നിങ്ങളുടെ പിൻ വീണ്ടും ടൈപ്പ് ചെയ്യുക</translation> <translation id="6175314957787328458">Microsoft ഡൊമെയ്ന് GUID</translation> @@ -3697,6 +3710,7 @@ <translation id="6870888490422746447">ഇതിലേക്ക് പങ്കിടാൻ ഒരു ആപ്പ് തിരഞ്ഞെടുക്കുക:</translation> <translation id="6871644448911473373">OCSP റെസ്പ്പോണ്ടര്: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">നിങ്ങൾ നൽകിയ പാസ്വേഡ് സെർവർ നിരസിച്ചു.</translation> +<translation id="6876155724392614295">ബൈക്കോടിക്കുക</translation> <translation id="6878422606530379992">സെൻസറുകൾ അനുവദിച്ചു</translation> <translation id="6880587130513028875">ഈ പേജില് ചിത്രങ്ങളെ തടഞ്ഞു.</translation> <translation id="6883319974225028188">ക്ഷമിക്കണം! സിസ്റ്റത്തിന് ഉപകരണ കോൺഫിഗറേഷൻ സംരക്ഷിക്കാനായില്ല.</translation> @@ -4263,6 +4277,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> നെ കുറിച്ച്</translation> <translation id="7772773261844472235">നിങ്ങളുടെ Chromebook നില പരിശോധിക്കുക</translation> <translation id="7773726648746946405">സെഷന് സംഭരണം</translation> +<translation id="7774365994322694683">കിളി</translation> <translation id="7776701556330691704">ശബ്ദമൊന്നും കണ്ടെത്തിയില്ല</translation> <translation id="7781335840981796660">എല്ലാ ഉപയോക്തൃ അക്കൗണ്ടുകളും പ്രദേശിക ഡാറ്റയും നീക്കംചെയ്യും.</translation> <translation id="7782102568078991263">Google-ൽ നിന്നും കൂടുതൽ നിർദ്ദേശങ്ങൾ ഒന്നുമില്ല</translation> @@ -4668,6 +4683,7 @@ <translation id="8386903983509584791">സ്കാൻ ചെയ്യുന്നത് പൂർത്തിയായി</translation> <translation id="8389492867173948260">സന്ദർശിക്കുന്ന വെബ്സൈറ്റുകളിലെ, നിങ്ങളുടെ എല്ലാ ഡാറ്റയും വായിക്കാനും തിരുത്താനും ഈ വിപുലീകരണത്തെ അനുവദിക്കുക:</translation> <translation id="8390449457866780408">സെര്വര് ലഭ്യമല്ല.</translation> +<translation id="8391218455464584335">വിനൈൽ</translation> <translation id="8391712576156218334">ചിത്രം ലഭ്യമല്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="8392234662362215700">കീബോർഡ് ലേഔട്ട് മാറ്റുന്നതിന് Control-Shift-Space അമർത്തുക.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> എന്നതിനുള്ള ഓപ്ഷനുകൾ മെനു</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 32d714a2..6e8357f8 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">तुमच्या डिव्हाइस, अॅप्स आणि वेबवर शोधा.</translation> <translation id="114721135501989771">Chrome मध्ये Google स्मार्ट मिळवा</translation> <translation id="1149401351239820326">कालबाह्य होण्याचा महिना:</translation> +<translation id="1150565364351027703">सनग्लासेस</translation> <translation id="1151917987301063366"><ph name="HOST" /> ला नेहमी सेन्सर अॅक्सेस करू द्या</translation> <translation id="1153356358378277386">जोडलेली डिव्हाइस</translation> <translation id="1156488781945104845">वर्तमान वेळ</translation> @@ -660,6 +661,7 @@ <translation id="2045117674524495717">कीबोर्ड शॉर्टकट मदतकर्ता</translation> <translation id="2045969484888636535">कुकी अवरोधित करणे सुरू ठेवा</translation> <translation id="204622017488417136">तुमचे डिव्हाइस Chrome च्या मागील इंस्टॉल केलेल्या आवृत्तीवर परत जाईल. सर्व वापरकर्ता खाती आणि स्थानिक डेटा काढला जाईल. हे पूर्ववत केले जाऊ शकत नाही.</translation> +<translation id="2046702855113914483">रामेन</translation> <translation id="2048182445208425546">आपल्या नेटवर्क रहदारीवर प्रवेश करा</translation> <translation id="2048653237708779538">कृती उपलब्ध नाही</translation> <translation id="2050339315714019657">पोर्ट्रेट</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> जोडले</translation> <translation id="2464089476039395325">HTTP प्रॉक्सी</translation> <translation id="2468205691404969808">जरी तुम्ही त्या पेजना भेट देत नसलात तरी, तुमची प्राधान्ये लक्षात ठेवण्यासाठी कुकीजचा वापर करते</translation> +<translation id="2468402215065996499">तामागोची</translation> <translation id="2469375675106140201">स्पेल चेक कस्टमाइझ करा</translation> <translation id="247051149076336810">फाइल शेअर URL</translation> <translation id="2470702053775288986">असमर्थित विस्तार अक्षम</translation> @@ -1131,6 +1134,7 @@ <translation id="2770465223704140727">सूचीमधून काढून टाका</translation> <translation id="2770690685823456775">तुमचे पासवर्ड दुसर्या फोल्डरमध्ये एक्सपोर्ट करा</translation> <translation id="2771268254788431918">मोबाइल डेटा अॅक्टिव्ह केला</translation> +<translation id="2771816809568414714">चीज</translation> <translation id="2772936498786524345">Sneaky</translation> <translation id="2773288106548584039">लेगसी ब्राउझर सपोर्ट</translation> <translation id="2773802008104670137">या प्रकारची फाईल आपल्या संगणकास हानी पोहोचवू शकते.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">ऑडिओ</translation> <translation id="3616741288025931835">ब्राउझिंग डेटा &साफ करा...</translation> <translation id="3617891479562106823">बॅकग्राउंड अनुपलब्ध आहेत. नंतर पुन्हा प्रयत्न करा.</translation> +<translation id="3619115746895587757">कॅपिचिनो</translation> <translation id="3623574769078102674">हा पर्यवेक्षी वापरकर्ता <ph name="MANAGER_EMAIL" /> द्वारे व्यवस्थापित केला जाईल.</translation> <translation id="3624567683873126087">डिव्हाइस अनलॉक करा आणि Google खात्यामध्ये साइन इन करा</translation> <translation id="3625258641415618104">स्क्रीनशॉट अक्षम केले</translation> @@ -2132,6 +2137,7 @@ <translation id="4359717112757026264">शहराचे दृश्य</translation> <translation id="4361142739114356624">या क्लायंट प्रमाणपत्रासाठी खाजगी, की अनुपलब्ध किंवा अवैध आहे</translation> <translation id="4363771538994847871">कोणतीही कास्ट गंतव्यस्थाने सापडली नाहीत. मदत हवी आहे?</translation> +<translation id="4364327530094270451">खरबूज</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> विंडो शेअर करीत आहे.</translation> <translation id="4364830672918311045">सूचना डिस्प्ले करा</translation> <translation id="4365673000813822030">अरेरे, समक्रमणाने काम करणे थांबवले आहे.</translation> @@ -2321,6 +2327,7 @@ <translation id="4690091457710545971"><Intel वाय-फाय फर्मवेयरद्वारे चार फायली निर्माण करण्यात आल्या: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. पहिल्या तीन बायनरी फायली अशा आहेत ज्यामध्ये रजिस्टर डंप आहेत आणि त्यामध्ये कोणतीही वैयक्तिक किंवा डिव्हाइसची ओळख स्पष्ट करणारी माहिती नसेल याची Intel द्वारे खात्री करण्यात आली आहे. शेवटची फाइल म्हणजे Intel फर्मवेयरने काढलेला माग आहे; त्यामधून कोणतीही वैयक्तिक किंवा डिव्हाइसची ओळख स्पष्ट करणारी माहिती काढून टाकण्यात आली आहे, पण ही फाइल इथे दर्शवण्यासाठी खूप मोठी आहे. तुमच्या डिव्हाइसवर नुकत्याच उद्भवलेल्या वाय-फाय समस्यांच्या प्रतिसादातून या फायली तयार करण्यात आल्या आहेत आणि या समस्यांवर मार्ग काढण्यासाठी त्या Intel सह शेअर केल्या जातील.></translation> <translation id="469230890969474295">OEM फोल्डर</translation> <translation id="4692623383562244444">शोध इंजिने</translation> +<translation id="4693155481716051732">सुशी</translation> <translation id="4694024090038830733">प्रिंटर कॉन्फिगरेशन अॅडमिनिस्ट्रेटरद्वारे हाताळले जाते.</translation> <translation id="4694604912444486114">माकड</translation> <translation id="4697551882387947560">ब्राउझिंग सत्र समाप्त होते तेव्हा</translation> @@ -2375,6 +2382,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> साठी पासवर्ड</translation> <translation id="4777825441726637019">Play स्टोअर</translation> <translation id="4779083564647765204">झूम</translation> +<translation id="4779136857077979611">ओनिगिरी</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{पॉप-अप ब्लॉक केला}one{# पॉप-अप ब्लॉक केला}other{# पॉप-अप ब्लॉक केले}}</translation> <translation id="4780321648949301421">पेज या फॉरमॅटमध्ये सेव्ह करा...</translation> <translation id="4785719467058219317">तुम्ही या वेबसाइटवर नोंदणीकृत नसलेली सिक्युरिटी की वापरत आहात</translation> @@ -2387,6 +2395,7 @@ <translation id="4801448226354548035">खाती लपवा</translation> <translation id="4801512016965057443">मोबाइल डेटा रोमिंगची अनुमती द्या</translation> <translation id="4804818685124855865">डिस्कनेक्ट</translation> +<translation id="4804827417948292437">अॅव्होकॅडो</translation> <translation id="4807098396393229769">कार्डवरील नाव</translation> <translation id="4808667324955055115">पॉप-अप ब्लॉक केले</translation> <translation id="480990236307250886">मुख्यपृष्ठ उघडा</translation> @@ -2481,6 +2490,7 @@ <translation id="4941246025622441835">एंटरप्राइज व्यवस्थापनासाठी डिव्हाइसची नोंदणी करताना ही डिव्हाइस मागणी वापरा:</translation> <translation id="4941627891654116707">फॉन्ट आकार</translation> <translation id="494286511941020793">प्रॉक्सी कॉन्फिगरेशन मदत</translation> +<translation id="4943368462779413526">फूटबॉल</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ना सिरीअल पोर्टशी कनेक्ट करायचे आहे</translation> <translation id="495170559598752135">क्रिया</translation> <translation id="4953689047182316270">प्रवेशयोग्यता कार्यक्रमांना प्रतिसाद द्या</translation> @@ -2550,6 +2560,7 @@ <translation id="5067399438976153555">नेहमी चालू</translation> <translation id="5067867186035333991"><ph name="HOST" /> आपल्या मायक्रोफोनवर प्रवेश करू इच्छित असल्यास विचारा</translation> <translation id="5068918910148307423">अलीकडील बंद केलेल्या साइटना डेटा पाठविणे आणि प्राप्त करणे समाप्त करण्यासाठी अनुमती देऊ नका</translation> +<translation id="5068919226082848014">पिझ्झा</translation> <translation id="5072052264945641674">कर्सर आकार समायोजित करा</translation> <translation id="5072836811783999860">व्यवस्थापित बुकमार्क दर्शवा</translation> <translation id="5074318175948309511">नवीन सेटिंग्ज प्रभावी होण्यापूर्वी या पृष्ठास रीलोड करण्याची आवश्यकता असू शकते.</translation> @@ -2584,6 +2595,7 @@ <translation id="5117930984404104619">भेट दिलेल्या URL सह, अन्य विस्तारांच्या वर्तनाचे परीक्षण करा</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">तुमची हार्ड डिस्क पूर्ण भरली आहे. कृपया दुसर्या स्थानावर सेव्ह करा किंवा हार्ड डिस्कवर अधिक जागा तयार करा.</translation> +<translation id="5123433949759960244">बास्केटबॉल</translation> <translation id="5125751979347152379">चुकीची URL.</translation> <translation id="5127805178023152808">संकालन बंद आहे</translation> <translation id="5127881134400491887">नेटवर्क कनेक्शन व्यवस्थापित करा</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Chrome मध्ये पासवर्ड इंपोर्ट करा</translation> <translation id="6169040057125497443">कृपया तुमचा मायक्रोफोन तपासा.</translation> <translation id="6169666352732958425">डेस्कटॉप कास्ट करण्यात अक्षम.</translation> +<translation id="6170470584681422115">सँडविच</translation> <translation id="6171948306033499786">मुद्रणास विराम द्या</translation> <translation id="6173623053897475761">तुमचा पिन पुन्हा टाइप करा</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">यासह शेअर करण्यासाठी एक ॲप निवडा:</translation> <translation id="6871644448911473373">OCSP प्रतिसादकर्ता: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">तुम्ही टाकलेला पासवर्ड सर्व्हरने नाकारला होता.</translation> +<translation id="6876155724392614295">सायकल</translation> <translation id="6878422606530379992">सेन्सरना अनुमती आहे</translation> <translation id="6880587130513028875">या पृष्ठावरील इमेज अवरोधित केलेल्या होत्या.</translation> <translation id="6883319974225028188">अरेरे! डिव्हाइस कॉन्फिगरेशन सेव्ह करण्यात सिस्टम अयशस्वी झाले.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> बद्दल</translation> <translation id="7772773261844472235">तुमच्या Chromebook ची स्थिती तपासा</translation> <translation id="7773726648746946405">सत्र संचयन</translation> +<translation id="7774365994322694683">पक्षी</translation> <translation id="7776701556330691704">कोणतेही व्हॉइस सापडले नाहीत</translation> <translation id="7781335840981796660">सर्व वापरकर्ता खाती आणि स्थानिक डेटा काढला जाईल.</translation> <translation id="7782102568078991263">Google कडून कोणत्याही आणखी सूचना नाहीत</translation> @@ -4667,6 +4682,7 @@ <translation id="8386903983509584791">स्कॅन पूर्ण झाले</translation> <translation id="8389492867173948260">तुम्ही भेट देता त्या वेबसाइटवरील तुमचा सर्व डेटा वाचण्यासाठी आणि बदलण्यासाठी या एक्स्टेंशनला अनुमती द्या:</translation> <translation id="8390449457866780408">सर्व्हर अनुपलब्ध.</translation> +<translation id="8391218455464584335">व्हिनेल</translation> <translation id="8391712576156218334">इमेज अनुपलब्ध आहे. नंतर पुन्हा प्रयत्न करा.</translation> <translation id="8392234662362215700">कीबोर्ड लेआउट वरून स्विच करण्यासाठी Control-Shift-Space दाबा.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> साठी पर्याय मेनू</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index a62d6d9..e812bf5af 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Carian peranti anda, apl dan web.</translation> <translation id="114721135501989771">Google pintar di Chrome</translation> <translation id="1149401351239820326">Bulan tamat tempoh</translation> +<translation id="1150565364351027703">Cermin mata hitam</translation> <translation id="1151917987301063366">Sentiasa benarkan <ph name="HOST" /> mengakses penderia</translation> <translation id="1153356358378277386">Peranti digandingkan</translation> <translation id="1156488781945104845">Masa semasa</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Pembantu Pintasan Papan Kekunci</translation> <translation id="2045969484888636535">Terus menyekat kuki</translation> <translation id="204622017488417136">Peranti anda akan kembali ke versi Chrome yang dipasang sebelum ini. Semua akaun pengguna dan data setempat akan dialih keluar. Proses ini tidak boleh dibuat asal.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Akses trafik rangkaian anda</translation> <translation id="2048653237708779538">Tindakan tidak tersedia</translation> <translation id="2050339315714019657">Potret</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> ditambahkan</translation> <translation id="2464089476039395325">Proksi HTTP</translation> <translation id="2468205691404969808">Menggunakan kuki untuk mengingati pilihan anda, walaupun anda tidak melawati halaman tersebut</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Sesuaikan semak ejaan</translation> <translation id="247051149076336810">URL perkongsian fail</translation> <translation id="2470702053775288986">Pelanjutan yang tidak disokong dilumpuhkan</translation> @@ -1133,6 +1136,7 @@ <translation id="2770465223704140727">Buang dari senarai</translation> <translation id="2770690685823456775">Eksport kata laluan anda ke folder lain</translation> <translation id="2771268254788431918">Data mudah alih diaktifkan</translation> +<translation id="2771816809568414714">Keju</translation> <translation id="2772936498786524345">Licik</translation> <translation id="2773288106548584039">Sokongan Penyemak Imbas Lama</translation> <translation id="2773802008104670137">Fail jenis ini boleh merosakkan komputer anda.</translation> @@ -1656,6 +1660,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Kosongkan Data Menyemak Imbas...</translation> <translation id="3617891479562106823">Latar belakang tidak tersedia. Cuba lagi nanti.</translation> +<translation id="3619115746895587757">Kapucino</translation> <translation id="3623574769078102674">Pengguna diselia ini akan diuruskan oleh <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Buka kunci peranti dan log masuk ke Akaun Google</translation> <translation id="3625258641415618104">Tangkapan skrin dilumpuhkan</translation> @@ -2134,6 +2139,7 @@ <translation id="4359717112757026264">Pandangan bandar</translation> <translation id="4361142739114356624">Kunci Peribadi untuk Sijil Pelanggan ini tiada atau tidak sah</translation> <translation id="4363771538994847871">Tiada destinasi Cast ditemui. Perlukan bantuan?</translation> +<translation id="4364327530094270451">Tembikai</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> berkongsi tetingkap.</translation> <translation id="4364830672918311045">Paparkan pemberitahuan</translation> <translation id="4365673000813822030">Alamak, Penyegerakan telah berhenti berfungsi.</translation> @@ -2323,6 +2329,7 @@ <translation id="4690091457710545971"><Empat fail dihasilkan oleh perisian tegar Wi-Fi Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Tiga fail yang pertama ialah fail perduaan yang mengandungi longgokan pendaftaran dan Intel menegaskan bahawa fail ini tidak mengandungi maklumat peribadi atau yang mengenal pasti peranti. Fail terakhir ialah surih pelaksanaan daripada perisian tegar Intel; fail ini telah dibersihkan supaya tidak mengandungi sebarang maklumat peribadi atau yang mengenal pasti peranti, tetapi terlalu besar untuk dipaparkan di sini. Fail ini dihasilkan sebagai tindak balas terhadap masalah Wi-Fi pada peranti anda baru-baru ini dan akan dikongsi dengan Intel untuk membantu dalam menyelesaikan masalah ini.></translation> <translation id="469230890969474295">Folder OEM</translation> <translation id="4692623383562244444">Enjin carian</translation> +<translation id="4693155481716051732">Susyi</translation> <translation id="4694024090038830733">Konfigurasi pencetak dikendalikan oleh pentadbir.</translation> <translation id="4694604912444486114">Monyet</translation> <translation id="4697551882387947560">Apabila sesi penyemakan imbas berakhir</translation> @@ -2377,6 +2384,7 @@ <translation id="4776917500594043016">Kata laluan untuk <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Gedung Play</translation> <translation id="4779083564647765204">Zum</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Tetingkap timbul disekat}other{# tetingkap timbul disekat}}</translation> <translation id="4780321648949301421">Simpan Halaman Sebagai...</translation> <translation id="4785719467058219317">Anda menggunakan kunci keselamatan yang tidak berdaftar dengan tapak web ini</translation> @@ -2389,6 +2397,7 @@ <translation id="4801448226354548035">Sembunyikan akaun</translation> <translation id="4801512016965057443">Membenarkan perayauan data mudah alih</translation> <translation id="4804818685124855865">Putuskan sambungan</translation> +<translation id="4804827417948292437">Avokado</translation> <translation id="4807098396393229769">Nama pada kad</translation> <translation id="4808667324955055115">Tetingkap timbul disekat:</translation> <translation id="480990236307250886">Buka halaman utama</translation> @@ -2483,6 +2492,7 @@ <translation id="4941246025622441835">Gunakan permintaan peranti ini apabila mendaftarkan peranti untuk pengurusan perusahaan:</translation> <translation id="4941627891654116707">Saiz fon</translation> <translation id="494286511941020793">Bantuan Konfigurasi Proksi</translation> +<translation id="4943368462779413526">Bola Sepak</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ingin menyambung ke port siri</translation> <translation id="495170559598752135">Tindakan</translation> <translation id="4953689047182316270">Jawab Acara Kebolehaksesan</translation> @@ -2552,6 +2562,7 @@ <translation id="5067399438976153555">Sentiasa dihidupkan</translation> <translation id="5067867186035333991">Tanya jika <ph name="HOST" /> mahu mengakses mikrofon anda</translation> <translation id="5068918910148307423">Jangan benarkan tapak yang baru sahaja ditutup untuk menyelesaikan penghantaran dan penerimaan data</translation> +<translation id="5068919226082848014">Piza</translation> <translation id="5072052264945641674">Laraskan saiz kursor</translation> <translation id="5072836811783999860">Tunjukkan penanda halaman terurus</translation> <translation id="5074318175948309511">Halaman ini mungkin perlu dimuat semula sebelum tetapan baru berkesan.</translation> @@ -2586,6 +2597,7 @@ <translation id="5117930984404104619">Pantau gelagat sambungan lain, termasuk URL yang dilawati</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Cakera keras anda telah penuh. Sila simpan ke lokasi lain atau sediakan lagi ruang pada cakera keras.</translation> +<translation id="5123433949759960244">Bola Keranjang</translation> <translation id="5125751979347152379">URL tidak sah.</translation> <translation id="5127805178023152808">Penyegerakan dimatikan</translation> <translation id="5127881134400491887">Urus sambungan rangkaian</translation> @@ -3269,6 +3281,7 @@ <translation id="6166185671393271715">Import Kata Laluan Ke Chrome</translation> <translation id="6169040057125497443">Sila periksa mikrofon anda.</translation> <translation id="6169666352732958425">Tidak dapat menghantar desktop.</translation> +<translation id="6170470584681422115">Sandwic</translation> <translation id="6171948306033499786">Jedakan pencetakan</translation> <translation id="6173623053897475761">Taipkan PIN anda sekali lagi</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3699,6 +3712,7 @@ <translation id="6870888490422746447">Pilih apl untuk berkongsi ke:</translation> <translation id="6871644448911473373">Pengulas OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Kata laluan yang anda masukkan telah ditolak oleh pelayan.</translation> +<translation id="6876155724392614295">Basikal</translation> <translation id="6878422606530379992">Penderia dibenarkan</translation> <translation id="6880587130513028875">Imej disekat pada halaman ini.</translation> <translation id="6883319974225028188">Op! Sistem gagal menyimpan konfigurasi peranti.</translation> @@ -4265,6 +4279,7 @@ <translation id="7772127298218883077">Mengenai <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Semak status Chromebook anda</translation> <translation id="7773726648746946405">Storan sesi</translation> +<translation id="7774365994322694683">Burung</translation> <translation id="7776701556330691704">Suara tidak ditemui</translation> <translation id="7781335840981796660">Semua akaun pengguna dan data setempat akan dialih keluar.</translation> <translation id="7782102568078991263">Tiada lagi cadangan daripada Google</translation> @@ -4671,6 +4686,7 @@ <translation id="8386903983509584791">Pengimbasan selesai</translation> <translation id="8389492867173948260">Benarkan sambungan ini membaca dan mengubah semua data anda di tapak web yang anda lawati:</translation> <translation id="8390449457866780408">Pelayan tidak tersedia.</translation> +<translation id="8391218455464584335">Vinil</translation> <translation id="8391712576156218334">Imej tidak tersedia. Cuba sebentar lagi.</translation> <translation id="8392234662362215700">Tekan Control-Shift-Space untuk menukar reka letak papan kekunci.</translation> <translation id="8392451568018454956">Menu pilihan untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 45d8f36..1af6d84 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Zoek op je apparaat, in apps en op internet.</translation> <translation id="114721135501989771">Google-functies in Chrome</translation> <translation id="1149401351239820326">Vervalmaand</translation> +<translation id="1150565364351027703">Zonnebril</translation> <translation id="1151917987301063366"><ph name="HOST" /> altijd toegang tot sensoren geven</translation> <translation id="1153356358378277386">Gekoppelde apparaten</translation> <translation id="1156488781945104845">Huidige tijd</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Helper voor sneltoetsen</translation> <translation id="2045969484888636535">Cookies blijven blokkeren</translation> <translation id="204622017488417136">Je apparaat wordt hersteld naar de vorige geïnstalleerde versie van Chrome. Alle gebruikersaccounts en lokale gegevens worden verwijderd. Dit kan niet ongedaan worden gemaakt.</translation> +<translation id="2046702855113914483">Noedelsoep</translation> <translation id="2048182445208425546">Toegang tot je netwerkverkeer</translation> <translation id="2048653237708779538">Actie niet beschikbaar</translation> <translation id="2050339315714019657">Staand</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> toegevoegd</translation> <translation id="2464089476039395325">HTTP-proxy</translation> <translation id="2468205691404969808">Maakt gebruik van cookies om je voorkeuren te onthouden, zelfs als je deze pagina's niet bezoekt</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Spellingcontrole aanpassen</translation> <translation id="247051149076336810">URL voor fileshare</translation> <translation id="2470702053775288986">Niet-ondersteunde extensies uitgeschakeld</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Verwijderen uit lijst</translation> <translation id="2770690685823456775">Exporteer je wachtwoorden naar een andere map</translation> <translation id="2771268254788431918">Mobiele data geactiveerd</translation> +<translation id="2771816809568414714">Kaas</translation> <translation id="2772936498786524345">Sluiper</translation> <translation id="2773288106548584039">Ondersteuning voor oudere browsers</translation> <translation id="2773802008104670137">Dit type bestand kan je computer beschadigen.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Browsegegevens wissen</translation> <translation id="3617891479562106823">Achtergronden zijn niet beschikbaar. Probeer het later opnieuw.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Deze gebruiker met beperkte rechten wordt beheerd door <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Apparaat ontgrendelen en inloggen op Google-account</translation> <translation id="3625258641415618104">Screenshots uitgeschakeld</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Stadsgezicht</translation> <translation id="4361142739114356624">De privésleutel voor dit clientcertificaat ontbreekt of is ongeldig</translation> <translation id="4363771538994847871">Er zijn geen Cast-bestemmingen gevonden. Hulp nodig?</translation> +<translation id="4364327530094270451">Meloen</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> deelt een venster.</translation> <translation id="4364830672918311045">Meldingen weergeven</translation> <translation id="4365673000813822030">De synchronisatie werkt niet meer.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Vier bestanden gegenereerd door wifi-firmware van Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. De eerste drie zijn binaire bestanden met registerdumps. Hiervan wordt door Intel verzekerd dat deze geen persoonlijke of apparaatidentificerende gegevens bevatten. Het laatste bestand is een bestand waarin uitvoering wordt bijgehouden. Alle persoonlijke of apparaatidentificerende gegevens zijn uit dit bestand verwijderd, maar het is te groot om hier weer te geven. Deze bestanden zijn gegenereerd als reactie op recente wifi-problemen met je apparaat en worden gedeeld met Intel om deze problemen op te lossen.></translation> <translation id="469230890969474295">OEM-map</translation> <translation id="4692623383562244444">Zoekmachines</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">De printerconfiguratie wordt bepaald door de beheerder.</translation> <translation id="4694604912444486114">Aap</translation> <translation id="4697551882387947560">Wanneer de browsingsessie eindigt</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Wachtwoord voor <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pop-up geblokkeerd}other{# pop-ups geblokkeerd}}</translation> <translation id="4780321648949301421">Bewaar pagina als...</translation> <translation id="4785719467058219317">Je gebruikt een beveiligingssleutel die niet is geregistreerd voor deze website</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Accounts verbergen</translation> <translation id="4801512016965057443">Mobiele dataroaming toestaan</translation> <translation id="4804818685124855865">Verbinding verbreken</translation> +<translation id="4804827417948292437">Avocado</translation> <translation id="4807098396393229769">Naam op pas</translation> <translation id="4808667324955055115">Pop-ups geblokkeerd:</translation> <translation id="480990236307250886">Open de homepage</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Gebruik deze apparaataanvraag wanneer het apparaat wordt geactiveerd voor bedrijfsbeheer:</translation> <translation id="4941627891654116707">Lettergrootte</translation> <translation id="494286511941020793">Ondersteuning voor proxyconfiguratie</translation> +<translation id="4943368462779413526">Amerikaanse voetbal</translation> <translation id="4943691134276646401">'<ph name="CHROME_EXTENSION_NAME" />' wil verbinden met een seriële poort</translation> <translation id="495170559598752135">Acties</translation> <translation id="4953689047182316270">Reageren op toegankelijkheidsgebeurtenissen</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Altijd ingeschakeld</translation> <translation id="5067867186035333991">Vragen of <ph name="HOST" /> toegang wil tot je microfoon</translation> <translation id="5068918910148307423">Niet toestaan dat onlangs gesloten sites het verzenden en ontvangen van gegevens voltooien</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Grootte van muisaanwijzer aanpassen</translation> <translation id="5072836811783999860">Beheerde bladwijzers weergeven</translation> <translation id="5074318175948309511">Deze pagina moet eventueel opnieuw worden geladen voordat de nieuwe instellingen van kracht zijn.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Het gedrag van andere extensies controleren, waaronder bezochte URL's</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Je vaste schijf is vol. Sla op een andere locatie op of maak ruimte vrij op de vaste schijf.</translation> +<translation id="5123433949759960244">Basketbal</translation> <translation id="5125751979347152379">Ongeldige URL.</translation> <translation id="5127805178023152808">Synchronisatie is uitgeschakeld</translation> <translation id="5127881134400491887">Netwerkverbindingen beheren</translation> @@ -3238,7 +3250,7 @@ <translation id="6122095009389448667">Bekijken van het klembord door deze site blijven blokkeren</translation> <translation id="6122875415561139701">Schrijfbewerking is niet toegestaan op: <ph name="DEVICE_NAME" />.</translation> <translation id="6124650939968185064">De volgende extensies zijn afhankelijk van deze extensie:</translation> -<translation id="6124698108608891449">Deze site heeft meer machtigingen nodig.</translation> +<translation id="6124698108608891449">Deze site heeft meer rechten nodig.</translation> <translation id="6125479973208104919">Je moet je account opnieuw toevoegen aan deze <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">De geselecteerde gegevens zijn verwijderd uit Chrome en van gesynchroniseerde apparaten. Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekopdrachten en activiteit uit andere Google-services) beschikbaar zijn via <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Opmerking van Netscape-certificaat</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Wachtwoorden importeren in Chrome</translation> <translation id="6169040057125497443">Controleer je microfoon</translation> <translation id="6169666352732958425">Kan desktop niet casten.</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">Afdrukken onderbreken</translation> <translation id="6173623053897475761">Typ je pincode nog een keer</translation> <translation id="6175314957787328458">Microsoft-domein-GUID</translation> @@ -3417,7 +3430,7 @@ <translation id="641081527798843608">Overeenkomst van onderwerp</translation> <translation id="6412931879992742813">Nieuw incognitovenster</translation> <translation id="6415900369006735853">Verbinding maken met internet via je telefoon</translation> -<translation id="6416743254476733475">Je moet iets toestaan of blokkeren op je computer.</translation> +<translation id="6416743254476733475">Toestaan of blokkeren op je computer.</translation> <translation id="6417265370957905582">Google Assistent</translation> <translation id="6418160186546245112">Terugzetten naar de vorige geïnstalleerde versie van <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="6418481728190846787">Toegang permanent verwijderen voor alle apps</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Kies een app waarmee je wilt delen:</translation> <translation id="6871644448911473373">OCSP-beantwoorder: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Het wachtwoord dat je hebt opgegeven, is afgewezen door de server.</translation> +<translation id="6876155724392614295">Fiets</translation> <translation id="6878422606530379992">Sensoren toegestaan</translation> <translation id="6880587130513028875">Er zijn afbeeldingen op deze pagina geblokkeerd.</translation> <translation id="6883319974225028188">Het systeem kan de apparaatconfiguratie niet opslaan.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">Over <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Je Chromebook-status controleren</translation> <translation id="7773726648746946405">Sessie-opslag</translation> +<translation id="7774365994322694683">Vogel</translation> <translation id="7776701556330691704">Geen stemmen gevonden</translation> <translation id="7781335840981796660">Alle gebruikersaccounts en lokale gegevens worden verwijderd.</translation> <translation id="7782102568078991263">Geen verdere suggesties van Google</translation> @@ -4668,6 +4683,7 @@ <translation id="8386903983509584791">Scan voltooid</translation> <translation id="8389492867173948260">Hiermee kan deze extensie al je gegevens lezen en wijzigen op de websites die je bezoekt:</translation> <translation id="8390449457866780408">Server niet beschikbaar.</translation> +<translation id="8391218455464584335">Lp</translation> <translation id="8391712576156218334">De afbeelding is niet beschikbaar. Probeer het later opnieuw.</translation> <translation id="8392234662362215700">Druk op Ctrl-Shift-spatiebalk om de toetsenbordindeling te wijzigen.</translation> <translation id="8392451568018454956">Optiemenu voor <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 960e7997..ae9863a 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Søk på enheten din, appene dine og på nettet.</translation> <translation id="114721135501989771">Få Googles smarte funksjoner i Chrome</translation> <translation id="1149401351239820326">Utløpsmåned</translation> +<translation id="1150565364351027703">Solbriller</translation> <translation id="1151917987301063366">Tillat alltid <ph name="HOST" /> å bruke sensorene</translation> <translation id="1153356358378277386">Tilkoblede enheter</translation> <translation id="1156488781945104845">Klokkeslettet nå</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">Hurtigtasthjelp</translation> <translation id="2045969484888636535">Fortsett blokkering av informasjonskapsler</translation> <translation id="204622017488417136">Enheten blir tilbakestilt til den tidligere installerte versjonen av Chrome. Alle brukerkontoer og lokale data fjernes. Dette kan ikke gjøres om.</translation> +<translation id="2046702855113914483">Nudler</translation> <translation id="2048182445208425546">Få tilgang til nettverkstrafikken din</translation> <translation id="2048653237708779538">Handlingen er ikke tilgjengelig</translation> <translation id="2050339315714019657">Stående</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> er lagt til</translation> <translation id="2464089476039395325">HTTP-proxy-tjener</translation> <translation id="2468205691404969808">Bruker informasjonskapsler til å huske preferansene dine, selv om du ikke går til de sidene</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Tilpass stavekontrollen</translation> <translation id="247051149076336810">Nettadresse for fildeling</translation> <translation id="2470702053775288986">Ustøttede utvidelser slått av</translation> @@ -1128,6 +1131,7 @@ <translation id="2770465223704140727">Fjern fra listen</translation> <translation id="2770690685823456775">Eksportér passordene dine til en annen mappe</translation> <translation id="2771268254788431918">Mobildata er aktivert</translation> +<translation id="2771816809568414714">Ost</translation> <translation id="2772936498786524345">Skyggen</translation> <translation id="2773288106548584039">Støtte for eldre nettlesere</translation> <translation id="2773802008104670137">Denne filtypen kan skade datamaskinen din.</translation> @@ -1650,6 +1654,7 @@ <translation id="3616113530831147358">Lyd</translation> <translation id="3616741288025931835">&Fjern nettlesingsdata</translation> <translation id="3617891479562106823">Bakgrunner er utilgjengelig. Prøv på nytt senere.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Denne administrerte brukeren blir administrert av <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Lås opp enheten og logg på Google-kontoen din</translation> <translation id="3625258641415618104">Skjermdumper er deaktivert</translation> @@ -2126,6 +2131,7 @@ <translation id="4359717112757026264">Bybilde</translation> <translation id="4361142739114356624">Privatnøkkelen for dette klientsertifikatet mangler eller er ugyldig</translation> <translation id="4363771538994847871">Fant ingen Cast-destinasjoner. Trenger du hjelp?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindu.</translation> <translation id="4364830672918311045">Vis varsler</translation> <translation id="4365673000813822030">Beklager, synkroniseringen har sluttet å fungere.</translation> @@ -2315,6 +2321,7 @@ <translation id="4690091457710545971"><Fire filer genereres av Intel Wi-Fi-fastvaren: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. De tre første er binærfiler som inneholder registerdumper og kontrolleres av Intel for å sikre at de ikke inneholder personlig eller enhetsidentifiserende informasjon. Den siste filen er et kjøringsspor fra Intel-fastvaren. All personlig eller enhetsidentifiserende informasjon er fjernet fra filen, men den er for stor til å vises her. Disse filene ble generert som svar på nylige Wi-Fi-problemer med enheten din og deles med Intel for å bidra med feilsøking av disse problemene.></translation> <translation id="469230890969474295">OEM-mappe</translation> <translation id="4692623383562244444">Søkemotorer</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Administratoren håndterer konfigureringen av skrivere.</translation> <translation id="4694604912444486114">Ape</translation> <translation id="4697551882387947560">Når nettleserøkten avsluttes</translation> @@ -2369,6 +2376,7 @@ <translation id="4776917500594043016">Passord for <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Butikk</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Et forgrunnsvindu er blokkert}other{# forgrunnsvinduer er blokkert}}</translation> <translation id="4780321648949301421">L&agre side som</translation> <translation id="4785719467058219317">Du bruker en sikkerhetsnøkkel som ikke er registrert på dette nettstedet</translation> @@ -2381,6 +2389,7 @@ <translation id="4801448226354548035">Skjul kontoer</translation> <translation id="4801512016965057443">Tillat mobildatabruk på andre nettverk</translation> <translation id="4804818685124855865">Koble fra</translation> +<translation id="4804827417948292437">Avokado</translation> <translation id="4807098396393229769">Navn som er oppført på kortet</translation> <translation id="4808667324955055115">Blokkerte forgrunnsvinduer:</translation> <translation id="480990236307250886">Åpne startsiden</translation> @@ -2475,6 +2484,7 @@ <translation id="4941246025622441835">Bruk denne enhetsrekvisisjonen når du registrerer enheten for bedriftsadministrering.</translation> <translation id="4941627891654116707">Skriftstørrelse</translation> <translation id="494286511941020793">Hjelp for konfigurering av mellomtjenere</translation> +<translation id="4943368462779413526">Fotball</translation> <translation id="4943691134276646401">«<ph name="CHROME_EXTENSION_NAME" />» vil koble til en seriell port</translation> <translation id="495170559598752135">Handlinger</translation> <translation id="4953689047182316270">Svar på tilgjengelighetshendelser</translation> @@ -2544,6 +2554,7 @@ <translation id="5067399438976153555">Alltid på</translation> <translation id="5067867186035333991">Spør om <ph name="HOST" /> vil bruke mikrofonen din</translation> <translation id="5068918910148307423">Ikke tillat at nylig lukkede nettsteder fullfører sending og mottak av data</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Juster markørstørrelsen</translation> <translation id="5072836811783999860">Vis administrerte bokmerker</translation> <translation id="5074318175948309511">Du må kanskje laste inn denne siden på nytt for at innstillingene skal bli gjeldende.</translation> @@ -2578,6 +2589,7 @@ <translation id="5117930984404104619">overvåke atferden til andre utvidelser, inkludert besøkte nettadresser</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Harddisken din er full. Lagre på et annet sted, eller frigjør plass på harddisken.</translation> +<translation id="5123433949759960244">Basketball</translation> <translation id="5125751979347152379">Ugyldig nettadresse.</translation> <translation id="5127805178023152808">Synkronisering er slått av</translation> <translation id="5127881134400491887">administrere nettverkstilkoblinger</translation> @@ -3261,6 +3273,7 @@ <translation id="6166185671393271715">Importér passord i Chrome</translation> <translation id="6169040057125497443">Sjekk mikrofonen din.</translation> <translation id="6169666352732958425">Kan ikke caste skrivebordet.</translation> +<translation id="6170470584681422115">Smørbrød</translation> <translation id="6171948306033499786">Sett utskriftsjobben på pause</translation> <translation id="6173623053897475761">Skriv inn PIN-koden din igjen</translation> <translation id="6175314957787328458">Microsoft domeneguide</translation> @@ -3691,6 +3704,7 @@ <translation id="6870888490422746447">Velg en app du vil dele med:</translation> <translation id="6871644448911473373">OCSP-svarer: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Passordet du skrev inn, ble avvist av tjeneren.</translation> +<translation id="6876155724392614295">Sykkel</translation> <translation id="6878422606530379992">Sensorer er tillatt</translation> <translation id="6880587130513028875">Bilder er blokkert på siden.</translation> <translation id="6883319974225028188">Beklager. Systemet kunne ikke lagre enhetskonfigurasjonen.</translation> @@ -4255,6 +4269,7 @@ <translation id="7772127298218883077">Om <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Sjekk statusen for Chromebooken</translation> <translation id="7773726648746946405">Øktlagring</translation> +<translation id="7774365994322694683">Fugl</translation> <translation id="7776701556330691704">Fant ingen stemmer</translation> <translation id="7781335840981796660">Alle brukerkontoer og lokale data fjernes.</translation> <translation id="7782102568078991263">Google har ikke flere forslag</translation> @@ -4660,6 +4675,7 @@ <translation id="8386903983509584791">Skanningen er fullført</translation> <translation id="8389492867173948260">La denne utvidelsen lese og endre alle dataene dine på nettsteder du besøker:</translation> <translation id="8390449457866780408">Tjeneren er ikke tilgjengelig.</translation> +<translation id="8391218455464584335">Vinylplate</translation> <translation id="8391712576156218334">Bildet er ikke tilgjengelig. Prøv på nytt senere.</translation> <translation id="8392234662362215700">Trykk på Ctrl + Shift + mellomrom for å bytte tastaturoppsett.</translation> <translation id="8392451568018454956">Alternativmenyen for <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index da1c6e22..5752529f 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Przeszukaj urządzenie, aplikacje i internet.</translation> <translation id="114721135501989771">Inteligentne rozwiązania Google w Chrome</translation> <translation id="1149401351239820326">Miesiąc utraty ważności</translation> +<translation id="1150565364351027703">Okulary przeciwsłoneczne</translation> <translation id="1151917987301063366">Zawsze zezwalaj witrynie <ph name="HOST" /> na dostęp do czujników</translation> <translation id="1153356358378277386">Sparowane urządzenia</translation> <translation id="1156488781945104845">Bieżąca godzina</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Informacje o skrótach klawiszowych</translation> <translation id="2045969484888636535">Nadal blokuj pliki cookie</translation> <translation id="204622017488417136">Na Twoim urządzeniu zostanie przywrócona poprzednia wersja Chrome. Wszystkie zapisane lokalnie konta użytkowników i dane zostaną usunięte. Tej czynności nie można cofnąć.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Dostęp do ruchu sieciowego</translation> <translation id="2048653237708779538">Czynność niedostępna</translation> <translation id="2050339315714019657">Pionowo</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Dodano: <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Serwer proxy HTTP</translation> <translation id="2468205691404969808">Zapisuje Twoje ustawienia w plikach cookie, nawet jeśli nie odwiedzasz tych stron</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Dostosuj sprawdzanie pisowni</translation> <translation id="247051149076336810">URL udziału plików</translation> <translation id="2470702053775288986">Wyłączono nieobsługiwane rozszerzenia</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Usuń z listy</translation> <translation id="2770690685823456775">Eksportuj hasła do innego folderu</translation> <translation id="2771268254788431918">Aktywowano mobilną transmisję danych</translation> +<translation id="2771816809568414714">Ser</translation> <translation id="2772936498786524345">Dyskretny</translation> <translation id="2773288106548584039">Obsługa starszych przeglądarek</translation> <translation id="2773802008104670137">Plik tego typu może uszkodzić komputer.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Dźwięk</translation> <translation id="3616741288025931835">&Wyczyść dane przeglądania...</translation> <translation id="3617891479562106823">Tła są niedostępne. Spróbuj ponownie później.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Tym użytkownikiem nadzorowanym będzie zarządzać <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Odblokuj urządzenie i zaloguj się na konto Google</translation> <translation id="3625258641415618104">Zrzuty ekranu wyłączone</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Pejzaż miejski</translation> <translation id="4361142739114356624">Klucz prywatny tego certyfikatu klienta jest nieprawidłowy lub nie istnieje</translation> <translation id="4363771538994847871">Nie wykryto żadnego urządzenia Cast. Potrzebujesz pomocy?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> udostępnia okno.</translation> <translation id="4364830672918311045">Wyświetlanie powiadomień</translation> <translation id="4365673000813822030">Ups, synchronizacja przestała działać.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Cztery pliki wygenerowane przez oprogramowanie układowe Wi-Fi firmy Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Pierwsze trzy to pliki binarne zawierające zrzuty rejestru. Intel twierdzi, że nie zawierają żadnych danych umożliwiających identyfikację osoby lub urządzenia. Ostatni plik zawiera ślad wykonywania oprogramowania układowego firmy Intel. Wszelkie dane umożliwiające identyfikację osoby lub urządzenia zostały z niego usunięte, ale jest zbyt duży, by go tu wyświetlić. Te pliki zostały wygenerowane w reakcji na niedawne problemy z Wi-Fi na Twoim urządzeniu i zostaną przekazane firmie Intel, by pomóc w rozwiązaniu tych problemów.></translation> <translation id="469230890969474295">Folder OEM</translation> <translation id="4692623383562244444">Wyszukiwarki</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Konfiguracją drukarek zajmuje się administrator.</translation> <translation id="4694604912444486114">Małpa</translation> <translation id="4697551882387947560">Po zakończeniu sesji przeglądania</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Hasło dla <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Sklep Play</translation> <translation id="4779083564647765204">Powiększ</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Zablokowano wyskakujące okienko}few{Zablokowano # wyskakujące okienka}many{Zablokowano # wyskakujących okienek}other{Zablokowano # wyskakującego okienka}}</translation> <translation id="4780321648949301421">Zapisz stronę jako...</translation> <translation id="4785719467058219317">Używasz klucza bezpieczeństwa, który nie jest zarejestrowany w tej witrynie</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Ukryj konta</translation> <translation id="4801512016965057443">Zezwól na przesył danych w roamingu</translation> <translation id="4804818685124855865">Rozłącz</translation> +<translation id="4804827417948292437">Awokado</translation> <translation id="4807098396393229769">Imię i nazwisko na karcie</translation> <translation id="4808667324955055115">Zablokowane wyskakujące okienka:</translation> <translation id="480990236307250886">Otwórz stronę główną</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Użyj tej informacji o przeznaczeniu urządzenia, gdy urządzenie będzie rejestrowane na potrzeby zarządzania w firmie:</translation> <translation id="4941627891654116707">Rozmiar czcionki</translation> <translation id="494286511941020793">Konfiguracja serwera proxy – pomoc</translation> +<translation id="4943368462779413526">Piłka futbolowa</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />” chce się połączyć z portem szeregowym</translation> <translation id="495170559598752135">Czynności</translation> <translation id="4953689047182316270">Odpowiadanie na zdarzenia dotyczące ułatwień dostępu</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Zawsze włączony</translation> <translation id="5067867186035333991">Pytaj, gdy witryna <ph name="HOST" /> chce mieć dostęp do mikrofonu</translation> <translation id="5068918910148307423">Nie zezwalaj niedawno zamkniętym stronom na dokończenie wysyłania i odbierania danych</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Dostosuj rozmiar kursora</translation> <translation id="5072836811783999860">Pokaż zakładki zarządzane</translation> <translation id="5074318175948309511">Aby nowe ustawienia zaczęły działać, być może trzeba odświeżyć tę stronę.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Monitorowanie działania innych rozszerzeń, w tym otwieranych adresów URL</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Dysk twardy jest pełny. Zapisz w innej lokalizacji lub zwolnij miejsce na dysku.</translation> +<translation id="5123433949759960244">Piłka do koszykówki</translation> <translation id="5125751979347152379">Nieprawidłowy adres URL.</translation> <translation id="5127805178023152808">Synchronizacja jest wyłączona</translation> <translation id="5127881134400491887">Zarządzanie połączeniami sieciowymi</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Importowanie haseł do Chrome</translation> <translation id="6169040057125497443">Sprawdź mikrofon.</translation> <translation id="6169666352732958425">Nie można przesłać pulpitu.</translation> +<translation id="6170470584681422115">Kanapka</translation> <translation id="6171948306033499786">Wstrzymaj drukowanie</translation> <translation id="6173623053897475761">Wpisz ponownie kod PIN</translation> <translation id="6175314957787328458">Identyfikator GUID domeny firmy Microsoft</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Wybierz aplikację docelową udostępniania:</translation> <translation id="6871644448911473373">Obiekt odpowiadający protokołu OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Podane hasło zostało odrzucone przez serwer.</translation> +<translation id="6876155724392614295">Rower</translation> <translation id="6878422606530379992">Zezwolono na dostęp do czujników</translation> <translation id="6880587130513028875">Pokazywanie grafik na tej stronie zostało zablokowane.</translation> <translation id="6883319974225028188">Ups, systemowi nie udało się zapisać konfiguracji urządzenia.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> – informacje</translation> <translation id="7772773261844472235">Sprawdź stan Chromebooka</translation> <translation id="7773726648746946405">Przechowywanie sesji</translation> +<translation id="7774365994322694683">Ptak</translation> <translation id="7776701556330691704">Nie znaleziono głosów</translation> <translation id="7781335840981796660">Wszystkie konta użytkowników i dane lokalne zostaną usunięte.</translation> <translation id="7782102568078991263">Nie pokazuj sugestii od Google</translation> @@ -4670,6 +4685,7 @@ <translation id="8386903983509584791">Skanowanie ukończone</translation> <translation id="8389492867173948260">Zezwól temu rozszerzeniu na odczytywanie i zmienianie wszystkich Twoich danych na stronach, które otwierasz:</translation> <translation id="8390449457866780408">Serwer jest niedostępny.</translation> +<translation id="8391218455464584335">Płyta winylowa</translation> <translation id="8391712576156218334">Obraz jest niedostępny. Spróbuj ponownie później.</translation> <translation id="8392234662362215700">Naciśnij Control+Shift+spacja, by przełączyć układ klawiatury.</translation> <translation id="8392451568018454956">Menu opcji dla <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 802ff14..c97c091 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Pesquisar seu dispositivo, apps e Web.</translation> <translation id="114721135501989771">A tecnologia Google no Chrome</translation> <translation id="1149401351239820326">Mês de expiração</translation> +<translation id="1150565364351027703">Óculos de sol</translation> <translation id="1151917987301063366">Sempre permitir que <ph name="HOST" /> acesse os sensores</translation> <translation id="1153356358378277386">Dispositivos pareados</translation> <translation id="1156488781945104845">Hora atual</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Assistente de atalhos do teclado</translation> <translation id="2045969484888636535">Continuar bloqueando cookies</translation> <translation id="204622017488417136">Seu dispositivo voltará à versão do Google Chrome instalada anteriormente. Todas as contas de usuário e dados locais serão removidos. Esta ação não pode ser desfeita.</translation> +<translation id="2046702855113914483">Lámen</translation> <translation id="2048182445208425546">Acesse seu tráfego de rede</translation> <translation id="2048653237708779538">Ação indisponível</translation> <translation id="2050339315714019657">Retrato</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> adicionada</translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Utiliza cookies para lembrar suas preferências, mesmo se você não acessar essas páginas</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Personalizar verificação ortográfica</translation> <translation id="247051149076336810">URL de compartilhamento de arquivos</translation> <translation id="2470702053775288986">Extensões incompatíveis desativadas</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Remover da lista</translation> <translation id="2770690685823456775">Exportar suas senhas para outra pasta</translation> <translation id="2771268254788431918">Dados móveis ativados</translation> +<translation id="2771816809568414714">Queijo</translation> <translation id="2772936498786524345">Katana</translation> <translation id="2773288106548584039">Suporte a navegadores legados</translation> <translation id="2773802008104670137">Esse tipo de arquivo pode danificar seu computador.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Áudio</translation> <translation id="3616741288025931835">&Limpar dados de navegação...</translation> <translation id="3617891479562106823">Os planos de fundo estão indisponíveis. Tente novamente mais tarde.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Este usuário supervisionado será gerenciado por <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Desbloquear dispositivo e fazer login na Conta do Google</translation> <translation id="3625258641415618104">Capturas de tela desativadas</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Paisagem urbana</translation> <translation id="4361142739114356624">A chave particular desse certificado do cliente está ausente ou é inválida</translation> <translation id="4363771538994847871">Nenhum destino do Google Cast encontrado. Precisa de ajuda?</translation> +<translation id="4364327530094270451">Melão</translation> <translation id="4364567974334641491">O app <ph name="APP_NAME" /> está compartilhando uma janela.</translation> <translation id="4364830672918311045">Exibir notificações</translation> <translation id="4365673000813822030">Ops, a sincronização parou de funcionar.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Quatro arquivos gerados pelo firmware de Wi-Fi da Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Os três primeiros são arquivos binários que contêm despejos de registro e, segundo a Intel, não contêm possuem pessoais ou de identificação do dispositivo. O último arquivo é um rastreamento de execução do firmware da Intel. Todas as informações pessoais ou de identificação do dispositivo foram apagadas dele, mas ele é grande demais para ser exibido aqui. Esses arquivos foram gerados em resposta a problemas recentes de Wi-Fi no seu dispositivo e serão compartilhados com a Intel para ajudar a solucionar esses problemas.></translation> <translation id="469230890969474295">Pasta do OEM</translation> <translation id="4692623383562244444">Mecanismos de pesquisa</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">A configuração da impressora é gerenciada pelo administrador.</translation> <translation id="4694604912444486114">Macaco</translation> <translation id="4697551882387947560">Quando terminar a sessão de navegação</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Senha para <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Oniguiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pop-up bloqueado}one{# pop-up bloqueado}other{# pop-ups bloqueados}}</translation> <translation id="4780321648949301421">Salvar página como...</translation> <translation id="4785719467058219317">Você está usando uma chave de segurança que não está registrada neste site</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Ocultar contas</translation> <translation id="4801512016965057443">Permitir roaming de dados móveis</translation> <translation id="4804818685124855865">Desconectar</translation> +<translation id="4804827417948292437">Abacate</translation> <translation id="4807098396393229769">Nome no cartão de crédito</translation> <translation id="4808667324955055115">Pop-ups bloqueados:</translation> <translation id="480990236307250886">Abrir a página inicial</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Usar essa requisição de dispositivo ao inscrever o dispositivo no gerenciamento corporativo:</translation> <translation id="4941627891654116707">Tamanho da fonte</translation> <translation id="494286511941020793">Ajuda da configuração de proxy</translation> +<translation id="4943368462779413526">Futebol americano</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" quer se conectar a uma porta serial</translation> <translation id="495170559598752135">Ações</translation> <translation id="4953689047182316270">Responder a eventos de acessibilidade</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Sempre ativado</translation> <translation id="5067867186035333991">Perguntar se <ph name="HOST" /> deseja acessar seu microfone</translation> <translation id="5068918910148307423">Não permitir que sites fechados recentemente concluam o envio e o recebimento de dados</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Ajustar tamanho do cursor</translation> <translation id="5072836811783999860">Mostrar favoritos gerenciados</translation> <translation id="5074318175948309511">Esta página pode precisar ser recarregada para que as novas configurações tenham efeito.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Monitorar o comportamento de outras extensões, incluindo URLs visitados</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Seu disco rígido está cheio. Salve em outro local ou libere mais espaço no disco rígido.</translation> +<translation id="5123433949759960244">Basquete</translation> <translation id="5125751979347152379">URL inválido.</translation> <translation id="5127805178023152808">A sincronização está desativada</translation> <translation id="5127881134400491887">Gerenciar conexões de rede</translation> @@ -3270,6 +3282,7 @@ <translation id="6166185671393271715">Importar senhas para o Chrome</translation> <translation id="6169040057125497443">Verifique seu microfone.</translation> <translation id="6169666352732958425">Não é possível transmitir a área de trabalho.</translation> +<translation id="6170470584681422115">Sanduíche</translation> <translation id="6171948306033499786">Pausar impressão</translation> <translation id="6173623053897475761">Digite seu PIN novamente</translation> <translation id="6175314957787328458">GUID do domínio da Microsoft</translation> @@ -3700,6 +3713,7 @@ <translation id="6870888490422746447">Escolha um app para compartilhar:</translation> <translation id="6871644448911473373">Respondente OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">A senha inserida foi recusada pelo servidor.</translation> +<translation id="6876155724392614295">Bicicleta</translation> <translation id="6878422606530379992">Sensores permitidos</translation> <translation id="6880587130513028875">As imagens foram bloqueadas nesta página.</translation> <translation id="6883319974225028188">Oops! O sistema falhou ao salvar a configuração do dispositivo.</translation> @@ -4266,6 +4280,7 @@ <translation id="7772127298218883077">Sobre o <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Verificar o status do Chromebook</translation> <translation id="7773726648746946405">Armazenamento da sessão</translation> +<translation id="7774365994322694683">Pássaro</translation> <translation id="7776701556330691704">Nenhuma voz encontrada</translation> <translation id="7781335840981796660">Todas as contas de usuário e os dados locais serão removidos.</translation> <translation id="7782102568078991263">Não há mais sugestões do Google</translation> @@ -4672,6 +4687,7 @@ <translation id="8386903983509584791">Verificação concluída</translation> <translation id="8389492867173948260">Permitir que a extensão leia e modifique todos os seus dados nos sites que você visitar:</translation> <translation id="8390449457866780408">Servidor não disponível.</translation> +<translation id="8391218455464584335">Vinil</translation> <translation id="8391712576156218334">Imagem indisponível. Tente novamente mais tarde.</translation> <translation id="8392234662362215700">Pressione Control-Shift-Barra de espaço para trocar o layout do teclado.</translation> <translation id="8392451568018454956">Menu de opções para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 830347f..360370c 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Pesquise no dispositivo, nas aplicações e na Web.</translation> <translation id="114721135501989771">Inteligên. Google no Chrome</translation> <translation id="1149401351239820326">Mês de expiração</translation> +<translation id="1150565364351027703">Óculos de sol</translation> <translation id="1151917987301063366">Permitir sempre que <ph name="HOST" /> aceda aos sensores</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> <translation id="1156488781945104845">Hora atual</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Ajuda dos atalhos de teclado</translation> <translation id="2045969484888636535">Continuar a bloquear cookies</translation> <translation id="204622017488417136">O dispositivo regressa à versão do Chrome instalada anteriormente. Todos os dados locais e as contas de utilizador são removidos. Não é possível anular esta ação.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Aceder ao tráfego da sua rede</translation> <translation id="2048653237708779538">Ação não disponível</translation> <translation id="2050339315714019657">Vertical</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> adicionada</translation> <translation id="2464089476039395325">Proxy de HTTP</translation> <translation id="2468205691404969808">Utiliza cookies para memorizar as suas preferências, mesmo que não visite essas páginas.</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Personalizar o corretor ortográfico</translation> <translation id="247051149076336810">URL de partilha de ficheiros</translation> <translation id="2470702053775288986">Extensões não suportadas desativadas</translation> @@ -1131,6 +1134,7 @@ <translation id="2770465223704140727">Remover da lista</translation> <translation id="2770690685823456775">Exportar as palavras-passe para outra pasta</translation> <translation id="2771268254788431918">Dados móveis ativados</translation> +<translation id="2771816809568414714">Queijo</translation> <translation id="2772936498786524345">Sorrateiro</translation> <translation id="2773288106548584039">Compatibilidade com o navegador antigo</translation> <translation id="2773802008104670137">Este tipo de ficheiro pode danificar o seu computador.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Áudio</translation> <translation id="3616741288025931835">&Limpar Dados de Navegação...</translation> <translation id="3617891479562106823">Os fundos não estão disponíveis. Tente novamente mais tarde.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Este utilizador supervisionado será gerido por <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Desbloquear o dispositivo e iniciar sessão na Conta Google</translation> <translation id="3625258641415618104">Capturas de ecrã desativadas</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Paisagens urbanas</translation> <translation id="4361142739114356624">A chave privada para este certificado de cliente está em falta ou é inválida</translation> <translation id="4363771538994847871">Não foi encontrado nenhum destino do Cast. Precisa de ajuda?</translation> +<translation id="4364327530094270451">Melão</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> está a partilhar uma janela.</translation> <translation id="4364830672918311045">Apresentar notificações</translation> <translation id="4365673000813822030">Ups, a Sincronização deixou de funcionar.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Quatro ficheiros gerados pelo firmware de Wi-Fi da Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Os três primeiros são ficheiros binários que contêm cópias do registo e são confirmados pela Intel como não contendo informações identificativas do dispositivo ou pessoais. O último ficheiro é um rastreio de execução do firmware da Intel; foram dele removidas quaisquer informações identificativas do dispositivo ou pessoais, mas é demasiado grande para apresentar aqui. Estes ficheiros foram gerados como resposta aos recentes problemas de Wi-Fi do seu dispositivo e serão partilhados com a Intel para ajudar a resolver estes problemas.></translation> <translation id="469230890969474295">Pasta OEM</translation> <translation id="4692623383562244444">Motores de pesquisa</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">A configuração da impressora é gerida pelo administrador.</translation> <translation id="4694604912444486114">Macaco</translation> <translation id="4697551882387947560">Quando a sessão de navegação termina</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Palavra-passe para <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pop-up bloqueado}other{# pop-ups bloqueados}}</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4785719467058219317">Está a utilizar uma chave de segurança que não está registada neste Website.</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Ocultar contas</translation> <translation id="4801512016965057443">Permitir roaming de dados móveis</translation> <translation id="4804818685124855865">Desligar</translation> +<translation id="4804827417948292437">Abacate</translation> <translation id="4807098396393229769">Nome no cartão</translation> <translation id="4808667324955055115">Pop-ups bloqueados:</translation> <translation id="480990236307250886">Abrir a página de início</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Utilizar a requisição deste dispositivo ao inscrever o dispositivo para gestão empresarial:</translation> <translation id="4941627891654116707">Tamanho do tipo de letra</translation> <translation id="494286511941020793">Ajuda de configuração de proxy</translation> +<translation id="4943368462779413526">Bola de futebol</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" pretende estabelecer ligação a uma porta de série</translation> <translation id="495170559598752135">Ações</translation> <translation id="4953689047182316270">Responder a eventos de acessibilidade</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Sempre ativado</translation> <translation id="5067867186035333991">Perguntar se <ph name="HOST" /> pretende aceder ao seu microfone</translation> <translation id="5068918910148307423">Não permitir que os sites fechados recentemente concluam o envio e a receção de dados</translation> +<translation id="5068919226082848014">Piza</translation> <translation id="5072052264945641674">Ajustar tamanho do cursor</translation> <translation id="5072836811783999860">Mostrar marcadores geridos</translation> <translation id="5074318175948309511">Poderá ser necessário voltar a atualizar esta página antes de aplicar as novas definições.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Monitorizar o comportamento de outras extensões, incluindo URLs visitados</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">O seu disco rígido está cheio. Guarde noutra localização ou liberte espaço no disco rígido.</translation> +<translation id="5123433949759960244">Bola de basquetebol</translation> <translation id="5125751979347152379">URL inválido.</translation> <translation id="5127805178023152808">A sincronização está desativada</translation> <translation id="5127881134400491887">Gerir ligações de rede</translation> @@ -3269,6 +3281,7 @@ <translation id="6166185671393271715">Importar palavras-passe para o Chrome</translation> <translation id="6169040057125497443">Verifique o microfone.</translation> <translation id="6169666352732958425">Não é possível transmitir o ambiente de trabalho.</translation> +<translation id="6170470584681422115">Sanduíche</translation> <translation id="6171948306033499786">Interromper impressão</translation> <translation id="6173623053897475761">Introduza o PIN novamente</translation> <translation id="6175314957787328458">GUID de Domínio do Windows</translation> @@ -3699,6 +3712,7 @@ <translation id="6870888490422746447">Escolha uma aplicação a partilhar em:</translation> <translation id="6871644448911473373">Serviço de resposta de OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">A palavra-passe introduzida foi rejeitada pelo servidor.</translation> +<translation id="6876155724392614295">Bicicleta</translation> <translation id="6878422606530379992">Sensores permitidos</translation> <translation id="6880587130513028875">As imagens foram bloqueadas nesta página.</translation> <translation id="6883319974225028188">Ups! O sistema não conseguiu guardar a configuração do dispositivo.</translation> @@ -4265,6 +4279,7 @@ <translation id="7772127298218883077">Acerca do <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Verificar o estado do seu Chromebook</translation> <translation id="7773726648746946405">Armazenamento da sessão</translation> +<translation id="7774365994322694683">Pássaro</translation> <translation id="7776701556330691704">Não foram encontradas vozes.</translation> <translation id="7781335840981796660">Serão removidas todas as contas de utilizador e dados locais.</translation> <translation id="7782102568078991263">Não há mais sugestões do Google</translation> @@ -4669,6 +4684,7 @@ <translation id="8386903983509584791">Análise concluída</translation> <translation id="8389492867173948260">Permitir que esta extensão leia e altere todos os dados nos Websites que visita:</translation> <translation id="8390449457866780408">O servidor não se encontra disponível.</translation> +<translation id="8391218455464584335">Vinil</translation> <translation id="8391712576156218334">A imagem não está disponível. Tente novamente mais tarde.</translation> <translation id="8392234662362215700">Prima Control-Shift-Espaço para mudar o esquema de teclado.</translation> <translation id="8392451568018454956">Menu de opções para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 91b3728..2629e6f 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Caută pe dispozitiv, în aplicații și pe web.</translation> <translation id="114721135501989771">Profită de ingeniozitatea Google în Chrome</translation> <translation id="1149401351239820326">Luna expirării</translation> +<translation id="1150565364351027703">Ochelari de soare</translation> <translation id="1151917987301063366">Permite întotdeauna accesul <ph name="HOST" /> la senzori</translation> <translation id="1153356358378277386">Dispozitive asociate</translation> <translation id="1156488781945104845">Ora actuală</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Ajutor pentru comenzi rapide de la tastatură</translation> <translation id="2045969484888636535">Continuă blocarea cookie-urilor</translation> <translation id="204622017488417136">Dispozitivul va reveni la versiunea Chrome instalată anterior. Toate conturile de utilizator și datele locale vor fi eliminate. Această operațiune nu poate fi anulată.</translation> +<translation id="2046702855113914483">Supă ramen</translation> <translation id="2048182445208425546">Accesează traficul de rețea</translation> <translation id="2048653237708779538">Acțiunea nu este disponibilă</translation> <translation id="2050339315714019657">Portret</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">S-a adăugat <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Folosește cookie-uri pentru a-ți reține preferințele, chiar dacă nu accesezi paginile respective</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Personalizează verificarea ortografiei</translation> <translation id="247051149076336810">Adresa URL a spațiului comun de stocare fișiere</translation> <translation id="2470702053775288986">Extensiile necompatibile au fost dezactivate</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Elimină din listă</translation> <translation id="2770690685823456775">Exportă parolele într-un alt dosar</translation> <translation id="2771268254788431918">Datele mobile sunt activate</translation> +<translation id="2771816809568414714">Brânză</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Compatibilitate pentru browsere vechi</translation> <translation id="2773802008104670137">Este posibil ca acest tip de fișier să dăuneze computerului.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Audio</translation> <translation id="3616741288025931835">&Șterge datele de navigare...</translation> <translation id="3617891479562106823">Fundalurile nu sunt disponibile. Încearcă din nou mai târziu.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Acest utilizator va fi monitorizat de <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Deblochează dispozitivul și conectează-te la Contul Google</translation> <translation id="3625258641415618104">Capturile de ecran sunt dezactivate</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">Cheia privată pentru acest Certificat de client lipsește sau nu este validă</translation> <translation id="4363771538994847871">Nicio destinație Google Cast găsită. Ai nevoie de ajutor?</translation> +<translation id="4364327530094270451">Pepene galben</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> trimite conținutul unei ferestre.</translation> <translation id="4364830672918311045">Afișează notificările</translation> <translation id="4365673000813822030">Hopa, sincronizarea a încetat să funcționeze.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Patru fișiere generate de firmware-ul Wi-Fi Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Primele trei sunt fișiere binare care conțin dumpuri de registru, despre care Intel afirmă că nu conțin informații cu caracter personal sau de identificare a dispozitivelor. Ultimul fișier este o urmărire a executării firmware-ului Intel; din acesta au fost eliminate informațiile cu caracter personal sau de identificare a dispozitivelor, dar este prea mare pentru a fi afișat aici. Aceste fișiere au fost generate ca răspuns la problemele recente privind conexiunea Wi-Fi ale dispozitivului și vor fi trimise la Intel în vederea remedierii.></translation> <translation id="469230890969474295">Dosar OEM</translation> <translation id="4692623383562244444">Motoare de căutare</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Configurarea imprimantei este gestionată de administrator.</translation> <translation id="4694604912444486114">Maimuță</translation> <translation id="4697551882387947560">La încheierea sesiunii de navigare</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Parolă pentru <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Magazin Play</translation> <translation id="4779083564647765204">Zoom</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Fereastră pop-up blocată}few{# ferestre pop-up blocate}other{# de ferestre pop-up blocate}}</translation> <translation id="4780321648949301421">Salvează pagina ca...</translation> <translation id="4785719467058219317">Folosești o cheie de securitate care nu este înregistrată pe acest site</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Ascundeți conturile</translation> <translation id="4801512016965057443">Permite roaming de date mobile</translation> <translation id="4804818685124855865">Deconectează-te</translation> +<translation id="4804827417948292437">Avocado</translation> <translation id="4807098396393229769">Numele de pe card</translation> <translation id="4808667324955055115">Ferestre pop-up blocate:</translation> <translation id="480990236307250886">Deschide pagina de pornire</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Utilizați această solicitare pentru dispozitiv la înscrierea dispozitivului pentru gestionarea la nivel de întreprindere:</translation> <translation id="4941627891654116707">Dimensiunea fontului</translation> <translation id="494286511941020793">Ajutor de configurare pentru proxy</translation> +<translation id="4943368462779413526">Minge de fotbal</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />” dorește să se conecteze la un port serial</translation> <translation id="495170559598752135">Acțiuni</translation> <translation id="4953689047182316270">să răspundă evenimentelor de accesibilitate</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Activat permanent</translation> <translation id="5067867186035333991">Întreabă dacă <ph name="HOST" /> solicită acces la microfon</translation> <translation id="5068918910148307423">Nu permite site-urilor închise recent să finalizeze trimiterea sau primirea datelor</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Ajustează dimensiunea cursorului</translation> <translation id="5072836811783999860">Vezi marcajele gestionate</translation> <translation id="5074318175948309511">Este posibil să fie necesară reîncărcarea acestei pagini înainte ca noile setări să se aplice.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Monitorizarea comportamentului altor extensii, inclusiv al adreselor URL accesate</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Hard diskul este plin. Salvați în altă locație sau eliberați mai mult spațiu pe hard disk.</translation> +<translation id="5123433949759960244">Baschet</translation> <translation id="5125751979347152379">Adresă URL nevalidă.</translation> <translation id="5127805178023152808">Sincronizarea este dezactivată</translation> <translation id="5127881134400491887">Gestionează conexiunile de rețea</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Importă parolele în Chrome</translation> <translation id="6169040057125497443">Verifică microfonul.</translation> <translation id="6169666352732958425">Nu se poate proiecta desktopul.</translation> +<translation id="6170470584681422115">Sendviș</translation> <translation id="6171948306033499786">Întrerupe printarea</translation> <translation id="6173623053897475761">Introdu din nou codul PIN</translation> <translation id="6175314957787328458">GUID domeniu Microsoft</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Alege o aplicație pentru trimitere:</translation> <translation id="6871644448911473373">Respondent OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Parola pe care ai introdus-o a fost respinsă de server.</translation> +<translation id="6876155724392614295">Bicicletă</translation> <translation id="6878422606530379992">Folosirea senzorilor este permisă</translation> <translation id="6880587130513028875">Imaginile au fost blocate pe această pagină.</translation> <translation id="6883319974225028188">Hopa! Sistemul nu a putut salva configurarea dispozitivului.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">Despre <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Verifică starea Chromebookului</translation> <translation id="7773726648746946405">Stocare sesiune</translation> +<translation id="7774365994322694683">Pasăre</translation> <translation id="7776701556330691704">Nu s-a găsit nicio voce</translation> <translation id="7781335840981796660">Toate conturile de utilizator și datele locale vor fi eliminate.</translation> <translation id="7782102568078991263">Nu mai există sugestii de la Google</translation> @@ -4669,6 +4684,7 @@ <translation id="8386903983509584791">Scanarea s-a finalizat</translation> <translation id="8389492867173948260">Permite ca această extensie să citească și să modifice toate datele de pe site-urile pe care le accesezi:</translation> <translation id="8390449457866780408">Server indisponibil.</translation> +<translation id="8391218455464584335">Vinil</translation> <translation id="8391712576156218334">Imaginea nu este disponibilă. Încearcă din nou mai târziu.</translation> <translation id="8392234662362215700">Apasă tastele Control-Shift-Spațiu pentru a comuta aranjamentul tastaturii.</translation> <translation id="8392451568018454956">Meniu cu opțiuni pentru <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 54b5d55..5645618 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Введите запрос для поиска на устройстве, в приложениях и Интернете.</translation> <translation id="114721135501989771">Интеллектуальные функции Google в Chrome</translation> <translation id="1149401351239820326">Месяц окончания срока действия</translation> +<translation id="1150565364351027703">Солнцезащитные очки</translation> <translation id="1151917987301063366">Всегда разрешать сайту <ph name="HOST" /> использовать датчики</translation> <translation id="1153356358378277386">Сопряженные устройства</translation> <translation id="1156488781945104845">Текущее время</translation> @@ -660,6 +661,7 @@ <translation id="2045117674524495717">Справка по быстрым клавишам</translation> <translation id="2045969484888636535">Всегда блокировать сохранение cookie</translation> <translation id="204622017488417136">Устройство вернется к предыдущей версии Chrome. Локальные данные и аккаунты пользователей будут удалены. Это действие нельзя отменить.</translation> +<translation id="2046702855113914483">Рамен</translation> <translation id="2048182445208425546">Доступ к сетевому трафику</translation> <translation id="2048653237708779538">Действие недоступно</translation> <translation id="2050339315714019657">Книжная</translation> @@ -926,6 +928,7 @@ <translation id="2462752602710430187">Добавлен принтер <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP-прокси</translation> <translation id="2468205691404969808">Использовать файлы cookie, чтобы запомнить ваши предпочтения, даже если вы не открываете эти страницы</translation> +<translation id="2468402215065996499">Тамагочи</translation> <translation id="2469375675106140201">Настроить проверку правописания</translation> <translation id="247051149076336810">URL общей папки</translation> <translation id="2470702053775288986">Неподдерживаемые расширения отключены</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Удалить из списка</translation> <translation id="2770690685823456775">Экспортируйте пароли в другую папку.</translation> <translation id="2771268254788431918">Мобильный Интернет включен</translation> +<translation id="2771816809568414714">Сыр</translation> <translation id="2772936498786524345">Ниндзя</translation> <translation id="2773288106548584039">Поддержка альтернативного браузера</translation> <translation id="2773802008104670137">Файлы этого типа могут нанести вред вашему компьютеру.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Аудио</translation> <translation id="3616741288025931835">Очистить данные просмотров...</translation> <translation id="3617891479562106823">Фоновые изображения недоступны. Повторите попытку позже.</translation> +<translation id="3619115746895587757">Капучино</translation> <translation id="3623574769078102674">Менеджер этого контролируемого профиля: <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Снимать блокировку устройства и входить в аккаунт Google</translation> <translation id="3625258641415618104">Скриншоты отключены</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Городской пейзаж</translation> <translation id="4361142739114356624">Закрытый ключ для клиентского сертификата отсутствует или недействителен</translation> <translation id="4363771538994847871">Нет устройств для трансляции. Нужна помощь?</translation> +<translation id="4364327530094270451">Дыня</translation> <translation id="4364567974334641491">Приложение "<ph name="APP_NAME" />" предоставило доступ к окну.</translation> <translation id="4364830672918311045">Показывать уведомления</translation> <translation id="4365673000813822030">К сожалению, выполнить синхронизацию не удалось.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Встроенным ПО для Wi-Fi от Intel сгенерировано четыре файла: csr.lst, fh_regs.lst, radio_reg.lst и monitor.lst.sysmon. Первые три – бинарные файлы, содержащие дампы реестра, в которых, по данным компании Intel, нет персональных данных и информации об устройстве. Последний файл содержит трассировку выполнения кода встроенного ПО от Intel (из него также удалены все персональные данные и информация об устройстве). Так как этот файл слишком большой, мы не можем показать его здесь целиком. Эти файлы будут отправлены в Intel, чтобы помочь в устранении проблем с Wi-Fi на вашем устройстве.></translation> <translation id="469230890969474295">Папка OEM</translation> <translation id="4692623383562244444">Поисковые системы</translation> +<translation id="4693155481716051732">Суши</translation> <translation id="4694024090038830733">Настройками принтера управляет администратор.</translation> <translation id="4694604912444486114">Обезьяна</translation> <translation id="4697551882387947560">При завершении сеанса браузера</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Пароль для адреса электронной почты <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Маркет</translation> <translation id="4779083564647765204">Масштаб</translation> +<translation id="4779136857077979611">Онигири</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Всплывающее окно заблокировано}one{Заблокировано # всплывающее окно}few{Заблокировано # всплывающих окна}many{Заблокировано # всплывающих окон}other{Заблокировано # всплывающ. окна}}</translation> <translation id="4780321648949301421">Сохранить страницу как...</translation> <translation id="4785719467058219317">Вы используете электронный ключ, который не зарегистрирован на этом сайте.</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Скрыть аккаунты</translation> <translation id="4801512016965057443">Разрешить мобильный интернет-роуминг</translation> <translation id="4804818685124855865">Отключиться</translation> +<translation id="4804827417948292437">Авокадо</translation> <translation id="4807098396393229769">Имя владельца</translation> <translation id="4808667324955055115">Всплывающие окна заблокированы</translation> <translation id="480990236307250886">Перейти на главную страницу</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Воспользуйтесь этой заявкой при регистрации устройства в домене предприятия:</translation> <translation id="4941627891654116707">Размер шрифта</translation> <translation id="494286511941020793">Справка по конфигурации прокси-сервера</translation> +<translation id="4943368462779413526">Футбол</translation> <translation id="4943691134276646401">Расширение "<ph name="CHROME_EXTENSION_NAME" />" запрашивает разрешение подключиться к последовательному порту</translation> <translation id="495170559598752135">Действия</translation> <translation id="4953689047182316270">Использование специальных возможностей</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Всегда</translation> <translation id="5067867186035333991">Запрашивать разрешение на доступ к микрофону для сайта <ph name="HOST" /></translation> <translation id="5068918910148307423">Не разрешать недавно закрытым сайтам завершать отправку и получение данных</translation> +<translation id="5068919226082848014">Пицца</translation> <translation id="5072052264945641674">Настроить размер указателя</translation> <translation id="5072836811783999860">Показать управляемые закладки</translation> <translation id="5074318175948309511">Чтобы настройки вступили в силу, необходимо перезагрузить страницу.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Отслеживание режима работы других расширений, в том числе посещаемых URL</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Недостаточно места на диске. Выберите другой каталог или освободите место на диске.</translation> +<translation id="5123433949759960244">Баскетбол</translation> <translation id="5125751979347152379">Недопустимый URL.</translation> <translation id="5127805178023152808">Синхронизация выключена</translation> <translation id="5127881134400491887">Управление сетевыми подключениями</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Импорт паролей в Chrome</translation> <translation id="6169040057125497443">Проверьте микрофон.</translation> <translation id="6169666352732958425">Не удается транслировать рабочий стол</translation> +<translation id="6170470584681422115">Сэндвич</translation> <translation id="6171948306033499786">Приостановить печать</translation> <translation id="6173623053897475761">Введите PIN-код ещё раз</translation> <translation id="6175314957787328458">Идентификатор GUID домена Microsoft</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Выберите, через какое приложение отправить.</translation> <translation id="6871644448911473373">Ответчик OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Сервер отклонил введенный пароль.</translation> +<translation id="6876155724392614295">Велосипед</translation> <translation id="6878422606530379992">Использование датчиков разрешено</translation> <translation id="6880587130513028875">Показ изображений запрещен для этой страниц.</translation> <translation id="6883319974225028188">Не удалось сохранить конфигурацию устройства</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">О <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Проверьте статус устройства Chromebook</translation> <translation id="7773726648746946405">Хранение сеансов</translation> +<translation id="7774365994322694683">Птица</translation> <translation id="7776701556330691704">Образцы не найдены.</translation> <translation id="7781335840981796660">Все пользовательские аккаунты и локальные данные будут удалены.</translation> <translation id="7782102568078991263">Подсказок от Google больше нет</translation> @@ -4668,6 +4683,7 @@ <translation id="8386903983509584791">Поиск завершен</translation> <translation id="8389492867173948260">Разрешить расширению просмотр и изменение ваших данных на посещаемых сайтах</translation> <translation id="8390449457866780408">Сервер недоступен.</translation> +<translation id="8391218455464584335">Виниловая пластинка</translation> <translation id="8391712576156218334">Фоновое изображение недоступно. Повторите попытку позже.</translation> <translation id="8392234662362215700">Нажмите Ctrl + Shift + ПРОБЕЛ, чтобы переключить раскладку клавиатуры.</translation> <translation id="8392451568018454956">Меню параметров пользователя "<ph name="USER_EMAIL_ADDRESS" />"</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index dbab270..1f7ded9 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Prehľadať zariadenie, aplikácie, internet.</translation> <translation id="114721135501989771">Získajte inteligentné doplnky Googlu v Chrome</translation> <translation id="1149401351239820326">Mesiac vypršania platnosti</translation> +<translation id="1150565364351027703">Slnečné okuliare</translation> <translation id="1151917987301063366">Vždy povoliť webu <ph name="HOST" /> prístup k senzorom</translation> <translation id="1153356358378277386">Spárované zariadenia</translation> <translation id="1156488781945104845">Aktuálny čas</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Pomocník klávesových skratiek</translation> <translation id="2045969484888636535">Pokračovať v blokovaní súborov cookie</translation> <translation id="204622017488417136">Na vašom zariadení sa obnoví predchádzajúca nainštalovaná verzia prehliadača Chrome. Všetky používateľské účty a miestne údaje budú odstránené. Túto akciu nie je možné vrátiť späť.</translation> +<translation id="2046702855113914483">Rámen</translation> <translation id="2048182445208425546">Prístup k sieťovej premávke</translation> <translation id="2048653237708779538">Akcia nie je k dispozícii</translation> <translation id="2050339315714019657">Na výšku</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187">Bolo pridané zariadenie: <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP proxy</translation> <translation id="2468205691404969808">Používa súbory cookie na zapamätanie si vašich predvolieb, dokonca aj keď dané stránky nenavštívite</translation> +<translation id="2468402215065996499">Tamagoči</translation> <translation id="2469375675106140201">Prispôsobiť kontrolu pravopisu</translation> <translation id="247051149076336810">Webová adresa zdieľaného úložiska</translation> <translation id="2470702053775288986">Nepodporovaný typ rozšírenia bol zakázaný</translation> @@ -1130,6 +1133,7 @@ <translation id="2770465223704140727">Odstrániť zo zoznamu</translation> <translation id="2770690685823456775">Exportujte heslá do iného priečinka</translation> <translation id="2771268254788431918">Mobilné dáta boli aktivované</translation> +<translation id="2771816809568414714">Syr</translation> <translation id="2772936498786524345">Rafinovaný</translation> <translation id="2773288106548584039">Podpora starších prehliadačov</translation> <translation id="2773802008104670137">Tento typ súboru môže poškodiť váš počítač.</translation> @@ -1653,6 +1657,7 @@ <translation id="3616113530831147358">Zvuk</translation> <translation id="3616741288025931835">&Vymazať dáta prehliadania…</translation> <translation id="3617891479562106823">Pozadia nie sú k dispozícii. Skúste to znova neskôr.</translation> +<translation id="3619115746895587757">Kapučíno</translation> <translation id="3623574769078102674">Tento kontrolovaný používateľ bude spravovaný účtom <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Odomknúť zariadenie a prihlásiť sa do účtu Google</translation> <translation id="3625258641415618104">Snímky obrazovky sú zakázané</translation> @@ -2131,6 +2136,7 @@ <translation id="4359717112757026264">Mestá</translation> <translation id="4361142739114356624">Súkromný kľúč pre tento klientsky certifikát chýba alebo je neplatný</translation> <translation id="4363771538994847871">Nenašli sa žiadne ciele prenosu. Potrebujete pomoc?</translation> +<translation id="4364327530094270451">Dyňa</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> zdieľa okno.</translation> <translation id="4364830672918311045">Zobrazovať upozornenia</translation> <translation id="4365673000813822030">Synchronizácia prestala pracovať.</translation> @@ -2320,6 +2326,7 @@ <translation id="4690091457710545971"><Firmvér Intel Wi-Fi vygeneroval štyri súbory: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Prvé tri sú binárne súbory obsahujúce výpisy z registra, pri ktorých firmvér Intel určil, že neobsahujú žiadne osobné informácie ani informácie umožňujúce identifikáciu zariadení. Posledný súbor je trasovanie spustenia z firmvéru Intel. Boli v ňom odstránené všetky osobné informácie alebo informácie umožňujúce identifkáciu zariadení, ale je príliš veľký, aby sa tu dal zobraziť. Tieto súbory boli vygenerované v reakcii na nedávne problémy s Wi-Fi vo vašom zariadení a budú zdieľané so spoločnosťou Intel, ktorá problémy pomôže vyriešiť.></translation> <translation id="469230890969474295">Priečinok OEM</translation> <translation id="4692623383562244444">Vyhľadávače</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Konfiguráciu tlačiarne ovláda správca.</translation> <translation id="4694604912444486114">Opica</translation> <translation id="4697551882387947560">Pri ukončení relácie prehliadania</translation> @@ -2374,6 +2381,7 @@ <translation id="4776917500594043016">Heslo pre účet <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Obchod Play</translation> <translation id="4779083564647765204">Lupa</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Zablokované vyskakovacie okno}few{Zablokované # vyskakovacie okná}many{# pop-ups blocked}other{Zablokovaných # vyskakovacích okien}}</translation> <translation id="4780321648949301421">Uložiť stránku ako...</translation> <translation id="4785719467058219317">Používate bezpečnostný kľúč, ktorý nie je registrovaný s týmto webom</translation> @@ -2386,6 +2394,7 @@ <translation id="4801448226354548035">Skryť účty</translation> <translation id="4801512016965057443">Povoliť roaming pre mobilné dáta</translation> <translation id="4804818685124855865">Odpojiť</translation> +<translation id="4804827417948292437">Avokádo</translation> <translation id="4807098396393229769">Meno na karte</translation> <translation id="4808667324955055115">Boli zablokované kontextové okná:</translation> <translation id="480990236307250886">Otvoriť domovskú stránku</translation> @@ -2480,6 +2489,7 @@ <translation id="4941246025622441835">Pri zaraďovaní zariadenia do správy firmy použite nasledujúcu rekvizíciu zariadenia:</translation> <translation id="4941627891654116707">Veľkosť písma</translation> <translation id="494286511941020793">Pomocník konfigurácie servera proxy</translation> +<translation id="4943368462779413526">Futbal</translation> <translation id="4943691134276646401"><ph name="CHROME_EXTENSION_NAME" /> sa chce pripojiť k sériovému portu</translation> <translation id="495170559598752135">Akcie</translation> <translation id="4953689047182316270">Reagovať na udalosti dostupnosti</translation> @@ -2549,6 +2559,7 @@ <translation id="5067399438976153555">Vždy zapnuté</translation> <translation id="5067867186035333991">Opýtať sa, ak chcú stránky <ph name="HOST" /> pristupovať k mikrofónu</translation> <translation id="5068918910148307423">Nepovoliť nedávno zatvoreným stránkam dokončiť posielanie a prijímanie dát</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Zmeniť veľkosť kurzora</translation> <translation id="5072836811783999860">Zobraziť spravované záložky</translation> <translation id="5074318175948309511">Na to, aby toto nové nastavenie nadobudlo platnosť, budete možno musieť znova načítať túto stránku.</translation> @@ -2583,6 +2594,7 @@ <translation id="5117930984404104619">Sledovať správanie ďalších rozšírení vrátane navštívených webových adries</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Pevný disk je plný. Uložte inde alebo uvoľnite viac miesta na pevnom disku. </translation> +<translation id="5123433949759960244">Basketbal</translation> <translation id="5125751979347152379">Neplatná webová adresa.</translation> <translation id="5127805178023152808">Synchronizácia je vypnutá.</translation> <translation id="5127881134400491887">Spravovať sieťové pripojenia</translation> @@ -3266,6 +3278,7 @@ <translation id="6166185671393271715">Import hesiel do Chromu</translation> <translation id="6169040057125497443">Skontrolujte mikrofón.</translation> <translation id="6169666352732958425">Plochu sa nepodarilo prenášať.</translation> +<translation id="6170470584681422115">Sendvič</translation> <translation id="6171948306033499786">Pozastaviť tlač</translation> <translation id="6173623053897475761">Znova zadajte svoj PIN</translation> <translation id="6175314957787328458">Identifikátor GUID domény spoločnosti Microsoft</translation> @@ -3696,6 +3709,7 @@ <translation id="6870888490422746447">Vyberte aplikáciu, s ktorou chcete obsah zdieľať:</translation> <translation id="6871644448911473373">Odpovedajúce zariadenie OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Zadané heslo bolo zamietnuté serverom.</translation> +<translation id="6876155724392614295">Bicykel</translation> <translation id="6878422606530379992">Senzory sú povolené</translation> <translation id="6880587130513028875">Obrázky boli na tejto stránke zablokované.</translation> <translation id="6883319974225028188">Ojoj! Systém nedokázal uložiť konfiguráciu zariadenia.</translation> @@ -4262,6 +4276,7 @@ <translation id="7772127298218883077">Informácie o aplikácii <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Skontrolujte stav svojho Chromebooku</translation> <translation id="7773726648746946405">Ukladací priestor relácie</translation> +<translation id="7774365994322694683">Vták</translation> <translation id="7776701556330691704">Nenašli sa žiadne hlasy</translation> <translation id="7781335840981796660">Všetky používateľské účty a miestne údaje budú odstránené.</translation> <translation id="7782102568078991263">Žiadne ďalšie návrhy od spoločnosti Google</translation> @@ -4666,6 +4681,7 @@ <translation id="8386903983509584791">Vyhľadávanie bolo dokončené</translation> <translation id="8389492867173948260">Umožniť tomuto rozšíreniu čítať a meniť všetky dáta na navštevovaných weboch:</translation> <translation id="8390449457866780408">Server je nedostupný.</translation> +<translation id="8391218455464584335">Vinyl</translation> <translation id="8391712576156218334">Obrázok nie je k dispozícii. Skúste to znova neskôr.</translation> <translation id="8392234662362215700">Rozloženie klávesnice zmeníte stlačením klávesov Ctrl + Shift + medzerník.</translation> <translation id="8392451568018454956">Ponuka možností pre používateľa <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 0447af072..2ba1a45 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Iščite v napravi, aplikacijah in spletu.</translation> <translation id="114721135501989771">Prejmite Googlove pametne rešitve v Chromu</translation> <translation id="1149401351239820326">Mesec poteka</translation> +<translation id="1150565364351027703">Sončna očala</translation> <translation id="1151917987301063366">Spletnemu mestu <ph name="HOST" /> vedno dovoli dostop do tipal</translation> <translation id="1153356358378277386">Seznanjene naprave</translation> <translation id="1156488781945104845">Trenutna ura</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Pomočnik za bližnjične tipke</translation> <translation id="2045969484888636535">Še naprej blokiraj piškotke</translation> <translation id="204622017488417136">Naprava bo povrnjena na prej nameščeno različico Chroma. Vsi uporabniški računi in lokalni podatki bodo odstranjeni. Tega ni mogoče razveljaviti.</translation> +<translation id="2046702855113914483">Ramen</translation> <translation id="2048182445208425546">Dostop do vašega omrežnega prometa</translation> <translation id="2048653237708779538">Dejanje ni na voljo</translation> <translation id="2050339315714019657">Pokončno</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Dodano: <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Uporablja piškotke, da si zapomni vaše nastavitve, tudi če teh strani ne obiskujete</translation> +<translation id="2468402215065996499">Tamagoči</translation> <translation id="2469375675106140201">Prilagodi preverjanje črkovanja</translation> <translation id="247051149076336810">URL datotečnega sredstva v skupni rabi</translation> <translation id="2470702053775288986">Nepodprte razširitve onemogočene</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Odstrani s seznama</translation> <translation id="2770690685823456775">Izvozite gesla v drugo mapo</translation> <translation id="2771268254788431918">Prenos podatkov v mobilnem omrežju je aktiviran</translation> +<translation id="2771816809568414714">Sir</translation> <translation id="2772936498786524345">Neopazni</translation> <translation id="2773288106548584039">Podpora za starejše brskalnike</translation> <translation id="2773802008104670137">Ta vrsta datoteke lahko poškoduje vaš računalnik.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Zvok</translation> <translation id="3616741288025931835">&Izbriši podatke brskanja ...</translation> <translation id="3617891479562106823">Ozadja niso na voljo. Poskusite znova pozneje.</translation> +<translation id="3619115746895587757">Kapučino</translation> <translation id="3623574769078102674">Tega zaščitenega uporabnika bo upravljal <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Odklepanje naprave in prijava v Google Račun</translation> <translation id="3625258641415618104">Posnetki zaslona so onemogočeni</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Urbana pokrajina</translation> <translation id="4361142739114356624">Zasebni ključ za to potrdilo odjemalca manjka ali je neveljaven</translation> <translation id="4363771538994847871">Ni ciljev za predvajanje. Potrebujete pomoč?</translation> +<translation id="4364327530094270451">Melona</translation> <translation id="4364567974334641491">Aplikacija <ph name="APP_NAME" /> je v skupno rabo dala okno.</translation> <translation id="4364830672918311045">Prikaz obvestil</translation> <translation id="4365673000813822030">Ojej, Google Sinhronizacija je nehala delovati.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Štiri datoteke, ki jih generira Intelova vdelana programska oprema za Wi-Fi: csr.lst, fh_regs.lst, radio_reg.lst in monitor.lst.sysmon. Prve tri so dvojiške datoteke, ki vsebujejo izvoze registra in Intel zanje zagotavlja, da ne vsebujejo osebnih podatkov ali podatkov, ki bi omogočali prepoznavo naprave. Zadnja datoteka je sled izvajanja iz Intelove vdelane programske opreme; očiščena je vseh osebnih podatkov ali podatkov, ki bi omogočali prepoznavo naprave, vendar je prevelika, da bi jo bilo mogoče prikazati tukaj. Te datoteke so bile generirane kot odziv na nedavne težave z Wi-Fi-jem v vaši napravi in bodo posredovane Intelu za pomoč pri odpravljanju teh težav.></translation> <translation id="469230890969474295">Mapa OEM</translation> <translation id="4692623383562244444">Iskalniki</translation> +<translation id="4693155481716051732">Suši</translation> <translation id="4694024090038830733">Konfiguracijo tiskalnikov upravlja skrbnik.</translation> <translation id="4694604912444486114">Opica</translation> <translation id="4697551882387947560">Ko se seja brskanja konča</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Geslo za <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Trgovina Play</translation> <translation id="4779083564647765204">Povečaj</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pojavno okno je blokirano}one{# pojavno okno je blokirano}two{# pojavni okni sta blokirani}few{# pojavna okna so blokirana}other{# pojavnih oken je blokiranih}}</translation> <translation id="4780321648949301421">Shrani stran &kot ...</translation> <translation id="4785719467058219317">Varnostni ključ, ki ga uporabljate, ni registriran na tem spletnem mestu</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Skrij račune</translation> <translation id="4801512016965057443">Dovoli mobilno podatkovno gostovanje</translation> <translation id="4804818685124855865">Prekini povezavo</translation> +<translation id="4804827417948292437">Avokado</translation> <translation id="4807098396393229769">Ime na kartici</translation> <translation id="4808667324955055115">Blokirana so pojavna okna:</translation> <translation id="480990236307250886">Odpri domačo stran</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Uporaba te zahteva za napravo pri včlanjevanju naprave za upravljanje v velikih poslovnih okoljih:</translation> <translation id="4941627891654116707">Velikost pisave</translation> <translation id="494286511941020793">Pomoč pri nastavitvi strežnika proxy</translation> +<translation id="4943368462779413526">Žoga</translation> <translation id="4943691134276646401">»<ph name="CHROME_EXTENSION_NAME" />« se želi povezati z zaporednimi vrati</translation> <translation id="495170559598752135">Dejanja</translation> <translation id="4953689047182316270">Odzivanje na dogodke funkcij za ljudi s posebnimi potrebami</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Vedno vklopljeno</translation> <translation id="5067867186035333991">Vprašaj, ali <ph name="HOST" /> zahteva dostop do mikrofona</translation> <translation id="5068918910148307423">Nedavno zaprtim spletnim mestom ne dovoli dokončanje pošiljanja in prejemanja podatkov</translation> +<translation id="5068919226082848014">Pica</translation> <translation id="5072052264945641674">Prilagoditev velikosti kazalca</translation> <translation id="5072836811783999860">Prikaz upravljanih zaznamkov</translation> <translation id="5074318175948309511">Nove nastavitve bodo morda začele veljati, šele ko znova naložite to stran.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Spremljanje obnašanja drugih razširitev, vključno z obiskanimi URL-ji</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Trdi disk je poln. Shranite na drugo mesto ali sprostite prostor na trdem disku.</translation> +<translation id="5123433949759960244">Košarkarska žoga</translation> <translation id="5125751979347152379">Neveljaven spletni naslov.</translation> <translation id="5127805178023152808">Sinhroniziranje je izklopljeno</translation> <translation id="5127881134400491887">Upravljanje omrežnih povezav</translation> @@ -3270,6 +3282,7 @@ <translation id="6166185671393271715">Uvoz gesel v Chrome</translation> <translation id="6169040057125497443">Preverite mikrofon.</translation> <translation id="6169666352732958425">Namizja ni mogoče predvajati.</translation> +<translation id="6170470584681422115">Sendvič</translation> <translation id="6171948306033499786">Zaustavi tiskanje</translation> <translation id="6173623053897475761">Znova vnesite kodo PIN</translation> <translation id="6175314957787328458">GUID Microsoftove domene</translation> @@ -3700,6 +3713,7 @@ <translation id="6870888490422746447">Izberite aplikacijo, s katero želite deliti:</translation> <translation id="6871644448911473373">Odzivnik OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Vneseno geslo je zavrnil strežnik.</translation> +<translation id="6876155724392614295">Kolo</translation> <translation id="6878422606530379992">Tipala so dovoljena</translation> <translation id="6880587130513028875">Slike na tej strani so blokirane.</translation> <translation id="6883319974225028188">Ojoj. Sistemu ni uspelo shraniti konfiguracije naprave.</translation> @@ -4266,6 +4280,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> – vizitka</translation> <translation id="7772773261844472235">Preverjanje stanja Chromebooka</translation> <translation id="7773726648746946405">Shramba seje</translation> +<translation id="7774365994322694683">Ptica</translation> <translation id="7776701556330691704">Najden ni bil noben glas</translation> <translation id="7781335840981796660">Odstranjeni bodo vsi uporabniški računi in lokalni podatki.</translation> <translation id="7782102568078991263">Nič več Googlovih predlogov</translation> @@ -4671,6 +4686,7 @@ <translation id="8386903983509584791">Iskanje je končano</translation> <translation id="8389492867173948260">Omogočite to razširitev za branje in spreminjanje vseh podatkov na spletnih mestih, ki jih obiščete:</translation> <translation id="8390449457866780408">Strežnik ni na voljo.</translation> +<translation id="8391218455464584335">Vinilna plošča</translation> <translation id="8391712576156218334">Slika ni na voljo. Poskusite znova pozneje.</translation> <translation id="8392234662362215700">Pritisnite Control + Shift + preslednico, če želite preklopiti razporeditev tipkovnice.</translation> <translation id="8392451568018454956">Meni z možnostmi za <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index aa263ccc..433b3e4 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Претражите уређај, апликације и веб.</translation> <translation id="114721135501989771">Паметне Google функције</translation> <translation id="1149401351239820326">Месец истека</translation> +<translation id="1150565364351027703">Наочари за сунце</translation> <translation id="1151917987301063366">Увек дозволи да <ph name="HOST" /> приступа сензорима</translation> <translation id="1153356358378277386">Упарени уређаји</translation> <translation id="1156488781945104845">Тренутно време</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">Помоћник за тастерске пречице</translation> <translation id="2045969484888636535">Настави са блокирањем колачића</translation> <translation id="204622017488417136">Уређај ће бити враћен на претходно инсталирану верзију Chrome-а. Сви кориснички налози и локални подаци ће бити уклоњени. Ова радња не може да се опозове.</translation> +<translation id="2046702855113914483">Рамен</translation> <translation id="2048182445208425546">Приступ мрежном саобраћају</translation> <translation id="2048653237708779538">Радња није доступна</translation> <translation id="2050339315714019657">Вертикално</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187">Додато је: <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP прокси</translation> <translation id="2468205691404969808">Користи колачиће да би се запамтила подешавања, чак и када не посећујете те странице</translation> +<translation id="2468402215065996499">Тамагочи</translation> <translation id="2469375675106140201">Прилагодите проверу правописа</translation> <translation id="247051149076336810">URL за дељење датотека</translation> <translation id="2470702053775288986">Неподржани додаци су онемогућени</translation> @@ -1128,6 +1131,7 @@ <translation id="2770465223704140727">Уклони са листе</translation> <translation id="2770690685823456775">Извезите лозинке у други директоријум</translation> <translation id="2771268254788431918">Мобилни подаци су активирани</translation> +<translation id="2771816809568414714">Сир</translation> <translation id="2772936498786524345">Нинџа</translation> <translation id="2773288106548584039">Подршка за застареле прегледаче</translation> <translation id="2773802008104670137">Ова врста датотеке може да нашкоди рачунару.</translation> @@ -1651,6 +1655,7 @@ <translation id="3616113530831147358">Аудио</translation> <translation id="3616741288025931835">&Обриши податке прегледања...</translation> <translation id="3617891479562106823">Позадине нису доступне. Пробајте поново касније.</translation> +<translation id="3619115746895587757">Капучино</translation> <translation id="3623574769078102674">Овим корисником под надзором ће управљати <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Откључајте уређај и пријавите се на Google налог</translation> <translation id="3625258641415618104">Снимци екрана су онемогућени</translation> @@ -2129,6 +2134,7 @@ <translation id="4359717112757026264">Градски пејзажи</translation> <translation id="4361142739114356624">Приватни кључ за овај сертификат клијента недостаје или је неважећи</translation> <translation id="4363771538994847871">Нема пронађених одредишта за пребацивање. Да ли вам треба помоћ?</translation> +<translation id="4364327530094270451">Диња</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> дели прозор.</translation> <translation id="4364830672918311045">Приказуј обавештења</translation> <translation id="4365673000813822030">Упс, синхронизација је престала да функционише.</translation> @@ -2318,6 +2324,7 @@ <translation id="4690091457710545971"><Четири датотеке које је генерисао Intel фирмвер за Wi-Fi: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Прве три датотеке су бинарне датотеке које садрже исписе регистара и Intel потврђује да не садрже личне податке нити податке који могу да идентификују уређај. Последња датотека је траг извршења Intel фирмвера; из ње су уклоњени било какви лични подаци или подаци који могу да идентификују уређај, али је превелика да бисмо је овде приказали. Ове датотеке су генерисане као одговор на недавне проблеме са Wi-Fi-јем на уређају и делићемо их са Intel-ом да бисмо решили те проблеме.></translation> <translation id="469230890969474295">Директоријум Произвођач оригиналне опреме</translation> <translation id="4692623383562244444">Претраживачи</translation> +<translation id="4693155481716051732">Суши</translation> <translation id="4694024090038830733">Конфигурацијом штампача управља администратор.</translation> <translation id="4694604912444486114">Мајмун</translation> <translation id="4697551882387947560">Када се заврши сесија прегледања</translation> @@ -2372,6 +2379,7 @@ <translation id="4776917500594043016">Лозинка за <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play продавница</translation> <translation id="4779083564647765204">Зумирање</translation> +<translation id="4779136857077979611">Онигири</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Искачући прозор је блокиран}one{# искачући прозор је блокиран}few{# искачућа прозора су блокирана}other{# искачућих прозора је блокирано}}</translation> <translation id="4780321648949301421">Сачувај страницу као...</translation> <translation id="4785719467058219317">Користите безбедносни кључ који није регистрован за овај веб-сајт</translation> @@ -2384,6 +2392,7 @@ <translation id="4801448226354548035">Сакриј налоге</translation> <translation id="4801512016965057443">Дозволи роминг за податке са мобилног уређаја</translation> <translation id="4804818685124855865">Прекини везу</translation> +<translation id="4804827417948292437">Авокадо</translation> <translation id="4807098396393229769">Име и презиме на картици</translation> <translation id="4808667324955055115">Искачући прозори су блокирани:</translation> <translation id="480990236307250886">Отвори почетну страницу</translation> @@ -2478,6 +2487,7 @@ <translation id="4941246025622441835">Користи овај захтев за уређај при регистрацији уређаја за управљање предузећем:</translation> <translation id="4941627891654116707">Величина фонта</translation> <translation id="494286511941020793">Помоћ за конфигурацију проксија</translation> +<translation id="4943368462779413526">Фудбалска лопта</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />“ жели да се повеже са серијским портом</translation> <translation id="495170559598752135">Радње</translation> <translation id="4953689047182316270">одговара на догађаје приступачности</translation> @@ -2547,6 +2557,7 @@ <translation id="5067399438976153555">Увек укључено</translation> <translation id="5067867186035333991">Питај ме ако <ph name="HOST" /> жели да приступи микрофону</translation> <translation id="5068918910148307423">Не дозвољавај да недавно затворени сајтови заврше слање и примање података</translation> +<translation id="5068919226082848014">Пица</translation> <translation id="5072052264945641674">Прилагоди величину курсора</translation> <translation id="5072836811783999860">Прикажи управљане обележиваче</translation> <translation id="5074318175948309511">Можда треба поново да учитате ову страницу да би нова подешавања ступила на снагу.</translation> @@ -2581,6 +2592,7 @@ <translation id="5117930984404104619">Праћење понашања других додатака, укључујући посећене URL-ове</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Хард-диск је пун. Сачувајте на другу локацију или направите више простора на хард-диску.</translation> +<translation id="5123433949759960244">Кошаркашка лопта</translation> <translation id="5125751979347152379">Неважећа URL адреса.</translation> <translation id="5127805178023152808">Синхронизација је искључена</translation> <translation id="5127881134400491887">Управљање мрежним везама</translation> @@ -3266,6 +3278,7 @@ <translation id="6166185671393271715">Увезите лозинке у Chrome</translation> <translation id="6169040057125497443">Проверите микрофон.</translation> <translation id="6169666352732958425">Пребацивање радне површине није успело.</translation> +<translation id="6170470584681422115">Сендвич</translation> <translation id="6171948306033499786">Паузирај штампање</translation> <translation id="6173623053897475761">Поново унесите PIN</translation> <translation id="6175314957787328458">GUID Microsoft домена</translation> @@ -3696,6 +3709,7 @@ <translation id="6870888490422746447">Изаберите апликацију за дељење:</translation> <translation id="6871644448911473373">OCSP одзивник: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Сервер је одбио лозинку коју сте унели.</translation> +<translation id="6876155724392614295">Бицикл</translation> <translation id="6878422606530379992">Приступ сензорима је дозвољен</translation> <translation id="6880587130513028875">Слике су блокиране на овој страници.</translation> <translation id="6883319974225028188">Упс! Систем није успео да сачува конфигурацију уређаја.</translation> @@ -4262,6 +4276,7 @@ <translation id="7772127298218883077">О <ph name="PRODUCT_NAME" /> прегледачу</translation> <translation id="7772773261844472235">Проверите статус Chromebook-а</translation> <translation id="7773726648746946405">Меморијски простор сесије</translation> +<translation id="7774365994322694683">Птица</translation> <translation id="7776701556330691704">Није пронађен ниједан глас</translation> <translation id="7781335840981796660">Сви кориснички налози и локални подаци ће бити уклоњени.</translation> <translation id="7782102568078991263">Нема више предлога са Google-а</translation> @@ -4667,6 +4682,7 @@ <translation id="8386903983509584791">Скенирање је завршено</translation> <translation id="8389492867173948260">Дозволите да овај додатак чита и мења све податке на веб-сајтовима које посећујете:</translation> <translation id="8390449457866780408">Сервер је недоступан.</translation> +<translation id="8391218455464584335">Грамофонска плоча</translation> <translation id="8391712576156218334">Слика је недоступна. Пробајте поново касније.</translation> <translation id="8392234662362215700">Притисните тастере Control-Shift-Space да бисте променили распоред тастатуре.</translation> <translation id="8392451568018454956">Мени са опцијама за <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index bf8c890f..3d1b0bc 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Sök på enheten, i appar och på webben.</translation> <translation id="114721135501989771">Få Google-teknik i Chrome</translation> <translation id="1149401351239820326">Utgångsmånad</translation> +<translation id="1150565364351027703">Solglasögon</translation> <translation id="1151917987301063366">Låt alltid <ph name="HOST" /> använda enhetens sensorer</translation> <translation id="1153356358378277386">Kopplade enheter</translation> <translation id="1156488781945104845">Aktuell tid</translation> @@ -660,6 +661,7 @@ <translation id="2045117674524495717">Hjälp med kortkommandon</translation> <translation id="2045969484888636535">Fortsätt att blockera cookies</translation> <translation id="204622017488417136">Enheten kommer att återgå till den tidigare installerade versionen av Chrome. Alla användarkonton och lokala uppgifter kommer att tas bort. Det går inte att ångra åtgärden.</translation> +<translation id="2046702855113914483">Ramen (nudelsoppa)</translation> <translation id="2048182445208425546">Åtkomst till din nätverkstrafik</translation> <translation id="2048653237708779538">Åtgärden är inte tillgänglig</translation> <translation id="2050339315714019657">Stående</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> har lagts till</translation> <translation id="2464089476039395325">HTTP-proxy</translation> <translation id="2468205691404969808">Kommer ihåg med hjälp av cookies vad du brukar välja även om du inte besöker sidorna i fråga</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Anpassa stavningskontrollen</translation> <translation id="247051149076336810">Webbadress för filresurs</translation> <translation id="2470702053775288986">Tillägg som inte stöds har inaktiverats</translation> @@ -1131,6 +1134,7 @@ <translation id="2770465223704140727">Ta bort från listan</translation> <translation id="2770690685823456775">Exportera lösenorden till en annan mapp</translation> <translation id="2771268254788431918">Mobildata har aktiverats</translation> +<translation id="2771816809568414714">Ost</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Stöd för äldre webbläsare</translation> <translation id="2773802008104670137">Den här filtypen kan skada din dator.</translation> @@ -1654,6 +1658,7 @@ <translation id="3616113530831147358">Ljud</translation> <translation id="3616741288025931835">&Rensa webbinformation...</translation> <translation id="3617891479562106823">Inga bakgrunder är tillgängliga. Försök igen senare.</translation> +<translation id="3619115746895587757">Cappuccino</translation> <translation id="3623574769078102674">Denna kontrollerade användare kommer att hanteras av <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Lås upp enheten och logga in på Google-kontot</translation> <translation id="3625258641415618104">Skärmdumpar har inaktiverats</translation> @@ -2132,6 +2137,7 @@ <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">Det här klientcertifikatets privata nyckel saknas eller är tom</translation> <translation id="4363771538994847871">Ingen Cast-destination hittades. Behöver du hjälp?</translation> +<translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> delar ett fönster.</translation> <translation id="4364830672918311045">Visa aviseringar</translation> <translation id="4365673000813822030">Oj, synkroniseringen har slutat fungera.</translation> @@ -2321,6 +2327,7 @@ <translation id="4690091457710545971"><Fyra filer som genererats av Intels Wi-Fi-firmware: csr.lst, fh_regs.lst, radio_reg.lst och monitor.lst.sysmon. De tre första är binärfiler med registerdumpar, och Intel intygar att de inte innehåller några personliga uppgifter eller uppgifter som kan identifiera en enhet. Den sista filen är en körningsspårning från Intels firmware. Alla personliga uppgifter eller uppgifter som kan identifiera en enhet har tagits bort från den, men filen är för stor att visa här. Filerna genererades på grund av problem med Wi-Fi på enheten nyligen och delas med Intel så att de kan hjälpa till med felsökningen.></translation> <translation id="469230890969474295">OEM-mapp</translation> <translation id="4692623383562244444">Sökmotorer</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Skrivarkonfigurationen hanteras av administratören.</translation> <translation id="4694604912444486114">Apa</translation> <translation id="4697551882387947560">När surfningen avslutas</translation> @@ -2375,6 +2382,7 @@ <translation id="4776917500594043016">Lösenord för <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Butik</translation> <translation id="4779083564647765204">Zooma in</translation> +<translation id="4779136857077979611">Onigiri (risbollar)</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Popup-fönster har blockerats}other{# popup-fönster har blockerats}}</translation> <translation id="4780321648949301421">Spara sida som...</translation> <translation id="4785719467058219317">Säkerhetsnyckeln som du använder är inte registrerad på den här webbplatsen</translation> @@ -2387,6 +2395,7 @@ <translation id="4801448226354548035">Dölj konton</translation> <translation id="4801512016965057443">Tillåt mobil dataroaming</translation> <translation id="4804818685124855865">Koppla från</translation> +<translation id="4804827417948292437">Avokado</translation> <translation id="4807098396393229769">Namn på kort</translation> <translation id="4808667324955055115">Popup-fönster har blockerats</translation> <translation id="480990236307250886">Öppna startsidan</translation> @@ -2481,6 +2490,7 @@ <translation id="4941246025622441835">Använd den här enhetsanmälan när enheten upptas för företagshantering:</translation> <translation id="4941627891654116707">Teckenstorlek</translation> <translation id="494286511941020793">Hjälp för proxykonfiguration</translation> +<translation id="4943368462779413526">Amerikansk fotboll</translation> <translation id="4943691134276646401"><ph name="CHROME_EXTENSION_NAME" /> vill ansluta till en serieport</translation> <translation id="495170559598752135">Åtgärder</translation> <translation id="4953689047182316270">Svara på tillgänglighetshändelser</translation> @@ -2550,6 +2560,7 @@ <translation id="5067399438976153555">Alltid på</translation> <translation id="5067867186035333991">Fråga om <ph name="HOST" /> vill använda din mikrofon</translation> <translation id="5068918910148307423">Tillåt inte att webbplatser som nyligen har stängts får slutföra överföringen av data som skickas och tas emot</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Ändra markörstorlek</translation> <translation id="5072836811783999860">Visa hanterade bokmärken</translation> <translation id="5074318175948309511">Den här sidan kan behöva läsas in igen innan den nya inställningen börjar gälla.</translation> @@ -2584,6 +2595,7 @@ <translation id="5117930984404104619">Bevaka hur övriga tillägg fungerar, däribland besökta webbadresser</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Hårddisken är full. Spara på en annan plats eller gör mer plats på hårddisken.</translation> +<translation id="5123433949759960244">Basketboll</translation> <translation id="5125751979347152379">Ogiltig webbadress.</translation> <translation id="5127805178023152808">Synkronisering är av</translation> <translation id="5127881134400491887">Hantera nätverksanslutningar</translation> @@ -3267,6 +3279,7 @@ <translation id="6166185671393271715">Importera lösenord till Chrome</translation> <translation id="6169040057125497443">Kontrollera mikrofonen.</translation> <translation id="6169666352732958425">Det gick inte att casta skrivbordet.</translation> +<translation id="6170470584681422115">Smörgås</translation> <translation id="6171948306033499786">Pausa utskriften</translation> <translation id="6173623053897475761">Skriv pinkoden en gång till</translation> <translation id="6175314957787328458">Grafiskt användargränssnitt för Microsoft-domänen</translation> @@ -3697,6 +3710,7 @@ <translation id="6870888490422746447">Välj en app som du vill dela till:</translation> <translation id="6871644448911473373">OCSP-svarare: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Det angivna lösenordet avvisades av servern.</translation> +<translation id="6876155724392614295">Cykel</translation> <translation id="6878422606530379992">Användning av sensorer har tillåtits</translation> <translation id="6880587130513028875">Bilder är blockerade på den här sidan.</translation> <translation id="6883319974225028188">Det gick inte att spara enhetskonfigurationen.</translation> @@ -4263,6 +4277,7 @@ <translation id="7772127298218883077">Om <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Kontrollera Chromebooks status</translation> <translation id="7773726648746946405">Sessionslagring</translation> +<translation id="7774365994322694683">Fågel</translation> <translation id="7776701556330691704">Inga röster hittades</translation> <translation id="7781335840981796660">Alla användarkonton och all lokal data tas bort.</translation> <translation id="7782102568078991263">Inga fler förslag från Google</translation> @@ -4668,6 +4683,7 @@ <translation id="8386903983509584791">Sökningen har slutförts</translation> <translation id="8389492867173948260">Tillåt det här tillägget att läsa och ändra all din data på webbplatser du besöker</translation> <translation id="8390449457866780408">Servern är inte tillgänglig.</translation> +<translation id="8391218455464584335">Vinylskiva</translation> <translation id="8391712576156218334">Bilden är inte tillgänglig. Försök igen senare.</translation> <translation id="8392234662362215700">Tryck på Ctrl + Skift + blanksteg om du vill byta tangentbordslayout.</translation> <translation id="8392451568018454956">Alternativmenyn för <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 2b01c958..2c958c1 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Tafuta kwenye wavuti, programu na kifaa chako.</translation> <translation id="114721135501989771">Pata Google mahiri kwenye Chrome</translation> <translation id="1149401351239820326">Mwezi wa kuisha kwa muda wa matumizi</translation> +<translation id="1150565364351027703">Miwani</translation> <translation id="1151917987301063366">Ruhusu <ph name="HOST" /> ifikie vitambuzi kila wakati</translation> <translation id="1153356358378277386">Vifaa vilivyooanishwa</translation> <translation id="1156488781945104845">Saa ya sasa</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">Kisaidizi cha Mikato ya Kibodi</translation> <translation id="2045969484888636535">Endelea kuzuia vidakuzi</translation> <translation id="204622017488417136">Kifaa chako kitarejeshwa kwenye toleo la awali lililosakinishwa la Chrome. Akaunti za watumiaji na data zote za karibu zitaondolewa. Hili haliwezi kutenduliwa.</translation> +<translation id="2046702855113914483">Rameni</translation> <translation id="2048182445208425546">Kufikia maelezo ya shughuli kwenye mtandao wako</translation> <translation id="2048653237708779538">Kitendo hakipatikani</translation> <translation id="2050339315714019657">Wima</translation> @@ -925,6 +927,7 @@ <translation id="2462752602710430187">Imeongeza <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Seva Mbadala ya HTTP</translation> <translation id="2468205691404969808">Hutumia vidakuzi kukumbuka mapendeleo yako, hata kama hutembelei kurasa hizo</translation> +<translation id="2468402215065996499">Tamagochi</translation> <translation id="2469375675106140201">Weka mapendeleo ya kikagua maendelezo</translation> <translation id="247051149076336810">URL ya faili ya kushiriki</translation> <translation id="2470702053775288986">Viendelezi visivyotumika vimezimwa</translation> @@ -1128,6 +1131,7 @@ <translation id="2770465223704140727">Ondoa kwenye orodha</translation> <translation id="2770690685823456775">Tuma manenosiri yako kwenye folda nyingine</translation> <translation id="2771268254788431918">Data ya mtandao wa simu imewashwa</translation> +<translation id="2771816809568414714">Jibini</translation> <translation id="2772936498786524345">Mjanja</translation> <translation id="2773288106548584039">Uwezo wa Kutumia Kivinjari Kilichopitwa na Wakati</translation> <translation id="2773802008104670137">Faili ya aina hii inaweza kudhuru kompyuta yako.</translation> @@ -1648,6 +1652,7 @@ <translation id="3616113530831147358">Sauti</translation> <translation id="3616741288025931835">&Futa Data ya Kuvinjari</translation> <translation id="3617891479562106823">Mandhari hayapatikani. Jaribu tena baadaye.</translation> +<translation id="3619115746895587757">Kapuchino</translation> <translation id="3623574769078102674">Mtumiaji huyu anayesimamiwa atadhibitiwa na <ph name="MANAGER_EMAIL" /> .</translation> <translation id="3624567683873126087">Fungua kifaa na uingie katika Akaunti ya Google</translation> <translation id="3625258641415618104">Picha za skrini zimezimwa</translation> @@ -2124,6 +2129,7 @@ <translation id="4359717112757026264">Mandhari ya jiji</translation> <translation id="4361142739114356624">Ufunguo wa Faragha wa Cheti hiki cha Seva Teja haupo au si sahihi</translation> <translation id="4363771538994847871">Hakuna sehemu za Kutuma zilizopatikana. Unahitaji usaidizi?</translation> +<translation id="4364327530094270451">Tikiti</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> inashiriki dirisha.</translation> <translation id="4364830672918311045">Onyesha arifa</translation> <translation id="4365673000813822030">Lo, Usawazishaji umekatizwa.</translation> @@ -2313,6 +2319,7 @@ <translation id="4690091457710545971"><Faili nne zinazozalishwa na programu dhibiti ya Intel Wi-Fi: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Faili za kwanza tatu ni faili za mfumo wa jozi zilizo na data ya faili za sajili, na zimethibitishwa na Intel kuwa hazina maelezo yanayoweza kutambulisha mtu au kifaa. Faili ya mwisho ni faili ya utekelezaji kutoka programu dhibiti ya Intel; imeondolewa maelezo yoyote yanayoweza kutambulisha mtu au kifaa, lakini haiwezi kuonekana hapa kwa kuwa ni kubwa mno. Faili hizi zilizalishwa ili kusuluhisha matatizo ya hivi majuzi ya Wi-Fi ambayo yalikumba kifaa chako, na tutazishiriki na Intel ili kukusaidia utatue matatizo haya.></translation> <translation id="469230890969474295">Folda ya OEM</translation> <translation id="4692623383562244444">Mitambo ya kutafuta</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Mipangilio ya printa inashughulikiwa na msimamizi.</translation> <translation id="4694604912444486114">Tumbili</translation> <translation id="4697551882387947560">Wakati kipindi cha kuvinjari kinakamilika</translation> @@ -2367,6 +2374,7 @@ <translation id="4776917500594043016">Nenosiri la <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Duka la Google Play</translation> <translation id="4779083564647765204">Kuza</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Imezuia dirisha ibukizi}other{Imezuia madirisha # ibukizi}}</translation> <translation id="4780321648949301421">Hifadhi Ukurasa Kama...</translation> <translation id="4785719467058219317">Unatumia ufunguo wa usalama ambao haujasajiliwa kwenye tovuti hii</translation> @@ -2379,6 +2387,7 @@ <translation id="4801448226354548035">Ficha akaunti</translation> <translation id="4801512016965057443">Ruhusu matumizi ya data nje ya mtandao wa kawaida</translation> <translation id="4804818685124855865">Tenganisha</translation> +<translation id="4804827417948292437">Parachichi</translation> <translation id="4807098396393229769">Jina kwenye kadi</translation> <translation id="4808667324955055115">Umezuia madirisha ibukizi:</translation> <translation id="480990236307250886">Fungua ukurasa wa kwanza</translation> @@ -2473,6 +2482,7 @@ <translation id="4941246025622441835">Tumia shurutisho la kifaa hiki unapoandikisha kifaa kwa usimamizi wa biashara:</translation> <translation id="4941627891654116707">Ukubwa wa fonti</translation> <translation id="494286511941020793">Msaada wa Usanidi wa Proksi</translation> +<translation id="4943368462779413526">Kandanda</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" inataka kuunganisha kwenye mlango wa kuwekea vifaa</translation> <translation id="495170559598752135">Vitendo</translation> <translation id="4953689047182316270">Kushughulikia Matukio ya Zana za Walio na Matatizo ya Kuona au Kusikia</translation> @@ -2542,6 +2552,7 @@ <translation id="5067399438976153555">Kuwaka wakati wowote</translation> <translation id="5067867186035333991">Uliza kama <ph name="HOST" /> inataka kufikia maikrofoni yako</translation> <translation id="5068918910148307423">Usiruhusu tovuti zilizofungwa hivi punde zimalize kutuma na kupokea data</translation> +<translation id="5068919226082848014">Piza</translation> <translation id="5072052264945641674">Rekebisha ukubwa wa kiteuzi</translation> <translation id="5072836811783999860">Onyesha alamisho zinazosimamiwa</translation> <translation id="5074318175948309511">Huenda ukurasa huu ukahitaji kupakiwa tena kabla mipangilio mipya ianze kutumika.</translation> @@ -2576,6 +2587,7 @@ <translation id="5117930984404104619">Ufuatiliaji wa tabia ya viendelezi vingine, pamoja na URL zilizotembelewa</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Diski yako kuu imejaa. Tafadhali hifadhi kwenye eneo jingine au utafute nafasi zaidi kwenye diski kuu.</translation> +<translation id="5123433949759960244">Mpira wa kikapu</translation> <translation id="5125751979347152379">URL hiyo si sahihi.</translation> <translation id="5127805178023152808">Usawazishaji umezimwa</translation> <translation id="5127881134400491887">Dhibiti miunganisho ya mtandao</translation> @@ -3259,6 +3271,7 @@ <translation id="6166185671393271715">Leta Manenosiri Kwenye Chrome</translation> <translation id="6169040057125497443">Tafadhali angalia maikrofoni yako.</translation> <translation id="6169666352732958425">Imeshindwa kutuma eneo-kazi.</translation> +<translation id="6170470584681422115">Sandiwichi</translation> <translation id="6171948306033499786">Sitisha kuchapisha</translation> <translation id="6173623053897475761">Weka PIN yako tena</translation> <translation id="6175314957787328458">GUID ya Vikoa kutoka Microsoft</translation> @@ -3689,6 +3702,7 @@ <translation id="6870888490422746447">Chagua programu ili kushiriki kwenye:</translation> <translation id="6871644448911473373">Kijibu OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Nenosiri uliloweka limekataliwa na seva.</translation> +<translation id="6876155724392614295">Baiskeli</translation> <translation id="6878422606530379992">Imeruhusu vitambuzi</translation> <translation id="6880587130513028875">Picha zimezuiwa kwenye ukurasa huu.</translation> <translation id="6883319974225028188">Lo! Mfumo umeshindwa kuhifadhi mipangilio ya kifaa.</translation> @@ -4255,6 +4269,7 @@ <translation id="7772127298218883077">Kuhusu <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Ikague hali ya Chromebook yako</translation> <translation id="7773726648746946405">Hifadhi ya kipindi</translation> +<translation id="7774365994322694683">Ndege</translation> <translation id="7776701556330691704">Haikupata sauti zozote</translation> <translation id="7781335840981796660">Akaunti zote za mtumiaji na data ya ndani itaondolewa.</translation> <translation id="7782102568078991263">Hakuna mapendekezo zaidi kutoka katika Google</translation> @@ -4663,6 +4678,7 @@ <translation id="8386903983509584791">Imemaliza kutafuta</translation> <translation id="8389492867173948260">Ruhusu kiendelezi hiki kisome na kubadilisha data yako yote iliyo kwenye tovuti unazotembelea:</translation> <translation id="8390449457866780408">Seva haipatikani.</translation> +<translation id="8391218455464584335">Ngozi ya plastiki</translation> <translation id="8391712576156218334">Picha haipatikani. Jaribu tena baadaye.</translation> <translation id="8392234662362215700">Gusa Control-Shift-Space ili ubadilishe muundo wa kibodi.</translation> <translation id="8392451568018454956">Menyu ya chaguo za <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index a53ce27..208d06c 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -101,6 +101,7 @@ <translation id="1145532888383813076">சாதனம், ஆப்ஸ், இணையம் ஆகியவற்றில் தேடவும்.</translation> <translation id="114721135501989771">Chromeமில் Google ஸ்மார்ட்களை பெறுக</translation> <translation id="1149401351239820326">காலாவதியாகும் மாதம்</translation> +<translation id="1150565364351027703">சன்கிளாசஸ்</translation> <translation id="1151917987301063366">சென்சார்களை அணுக, <ph name="HOST" />ஐ எப்போதும் அனுமதி</translation> <translation id="1153356358378277386">இணைத்த சாதனங்கள்</translation> <translation id="1156488781945104845">தற்போதைய நேரம்</translation> @@ -650,6 +651,7 @@ <translation id="2045117674524495717">கீபோர்ட் ஷார்ட்கட் உதவி</translation> <translation id="2045969484888636535">தொடர்ந்து குக்கீகளைத் தடுக்கவும்</translation> <translation id="204622017488417136">ஏற்கனவே நிறுவப்பட்ட Chrome இன் பதிப்பிற்கு உங்கள் சாதனம் மாற்றியமைக்கப்படும். எல்லா பயனர் கணக்குகளும் அகத் தரவும் அகற்றப்படும். இதைச் செயல்தவிர்க்க முடியாது.</translation> +<translation id="2046702855113914483">ரேமன்</translation> <translation id="2048182445208425546">உங்கள் நெட்வொர்க் ட்ராஃபிக்கை அணுகலாம்</translation> <translation id="2048653237708779538">இச்செயலைச் செய்ய இயலாது</translation> <translation id="2050339315714019657">செங்குத்து நிலை</translation> @@ -913,6 +915,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> சேர்க்கப்பட்டது</translation> <translation id="2464089476039395325">HTTP ப்ராக்ஸி</translation> <translation id="2468205691404969808">அந்தப் பக்கங்களுக்குச் சென்றதில்லை என்றாலும், உங்கள் விருப்பத்தேர்வுகளை நினைவில்கொள்ள, குக்கீகளைப் பயன்படுத்தும்</translation> +<translation id="2468402215065996499">தாமகோட்சி</translation> <translation id="247051149076336810">கோப்புப் பகிர்வு URL</translation> <translation id="2470702053775288986">ஆதரிக்கப்படாத நீட்டிப்புகள் முடக்கப்பட்டன</translation> <translation id="2473195200299095979">இந்தப் பக்கத்தை மொழிபெயர்</translation> @@ -1112,6 +1115,7 @@ <translation id="2770465223704140727">பட்டியலிலிருந்து நீக்கு</translation> <translation id="2770690685823456775">மற்றொரு கோப்புறைக்குக் கடவுச்சொற்களை ஏற்றவும்</translation> <translation id="2771268254788431918">மொபைல் டேட்டா இயக்கப்பட்டது</translation> +<translation id="2771816809568414714">பாலாடைக் கட்டி</translation> <translation id="2772936498786524345">ஸ்னீக்கி</translation> <translation id="2773288106548584039">லெகஸி உலாவி ஆதரவு</translation> <translation id="2773802008104670137">இது போன்ற கோப்புகள் உங்கள் கணினிக்குத் தீங்குவிளைவிக்கக்கூடும்.</translation> @@ -1627,6 +1631,7 @@ <translation id="3616113530831147358">ஆடியோ</translation> <translation id="3616741288025931835">உலாவல் தரவை &சுத்தமாக்கு...</translation> <translation id="3617891479562106823">பின்னணிகள் கிடைக்கவில்லை. பின்னர் மீண்டும் முயலவும்.</translation> +<translation id="3619115746895587757">காப்பச்சினோ</translation> <translation id="3623574769078102674">இந்தக் மேற்பார்வையிடப்படும் பயனர் <ph name="MANAGER_EMAIL" /> ஆல் நிர்வகிக்கப்படுவார்.</translation> <translation id="3624567683873126087">ஃபோனைத் திறந்து, Google கணக்கில் உள்நுழை</translation> <translation id="3625258641415618104">ஸ்கிரீன்ஷாட்கள் முடக்கப்பட்டன</translation> @@ -2091,6 +2096,7 @@ <translation id="4359717112757026264">நகரக் காட்சி</translation> <translation id="4361142739114356624">இந்தக் கிளையண்ட் சான்றிதழுக்கான தனிப்பட்ட குறியீடு இல்லை அல்லது தவறானது</translation> <translation id="4363771538994847871">எங்கே அலைபரப்புவது என்று கண்டறிய முடியவில்லை. உதவி வேண்டுமா?</translation> +<translation id="4364327530094270451">முலாம்பழம்</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> சாளரத்தைப் பகிர்கிறது.</translation> <translation id="4364830672918311045">அறிவிப்புகளைக் காட்டலாம்</translation> <translation id="4365673000813822030">அச்சச்சோ, ஒத்திசைவு பணியை நிறுத்தியுள்ளது.</translation> @@ -2278,6 +2284,7 @@ <translation id="4690091457710545971"><Intel வைஃபை நிலைபொருள் உருவாக்கிய நான்கு கோப்புகள்: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. முதல் மூன்று கோப்புகளும் பதிவு டம்ப்களைக் கொண்டுள்ள பைனரிக் கோப்புகளாகும், அவற்றில் தனிப்பட்ட அல்லது சாதனத்தை அடையாளப்படுத்தும் தகவல்கள் எதுவும் இல்லை என்று Intel உறுதிப்படுத்தியுள்ளது. கடைசிக் கோப்பு, Intel நிலைபொருளைச் சேர்ந்த ஓர் இயக்கக் கண்காணிப்புக் கோப்பாகும்; அதிலிருந்து தனிப்பட்ட அல்லது சாதனத்தை அடையாளப்படுத்தும் தகவல்கள் அகற்றப்பட்டுள்ளன, ஆனால் கோப்பு மிகப் பெரிதாக இருப்பதால் அதை இங்கு காட்ட முடியாது. இந்தக் கோப்புகள் உங்கள் சாதனத்தில் சமீபத்தில் ஏற்பட்ட வைஃபை குறித்த சிக்கல்களுக்குப் பதிலளிக்கையில் உருவாக்கப்பட்டன, அவை இந்தச் சிக்கல்களைப் பிழையறிந்து திருத்துவதற்கு உதவ, Intelலுடன் பகிரப்படும்.></translation> <translation id="469230890969474295">OEM கோப்புறை</translation> <translation id="4692623383562244444">தேடல் இன்ஜின்கள்</translation> +<translation id="4693155481716051732">சூஷி</translation> <translation id="4694024090038830733">பிரிண்டர் உள்ளமைவை நிர்வாகி கையாளுகிறார்.</translation> <translation id="4694604912444486114">குரங்கு</translation> <translation id="4697551882387947560">உலாவல் அமர்வு முடியும்போது</translation> @@ -2331,6 +2338,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> க்கான கடவுச்சொல்</translation> <translation id="4777825441726637019">Play ஸ்டோர்</translation> <translation id="4779083564647765204">பெரிதாக்கு</translation> +<translation id="4779136857077979611">ஒனிஜிரி</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{பாப் அப் தடுக்கப்பட்டது}other{# பாப் அப்கள் தடுக்கப்பட்டன}}</translation> <translation id="4780321648949301421">பக்கத்தை இவ்வாறு சேமி...</translation> <translation id="4785719467058219317">இந்த இணையதளத்தில் பதிவுசெய்யப்படாத பாதுகாப்பு விசையைப் பயன்படுத்துகிறீர்கள்</translation> @@ -2343,6 +2351,7 @@ <translation id="4801448226354548035">கணக்குகளை மறை</translation> <translation id="4801512016965057443">மொபைல் டேட்டா ரோமிங்கை அனுமதி</translation> <translation id="4804818685124855865">தொடர்பைத் துண்டி</translation> +<translation id="4804827417948292437">அவகாடோ</translation> <translation id="4807098396393229769">அட்டையிலுள்ள பெயர் </translation> <translation id="4808667324955055115">பாப் அப்கள் தடுக்கப்பட்டுள்ளன</translation> <translation id="480990236307250886">முகப்புப் பக்கத்தைத் திற</translation> @@ -2437,6 +2446,7 @@ <translation id="4941246025622441835">நிறுவன மேலாண்மைக்காக சாதனத்தைச் சேர்க்கும்போது இந்தச் சாதனக் கோரிக்கையைப் பயன்படுத்தவும்:</translation> <translation id="4941627891654116707">எழுத்துரு அளவு</translation> <translation id="494286511941020793">பதிலி உள்ளமைவு உதவி</translation> +<translation id="4943368462779413526">கால்பந்து</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ஒரு சீரியல் போர்ட்டுடன் இணைக்க விரும்புகிறது</translation> <translation id="495170559598752135">செயல்கள்</translation> <translation id="4953689047182316270">அணுகல்தன்மை நிகழ்வுகளுக்குப் பதிலளித்தல்</translation> @@ -2505,6 +2515,7 @@ <translation id="5067399438976153555">எப்போதும் இயக்கு</translation> <translation id="5067867186035333991"><ph name="HOST" /> உங்கள் மைக்ரோஃபோனை அணுக விரும்புகிறதா எனக் கேட்கவும்</translation> <translation id="5068918910148307423">தரவை அனுப்புவதையும் பெறுவதையும் முடிக்க சமீபத்தில் மூடப்பட்ட தளங்களை அனுமதிக்காதே</translation> +<translation id="5068919226082848014">பீட்சா</translation> <translation id="5072052264945641674">கர்சரின் அளவை மாற்று</translation> <translation id="5072836811783999860">நிர்வகிக்கப்பட்ட புக்மார்க்குகளைக் காட்டு</translation> <translation id="5074318175948309511">புதிய அமைப்புகளைச் செயல்படுத்துவதற்கு முன், இந்தப் பக்கம் மீண்டும் ஏற்றப்பட வேண்டியிருக்கும்.</translation> @@ -2538,6 +2549,7 @@ <translation id="5117930984404104619">பார்வையிட்ட URLகள் உள்ளிட்ட பிற நீட்டிப்புகளின் செயல்பாட்டைக் கண்காணி</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">உங்கள் ஹார்டு டிஸ்க் நிரம்பியது. மற்றொரு இடத்தில் சேமிக்கவும் அல்லது ஹார்டு டிஸ்க்கில் கூடுதல் அறைகளை உருவாக்கவும்.</translation> +<translation id="5123433949759960244">கூடைப்பந்து</translation> <translation id="5125751979347152379">செல்லுபடியாகாத URL.</translation> <translation id="5127805178023152808">ஒத்திசைவு முடக்கத்தில்</translation> <translation id="5127881134400491887">நெட்வொர்க் இணைப்புகளை நிர்வகி</translation> @@ -3183,6 +3195,7 @@ <translation id="6122095009389448667">இந்தத் தளம், கிளிப்போர்டைப் பார்ப்பதைத் தொடர்ந்து தடைசெய்</translation> <translation id="6122875415561139701">எழுதுதல் செயல்பாடு இந்தச் சாதனத்தில் அனுமதிக்கப்படவில்லை: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">பின்வரும் நீட்டிப்புகள் இந்த நீட்டிப்பைச் சார்ந்தவை:</translation> +<translation id="6124698108608891449">இந்த இணையதளத்திற்குக் கூடுதல் அனுமதிகள் தேவை.</translation> <translation id="6125479973208104919"><ph name="DEVICE_TYPE" /> இல் உங்கள் கணக்கை மீண்டும் சேர்க்க வேண்டும்.</translation> <translation id="6129691635767514872">தேர்ந்தெடுத்த தரவு, Chrome மற்றும் ஒத்திசைக்கப்பட்ட சாதனங்களிலிருந்து அகற்றப்பட்டது. உங்கள் Google கணக்கு <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> எனும் தளத்தில் பிற Google சேவைகளிலிருந்து தேடல்கள், செயல்பாடு போன்ற உலாவல் வரலாறு தொடர்பான பிற தகவல்களைக் கொண்டிருக்கலாம்.</translation> <translation id="6129938384427316298">Netscape சான்றிதழ் கருத்துரை</translation> @@ -3212,6 +3225,7 @@ <translation id="6166185671393271715">Chromeக்குக் கடவுச்சொற்களை இறக்குதல்</translation> <translation id="6169040057125497443">உங்கள் மைக்ரோஃபோனைச் சரிபார்க்கவும்.</translation> <translation id="6169666352732958425">டெஸ்க்டாப்பை அலைபரப்ப முடியவில்லை.</translation> +<translation id="6170470584681422115">சாண்ட்விச்</translation> <translation id="6171948306033499786">அச்சிடுவதை இடைநிறுத்து</translation> <translation id="6173623053897475761">உங்கள் பின்னை மீண்டும் உள்ளிடவும்</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> @@ -3359,6 +3373,7 @@ <translation id="641081527798843608">சப்ஜெக்ட் மேட்ச்</translation> <translation id="6412931879992742813">புதிய மறைநிலைச் சாளரம்</translation> <translation id="6415900369006735853">உங்கள் ஃபோனைப் பயன்படுத்தி இணையத்துடன் இணைக்கலாம்</translation> +<translation id="6416743254476733475">உங்கள் கம்ப்யூட்டரில் அனுமதிக்கவும் அல்லது தடுக்கவும்.</translation> <translation id="6417265370957905582">Google அசிஸ்டண்ட்</translation> <translation id="6418160186546245112"><ph name="IDS_SHORT_PRODUCT_NAME" /> இன் நிறுவப்பட்ட முந்தைய பதிப்பிற்கு மாற்றியமைக்கிறது</translation> <translation id="6418481728190846787">எல்லா பயன்பாடுகளுக்குமான அணுகலை நிரந்தரமாக அகற்று</translation> @@ -3637,6 +3652,7 @@ <translation id="6870888490422746447">பகிர்வதற்கான இலக்குப் பயன்பாட்டைத் தேர்வுசெய்க:</translation> <translation id="6871644448911473373">OCSP பதிலளிப்பான்: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">சேவையகம் நீங்கள் உள்ளிட்ட கடவுச்சொல்லை நிராகரித்தது.</translation> +<translation id="6876155724392614295">பைக்</translation> <translation id="6878422606530379992">சென்சார்கள் அனுமதிக்கப்பட்டுள்ளன</translation> <translation id="6880587130513028875">இந்தப் பக்கத்தில், படங்கள் தடுக்கப்பட்டன.</translation> <translation id="6883319974225028188">அச்சச்சோ! சாதன உள்ளமைவைச் சேமிக்க முடியவில்லை.</translation> @@ -4180,6 +4196,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> ஐப் பற்றி</translation> <translation id="7772773261844472235">Chromebook நிலையைச் சரிபாருங்கள்</translation> <translation id="7773726648746946405">அமர்வு சேமிப்பகம்</translation> +<translation id="7774365994322694683">பறவை</translation> <translation id="7776701556330691704">குரல்கள் எதுவும் இல்லை</translation> <translation id="7781335840981796660">எல்லா பயனர்களின் கணக்குகளும், அகத் தரவும் அகற்றப்படும்.</translation> <translation id="7782102568078991263">Google இலிருந்து மேலும் பரிந்துரைகள் இல்லை</translation> @@ -4585,6 +4602,7 @@ <translation id="8386903983509584791">ஸ்கேன் செய்வது முடிந்தது</translation> <translation id="8389492867173948260">நீங்கள் பார்வையிடும் இணையதளங்களிலுள்ள அனைத்துத் தரவையும் படிக்க மற்றும் மாற்ற, இந்த நீட்டிப்புக்கு அனுமதி வழங்கவும்:</translation> <translation id="8390449457866780408">சேவையகம் கிடைக்கவில்லை.</translation> +<translation id="8391218455464584335">வினைல்</translation> <translation id="8391712576156218334">படம் இல்லை. பின்னர் மீண்டும் முயலவும்.</translation> <translation id="8392234662362215700">விசைப்பலகை தளவமைப்பை மாற்ற, கன்ட்ரோல்-ஷிஃப்ட்-ஸ்பேஸ் விசையை அழுத்தவும்.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> க்கான விருப்பத்தேர்வுகள் மெனு</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 35024f7..cd31f29 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">మీ పరికరం, యాప్లు మరియు వెబ్ను శోధించండి.</translation> <translation id="114721135501989771">Chromeలో Google స్మార్ట్లను పొందండి</translation> <translation id="1149401351239820326">గడువు ముగింపు నెల</translation> +<translation id="1150565364351027703">చలువ అద్దాలు</translation> <translation id="1151917987301063366">సెన్సార్లను యాక్సెస్ చేయడానికి ఎల్లవేళలా <ph name="HOST" />ని అనుమతించు</translation> <translation id="1153356358378277386">జత చేసిన పరికరాలు</translation> <translation id="1156488781945104845">ప్రస్తుత సమయం</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">కీబోర్డ్ షార్ట్కట్ సహాయం</translation> <translation id="2045969484888636535">కుకీలను నిరోధించడాన్ని కొనసాగించండి</translation> <translation id="204622017488417136">మీ పరికరం మునుపు ఇన్స్టాల్ చేసిన Chrome వెర్షన్కు తిరిగి మార్చబడింది. అన్ని వినియోగదారు ఖాతాలు మరియు స్థానిక డేటా తీసివేయబడుతుంది. దీన్ని రద్దు చేయడం సాధ్యపడదు.</translation> +<translation id="2046702855113914483">రామెన్</translation> <translation id="2048182445208425546">మీ నెట్వర్క్ ట్రాఫిక్ను యాక్సెస్ చేయండి</translation> <translation id="2048653237708779538">చర్య అందుబాటులో లేదు</translation> <translation id="2050339315714019657">పోర్ట్రెయిట్</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> జోడించబడింది</translation> <translation id="2464089476039395325">HTTP ప్రాక్సీ</translation> <translation id="2468205691404969808">మీ ప్రాధాన్యతలను గుర్తుంచుకోవడానికి కుక్కీలను ఉపయోగిస్తుంది, మీరు ఆ పేజీలను సందర్శించకపోయినా కూడా అది అమలవుతుంది</translation> +<translation id="2468402215065996499">టమగోచి</translation> <translation id="2469375675106140201">స్పెల్ చెక్ను అనుకూలీకరించు</translation> <translation id="247051149076336810">ఫైల్ షేర్ URL</translation> <translation id="2470702053775288986">మద్దతు లేని పొడిగింపులు నిలిపివేయబడ్డాయి</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">జాబితాను నుండి తొలగించు</translation> <translation id="2770690685823456775">మీ పాస్వర్డ్లను మరో ఫోల్డర్కు ఎగుమతి చేయండి</translation> <translation id="2771268254788431918">మొబైల్ డేటా యాక్టివేట్ అయ్యింది</translation> +<translation id="2771816809568414714">జున్ను</translation> <translation id="2772936498786524345">స్నీకీ</translation> <translation id="2773288106548584039">లెగసీ బ్రౌజర్ మద్దతు</translation> <translation id="2773802008104670137">ఈ రకమైన ఫైల్ మీ కంప్యూటర్కు హాని కలిగించవచ్చు.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">ఆడియో</translation> <translation id="3616741288025931835">బ్రౌజింగ్ డేటాను &క్లియర్ చేయి...</translation> <translation id="3617891479562106823">నేపథ్యాలు అందుబాటులో లేవు. తర్వాత మళ్లీ ప్రయత్నించండి.</translation> +<translation id="3619115746895587757">కాపుచినో</translation> <translation id="3623574769078102674">ఈ పర్యవేక్షించబడే వినియోగదారు <ph name="MANAGER_EMAIL" /> ద్వారా నిర్వహించబడతారు.</translation> <translation id="3624567683873126087">పరికరాన్ని అన్లాక్ చేసి, Google ఖాతాలోకి సైన్-ఇన్ చేయండి</translation> <translation id="3625258641415618104">స్క్రీన్షాట్లు నిలిపివేయబడ్డాయి</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">నగర చిత్రాలు</translation> <translation id="4361142739114356624">ఈ క్లయింట్ ప్రమాణపత్రం యొక్క ప్రైవేట్ కీ లేదు లేదా చెల్లదు</translation> <translation id="4363771538994847871">Cast గమ్యస్థానాలు ఏవీ కనుగొనబడలేదు. సహాయం కావాలా?</translation> +<translation id="4364327530094270451">ఖర్బూజాపండు</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> ఒక విండోను షేర్ చేస్తోంది.</translation> <translation id="4364830672918311045">నోటిఫికేషన్లను ప్రదర్శించడం</translation> <translation id="4365673000813822030">అయ్యో, సమకాలీకరణ పని చేయడం ఆగిపోయింది.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Intel Wi-Fi ఫర్మ్వేర్ రూపొందించిన నాలుగు ఫైల్లు: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. మొదటి మూడు బైనరీ ఫైల్లు, వీటిలో రిజిస్టర్ డంప్లు ఉంటాయి మరియు వ్యక్తిగత లేదా పరికర సమాచారం కలిగి ఉండకుండా వీటిని Intel అందిస్తోంది. చివరిది Intel ఫర్మ్వేర్ అందించే, అమలు స్థితిగతిని కనుగొనే ఫైల్; ఇందులో వ్యక్తిగత లేదా పరికర గుర్తింపు సమాచారం తీసివేయబడింది, కానీ ఇది చాలా పెద్దదిగా ఉన్న కారణంగా ఇక్కడ ప్రదర్శించడం సాధ్యం కాదు. మీ పరికరంలో ఉన్న ఇటీవల Wi-Fi సమస్యలకు ప్రతిస్పందనగా ఈ ఫైల్లు రూపొందించబడ్డాయి మరియు ఈ సమస్యలను పరిష్కరించడంలో సహాయపడటం కోసం ఇవి Intelతో షేర్ చేయబడతాయి.></translation> <translation id="469230890969474295">OEM ఫోల్డర్</translation> <translation id="4692623383562244444">శోధన ఇంజిన్లు</translation> +<translation id="4693155481716051732">సుషి</translation> <translation id="4694024090038830733">ప్రింటర్ కాన్ఫిగరేషన్ను నిర్వాహకుడు నిర్వహిస్తారు.</translation> <translation id="4694604912444486114">కోతి</translation> <translation id="4697551882387947560">బ్రౌజింగ్ సెషన్ ముగిసినప్పుడు</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> కోసం పాస్వర్డ్</translation> <translation id="4777825441726637019">Play స్టోర్</translation> <translation id="4779083564647765204">జూమ్ చేయి</translation> +<translation id="4779136857077979611">ఒనిగిరి</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{పాప్-అప్ బ్లాక్ చేయబడింది}other{# పాప్-అప్లు బ్లాక్ చేయబడ్డాయి}}</translation> <translation id="4780321648949301421">ఇలా పేజీని సేవ్ చేయి...</translation> <translation id="4785719467058219317">మీరు ఈ వెబ్సైట్తో నమోదు కాని సెక్యూరిటీ కీని ఉపయోగిస్తున్నారు</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">ఖాతాలను దాచు</translation> <translation id="4801512016965057443">మొబైల్ డేటా రోమింగ్ను అనుమతించు</translation> <translation id="4804818685124855865">డిస్కనెక్ట్ చెయ్యి</translation> +<translation id="4804827417948292437">వెన్నపండు</translation> <translation id="4807098396393229769">కార్డ్పై పేరు</translation> <translation id="4808667324955055115">పాప్-అప్లు బ్లాక్ చేయబడ్డాయి:</translation> <translation id="480990236307250886">హోమ్ పేజీని తెరువు</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">పరికరాన్ని వ్యాపార నిర్వహణ కోసం నమోదు చేసేటప్పుడు ఈ పరికర అభ్యర్థనను ఉపయోగించండి:</translation> <translation id="4941627891654116707">ఫాంట్ పరిమాణం</translation> <translation id="494286511941020793">ప్రాక్సీ కన్ఫిగరేషన్ సహాయం</translation> +<translation id="4943368462779413526">ఫుట్బాల్</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ఈ సీరియల్ పోర్ట్లలో ఒకదానితో కనెక్ట్ (అనుసంధానం) కావాలని కోరుకుంటుంది</translation> <translation id="495170559598752135">చర్యలు</translation> <translation id="4953689047182316270">యాక్సెస్ సామర్థ్యం ఉన్న ఈవెంట్లకు ప్రతిస్పందించండి</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">ఎల్లప్పుడూ ఆన్ చేయి</translation> <translation id="5067867186035333991"><ph name="HOST" /> మీ మైక్రోఫోన్ను యాక్సెస్ చేయాలనుకుంటే నాకు తెలియజేయి</translation> <translation id="5068918910148307423">డేటాను పంపడం మరియు స్వీకరించడం పూర్తి చేయడానికి ఇటీవల మూసివేసిన సైట్లను అనుమతించవద్దు</translation> +<translation id="5068919226082848014">పిజ్జా</translation> <translation id="5072052264945641674">కర్సర్ పరిమాణాన్ని సర్దుబాటు చేయి</translation> <translation id="5072836811783999860">నిర్వహించబడే బుక్మార్క్లను చూపు</translation> <translation id="5074318175948309511">కొత్త సెట్టింగ్లు ప్రభావంలోకి రావడానికి ముందు ఈ పేజీని మళ్లీ లోడ్ చేయాల్సి ఉండవచ్చు.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">సందర్శించిన URLలతో సహా ఇతర పొడిగింపుల యొక్క ప్రవర్తనను పర్యవేక్షించండి</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">మీ హార్డ్ డిస్క్ నిండింది. దయచేసి మరొక స్థానానికి సేవ్ చేయండి లేదా హార్డ్ డిస్క్లోని నిల్వను ఖాళీ చేయండి.</translation> +<translation id="5123433949759960244">బాస్కెట్బాల్</translation> <translation id="5125751979347152379">చెల్లని URL.</translation> <translation id="5127805178023152808">సమకాలీకరణ ఆఫ్లో ఉంది</translation> <translation id="5127881134400491887">నెట్వర్క్ కనెక్షన్లను నిర్వహించండి</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Chromeకి పాస్వర్డ్లను దిగుమతి చేయండి</translation> <translation id="6169040057125497443">దయచేసి మీ మైక్రోఫోన్ని తనిఖీ చేయండి.</translation> <translation id="6169666352732958425">డెస్క్టాప్ను ప్రసారం చేయడం సాధ్యపడలేదు.</translation> +<translation id="6170470584681422115">శాండ్విచ్</translation> <translation id="6171948306033499786">ముద్రణను పాజ్ చేయి</translation> <translation id="6173623053897475761">మీ పిన్ని మళ్లీ టైప్ చేయండి</translation> <translation id="6175314957787328458">Microsoft డొమైన్ GUID</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">దీనికి షేర్ చేసేందుకు యాప్ను ఎంచుకోండి:</translation> <translation id="6871644448911473373">OCSP ప్రతిస్పందనదారు: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">మీరు నమోదు చేసిన పాస్వర్డ్ను సర్వర్ తిరస్కరించింది.</translation> +<translation id="6876155724392614295">బైక్</translation> <translation id="6878422606530379992">సెన్సార్లు అనుమతించబడ్డాయి</translation> <translation id="6880587130513028875">ఈ పేజీపై చిత్రాలు నిరోధించబడ్డాయి.</translation> <translation id="6883319974225028188">అయ్యో! పరికర కాన్ఫిగరేషన్ను సేవ్ చేయడంలో సిస్టమ్ విఫలమైంది.</translation> @@ -3744,7 +3758,7 @@ <translation id="6951153907720526401">చెల్లింపు హ్యాండ్లర్లు</translation> <translation id="6953878494808481632">సంబంధిత సమాచారం</translation> <translation id="6955446738988643816">పాప్అప్ను పరిశీలించు</translation> -<translation id="6957044667612803194">ఈ సెక్యూరిటీ కీ పిన్లకు మద్దతు ఇవ్వడం లేదు</translation> +<translation id="6957044667612803194">ఈ సెక్యూరిటీ కీ, పిన్లకు మద్దతు ఇవ్వడం లేదు</translation> <translation id="6957231940976260713">సేవ పేరు</translation> <translation id="6964390816189577014">వీరుడు</translation> <translation id="6964760285928603117">గుంపు నుండి తీసివేయి</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> గురించి</translation> <translation id="7772773261844472235">మీ Chromebook స్థితిని తనిఖీ చేయండి</translation> <translation id="7773726648746946405">సెషన్ నిల్వ</translation> +<translation id="7774365994322694683">పక్షి</translation> <translation id="7776701556330691704">వాయిస్లు ఏవీ కనుగొనబడలేదు</translation> <translation id="7781335840981796660">అన్ని వినియోగదారు ఖాతాలు మరియు స్థానిక డేటా తీసివేయబడతాయి.</translation> <translation id="7782102568078991263">ఇక Google నుండి సూచనలు లేవు</translation> @@ -4666,6 +4681,7 @@ <translation id="8386903983509584791">స్కాన్ పూర్తయింది</translation> <translation id="8389492867173948260">మీరు సందర్శించే వెబ్సైట్లలో ఉన్న మీ డేటా మొత్తాన్ని చదవడం లేదా మార్చడం కోసం ఈ ఎక్స్టెన్షన్ను అనుమతించండి:</translation> <translation id="8390449457866780408">సర్వర్ అందుబాటులో లేదు.</translation> +<translation id="8391218455464584335">వినైల్</translation> <translation id="8391712576156218334">చిత్రం అందుబాటులో లేదు. తర్వాత మళ్లీ ప్రయత్నించండి.</translation> <translation id="8392234662362215700">కీబోర్డ్ లేఅవుట్ను మార్చడానికి Control-Shift-Space నొక్కండి.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> కోసం ఎంపికల మెను</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 89eda7b..cfb03b5 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">ค้นหาอุปกรณ์ แอป และเว็บ</translation> <translation id="114721135501989771">ใช้ฟีเจอร์เจ๋งๆ จาก Google ใน Chrome</translation> <translation id="1149401351239820326">เดือนที่หมดอายุ</translation> +<translation id="1150565364351027703">แว่นกันแดด</translation> <translation id="1151917987301063366">อนุญาตให้ <ph name="HOST" /> เข้าถึงเซ็นเซอร์เสมอ</translation> <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation> <translation id="1156488781945104845">เวลาปัจจุบัน</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">ตัวช่วยเหลือสำหรับแป้นพิมพ์ลัด</translation> <translation id="2045969484888636535">ปิดกั้นคุกกี้ต่อไป</translation> <translation id="204622017488417136">อุปกรณ์จะเปลี่ยนกลับเป็นเวอร์ชันก่อนหน้าของ Chrome ที่ติดตั้งไว้ บัญชีผู้ใช้ทั้งหมดและข้อมูลในเครื่องจะถูกนำออก โดยขั้นตอนนี้ไม่สามารถยกเลิกได้</translation> +<translation id="2046702855113914483">ราเม็ง</translation> <translation id="2048182445208425546">เข้าถึงปริมาณการใช้งานเครือข่าย</translation> <translation id="2048653237708779538">การดำเนินการไม่พร้อมให้ใช้งาน</translation> <translation id="2050339315714019657">แนวตั้ง</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">เพิ่ม <ph name="PRINTER_NAME" /> แล้ว</translation> <translation id="2464089476039395325">พร็อกซี HTTP</translation> <translation id="2468205691404969808">ใช้คุกกี้เพื่อให้จดจำค่ากำหนดของคุณ แม้ว่าคุณไม่ได้เข้าชมหน้าเว็บเหล่านั้น</translation> +<translation id="2468402215065996499">ทามาก็อตจิ</translation> <translation id="2469375675106140201">ปรับแต่งการตรวจตัวสะกด</translation> <translation id="247051149076336810">URL ของพื้นที่แชร์ไฟล์</translation> <translation id="2470702053775288986">ปิดใช้ส่วนขยายที่ไม่สนับสนุนแล้ว</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">ลบจากรายการ</translation> <translation id="2770690685823456775">ส่งออกรหัสผ่านไปยังโฟลเดอร์อื่น</translation> <translation id="2771268254788431918">เปิดใช้งานเน็ตมือถือแล้ว</translation> +<translation id="2771816809568414714">ชีส</translation> <translation id="2772936498786524345">สนีกกี้</translation> <translation id="2773288106548584039">การรองรับเบราว์เซอร์เวอร์ชันเก่า</translation> <translation id="2773802008104670137">ไฟล์ประเภทนี้อาจเป็นอันตรายต่อคอมพิวเตอร์</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">เสียง</translation> <translation id="3616741288025931835">&ล้างข้อมูลการท่องเว็บ...</translation> <translation id="3617891479562106823">พื้นหลังไม่พร้อมใช้งาน โปรดลองอีกครั้งภายหลัง</translation> +<translation id="3619115746895587757">คาปูชิโน</translation> <translation id="3623574769078102674">ผู้ใช้ภายใต้การดูแลนี้จะถูกจัดการโดย <ph name="MANAGER_EMAIL" /></translation> <translation id="3624567683873126087">ปลดล็อกอุปกรณ์และลงชื่อเข้าใช้บัญชี Google</translation> <translation id="3625258641415618104">ปิดใช้การจับภาพหน้าจอ</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">ทิวทัศน์ของเมือง</translation> <translation id="4361142739114356624">คีย์ส่วนตัวของใบรับรองไคลเอ็นต์นี้หายไปหรือไม่ถูกต้อง</translation> <translation id="4363771538994847871">ไม่พบปลายทางการแคสต์ ต้องการความช่วยเหลือไหม</translation> +<translation id="4364327530094270451">เมลอน</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> กำลังแชร์หน้าต่าง</translation> <translation id="4364830672918311045">แสดงการแจ้งเตือน</translation> <translation id="4365673000813822030">อ๊ะ การซิงค์หยุดทำงาน</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><มีไฟล์ 4 ไฟล์ที่สร้างขึ้นโดยเฟิร์มแวร์ Wi-Fi ของ Intel ได้แก่ csr.lst, fh_regs.lst, radio_reg.lst และ monitor.lst.sysmon โดย 3 ไฟล์แรกเป็นไฟล์ไบนารีที่มี Register Dump ซึ่งผ่านการยืนยันโดย Intel เพื่อไม่ให้รวมข้อมูลส่วนตัวหรือข้อมูลที่ระบุอุปกรณ์ ส่วนไฟล์สุดท้ายเป็นการติดตามการทำงานจากเฟิร์มแวร์ของ Intel โดยมีการลบข้อมูลส่วนตัวหรือข้อมูลที่ระบุอุปกรณ์ออกไปแล้ว แต่ไฟล์มีขนาดใหญ่เกินกว่าที่จะแสดงตรงนี้ได้ ไฟล์เหล่านี้สร้างขึ้นมาเพื่อตอบสนองต่อปัญหา Wi-Fi ล่าสุดในอุปกรณ์ของคุณและระบบจะแชร์ไฟล์กับ Intel เพื่อช่วยแก้ปัญหาเหล่านี้></translation> <translation id="469230890969474295">โฟลเดอร์ OEM</translation> <translation id="4692623383562244444">เครื่องมือค้นหา</translation> +<translation id="4693155481716051732">ซูชิ</translation> <translation id="4694024090038830733">ผู้ดูแลระบบเป็นผู้จัดการการกำหนดค่าเครื่องพิมพ์</translation> <translation id="4694604912444486114">ลิง</translation> <translation id="4697551882387947560">เมื่อเซสชันการเรียกดูสิ้นสุดลง</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">รหัสผ่านของ <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">ซูม</translation> +<translation id="4779136857077979611">ข้าวปั้น</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{ป๊อปอัปถูกบล็อก}other{# ป๊อปอัปถูกบล็อก}}</translation> <translation id="4780321648949301421">บันทึกหน้าเป็น...</translation> <translation id="4785719467058219317">คุณกำลังใช้คีย์ความปลอดภัยที่ไม่ได้ลงทะเบียนกับเว็บไซต์นี้</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">ซ่อนบัญชี</translation> <translation id="4801512016965057443">อนุญาตการโรมมิ่งข้อมูลมือถือ</translation> <translation id="4804818685124855865">ตัดการเชื่อมต่อ</translation> +<translation id="4804827417948292437">อะโวคาโด</translation> <translation id="4807098396393229769">ชื่อบนบัตร</translation> <translation id="4808667324955055115">บล็อกป๊อปอัปอยู่:</translation> <translation id="480990236307250886">เปิดหน้าแรก</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">ใช้ข้อกำหนดของอุปกรณ์นี้เมื่อลงทะเบียนอุปกรณ์สำหรับการจัดการองค์กร:</translation> <translation id="4941627891654116707">ขนาดแบบอักษร</translation> <translation id="494286511941020793">ความช่วยเหลือในการกำหนดค่าพร็อกซี</translation> +<translation id="4943368462779413526">ฟุตบอล</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ต้องการเชื่อมต่อกับพอร์ตอนุกรม</translation> <translation id="495170559598752135">การทำงาน</translation> <translation id="4953689047182316270">ตอบสนองต่อเหตุการณ์การเข้าถึงพิเศษ</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">เปิดเสมอ</translation> <translation id="5067867186035333991">ถามว่า <ph name="HOST" /> ต้องการเข้าถึงไมโครโฟนของคุณไหม</translation> <translation id="5068918910148307423">ไม่อนุญาตให้เว็บไซต์ที่ปิดล่าสุดดำเนินการส่งและรับข้อมูลต่อจนเสร็จ</translation> +<translation id="5068919226082848014">พิซซ่า</translation> <translation id="5072052264945641674">ปรับขนาดเคอร์เซอร์</translation> <translation id="5072836811783999860">แสดงบุ๊กมาร์กที่มีการจัดการ</translation> <translation id="5074318175948309511">อาจต้องโหลดหน้านี้ซ้ำก่อนที่การตั้งค่าใหม่จะมีผล</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">ตรวจสอบพฤติกรรมของส่วนขยายอื่นๆ รวมถึง URL ที่เข้าชม</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">ฮาร์ดดิสก์ของคุณเต็ม โปรดบันทึกลงในตำแหน่งอื่นหรือเพิ่มเนื้อที่ว่างในฮาร์ดดิสก์</translation> +<translation id="5123433949759960244">บาสเกตบอล</translation> <translation id="5125751979347152379">URL ไม่ถูกต้อง</translation> <translation id="5127805178023152808">การซิงค์ปิดอยู่</translation> <translation id="5127881134400491887">จัดการการเชื่อมต่อเครือข่าย</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">นำเข้ารหัสผ่านไปยัง Chrome</translation> <translation id="6169040057125497443">โปรดตรวจสอบไมโครโฟน</translation> <translation id="6169666352732958425">ไม่สามารถแคสต์เดสก์ท็อป</translation> +<translation id="6170470584681422115">แซนด์วิช</translation> <translation id="6171948306033499786">หยุดการพิมพ์ชั่วคราว</translation> <translation id="6173623053897475761">พิมพ์ PIN อีกครั้ง</translation> <translation id="6175314957787328458">โดเมน GUID ของ Microsoft</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">เลือกแอปเพื่อแชร์ไปยัง:</translation> <translation id="6871644448911473373">OCSP Responder: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">เซิร์ฟเวอร์ปฏิเสธรหัสผ่านที่คุณป้อน</translation> +<translation id="6876155724392614295">จักรยาน</translation> <translation id="6878422606530379992">อนุญาตให้ใช้เซ็นเซอร์</translation> <translation id="6880587130513028875">หน้าเว็บนี้บล็อกการแสดงภาพ</translation> <translation id="6883319974225028188">อ๊ะ! ระบบไม่สามารถบันทึกการกำหนดค่าอุปกรณ์</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">เกี่ยวกับ <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">ตรวจสอบสถานะ Chromebook</translation> <translation id="7773726648746946405">พื้นที่จัดเก็บเซสชัน</translation> +<translation id="7774365994322694683">นก</translation> <translation id="7776701556330691704">ไม่พบเสียง</translation> <translation id="7781335840981796660">บัญชีผู้ใช้ทั้งหมดและข้อมูลในเครื่องจะถูกลบ</translation> <translation id="7782102568078991263">ไม่มีคำแนะนำเพิ่มเติมจาก Google</translation> @@ -4669,6 +4684,7 @@ <translation id="8386903983509584791">สแกนเสร็จแล้ว</translation> <translation id="8389492867173948260">อนุญาตให้ส่วนขยายนี้อ่านและเปลี่ยนแปลงข้อมูลทั้งหมดในเว็บไซต์ที่คุณเข้าชม</translation> <translation id="8390449457866780408">เซิร์ฟเวอร์ไม่พร้อมใช้งาน</translation> +<translation id="8391218455464584335">แผ่นเสียง</translation> <translation id="8391712576156218334">รูปภาพไม่พร้อมใช้งาน โปรดลองอีกครั้งภายหลัง</translation> <translation id="8392234662362215700">กด Control-Shift-Space เพื่อสลับรูปแบบแป้นพิมพ์</translation> <translation id="8392451568018454956">เมนูตัวเลือกสำหรับ <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 3150243e..34edcd75b 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Cihazınızda, uygulamalarda, web'de arama yapın.</translation> <translation id="114721135501989771">Google zekası Chrome'da</translation> <translation id="1149401351239820326">Son kullanım tarihinin ayı</translation> +<translation id="1150565364351027703">Güneş Gözlüğü</translation> <translation id="1151917987301063366"><ph name="HOST" /> sitesinin sensörlere erişmesine her zaman izin ver</translation> <translation id="1153356358378277386">Eşlenen cihazlar</translation> <translation id="1156488781945104845">Şu anki saat:</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Klavye Kısayolu Yardımcısı</translation> <translation id="2045969484888636535">Çerezleri engellemeye devam et</translation> <translation id="204622017488417136">Cihazınız Chrome'un bundan önce yüklenmiş olan sürümüne geri dönecektir. Tüm kullanıcı hesapları ve yerel veriler silinecektir. Bu işlem geri alınamaz.</translation> +<translation id="2046702855113914483">Japon eriştesi</translation> <translation id="2048182445208425546">Ağ trafiğinize erişme</translation> <translation id="2048653237708779538">İşlem kullanılamıyor</translation> <translation id="2050339315714019657">Dikey</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> eklendi</translation> <translation id="2464089476039395325">HTTP Proxy'si</translation> <translation id="2468205691404969808">Belirtilen sayfaları ziyaret etmiyor olsanız bile tercihlerinizi hatırlamak için çerezler kullanır</translation> +<translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469375675106140201">Yazım denetimini özelleştir</translation> <translation id="247051149076336810">Dosya paylaşım URL'si</translation> <translation id="2470702053775288986">Desteklenmeyen uzantılar devre dışı bırakıldı</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Listeden kaldır</translation> <translation id="2770690685823456775">Şifrelerinizi başka bir klasöre dışa aktarın</translation> <translation id="2771268254788431918">Mobil veri etkinleştirildi</translation> +<translation id="2771816809568414714">Peynir</translation> <translation id="2772936498786524345">Ninja</translation> <translation id="2773288106548584039">Eski Tarayıcı Desteği</translation> <translation id="2773802008104670137">Bu dosya türü bilgisayarınıza zarar verebilir.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Ses</translation> <translation id="3616741288025931835">Tarama Verilerini &Temizle...</translation> <translation id="3617891479562106823">Arka planlar kullanılamıyor. Daha sonra tekrar deneyin.</translation> +<translation id="3619115746895587757">Kapuçino</translation> <translation id="3623574769078102674">Denetlenen bu kullanıcı <ph name="MANAGER_EMAIL" /> tarafından yönetilecek.</translation> <translation id="3624567683873126087">Cihazın kilidini aç ve Google Hesabı'nda oturum aç</translation> <translation id="3625258641415618104">Ekran görüntüleri devre dışı</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Şehir manzaraları</translation> <translation id="4361142739114356624">Bu İstemci Sertifikası'nın Özel Anahtarı eksik veya geçersiz</translation> <translation id="4363771538994847871">Hiç Yayınlama hedefi bulunamadı. Yardıma ihtiyacınız var mı?</translation> +<translation id="4364327530094270451">Kavun</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />, bir pencereyi paylaşıyor.</translation> <translation id="4364830672918311045">Bildirimleri görüntüleme</translation> <translation id="4365673000813822030">Hata, Senkronizasyonun çalışması durdu.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Intel Kablosuz donanım yazılımı tarafından dört dosya oluşturuldu: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. İlk üç dosya, kayıt dökümlerini içeren ikili dosyalardır ve Intel, bu dosyalarda kimlik veya cihaz bilgilerini tanımlayan bilgilerin yer almadığını teyit etmektedir. Son dosya, Intel donanım yazılımındaki bir yürütme izidir. Bu dosyadaki kimlik ve cihaz bilgileri temizlenmiştir, ancak dosya burada görüntülenemeyecek kadar büyüktür. Bu dosyalar, cihazınızla ilgili son kablosuz bağlantı sorunlarına yanıt olarak oluşturulmuştur ve bu sorunların giderilmesinde yardımcı olması için Intel ile paylaşılacaktır.></translation> <translation id="469230890969474295">OEM Klasörü</translation> <translation id="4692623383562244444">Arama motorları</translation> +<translation id="4693155481716051732">Suşi</translation> <translation id="4694024090038830733">Yazıcı yapılandırması yönetici tarafından gerçekleştirilir.</translation> <translation id="4694604912444486114">Maymun</translation> <translation id="4697551882387947560">Göz atma oturumu sona erdiğinde</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> için şifre</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4779083564647765204">Yakınlaştır</translation> +<translation id="4779136857077979611">Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Pop-up engellendi}other{# pop-up engellendi}}</translation> <translation id="4780321648949301421">Sayfayı Farklı Kaydet...</translation> <translation id="4785719467058219317">Bu web sitesine kaydettirilmemiş bir anahtar kullanıyorsunuz</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Hesapları gizle</translation> <translation id="4801512016965057443">Mobil veri dolaşımına izin ver</translation> <translation id="4804818685124855865">Bağlantıyı kes</translation> +<translation id="4804827417948292437">Avokado</translation> <translation id="4807098396393229769">Kartın üzerindeki ad</translation> <translation id="4808667324955055115">Engellenen pop-up'lar:</translation> <translation id="480990236307250886">Ana sayfayı aç</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Cihazın kurumsal yönetim için kaydını yaparken şu cihaz talebini kullan:</translation> <translation id="4941627891654116707">Yazı tipi boyutu</translation> <translation id="494286511941020793">Proxy Yapılandırması Yardımı</translation> +<translation id="4943368462779413526">Futbol</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" bir seri bağlantı noktasına bağlanmak istiyor</translation> <translation id="495170559598752135">İşlemler</translation> <translation id="4953689047182316270">Erişilebilirlikle İlgili Etkinliklere Yanıt Verme</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Her zaman açık</translation> <translation id="5067867186035333991"><ph name="HOST" /> sitesi mikrofonuma erişmek isterse sor</translation> <translation id="5068918910148307423">Yeni kapatılan sitelerin veri gönderme ve alma işlemini bitirmesine izin verme</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">İmleç boyutunu ayarla</translation> <translation id="5072836811783999860">Yönetilen yer işaretlerini göster</translation> <translation id="5074318175948309511">Yeni ayarların geçerli olması için bu sayfanın tekrar yüklenmesi gerekebilir.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Ziyaret edilen URL'ler de dahil olmak üzere diğer uzantıların davranışını izleme</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Sabit diskiniz dolu. Lütfen başka bir yere kaydedin veya sabit diskinizde yer açın.</translation> +<translation id="5123433949759960244">Basketbol</translation> <translation id="5125751979347152379">Geçersiz URL.</translation> <translation id="5127805178023152808">Senkronizasyon kapalı</translation> <translation id="5127881134400491887">Ağ bağlantılarını yönetme</translation> @@ -3269,6 +3281,7 @@ <translation id="6166185671393271715">Şifreleri Chrome'a Aktar</translation> <translation id="6169040057125497443">Lütfen mikrofonunuzu kontrol edin.</translation> <translation id="6169666352732958425">Masaüstü yayınlanamıyor.</translation> +<translation id="6170470584681422115">Sandviç</translation> <translation id="6171948306033499786">Yazdırmayı duraklat</translation> <translation id="6173623053897475761">PIN'inizi tekrar yazın</translation> <translation id="6175314957787328458">Microsoft Etki Alanı GUID'si</translation> @@ -3699,6 +3712,7 @@ <translation id="6870888490422746447">Paylaşımda bulunmak için bir uygulama seçin:</translation> <translation id="6871644448911473373">OCSP Yanıtlayanı: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Girdiğiniz şifre, sunucu tarafından reddedildi.</translation> +<translation id="6876155724392614295">Bisiklet</translation> <translation id="6878422606530379992">Sensörlere izin verildi</translation> <translation id="6880587130513028875">Bu sayfadaki resimler engellendi.</translation> <translation id="6883319974225028188">Hay aksi! Sistem cihaz yapılandırmasını kaydedemedi.</translation> @@ -4265,6 +4279,7 @@ <translation id="7772127298218883077"><ph name="PRODUCT_NAME" /> hakkında</translation> <translation id="7772773261844472235">Chromebook'unuzun durumunu kontrol edin</translation> <translation id="7773726648746946405">Oturum depolama</translation> +<translation id="7774365994322694683">Kuş</translation> <translation id="7776701556330691704">Hiçbir ses bulunamadı</translation> <translation id="7781335840981796660">Tüm kullanıcı hesapları ve yerel veriler kaldırılır.</translation> <translation id="7782102568078991263">Google'dan başka öneri yok</translation> @@ -4669,6 +4684,7 @@ <translation id="8386903983509584791">Tarama tamamlandı</translation> <translation id="8389492867173948260">Bu uzantının ziyaret ettiğiniz web sitelerindeki tüm verilerinizi okuması ve değiştirmesine izin verin:</translation> <translation id="8390449457866780408">Sunucu kullanılamıyor.</translation> +<translation id="8391218455464584335">Vinil</translation> <translation id="8391712576156218334">Görüntü kullanılamıyor. Daha sonra tekrar deneyin.</translation> <translation id="8392234662362215700">Klavye düzenini değiştirmek için Control-Üst Karakter-Boşluk tuşlarına basın.</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> seçenekler menüsü</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 9a30ae7..3ce7d3b 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Шукайте на пристрої, в додатках і в Інтернеті</translation> <translation id="114721135501989771">Розумні функції в Chrome</translation> <translation id="1149401351239820326">Місяць закінчення терміну дії</translation> +<translation id="1150565364351027703">Сонцезахисні окуляри</translation> <translation id="1151917987301063366">Завжди дозволяти хосту <ph name="HOST" /> доступ до датчиків</translation> <translation id="1153356358378277386">Підключені пристрої</translation> <translation id="1156488781945104845">Поточний час</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Довідник із комбінацій клавіш</translation> <translation id="2045969484888636535">Продовжити блокування файлів cookie</translation> <translation id="204622017488417136">Ваш пристрій повернеться до попередньо встановленої версії Chrome. Усі облікові записи користувачів і локальні дані буде видалено. Цю дію не можна відмінити.</translation> +<translation id="2046702855113914483">Рамен</translation> <translation id="2048182445208425546">Отримувати доступ до трафіку мережі</translation> <translation id="2048653237708779538">Дія недоступна</translation> <translation id="2050339315714019657">Портретна</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Додано принтер <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Проксі-сервер HTTP</translation> <translation id="2468205691404969808">Використовує файли cookie, щоб запам’ятовувати налаштування, навіть якщо ви не відвідуєте ці сторінки</translation> +<translation id="2468402215065996499">Тамагочі</translation> <translation id="2469375675106140201">Налаштувати перевірку орфографії</translation> <translation id="247051149076336810">URL-адреса файлообмінника</translation> <translation id="2470702053775288986">Непідтримувані розширення вимкнено</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Видалити зі списку</translation> <translation id="2770690685823456775">Експортуйте паролі в іншу папку</translation> <translation id="2771268254788431918">Мобільне передавання даних активовано</translation> +<translation id="2771816809568414714">Сир</translation> <translation id="2772936498786524345">Ніндзя</translation> <translation id="2773288106548584039">Підтримка застарілих веб-переглядачів</translation> <translation id="2773802008104670137">Цей файл може пошкодити ваш комп’ютер.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Аудіо</translation> <translation id="3616741288025931835">&Очистити дані веб-перегляду...</translation> <translation id="3617891479562106823">Фони недоступні. Повторіть спробу пізніше.</translation> +<translation id="3619115746895587757">Капучино</translation> <translation id="3623574769078102674">Цим контрольованим користувачем буде керувати користувач <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Розблоковуйте пристрій і входьте в обліковий запис Google</translation> <translation id="3625258641415618104">Знімки екрана вимкнено</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Міський пейзаж</translation> <translation id="4361142739114356624">Секретний ключ цього сертифіката клієнта відсутній або недійсний</translation> <translation id="4363771538994847871">Немає пристроїв для трансляції. Потрібна допомога?</translation> +<translation id="4364327530094270451">Диня</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> транслює вікно.</translation> <translation id="4364830672918311045">Показувати сповіщення</translation> <translation id="4365673000813822030">На жаль, синхронізація перестала працювати.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Мікропрограма Wi-Fi від Intel згенерувала чотири файли: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Перші три – це двійкові файли, що містять дані розвантаження пам’яті реєстру та не включають особисту інформацію й відомості, за якими можна ідентифікувати пристрій (як стверджує компанія Intel). Останній файл – це трасування виконання мікропрограми Intel; з нього стерто всю особисту інформацію й дані, за якими можна ідентифікувати пристрій, але він завеликий, щоб відображатися тут. Ці файли згенеровано у відповідь на нещодавні проблеми з Wi-Fi на пристрої. Їх буде надіслано в Intel, щоб допомогти вирішити ці проблеми.></translation> <translation id="469230890969474295">Папка OEM</translation> <translation id="4692623383562244444">Пошукові системи</translation> +<translation id="4693155481716051732">Суші</translation> <translation id="4694024090038830733">Налаштування принтерів встановлює адміністратор.</translation> <translation id="4694604912444486114">Мавпа</translation> <translation id="4697551882387947560">Після закінчення сеансу веб-перегляду</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Пароль користувача <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Маркет</translation> <translation id="4779083564647765204">Збільшити</translation> +<translation id="4779136857077979611">Оніґірі</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Спливаюче вікно заблоковано}one{# спливаюче вікно заблоковано}few{# спливаючі вікна заблоковано}many{# спливаючих вікон заблоковано}other{# спливаючого вікна заблоковано}}</translation> <translation id="4780321648949301421">Зберегти сторінку як...</translation> <translation id="4785719467058219317">Ви використовуєте ключ безпеки, не зареєстрований на цьому веб-сайті</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Сховати облікові записи</translation> <translation id="4801512016965057443">Дозволити роумінг мобільних даних</translation> <translation id="4804818685124855865">Від'єднатися</translation> +<translation id="4804827417948292437">Авокадо</translation> <translation id="4807098396393229769">Ім'я на картці</translation> <translation id="4808667324955055115">Спливаючі вікна заблоковано:</translation> <translation id="480990236307250886">Відкрити домашню сторінку</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Використати заявку цього пристрою під час його реєстрації для корпоративного керування:</translation> <translation id="4941627891654116707">Розмір шрифту</translation> <translation id="494286511941020793">Довідка про конфігурацію проксі-сервера</translation> +<translation id="4943368462779413526">Футбольний м’яч</translation> <translation id="4943691134276646401"><ph name="CHROME_EXTENSION_NAME" /> хоче під’єднатися до послідовного порту</translation> <translation id="495170559598752135">Дії</translation> <translation id="4953689047182316270">реагувати на події спеціальних можливостей</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Завжди ввімкнено</translation> <translation id="5067867186035333991">Запитувати, якщо хост <ph name="HOST" /> хоче отримати доступ до вашого мікрофона</translation> <translation id="5068918910148307423">Заборонити нещодавно закритим сайтам завершувати надсилання й отримання даних</translation> +<translation id="5068919226082848014">Піца</translation> <translation id="5072052264945641674">Налаштуйте розмір курсора</translation> <translation id="5072836811783999860">Показати закладки, якими керує адміністратор</translation> <translation id="5074318175948309511">Щоб нові налаштування почали діяти, можливо, потрібно буде оновити цю сторінку.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Відстежувати поведінку інших розширень, зокрема відвідані URL-адреси</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Ваш жорсткий диск заповнено. Збережіть в іншому місці чи звільніть місце на цьому жорстоку диску.</translation> +<translation id="5123433949759960244">Баскетбол</translation> <translation id="5125751979347152379">Недійсна URL-адреса.</translation> <translation id="5127805178023152808">Синхронізацію вимкнено</translation> <translation id="5127881134400491887">Керувати мережевими з’єднаннями</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Імпортувати паролі в Chrome</translation> <translation id="6169040057125497443">Перевірте мікрофон.</translation> <translation id="6169666352732958425">Не вдається транслювати робочий стіл.</translation> +<translation id="6170470584681422115">Сендвіч</translation> <translation id="6171948306033499786">Призупинити друк</translation> <translation id="6173623053897475761">Введіть PIN-код знову</translation> <translation id="6175314957787328458">GUID домену Microsoft</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Виберіть додаток:</translation> <translation id="6871644448911473373">Відповідач OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Сервер відхилив введений вами пароль.</translation> +<translation id="6876155724392614295">Велосипед</translation> <translation id="6878422606530379992">Використання датчиків дозволено</translation> <translation id="6880587130513028875">На цій сторінці зображення заблоковано.</translation> <translation id="6883319974225028188">На жаль, системі не вдалося зберегти конфігурацію пристрою.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">Про <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Перевірити статус Chromebook</translation> <translation id="7773726648746946405">Пам’ять сеансу</translation> +<translation id="7774365994322694683">Птах</translation> <translation id="7776701556330691704">Голосів не знайдено</translation> <translation id="7781335840981796660">Усі облікові записи користувачів і локальні дані буде видалено.</translation> <translation id="7782102568078991263">Більше немає пропозицій від Google</translation> @@ -4669,6 +4684,7 @@ <translation id="8386903983509584791">Сканування завершено</translation> <translation id="8389492867173948260">Дозволити розширенню переглядати й змінювати ваші дані на веб-сайтах, які ви відвідуєте:</translation> <translation id="8390449457866780408">Сервер не доступний.</translation> +<translation id="8391218455464584335">Вініл</translation> <translation id="8391712576156218334">Зображення недоступне. Повторіть спробу пізніше.</translation> <translation id="8392234662362215700">Натисніть комбінацію клавіш Control-Shift-Space, щоб змінити розкладку клавіатури.</translation> <translation id="8392451568018454956">Меню параметрів для <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index e986d6d..90d117b 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">Tìm kiếm trong thiết bị, ứng dụng và trên web.</translation> <translation id="114721135501989771">Trải nghiệm Google thông minh trong Chrome</translation> <translation id="1149401351239820326">Tháng hết hạn</translation> +<translation id="1150565364351027703">Kính mát</translation> <translation id="1151917987301063366">Luôn cho phép <ph name="HOST" /> sử dụng các cảm biến của thiết bị</translation> <translation id="1153356358378277386">Thiết bị được ghép nối</translation> <translation id="1156488781945104845">Thời gian hiện tại</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">Trình trợ giúp phím tắt</translation> <translation id="2045969484888636535">Tiếp tục chặn cookie</translation> <translation id="204622017488417136">Thiết bị của bạn sẽ được quay lại phiên bản Chrome đã cài đặt trước đó. Tất cả các tài khoản người dùng và dữ liệu cục bộ sẽ bị xóa. Không thể hoàn tác thao tác này.</translation> +<translation id="2046702855113914483">Mỳ tôm</translation> <translation id="2048182445208425546">Truy cập lưu lượng mạng của bạn</translation> <translation id="2048653237708779538">Không thể thực hiện hành động này</translation> <translation id="2050339315714019657">Khổ dọc</translation> @@ -928,6 +930,7 @@ <translation id="2462752602710430187">Đã thêm <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Proxy HTTP</translation> <translation id="2468205691404969808">Sử dụng cookie để ghi nhớ tùy chọn của bạn, ngay cả khi bạn không truy cập vào các trang đó</translation> +<translation id="2468402215065996499">Máy nuôi thú ảo</translation> <translation id="2469375675106140201">Tùy chỉnh tính năng kiểm tra chính tả</translation> <translation id="247051149076336810">URL chia sẻ tệp</translation> <translation id="2470702053775288986">Tiện ích không được hỗ trợ đã bị tắt</translation> @@ -1132,6 +1135,7 @@ <translation id="2770465223704140727">Xóa khỏi danh sách</translation> <translation id="2770690685823456775">Xuất mật khẩu của bạn sang thư mục khác</translation> <translation id="2771268254788431918">Đã kích hoạt dữ liệu di động</translation> +<translation id="2771816809568414714">Pho mát</translation> <translation id="2772936498786524345">Lén lút</translation> <translation id="2773288106548584039">Hỗ trợ trình duyệt cũ</translation> <translation id="2773802008104670137">Loại tệp này có thể gây hại cho máy tính của bạn.</translation> @@ -1655,6 +1659,7 @@ <translation id="3616113530831147358">Âm thanh</translation> <translation id="3616741288025931835">&Xoá Dữ liệu Duyệt web...</translation> <translation id="3617891479562106823">Không có nền. Hãy thử lại sau.</translation> +<translation id="3619115746895587757">Cà phê cappuccino</translation> <translation id="3623574769078102674">Người dùng bị giám sát này sẽ được quản lý bởi <ph name="MANAGER_EMAIL" />.</translation> <translation id="3624567683873126087">Mở khóa thiết bị và đăng nhập vào Tài khoản Google</translation> <translation id="3625258641415618104">Đã tắt chụp ảnh màn hình</translation> @@ -2133,6 +2138,7 @@ <translation id="4359717112757026264">Cảnh quan thành phố</translation> <translation id="4361142739114356624">Khóa cá nhân cho chứng chỉ ứng dụng này còn thiếu hoặc không hợp lệ</translation> <translation id="4363771538994847871">Không tìm thấy đích Truyền nào. Bạn cần trợ giúp?</translation> +<translation id="4364327530094270451">Quả dưa</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> đang chia sẻ một cửa sổ.</translation> <translation id="4364830672918311045">Hiển thị thông báo</translation> <translation id="4365673000813822030">Rất tiếc, Đồng bộ hóa đã ngừng hoạt động.</translation> @@ -2322,6 +2328,7 @@ <translation id="4690091457710545971"><Bốn tệp do chương trình cơ sở Intel Wi-Fi tạo ra: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Ba tệp đầu tiên là tệp nhị phân có chứa nội dung kết xuất đăng ký và được Intel xác nhận là không chứa thông tin nhận dạng cá nhân hoặc thiết bị. Tệp cuối cùng là dấu vết thực thi từ chương trình cơ sở Intel; tệp này đã được xóa mọi thông tin nhận dạng cá nhân hoặc thiết bị, nhưng kích thước tệp quá lớn nên không hiển thị được ở đây. Các tệp này được tạo do các sự cố Wi-Fi xảy ra gần đây với thiết bị của bạn và sẽ được chia sẻ với Intel để giúp khắc phục các sự cố này.></translation> <translation id="469230890969474295">Thư mục OEM</translation> <translation id="4692623383562244444">Công cụ tìm kiếm</translation> +<translation id="4693155481716051732">Sushi</translation> <translation id="4694024090038830733">Chỉ quản trị viên mới có thể thiết lập cấu hình máy in.</translation> <translation id="4694604912444486114">Khỉ</translation> <translation id="4697551882387947560">Khi phiên duyệt kết thúc</translation> @@ -2376,6 +2383,7 @@ <translation id="4776917500594043016">Mật khẩu cho <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Cửa hàng Play</translation> <translation id="4779083564647765204">Thu phóng</translation> +<translation id="4779136857077979611">Cơm nắm Onigiri</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Đã chặn cửa sổ bật lên}other{Đã chặn # cửa sổ bật lên}}</translation> <translation id="4780321648949301421">Lưu trang làm...</translation> <translation id="4785719467058219317">Bạn đang sử dụng một khóa bảo mật chưa đăng ký với trang web này</translation> @@ -2388,6 +2396,7 @@ <translation id="4801448226354548035">Ẩn tài khoản</translation> <translation id="4801512016965057443">Cho phép chuyển vùng dữ liệu di động</translation> <translation id="4804818685124855865">Ngắt kết nối</translation> +<translation id="4804827417948292437">Quả bơ</translation> <translation id="4807098396393229769">Tên trên thẻ</translation> <translation id="4808667324955055115">Đã chặn cửa sổ bật lên:</translation> <translation id="480990236307250886">Mở trang chủ</translation> @@ -2482,6 +2491,7 @@ <translation id="4941246025622441835">Sử dụng yêu cầu thiết bị này khi đăng ký thiết bị để quản lý doanh nghiệp:</translation> <translation id="4941627891654116707">Cỡ chữ</translation> <translation id="494286511941020793">Trợ giúp Cấu hình Proxy</translation> +<translation id="4943368462779413526">Bóng đá</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" muốn kết nối với một cổng nối tiếp</translation> <translation id="495170559598752135">Tác vụ</translation> <translation id="4953689047182316270">Phản hồi các sự kiện trợ năng</translation> @@ -2551,6 +2561,7 @@ <translation id="5067399438976153555">Luôn bật</translation> <translation id="5067867186035333991">Hỏi nếu <ph name="HOST" /> muốn truy cập micrô của bạn</translation> <translation id="5068918910148307423">Không cho phép các trang web đóng gần đây hoàn tất gửi và nhận dữ liệu</translation> +<translation id="5068919226082848014">Pizza</translation> <translation id="5072052264945641674">Điều chỉnh kích thước con trỏ</translation> <translation id="5072836811783999860">Hiển thị dấu trang được quản lý</translation> <translation id="5074318175948309511">Có thể cần phải tải lại trang này trước khi cài đặt mới có hiệu lực.</translation> @@ -2585,6 +2596,7 @@ <translation id="5117930984404104619">Giám sát hoạt động của các tiện ích khác, bao gồm cả các URL đã truy cập</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Đĩa cứng của bạn đã đầy. Hãy lưu vào một vị trí khác hoặc tạo thêm dung lượng trống trên đĩa cứng.</translation> +<translation id="5123433949759960244">Bóng rổ</translation> <translation id="5125751979347152379">URL không hợp lệ.</translation> <translation id="5127805178023152808">Đồng bộ hóa đã tắt</translation> <translation id="5127881134400491887">Quản lý kết nối mạng</translation> @@ -3268,6 +3280,7 @@ <translation id="6166185671393271715">Nhập mật khẩu vào Chrome</translation> <translation id="6169040057125497443">Vui lòng kiểm tra micrô của bạn.</translation> <translation id="6169666352732958425">Không thể truyền màn hình nền.</translation> +<translation id="6170470584681422115">Sandwich</translation> <translation id="6171948306033499786">Tạm dừng in</translation> <translation id="6173623053897475761">Nhập lại mã PIN</translation> <translation id="6175314957787328458">GUID Tên miền của Microsoft</translation> @@ -3698,6 +3711,7 @@ <translation id="6870888490422746447">Chọn một ứng dụng để chia sẻ:</translation> <translation id="6871644448911473373">Phản hồi OCSP: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">Mật khẩu bạn nhập đã bị máy chủ từ chối.</translation> +<translation id="6876155724392614295">Xe đạp</translation> <translation id="6878422606530379992">Được phép sử dụng cảm biến</translation> <translation id="6880587130513028875">Hình ảnh đã bị chặn trên trang này.</translation> <translation id="6883319974225028188">Rất tiếc! Hệ thống không lưu được cấu hình thiết bị.</translation> @@ -4264,6 +4278,7 @@ <translation id="7772127298218883077">Giới thiệu về <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">Xem trạng thái Chromebook của bạn</translation> <translation id="7773726648746946405">Bộ nhớ phiên</translation> +<translation id="7774365994322694683">Chim</translation> <translation id="7776701556330691704">Không tìm thấy giọng nói nào</translation> <translation id="7781335840981796660">Tất cả tài khoản người dùng và dữ liệu trên máy đều sẽ bị xóa.</translation> <translation id="7782102568078991263">Không có đề xuất nào khác từ Google</translation> @@ -4669,6 +4684,7 @@ <translation id="8386903983509584791">Đã quét xong</translation> <translation id="8389492867173948260">Cho phép tiện ích này đọc và thay đổi tất cả dữ liệu trên các trang web bạn truy cập:</translation> <translation id="8390449457866780408">Máy chủ không khả dụng.</translation> +<translation id="8391218455464584335">Vinyl</translation> <translation id="8391712576156218334">Không có hình ảnh. Hãy thử lại sau.</translation> <translation id="8392234662362215700">Ấn Control-Shift-Space để chuyển đổi bố cục bàn phím.</translation> <translation id="8392451568018454956">Menu tùy chọn dành cho <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 700b2559..292383f 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">搜索您的设备、应用和网站。</translation> <translation id="114721135501989771">在 Chrome 中畅享 Google 的智能技术</translation> <translation id="1149401351239820326">过期月份</translation> +<translation id="1150565364351027703">太阳镜</translation> <translation id="1151917987301063366">始终允许 <ph name="HOST" /> 使用传感器</translation> <translation id="1153356358378277386">已配对的设备</translation> <translation id="1156488781945104845">当前时间</translation> @@ -658,6 +659,7 @@ <translation id="2045117674524495717">键盘快捷键助手</translation> <translation id="2045969484888636535">继续拦截 Cookie</translation> <translation id="204622017488417136">您的设备将还原到之前安装的 Chrome 版本。所有用户帐号和本地数据都将移除。此操作无法撤消。</translation> +<translation id="2046702855113914483">拉面</translation> <translation id="2048182445208425546">获取您的网络流量数据</translation> <translation id="2048653237708779538">无法执行操作</translation> <translation id="2050339315714019657">纵向</translation> @@ -924,6 +926,7 @@ <translation id="2462752602710430187">已添加<ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP 代理</translation> <translation id="2468205691404969808">使用 Cookie 记住您的偏好设置(即使您不访问这些网页)</translation> +<translation id="2468402215065996499">拓麻歌子</translation> <translation id="2469375675106140201">自定义拼写检查</translation> <translation id="247051149076336810">文件共享网址</translation> <translation id="2470702053775288986">已停用不支持的扩展程序</translation> @@ -1127,6 +1130,7 @@ <translation id="2770465223704140727">从列表中移除</translation> <translation id="2770690685823456775">将您的密码导出到其他文件夹</translation> <translation id="2771268254788431918">已启用移动数据网络</translation> +<translation id="2771816809568414714">奶酪</translation> <translation id="2772936498786524345">忍者</translation> <translation id="2773288106548584039">旧版浏览器支持</translation> <translation id="2773802008104670137">这种类型的文件可能会损害您的计算机。</translation> @@ -1648,6 +1652,7 @@ <translation id="3616113530831147358">音频</translation> <translation id="3616741288025931835">清除浏览数据(&C)...</translation> <translation id="3617891479562106823">背景不可用。请稍后重试。</translation> +<translation id="3619115746895587757">卡布奇诺</translation> <translation id="3623574769078102674">此受监管用户将由 <ph name="MANAGER_EMAIL" /> 管理。</translation> <translation id="3624567683873126087">解锁设备并登录 Google 帐号</translation> <translation id="3625258641415618104">已停用屏幕截图</translation> @@ -2125,6 +2130,7 @@ <translation id="4359717112757026264">城市景观</translation> <translation id="4361142739114356624">缺少此客户端证书的私钥,或私钥无效</translation> <translation id="4363771538994847871">找不到投射目标。需要帮助吗?</translation> +<translation id="4364327530094270451">甜瓜</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共享窗口。</translation> <translation id="4364830672918311045">显示通知</translation> <translation id="4365673000813822030">糟糕,同步已停止。</translation> @@ -2314,6 +2320,7 @@ <translation id="4690091457710545971"><Intel Wi-Fi 固件生成了四个文件:csr.lst、fh_regs.lst、radio_reg.lst 和 monitor.lst.sysmon。前三个文件是包含注册表转储的二进制文件,且 Intel 表示其中并未包含任何个人信息或设备标识信息。最后一个文件是 Intel 固件的执行跟踪记录,其中的个人信息和设备标识信息已全部清除,但由于文件过大而无法显示在这里。因为您的设备最近发生过 Wi-Fi 问题,所以系统生成了这些文件,且会将文件提供给 Intel 以协助排查相关问题。></translation> <translation id="469230890969474295">OEM文件夹</translation> <translation id="4692623383562244444">搜索引擎</translation> +<translation id="4693155481716051732">寿司</translation> <translation id="4694024090038830733">打印机配置由管理员处理。</translation> <translation id="4694604912444486114">猴子</translation> <translation id="4697551882387947560">浏览会话结束时</translation> @@ -2368,6 +2375,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密码</translation> <translation id="4777825441726637019">Play 商店</translation> <translation id="4779083564647765204">缩放</translation> +<translation id="4779136857077979611">饭团</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{已拦截弹出式窗口}other{已拦截 # 个弹出式窗口}}</translation> <translation id="4780321648949301421">页面存储为...</translation> <translation id="4785719467058219317">您使用的安全密钥尚未在此网站注册</translation> @@ -2380,6 +2388,7 @@ <translation id="4801448226354548035">隐藏帐号</translation> <translation id="4801512016965057443">允许移动数据漫游</translation> <translation id="4804818685124855865">断开连接</translation> +<translation id="4804827417948292437">牛油果</translation> <translation id="4807098396393229769">持卡人姓名</translation> <translation id="4808667324955055115">已拦截弹出式窗口:</translation> <translation id="480990236307250886">打开主页</translation> @@ -2474,6 +2483,7 @@ <translation id="4941246025622441835">将设备登记到企业管理目录下时使用此设备前提条件:</translation> <translation id="4941627891654116707">字号</translation> <translation id="494286511941020793">代理配置帮助</translation> +<translation id="4943368462779413526">美式足球</translation> <translation id="4943691134276646401">“<ph name="CHROME_EXTENSION_NAME" />”想连接到串行端口</translation> <translation id="495170559598752135">操作</translation> <translation id="4953689047182316270">对无障碍事件做出响应</translation> @@ -2543,6 +2553,7 @@ <translation id="5067399438976153555">始终启用</translation> <translation id="5067867186035333991">当 <ph name="HOST" /> 想要使用麦克风时询问我</translation> <translation id="5068918910148307423">禁止最近关闭的网站完成数据收发操作</translation> +<translation id="5068919226082848014">披萨</translation> <translation id="5072052264945641674">调整光标大小</translation> <translation id="5072836811783999860">显示托管书签</translation> <translation id="5074318175948309511">您可能需要重新加载此页面,才能使新设置生效。</translation> @@ -2577,6 +2588,7 @@ <translation id="5117930984404104619">监控其他扩展程序的行为(包括访问过的网址)</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">您的硬盘已满。请保存到其他位置或在硬盘上腾出更多空间。</translation> +<translation id="5123433949759960244">篮球</translation> <translation id="5125751979347152379">网址无效。</translation> <translation id="5127805178023152808">同步功能已关闭</translation> <translation id="5127881134400491887">管理网络连接</translation> @@ -3230,7 +3242,7 @@ <translation id="6122095009389448667">继续禁止此网站查看剪贴板</translation> <translation id="6122875415561139701">禁止在“<ph name="DEVICE_NAME" />”上执行写入操作。</translation> <translation id="6124650939968185064">需先安装此扩展程序,下列扩展程序才能正常使用:</translation> -<translation id="6124698108608891449">该网站需要更多权限。</translation> +<translation id="6124698108608891449">此网站需要更多权限。</translation> <translation id="6125479973208104919">抱歉,您需要再次向此 <ph name="DEVICE_TYPE" /> 添加您的帐号。</translation> <translation id="6129691635767514872">系统已从 Chrome 和同步的设备中移除了您所选的数据。不过,您的 Google 帐号在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能还有其他形式的浏览记录(例如,在其他 Google 服务中的搜索记录和活动记录)。</translation> <translation id="6129938384427316298">Netscape 证书评论</translation> @@ -3260,6 +3272,7 @@ <translation id="6166185671393271715">将密码导入到 Chrome 中</translation> <translation id="6169040057125497443">请检查您的麦克风。</translation> <translation id="6169666352732958425">无法投射桌面。</translation> +<translation id="6170470584681422115">三明治</translation> <translation id="6171948306033499786">暂停打印</translation> <translation id="6173623053897475761">再次输入您的 PIN 码</translation> <translation id="6175314957787328458">Microsoft 域 GUID</translation> @@ -3409,7 +3422,7 @@ <translation id="641081527798843608">主题匹配</translation> <translation id="6412931879992742813">打开新的无痕式窗口</translation> <translation id="6415900369006735853">通过手机连接到互联网</translation> -<translation id="6416743254476733475">请在您的计算机上允许或禁止更多权限。</translation> +<translation id="6416743254476733475">允许或禁止在您的计算机上使用 VR 头戴式设备。</translation> <translation id="6417265370957905582">Google 助理</translation> <translation id="6418160186546245112">正在还原到之前安装的 <ph name="IDS_SHORT_PRODUCT_NAME" /> 版本</translation> <translation id="6418481728190846787">永久删除对所有应用的访问权限</translation> @@ -3690,6 +3703,7 @@ <translation id="6870888490422746447">选择要分享给哪个应用:</translation> <translation id="6871644448911473373">OCSP 响应程序:<ph name="LOCATION" /></translation> <translation id="6872781471649843364">您输入的密码被服务器拒绝了。</translation> +<translation id="6876155724392614295">自行车</translation> <translation id="6878422606530379992">已获准使用传感器</translation> <translation id="6880587130513028875">已拦截此网页上的图片。</translation> <translation id="6883319974225028188">糟糕!系统未能保存设备配置。</translation> @@ -4254,6 +4268,7 @@ <translation id="7772127298218883077">关于<ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">检查 Chromebook 的状态</translation> <translation id="7773726648746946405">会话存储</translation> +<translation id="7774365994322694683">鸟</translation> <translation id="7776701556330691704">未找到任何语音</translation> <translation id="7781335840981796660">所有用户帐号和本地数据都将会移除。</translation> <translation id="7782102568078991263">Google 无法提供其他任何建议</translation> @@ -4658,6 +4673,7 @@ <translation id="8386903983509584791">已完成扫描</translation> <translation id="8389492867173948260">允许此扩展程序读取和更改您在所访问的网站上留存的所有数据:</translation> <translation id="8390449457866780408">服务器无法使用。</translation> +<translation id="8391218455464584335">黑胶唱片</translation> <translation id="8391712576156218334">图片不可用。请稍后重试。</translation> <translation id="8392234662362215700">按 Ctrl+Shift+空格键可切换键盘布局。</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> 的“选项”菜单</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 90aa246..54620fb 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -102,6 +102,7 @@ <translation id="1145532888383813076">搜尋你的裝置、應用程式和網路。</translation> <translation id="114721135501989771">在 Chrome 中體驗 Google 智慧功能</translation> <translation id="1149401351239820326">到期月份</translation> +<translation id="1150565364351027703">太陽眼鏡</translation> <translation id="1151917987301063366">一律允許 <ph name="HOST" /> 存取感應器</translation> <translation id="1153356358378277386">配對裝置</translation> <translation id="1156488781945104845">目前時間</translation> @@ -661,6 +662,7 @@ <translation id="2045117674524495717">鍵盤快速鍵說明</translation> <translation id="2045969484888636535">繼續封鎖 Cookie</translation> <translation id="204622017488417136">你的裝置將還原至上一個安裝的 Chrome 版本,且所有使用者帳戶和本機資料都會遭到移除。這項操作無法復原。</translation> +<translation id="2046702855113914483">拉麵</translation> <translation id="2048182445208425546">存取你的網路流量</translation> <translation id="2048653237708779538">無法執行操作</translation> <translation id="2050339315714019657">縱向</translation> @@ -927,6 +929,7 @@ <translation id="2462752602710430187">已新增「<ph name="PRINTER_NAME" />」</translation> <translation id="2464089476039395325">HTTP Proxy</translation> <translation id="2468205691404969808">使用 Cookie 記住你的偏好設定 (即使你沒有造訪這些網頁)</translation> +<translation id="2468402215065996499">電子寵物</translation> <translation id="2469375675106140201">自訂拼字檢查</translation> <translation id="247051149076336810">檔案共用網址</translation> <translation id="2470702053775288986">已停用不支援的擴充功能</translation> @@ -1131,6 +1134,7 @@ <translation id="2770465223704140727">從清單中移除</translation> <translation id="2770690685823456775">將你的密碼匯出至其他資料夾</translation> <translation id="2771268254788431918">已啟用行動數據</translation> +<translation id="2771816809568414714">乳酪</translation> <translation id="2772936498786524345">忍者</translation> <translation id="2773288106548584039">舊版瀏覽器支援</translation> <translation id="2773802008104670137">這類檔案可能會損害你的電腦。</translation> @@ -1654,6 +1658,7 @@ <translation id="3616113530831147358">音訊</translation> <translation id="3616741288025931835">清除瀏覽資料(&C)...</translation> <translation id="3617891479562106823">目前無法存取背景,請稍後再試。</translation> +<translation id="3619115746895587757">卡布奇諾</translation> <translation id="3623574769078102674">受監管的使用者將由 <ph name="MANAGER_EMAIL" /> 負責管理。</translation> <translation id="3624567683873126087">解鎖裝置並登入 Google 帳戶</translation> <translation id="3625258641415618104">已停用螢幕擷取畫面</translation> @@ -2131,6 +2136,7 @@ <translation id="4359717112757026264">城市景觀</translation> <translation id="4361142739114356624">這個用戶端憑證沒有私密金鑰或私密金鑰無效</translation> <translation id="4363771538994847871">找不到 Cast 目的地。需要協助嗎?</translation> +<translation id="4364327530094270451">瓜</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共用視窗。</translation> <translation id="4364830672918311045">顯示通知</translation> <translation id="4365673000813822030">糟糕,同步處理已停止運作。</translation> @@ -2320,6 +2326,7 @@ <translation id="4690091457710545971"><Intel Wi-Fi 韌體產生了 4 個檔案:csr.lst、fh_regs.lst、radio_reg.lst 和 monitor.lst.sysmon。前三個檔案為包含暫存器傾印的二進位檔案,且 Intel 表示當中並未包含任何個人資訊或裝置識別資訊。最後一個檔案是 Intel 韌體的執行追蹤記錄,其中的個人資訊或裝置識別資訊已全部遭到清除,但由於檔案過大而無法顯示在這裡。這些檔案的產生原因是裝置的 Wi-Fi 最近出現問題所導致,系統會將檔案提供給 Intel 以協助排解這些問題。></translation> <translation id="469230890969474295">OEM 資料夾</translation> <translation id="4692623383562244444">搜尋引擎</translation> +<translation id="4693155481716051732">壽司</translation> <translation id="4694024090038830733">印表機設定是由管理員管理。</translation> <translation id="4694604912444486114">猴子</translation> <translation id="4697551882387947560">瀏覽工作階段結束時</translation> @@ -2374,6 +2381,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密碼</translation> <translation id="4777825441726637019">Play 商店</translation> <translation id="4779083564647765204">縮放</translation> +<translation id="4779136857077979611">飯糰</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{已封鎖彈出式視窗}other{已封鎖 # 個彈出式視窗}}</translation> <translation id="4780321648949301421">另存網頁...</translation> <translation id="4785719467058219317">你目前使用的安全金鑰並未在這個網站註冊</translation> @@ -2386,6 +2394,7 @@ <translation id="4801448226354548035">隱藏帳戶</translation> <translation id="4801512016965057443">允許行動數據漫遊</translation> <translation id="4804818685124855865">中斷連線</translation> +<translation id="4804827417948292437">酪梨</translation> <translation id="4807098396393229769">持卡人姓名</translation> <translation id="4808667324955055115">已封鎖彈出式視窗:</translation> <translation id="480990236307250886">開啟首頁</translation> @@ -2480,6 +2489,7 @@ <translation id="4941246025622441835">為企業管理服務註冊裝置時使用這個裝置申請單:</translation> <translation id="4941627891654116707">字型大小</translation> <translation id="494286511941020793">Proxy 設定說明</translation> +<translation id="4943368462779413526">足球</translation> <translation id="4943691134276646401">「<ph name="CHROME_EXTENSION_NAME" />」要求與序列埠連線</translation> <translation id="495170559598752135">動作</translation> <translation id="4953689047182316270">回應協助工具活動</translation> @@ -2549,6 +2559,7 @@ <translation id="5067399438976153555">一律啟用</translation> <translation id="5067867186035333991">當 <ph name="HOST" /> 要求存取麥克風時詢問我。</translation> <translation id="5068918910148307423">禁止最近關閉的網站完成資料的傳送及接收</translation> +<translation id="5068919226082848014">披薩</translation> <translation id="5072052264945641674">調整游標大小</translation> <translation id="5072836811783999860">顯示受管理書籤</translation> <translation id="5074318175948309511">你可能需要重新載入這個網頁,新設定才會生效。</translation> @@ -2583,6 +2594,7 @@ <translation id="5117930984404104619">監控其他擴充功能的行為 (包括造訪過的網址)。</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">你的硬碟已滿。請選擇其他儲存位置,或清出足夠的硬碟空間。</translation> +<translation id="5123433949759960244">籃球</translation> <translation id="5125751979347152379">網址無效。</translation> <translation id="5127805178023152808">同步功能已停用</translation> <translation id="5127881134400491887">管理網路連線</translation> @@ -3266,6 +3278,7 @@ <translation id="6166185671393271715">將密碼匯入 Chrome 中</translation> <translation id="6169040057125497443">請檢查麥克風。</translation> <translation id="6169666352732958425">無法投放桌面。</translation> +<translation id="6170470584681422115">三明治</translation> <translation id="6171948306033499786">暫停列印</translation> <translation id="6173623053897475761">重新輸入 PIN 碼</translation> <translation id="6175314957787328458">Microsoft 網域 GUID</translation> @@ -3696,6 +3709,7 @@ <translation id="6870888490422746447">選擇要共用的應用程式:</translation> <translation id="6871644448911473373">OCSP 回應程式:<ph name="LOCATION" /></translation> <translation id="6872781471649843364">輸入的密碼遭到伺服器拒絕。</translation> +<translation id="6876155724392614295">自行車</translation> <translation id="6878422606530379992">可使用感應器</translation> <translation id="6880587130513028875">系統已封鎖此網頁的圖片。</translation> <translation id="6883319974225028188">糟糕! 系統無法儲存裝置設定。</translation> @@ -4261,6 +4275,7 @@ <translation id="7772127298218883077">關於 <ph name="PRODUCT_NAME" /></translation> <translation id="7772773261844472235">檢查 Chromebook 狀態</translation> <translation id="7773726648746946405">工作階段儲存空間</translation> +<translation id="7774365994322694683">鳥</translation> <translation id="7776701556330691704">找不到語音</translation> <translation id="7781335840981796660">系統將移除所有使用者帳戶和本機資料。</translation> <translation id="7782102568078991263">沒有更多來自 Google 的建議</translation> @@ -4665,6 +4680,7 @@ <translation id="8386903983509584791">掃描完成</translation> <translation id="8389492867173948260">允許這個擴充功能讀取及變更你在造訪過的網站留下的所有資料:</translation> <translation id="8390449457866780408">無法與伺服器連線。</translation> +<translation id="8391218455464584335">黑膠</translation> <translation id="8391712576156218334">目前無法存取圖片,請稍後再試。</translation> <translation id="8392234662362215700">按下 Ctrl + Shift + 空格鍵可切換鍵盤配置。</translation> <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> 的選項選單</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index 2aad697..b2773fc 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -42,6 +42,7 @@ <translation id="1773601347087397504">Kumuha ng tulong sa paggamit ng Chrome OS</translation> <translation id="1795405610103747296">I-install ang Chrome sa iyong telepono. Magpapadala kami ng SMS sa telepono mo: <ph name="PHONE_NUMBER" /></translation> <translation id="1812689907177901597">Kapag na-off ito, maaari kang mag-sign in sa mga site ng Google tulad ng Gmail nang hindi nagsa-sign in sa Chrome</translation> +<translation id="1815759068706561639">Mapanganib ang <ph name="FILE_NAME" /> kaya na-block ito ng Chrome. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="1860536484129686729">Kailangan ng Chrome ng pahintulot na i-access ang iyong camera para sa site na ito</translation> <translation id="1873233029667955273">Hindi Google Chrome ang iyong default na browser</translation> <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation> @@ -67,6 +68,7 @@ <translation id="2429317896000329049">Hindi mai-sync ng Google Chrome ang iyong data dahil hindi available ang Pag-sync para sa iyong domain.</translation> <translation id="2467438592969358367">Gustong i-export ng Google Chrome ang iyong mga password. I-type ang password mo sa Windows para payagan ito.</translation> <translation id="2485422356828889247">I-uninstall</translation> +<translation id="2521856951867783208">Puwedeng mapanganib ang file na ito kaya na-block ito ng Chrome. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="2534507159460261402">Google Pay (kinopya sa Chrome)</translation> <translation id="2535429035253759792">Hinihiling sa iyo ng administrator mo na muli mong ilunsad ang Chrome para malapat ang update na ito</translation> <translation id="2580411288591421699">Hindi ma-install ang parehong bersyon ng Google Chrome na kasalukuyang tumatakbo. Mangyaring isara ang Google Chrome at muling subukan.</translation> @@ -103,6 +105,7 @@ <translation id="3451115285585441894">Idinaragdag sa Chrome...</translation> <translation id="345171907106878721">Idagdag ang iyong sarili sa Chrome</translation> <translation id="3479552764303398839">Hindi ngayon</translation> +<translation id="3481286511616257896">Puwedeng mapanganib ang <ph name="FILE_NAME" /> kaya na-block ito ng Chrome. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="34857402635545079">I-clear din ang data sa Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Kailangan ng Chrome ng access sa iyong lokasyon upang ibahagi ang lokasyon mo sa site na ito</translation> <translation id="3576528680708590453">Na-configure ng iyong system administrator ang Google Chrome na magbukas ng alternatibong browser para i-access ang <ph name="TARGET_URL_HOSTNAME" />.</translation> @@ -227,12 +230,14 @@ <translation id="7459554271817304652">I-set up ang Pag-sync upang i-save ang iyong personalized na mga tampok sa browser sa web at i-access ang mga iyon mula sa Google Chrome sa anumang computer.</translation> <translation id="7473136999113284234">Awtomatikong nag-a-update ang Chrome upang palagi kang may pinakabagong bersyon.</translation> <translation id="7486227612705979895">Ia-access ng Chrome ang iyong Drive para makapagmungkahi sa address bar</translation> +<translation id="748945194546522577">Mapanganib ang file na ito kaya na-block ito ng Chrome. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7552219221109926349">Ipakita ang Chrome OS sa wikang ito</translation> <translation id="7561940363513215021">{0,plural, =1{Muling ilulunsad ang Chrome sa loob ng 1 minuto}one{Muling ilulunsad ang Chrome sa loob ng # minuto}other{Muling ilulunsad ang Chrome sa loob ng # na minuto}}</translation> <translation id="7589360514048265910">Hindi na makakatanggap ng mga update sa Google Chrome ang computer na ito dahil hindi na sinusuportahan ang Mac OS X 10.9.</translation> <translation id="7592736734348559088">Hindi mai-sync ng Google Chrome ang iyong data dahil hindi napapanahon ang mga detalye sa pag-sign in ng iyong account.</translation> <translation id="7626032353295482388">Welcome sa Chrome</translation> +<translation id="7636297873481318396">Mapanganib ang file na ito kaya na-block ito ng Chrome. Pinoprotektahan ka ng Advanced na Proteksyon.</translation> <translation id="7641148173327520642">Na-configure ng iyong system administrator ang Google Chrome para buksan ang <ph name="ALTERNATIVE_BROWSER_NAME" /> para ma-access ang <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="7651907282515937834">Logo ng Chrome Enterprise</translation> <translation id="7747138024166251722">Hindi makalikha ng pansamantalang direktoryo ang installer. Paki-suri para sa puwang sa disk na walang laman at pahintulot upang i-install ang software.</translation> @@ -281,6 +286,7 @@ <translation id="8669527147644353129">Google Chrome Helper</translation> <translation id="8679801911857917785">Kinokontrol din nito kung anong pahina ang ipinapakita kapag sinimulan mo ang Chrome.</translation> <translation id="870251953148363156">I-update ang &Google Chrome</translation> +<translation id="8704255848199359374">Ginagamit nito ang parehong spellchecker na ginagamit sa paghahanap sa Google. Ipinapadala sa Google ang text na tina-type mo sa browser. Puwede mong baguhin palagi ang gawing ito sa mga setting.</translation> <translation id="873133009373065397">Hindi matukoy o maitakda ng Google Chrome ang default na browser</translation> <translation id="8736674169840206667">Inaatasan ka ng iyong administrator na muling ilunsad ang Chrome para malapat ang update</translation> <translation id="8788264404293392165">Ginagamit ang wikang ito para ipakita ang Chrome OS UI</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index b48a93b..cf5f903 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -17,7 +17,7 @@ <translation id="1312676208694947750">{0,plural, =0{Chrome OS का एक अपडेट उपलब्ध है}=1{Chrome OS का एक अपडेट उपलब्ध है}one{Chrome OS का एक अपडेट # दिनों से उपलब्ध है}other{Chrome OS का एक अपडेट # दिनों से उपलब्ध है}}</translation> <translation id="137466361146087520">Google Chrome बीटा</translation> <translation id="1393853151966637042">Chrome का उपयोग करने के बारे में सहायता प्राप्त करें</translation> -<translation id="1399397803214730675">इस कंप्यूटर में Google Chrome का अधिक नवीन वर्शन पहले से मौजूद है. अगर सॉफ्टवेयर काम नहीं कर रहा है, तो कृपया Google Chrome अनइंस्टॉल करें और फिर से प्रयास करें.</translation> +<translation id="1399397803214730675">इस कंप्यूटर में Google Chrome का ज़्यादा नवीन वर्शन पहले से मौजूद है. अगर सॉफ्टवेयर काम नहीं कर रहा है, तो कृपया Google Chrome अनइंस्टॉल करें और फिर से प्रयास करें.</translation> <translation id="1434626383986940139">Chrome Canary ऐप्स </translation> <translation id="1457721931618994305">Google Chrome अपडेट हो रहा है...</translation> <translation id="1469002951682717133">Chrome में ऐप चलाने का साधन</translation> @@ -25,12 +25,12 @@ <translation id="1585657529869845941">अगर <ph name="BEGIN_BOLD" />फिर भी बदलें<ph name="END_BOLD" /> दिखाई देता है, तो उस पर क्लिक करें</translation> <translation id="1587223624401073077">Google Chrome आपके कैमरे का उपयोग कर रहा है.</translation> <translation id="1587325591171447154"><ph name="FILE_NAME" /> खरतरनाक है, इसलिए Chrome ने उसे अवरोधित कर दिया है.</translation> -<translation id="1619887657840448962">Chrome को अधिक सुरक्षित बनाने के लिए, हमने निम्न एक्सटेंशन को अक्षम कर दिया है जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं है और आपकी जानकारी के बिना जोड़ा गया हो सकता है.</translation> +<translation id="1619887657840448962">Chrome को ज़्यादा सुरक्षित बनाने के लिए, हमने निम्न एक्सटेंशन को अक्षम कर दिया है जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं है और आपकी जानकारी के बिना जोड़ा गया हो सकता है.</translation> <translation id="1628000112320670027">Chrome में सहायता प्राप्त करें</translation> <translation id="1662639173275167396">Chrome OS को <ph name="BEGIN_LINK_LINUX_OSS" />Linux (बीटा)<ph name="END_LINK_LINUX_OSS" /> की तरह ही, अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> के ज़रिए कारगर बनाया गया है.</translation> <translation id="1674870198290878346">Chrome गु&प्त विंडो में लिंक खोलें</translation> <translation id="1682634494516646069">Google Chrome अपनी डेटा निर्देशिका को पढ़ और उस पर लिख नहीं सकता :\n\n<ph name="USER_DATA_DIRECTORY" /></translation> -<translation id="1698376642261615901">Google Chrome एक ऐसा वेब ब्राउज़र है, जो वेब पेज और ऐप्स को बिजली की गति से चलाता है. यह तेज़, स्थिर, और उपयोग में आसान है. Google Chrome में अंतर्निहित मैलवेयर और फ़िशिंग सुरक्षा के साथ अधिक सुरक्षित रूप से वेब ब्राउज़ करें.</translation> +<translation id="1698376642261615901">Google Chrome एक ऐसा वेब ब्राउज़र है, जो वेब पेज और ऐप्स को बिजली की गति से चलाता है. यह तेज़, स्थिर, और उपयोग में आसान है. Google Chrome में अंतर्निहित मैलवेयर और फ़िशिंग सुरक्षा के साथ ज़्यादा सुरक्षित रूप से वेब ब्राउज़ करें.</translation> <translation id="1718131156967340976"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /> चुनें</translation> <translation id="1734234790201236882">Chrome इस पासवर्ड को आपके Google खाते में सेव कर लेगा. आपको इसे याद रखने की ज़रूरत नहीं है.</translation> <translation id="174539241580958092">प्रवेश करने में गड़बड़ी के कारण Google Chrome आपका डेटा समन्वयित नहीं कर सका.</translation> @@ -90,7 +90,7 @@ <translation id="3251381707915721925">यह सेट करने के लिए कि <ph name="NEW_PROFILE_NAME" /> द्वारा कौन सी वेबसाइट देखी जा सकती है, आप <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" /> पर जाकर प्रतिबंध और सेटिंग कॉन्फ़िगर कर सकते हैं. अगर आप डिफ़ॉल्ट सेटिंग नहीं बदलते हैं, तो <ph name="NEW_PROFILE_NAME" /> द्वारा वेब प्रोफ़ाइल पर सब कुछ ब्राउज़ किया जा सकता है. <ph name="NEW_PROFILE_NAME" /> को अपना खाता एक्सेस करने से रोकने के लिए, जब आप क्रोमियम का उपयोग नहीं कर रहे हों तो अपनी प्रोफ़ाइल को अवश्य लॉक कर दें. ऐसा करने के लिए, ब्राउज़र के ऊपर-दाएं कोने में स्थित अपना प्रोफ़ाइल नाम क्लिक करें और "बाहर निकलें और चाइल्ड लॉक करें" चुनें. -<ph name="BEGIN_LINK_2" />अधिक जानें<ph name="END_LINK_2" /> +<ph name="BEGIN_LINK_2" />ज़्यादा जानें<ph name="END_LINK_2" /> कृपया अतिरिक्त निर्देशों के लिए <ph name="ACCOUNT_EMAIL" /> पर अपना ईमेल देखें.</translation> <translation id="3282568296779691940">Chrome में साइन इन करें</translation> @@ -139,7 +139,7 @@ <translation id="459622048091363950">Chrome को एक्सेस मिलने के बाद, वेबसाइटें आपसे एक्सेस मांग सकेंगी.</translation> <translation id="4600710005438004015">Chrome सबसे नए वर्शन में अपडेट नहीं कर सका, इसलिए आपको नई सुविधाएं और सुरक्षा सुधार नहीं मिल रहे हैं.</translation> <translation id="4631713731678262610">Chrome मेनू में छिपाएं</translation> -<translation id="4633000520311261472">Chrome को अधिक सुरक्षित बनाने के लिए, हमने ऐसे कुछ एक्सटेंशन अक्षम कर दिए हैं जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं हैं और आपकी जानकारी के बिना जोड़े गए हो सकते हैं.</translation> +<translation id="4633000520311261472">Chrome को ज़्यादा सुरक्षित बनाने के लिए, हमने ऐसे कुछ एक्सटेंशन अक्षम कर दिए हैं जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं हैं और आपकी जानकारी के बिना जोड़े गए हो सकते हैं.</translation> <translation id="4728575227883772061">अनिर्दिष्ट कारण से स्थापना विफल हुई. अगर Google Chrome अभी खुला हुआ है, तो कृपया उसे बंद करें और फिर से प्रयास करें.</translation> <translation id="4750550185319565338"><ph name="PLUGIN_NAME" /> सक्षम करने के लिए Chrome फिर से चालू करें</translation> <translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation> @@ -214,7 +214,7 @@ <translation id="7023651421574588884">आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome OS को रीस्टार्ट करें</translation> <translation id="7098166902387133879">Google Chrome आपके माइक्रोफ़ोन का उपयोग कर रहा है.</translation> <translation id="7106741999175697885">काम का प्रबंधक - Google Chrome</translation> -<translation id="7164397146364144019">आप Google को संभावित सुरक्षा घटनाओं के विवरणों की अपने आप रिपोर्ट करके Chrome को अधिक सुरक्षित और आसान बनाने में सहायता कर सकते हैं.</translation> +<translation id="7164397146364144019">आप Google को संभावित सुरक्षा घटनाओं के विवरणों की अपने आप रिपोर्ट करके Chrome को ज़्यादा सुरक्षित और आसान बनाने में सहायता कर सकते हैं.</translation> <translation id="7242029209006116544">आप प्रबंधित खाते से प्रवेश कर रहे हैं और उसके व्यवस्थापक को अपनी Google Chrome प्रोफ़ाइल पर नियंत्रण दे रहे हैं. आपका Chrome डेटा, जैसे आपके ऐप्स , बुकमार्क, इतिहास, पासवर्ड, और अन्य सेटिंग <ph name="USER_NAME" /> से स्थायी रूप से जुड़ जाएंगी. आप Google खाता डैशबोर्ड से इस डेटा को हटा सकेंगे, लेकिन आप किसी अन्य खाते से इस डेटा को संबद्ध नहीं कर सकेंगे. <ph name="LEARN_MORE" /></translation> <translation id="7295052994004373688">इस भाषा का इस्तेमाल Google Chrome यूज़र इंटरफ़ेस (यूआई) दिखाने के लिए किया जाता है</translation> <translation id="7296210096911315575">इस्तेमाल और सुरक्षा से जुड़ी ज़रूरी जानकारी</translation> @@ -244,7 +244,7 @@ <translation id="7825851276765848807">अनिर्दिष्ट गड़बड़ी के कारण डाउनलोड विफल हुआ. कृपया Google Chrome फिर से डाउनलोड करें.</translation> <translation id="7855730255114109580">Google Chrome अप टू डेट है</translation> <translation id="7888186132678118370">Chrome को अपने टास्कबार में पिन करें</translation> -<translation id="7890208801193284374">अगर आप कंप्यूटर शेयर करते हैं, तो मित्र और परिवार अलग-अलग ब्राउज़ कर सकते हैं और Chrome को जैसा चाहें सेट कर सकते हैं.</translation> +<translation id="7890208801193284374">अगर आप कंप्यूटर शेयर करते हैं, तो दोस्त और परिवार अलग-अलग ब्राउज़ कर सकते हैं और Chrome को जैसा चाहें सेट कर सकते हैं.</translation> <translation id="7896673875602241923">इस कंप्यूटर पर पहले किसी और ने <ph name="ACCOUNT_EMAIL_LAST" /> के रूप में Chrome में साइन इन किया है. अपनी जानकारी अलग रखने के लिए कृपया नया 'Chrome उपयोगकर्ता' बनाएं.</translation> <translation id="7908168227788431038">करीब अप टू डेट हो गया है! अपडेट करना पूरा करने के लिए Google Chrome को फिर से लॉन्च करें.</translation> <translation id="7962410387636238736">इस कंप्यूटर को अब Google Chrome के अपडेट नहीं मिलेंगे क्योंकि Windows XP और Windows Vista अब काम नहीं करते हैं</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 55f7194..21ce9c38 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -237,7 +237,7 @@ <translation id="7589360514048265910">Mac OS X 10.9가 더 이상 지원되지 않으므로 이 컴퓨터에서 Chrome 업데이트를 받을 수 없게 됩니다.</translation> <translation id="7592736734348559088">계정의 로그인 세부정보가 오래되어 Chrome에서 데이터를 동기화하지 못했습니다.</translation> <translation id="7626032353295482388">Chrome에 오신 것을 환영합니다</translation> -<translation id="7636297873481318396">위험한 파일이므로 Chrome에서 차단했습니다. 고급 보호 기능이 작동 중입니다.</translation> +<translation id="7636297873481318396">위험한 파일이므로 Chrome에서 차단했습니다. 사용자를 안전하게 보호하는 고급 보호 기능이 작동 중입니다.</translation> <translation id="7641148173327520642">시스템 관리자가 <ph name="TARGET_URL_HOSTNAME" /> 액세스를 위해 <ph name="ALTERNATIVE_BROWSER_NAME" />을(를) 열도록 Chrome을 구성했습니다.</translation> <translation id="7651907282515937834">Chrome Enterprise 로고</translation> <translation id="7747138024166251722">설치 프로그램이 임시 디렉토리를 만들지 못했습니다. 디스크 공간 및 설치 권한을 확인해 보세요.</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 7a344843..b104c244 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3457,6 +3457,7 @@ "//chrome/browser/chromeos", "//chrome/browser/chromeos/kiosk_next_home/mojom", "//chromeos/services/assistant/public:feature_flags", + "//chromeos/services/cellular_setup", "//chromeos/services/device_sync", "//chromeos/services/device_sync/public/mojom", "//chromeos/services/ime/public/mojom",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 471c105c..6861b55f 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -555,13 +555,18 @@ #if defined(OS_ANDROID) const FeatureEntry::FeatureParam kInterestFeedLargerImagesFeatureVariationConstant[] = { + {"feed_ui_enabled", "true"}}; +const FeatureEntry::FeatureParam + kInterestFeedSnippetsEnabledFeatureVariationConstant[] = { {"feed_ui_enabled", "true"}, - {"feed_server_endpoint", - "https://www.google.com/httpservice/noretry/DiscoverClankService/" - "FeedQuery"}}; + {"snippets_enabled", "true"}}; const FeatureEntry::FeatureVariation kInterestFeedFeatureVariations[] = { {"(larger images)", kInterestFeedLargerImagesFeatureVariationConstant, - base::size(kInterestFeedLargerImagesFeatureVariationConstant), nullptr}}; + base::size(kInterestFeedLargerImagesFeatureVariationConstant), nullptr}, + {"(larger images and snippets)", + kInterestFeedSnippetsEnabledFeatureVariationConstant, + base::size(kInterestFeedSnippetsEnabledFeatureVariationConstant), + nullptr}}; const FeatureEntry::FeatureVariation kRemoteSuggestionsFeatureVariations[] = { {"via content suggestion server (backed by ChromeReader)", nullptr, 0,
diff --git a/chrome/browser/android/image_fetcher/image_fetcher_bridge.cc b/chrome/browser/android/image_fetcher/image_fetcher_bridge.cc index f7b21fa..098cd16 100644 --- a/chrome/browser/android/image_fetcher/image_fetcher_bridge.cc +++ b/chrome/browser/android/image_fetcher/image_fetcher_bridge.cc
@@ -16,9 +16,9 @@ #include "chrome/browser/image_fetcher/image_fetcher_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_android.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_fetcher.h" +#include "components/image_fetcher/core/image_fetcher_metrics_reporter.h" #include "components/image_fetcher/core/image_fetcher_service.h" #include "jni/ImageFetcherBridge_jni.h" #include "ui/gfx/android/java_bitmap.h" @@ -156,9 +156,8 @@ const jint j_event_id) { std::string client_name = base::android::ConvertJavaStringToUTF8(j_client_name); - CachedImageFetcherEvent event = - static_cast<CachedImageFetcherEvent>(j_event_id); - CachedImageFetcherMetricsReporter::ReportEvent(client_name, event); + ImageFetcherEvent event = static_cast<ImageFetcherEvent>(j_event_id); + ImageFetcherMetricsReporter::ReportEvent(client_name, event); } void ImageFetcherBridge::ReportCacheHitTime( @@ -169,8 +168,8 @@ std::string client_name = base::android::ConvertJavaStringToUTF8(j_client_name); base::Time start_time = base::Time::FromJavaTime(start_time_millis); - CachedImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava( - client_name, start_time); + ImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava(client_name, + start_time); } void ImageFetcherBridge::ReportTotalFetchTimeFromNative( @@ -181,8 +180,8 @@ std::string client_name = base::android::ConvertJavaStringToUTF8(j_client_name); base::Time start_time = base::Time::FromJavaTime(start_time_millis); - CachedImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava( - client_name, start_time); + ImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava(client_name, + start_time); } void ImageFetcherBridge::OnImageDataFetched(
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 05efbfc..0000c47 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -651,10 +651,10 @@ <include name="IDR_DEVICE_EMULATOR_SHARED_STYLES_HTML" file="resources\chromeos\emulator\shared_styles.html" type="BINDATA" /> </if> <if expr="chromeos"> - <include name="IDR_SET_TIME_HTML" file="resources\chromeos\md_set_time\set_time.html" type="BINDATA" compress="gzip" /> - <include name="IDR_SET_TIME_JS" file="resources\chromeos\md_set_time\set_time.js" type="BINDATA" compress="gzip" /> - <include name="IDR_SET_TIME_BROWSER_PROXY_HTML" file="resources\chromeos\md_set_time\set_time_browser_proxy.html" type="BINDATA" compress="gzip" /> - <include name="IDR_SET_TIME_BROWSER_PROXY_JS" file="resources\chromeos\md_set_time\set_time_browser_proxy.js" type="BINDATA" compress="gzip" /> + <include name="IDR_SET_TIME_DIALOG_HTML" file="resources\chromeos\set_time_dialog\set_time_dialog.html" type="BINDATA" compress="gzip" /> + <include name="IDR_SET_TIME_DIALOG_JS" file="resources\chromeos\set_time_dialog\set_time_dialog.js" type="BINDATA" compress="gzip" /> + <include name="IDR_SET_TIME_BROWSER_PROXY_HTML" file="resources\chromeos\set_time_dialog\set_time_browser_proxy.html" type="BINDATA" compress="gzip" /> + <include name="IDR_SET_TIME_BROWSER_PROXY_JS" file="resources\chromeos\set_time_dialog\set_time_browser_proxy.js" type="BINDATA" compress="gzip" /> </if> <if expr="chromeos"> <if expr="_google_chrome">
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index be4450f..fd01f07d 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -404,7 +404,11 @@ #include "chrome/browser/ui/ash/tablet_mode_client.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chromeos/constants/chromeos_constants.h" +#include "chromeos/constants/chromeos_features.h" #include "chromeos/constants/chromeos_switches.h" +#include "chromeos/services/cellular_setup/cellular_setup_service.h" +#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "chromeos/services/cellular_setup/public/mojom/constants.mojom.h" #include "chromeos/services/ime/public/mojom/constants.mojom.h" #include "chromeos/services/secure_channel/public/mojom/constants.mojom.h" #include "chromeos/services/secure_channel/secure_channel_service.h" @@ -4025,6 +4029,14 @@ #endif #if defined(OS_CHROMEOS) + if (service_name == chromeos::cellular_setup::mojom::kServiceName && + base::FeatureList::IsEnabled( + chromeos::features::kUpdatedCellularActivationUi)) { + service_manager::Service::RunAsyncUntilTermination( + std::make_unique<chromeos::cellular_setup::CellularSetupService>( + std::move(request))); + } + if (service_name == chromeos::secure_channel::mojom::kServiceName) { service_manager::Service::RunAsyncUntilTermination( std::make_unique<chromeos::secure_channel::SecureChannelService>(
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 68216bb..b722d8d 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1840,6 +1840,8 @@ "printing/ppd_provider_factory.h", "printing/ppd_resolution_state.cc", "printing/ppd_resolution_state.h", + "printing/ppd_resolution_tracker.cc", + "printing/ppd_resolution_tracker.h", "printing/printer_configurer.cc", "printing/printer_configurer.h", "printing/printer_detector.h", @@ -2554,6 +2556,7 @@ "printing/bulk_printers_calculator_unittest.cc", "printing/cups_printers_manager_unittest.cc", "printing/ppd_resolution_state_unittest.cc", + "printing/ppd_resolution_tracker_unittest.cc", "printing/printer_detector_test_util.h", "printing/printer_event_tracker_unittest.cc", "printing/printers_sync_bridge_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/arc_support_host.cc b/chrome/browser/chromeos/arc/arc_support_host.cc index c1ae2fe9..4d3f6eb 100644 --- a/chrome/browser/chromeos/arc/arc_support_host.cc +++ b/chrome/browser/chromeos/arc/arc_support_host.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/extensions/app_launch_params.h" #include "chrome/browser/ui/extensions/application_launch.h" +#include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" #include "components/consent_auditor/consent_auditor.h" #include "components/user_manager/known_user.h" @@ -739,7 +740,7 @@ DCHECK(error_delegate_); error_delegate_->OnSendFeedbackClicked(); } else if (event == kEventOnOpenPrivacySettingsPageClicked) { - chrome::ShowSettingsSubPageForProfile(profile_, "privacy"); + chrome::ShowSettingsSubPageForProfile(profile_, chrome::kPrivacySubPage); } else { LOG(ERROR) << "Unknown message: " << event; NOTREACHED();
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc index 9dee959..d3887fa9 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
@@ -244,15 +244,16 @@ void SetAccountAndProfile(const user_manager::UserType user_type) { const AccountId account_id( AccountId::FromUserEmailGaiaId(kFakeUserName, kFakeGaiaId)); + const user_manager::User* user = nullptr; switch (user_type) { case user_manager::USER_TYPE_CHILD: - GetFakeUserManager()->AddChildUser(account_id); + user = GetFakeUserManager()->AddChildUser(account_id); break; case user_manager::USER_TYPE_REGULAR: - GetFakeUserManager()->AddUser(account_id); + user = GetFakeUserManager()->AddUser(account_id); break; case user_manager::USER_TYPE_PUBLIC_ACCOUNT: - GetFakeUserManager()->AddPublicAccountUser(account_id); + user = GetFakeUserManager()->AddPublicAccountUser(account_id); break; default: ADD_FAILURE() << "Unexpected user type " << user_type; @@ -274,6 +275,9 @@ identity_test_environment_adaptor_ = std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile_.get()); + chromeos::ProfileHelper::Get()->SetUserToProfileMappingForTesting( + user, profile_.get()); + auto* identity_test_env = identity_test_environment_adaptor_->identity_test_env(); identity_test_env->SetAutomaticIssueOfAccessTokens(true);
diff --git a/chrome/browser/chromeos/assistant/assistant_util.cc b/chrome/browser/chromeos/assistant/assistant_util.cc index 66be58c3..1a7d228 100644 --- a/chrome/browser/chromeos/assistant/assistant_util.cc +++ b/chrome/browser/chromeos/assistant/assistant_util.cc
@@ -56,6 +56,8 @@ ULOC_UK, ULOC_US, "da", + "en_AU", + "en_NZ", "nb", "nl", "nn",
diff --git a/chrome/browser/chromeos/chrome_content_browser_client_chromeos_part.cc b/chrome/browser/chromeos/chrome_content_browser_client_chromeos_part.cc index 256cc626..5bf2944 100644 --- a/chrome/browser/chromeos/chrome_content_browser_client_chromeos_part.cc +++ b/chrome/browser/chromeos/chrome_content_browser_client_chromeos_part.cc
@@ -38,7 +38,7 @@ const GURL& url = entry->GetURL(); Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); - if (profile && search::IsNTPURL(url, profile)) + if (profile && search::IsNTPOrRelatedURL(url, profile)) return true; return url.SchemeIs(content::kChromeUIScheme);
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc index d1402fc..13b296b 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -47,9 +47,11 @@ #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_client.h" #include "chrome/browser/ui/chrome_pages.h" +#include "chrome/browser/ui/settings_window_manager_chromeos.h" #include "chrome/common/extensions/api/file_manager_private_internal.h" #include "chrome/common/extensions/api/manifest_types.h" #include "chrome/common/pref_names.h" +#include "chrome/common/webui_url_constants.h" #include "chrome/services/file_util/public/cpp/zip_file_creator.h" #include "chromeos/settings/timezone_settings.h" #include "components/account_id/account_id.h" @@ -467,8 +469,13 @@ const std::unique_ptr<Params> params(Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params); - chrome::ShowSettingsSubPageForProfile(ProfileManager::GetActiveUserProfile(), - params->sub_page); + Profile* profile = ProfileManager::GetActiveUserProfile(); + if (chrome::IsOSSettingsSubPage(params->sub_page)) { + chrome::SettingsWindowManager::GetInstance()->ShowOSSettings( + profile, params->sub_page); + } else { + chrome::ShowSettingsSubPageForProfile(profile, params->sub_page); + } return RespondNow(NoArguments()); }
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index 433d95db..f24c37b 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -716,6 +716,7 @@ TestCase("executeDefaultTaskDownloads").InGuestMode(), TestCase("executeDefaultTaskDrive").DisableDriveFs(), TestCase("executeDefaultTaskDrive").EnableDriveFs(), + TestCase("defaultTaskForTextPlain"), TestCase("defaultTaskDialogDownloads"), TestCase("defaultTaskDialogDownloads").InGuestMode(), TestCase("defaultTaskDialogDrive").DisableDriveFs(), @@ -950,6 +951,9 @@ TestCase("myFilesFolderRename"), TestCase("myFilesFolderRename").EnableMyFilesVolume(), TestCase("myFilesUpdatesChildren"), + TestCase("myFilesUpdatesWhenAndroidVolumeMounts") + .EnableMyFilesVolume() + .DontMountVolumes(), TestCase("myFilesUpdatesChildren").EnableMyFilesVolume(), TestCase("myFilesAutoExpandOnce").EnableMyFilesVolume()));
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc index c307982..0e501d03 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -2038,6 +2038,18 @@ return; } + if (name == "mountPlayFiles") { + DCHECK(android_files_volume_); + android_files_volume_->Mount(profile()); + return; + } + + if (name == "unmountPlayFiles") { + DCHECK(android_files_volume_); + android_files_volume_->Unmount(profile()); + return; + } + if (name == "setDriveEnabled") { bool enabled; ASSERT_TRUE(value.GetBoolean("enabled", &enabled));
diff --git a/chrome/browser/chromeos/file_manager/file_manager_string_util.cc b/chrome/browser/chromeos/file_manager/file_manager_string_util.cc index c60f4467..16db619e 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_string_util.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_string_util.cc
@@ -542,6 +542,7 @@ SET_STRING("GEAR_BUTTON_TOOLTIP", IDS_FILE_BROWSER_GEAR_BUTTON_TOOLTIP); SET_STRING("SELECTION_MENU_BUTTON_TOOLTIP", IDS_FILE_BROWSER_SELECTION_MENU_BUTTON_TOOLTIP); + SET_STRING("CONTEXT_MENU_LABEL", IDS_FILE_BROWSER_CONTEXT_MENU_LABEL); SET_STRING("GET_INFO_BUTTON_LABEL", IDS_FILE_BROWSER_GET_INFO_BUTTON_LABEL); SET_STRING("HOSTED_OFFLINE_MESSAGE", IDS_FILE_BROWSER_HOSTED_OFFLINE_MESSAGE); SET_STRING("HOSTED_OFFLINE_MESSAGE_PLURAL",
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_session.cc b/chrome/browser/chromeos/login/demo_mode/demo_session.cc index fb95eed1..a38daa11 100644 --- a/chrome/browser/chromeos/login/demo_mode/demo_session.cc +++ b/chrome/browser/chromeos/login/demo_mode/demo_session.cc
@@ -98,16 +98,14 @@ // Copies photos into the Downloads directory. // TODO(michaelpg): Test this behavior (requires overriding the Downloads // directory). -void InstallDemoMedia(base::FilePath offline_resources_path) { +void InstallDemoMedia(const base::FilePath& offline_resources_path, + const base::FilePath& dest_path) { if (offline_resources_path.empty()) { LOG(ERROR) << "Offline resources not loaded - no media available."; return; } base::FilePath src_path = offline_resources_path.Append(kPhotosPath); - base::FilePath dest_path = file_manager::util::GetDownloadsFolderForProfile( - ProfileManager::GetActiveUserProfile()); - if (!base::CopyDirectory(src_path, dest_path, false /* recursive */)) LOG(ERROR) << "Failed to install demo mode media."; } @@ -447,9 +445,14 @@ DCHECK(demo_resources_->loaded()); if (offline_enrolled_) LoadAndLaunchHighlightsApp(); + + Profile* const profile = ProfileManager::GetActiveUserProfile(); + DCHECK(profile); + const base::FilePath downloads = + file_manager::util::GetDownloadsFolderForProfile(profile); base::PostTaskWithTraits( FROM_HERE, {base::TaskPriority::USER_VISIBLE, base::MayBlock()}, - base::BindOnce(&InstallDemoMedia, demo_resources_->path())); + base::BindOnce(&InstallDemoMedia, demo_resources_->path(), downloads)); } void DemoSession::LoadAndLaunchHighlightsApp() {
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_session_unittest.cc b/chrome/browser/chromeos/login/demo_mode/demo_session_unittest.cc index b4c0c6b..c2a6cd3 100644 --- a/chrome/browser/chromeos/login/demo_mode/demo_session_unittest.cc +++ b/chrome/browser/chromeos/login/demo_mode/demo_session_unittest.cc
@@ -421,8 +421,7 @@ demo_session->resources()->GetAbsolutePath(base::FilePath("foo.txt"))); } -// TODO(crbug.com/939687): Reenable the test. -TEST_F(DemoSessionTest, DISABLED_ShowAndRemoveSplashScreen) { +TEST_F(DemoSessionTest, ShowAndRemoveSplashScreen) { DemoSession* demo_session = DemoSession::StartIfInDemoMode(); ASSERT_TRUE(demo_session); @@ -477,8 +476,7 @@ app_window->OnNativeClose(); } -// TODO(crbug.com/939687): Reenable the test. -TEST_F(DemoSessionTest, DISABLED_RemoveSplashScreenWhenTimeout) { +TEST_F(DemoSessionTest, RemoveSplashScreenWhenTimeout) { DemoSession* demo_session = DemoSession::StartIfInDemoMode(); ASSERT_TRUE(demo_session);
diff --git a/chrome/browser/chromeos/login/eula_browsertest.cc b/chrome/browser/chromeos/login/eula_browsertest.cc index 8276215..e890981 100644 --- a/chrome/browser/chromeos/login/eula_browsertest.cc +++ b/chrome/browser/chromeos/login/eula_browsertest.cc
@@ -178,30 +178,39 @@ consented); } - // Waits until |blocking_closure| finishes executing. - void WaitForBlockingCall(base::OnceClosure blocking_closure) { + // Calls |GoogleUpdateSettings::SetCollectStatsConsent| asynchronously on its + // task runner. Blocks until task is executed. + void SetGoogleCollectStatsConsent(bool consented) { base::RunLoop runloop; - base::PostTaskWithTraitsAndReply(FROM_HERE, {base::MayBlock()}, - std::move(blocking_closure), - runloop.QuitClosure()); + GoogleUpdateSettings::CollectStatsConsentTaskRunner()->PostTaskAndReply( + FROM_HERE, SetCollectStatsConsentClosure(consented), + runloop.QuitClosure()); runloop.Run(); } - // Waits and returns the result of evaluating |blocking_closure|. - bool EvaluateBlocking(base::OnceCallback<bool()> blocking_closure) { - bool result = false; + // Calls |GoogleUpdateSettings::GetCollectStatsConsent| asynchronously on its + // task runner. Blocks until task is executed and returns the result. + bool GetGoogleCollectStatsConsent() { + bool consented = false; + + // Callback runs after GetCollectStatsConsent is executed. Sets the local + // variable |consented| to the result of GetCollectStatsConsent. + auto on_get_collect_stats_consent_callback = + [](base::OnceClosure quit_closure, bool* consented_out, + bool consented_result) { + *consented_out = consented_result; + std::move(quit_closure).Run(); + }; + base::RunLoop runloop; - base::PostTaskWithTraitsAndReplyWithResult( - FROM_HERE, {base::MayBlock()}, std::move(blocking_closure), - base::BindOnce( - [](base::RepeatingClosure quit_closure, bool* result_out, - bool evaluation_result) { - *result_out = evaluation_result; - quit_closure.Run(); - }, - runloop.QuitClosure(), &result)); + base::PostTaskAndReplyWithResult( + GoogleUpdateSettings::CollectStatsConsentTaskRunner(), FROM_HERE, + base::BindOnce(&GoogleUpdateSettings::GetCollectStatsConsent), + base::BindOnce(on_get_collect_stats_consent_callback, + runloop.QuitClosure(), &consented)); runloop.Run(); - return result; + + return consented; } private: @@ -281,7 +290,7 @@ // Verifies statistic collection accepted flow. // Advaces to the next screen and verifies stats collection is enabled. // Flaky on LSAN/ASAN: crbug.com/952482. -IN_PROC_BROWSER_TEST_F(EulaTest, DISABLED_EnableUsageStats) { +IN_PROC_BROWSER_TEST_F(EulaTest, EnableUsageStats) { ShowEulaScreen(); // Verify that toggle is enabled by default. @@ -294,8 +303,7 @@ ProfileManager::GetActiveUserProfile(), false); g_browser_process->local_state()->SetBoolean( metrics::prefs::kMetricsReportingEnabled, false); - - WaitForBlockingCall(SetCollectStatsConsentClosure(false)); + SetGoogleCollectStatsConsent(false); // Start Listening for StatsReportingController updates. base::RunLoop runloop; @@ -312,8 +320,7 @@ EXPECT_TRUE(StatsReportingController::Get()->IsEnabled()); EXPECT_TRUE(g_browser_process->local_state()->GetBoolean( metrics::prefs::kMetricsReportingEnabled)); - EXPECT_TRUE(EvaluateBlocking( - base::BindOnce(&GoogleUpdateSettings::GetCollectStatsConsent))); + EXPECT_TRUE(GetGoogleCollectStatsConsent()); } // Verify statistic collection denied flow. Clicks on usage stats toggle, @@ -331,8 +338,7 @@ ProfileManager::GetActiveUserProfile(), true); g_browser_process->local_state()->SetBoolean( metrics::prefs::kMetricsReportingEnabled, true); - - WaitForBlockingCall(SetCollectStatsConsentClosure(true)); + SetGoogleCollectStatsConsent(true); // Start Listening for StatsReportingController updates. base::RunLoop runloop; @@ -351,8 +357,7 @@ EXPECT_FALSE(StatsReportingController::Get()->IsEnabled()); EXPECT_FALSE(g_browser_process->local_state()->GetBoolean( metrics::prefs::kMetricsReportingEnabled)); - EXPECT_FALSE(EvaluateBlocking( - base::BindOnce(&GoogleUpdateSettings::GetCollectStatsConsent))); + EXPECT_FALSE(GetGoogleCollectStatsConsent()); } // Tests that clicking on "Learn more" button opens a help dialog.
diff --git a/chrome/browser/chromeos/login/screens/sync_consent_screen.cc b/chrome/browser/chromeos/login/screens/sync_consent_screen.cc index fbcf4ac..e82ac49 100644 --- a/chrome/browser/chromeos/login/screens/sync_consent_screen.cc +++ b/chrome/browser/chromeos/login/screens/sync_consent_screen.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/common/pref_names.h" +#include "chrome/common/webui_url_constants.h" #include "components/consent_auditor/consent_auditor.h" #include "components/prefs/pref_service.h" #include "components/sync/driver/sync_service.h" @@ -53,7 +54,8 @@ [](Profile* profile) { profile->GetPrefs()->ClearPref( prefs::kShowSyncSettingsOnSessionStart); - chrome::ShowSettingsSubPageForProfile(profile, "syncSetup"); + chrome::ShowSettingsSubPageForProfile(profile, + chrome::kSyncSetupSubPage); }, base::Unretained(profile)), kSyncConsentSettingsShowDelay);
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager.cc b/chrome/browser/chromeos/printing/cups_printers_manager.cc index ef85ab9..d5a0718 100644 --- a/chrome/browser/chromeos/printing/cups_printers_manager.cc +++ b/chrome/browser/chromeos/printing/cups_printers_manager.cc
@@ -19,6 +19,7 @@ #include "base/sequence_checker.h" #include "base/strings/stringprintf.h" #include "chrome/browser/chromeos/printing/ppd_provider_factory.h" +#include "chrome/browser/chromeos/printing/ppd_resolution_tracker.h" #include "chrome/browser/chromeos/printing/printer_event_tracker_factory.h" #include "chrome/browser/chromeos/printing/synced_printers_manager.h" #include "chrome/browser/chromeos/printing/synced_printers_manager_factory.h" @@ -361,8 +362,9 @@ const std::vector<PrinterDetector::DetectedPrinter>& detected_list) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_); for (const PrinterDetector::DetectedPrinter& detected : detected_list) { - if (base::ContainsKey(configured_printers_index_, - detected.printer.id())) { + const std::string& detected_printer_id = detected.printer.id(); + + if (base::ContainsKey(configured_printers_index_, detected_printer_id)) { // It's already in the configured class, don't need to do anything // else here. continue; @@ -375,9 +377,9 @@ printers_[kAutomatic].push_back(detected.printer); continue; } - auto it = detected_printer_ppd_references_.find(detected.printer.id()); - if (it != detected_printer_ppd_references_.end()) { - if (!it->second) { + if (ppd_resolution_tracker_.IsResolutionComplete(detected_printer_id)) { + if (!ppd_resolution_tracker_.WasResolutionSuccessful( + detected_printer_id)) { auto printer = detected.printer; if (!printer.supports_ippusb()) { // We couldn't figure out this printer, so it's in the discovered @@ -398,7 +400,8 @@ // We have a ppd reference, so we think we can set this up // automatically. printers_[kAutomatic].push_back(detected.printer); - *printers_[kAutomatic].back().mutable_ppd_reference() = *it->second; + *printers_[kAutomatic].back().mutable_ppd_reference() = + ppd_resolution_tracker_.GetPpdReference(detected_printer_id); } } else { // Didn't find an entry for this printer in the PpdReferences cache. We @@ -406,14 +409,13 @@ // PpdReference. If there's not already an outstanding request for one, // start one. When the request comes back, we'll rerun classification // and then should be able to figure out where this printer belongs. - if (!base::ContainsKey(inflight_ppd_reference_resolutions_, - detected.printer.id())) { - inflight_ppd_reference_resolutions_.insert(detected.printer.id()); + + if (!ppd_resolution_tracker_.IsResolutionPending(detected_printer_id)) { + ppd_resolution_tracker_.MarkResolutionPending(detected_printer_id); ppd_provider_->ResolvePpdReference( detected.ppd_search_data, base::Bind(&CupsPrintersManagerImpl::ResolvePpdReferenceDone, - weak_ptr_factory_.GetWeakPtr(), - detected.printer.id())); + weak_ptr_factory_.GetWeakPtr(), detected_printer_id)); } } } @@ -454,15 +456,11 @@ PpdProvider::CallbackResultCode code, const Printer::PpdReference& ref) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_); - inflight_ppd_reference_resolutions_.erase(printer_id); - - // Create the entry. If we got something, populate the entry. Otherwise let - // it just remain empty. - detected_printer_ppd_references_[printer_id] = - (code == PpdProvider::SUCCESS) - ? ref - : base::Optional<Printer::PpdReference>(); - + if (code == PpdProvider::SUCCESS) { + ppd_resolution_tracker_.MarkResolutionSuccessful(printer_id, ref); + } else { + ppd_resolution_tracker_.MarkResolutionFailed(printer_id); + } RebuildDetectedLists(); } @@ -496,17 +494,9 @@ // Printer ids that occur in one of our categories or printers. std::unordered_set<std::string> known_printer_ids_; - // This is a dual-purpose structure. The keys in the map are printer ids. - // If an entry exists in this map it means we have received a response from - // PpdProvider about a PpdReference for the given printer. An empty value - // means we don't have a PpdReference (and so can't set up this printer - // automatically). - std::unordered_map<std::string, base::Optional<Printer::PpdReference>> - detected_printer_ppd_references_; - - // Printer ids for which we have sent off a request to PpdProvider for a ppd - // reference, but have not yet gotten a response. - std::unordered_set<std::string> inflight_ppd_reference_resolutions_; + // Tracks PpdReference resolution. Also stores USB manufacturer string if + // available. + PpdResolutionTracker ppd_resolution_tracker_; // Map from printer id to printers_[kSaved] index for configured // printers.
diff --git a/chrome/browser/chromeos/printing/ppd_resolution_state.cc b/chrome/browser/chromeos/printing/ppd_resolution_state.cc index c1731f7..69c1259c 100644 --- a/chrome/browser/chromeos/printing/ppd_resolution_state.cc +++ b/chrome/browser/chromeos/printing/ppd_resolution_state.cc
@@ -12,7 +12,9 @@ PpdResolutionState::PpdResolutionState() : is_inflight_(true), is_ppd_resolution_successful_(false) {} - +PpdResolutionState::PpdResolutionState(PpdResolutionState&& other) = default; +PpdResolutionState& PpdResolutionState::operator=(PpdResolutionState&& rhs) = + default; PpdResolutionState::~PpdResolutionState() = default; void PpdResolutionState::MarkResolutionSuccessful(
diff --git a/chrome/browser/chromeos/printing/ppd_resolution_state.h b/chrome/browser/chromeos/printing/ppd_resolution_state.h index 675c050..3c249ed 100644 --- a/chrome/browser/chromeos/printing/ppd_resolution_state.h +++ b/chrome/browser/chromeos/printing/ppd_resolution_state.h
@@ -14,6 +14,8 @@ class PpdResolutionState { public: PpdResolutionState(); + PpdResolutionState(PpdResolutionState&& other); + PpdResolutionState& operator=(PpdResolutionState&& rhs); ~PpdResolutionState(); // Marks PPD resolution was successful and stores |ppd_reference|.
diff --git a/chrome/browser/chromeos/printing/ppd_resolution_tracker.cc b/chrome/browser/chromeos/printing/ppd_resolution_tracker.cc new file mode 100644 index 0000000..e264108 --- /dev/null +++ b/chrome/browser/chromeos/printing/ppd_resolution_tracker.cc
@@ -0,0 +1,97 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/printing/ppd_resolution_tracker.h" + +#include <memory> +#include <string> +#include <unordered_map> +#include <vector> + +#include "base/stl_util.h" + +namespace chromeos { + +PpdResolutionTracker::PpdResolutionTracker() = default; +PpdResolutionTracker::PpdResolutionTracker(PpdResolutionTracker&& other) = + default; +PpdResolutionTracker& PpdResolutionTracker::operator=( + PpdResolutionTracker&& rhs) = default; +PpdResolutionTracker::~PpdResolutionTracker() = default; + +bool PpdResolutionTracker::IsResolutionComplete( + const std::string& printer_id) const { + if (PrinterStateExists(printer_id)) { + return !printer_state_.at(printer_id).IsInflight(); + } + return false; +} + +bool PpdResolutionTracker::IsResolutionPending( + const std::string& printer_id) const { + if (PrinterStateExists(printer_id)) { + return printer_state_.at(printer_id).IsInflight(); + } + return false; +} + +bool PpdResolutionTracker::WasResolutionSuccessful( + const std::string& printer_id) const { + DCHECK(PrinterStateExists(printer_id)); + + return printer_state_.at(printer_id).WasResolutionSuccessful(); +} + +void PpdResolutionTracker::MarkResolutionPending( + const std::string& printer_id) { + DCHECK(!PrinterStateExists(printer_id)); + + // Default state of PpdResolution is when resolution is inflight. + printer_state_[printer_id] = PpdResolutionState(); +} + +void PpdResolutionTracker::MarkResolutionSuccessful( + const std::string& printer_id, + const Printer::PpdReference& ppd_reference) { + DCHECK(PrinterStateExists(printer_id)); + DCHECK(IsResolutionPending(printer_id)); + + printer_state_.at(printer_id).MarkResolutionSuccessful(ppd_reference); +} + +void PpdResolutionTracker::MarkResolutionFailed(const std::string& printer_id) { + DCHECK(PrinterStateExists(printer_id)); + DCHECK(IsResolutionPending(printer_id)); + + printer_state_.at(printer_id).MarkResolutionFailed(); +} + +void PpdResolutionTracker::SetManufacturer( + const std::string& printer_id, + const std::string& usb_manufacturer) { + DCHECK(PrinterStateExists(printer_id)); + + printer_state_.at(printer_id).SetUsbManufacturer(usb_manufacturer); +} + +const std::string& PpdResolutionTracker::GetManufacturer( + const std::string& printer_id) const { + DCHECK(PrinterStateExists(printer_id)); + + return printer_state_.at(printer_id).GetUsbManufacturer(); +} + +const Printer::PpdReference& PpdResolutionTracker::GetPpdReference( + const std::string& printer_id) const { + DCHECK(PrinterStateExists(printer_id)); + + return printer_state_.at(printer_id).GetPpdReference(); +} + +bool PpdResolutionTracker::PrinterStateExists( + const std::string& printer_id) const { + return base::ContainsKey(printer_state_, printer_id); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/ppd_resolution_tracker.h b/chrome/browser/chromeos/printing/ppd_resolution_tracker.h new file mode 100644 index 0000000..6133213 --- /dev/null +++ b/chrome/browser/chromeos/printing/ppd_resolution_tracker.h
@@ -0,0 +1,70 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_PPD_RESOLUTION_TRACKER_H_ +#define CHROME_BROWSER_CHROMEOS_PRINTING_PPD_RESOLUTION_TRACKER_H_ + +#include <memory> +#include <string> +#include <unordered_map> +#include <vector> + +#include "base/macros.h" +#include "chrome/browser/chromeos/printing/ppd_resolution_state.h" +#include "chromeos/printing/printer_configuration.h" + +namespace chromeos { + +class PpdResolutionTracker { + public: + PpdResolutionTracker(); + PpdResolutionTracker(PpdResolutionTracker&& other); + PpdResolutionTracker& operator=(PpdResolutionTracker&& rhs); + ~PpdResolutionTracker(); + + // Returns true if a |printer_id| is in |printer_state_| and if the printer + // ppd resolution is not inflight. + bool IsResolutionComplete(const std::string& printer_id) const; + + // Returns true if the printer PpdReference resolution is currently inflight. + bool IsResolutionPending(const std::string& printer_id) const; + + // Returns true if the a PpdReference was successfully resolved. + bool WasResolutionSuccessful(const std::string& printer_id) const; + + // Adds |printer_id| to |printer_state_|. Default state is when the resolution + // is inflight. + void MarkResolutionPending(const std::string& printer_id); + + // Store |ppd_reference| and update the resolution state of |printer_id| as + // successful. + void MarkResolutionSuccessful(const std::string& printer_id, + const Printer::PpdReference& ppd_reference); + + // Update |printer_id|'s resolution state as failed. + void MarkResolutionFailed(const std::string& printer_id); + + // Store the |usb_manufacturer| for the associated |printer_id|. + void SetManufacturer(const std::string& printer_id, + const std::string& usb_manufacturer); + + // Returns the Usb manufacturer for the associated |printed_id|. + const std::string& GetManufacturer(const std::string& printer_id) const; + + // Returns the PpdReference for the associated |printer_id|. + const Printer::PpdReference& GetPpdReference( + const std::string& printer_id) const; + + private: + // Returns true if |printer_id| exists in |printer_state_|. + bool PrinterStateExists(const std::string& printer_id) const; + + std::unordered_map<std::string, PpdResolutionState> printer_state_; + + DISALLOW_COPY_AND_ASSIGN(PpdResolutionTracker); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_PRINTING_PPD_RESOLUTION_TRACKER_H_
diff --git a/chrome/browser/chromeos/printing/ppd_resolution_tracker_unittest.cc b/chrome/browser/chromeos/printing/ppd_resolution_tracker_unittest.cc new file mode 100644 index 0000000..f8ac80d --- /dev/null +++ b/chrome/browser/chromeos/printing/ppd_resolution_tracker_unittest.cc
@@ -0,0 +1,121 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/printing/ppd_resolution_tracker.h" + +#include "base/macros.h" +#include "chrome/browser/chromeos/printing/ppd_resolution_state.h" +#include "chromeos/printing/printer_configuration.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { + +class PpdResolutionTrackerTest : public testing::Test { + public: + PpdResolutionTrackerTest() = default; + ~PpdResolutionTrackerTest() override = default; + + DISALLOW_COPY_AND_ASSIGN(PpdResolutionTrackerTest); +}; + +TEST_F(PpdResolutionTrackerTest, PendingResolution) { + PpdResolutionTracker tracker; + + const std::string printer_id = "1"; + + EXPECT_FALSE(tracker.IsResolutionComplete(printer_id)); + EXPECT_FALSE(tracker.IsResolutionPending(printer_id)); + + tracker.MarkResolutionPending(printer_id); + + EXPECT_TRUE(tracker.IsResolutionPending(printer_id)); + EXPECT_FALSE(tracker.IsResolutionComplete(printer_id)); + EXPECT_FALSE(tracker.WasResolutionSuccessful(printer_id)); +} + +TEST_F(PpdResolutionTrackerTest, MarkPpdResolutionSuccessful) { + PpdResolutionTracker tracker; + + const std::string printer_id = "1"; + tracker.MarkResolutionPending(printer_id); + + const std::string& expected_effective_make_and_model = "printer_make_model"; + Printer::PpdReference ref; + ref.effective_make_and_model = expected_effective_make_and_model; + + tracker.MarkResolutionSuccessful(printer_id, ref); + + EXPECT_FALSE(tracker.IsResolutionPending(printer_id)); + EXPECT_TRUE(tracker.IsResolutionComplete(printer_id)); + EXPECT_TRUE(tracker.WasResolutionSuccessful(printer_id)); + + EXPECT_TRUE(tracker.GetManufacturer(printer_id).empty()); + EXPECT_EQ(expected_effective_make_and_model, + tracker.GetPpdReference(printer_id).effective_make_and_model); +} + +TEST_F(PpdResolutionTrackerTest, MarkPpdResolutionFailed) { + PpdResolutionTracker tracker; + + const std::string printer_id = "1"; + tracker.MarkResolutionPending(printer_id); + tracker.MarkResolutionFailed(printer_id); + + EXPECT_FALSE(tracker.IsResolutionPending(printer_id)); + EXPECT_TRUE(tracker.IsResolutionComplete(printer_id)); + EXPECT_FALSE(tracker.WasResolutionSuccessful(printer_id)); + + EXPECT_TRUE(tracker.GetManufacturer(printer_id).empty()); +} + +TEST_F(PpdResolutionTrackerTest, SetUsbManufacturer) { + PpdResolutionTracker tracker; + + const std::string printer_id = "1"; + tracker.MarkResolutionPending(printer_id); + tracker.MarkResolutionFailed(printer_id); + + const std::string expected_usb_manufacturer = "Hewlett-Packard"; + tracker.SetManufacturer(printer_id, expected_usb_manufacturer); + + EXPECT_FALSE(tracker.IsResolutionPending(printer_id)); + EXPECT_TRUE(tracker.IsResolutionComplete(printer_id)); + EXPECT_FALSE(tracker.WasResolutionSuccessful(printer_id)); + + EXPECT_EQ(expected_usb_manufacturer, tracker.GetManufacturer(printer_id)); +} + +TEST_F(PpdResolutionTrackerTest, MultipleResolutions) { + PpdResolutionTracker tracker; + + const std::string printer_id_1 = "1"; + tracker.MarkResolutionPending(printer_id_1); + + const std::string& expected_effective_make_and_model1 = + "printer_make_model_1"; + Printer::PpdReference ref1; + ref1.effective_make_and_model = expected_effective_make_and_model1; + + tracker.MarkResolutionSuccessful(printer_id_1, ref1); + + const std::string printer_id_2 = "2"; + tracker.MarkResolutionPending(printer_id_2); + tracker.MarkResolutionFailed(printer_id_2); + + EXPECT_FALSE(tracker.IsResolutionPending(printer_id_2)); + EXPECT_TRUE(tracker.IsResolutionComplete(printer_id_2)); + EXPECT_FALSE(tracker.WasResolutionSuccessful(printer_id_2)); + + EXPECT_TRUE(tracker.GetManufacturer(printer_id_2).empty()); + + EXPECT_FALSE(tracker.IsResolutionPending(printer_id_1)); + EXPECT_TRUE(tracker.IsResolutionComplete(printer_id_1)); + EXPECT_TRUE(tracker.WasResolutionSuccessful(printer_id_1)); + + EXPECT_TRUE(tracker.GetManufacturer(printer_id_1).empty()); + EXPECT_EQ(expected_effective_make_and_model1, + tracker.GetPpdReference(printer_id_1).effective_make_and_model); +} + +} // namespace chromeos
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc index b9617352..2dce564 100644 --- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc +++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -10,21 +10,29 @@ #include "base/callback_helpers.h" #include "base/macros.h" #include "base/strings/utf_string_conversions.h" +#include "base/task/post_task.h" #include "chrome/browser/extensions/chrome_extension_function_details.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/favicon/favicon_service_factory.h" +#include "chrome/browser/installable/installable_manager.h" #include "chrome/browser/installable/installable_metrics.h" +#include "chrome/browser/installable/installable_params.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ssl/security_state_tab_helper.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/extensions/app_launch_params.h" #include "chrome/browser/ui/extensions/application_launch.h" +#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" +#include "chrome/browser/ui/web_applications/web_app_dialog_utils.h" #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" #include "chrome/browser/web_applications/components/install_manager.h" #include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_provider_base.h" +#include "chrome/browser/web_applications/extensions/bookmark_app_util.h" #include "chrome/common/extensions/extension_metrics.h" #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" #include "chrome/common/web_application_info.h" @@ -47,6 +55,11 @@ namespace { +using InstallWebAppCallback = + extensions::ManagementAPIDelegate::InstallWebAppCallback; +using InstallWebAppResult = + extensions::ManagementAPIDelegate::InstallWebAppResult; + class ManagementSetEnabledFunctionInstallPromptDelegate : public extensions::InstallPromptDelegate { public: @@ -143,7 +156,7 @@ DISALLOW_COPY_AND_ASSIGN(ManagementUninstallFunctionUninstallDialogDelegate); }; -void OnWebAppInstallCompleted( +void OnGenerateAppForLinkCompleted( extensions::ManagementGenerateAppForLinkFunction* function, const web_app::AppId& app_id, web_app::InstallResultCode code) { @@ -181,13 +194,53 @@ provider->install_manager().InstallWebAppFromInfo( std::move(web_app_info), /*no_network_install=*/false, WebappInstallSource::MANAGEMENT_API, - base::BindOnce(OnWebAppInstallCompleted, base::RetainedRef(function))); + base::BindOnce(OnGenerateAppForLinkCompleted, + base::RetainedRef(function))); } // Used for favicon loading tasks. base::CancelableTaskTracker cancelable_task_tracker_; + + private: + DISALLOW_COPY_AND_ASSIGN(ChromeAppForLinkDelegate); }; +void OnWebAppInstallCompleted(InstallWebAppCallback callback, + const web_app::AppId& app_id, + web_app::InstallResultCode code) { + InstallWebAppResult result; + // TODO(loyso): Update this when more of the web_app::InstallResultCodes are + // actually set. + switch (code) { + case web_app::InstallResultCode::kSuccess: + result = InstallWebAppResult::kSuccess; + break; + default: + result = InstallWebAppResult::kUnknownError; + } + std::move(callback).Run(result); +} + +void OnDidInstallWebAppInstallableCheck( + Profile* profile, + InstallWebAppCallback callback, + std::unique_ptr<content::WebContents> web_contents, + bool is_installable) { + if (!is_installable) { + std::move(callback).Run(InstallWebAppResult::kInvalidWebApp); + return; + } + + content::WebContents* containing_contents = web_contents.get(); + chrome::ScopedTabbedBrowserDisplayer displayer(profile); + chrome::AddWebContents(displayer.browser(), nullptr, std::move(web_contents), + WindowOpenDisposition::NEW_FOREGROUND_TAB, + gfx::Rect()); + web_app::CreateWebAppFromManifest( + containing_contents, WebappInstallSource::MANAGEMENT_API, + base::BindOnce(&OnWebAppInstallCompleted, std::move(callback))); +} + } // namespace ChromeManagementAPIDelegate::ChromeManagementAPIDelegate() { @@ -311,6 +364,25 @@ return std::unique_ptr<extensions::AppForLinkDelegate>(delegate); } +bool ChromeManagementAPIDelegate::IsWebAppInstalled( + content::BrowserContext* context, + const GURL& web_app_url) const { + return extensions::BookmarkOrHostedAppInstalled(context, web_app_url); +} + +void ChromeManagementAPIDelegate::InstallReplacementWebApp( + content::BrowserContext* context, + const GURL& web_app_url, + InstallWebAppCallback callback) const { + Profile* profile = Profile::FromBrowserContext(context); + auto* provider = web_app::WebAppProviderBase::GetProviderBase(profile); + DCHECK(provider); + + provider->install_manager().LoadWebAppAndCheckInstallability( + web_app_url, base::BindOnce(&OnDidInstallWebAppInstallableCheck, profile, + std::move(callback))); +} + void ChromeManagementAPIDelegate::EnableExtension( content::BrowserContext* context, const std::string& extension_id) const {
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.h b/chrome/browser/extensions/api/management/chrome_management_api_delegate.h index 8146845..7fdcea8 100644 --- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.h +++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.h
@@ -46,6 +46,12 @@ content::BrowserContext* context, const std::string& title, const GURL& launch_url) const override; + bool IsWebAppInstalled(content::BrowserContext* context, + const GURL& web_app_url) const override; + void InstallReplacementWebApp( + content::BrowserContext* context, + const GURL& web_app_url, + ManagementAPIDelegate::InstallWebAppCallback callback) const override; void EnableExtension(content::BrowserContext* context, const std::string& extension_id) const override; void DisableExtension(
diff --git a/chrome/browser/extensions/api/sessions/sessions_api.cc b/chrome/browser/extensions/api/sessions/sessions_api.cc index 0fc0594..7156357f 100644 --- a/chrome/browser/extensions/api/sessions/sessions_api.cc +++ b/chrome/browser/extensions/api/sessions/sessions_api.cc
@@ -246,8 +246,9 @@ continue; const sessions::SerializedNavigationEntry& current_navigation = tab->navigations.at(tab->normalized_navigation_index()); - if (search::IsNTPURL(current_navigation.virtual_url(), - Profile::FromBrowserContext(browser_context()))) { + if (search::IsNTPOrRelatedURL( + current_navigation.virtual_url(), + Profile::FromBrowserContext(browser_context()))) { continue; } tabs_in_window.push_back(tab);
diff --git a/chrome/browser/extensions/extension_url_rewrite_browsertest.cc b/chrome/browser/extensions/extension_url_rewrite_browsertest.cc index 0a232808..b3eec66 100644 --- a/chrome/browser/extensions/extension_url_rewrite_browsertest.cc +++ b/chrome/browser/extensions/extension_url_rewrite_browsertest.cc
@@ -89,7 +89,8 @@ // Check that the actual and virtual URL corresponds to the new tab URL. EXPECT_EQ(local_ntp_test_utils::GetFinalNtpUrl(browser()->profile()), GetNavigationEntry()->GetVirtualURL()); - EXPECT_TRUE(search::IsNTPURL(GetNavigationEntry()->GetURL(), profile())); + EXPECT_TRUE( + search::IsNTPOrRelatedURL(GetNavigationEntry()->GetURL(), profile())); } IN_PROC_BROWSER_TEST_F(ExtensionURLRewriteBrowserTest, NewTabPageURLOverride) {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 08ec977..823f24f 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -75,7 +75,7 @@ }, { "name": "android-files-in-files-app", - // "owners": [ "your-team" ], + "owners": [ "fukino" ], "expiry_milestone": 76 }, {
diff --git a/chrome/browser/net/network_context_configuration_browsertest.cc b/chrome/browser/net/network_context_configuration_browsertest.cc index 6457366b..708b311 100644 --- a/chrome/browser/net/network_context_configuration_browsertest.cc +++ b/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -135,11 +135,6 @@ NetworkContextType network_context_type; }; -network::mojom::NetworkContextParamsPtr CreateDefaultNetworkContextParams() { - return g_browser_process->system_network_context_manager() - ->CreateDefaultNetworkContextParams(); -} - // Tests the system, profile, and incognito profile NetworkContexts. class NetworkContextConfigurationBrowserTest : public InProcessBrowserTest, @@ -1821,70 +1816,6 @@ } }; -// Start Chrome and check that PAC HTTPS path stripping is enabled. -IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationHttpsStrippingPacBrowserTest, - PRE_PacHttpsUrlStripping) { - if (IsRestartStateWithInProcessNetworkService()) - return; - ASSERT_FALSE(CreateDefaultNetworkContextParams() - ->dangerously_allow_pac_access_to_secure_urls); - - std::unique_ptr<network::ResourceRequest> request = - std::make_unique<network::ResourceRequest>(); - // This URL should be directed to the proxy that fails with - // ERR_TUNNEL_CONNECTION_FAILED. - request->url = GURL("https://does.not.resolve.test:1872/foo"); - - content::SimpleURLLoaderTestHelper simple_loader_helper; - std::unique_ptr<network::SimpleURLLoader> simple_loader = - network::SimpleURLLoader::Create(std::move(request), - TRAFFIC_ANNOTATION_FOR_TESTS); - - simple_loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie( - loader_factory(), simple_loader_helper.GetCallback()); - simple_loader_helper.WaitForCallback(); - EXPECT_FALSE(simple_loader_helper.response_body()); - EXPECT_EQ(net::ERR_TUNNEL_CONNECTION_FAILED, simple_loader->NetError()); - - // Disable stripping paths from HTTPS PAC URLs for the next test. - g_browser_process->local_state()->SetBoolean( - prefs::kPacHttpsUrlStrippingEnabled, false); - // Check that the changed setting is reflected in the network context params. - // The changes aren't applied to existing URLRequestContexts, however, so have - // to restart to see the setting change respected. - EXPECT_TRUE(CreateDefaultNetworkContextParams() - ->dangerously_allow_pac_access_to_secure_urls); -} - -// Restart Chrome and check the case where PAC HTTPS path stripping is disabled. -// Have to restart Chrome because the setting is only checked on NetworkContext -// creation. -// Flaky. See https://crbug.com/840127. -IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationHttpsStrippingPacBrowserTest, - DISABLED_PacHttpsUrlStripping) { - if (IsRestartStateWithInProcessNetworkService()) - return; - ASSERT_TRUE(CreateDefaultNetworkContextParams() - ->dangerously_allow_pac_access_to_secure_urls); - - std::unique_ptr<network::ResourceRequest> request = - std::make_unique<network::ResourceRequest>(); - // This URL should be directed to the proxy that fails with - // ERR_PROXY_CONNECTION_FAILED. - request->url = GURL("https://does.not.resolve.test:1872/foo"); - - content::SimpleURLLoaderTestHelper simple_loader_helper; - std::unique_ptr<network::SimpleURLLoader> simple_loader = - network::SimpleURLLoader::Create(std::move(request), - TRAFFIC_ANNOTATION_FOR_TESTS); - - simple_loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie( - loader_factory(), simple_loader_helper.GetCallback()); - simple_loader_helper.WaitForCallback(); - EXPECT_FALSE(simple_loader_helper.response_body()); - EXPECT_EQ(net::ERR_PROXY_CONNECTION_FAILED, simple_loader->NetError()); -} - // Instiates tests with a prefix indicating which NetworkContext is being // tested, and a suffix of "/0" if the network service is disabled, "/1" if it's // enabled, and "/2" if it's enabled and restarted.
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc index ea58c2f2..fbff648 100644 --- a/chrome/browser/net/system_network_context_manager.cc +++ b/chrome/browser/net/system_network_context_manager.cc
@@ -502,7 +502,6 @@ registry->RegisterBooleanPref(prefs::kEnableReferrers, true); registry->RegisterBooleanPref(prefs::kQuickCheckEnabled, true); - registry->RegisterBooleanPref(prefs::kPacHttpsUrlStrippingEnabled, true); } void SystemNetworkContextManager::OnNetworkServiceCreated( @@ -629,8 +628,6 @@ network_context_params->pac_quick_check_enabled = local_state_->GetBoolean(prefs::kQuickCheckEnabled); - network_context_params->dangerously_allow_pac_access_to_secure_urls = - !local_state_->GetBoolean(prefs::kPacHttpsUrlStrippingEnabled); // Use the SystemNetworkContextManager to populate and update SSL // configuration. The SystemNetworkContextManager is owned by the
diff --git a/chrome/browser/notifications/chrome_ash_message_center_client.cc b/chrome/browser/notifications/chrome_ash_message_center_client.cc index 154e721..6d80db99 100644 --- a/chrome/browser/notifications/chrome_ash_message_center_client.cc +++ b/chrome/browser/notifications/chrome_ash_message_center_client.cc
@@ -14,7 +14,7 @@ #include "chrome/browser/notifications/web_page_notifier_controller.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" -#include "chrome/browser/ui/chrome_pages.h" +#include "chrome/browser/ui/settings_window_manager_chromeos.h" #include "chrome/common/webui_url_constants.h" #include "components/user_manager/user_manager.h" #include "content/public/common/service_manager_connection.h" @@ -183,8 +183,8 @@ } void ChromeAshMessageCenterClient::ShowLockScreenNotificationSettings() { - chrome::ShowSettingsSubPageForProfile(ProfileManager::GetActiveUserProfile(), - chrome::kLockScreenSubPage); + chrome::SettingsWindowManager::GetInstance()->ShowOSSettings( + ProfileManager::GetActiveUserProfile(), chrome::kLockScreenSubPage); } void ChromeAshMessageCenterClient::OnIconImageUpdated(
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index c42eac89..7d6dfc0 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc
@@ -6689,13 +6689,14 @@ // Only the NTP should show. EXPECT_EQ(tab_strip->count(), 1); if (url.possibly_invalid_spec() != chrome::kChromeUINewTabURL) - EXPECT_TRUE(search::IsNTPURL(url, browser()->profile())) << url; + EXPECT_TRUE(search::IsNTPOrRelatedURL(url, browser()->profile())) + << url; break; case BooleanPolicy::kNotConfigured: case BooleanPolicy::kTrue: // One or more onboarding tabs should show. EXPECT_NE(url.possibly_invalid_spec(), chrome::kChromeUINewTabURL); - EXPECT_FALSE(search::IsNTPURL(url, browser()->profile())) << url; + EXPECT_FALSE(search::IsNTPOrRelatedURL(url, browser()->profile())) << url; break; } }
diff --git a/chrome/browser/prefs/chrome_command_line_pref_store.cc b/chrome/browser/prefs/chrome_command_line_pref_store.cc index 1388d19..102ed88 100644 --- a/chrome/browser/prefs/chrome_command_line_pref_store.cc +++ b/chrome/browser/prefs/chrome_command_line_pref_store.cc
@@ -86,7 +86,6 @@ {chromeos::switches::kEnableCastReceiver, prefs::kCastReceiverEnabled, true}, #endif - {switches::kUnsafePacUrl, prefs::kPacHttpsUrlStrippingEnabled, false}, {switches::kEnableLocalSyncBackend, syncer::prefs::kEnableLocalSyncBackend, true}, #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
diff --git a/chrome/browser/resources/chromeos/BUILD.gn b/chrome/browser/resources/chromeos/BUILD.gn index 941dfca..bd1e0a4 100644 --- a/chrome/browser/resources/chromeos/BUILD.gn +++ b/chrome/browser/resources/chromeos/BUILD.gn
@@ -42,10 +42,10 @@ "internet_detail_dialog:closure_compile", "kiosk_next_home:closure_compile", "login:closure_compile", - "md_set_time:closure_compile", "multidevice_setup:closure_compile", "network_ui:closure_compile", "select_to_speak:closure_compile", + "set_time_dialog:closure_compile", "smb_shares:closure_compile", "switch_access:closure_compile", "sys_internals:closure_compile",
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 9e34bd9..b4a303d 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -128,7 +128,7 @@ <translation id="1846771122725914429">ब्लूटूथ ब्रेल डिसप्ले</translation> <translation id="1865601187525349519">लेख का अंत</translation> <translation id="1876229593313240038">दस्तावेज़</translation> -<translation id="188130072164734898">वर्तमान समय और दिनांक बोलें.</translation> +<translation id="188130072164734898">वर्तमान समय और तारीख बोलें.</translation> <translation id="1902396333223336119">सेल</translation> <translation id="1903683160884433981">मध्यम बसंती हरा</translation> <translation id="1905379170753160525">शीर्षकों की सूची दिखाएं</translation> @@ -162,7 +162,7 @@ किए जा सकने वाले ब्रेल प्रदर्शन का आउटपुट की नकल प्रस्तुत करता है.</translation> <translation id="2163782704988363449">गलतियां</translation> <translation id="2169714232367507776">वर्तमान आइटम पर क्लिक करें</translation> -<translation id="2179452035581866348">ChromeVox आपको आवश्यक और अतिरिक्त जानकारी देने के लिए ध्वनियों का उपयोग करता है. हर ध्वनि का क्या अर्थ है, इसे सीखकर आप अधिक तेज़ी से नेविगेट करने के लिए इन ध्वनियों का उपयोग कर सकते हैं. अपने आपको सहज महसूस करने पर आप बोली में विस्तृत विवरणों को बंद कर सकते हैं और पेज के बारे में आवश्यक जानकारी के लिए उन पर विश्वास कर सकते हैं. यहां ध्वनियों की पूरी सूची और उनके अर्थ दिए गए हैं.</translation> +<translation id="2179452035581866348">ChromeVox आपको आवश्यक और अतिरिक्त जानकारी देने के लिए ध्वनियों का उपयोग करता है. हर ध्वनि का क्या अर्थ है, इसे सीखकर आप ज़्यादा तेज़ी से नेविगेट करने के लिए इन ध्वनियों का उपयोग कर सकते हैं. अपने आपको सहज महसूस करने पर आप बोली में विस्तृत विवरणों को बंद कर सकते हैं और पेज के बारे में आवश्यक जानकारी के लिए उन पर विश्वास कर सकते हैं. यहां ध्वनियों की पूरी सूची और उनके अर्थ दिए गए हैं.</translation> <translation id="2188751878842439466">{COUNT,plural, =1{बंद कोष्ठक}one{# बंद कोष्ठक}other{# बंद कोष्ठक}}</translation> <translation id="2197863150503783129">सैडल ब्राउन</translation> <translation id="2199994615414171367">पिछला गणित</translation> @@ -177,7 +177,7 @@ <translation id="2314393392395134769">सबस्क्रिप्ट नहीं है</translation> <translation id="2318372665160196757">मुख्य</translation> <translation id="2329324941084714723">टैब फलक</translation> -<translation id="2344193891939537199">दिनांक समय नियंत्रण</translation> +<translation id="2344193891939537199">तारीख समय नियंत्रण</translation> <translation id="2347456970887948350">लिंक</translation> <translation id="2359897517538099099">तालिका मोड में नहीं है.</translation> <translation id="2381733276052567791">बोली को चालू या बंद पर टॉगल करें</translation> @@ -456,7 +456,7 @@ <translation id="4218529045364428769">{COUNT,plural, =1{डैश}one{# डैश}other{# डैश}}</translation> <translation id="421884353938374759">रंग पिकर</translation> <translation id="4221071177874897997">बोल्ड दिखाएं:</translation> -<translation id="4229646983878045487">दिनांक समय</translation> +<translation id="4229646983878045487">तारीख समय</translation> <translation id="4230834257931120629">हल्का स्लेटी</translation> <translation id="4231102694147661229">डेवलपर विकल्प चालू करें</translation> <translation id="423334822609210999">कोई बायां सेल नहीं.</translation> @@ -466,7 +466,7 @@ <translation id="4254798249533888099">ट्री</translation> <translation id="4255943572433203166">ChromeVox को कस्टमाइज़ करने के लिए नीचे दिए गए विकल्पों का उपयोग करें. बदलाव तुरंत लागू हो जाते हैं.</translation> <translation id="4271220233568730077">अगला गणित</translation> -<translation id="4271521365602459209">और अधिक परिणाम नहीं.</translation> +<translation id="4271521365602459209">और ज़्यादा परिणाम नहीं.</translation> <translation id="4275397969489577657">इवेंट स्ट्रीम में लॉग इन करना चालू करें</translation> <translation id="4281245629646759298">हल्का पीला</translation> <translation id="4287520460805643128">कोई अगला लेख नहीं.</translation> @@ -477,7 +477,7 @@ <translation id="4342180618051828363">{COUNT,plural, =1{बिंदु}=3{पदलोप चिह्न}one{# बिंदु}other{# बिंदु}}</translation> <translation id="4347461890115250064">कोई अगली सूची नहीं.</translation> <translation id="4367650418938037324">गणित ML लीफ़</translation> -<translation id="4372435075475052704">न्यूनतम:<ph name="X" /></translation> +<translation id="4372435075475052704">कम से कम:<ph name="X" /></translation> <translation id="4372705107434148843">बोली रोकें</translation> <translation id="4373197658375206385">कोई पिछला आइटम नहीं जो लिंक नहीं है.</translation> <translation id="4376316291247992553">ग्राफिक को ब्रेल के रूप में देखें</translation> @@ -683,7 +683,7 @@ <translation id="5729047866208036762">गणित के बारे में और जानने के लिए ऊपर, नीचे, बाएं या दाएं वाले तीर दबाएं.</translation> <translation id="5732189279857692565">यह दूसरा शीर्षक है. आगे बढ़ते रहें; Search+H या Search+Shift+H दबाएं</translation> <translation id="5748623122140342504">पिछला लेवल 5 का शीर्षक</translation> -<translation id="5750633686117194034">कोई संशोधक नहीं दबाया गया; कृपया एक या अधिक संशोधक दबाकर रखें; पूर्ण हो जाने पर अपनी अंगुलियां उठा लें और आपको सुनाई देगा कि कुंजियां सेट हो गई हैं. बाहर निकलने के लिए टैब दबाएं.</translation> +<translation id="5750633686117194034">कोई संशोधक नहीं दबाया गया; कृपया एक या ज़्यादा संशोधक दबाकर रखें; पूर्ण हो जाने पर अपनी अंगुलियां उठा लें और आपको सुनाई देगा कि कुंजियां सेट हो गई हैं. बाहर निकलने के लिए टैब दबाएं.</translation> <translation id="5760594853119905566">परिशिष्ट</translation> <translation id="5788275253279308023">गुप्त विंडो, <ph name="TITLE" />, टैब</translation> <translation id="5805940204952508776">दो उंगलियों से टैप करें</translation> @@ -825,7 +825,7 @@ <translation id="6871161210040114857">केस को अनदेखा करना.</translation> <translation id="6877435256196695200">कोई अगला ग्राफ़िक नहीं.</translation> <translation id="6897341342232909480">बाएं ले जाएं</translation> -<translation id="6901540140423170855">दिनांक</translation> +<translation id="6901540140423170855">तारीख</translation> <translation id="6910211073230771657">हटाया गया</translation> <translation id="6910969481785184048">चालू करें, बंद करें और रोकें</translation> <translation id="6911965441508464308">ऊपर कोई सेल नहीं.</translation> @@ -1128,7 +1128,7 @@ <translation id="8587549812518406253">अगला सूची आइटम</translation> <translation id="860150890330522909"><ph name="NAME" />, चेकबॉक्स चेक किया गया</translation> <translation id="8603071050456974042">ChromeVox फलक</translation> -<translation id="8606621670302093223">दिनांक नियंत्रण</translation> +<translation id="8606621670302093223">तारीख नियंत्रण</translation> <translation id="8613709718990529335">शोरबे जैसा रंग</translation> <translation id="8628186274519446680">टमाटर जैसा रंग</translation> <translation id="8631359288236106450">चयनित <ph name="COUNT" /> आइटम</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb index 841e6c9..52e5c09 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -604,7 +604,7 @@ <translation id="520883772648104506">Geen volgend keuzerondje.</translation> <translation id="5263034204789987535">Maïsgeel</translation> <translation id="5263344797180442561">k2</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Beëindigen</translation> <translation id="5291783959063340370">Object</translation> <translation id="5302089807023311274">Bibliografiereferentie</translation> <translation id="5304943142864553931">tabblad <ph name="TITLE" /></translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb index fef9e21..e6face6 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -605,7 +605,7 @@ <translation id="520883772648104506">Det finnes ikke flere alternativknapper.</translation> <translation id="5263034204789987535">Lys maisgul</translation> <translation id="5263344797180442561">h2</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Avslutt</translation> <translation id="5291783959063340370">Objekt</translation> <translation id="5302089807023311274">Bibliografireferanse</translation> <translation id="5304943142864553931"><ph name="TITLE" />-fane</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb index 17af1f3b..36a9cc5 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
@@ -605,7 +605,7 @@ <translation id="520883772648104506">Nenhum botão de opção a seguir.</translation> <translation id="5263034204789987535">Amarelo-seda</translation> <translation id="5263344797180442561">h2</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Fim</translation> <translation id="5291783959063340370">Objeto</translation> <translation id="5302089807023311274">Referência bibliográfica</translation> <translation id="5304943142864553931"><ph name="TITLE" />, tab</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb index 1bb9930..9302a3e 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -601,7 +601,7 @@ <translation id="520883772648104506">அடுத்த ரேடியோ பட்டன் இல்லை.</translation> <translation id="5263034204789987535">கார்ன்சில்க்</translation> <translation id="5263344797180442561">h2</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">நிறுத்து</translation> <translation id="5291783959063340370">பொருள்</translation> <translation id="5302089807023311274">நூல்விவர அட்டவணை மேற்கோள்</translation> <translation id="5304943142864553931"><ph name="TITLE" />, தாவல்</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb index 91c5ea2..647474a4 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
@@ -604,7 +604,7 @@ <translation id="520883772648104506">不存在下一个单选按钮。</translation> <translation id="5263034204789987535">玉米丝色</translation> <translation id="5263344797180442561">2级标题标记</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">结束</translation> <translation id="5291783959063340370">对象</translation> <translation id="5302089807023311274">参考书目</translation> <translation id="5304943142864553931">切换到名为“<ph name="TITLE" />”的标签页</translation>
diff --git a/chrome/browser/resources/chromeos/md_set_time/BUILD.gn b/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn similarity index 92% rename from chrome/browser/resources/chromeos/md_set_time/BUILD.gn rename to chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn index b4b2593b6..7e924f7 100644 --- a/chrome/browser/resources/chromeos/md_set_time/BUILD.gn +++ b/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn
@@ -6,12 +6,12 @@ js_type_check("closure_compile") { deps = [ - ":set_time", ":set_time_browser_proxy", + ":set_time_dialog", ] } -js_library("set_time") { +js_library("set_time_dialog") { deps = [ ":set_time_browser_proxy", "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
diff --git a/chrome/browser/resources/chromeos/md_set_time/set_time_browser_proxy.html b/chrome/browser/resources/chromeos/set_time_dialog/set_time_browser_proxy.html similarity index 100% rename from chrome/browser/resources/chromeos/md_set_time/set_time_browser_proxy.html rename to chrome/browser/resources/chromeos/set_time_dialog/set_time_browser_proxy.html
diff --git a/chrome/browser/resources/chromeos/md_set_time/set_time_browser_proxy.js b/chrome/browser/resources/chromeos/set_time_dialog/set_time_browser_proxy.js similarity index 100% rename from chrome/browser/resources/chromeos/md_set_time/set_time_browser_proxy.js rename to chrome/browser/resources/chromeos/set_time_dialog/set_time_browser_proxy.js
diff --git a/chrome/browser/resources/chromeos/md_set_time/set_time.html b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.html similarity index 96% rename from chrome/browser/resources/chromeos/md_set_time/set_time.html rename to chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.html index 7fb4a8a3..693dca1 100644 --- a/chrome/browser/resources/chromeos/md_set_time/set_time.html +++ b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.html
@@ -23,7 +23,7 @@ </head> <body> - <dom-module id="set-time"> + <dom-module id="set-time-dialog"> <template> <style include="cr-shared-style md-select paper-button-style"> :host { @@ -145,10 +145,10 @@ </div> </cr-dialog> </template> - <script src="set_time.js"></script> + <script src="set_time_dialog.js"></script> </dom-module> - <set-time></set-time> + <set-time-dialog></set-time-dialog> </body> </html>
diff --git a/chrome/browser/resources/chromeos/md_set_time/set_time.js b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js similarity index 96% rename from chrome/browser/resources/chromeos/md_set_time/set_time.js rename to chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js index ce6d006..2a0cfaa 100644 --- a/chrome/browser/resources/chromeos/md_set_time/set_time.js +++ b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js
@@ -4,10 +4,10 @@ /** * @fileoverview - * 'set-time' handles a dialog to check and set system time. It can also + * 'set-time-dialog' handles a dialog to check and set system time. It can also * include a timezone dropdown if timezoneId is provided. * - * 'set-time' uses the system time to populate the controls initially and + * 'set-time-dialog' uses the system time to populate the controls initially and * update them as the system time or timezone changes, and notifies Chrome * when the user changes the time or timezone. */ @@ -79,7 +79,7 @@ } Polymer({ - is: 'set-time', + is: 'set-time-dialog', // Remove listeners on detach. behaviors: [WebUIListenerBehavior],
diff --git a/chrome/browser/resources/chromeos/switch_access/commands.js b/chrome/browser/resources/chromeos/switch_access/commands.js index faa0909..e48fdcba1 100644 --- a/chrome/browser/resources/chromeos/switch_access/commands.js +++ b/chrome/browser/resources/chromeos/switch_access/commands.js
@@ -12,72 +12,75 @@ constructor(switchAccess) { /** * SwitchAccess reference. - * * @private {SwitchAccessInterface} */ this.switchAccess_ = switchAccess; /** - * A map from command name to the default key code and function binding for - * the command. - * - * @private {!Object<string, {keyCode: string, callback:function(): void}>} + * A map from command name to the function binding for the command. + * @private {!Map<!SAConstants.Command, !function(): void>} */ this.commandMap_ = this.buildCommandMap_(); - } - /** - * Return a list of the names of all user commands. - * - * @return {!Array<string>} - */ - getCommands() { - return Object.keys(this.commandMap_); + /** + * A map from the command name to the default key code for the command. + * @private {!Map<!SAConstants.Command, number>} + */ + this.defaultKeyCodeMap_ = this.buildDefaultKeyCodeMap_(); } /** * Return the default key code for a command. - * - * @param {string} command + * @param {!SAConstants.Command} command * @return {number} */ getDefaultKeyCodeFor(command) { - return this.commandMap_[command]['defaultKeyCode']; + return this.defaultKeyCodeMap_.get(command); } /** * Run the function binding for the specified command. - * - * @param {string} command + * @param {!SAConstants.Command} command */ runCommand(command) { - this.commandMap_[command]['binding'](); + this.commandMap_.get(command)(); } /** - * Build the object that maps from command name to the default key code and - * function binding for the command. - * - * @return {!Object<string, {keyCode: string, callback: function(): void}>} + * Build a map from command name to the function binding for the command. + * @return {!Map<!SAConstants.Command, !function(): void>} */ buildCommandMap_() { - return { - 'next': { - 'defaultKeyCode': 51, /* '3' key */ - 'binding': this.switchAccess_.moveForward.bind(this.switchAccess_) - }, - 'previous': { - 'defaultKeyCode': 50, /* '2' key */ - 'binding': this.switchAccess_.moveBackward.bind(this.switchAccess_) - }, - 'select': { - 'defaultKeyCode': 49, /* '1' key */ - 'binding': this.switchAccess_.selectCurrentNode.bind(this.switchAccess_) - }, - 'menu': { - 'defaultKeyCode': 52, /* '4' key */ - 'binding': this.switchAccess_.enterMenu.bind(this.switchAccess_) - } - }; + return new Map([ + [ + SAConstants.Command.MENU, + this.switchAccess_.enterMenu.bind(this.switchAccess_) + ], + [ + SAConstants.Command.NEXT, + this.switchAccess_.moveForward.bind(this.switchAccess_) + ], + [ + SAConstants.Command.PREVIOUS, + this.switchAccess_.moveBackward.bind(this.switchAccess_) + ], + [ + SAConstants.Command.SELECT, + this.switchAccess_.selectCurrentNode.bind(this.switchAccess_) + ] + ]); + } + + /** + * Build a map from command name to the default key code for the command. + * @return {!Map<!SAConstants.Command, number>} + */ + buildDefaultKeyCodeMap_() { + return new Map([ + [SAConstants.Command.MENU, '1'.charCodeAt(0)], + [SAConstants.Command.NEXT, '3'.charCodeAt(0)], + [SAConstants.Command.PREVIOUS, '2'.charCodeAt(0)], + [SAConstants.Command.SELECT, '0'.charCodeAt(0)] + ]); } }
diff --git a/chrome/browser/resources/chromeos/switch_access/options.js b/chrome/browser/resources/chromeos/switch_access/options.js index 7b62d789..51397aa 100644 --- a/chrome/browser/resources/chromeos/switch_access/options.js +++ b/chrome/browser/resources/chromeos/switch_access/options.js
@@ -118,7 +118,7 @@ document.getElementById(key).value = newValue / 1000; break; default: - if (this.switchAccess_.getCommands().includes(key)) + if (this.switchAccess_.hasCommand(key)) document.getElementById(key).value = String.fromCharCode(newValue); } }
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access.js b/chrome/browser/resources/chromeos/switch_access/switch_access.js index 0d2a235..806cbef 100644 --- a/chrome/browser/resources/chromeos/switch_access/switch_access.js +++ b/chrome/browser/resources/chromeos/switch_access/switch_access.js
@@ -124,16 +124,25 @@ /** * Return a list of the names of all user commands. * @override - * @return {!Array<string>} + * @return {!Array<!SAConstants.Command>} */ getCommands() { - return this.commands_.getCommands(); + return Object.values(SAConstants.Command); + } + + /** + * Checks if the given string is a valid Switch Access command. + * @param {string} command + * @return {boolean} + */ + hasCommand(command) { + return Object.values(SAConstants.Command).includes(command); } /** * Return the default key code for a command. * @override - * @param {string} command + * @param {!SAConstants.Command} command * @return {number} */ getDefaultKeyCodeFor(command) { @@ -158,7 +167,7 @@ /** * Run the function binding for the specified command. * @override - * @param {string} command + * @param {!SAConstants.Command} command */ runCommand(command) { this.commands_.runCommand(command); @@ -187,7 +196,7 @@ this.autoScanManager_.setScanTime(changes[key]); break; default: - if (this.commands_.getCommands().includes(key)) + if (this.hasCommand(key)) this.keyEventHandler_.updateSwitchAccessKeys(); } }
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js b/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js index fda7c9c..a123fe8 100644 --- a/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js +++ b/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js
@@ -79,6 +79,13 @@ KEY_PRESS_DURATION_MS: 100, /** + * Commands that can be assigned to specific switches. + * @enum {string} + * @const + */ + Command: {MENU: 'menu', NEXT: 'next', PREVIOUS: 'previous', SELECT: 'select'}, + + /** * Actions available in the Switch Access Menu. * @enum {string} * @const
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access_interface.js b/chrome/browser/resources/chromeos/switch_access/switch_access_interface.js index 39889fc..ee75605 100644 --- a/chrome/browser/resources/chromeos/switch_access/switch_access_interface.js +++ b/chrome/browser/resources/chromeos/switch_access/switch_access_interface.js
@@ -34,14 +34,21 @@ /** * Return a list of the names of all user commands. - * @return {!Array<string>} + * @return {!Array<!SAConstants.Command>} */ getCommands() {} /** + * Checks if the given string is a valid Switch Access command. + * @param {string} command + * @return {boolean} + */ + hasCommand(command) {} + + /** * Return the default key code for a command. * - * @param {string} command + * @param {!SAConstants.Command} command * @return {number} */ getDefaultKeyCodeFor(command) {} @@ -59,7 +66,7 @@ /** * Run the function binding for the specified command. - * @param {string} command + * @param {!SAConstants.Command} command */ runCommand(command) {}
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.css b/chrome/browser/resources/local_ntp/custom_backgrounds.css index ab8067d..61fae0a 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.css +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.css
@@ -640,6 +640,7 @@ color: white; font-weight: 500; left: 16px; + max-width: 80%; padding: 8px 8px 8px 8px; position: fixed; text-shadow: 0 0 16px rgba(0, 0, 0, 0.3); @@ -652,26 +653,26 @@ right: 16px; } -.attr1 { +.attr-common { font-size: 13px; height: 20px; line-height: 20px; + overflow: hidden; + text-overflow: ellipsis; vertical-align: middle; + white-space: nowrap; + width: -webkit-fill-available; } -.attr2 { +.attr-common.attr-small { font-size: 11px; - height: 20px; - line-height: 20px; - vertical-align: middle; } #custom-bg-attr.attr-link:hover { background: rgba(var(--GG900-rgb), .1); } -.attr1.attr-link, -.attr2.attr-link { +.attr-link { display: inline-block; text-decoration: underline; }
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.js b/chrome/browser/resources/local_ntp/custom_backgrounds.js index d40e3540..06bf99c 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.js +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.js
@@ -69,6 +69,8 @@ * @const */ customBackgrounds.IDS = { + ATTR1: 'attr1', + ATTR2: 'attr2', ATTRIBUTIONS: 'custom-bg-attr', BACK: 'bg-sel-back', BACK_CIRCLE: 'bg-sel-back-circle', @@ -107,8 +109,8 @@ * @const */ customBackgrounds.CLASSES = { - ATTR_1: 'attr1', - ATTR_2: 'attr2', + ATTR_SMALL: 'attr-small', + ATTR_COMMON: 'attr-common', ATTR_LINK: 'attr-link', COLLECTION_DIALOG: 'is-col-sel', COLLECTION_SELECTED: 'bg-selected', // Highlight selected tile @@ -220,17 +222,21 @@ attributionLine1, attributionLine2, attributionActionUrl) { var attributionBox = $(customBackgrounds.IDS.ATTRIBUTIONS); var attr1 = document.createElement('div'); + attr1.setAttribute('id', customBackgrounds.IDS.ATTR1); var attr2 = document.createElement('div'); + attr2.setAttribute('id', customBackgrounds.IDS.ATTR2); + if (attributionLine1 !== '') { // Shouldn't be changed from textContent for security assurances. attr1.textContent = attributionLine1; - attr1.classList.add(customBackgrounds.CLASSES.ATTR_1); + attr1.classList.add(customBackgrounds.CLASSES.ATTR_COMMON); $(customBackgrounds.IDS.ATTRIBUTIONS).appendChild(attr1); } if (attributionLine2 !== '') { // Shouldn't be changed from textContent for security assurances. attr2.textContent = attributionLine2; - attr2.classList.add(customBackgrounds.CLASSES.ATTR_2); + attr2.classList.add(customBackgrounds.CLASSES.ATTR_SMALL); + attr2.classList.add(customBackgrounds.CLASSES.ATTR_COMMON); attributionBox.appendChild(attr2); } if (attributionActionUrl !== '') {
diff --git a/chrome/browser/search/search.cc b/chrome/browser/search/search.cc index 92a4b2b5..f19f0b9 100644 --- a/chrome/browser/search/search.cc +++ b/chrome/browser/search/search.cc
@@ -128,7 +128,7 @@ // Returns true if |url| matches the NTP URL or the URL of the NTP's associated // service worker. -bool IsNTPOrServiceWorkerURL(const GURL& url, Profile* profile) { +bool IsNTPOrRelatedURLHelper(const GURL& url, Profile* profile) { if (!url.is_valid()) return false; @@ -137,6 +137,12 @@ IsMatchingServiceWorker(url, new_tab_url)); } +GURL RemoveQueryParam(const GURL& url) { + url::Replacements<char> replacements; + replacements.ClearQuery(); + return url.ReplaceComponents(replacements); +} + bool IsURLAllowedForSupervisedUser(const GURL& url, Profile* profile) { #if BUILDFLAG(ENABLE_SUPERVISED_USERS) // If this isn't a supervised user, skip the URL filter check, since it can be @@ -258,16 +264,16 @@ SearchEngineType::SEARCH_ENGINE_GOOGLE; } -bool IsNTPURL(const GURL& url, Profile* profile) { +bool IsNTPOrRelatedURL(const GURL& url, Profile* profile) { if (!url.is_valid()) return false; if (!IsInstantExtendedAPIEnabled()) return url == chrome::kChromeUINewTabURL; - // TODO(crbug.com/624410): Tolerate query params when detecting local NTPs. - return profile && (IsNTPOrServiceWorkerURL(url, profile) || - url == chrome::kChromeSearchLocalNtpUrl); + GURL url_no_params = RemoveQueryParam(url); + return profile && (IsNTPOrRelatedURLHelper(url, profile) || + url_no_params == chrome::kChromeSearchLocalNtpUrl); } bool IsInstantNTP(content::WebContents* contents) { @@ -300,8 +306,8 @@ if (!IsInstantExtendedAPIEnabled()) return false; - // TODO(crbug.com/624410): Tolerate query params when detecting local NTPs. - if (url == chrome::kChromeSearchLocalNtpUrl) + GURL url_no_params = RemoveQueryParam(url); + if (url_no_params == chrome::kChromeSearchLocalNtpUrl) return true; GURL new_tab_url(GetNewTabPageURL(profile)); @@ -317,7 +323,7 @@ bool ShouldAssignURLToInstantRenderer(const GURL& url, Profile* profile) { return url.is_valid() && profile && IsInstantExtendedAPIEnabled() && (url.SchemeIs(chrome::kChromeSearchScheme) || - IsNTPOrServiceWorkerURL(url, profile)); + IsNTPOrRelatedURLHelper(url, profile)); } bool ShouldUseProcessPerSiteForInstantURL(const GURL& url, Profile* profile) {
diff --git a/chrome/browser/search/search.h b/chrome/browser/search/search.h index fc652f6..d10fb2f 100644 --- a/chrome/browser/search/search.h +++ b/chrome/browser/search/search.h
@@ -31,11 +31,8 @@ bool DefaultSearchProviderIsGoogle( const TemplateURLService* template_url_service); -// Returns true if |url| corresponds to a New Tab page. -// TODO(crbug.com/624410): This is confusingly named, as it includes URLs that -// are related to an NTP, but aren't an NTP themselves (such as the NTP's -// service worker). -bool IsNTPURL(const GURL& url, Profile* profile); +// Returns true if |url| corresponds to a New Tab page or its service worker. +bool IsNTPOrRelatedURL(const GURL& url, Profile* profile); // Returns true if the active navigation entry of |contents| is a New Tab page // rendered in an Instant process. This is the last committed entry if it
diff --git a/chrome/browser/search/search_unittest.cc b/chrome/browser/search/search_unittest.cc index b210bea..dcb9f82 100644 --- a/chrome/browser/search/search_unittest.cc +++ b/chrome/browser/search/search_unittest.cc
@@ -108,6 +108,7 @@ // Only NTPs (both local and remote) should be assigned to Instant renderers. const SearchTestCase kTestCases[] = { {chrome::kChromeSearchLocalNtpUrl, true, "Local NTP"}, + {"chrome-search://local-ntp/local-ntp.html?bar=abc", true, "Local NTP"}, {"https://foo.com/newtab", true, "Remote NTP"}, {"https://foo.com/instant", false, "Instant support was removed"}, {"https://foo.com/url", false, "Instant support was removed"}, @@ -266,6 +267,8 @@ {"chrome-search://foo", false, "Chrome-search scheme"}, {"https://bar.com/instant", false, "Random non-search page"}, {chrome::kChromeSearchLocalNtpUrl, true, "Local new tab page"}, + {"chrome-search://local-ntp/local-ntp.html?bar=abc", true, + "Local new tab page"}, {"https://foo.com/newtab", true, "New tab URL"}, {"http://foo.com/newtab", false, "Insecure New tab URL"}, }; @@ -384,31 +387,34 @@ } #endif -TEST_F(SearchTest, IsNTPURL) { +TEST_F(SearchTest, IsNTPOrRelatedURL) { GURL invalid_url; GURL ntp_url(chrome::kChromeUINewTabURL); GURL local_ntp_url(chrome::kChromeSearchLocalNtpUrl); + GURL local_ntp_url_with_param( + "chrome-search://local-ntp/local-ntp.html?bar=abc"); - EXPECT_FALSE(IsNTPURL(invalid_url, profile())); + EXPECT_FALSE(IsNTPOrRelatedURL(invalid_url, profile())); GURL remote_ntp_url(GetNewTabPageURL(profile())); GURL remote_ntp_service_worker_url("https://foo.com/newtab-serviceworker.js"); GURL search_url_with_search_terms("https://foo.com/url?bar=abc"); GURL search_url_without_search_terms("https://foo.com/url?bar"); - EXPECT_FALSE(IsNTPURL(ntp_url, profile())); - EXPECT_TRUE(IsNTPURL(local_ntp_url, profile())); - EXPECT_TRUE(IsNTPURL(remote_ntp_url, profile())); - EXPECT_TRUE(IsNTPURL(remote_ntp_service_worker_url, profile())); - EXPECT_FALSE(IsNTPURL(search_url_with_search_terms, profile())); - EXPECT_FALSE(IsNTPURL(search_url_without_search_terms, profile())); + EXPECT_FALSE(IsNTPOrRelatedURL(ntp_url, profile())); + EXPECT_TRUE(IsNTPOrRelatedURL(local_ntp_url, profile())); + EXPECT_TRUE(IsNTPOrRelatedURL(local_ntp_url_with_param, profile())); + EXPECT_TRUE(IsNTPOrRelatedURL(remote_ntp_url, profile())); + EXPECT_TRUE(IsNTPOrRelatedURL(remote_ntp_service_worker_url, profile())); + EXPECT_FALSE(IsNTPOrRelatedURL(search_url_with_search_terms, profile())); + EXPECT_FALSE(IsNTPOrRelatedURL(search_url_without_search_terms, profile())); - EXPECT_FALSE(IsNTPURL(ntp_url, NULL)); - EXPECT_FALSE(IsNTPURL(local_ntp_url, NULL)); - EXPECT_FALSE(IsNTPURL(remote_ntp_url, NULL)); - EXPECT_FALSE(IsNTPURL(remote_ntp_service_worker_url, NULL)); - EXPECT_FALSE(IsNTPURL(search_url_with_search_terms, NULL)); - EXPECT_FALSE(IsNTPURL(search_url_without_search_terms, NULL)); + EXPECT_FALSE(IsNTPOrRelatedURL(ntp_url, NULL)); + EXPECT_FALSE(IsNTPOrRelatedURL(local_ntp_url, NULL)); + EXPECT_FALSE(IsNTPOrRelatedURL(remote_ntp_url, NULL)); + EXPECT_FALSE(IsNTPOrRelatedURL(remote_ntp_service_worker_url, NULL)); + EXPECT_FALSE(IsNTPOrRelatedURL(search_url_with_search_terms, NULL)); + EXPECT_FALSE(IsNTPOrRelatedURL(search_url_without_search_terms, NULL)); } // Regression test for https://crbug.com/605720: Set up a search provider backed
diff --git a/chrome/browser/ssl/ssl_error_controller_client.cc b/chrome/browser/ssl/ssl_error_controller_client.cc index 40964714..8f1272b 100644 --- a/chrome/browser/ssl/ssl_error_controller_client.cc +++ b/chrome/browser/ssl/ssl_error_controller_client.cc
@@ -32,7 +32,8 @@ #if defined(OS_CHROMEOS) #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/ui/chrome_pages.h" +#include "chrome/browser/ui/settings_window_manager_chromeos.h" +#include "chrome/common/webui_url_constants.h" #endif #if defined(OS_WIN) @@ -232,8 +233,8 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); #if defined(OS_CHROMEOS) - chrome::ShowSettingsSubPageForProfile(ProfileManager::GetActiveUserProfile(), - chrome::kDateTimeSubPage); + chrome::SettingsWindowManager::GetInstance()->ShowOSSettings( + ProfileManager::GetActiveUserProfile(), chrome::kDateTimeSubPage); #else base::PostTaskWithTraits(FROM_HERE, {base::TaskPriority::USER_VISIBLE, base::MayBlock()},
diff --git a/chrome/browser/themes/browser_theme_pack.cc b/chrome/browser/themes/browser_theme_pack.cc index 259935cea..c0a880c 100644 --- a/chrome/browser/themes/browser_theme_pack.cc +++ b/chrome/browser/themes/browser_theme_pack.cc
@@ -56,9 +56,10 @@ // Version number of the current theme pack. We just throw out and rebuild // theme packs that aren't int-equal to this. Increment this number if you -// change default theme assets or if you need themes to recreate their generated -// images (which are cached). -const int kThemePackVersion = 63; +// change default theme assets, if you need themes to recreate their generated +// images (which are cached), or if you changed how missing values are +// generated. +const int kThemePackVersion = 64; // IDs that are in the DataPack won't clash with the positive integer // uint16_t. kHeaderID should always have the maximum value because we want the
diff --git a/chrome/browser/ui/OWNERS b/chrome/browser/ui/OWNERS index 744ff0a..51b794a 100644 --- a/chrome/browser/ui/OWNERS +++ b/chrome/browser/ui/OWNERS
@@ -21,6 +21,6 @@ per-file avatar_*=file://components/signin/OWNERS per-file signin_*=file://components/signin/OWNERS -per-file settings_window_manager_chromeos*=file://chrome/browser/ui/ash/OWNERS +per-file settings_window_manager*chromeos*=file://chrome/browser/ui/ash/OWNERS # COMPONENT: UI>Browser
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.cc b/chrome/browser/ui/app_list/app_list_syncable_service.cc index 45d88b1..e7a8a65a 100644 --- a/chrome/browser/ui/app_list/app_list_syncable_service.cc +++ b/chrome/browser/ui/app_list/app_list_syncable_service.cc
@@ -275,6 +275,20 @@ is_app_service_enabled_( base::FeatureList::IsEnabled(features::kAppServiceAsh)), weak_ptr_factory_(this) { + // This log message helps us gather better manual bug reports, as we + // gradually roll out enabling the AppList + AppService integration across + // Chrome OS' various release channels. + // + // Asking users to inspect chrome://flags/#app-service-ash isn't enough, as + // that UI can display just "Default" without detailing whether the default + // is to enable or disable. Instead, we can ask them to inspect + // file:///var/log/chrome/chrome for this log message. + // + // TODO(crbug.com/826982): remove this log message once the roll out is + // complete, hopefully by mid-2019. + VLOG(1) << "AppList + AppService integration: " + << (is_app_service_enabled_ ? "enabled" : "disabled"); + if (g_model_updater_factory_callback_for_test_) model_updater_ = g_model_updater_factory_callback_for_test_->Run(); else @@ -729,7 +743,7 @@ } void AppListSyncableService::ResolveFolderPositions() { - VLOG(1) << "ResolveFolderPositions."; + VLOG(2) << "ResolveFolderPositions."; for (const auto& sync_pair : sync_items_) { SyncItem* sync_item = sync_pair.second.get(); if (sync_item->item_type != sync_pb::AppListSpecifics::TYPE_FOLDER) @@ -753,7 +767,7 @@ return; if (oem_folder) { - VLOG(1) << "Creating new OEM folder sync item: " + VLOG(2) << "Creating new OEM folder sync item: " << oem_folder->position().ToDebugString(); self->CreateSyncItemFromAppItem(oem_folder); } @@ -824,7 +838,7 @@ syncer::SyncMergeResult result = syncer::SyncMergeResult(type); result.set_num_items_before_association(sync_items_.size()); - VLOG(1) << this << ": MergeDataAndStartSyncing: " << initial_sync_data.size(); + VLOG(2) << this << ": MergeDataAndStartSyncing: " << initial_sync_data.size(); // Copy all sync items to |unsynced_items|. std::set<std::string> unsynced_items; @@ -889,15 +903,15 @@ model_updater_->FindItem(sync_item->item_id); if (app_item) { if (UpdateSyncItemFromAppItem(app_item, sync_item)) { - VLOG(1) << "Fixing sync item from existing app: " << sync_item; + VLOG(2) << "Fixing sync item from existing app: " << sync_item; } else { sync_item->item_ordinal = syncer::StringOrdinal::CreateInitialOrdinal(); - VLOG(1) << "Failed to fix sync item from existing app. " + VLOG(2) << "Failed to fix sync item from existing app. " << "Generating new position ordinal: " << sync_item; } } else { sync_item->item_ordinal = syncer::StringOrdinal::CreateInitialOrdinal(); - VLOG(1) << "Fixing sync item by generating new position ordinal: " + VLOG(2) << "Fixing sync item by generating new position ordinal: " << sync_item; } change_list.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_UPDATE, @@ -922,7 +936,7 @@ syncer::ModelType type) const { DCHECK_EQ(syncer::APP_LIST, type); - VLOG(1) << this << ": GetAllSyncData: " << sync_items_.size(); + VLOG(2) << this << ": GetAllSyncData: " << sync_items_.size(); syncer::SyncDataList list; for (auto iter = sync_items_.begin(); iter != sync_items_.end(); ++iter) { VLOG(2) << this << " -> SYNC: " << iter->second->ToString(); @@ -942,7 +956,7 @@ HandleUpdateStarted(); - VLOG(1) << this << ": ProcessSyncChanges: " << change_list.size(); + VLOG(2) << this << ": ProcessSyncChanges: " << change_list.size(); for (syncer::SyncChangeList::const_iterator iter = change_list.begin(); iter != change_list.end(); ++iter) { const SyncChange& change = *iter; @@ -1027,7 +1041,7 @@ return; } case sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP: { - VLOG(1) << this << ": Uninstall: " << sync_item->ToString(); + VLOG(2) << this << ": Uninstall: " << sync_item->ToString(); UninstallExtension(extension_system_->extension_service(), sync_item->item_id); return; @@ -1079,7 +1093,7 @@ if (sync_processor_.get()) return true; if (flare_.is_null()) { - VLOG(1) << this << ": SyncStarted: Flare."; + VLOG(2) << this << ": SyncStarted: Flare."; flare_ = sync_start_util::GetFlareForSyncableService(profile_->GetPath()); flare_.Run(syncer::APP_LIST); } @@ -1165,9 +1179,9 @@ } syncer::StringOrdinal AppListSyncableService::GetPreferredOemFolderPos() { - VLOG(1) << "GetPreferredOemFolderPos: " << first_app_list_sync_; + VLOG(2) << "GetPreferredOemFolderPos: " << first_app_list_sync_; if (!first_app_list_sync_) { - VLOG(1) << "Sync items exist, placing OEM folder at end."; + VLOG(2) << "Sync items exist, placing OEM folder at end."; syncer::StringOrdinal last; for (const auto& sync_pair : sync_items_) { SyncItem* sync_item = sync_pair.second.get();
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/app_search_result_ranker.cc b/chrome/browser/ui/app_list/search/search_result_ranker/app_search_result_ranker.cc index 8e5bda5..713736e 100644 --- a/chrome/browser/ui/app_list/search/search_result_ranker/app_search_result_ranker.cc +++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_search_result_ranker.cc
@@ -94,9 +94,13 @@ : predictor_filename_( profile_path.AppendASCII(kAppLaunchPredictorFilename)), weak_factory_(this) { - if (!app_list_features::IsZeroStateAppsRankerEnabled()) + if (!app_list_features::IsZeroStateAppsRankerEnabled()) { + LOG(ERROR) << "AppSearchResultRanker: ZeroStateAppsRanker is not enabled."; return; - + } + // TODO(charleszhao): remove these logs once the test review is done. + LOG(ERROR) << "AppSearchResultRanker::AppSearchResultRankerPredictorName " + << app_list_features::AppSearchResultRankerPredictorName(); predictor_ = CreatePredictor(app_list_features::AppSearchResultRankerPredictorName()); @@ -156,6 +160,8 @@ predictor_.swap(predictor); } load_from_disk_completed_ = true; + LOG(ERROR) << "AppSearchResultRanker::OnLoadFromDiskComplete " + << predictor_->GetPredictorName(); } } // namespace app_list
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.cc b/chrome/browser/ui/ash/chrome_new_window_client.cc index 36b5069..45138ca 100644 --- a/chrome/browser/ui/ash/chrome_new_window_client.cc +++ b/chrome/browser/ui/ash/chrome_new_window_client.cc
@@ -34,8 +34,10 @@ #include "chrome/browser/ui/extensions/app_launch_params.h" #include "chrome/browser/ui/extensions/application_launch.h" #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" +#include "chrome/browser/ui/settings_window_manager_chromeos.h" #include "chrome/browser/ui/webui/chrome_web_contents_handler.h" #include "chrome/common/url_constants.h" +#include "chrome/common/webui_url_constants.h" #include "components/arc/intent_helper/arc_intent_helper_bridge.h" #include "components/sessions/core/tab_restore_service.h" #include "components/sessions/core/tab_restore_service_observer.h" @@ -466,18 +468,25 @@ content::WebContents* ChromeNewWindowClient::OpenUrlImpl( const GURL& url, bool from_user_interaction) { - // If the url is for system settings, show the settings in a window instead of - // a browser tab. - if (url.GetContent() == "settings" && - (url.SchemeIs(url::kAboutScheme) || + Profile* profile = ProfileManager::GetActiveUserProfile(); + if ((url.SchemeIs(url::kAboutScheme) || url.SchemeIs(content::kChromeUIScheme))) { - chrome::ShowSettingsSubPageForProfile( - ProfileManager::GetActiveUserProfile(), /*sub_page=*/std::string()); - return nullptr; + // Show browser settings (e.g. chrome://settings). This may open in a window + // or a tab depending on feature SplitSettings. + if (url.host() == chrome::kChromeUISettingsHost) { + chrome::ShowSettingsSubPageForProfile(profile, + /*sub_page=*/std::string()); + return nullptr; + } + // OS settings are shown in a window. + if (url.host() == chrome::kChromeUIOSSettingsHost) { + chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(profile); + return nullptr; + } } NavigateParams navigate_params( - ProfileManager::GetActiveUserProfile(), url, + profile, url, ui::PageTransitionFromInt(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_FROM_API));
diff --git a/chrome/browser/ui/ash/drag_to_overview_interactive_uitest.cc b/chrome/browser/ui/ash/drag_to_overview_interactive_uitest.cc index ca80b85..5d7ac7c 100644 --- a/chrome/browser/ui/ash/drag_to_overview_interactive_uitest.cc +++ b/chrome/browser/ui/ash/drag_to_overview_interactive_uitest.cc
@@ -102,11 +102,13 @@ } } std::vector<std::string> GetUMAHistogramNames() const override { + if (tab_drag_test_) { + return {"Ash.SwipeDownDrag.Tab.PresentationTime.TabletMode", + "Ash.SwipeDownDrag.Tab.PresentationTime.MaxLatency.TabletMode"}; + } return { "Ash.SwipeDownDrag.Window.PresentationTime.TabletMode", "Ash.SwipeDownDrag.Window.PresentationTime.MaxLatency.TabletMode", - "Ash.SwipeDownDrag.Tab.PresentationTime.TabletMode", - "Ash.SwipeDownDrag.Tab.PresentationTime.MaxLatency.TabletMode", }; } @@ -144,7 +146,11 @@ ContinueDrag(start_position, delta, count); } + void set_tab_drag_test(bool tab_drag_test) { tab_drag_test_ = tab_drag_test; } + private: + bool tab_drag_test_ = false; + DISALLOW_COPY_AND_ASSIGN(DragToOverviewTest); }; @@ -178,6 +184,8 @@ } IN_PROC_BROWSER_TEST_F(DragToOverviewTest, DragTab) { + set_tab_drag_test(true); + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); aura::Window* browser_window = browser_view->GetWidget()->GetNativeWindow();
diff --git a/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc b/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc index 07f6eb3..3f00f22 100644 --- a/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc +++ b/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc
@@ -31,9 +31,9 @@ constexpr char kChromeAcceleratorsHash[] = "15a6c673dc62825b04e80036ad690514"; #else // The total number of Chrome accelerators (available on Chrome OS). -constexpr int kChromeAcceleratorsTotalNum = 91; +constexpr int kChromeAcceleratorsTotalNum = 92; // The hash of Chrome accelerators (available on Chrome OS). -constexpr char kChromeAcceleratorsHash[] = "cde825b73b85f0ff34a1ff78086e61c8"; +constexpr char kChromeAcceleratorsHash[] = "ef8dbf7ba5329cf7de66fdaebc3f5108"; #endif // defined(GOOGLE_CHROME_BUILD) const char* BooleanToString(bool value) {
diff --git a/chrome/browser/ui/ash/launcher_animations_interactive_uitest.cc b/chrome/browser/ui/ash/launcher_animations_interactive_uitest.cc index 8b351ad..e19d00b 100644 --- a/chrome/browser/ui/ash/launcher_animations_interactive_uitest.cc +++ b/chrome/browser/ui/ash/launcher_animations_interactive_uitest.cc
@@ -36,7 +36,7 @@ // UIPerformanceTest: std::vector<std::string> GetUMAHistogramNames() const override { return { - "Apps.StateTransition.AnimationSmoothness.TabletMode", + "Apps.StateTransition.AnimationSmoothness.ClamshellMode", }; }
diff --git a/chrome/browser/ui/ash/overview_animations_interactive_uitest.cc b/chrome/browser/ui/ash/overview_animations_interactive_uitest.cc index f5b14f9..5e96121 100644 --- a/chrome/browser/ui/ash/overview_animations_interactive_uitest.cc +++ b/chrome/browser/ui/ash/overview_animations_interactive_uitest.cc
@@ -32,9 +32,9 @@ int additional_browsers = std::get<0>(GetParam()) - 1; bool blank_page = std::get<1>(GetParam()); - bool tablet_mode = std::get<2>(GetParam()); + tablet_mode_ = std::get<2>(GetParam()); - if (tablet_mode) + if (tablet_mode_) test::SetAndWaitForTabletMode(true); GURL ntp_url("chrome://newtab"); @@ -59,15 +59,16 @@ // UIPerformanceTest: std::vector<std::string> GetUMAHistogramNames() const override { - return { - "Ash.Overview.AnimationSmoothness.Enter.ClamshellMode", - "Ash.Overview.AnimationSmoothness.Enter.TabletMode", - "Ash.Overview.AnimationSmoothness.Exit.ClamshellMode", - "Ash.Overview.AnimationSmoothness.Exit.TabletMode", - }; + if (tablet_mode_) { + return {"Ash.Overview.AnimationSmoothness.Enter.TabletMode", + "Ash.Overview.AnimationSmoothness.Exit.TabletMode"}; + } + return {"Ash.Overview.AnimationSmoothness.Enter.ClamshellMode", + "Ash.Overview.AnimationSmoothness.Exit.ClamshellMode"}; } private: + bool tablet_mode_ = false; DISALLOW_COPY_AND_ASSIGN(OverviewAnimationsTest); };
diff --git a/chrome/browser/ui/ash/overview_window_drag_interactive_uitest.cc b/chrome/browser/ui/ash/overview_window_drag_interactive_uitest.cc index b531ded..bebde78 100644 --- a/chrome/browser/ui/ash/overview_window_drag_interactive_uitest.cc +++ b/chrome/browser/ui/ash/overview_window_drag_interactive_uitest.cc
@@ -246,8 +246,8 @@ // UIPerformanceTest: std::vector<std::string> GetUMAHistogramNames() const override { return { - "Ash.Overview.WindowDrag.Presentation.TabletMode", - "Ash.Overview.WindowDrag.Presentation.MaxLatency.TabletMode", + "Ash.Overview.WindowDrag.PresentationTime.TabletMode", + "Ash.Overview.WindowDrag.PresentationTime.MaxLatency.TabletMode", }; }
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 61b1ef1..d4e1c21 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -133,6 +133,7 @@ #include "chrome/browser/ui/global_error/global_error_service_factory.h" #include "chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.h" #include "chrome/browser/ui/location_bar/location_bar.h" +#include "chrome/browser/ui/manifest_web_app_browser_controller.h" #include "chrome/browser/ui/permission_bubble/chooser_bubble_delegate.h" #include "chrome/browser/ui/search/search_tab_helper.h" #include "chrome/browser/ui/singleton_tabs.h" @@ -293,6 +294,8 @@ if (extension && extension->is_hosted_app()) return std::make_unique<extensions::HostedAppBrowserController>(browser); #endif + if (browser->is_focus_mode()) + return std::make_unique<ManifestWebAppBrowserController>(browser); return nullptr; } @@ -1109,7 +1112,7 @@ if (!profile || !source->GetController().GetLastCommittedEntry()) return false; GURL committed_url(source->GetController().GetLastCommittedEntry()->GetURL()); - return search::IsNTPURL(committed_url, profile); + return search::IsNTPOrRelatedURL(committed_url, profile); } void Browser::SetFocusToLocationBar() {
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc index 7cb9173..0665fbf 100644 --- a/chrome/browser/ui/browser_command_controller.cc +++ b/chrome/browser/ui/browser_command_controller.cc
@@ -916,11 +916,13 @@ !guest_session); #if defined(OS_CHROMEOS) command_updater_.UpdateCommandEnabled(IDC_TAKE_SCREENSHOT, true); -#else - // Chrome OS uses the system tray menu to handle multi-profiles. - if (normal_window && (guest_session || !profile()->IsOffTheRecord())) { + // Chrome OS uses the system tray menu to handle multi-profiles. Avatar menu + // is only required in incognito mode. + if (profile()->IsIncognito()) command_updater_.UpdateCommandEnabled(IDC_SHOW_AVATAR_MENU, true); - } +#else + if (normal_window) + command_updater_.UpdateCommandEnabled(IDC_SHOW_AVATAR_MENU, true); #endif UpdateShowSyncState(true);
diff --git a/chrome/browser/ui/browser_command_controller_unittest.cc b/chrome/browser/ui/browser_command_controller_unittest.cc index 899ace4c..dcebadf 100644 --- a/chrome/browser/ui/browser_command_controller_unittest.cc +++ b/chrome/browser/ui/browser_command_controller_unittest.cc
@@ -219,10 +219,7 @@ EXPECT_EQ(enabled, command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU)); } -TEST_F(BrowserCommandControllerTest, AvatarMenuAlwaysDisabledInIncognitoMode) { - if (!profiles::IsMultipleProfilesEnabled()) - return; - +TEST_F(BrowserCommandControllerTest, AvatarMenuAlwaysEnabledInIncognitoMode) { // Set up a profile with an off the record profile. TestingProfile::Builder normal_builder; std::unique_ptr<TestingProfile> original_profile = normal_builder.Build(); @@ -236,8 +233,8 @@ chrome::BrowserCommandController command_controller(otr_browser.get()); const CommandUpdater* command_updater = &command_controller; - // The avatar menu should be disabled. - EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU)); + // The avatar menu should be enabled. + EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU)); // The command line is reset at the end of every test by the test suite. }
diff --git a/chrome/browser/ui/manifest_web_app_browser_controller.cc b/chrome/browser/ui/manifest_web_app_browser_controller.cc index a75c91fc..d6c2a9e 100644 --- a/chrome/browser/ui/manifest_web_app_browser_controller.cc +++ b/chrome/browser/ui/manifest_web_app_browser_controller.cc
@@ -26,8 +26,7 @@ bool ManifestWebAppBrowserController::ShouldShowHostedAppButtonContainer() const { - // System Web Apps don't get the Hosted App buttons. - return false; + return true; } gfx::ImageSkia ManifestWebAppBrowserController::GetWindowAppIcon() const { @@ -87,5 +86,5 @@ } GURL ManifestWebAppBrowserController::GetAppLaunchURL() const { - return browser()->tab_strip_model()->GetActiveWebContents()->GetURL(); + return GURL(); }
diff --git a/chrome/browser/ui/search/local_ntp_backgrounds_browsertest.cc b/chrome/browser/ui/search/local_ntp_backgrounds_browsertest.cc index a4c5033..c634ce9 100644 --- a/chrome/browser/ui/search/local_ntp_backgrounds_browsertest.cc +++ b/chrome/browser/ui/search/local_ntp_backgrounds_browsertest.cc
@@ -102,8 +102,8 @@ bool result = false; EXPECT_TRUE(instant_test_utils::GetBoolFromJS( active_tab, - "document.querySelector('.attr1').innerText === 'attr1' && " - "document.querySelector('.attr2').innerText === 'attr2'", + "document.querySelector('#attr1').innerText === 'attr1' && " + "document.querySelector('#attr2').innerText === 'attr2'", &result)); EXPECT_TRUE(result); @@ -302,8 +302,8 @@ bool result = false; ASSERT_TRUE(instant_test_utils::GetBoolFromJS( active_tab, - "document.querySelector('.attr1').innerText === 'attr1' && " - "document.querySelector('.attr2').innerText === 'attr2'", + "document.querySelector('#attr1').innerText === 'attr1' && " + "document.querySelector('#attr2').innerText === 'attr2'", &result)); EXPECT_TRUE(result); // Apply a custom background still count as using default theme @@ -328,8 +328,8 @@ // Check that the custom background element maintains the correct attribution. ASSERT_TRUE(instant_test_utils::GetBoolFromJS( active_tab, - "document.querySelector('.attr1').innerText === 'attr1' && " - "document.querySelector('.attr2').innerText === 'attr2'", + "document.querySelector('#attr1').innerText === 'attr1' && " + "document.querySelector('#attr2').innerText === 'attr2'", &result)); EXPECT_TRUE(result); }
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc index 2416ca8..69de202 100644 --- a/chrome/browser/ui/search/search_tab_helper.cc +++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -173,7 +173,7 @@ return; } - if (search::IsNTPURL(navigation_handle->GetURL(), profile())) { + if (search::IsNTPOrRelatedURL(navigation_handle->GetURL(), profile())) { // Set the title on any pending entry corresponding to the NTP. This // prevents any flickering of the tab title. content::NavigationEntry* entry =
diff --git a/chrome/browser/ui/views/accelerator_table.cc b/chrome/browser/ui/views/accelerator_table.cc index 993b052..3ff65b3 100644 --- a/chrome/browser/ui/views/accelerator_table.cc +++ b/chrome/browser/ui/views/accelerator_table.cc
@@ -120,6 +120,8 @@ {ui::VKEY_F6, ui::EF_SHIFT_DOWN, IDC_FOCUS_PREVIOUS_PANE}, {ui::VKEY_F10, ui::EF_NONE, IDC_FOCUS_MENU_BAR}, {ui::VKEY_F11, ui::EF_NONE, IDC_FULLSCREEN}, + {ui::VKEY_M, ui::EF_SHIFT_DOWN | ui::EF_PLATFORM_ACCELERATOR, + IDC_SHOW_AVATAR_MENU}, // Platform-specific key maps. #if defined(OS_LINUX) @@ -150,8 +152,6 @@ // On Windows, all VKEY_BROWSER_* keys except VKEY_BROWSER_SEARCH are // handled via WM_APPCOMMAND. {ui::VKEY_BROWSER_SEARCH, ui::EF_NONE, IDC_FOCUS_SEARCH}, - {ui::VKEY_M, ui::EF_SHIFT_DOWN | ui::EF_PLATFORM_ACCELERATOR, - IDC_SHOW_AVATAR_MENU}, #endif // !OS_CHROMEOS #if defined(GOOGLE_CHROME_BUILD) && !defined(OS_MACOSX)
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 761ac3e..e9484f12 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
@@ -75,7 +75,7 @@ } Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); - if (profile && search::IsNTPURL(url, profile)) + if (profile && search::IsNTPOrRelatedURL(url, profile)) return content::BROWSER_CONTROLS_STATE_SHOWN; auto* helper = SecurityStateTabHelper::FromWebContents(contents);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc index 0352b01..e4a8340 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc
@@ -4,12 +4,14 @@ #include "chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h" +#include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/views/autofill/payments/local_card_migration_icon_view.h" #include "chrome/browser/ui/views/autofill/payments/save_card_icon_view.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/browser/ui/views/profiles/avatar_toolbar_button.h" +#include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/widget/widget.h" @@ -46,8 +48,14 @@ default; void ToolbarPageActionIconContainerView::UpdateAllIcons() { - for (PageActionIconView* icon_view : page_action_icons_) + const ui::ThemeProvider* theme_provider = GetThemeProvider(); + const SkColor icon_color = + theme_provider->GetColor(ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); + + for (PageActionIconView* icon_view : page_action_icons_) { + icon_view->SetIconColor(icon_color); icon_view->Update(); + } if (avatar_) avatar_->UpdateIcon(); @@ -83,8 +91,7 @@ } SkColor ToolbarPageActionIconContainerView::GetPageActionInkDropColor() const { - return GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_TextfieldDefaultColor); + return GetToolbarInkDropBaseColor(this); } content::WebContents* @@ -92,6 +99,12 @@ return browser_->tab_strip_model()->GetActiveWebContents(); } +void ToolbarPageActionIconContainerView::OnNativeThemeChanged( + const ui::NativeTheme* theme) { + // Update icon color. + UpdateAllIcons(); +} + bool ToolbarPageActionIconContainerView::FocusInactiveBubbleForIcon( PageActionIconView* icon_view) { if (!icon_view->visible() || !icon_view->GetBubble())
diff --git a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h index ef761223..394674c 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h +++ b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h
@@ -45,6 +45,9 @@ SkColor GetPageActionInkDropColor() const override; content::WebContents* GetWebContentsForPageActionIconView() override; + // views::View: + void OnNativeThemeChanged(const ui::NativeTheme* theme) override; + autofill::LocalCardMigrationIconView* local_card_migration_icon_view() const { return local_card_migration_icon_view_; }
diff --git a/chrome/browser/ui/webui/chromeos/set_time_ui.cc b/chrome/browser/ui/webui/chromeos/set_time_ui.cc index c248f749..a5e4b5da 100644 --- a/chrome/browser/ui/webui/chromeos/set_time_ui.cc +++ b/chrome/browser/ui/webui/chromeos/set_time_ui.cc
@@ -156,8 +156,8 @@ IDR_SET_TIME_BROWSER_PROXY_HTML); source->AddResourcePath("set_time_browser_proxy.js", IDR_SET_TIME_BROWSER_PROXY_JS); - source->AddResourcePath("set_time.js", IDR_SET_TIME_JS); - source->SetDefaultResource(IDR_SET_TIME_HTML); + source->AddResourcePath("set_time_dialog.js", IDR_SET_TIME_DIALOG_JS); + source->SetDefaultResource(IDR_SET_TIME_DIALOG_HTML); content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source); }
diff --git a/chrome/browser/vr/test/run_xr_browser_tests.py b/chrome/browser/vr/test/run_xr_browser_tests.py index 43c234d58..b3da798 100755 --- a/chrome/browser/vr/test/run_xr_browser_tests.py +++ b/chrome/browser/vr/test/run_xr_browser_tests.py
@@ -17,6 +17,7 @@ """ import argparse +import json import logging import os import subprocess @@ -35,6 +36,22 @@ ] +DEFAULT_TRACING_CATEGORIES = [ + 'blink', + 'cc', + 'cpu_profiler', + 'gpu', + 'xr', +] + + +def GetTestExecutable(): + test_executable = 'xr_browser_tests_binary' + if sys.platform == 'win32': + test_executable += '.exe' + return test_executable + + def ResetACLs(path): logging.warning('Setting ACLs on %s to default.', path) try: @@ -83,19 +100,60 @@ sys.exit(e.returncode) -def main(): - parser = argparse.ArgumentParser() - _, rest_args = parser.parse_known_args() +def SetupTracingIfNecessary(args): + if not args.tracing_output_directory: + return [] - test_executable = 'xr_browser_tests_binary' + tracing_categories = args.tracing_categories or DEFAULT_TRACING_CATEGORIES + with open(os.path.join(args.tracing_output_directory, 'traceconfig.json'), + 'w') as trace_config: + json.dump({ + 'trace_config': { + 'record_mode': 'record-until-full', + 'included_categories': tracing_categories, + }, + 'startup_duraton': 0, + 'result_directory': args.tracing_output_directory, + }, trace_config) + return ['--trace-config-file=%s' % trace_config.name] + + +def CreateArgumentParser(): + parser = argparse.ArgumentParser( + description='This is a wrapper script around %s. To view help for that, ' + 'run `%s --help`.' % ( + GetTestExecutable(), GetTestExecutable())) + + group = parser.add_argument_group( + title='Tracing', + description='Arguments related to running the tests with tracing enabled') + group.add_argument('--tracing-output-directory', type=os.path.abspath, + help='The directory to store trace logs in. Setting this ' + 'enables tracing in the test.') + group.add_argument('--tracing-category', action='append', default=[], + dest='tracing_categories', + help='Add a tracing category to capture. Can be passed ' + 'multiple times, once for each category. If ' + 'unspecified, defaults to %s' + % DEFAULT_TRACING_CATEGORIES) + + return parser + + +def main(): + parser = CreateArgumentParser() + args, rest_args = parser.parse_known_args() + if sys.platform == 'win32': SetupWindowsACLs() - test_executable += '.exe' + + tracing_args = SetupTracingIfNecessary(args) test_executable = os.path.abspath( - os.path.join(os.path.dirname(__file__), test_executable)) + os.path.join(os.path.dirname(__file__), GetTestExecutable())) subprocess.call( - [test_executable, '--run-through-xr-wrapper-script'] + rest_args) + [test_executable, '--run-through-xr-wrapper-script'] + + tracing_args + rest_args) if __name__ == '__main__': main() \ No newline at end of file
diff --git a/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.cc b/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.cc index 3a811dd..5c953070 100644 --- a/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.cc +++ b/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.cc
@@ -253,7 +253,7 @@ } // namespace BookmarkAppInstallManager::BookmarkAppInstallManager(Profile* profile) - : profile_(profile) { + : InstallManager(profile) { bookmark_app_helper_factory_ = base::BindRepeating( [](Profile* profile, const WebApplicationInfo& web_app_info, content::WebContents* web_contents, @@ -330,7 +330,7 @@ WebappInstallSource install_source, OnceInstallCallback callback) { auto bookmark_app_helper = std::make_unique<BookmarkAppHelper>( - profile_, *web_application_info, /*web_contents=*/nullptr, + profile(), *web_application_info, /*web_contents=*/nullptr, install_source); if (no_network_install) { @@ -377,7 +377,7 @@ OnceInstallCallback callback) { // |callback| is ignored here: the legacy system doesn't report completion. ExtensionService* extension_service = - ExtensionSystem::Get(profile_)->extension_service(); + ExtensionSystem::Get(profile())->extension_service(); DCHECK(extension_service); const Extension* extension = extension_service->GetInstalledExtension(app_id); @@ -408,7 +408,7 @@ OnceInstallCallback callback) { // |callback| is ignored here: the legacy system doesn't report completion. ExtensionService* extension_service = - ExtensionSystem::Get(profile_)->extension_service(); + ExtensionSystem::Get(profile())->extension_service(); DCHECK(extension_service); CreateOrUpdateBookmarkApp(extension_service, web_application_info.get(),
diff --git a/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.h b/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.h index b3b1fa7..27ca81f 100644 --- a/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.h +++ b/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.h
@@ -81,8 +81,6 @@ DataRetrieverFactory data_retriever_factory); private: - Profile* profile_; - BookmarkAppHelperFactory bookmark_app_helper_factory_; DataRetrieverFactory data_retriever_factory_;
diff --git a/chrome/browser/web_applications/components/install_finalizer.h b/chrome/browser/web_applications/components/install_finalizer.h index 9941acf..e0d947e 100644 --- a/chrome/browser/web_applications/components/install_finalizer.h +++ b/chrome/browser/web_applications/components/install_finalizer.h
@@ -30,14 +30,16 @@ using CreateOsShortcutsCallback = base::OnceCallback<void(bool shortcuts_created)>; + struct FinalizeOptions { + bool policy_installed = false; + bool no_network_install = false; + }; + // Write the WebApp data to disk and register the app. virtual void FinalizeInstall(const WebApplicationInfo& web_app_info, + const FinalizeOptions& options, InstallFinalizedCallback callback) = 0; - // TODO(ortuno): Merge with FinalizeInstall by taking an options argument. - virtual void FinalizePolicyInstall(const WebApplicationInfo& web_app_info, - InstallFinalizedCallback callback) = 0; - virtual bool CanCreateOsShortcuts() const = 0; virtual void CreateOsShortcuts(const AppId& app_id, CreateOsShortcutsCallback callback) = 0;
diff --git a/chrome/browser/web_applications/components/install_manager.cc b/chrome/browser/web_applications/components/install_manager.cc index 266d4e1..25187b8 100644 --- a/chrome/browser/web_applications/components/install_manager.cc +++ b/chrome/browser/web_applications/components/install_manager.cc
@@ -4,14 +4,70 @@ #include "chrome/browser/web_applications/components/install_manager.h" +#include "chrome/browser/installable/installable_manager.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ssl/security_state_tab_helper.h" #include "chrome/browser/web_applications/components/install_manager_observer.h" +#include "content/public/browser/web_contents.h" namespace web_app { -InstallManager::InstallManager() = default; +namespace { + +void OnInstallabilityCheckCompleted( + InstallManager::WebAppInstallabilityCheckCallback callback, + std::unique_ptr<content::WebContents> web_contents, + const InstallableData& data) { + // This task is posted. This is because this function will be called by the + // InstallableManager associated with |web_contents|, and |web_contents| might + // be freed in the callback. If that happens, and this isn't posted, the + // InstallableManager will be freed, and then when this function returns to + // the InstallManager calling function, there will be a crash. + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), std::move(web_contents), + data.errors.empty())); +} + +void OnWebAppUrlLoaded( + InstallManager::WebAppInstallabilityCheckCallback callback, + std::unique_ptr<content::WebContents> web_contents, + WebAppUrlLoader::Result result) { + if (result != WebAppUrlLoader::Result::kUrlLoaded) { + std::move(callback).Run(std::move(web_contents), false); + return; + } + + InstallableParams params; + params.valid_primary_icon = true; + params.valid_manifest = true; + params.has_worker = true; + params.wait_for_worker = true; + InstallableManager::FromWebContents(web_contents.get()) + ->GetData(params, + base::BindOnce(&OnInstallabilityCheckCompleted, + std::move(callback), std::move(web_contents))); +} + +} // namespace + +InstallManager::InstallManager(Profile* profile) : profile_(profile) {} InstallManager::~InstallManager() = default; +void InstallManager::LoadWebAppAndCheckInstallability( + const GURL& web_app_url, + WebAppInstallabilityCheckCallback callback) { + std::unique_ptr<content::WebContents> web_contents = + content::WebContents::Create( + content::WebContents::CreateParams(profile())); + InstallableManager::CreateForWebContents(web_contents.get()); + SecurityStateTabHelper::CreateForWebContents(web_contents.get()); + + url_loader_.LoadUrl(web_app_url, web_contents.get(), + base::BindOnce(&OnWebAppUrlLoaded, std::move(callback), + std::move(web_contents))); +} + void InstallManager::Reset() { for (InstallManagerObserver& observer : observers_) observer.InstallManagerReset();
diff --git a/chrome/browser/web_applications/components/install_manager.h b/chrome/browser/web_applications/components/install_manager.h index 0c581fe..eced191 100644 --- a/chrome/browser/web_applications/components/install_manager.h +++ b/chrome/browser/web_applications/components/install_manager.h
@@ -11,6 +11,7 @@ #include "base/observer_list.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" #include "chrome/browser/web_applications/components/web_app_install_utils.h" +#include "chrome/browser/web_applications/components/web_app_url_loader.h" enum class WebappInstallSource; struct WebApplicationInfo; @@ -19,6 +20,8 @@ class WebContents; } +class Profile; + namespace web_app { enum class InstallResultCode; @@ -46,6 +49,10 @@ ForInstallableSite for_installable_site, WebAppInstallationAcceptanceCallback acceptance_callback)>; + using WebAppInstallabilityCheckCallback = + base::OnceCallback<void(std::unique_ptr<content::WebContents>, + bool is_installable)>; + // Returns true if a web app can be installed for a given |web_contents|. virtual bool CanInstallWebApp(content::WebContents* web_contents) = 0; @@ -99,16 +106,27 @@ std::unique_ptr<WebApplicationInfo> web_application_info, OnceInstallCallback callback) = 0; - InstallManager(); + explicit InstallManager(Profile* profile); virtual ~InstallManager(); + // Loads |web_app_url| in a new WebContents and determines if it is + // installable. Returns the WebContents and whether the app is installable or + // not. + void LoadWebAppAndCheckInstallability(const GURL& web_app_url, + WebAppInstallabilityCheckCallback); + // Called before the web app system gets destroyed. void Reset(); void AddObserver(InstallManagerObserver* observer); void RemoveObserver(InstallManagerObserver* observer); + protected: + Profile* profile() { return profile_; } + private: + Profile* profile_; + WebAppUrlLoader url_loader_; base::ObserverList<InstallManagerObserver, true /*check_empty*/> observers_; };
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc index a8b6054..315ee4b 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
@@ -85,6 +85,7 @@ void BookmarkAppInstallFinalizer::FinalizeInstall( const WebApplicationInfo& web_app_info, + const FinalizeOptions& options, InstallFinalizedCallback callback) { scoped_refptr<CrxInstaller> crx_installer = crx_installer_factory_.Run(profile_); @@ -93,20 +94,15 @@ OnExtensionInstalled, web_app_info.app_url, GetLaunchType(web_app_info), std::move(callback), crx_installer)); - crx_installer->InstallWebApp(web_app_info); -} + if (options.policy_installed) + crx_installer->set_install_source(Manifest::EXTERNAL_POLICY_DOWNLOAD); -void BookmarkAppInstallFinalizer::FinalizePolicyInstall( - const WebApplicationInfo& web_app_info, - InstallFinalizedCallback callback) { - scoped_refptr<CrxInstaller> crx_installer = - crx_installer_factory_.Run(profile_); - - crx_installer->set_installer_callback(base::BindOnce( - OnExtensionInstalled, web_app_info.app_url, GetLaunchType(web_app_info), - std::move(callback), crx_installer)); - - crx_installer->set_install_source(Manifest::EXTERNAL_POLICY_DOWNLOAD); + if (options.no_network_install) { + // Ensure that this app is not synced. A no-network install means we have + // all data locally, so assume that there is some mechanism to propagate + // the local source of data in place of usual extension sync. + crx_installer->set_install_source(Manifest::EXTERNAL_PREF_DOWNLOAD); + } crx_installer->InstallWebApp(web_app_info); }
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h index 059ecda..cc8fab6 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h +++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h
@@ -27,9 +27,8 @@ // InstallFinalizer: void FinalizeInstall(const WebApplicationInfo& web_app_info, + const FinalizeOptions& options, InstallFinalizedCallback callback) override; - void FinalizePolicyInstall(const WebApplicationInfo& web_app_info, - InstallFinalizedCallback callback) override; bool CanCreateOsShortcuts() const override; void CreateOsShortcuts(const web_app::AppId& app_id, CreateOsShortcutsCallback callback) override;
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc index 61944fb..7df88d3 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc
@@ -99,11 +99,12 @@ info->title = base::ASCIIToUTF16(kWebAppTitle); base::RunLoop run_loop; + web_app::InstallFinalizer::FinalizeOptions options; web_app::AppId app_id; bool callback_called = false; installer.FinalizeInstall( - *info, + *info, options, base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id, web_app::InstallResultCode code) { EXPECT_EQ(web_app::InstallResultCode::kSuccess, code); @@ -134,10 +135,11 @@ info->title = base::ASCIIToUTF16(kWebAppTitle); base::RunLoop run_loop; + web_app::InstallFinalizer::FinalizeOptions options; bool callback_called = false; installer.FinalizeInstall( - *info, + *info, options, base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id, web_app::InstallResultCode code) { EXPECT_EQ(web_app::InstallResultCode::kFailedUnknownReason, code); @@ -163,6 +165,7 @@ bool callback1_called = false; bool callback2_called = false; + web_app::InstallFinalizer::FinalizeOptions options; // Start install finalization for the 1st app { @@ -170,7 +173,7 @@ web_application_info.app_url = url1; finalizer.FinalizeInstall( - web_application_info, + web_application_info, options, base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id, web_app::InstallResultCode code) { EXPECT_EQ(web_app::InstallResultCode::kSuccess, code); @@ -187,7 +190,7 @@ web_application_info.app_url = url2; finalizer.FinalizeInstall( - web_application_info, + web_application_info, options, base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id, web_app::InstallResultCode code) { EXPECT_EQ(web_app::InstallResultCode::kSuccess, code); @@ -211,9 +214,12 @@ info->app_url = GURL(kWebAppUrl); info->title = base::ASCIIToUTF16(kWebAppTitle); + web_app::InstallFinalizer::FinalizeOptions options; + options.policy_installed = true; + base::RunLoop run_loop; - installer.FinalizePolicyInstall( - *info, + installer.FinalizeInstall( + *info, options, base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id, web_app::InstallResultCode code) { EXPECT_EQ(web_app::InstallResultCode::kSuccess, code); @@ -228,4 +234,31 @@ run_loop.Run(); } +TEST_F(BookmarkAppInstallFinalizerTest, NoNetworkInstallSucceeds) { + BookmarkAppInstallFinalizer installer(profile()); + + auto info = std::make_unique<WebApplicationInfo>(); + info->app_url = GURL(kWebAppUrl); + + web_app::InstallFinalizer::FinalizeOptions options; + options.no_network_install = true; + + base::RunLoop run_loop; + installer.FinalizeInstall( + *info, options, + base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id, + web_app::InstallResultCode code) { + EXPECT_EQ(web_app::InstallResultCode::kSuccess, code); + + auto* extension = + ExtensionRegistry::Get(profile())->GetInstalledExtension( + installed_app_id); + EXPECT_TRUE(Manifest::IsExternalLocation(extension->location())); + EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, extension->location()); + + run_loop.Quit(); + })); + run_loop.Run(); +} + } // namespace extensions
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc index cb9d770..99e109d 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
@@ -86,8 +86,11 @@ break; } - install_finalizer_->FinalizePolicyInstall( - web_app_info, + web_app::InstallFinalizer::FinalizeOptions options; + options.policy_installed = true; + + install_finalizer_->FinalizeInstall( + web_app_info, options, base::BindOnce(&BookmarkAppInstallationTask::OnWebAppInstalled, weak_ptr_factory_.GetWeakPtr(), true /* is_placeholder */, std::move(callback)));
diff --git a/chrome/browser/web_applications/test/test_install_finalizer.cc b/chrome/browser/web_applications/test/test_install_finalizer.cc index 55cb925..62c8ae8 100644 --- a/chrome/browser/web_applications/test/test_install_finalizer.cc +++ b/chrome/browser/web_applications/test/test_install_finalizer.cc
@@ -20,6 +20,7 @@ void TestInstallFinalizer::FinalizeInstall( const WebApplicationInfo& web_app_info, + const FinalizeOptions& options, InstallFinalizedCallback callback) { AppId app_id = GenerateAppIdFromURL(web_app_info.app_url); if (next_app_id_.has_value()) { @@ -39,13 +40,9 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), app_id, code)); -} -void TestInstallFinalizer::FinalizePolicyInstall( - const WebApplicationInfo& web_app_info, - InstallFinalizedCallback callback) { - FinalizeInstall(web_app_info, std::move(callback)); - finalized_policy_install_ = true; + if (options.policy_installed) + finalized_policy_install_ = true; } bool TestInstallFinalizer::CanCreateOsShortcuts() const {
diff --git a/chrome/browser/web_applications/test/test_install_finalizer.h b/chrome/browser/web_applications/test/test_install_finalizer.h index c845595..562fcc02 100644 --- a/chrome/browser/web_applications/test/test_install_finalizer.h +++ b/chrome/browser/web_applications/test/test_install_finalizer.h
@@ -22,9 +22,8 @@ // InstallFinalizer: void FinalizeInstall(const WebApplicationInfo& web_app_info, + const FinalizeOptions& options, InstallFinalizedCallback callback) override; - void FinalizePolicyInstall(const WebApplicationInfo& web_app_info, - InstallFinalizedCallback callback) override; bool CanCreateOsShortcuts() const override; void CreateOsShortcuts(const AppId& app_id, CreateOsShortcutsCallback callback) override;
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.cc b/chrome/browser/web_applications/web_app_install_finalizer.cc index 09814f3..707f794 100644 --- a/chrome/browser/web_applications/web_app_install_finalizer.cc +++ b/chrome/browser/web_applications/web_app_install_finalizer.cc
@@ -53,6 +53,7 @@ void WebAppInstallFinalizer::FinalizeInstall( const WebApplicationInfo& web_app_info, + const FinalizeOptions& options, InstallFinalizedCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -80,12 +81,6 @@ std::move(web_app))); } -void WebAppInstallFinalizer::FinalizePolicyInstall( - const WebApplicationInfo& web_app_info, - InstallFinalizedCallback callback) { - NOTIMPLEMENTED(); -} - void WebAppInstallFinalizer::OnDataWritten(InstallFinalizedCallback callback, std::unique_ptr<WebApp> web_app, bool success) {
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.h b/chrome/browser/web_applications/web_app_install_finalizer.h index a663d8c..221c231 100644 --- a/chrome/browser/web_applications/web_app_install_finalizer.h +++ b/chrome/browser/web_applications/web_app_install_finalizer.h
@@ -27,9 +27,8 @@ // InstallFinalizer: void FinalizeInstall(const WebApplicationInfo& web_app_info, + const FinalizeOptions& options, InstallFinalizedCallback callback) override; - void FinalizePolicyInstall(const WebApplicationInfo& web_app_info, - InstallFinalizedCallback callback) override; bool CanCreateOsShortcuts() const override; void CreateOsShortcuts(const AppId& app_id, CreateOsShortcutsCallback callback) override;
diff --git a/chrome/browser/web_applications/web_app_install_manager.cc b/chrome/browser/web_applications/web_app_install_manager.cc index e191706..ad4473b 100644 --- a/chrome/browser/web_applications/web_app_install_manager.cc +++ b/chrome/browser/web_applications/web_app_install_manager.cc
@@ -19,7 +19,7 @@ WebAppInstallManager::WebAppInstallManager(Profile* profile, InstallFinalizer* install_finalizer) - : install_finalizer_(install_finalizer), profile_(profile) {} + : InstallManager(profile), install_finalizer_(install_finalizer) {} WebAppInstallManager::~WebAppInstallManager() = default; @@ -37,7 +37,8 @@ WebappInstallSource install_source, WebAppInstallDialogCallback dialog_callback, OnceInstallCallback callback) { - auto task = std::make_unique<WebAppInstallTask>(profile_, install_finalizer_); + auto task = + std::make_unique<WebAppInstallTask>(profile(), install_finalizer_); task->InstallWebAppFromManifest( contents, install_source, std::move(dialog_callback), base::BindOnce(&WebAppInstallManager::OnTaskCompleted, @@ -52,9 +53,10 @@ WebappInstallSource install_source, WebAppInstallDialogCallback dialog_callback, OnceInstallCallback callback) { - DCHECK(AreWebAppsUserInstallable(profile_)); + DCHECK(AreWebAppsUserInstallable(profile())); - auto task = std::make_unique<WebAppInstallTask>(profile_, install_finalizer_); + auto task = + std::make_unique<WebAppInstallTask>(profile(), install_finalizer_); task->InstallWebAppFromManifestWithFallback( contents, force_shortcut_app, install_source, std::move(dialog_callback), base::BindOnce(&WebAppInstallManager::OnTaskCompleted,
diff --git a/chrome/browser/web_applications/web_app_install_manager.h b/chrome/browser/web_applications/web_app_install_manager.h index 9f806cd..2a72bcfd 100644 --- a/chrome/browser/web_applications/web_app_install_manager.h +++ b/chrome/browser/web_applications/web_app_install_manager.h
@@ -65,7 +65,6 @@ Tasks tasks_; InstallFinalizer* install_finalizer_; - Profile* profile_; DISALLOW_COPY_AND_ASSIGN(WebAppInstallManager); };
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc index d8df17b0..4de0123ffe 100644 --- a/chrome/browser/web_applications/web_app_install_task.cc +++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -210,8 +210,10 @@ InstallableMetrics::TrackInstallEvent(install_source_); } + InstallFinalizer::FinalizeOptions options; + install_finalizer_->FinalizeInstall( - web_app_info_copy, + web_app_info_copy, options, base::BindOnce(&WebAppInstallTask::OnInstallFinalized, weak_ptr_factory_.GetWeakPtr(), std::move(web_app_info)));
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 00bf0d36..a114c392 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -232,13 +232,7 @@ // Enables or disables the ability to install PWAs from the omnibox. const base::Feature kDesktopPWAsOmniboxInstall{ - "DesktopPWAsOmniboxInstall", -#if defined(OS_CHROMEOS) - base::FEATURE_DISABLED_BY_DEFAULT -#else - base::FEATURE_ENABLED_BY_DEFAULT -#endif -}; + "DesktopPWAsOmniboxInstall", base::FEATURE_DISABLED_BY_DEFAULT}; // Disables downloads of unsafe file types over HTTP. const base::Feature kDisallowUnsafeHttpDownloads{
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 4e26aad8..df50f2de 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc
@@ -630,11 +630,6 @@ // apps/origins. This should be used only for testing purpose. const char kUnlimitedStorage[] = "unlimited-storage"; -// Pass the full https:// URL to PAC (Proxy Auto Config) scripts. As opposed to -// the default behavior which strips path and query components before passing -// to the PAC scripts. -const char kUnsafePacUrl[] = "unsafe-pac-url"; - // A string used to override the default user agent with a custom one. const char kUserAgent[] = "user-agent";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 40087a5..b2434bf 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h
@@ -183,7 +183,6 @@ extern const char kTrustedDownloadSources[]; extern const char kTryChromeAgain[]; extern const char kUnlimitedStorage[]; -extern const char kUnsafePacUrl[]; extern const char kUserAgent[]; extern const char kUserDataDir[]; extern const char kValidateCrx[];
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 607ba8c..a48eed4 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -2282,23 +2282,6 @@ // rules, or an implicit fallback to DIRECT connections). const char kQuickCheckEnabled[] = "proxy.quick_check_enabled"; -// Whether PAC scripts are given a stripped https:// URL (enabled), or -// the full URL for https:// (disabled). -// -// This is a security feature which is on by default, and prevents PAC -// scripts (which may have been sourced in an untrusted manner) from -// having access to data that is ordinarily protected by a TLS channel -// (i.e. the path and query components of an https:// URL). -// -// This preference is not exposed in the UI, but is overridable using -// a commandline flag --unsafe-pac-url. -// -// The ability to turn off this security feature is not intended to be -// a long-lived feature, but rather an escape-hatch for enterprises -// while rolling out the change to PAC. -const char kPacHttpsUrlStrippingEnabled[] = - "proxy.pac_https_url_stripping_enabled"; - // Whether Guest Mode is enabled within the browser. const char kBrowserGuestModeEnabled[] = "profile.browser_guest_enabled";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index af36e79..a21019b 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -788,7 +788,6 @@ #endif // defined(OS_ANDROID) extern const char kQuickCheckEnabled[]; -extern const char kPacHttpsUrlStrippingEnabled[]; extern const char kBrowserGuestModeEnabled[]; extern const char kBrowserAddPersonEnabled[]; extern const char kForceBrowserSignin[];
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc index 5d6c007..2a017d96 100644 --- a/chrome/common/webui_url_constants.cc +++ b/chrome/common/webui_url_constants.cc
@@ -298,6 +298,7 @@ const char kPasswordManagerSubPage[] = "passwords"; const char kPaymentsSubPage[] = "payments"; const char kPrintingSettingsSubPage[] = "printing"; +const char kPrivacySubPage[] = "privacy"; const char kResetProfileSettingsSubPage[] = "resetProfileSettings"; const char kSearchEnginesSubPage[] = "searchEngines"; const char kSignOutSubPage[] = "signOut";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index d75d422..a3c406b 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -292,6 +292,7 @@ extern const char kPaymentsSubPage[]; extern const char kPeopleSubPage[]; extern const char kPrintingSettingsSubPage[]; +extern const char kPrivacySubPage[]; extern const char kResetProfileSettingsSubPage[]; extern const char kSearchEnginesSubPage[]; extern const char kSignOutSubPage[];
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_de.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_de.xtb index 8ae2249..1dc8d92 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_de.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_de.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="de"> -<translation id="1337821341856692531">Wenn Sie fortfahren, ohne Ihr aktuelles Windows-Passwort einzugeben, gehen möglicherweise unwiederbringlich Informationen verloren.</translation> +<translation id="1337821341856692531">Wenn Sie fortfahren, ohne Ihr aktuelles Windows-Passwort einzugeben, gehen möglicherweise Informationen verloren, die nicht wiederhergestellt werden können.</translation> <translation id="1383286653814676580">Wird für die Anmeldeseite des Google-Anmeldeinformationsanbieters genutzt.</translation> <translation id="1894475569413661128">Melden Sie sich mit Ihrem Arbeitskonto an.</translation> <translation id="2227020416206680836">Ihre Sitzung ist abgelaufen. Melden Sie sich mit Ihrem Arbeitskonto an.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb index d156a6aa..df160e94 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb
@@ -1,12 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fil"> +<translation id="1337821341856692531">Kapag nagpatuloy nang hindi inilalagay ang kasalukuyan mong password sa Windows, puwedeng magdulot ng pagkawala ng impormasyon na hindi na maibabalik.</translation> <translation id="1383286653814676580">Ginagamit para paganahin ang page sa pag-sign in ng Google Credential Provider.</translation> <translation id="1894475569413661128">Mag-sign in gamit ang iyong account sa trabaho.</translation> <translation id="2227020416206680836">Nag-expire na ang iyong session. Mag-sign in gamit ang iyong account sa trabaho.</translation> <translation id="2469311484561825731">Hindi nakapag-sign in sa iyong account sa trabaho. Tiyaking may koneksyon sa internet ang computer, pagkatapos ay subukang muli.</translation> <translation id="2595469428674600431">Paumanhin, hindi na-verify ang iyong password sa Winows. Pakisubukang muli.</translation> <translation id="3306357053520292004">May naidagdag nang user sa computer na ito gamit ang account na ito. Mag-sign in gamit ang ibang account.</translation> +<translation id="369030246015333661">Na-lock ang iyong account. Makipag-ugnayan sa isang system administrator.</translation> <translation id="4057329986137569701">Nagkaroon ng internal na error.</translation> <translation id="4300229033992784001">Nagbago ang password ng iyong account. Pakilagay ang iyong kasalukuyang password sa Windows para i-sync ang Windows account mo sa iyong account sa trabaho.</translation> <translation id="4706454071748629324">Hindi nakapagdagdag ng bagong user. Isang user lang ang pinapahintulutang magawa ng computer na ito gamit ang isang account sa trabaho.</translation> @@ -14,9 +16,12 @@ <translation id="6312494990035843744">Hindi pinapayagan ang pag-sign in gamit ang account sa trabaho sa domain na ito. Sumubok ng ibang account.</translation> <translation id="6463752215771576050">Hindi ma-enroll ang computer na ito para sa pamamahala ng enterprise. Mag-sign in gamit ang ibang account sa trabaho.</translation> <translation id="7135123390294776473">Tanging ang user lang na nag-lock ng computer na ito ang kasalukuyang pinapayagang mag-sign in.</translation> +<translation id="7209941495304122410">Ilagay ang Password sa Windows</translation> <translation id="7357241217513796177">Tiyaking mayroon kang koneksyon sa network at subukang muli.</translation> <translation id="7536769223115622137">Magdagdag ng account sa trabaho</translation> +<translation id="7856245195110636219">Hindi makapagpatuloy nang hindi inilalagay ang kasalukuyang password sa Windows. Makipag-ugnayan sa isang system administrator.</translation> <translation id="8474372283141585908">Google Credential Provider</translation> +<translation id="8639729688781680518">Nakalimutan ang Password sa Windows</translation> <translation id="866458870819756755">Hindi makagawa ng user.</translation> <translation id="8860262547644202689">Helper ng Google Credential Provider</translation> <translation id="8875753657315897487">Mag-sign in gamit ang iyong account sa trabaho</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb index fe1c1e67..ec58adcd 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> -<translation id="1337821341856692531">현재 Windows 비밀번호를 입력하지 않고 계속하면 정보가 영구적으로 삭제될 수 있습니다.</translation> +<translation id="1337821341856692531">현재 Windows 비밀번호를 입력하지 않고 계속하면 정보가 영구적으로 손실될 수 있습니다.</translation> <translation id="1383286653814676580">Google 사용자 인증 정보 제공업체 로그인 페이지에 사용됩니다.</translation> <translation id="1894475569413661128">직장 계정으로 로그인하세요.</translation> <translation id="2227020416206680836">세션이 만료되었습니다. 직장 계정으로 로그인하세요.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_te.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_te.xtb index e0aa3886..cad23153 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_te.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_te.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="te"> -<translation id="1337821341856692531">మీ ప్రస్తుత Windows పాస్వర్డ్ను నమోదు చేయకుండా ముందుకు కొనసాగితే, సమాచారం శాశ్వతంగా కోల్పోయే ప్రమాదంగా పరిణమించవచ్చు.</translation> +<translation id="1337821341856692531">మీ ప్రస్తుత Windows పాస్వర్డ్ను నమోదు చేయకుండా ముందుకు కొనసాగితే, సమాచారాన్ని శాశ్వతంగా కోల్పోవచ్చు.</translation> <translation id="1383286653814676580">Google ఆధారాల ప్రదాత సైన్ ఇన్ పేజీని అమలు చేయడానికి ఉపయోగించబడుతుంది.</translation> <translation id="1894475569413661128">మీ కార్యాలయ ఖాతాని ఉపయోగించి సైన్ ఇన్ చేయండి.</translation> <translation id="2227020416206680836">మీ సెషన్ గడువు ముగిసింది. మీ కార్యాలయ ఖాతాను ఉపయోగించి సైన్ ఇన్ చేయండి.</translation>
diff --git a/chrome/test/base/perf/performance_test.cc b/chrome/test/base/perf/performance_test.cc index 7d860b9..f392e63 100644 --- a/chrome/test/base/perf/performance_test.cc +++ b/chrome/test/base/perf/performance_test.cc
@@ -6,7 +6,10 @@ #include "base/command_line.h" #include "base/files/file_util.h" +#include "base/metrics/histogram_samples.h" +#include "base/metrics/statistics_recorder.h" #include "base/trace_event/trace_event.h" +#include "chrome/test/base/test_switches.h" #include "content/public/browser/tracing_controller.h" #include "services/tracing/public/cpp/trace_event_agent.h" #include "ui/compositor/compositor_switches.h" @@ -72,9 +75,31 @@ runloop.Run(); CHECK(result); } + bool print = base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kPerfTestPrintUmaMeans); + LOG_IF(INFO, print) << "=== Histogram Means ==="; + for (auto name : GetUMAHistogramNames()) { + EXPECT_TRUE(HasHistogram(name)) << "missing histogram:" << name; + LOG_IF(INFO, print) << name << ": " << GetHistogramMean(name); + } + LOG_IF(INFO, print) << "=== End Histogram Means ==="; + InProcessBrowserTest::TearDownOnMainThread(); } +float PerformanceTest::GetHistogramMean(const std::string& name) { + auto* histogram = base::StatisticsRecorder::FindHistogram(name); + if (!histogram) + return 0; + auto samples = histogram->SnapshotSamples(); + DCHECK_NE(0, samples->TotalCount()); + return static_cast<float>(samples->sum()) / samples->TotalCount(); +} + +bool PerformanceTest::HasHistogram(const std::string& name) { + return !!base::StatisticsRecorder::FindHistogram(name); +} + //////////////////////////////////////////////////////////////////////////////// // UIPerformanceTest
diff --git a/chrome/test/base/perf/performance_test.h b/chrome/test/base/perf/performance_test.h index a5fb054f..9fa19a3 100644 --- a/chrome/test/base/perf/performance_test.h +++ b/chrome/test/base/perf/performance_test.h
@@ -27,6 +27,11 @@ void TearDownOnMainThread() override; private: + // Returns the mean of the histogram |name|. + float GetHistogramMean(const std::string& name); + + bool HasHistogram(const std::string& name); + const bool should_start_trace_; DISALLOW_COPY_AND_ASSIGN(PerformanceTest);
diff --git a/chrome/test/base/test_switches.cc b/chrome/test/base/test_switches.cc index 14c5975a..ea31fcacf 100644 --- a/chrome/test/base/test_switches.cc +++ b/chrome/test/base/test_switches.cc
@@ -11,6 +11,11 @@ // Also emit full event trace logs for successful tests. const char kAlsoEmitSuccessLogs[] = "also-emit-success-logs"; +// Show the mean value of histograms that native performance tests +// are monitoring. Note that this is only applicable for PerformanceTest +// subclasses. +const char kPerfTestPrintUmaMeans[] = "perf-test-print-uma-means"; + #if BUILDFLAG(ENABLE_PLUGINS) // Makes browser pixel tests overwrite the reference if it does not match. const char kRebaselinePixelTests[] = "rebaseline-pixel-tests";
diff --git a/chrome/test/base/test_switches.h b/chrome/test/base/test_switches.h index f9fbf745..f454a8c4 100644 --- a/chrome/test/base/test_switches.h +++ b/chrome/test/base/test_switches.h
@@ -14,6 +14,8 @@ // alongside the definition of their values in the .cc file. extern const char kAlsoEmitSuccessLogs[]; +extern const char kPerfTestPrintUmaMeans[]; + #if BUILDFLAG(ENABLE_PLUGINS) extern const char kRebaselinePixelTests[]; #endif
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index 6736e0e..e843fbbb 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -96,7 +96,7 @@ "../../../browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js", "../chromeos/oobe_webui_browsertest.js", "certificate_viewer_dialog_test.js", - "md_set_time_browsertest.js", + "set_time_dialog_browsertest.js", "settings/a11y/manage_accessibility_a11y_test.js", "settings/a11y/multidevice_a11y_test.js", "settings/a11y/multidevice_features_a11y_test.js",
diff --git a/chrome/test/data/webui/md_set_time_browsertest.js b/chrome/test/data/webui/set_time_dialog_browsertest.js similarity index 92% rename from chrome/test/data/webui/md_set_time_browsertest.js rename to chrome/test/data/webui/set_time_dialog_browsertest.js index af8ffda..6b57724b 100644 --- a/chrome/test/data/webui/md_set_time_browsertest.js +++ b/chrome/test/data/webui/set_time_dialog_browsertest.js
@@ -9,13 +9,13 @@ [ROOT_PATH + 'chrome/test/data/webui/polymer_browser_test_base.js']); /** - * SetTimeBrowserTest tests the "Set Time" web UI dialog. + * SetTimeDialogBrowserTest tests the "Set Time" web UI dialog. * @constructor * @extends {PolymerTest} */ -function SetTimeBrowserTest() {} +function SetTimeDialogBrowserTest() {} -SetTimeBrowserTest.prototype = { +SetTimeDialogBrowserTest.prototype = { __proto__: PolymerTest.prototype, browsePreload: 'chrome://set-time/', @@ -25,8 +25,8 @@ ]), }; -TEST_F('SetTimeBrowserTest', 'All', function() { - suite('SetTime', function() { +TEST_F('SetTimeDialogBrowserTest', 'All', function() { + suite('SetTimeDialog', function() { let setTimeElement = null; let testBrowserProxy = null; @@ -77,7 +77,7 @@ testBrowserProxy = new TestSetTimeBrowserProxy(); settime.SetTimeBrowserProxyImpl.instance_ = testBrowserProxy; PolymerTest.clearBody(); - setTimeElement = document.createElement('set-time'); + setTimeElement = document.createElement('set-time-dialog'); document.body.appendChild(setTimeElement); Polymer.dom.flush(); });
diff --git a/chromeos/services/BUILD.gn b/chromeos/services/BUILD.gn index 063f9475..6cfa7ee 100644 --- a/chromeos/services/BUILD.gn +++ b/chromeos/services/BUILD.gn
@@ -18,6 +18,7 @@ source_set("unit_tests") { testonly = true deps = [ + "//chromeos/services/cellular_setup:unit_tests", "//chromeos/services/device_sync:unit_tests", "//chromeos/services/ime:services_unittests", "//chromeos/services/ime:unit_tests",
diff --git a/chromeos/services/cellular_setup/BUILD.gn b/chromeos/services/cellular_setup/BUILD.gn new file mode 100644 index 0000000..5280912 --- /dev/null +++ b/chromeos/services/cellular_setup/BUILD.gn
@@ -0,0 +1,41 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos") + +static_library("cellular_setup") { + sources = [ + "cellular_setup_base.cc", + "cellular_setup_base.h", + "cellular_setup_impl.cc", + "cellular_setup_impl.h", + "cellular_setup_service.cc", + "cellular_setup_service.h", + ] + + deps = [ + "//base", + "//chromeos/services/cellular_setup/public/mojom", + "//services/service_manager/public/cpp", + "//services/service_manager/public/mojom", + ] +} + +source_set("unit_tests") { + testonly = true + + sources = [ + "cellular_setup_service_unittest.cc", + ] + + deps = [ + ":cellular_setup", + "//base", + "//base/test:test_support", + "//chromeos/services/cellular_setup/public/cpp:test_support", + "//services/service_manager/public/cpp/test:test_support", + "//testing/gmock", + "//testing/gtest", + ] +}
diff --git a/chromeos/services/cellular_setup/DEPS b/chromeos/services/cellular_setup/DEPS new file mode 100644 index 0000000..28dc15f0 --- /dev/null +++ b/chromeos/services/cellular_setup/DEPS
@@ -0,0 +1,4 @@ +include_rules = [ + "+mojo/public/cpp/bindings", + "+services/service_manager/public", +]
diff --git a/chromeos/services/cellular_setup/OWNERS b/chromeos/services/cellular_setup/OWNERS new file mode 100644 index 0000000..75e2f312 --- /dev/null +++ b/chromeos/services/cellular_setup/OWNERS
@@ -0,0 +1,2 @@ +azeemarshad@chromium.org +khorimoto@chromium.org
diff --git a/chromeos/services/cellular_setup/cellular_setup_base.cc b/chromeos/services/cellular_setup/cellular_setup_base.cc new file mode 100644 index 0000000..7ec8f9e --- /dev/null +++ b/chromeos/services/cellular_setup/cellular_setup_base.cc
@@ -0,0 +1,21 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/cellular_setup/cellular_setup_base.h" + +namespace chromeos { + +namespace cellular_setup { + +CellularSetupBase::CellularSetupBase() = default; + +CellularSetupBase::~CellularSetupBase() = default; + +void CellularSetupBase::BindRequest(mojom::CellularSetupRequest request) { + bindings_.AddBinding(this, std::move(request)); +} + +} // namespace cellular_setup + +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/cellular_setup_base.h b/chromeos/services/cellular_setup/cellular_setup_base.h new file mode 100644 index 0000000..bae4ab5 --- /dev/null +++ b/chromeos/services/cellular_setup/cellular_setup_base.h
@@ -0,0 +1,38 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_ +#define CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_ + +#include "base/macros.h" +#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "mojo/public/cpp/bindings/binding_set.h" + +namespace chromeos { + +namespace cellular_setup { + +// mojom::CellularSetup implementation which accepts requests to bind to it. +// This class does not implement any of mojom::CellularSetup's functions, so +// derived classes should override them. +class CellularSetupBase : public mojom::CellularSetup { + public: + ~CellularSetupBase() override; + + void BindRequest(mojom::CellularSetupRequest request); + + protected: + CellularSetupBase(); + + private: + mojo::BindingSet<mojom::CellularSetup> bindings_; + + DISALLOW_COPY_AND_ASSIGN(CellularSetupBase); +}; + +} // namespace cellular_setup + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_
diff --git a/chromeos/services/cellular_setup/cellular_setup_impl.cc b/chromeos/services/cellular_setup/cellular_setup_impl.cc new file mode 100644 index 0000000..4c76c65a --- /dev/null +++ b/chromeos/services/cellular_setup/cellular_setup_impl.cc
@@ -0,0 +1,50 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/cellular_setup/cellular_setup_impl.h" + +#include "base/memory/ptr_util.h" +#include "base/no_destructor.h" + +namespace chromeos { + +namespace cellular_setup { + +namespace { + +CellularSetupImpl::Factory* g_test_factory = nullptr; + +} // namespace + +// static +std::unique_ptr<CellularSetupBase> CellularSetupImpl::Factory::Create() { + if (g_test_factory) + return g_test_factory->BuildInstance(); + + return base::WrapUnique(new CellularSetupImpl()); +} + +// static +void CellularSetupImpl::Factory::SetFactoryForTesting(Factory* test_factory) { + g_test_factory = test_factory; +} + +CellularSetupImpl::Factory::~Factory() = default; + +CellularSetupImpl::CellularSetupImpl() = default; + +CellularSetupImpl::~CellularSetupImpl() = default; + +void CellularSetupImpl::StartActivation( + const std::string& cellular_network_guid, + mojom::ActivationDelegatePtr delegate, + StartActivationCallback callback) { + // TODO(khorimoto): Actually return a CarrierPortalObserver instead of + // passing null. + std::move(callback).Run(nullptr /* observer */); +} + +} // namespace cellular_setup + +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/cellular_setup_impl.h b/chromeos/services/cellular_setup/cellular_setup_impl.h new file mode 100644 index 0000000..3e606276 --- /dev/null +++ b/chromeos/services/cellular_setup/cellular_setup_impl.h
@@ -0,0 +1,43 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_ +#define CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_ + +#include "base/macros.h" +#include "chromeos/services/cellular_setup/cellular_setup_base.h" + +namespace chromeos { + +namespace cellular_setup { + +// Concrete mojom::CellularSetup implementation. +class CellularSetupImpl : public CellularSetupBase { + public: + class Factory { + public: + static std::unique_ptr<CellularSetupBase> Create(); + static void SetFactoryForTesting(Factory* test_factory); + virtual ~Factory(); + virtual std::unique_ptr<CellularSetupBase> BuildInstance() = 0; + }; + + ~CellularSetupImpl() override; + + private: + CellularSetupImpl(); + + // mojom::CellularSetup: + void StartActivation(const std::string& cellular_network_guid, + mojom::ActivationDelegatePtr delegate, + StartActivationCallback callback) override; + + DISALLOW_COPY_AND_ASSIGN(CellularSetupImpl); +}; + +} // namespace cellular_setup + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_
diff --git a/chromeos/services/cellular_setup/cellular_setup_service.cc b/chromeos/services/cellular_setup/cellular_setup_service.cc new file mode 100644 index 0000000..2362d53 --- /dev/null +++ b/chromeos/services/cellular_setup/cellular_setup_service.cc
@@ -0,0 +1,37 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/cellular_setup/cellular_setup_service.h" + +#include "base/bind.h" +#include "chromeos/services/cellular_setup/cellular_setup_base.h" +#include "chromeos/services/cellular_setup/cellular_setup_impl.h" + +namespace chromeos { + +namespace cellular_setup { + +CellularSetupService::CellularSetupService( + service_manager::mojom::ServiceRequest request) + : service_binding_(this, std::move(request)), + cellular_setup_(CellularSetupImpl::Factory::Create()) {} + +CellularSetupService::~CellularSetupService() = default; + +void CellularSetupService::OnStart() { + registry_.AddInterface( + base::BindRepeating(&CellularSetupBase::BindRequest, + base::Unretained(cellular_setup_.get()))); +} + +void CellularSetupService::OnBindInterface( + const service_manager::BindSourceInfo& source_info, + const std::string& interface_name, + mojo::ScopedMessagePipeHandle interface_pipe) { + registry_.BindInterface(interface_name, std::move(interface_pipe)); +} + +} // namespace cellular_setup + +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/cellular_setup_service.h b/chromeos/services/cellular_setup/cellular_setup_service.h new file mode 100644 index 0000000..4d9ee20 --- /dev/null +++ b/chromeos/services/cellular_setup/cellular_setup_service.h
@@ -0,0 +1,50 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_SERVICE_H_ +#define CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_SERVICE_H_ + +#include <memory> + +#include "base/macros.h" +#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "services/service_manager/public/cpp/binder_registry.h" +#include "services/service_manager/public/cpp/service.h" +#include "services/service_manager/public/cpp/service_binding.h" +#include "services/service_manager/public/mojom/service.mojom.h" + +namespace chromeos { + +namespace cellular_setup { + +class CellularSetupBase; + +// Service which provides an implementation for mojom::CellularSetup. This +// service creates one implementation and shares it among all connection +// requests. +class CellularSetupService : public service_manager::Service { + public: + explicit CellularSetupService(service_manager::mojom::ServiceRequest request); + ~CellularSetupService() override; + + private: + // service_manager::Service: + void OnStart() override; + void OnBindInterface(const service_manager::BindSourceInfo& source_info, + const std::string& interface_name, + mojo::ScopedMessagePipeHandle interface_pipe) override; + + service_manager::ServiceBinding service_binding_; + service_manager::BinderRegistry registry_; + + std::unique_ptr<CellularSetupBase> cellular_setup_; + + DISALLOW_COPY_AND_ASSIGN(CellularSetupService); +}; + +} // namespace cellular_setup + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_SERVICE_H_
diff --git a/chromeos/services/cellular_setup/cellular_setup_service_unittest.cc b/chromeos/services/cellular_setup/cellular_setup_service_unittest.cc new file mode 100644 index 0000000..39d8263 --- /dev/null +++ b/chromeos/services/cellular_setup/cellular_setup_service_unittest.cc
@@ -0,0 +1,281 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <memory> +#include <utility> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/optional.h" +#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" +#include "chromeos/services/cellular_setup/cellular_setup_impl.h" +#include "chromeos/services/cellular_setup/cellular_setup_service.h" +#include "chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h" +#include "chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" +#include "chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h" +#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "chromeos/services/cellular_setup/public/mojom/constants.mojom.h" +#include "services/service_manager/public/cpp/test/test_connector_factory.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { + +namespace cellular_setup { + +namespace { + +using CarrierPortalHandlerPair = + std::pair<mojom::CarrierPortalHandlerPtr, FakeCarrierPortalHandler*>; + +const char kTestCellularNetworkGuid[] = "testCellularNetworkGuid"; +const char kTestPaymentUrl[] = "testPaymentUrl"; +const char kTestCarrier[] = "testCarrier"; +const char kTestMeid[] = "testMeid"; +const char kTestImei[] = "testImei"; +const char kTestMdn[] = "testMdn"; + +class FakeCellularSetupFactory : public CellularSetupImpl::Factory { + public: + FakeCellularSetupFactory() = default; + ~FakeCellularSetupFactory() override = default; + + FakeCellularSetup* instance() { return instance_; } + + private: + // CellularSetupImpl::Factory: + std::unique_ptr<CellularSetupBase> BuildInstance() override { + EXPECT_FALSE(instance_); + auto instance = std::make_unique<FakeCellularSetup>(); + instance_ = instance.get(); + return instance; + } + + FakeCellularSetup* instance_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakeCellularSetupFactory); +}; + +} // namespace + +class CellularSetupServiceTest : public testing::Test { + protected: + CellularSetupServiceTest() = default; + ~CellularSetupServiceTest() override = default; + + // testing::Test: + void SetUp() override { + fake_cellular_setup_factory_ = std::make_unique<FakeCellularSetupFactory>(); + CellularSetupImpl::Factory::SetFactoryForTesting( + fake_cellular_setup_factory_.get()); + + service_ = std::make_unique<CellularSetupService>( + connector_factory_.RegisterInstance(mojom::kServiceName)); + + connector_factory_.GetDefaultConnector()->BindInterface( + mojom::kServiceName, &cellular_setup_ptr_); + cellular_setup_ptr_.FlushForTesting(); + } + + void TearDown() override { + CellularSetupImpl::Factory::SetFactoryForTesting(nullptr); + } + + // Calls StartActivation() and returns the fake CarrierPortalHandler and its + // associated InterfacePtr. + CarrierPortalHandlerPair CallStartActivation( + const std::string& cellular_network_guid, + FakeActivationDelegate* fake_activation_delegate) { + std::vector<std::unique_ptr<FakeCellularSetup::StartActivationInvocation>>& + start_activation_invocations = + fake_cellular_setup()->start_activation_invocations(); + size_t num_args_before_call = start_activation_invocations.size(); + base::RunLoop run_loop; + + // Make StartActivation() call and propagate it to the service. + cellular_setup_ptr_->StartActivation( + cellular_network_guid, fake_activation_delegate->GenerateInterfacePtr(), + base::BindOnce(&CellularSetupServiceTest::OnStartActivationResult, + base::Unretained(this), run_loop.QuitClosure())); + cellular_setup_ptr_.FlushForTesting(); + + // Verify that the call was made successfully. + EXPECT_EQ(num_args_before_call + 1u, start_activation_invocations.size()); + EXPECT_EQ(cellular_network_guid, + start_activation_invocations.back()->cellular_network_guid()); + + // Execute the callback and retrieve the returned CarrierPortalHandler. + FakeCarrierPortalHandler* fake_carrier_portal_observer = + start_activation_invocations.back()->ExecuteCallback(); + run_loop.RunUntilIdle(); + + EXPECT_TRUE(last_carrier_portal_observer_); + CarrierPortalHandlerPair observer_pair = + std::make_pair(std::move(*last_carrier_portal_observer_), + fake_carrier_portal_observer); + last_carrier_portal_observer_.reset(); + + return observer_pair; + } + + // Calls OnActivationStarted() for the provided ActivationDelegate, passing + // test metadata to represent the device. |fake_activation_delegate| must + // correspond to the delegate provided to the most recent call to + // CallStartActivation(). + void NotifyLastDelegateThatActivationStarted( + FakeActivationDelegate* fake_activation_delegate) { + const std::vector<mojom::CellularMetadataPtr>& cellular_metadata_list = + fake_activation_delegate->cellular_metadata_list(); + size_t num_elements_before_call = cellular_metadata_list.size(); + + GetLastActivationDelegate()->OnActivationStarted( + mojom::CellularMetadata::New(GURL(kTestPaymentUrl), kTestCarrier, + kTestMeid, kTestImei, kTestMdn)); + GetLastActivationDelegate().FlushForTesting(); + + ASSERT_EQ(num_elements_before_call + 1u, cellular_metadata_list.size()); + EXPECT_EQ(GURL(kTestPaymentUrl), + cellular_metadata_list.back()->payment_url); + EXPECT_EQ(kTestCarrier, cellular_metadata_list.back()->carrier); + EXPECT_EQ(kTestMeid, cellular_metadata_list.back()->meid); + EXPECT_EQ(kTestImei, cellular_metadata_list.back()->imei); + EXPECT_EQ(kTestMdn, cellular_metadata_list.back()->mdn); + } + + // Calls OnActivationFinished() for the provided ActivationDelegate, passing + // |activation_result| to the callback. |fake_activation_delegate| must + // correspond to the delegate provided to the most recent call to + // CallStartActivation(). + void NotifyLastDelegateThatActivationFinished( + mojom::ActivationResult activation_result, + FakeActivationDelegate* fake_activation_delegate) { + const std::vector<mojom::ActivationResult>& activation_results = + fake_activation_delegate->activation_results(); + size_t num_results_before_call = activation_results.size(); + + GetLastActivationDelegate()->OnActivationFinished(activation_result); + GetLastActivationDelegate().FlushForTesting(); + + ASSERT_EQ(num_results_before_call + 1u, activation_results.size()); + EXPECT_EQ(activation_result, activation_results.back()); + } + + // Calls OnCarrierPortalStatusChanged() for the provided + // CarrierPortalStatusObserver and verifies that the status was received. + void SendCarrierPortalStatusUpdate( + mojom::CarrierPortalStatus carrier_portal_status, + CarrierPortalHandlerPair* pair) { + const std::vector<mojom::CarrierPortalStatus>& status_updates = + pair->second->status_updates(); + size_t num_updates_before_call = status_updates.size(); + + pair->first->OnCarrierPortalStatusChange(carrier_portal_status); + pair->first.FlushForTesting(); + + ASSERT_EQ(num_updates_before_call + 1u, status_updates.size()); + EXPECT_EQ(carrier_portal_status, status_updates.back()); + } + + private: + void OnStartActivationResult( + base::OnceClosure quit_closure, + mojom::CarrierPortalHandlerPtr carrier_portal_observer) { + EXPECT_FALSE(last_carrier_portal_observer_); + last_carrier_portal_observer_ = std::move(carrier_portal_observer); + std::move(quit_closure).Run(); + } + + FakeCellularSetup* fake_cellular_setup() { + return fake_cellular_setup_factory_->instance(); + } + + mojom::ActivationDelegatePtr& GetLastActivationDelegate() { + return fake_cellular_setup() + ->start_activation_invocations() + .back() + ->activation_delegate(); + } + + base::test::ScopedTaskEnvironment scoped_task_environment_; + + std::unique_ptr<FakeCellularSetupFactory> fake_cellular_setup_factory_; + service_manager::TestConnectorFactory connector_factory_; + std::unique_ptr<CellularSetupService> service_; + + base::Optional<mojom::CarrierPortalHandlerPtr> last_carrier_portal_observer_; + + mojom::CellularSetupPtr cellular_setup_ptr_; + + DISALLOW_COPY_AND_ASSIGN(CellularSetupServiceTest); +}; + +TEST_F(CellularSetupServiceTest, StartActivation_Success) { + auto fake_activation_delegate = std::make_unique<FakeActivationDelegate>(); + + CarrierPortalHandlerPair pair = CallStartActivation( + kTestCellularNetworkGuid, fake_activation_delegate.get()); + NotifyLastDelegateThatActivationStarted(fake_activation_delegate.get()); + + SendCarrierPortalStatusUpdate( + mojom::CarrierPortalStatus::kPortalLoadedWithoutPaidUser, &pair); + SendCarrierPortalStatusUpdate( + mojom::CarrierPortalStatus::kPortalLoadedAndUserCompletedPayment, &pair); + + NotifyLastDelegateThatActivationFinished(mojom::ActivationResult::kSuccess, + fake_activation_delegate.get()); +} + +TEST_F(CellularSetupServiceTest, StartActivation_PortalFailsToLoad) { + auto fake_activation_delegate = std::make_unique<FakeActivationDelegate>(); + + CarrierPortalHandlerPair pair = CallStartActivation( + kTestCellularNetworkGuid, fake_activation_delegate.get()); + NotifyLastDelegateThatActivationStarted(fake_activation_delegate.get()); + + SendCarrierPortalStatusUpdate(mojom::CarrierPortalStatus::kPortalFailedToLoad, + &pair); + + NotifyLastDelegateThatActivationFinished( + mojom::ActivationResult::kFailedToActivate, + fake_activation_delegate.get()); +} + +TEST_F(CellularSetupServiceTest, StartActivation_ErrorDuringPayment) { + auto fake_activation_delegate = std::make_unique<FakeActivationDelegate>(); + + CarrierPortalHandlerPair pair = CallStartActivation( + kTestCellularNetworkGuid, fake_activation_delegate.get()); + NotifyLastDelegateThatActivationStarted(fake_activation_delegate.get()); + + SendCarrierPortalStatusUpdate( + mojom::CarrierPortalStatus::kPortalLoadedWithoutPaidUser, &pair); + SendCarrierPortalStatusUpdate( + mojom::CarrierPortalStatus::kPortalLoadedButErrorOccurredDuringPayment, + &pair); + + NotifyLastDelegateThatActivationFinished( + mojom::ActivationResult::kFailedToActivate, + fake_activation_delegate.get()); +} + +TEST_F(CellularSetupServiceTest, StartActivation_TimedOut) { + auto fake_activation_delegate = std::make_unique<FakeActivationDelegate>(); + + CarrierPortalHandlerPair pair = CallStartActivation( + kTestCellularNetworkGuid, fake_activation_delegate.get()); + NotifyLastDelegateThatActivationStarted(fake_activation_delegate.get()); + + SendCarrierPortalStatusUpdate( + mojom::CarrierPortalStatus::kPortalLoadedWithoutPaidUser, &pair); + SendCarrierPortalStatusUpdate( + mojom::CarrierPortalStatus::kPortalLoadedAndUserCompletedPayment, &pair); + + NotifyLastDelegateThatActivationFinished( + mojom::ActivationResult::kTimedOutActivating, + fake_activation_delegate.get()); +} + +} // namespace cellular_setup + +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/public/cpp/BUILD.gn b/chromeos/services/cellular_setup/public/cpp/BUILD.gn new file mode 100644 index 0000000..19240ecc --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/BUILD.gn
@@ -0,0 +1,38 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("manifest") { + sources = [ + "manifest.cc", + "manifest.h", + ] + + deps = [ + "//base", + "//chromeos/services/cellular_setup/public/mojom", + "//services/service_manager/public/cpp", + ] +} + +static_library("test_support") { + testonly = true + + sources = [ + "fake_activation_delegate.cc", + "fake_activation_delegate.h", + "fake_carrier_portal_handler.cc", + "fake_carrier_portal_handler.h", + "fake_cellular_setup.cc", + "fake_cellular_setup.h", + ] + + public_deps = [ + "//chromeos/services/cellular_setup", + "//chromeos/services/cellular_setup/public/mojom", + ] + + deps = [ + "//base", + ] +}
diff --git a/chromeos/services/cellular_setup/public/cpp/OWNERS b/chromeos/services/cellular_setup/public/cpp/OWNERS new file mode 100644 index 0000000..be90bb7c --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/OWNERS
@@ -0,0 +1,4 @@ +per-file manifest.h=set noparent +per-file manifest.h=file://ipc/SECURITY_OWNERS +per-file manifest.cc=set noparent +per-file manifest.cc=file://ipc/SECURITY_OWNERS \ No newline at end of file
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.cc b/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.cc new file mode 100644 index 0000000..cebdb80e --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.cc
@@ -0,0 +1,33 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h" + +namespace chromeos { + +namespace cellular_setup { + +FakeActivationDelegate::FakeActivationDelegate() = default; + +FakeActivationDelegate::~FakeActivationDelegate() = default; + +mojom::ActivationDelegatePtr FakeActivationDelegate::GenerateInterfacePtr() { + mojom::ActivationDelegatePtr interface_ptr; + bindings_.AddBinding(this, mojo::MakeRequest(&interface_ptr)); + return interface_ptr; +} + +void FakeActivationDelegate::OnActivationStarted( + mojom::CellularMetadataPtr cellular_metadata) { + cellular_metadata_list_.push_back(std::move(cellular_metadata)); +} + +void FakeActivationDelegate::OnActivationFinished( + mojom::ActivationResult activation_result) { + activation_results_.push_back(activation_result); +} + +} // namespace cellular_setup + +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h b/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h new file mode 100644 index 0000000..cad30e6e --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h
@@ -0,0 +1,53 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_ +#define CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_ + +#include <vector> + +#include "base/macros.h" +#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "mojo/public/cpp/bindings/binding_set.h" + +namespace chromeos { + +namespace cellular_setup { + +// Fake mojom::ActivationDelegate implementation. +class FakeActivationDelegate : public mojom::ActivationDelegate { + public: + FakeActivationDelegate(); + ~FakeActivationDelegate() override; + + mojom::ActivationDelegatePtr GenerateInterfacePtr(); + + const std::vector<mojom::CellularMetadataPtr>& cellular_metadata_list() + const { + return cellular_metadata_list_; + } + + const std::vector<mojom::ActivationResult>& activation_results() const { + return activation_results_; + } + + private: + // mojom::ActivationDelegate: + void OnActivationStarted( + mojom::CellularMetadataPtr cellular_metadata) override; + void OnActivationFinished(mojom::ActivationResult activation_result) override; + + std::vector<mojom::CellularMetadataPtr> cellular_metadata_list_; + std::vector<mojom::ActivationResult> activation_results_; + + mojo::BindingSet<mojom::ActivationDelegate> bindings_; + + DISALLOW_COPY_AND_ASSIGN(FakeActivationDelegate); +}; + +} // namespace cellular_setup + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc b/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc new file mode 100644 index 0000000..a29e143b --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc
@@ -0,0 +1,29 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" + +namespace chromeos { + +namespace cellular_setup { + +FakeCarrierPortalHandler::FakeCarrierPortalHandler() = default; + +FakeCarrierPortalHandler::~FakeCarrierPortalHandler() = default; + +mojom::CarrierPortalHandlerPtr +FakeCarrierPortalHandler::GenerateInterfacePtr() { + mojom::CarrierPortalHandlerPtr interface_ptr; + bindings_.AddBinding(this, mojo::MakeRequest(&interface_ptr)); + return interface_ptr; +} + +void FakeCarrierPortalHandler::OnCarrierPortalStatusChange( + mojom::CarrierPortalStatus carrier_portal_status) { + status_updates_.push_back(carrier_portal_status); +} + +} // namespace cellular_setup + +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h b/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h new file mode 100644 index 0000000..75126e0 --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h
@@ -0,0 +1,46 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_ +#define CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_ + +#include <vector> + +#include "base/macros.h" +#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "mojo/public/cpp/bindings/binding_set.h" + +namespace chromeos { + +namespace cellular_setup { + +// Fake mojom::CarrierPortalHandler implementation. +class FakeCarrierPortalHandler : public mojom::CarrierPortalHandler { + public: + FakeCarrierPortalHandler(); + ~FakeCarrierPortalHandler() override; + + mojom::CarrierPortalHandlerPtr GenerateInterfacePtr(); + + const std::vector<mojom::CarrierPortalStatus>& status_updates() const { + return status_updates_; + } + + private: + // mojom::CarrierPortalHandler: + void OnCarrierPortalStatusChange( + mojom::CarrierPortalStatus carrier_portal_status) override; + + std::vector<mojom::CarrierPortalStatus> status_updates_; + + mojo::BindingSet<mojom::CarrierPortalHandler> bindings_; + + DISALLOW_COPY_AND_ASSIGN(FakeCarrierPortalHandler); +}; + +} // namespace cellular_setup + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.cc b/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.cc new file mode 100644 index 0000000..36745a66 --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.cc
@@ -0,0 +1,57 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h" + +#include "chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" + +#include <utility> + +namespace chromeos { + +namespace cellular_setup { + +FakeCellularSetup::StartActivationInvocation::StartActivationInvocation( + const std::string& cellular_network_guid, + mojom::ActivationDelegatePtr activation_delegate, + StartActivationCallback callback) + : cellular_network_guid_(cellular_network_guid), + activation_delegate_(std::move(activation_delegate)), + callback_(std::move(callback)) {} + +FakeCellularSetup::StartActivationInvocation::~StartActivationInvocation() = + default; + +FakeCarrierPortalHandler* +FakeCellularSetup::StartActivationInvocation::ExecuteCallback() { + DCHECK(callback_); + DCHECK(!fake_carrier_portal_observer_); + + fake_carrier_portal_observer_ = std::make_unique<FakeCarrierPortalHandler>(); + std::move(callback_).Run( + fake_carrier_portal_observer_->GenerateInterfacePtr()); + + return fake_carrier_portal_observer_.get(); +} + +FakeCellularSetup::FakeCellularSetup() = default; + +FakeCellularSetup::~FakeCellularSetup() = default; + +void FakeCellularSetup::StartActivation( + const std::string& cellular_network_guid, + mojom::ActivationDelegatePtr activation_delegate, + StartActivationCallback callback) { + DCHECK(activation_delegate); + DCHECK(callback); + + start_activation_invocations_.emplace_back( + std::make_unique<StartActivationInvocation>( + cellular_network_guid, std::move(activation_delegate), + std::move(callback))); +} + +} // namespace cellular_setup + +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h b/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h new file mode 100644 index 0000000..9ab51f9 --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h
@@ -0,0 +1,79 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_ +#define CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_ + +#include <memory> +#include <vector> + +#include "base/macros.h" +#include "chromeos/services/cellular_setup/cellular_setup_base.h" +#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" + +namespace chromeos { + +namespace cellular_setup { + +class FakeCarrierPortalHandler; + +// Fake mojom::CellularSetup implementation. +class FakeCellularSetup : public CellularSetupBase { + public: + class StartActivationInvocation { + public: + StartActivationInvocation(const std::string& cellular_network_guid, + mojom::ActivationDelegatePtr activation_delegate, + StartActivationCallback callback); + ~StartActivationInvocation(); + + const std::string& cellular_network_guid() const { + return cellular_network_guid_; + } + + mojom::ActivationDelegatePtr& activation_delegate() { + return activation_delegate_; + } + + // Executes the provided callback by passing a FakeCarrierPortalHandler to + // the provided callback and returning a pointer to it as the return valuel + // for this function. + FakeCarrierPortalHandler* ExecuteCallback(); + + private: + std::string cellular_network_guid_; + mojom::ActivationDelegatePtr activation_delegate_; + StartActivationCallback callback_; + + // Null until ExecuteCallback() has been invoked. + std::unique_ptr<FakeCarrierPortalHandler> fake_carrier_portal_observer_; + + DISALLOW_COPY_AND_ASSIGN(StartActivationInvocation); + }; + + FakeCellularSetup(); + ~FakeCellularSetup() override; + + std::vector<std::unique_ptr<StartActivationInvocation>>& + start_activation_invocations() { + return start_activation_invocations_; + } + + private: + // mojom::CellularSetup: + void StartActivation(const std::string& cellular_network_guid, + mojom::ActivationDelegatePtr activation_delegate, + StartActivationCallback callback) override; + + std::vector<std::unique_ptr<StartActivationInvocation>> + start_activation_invocations_; + + DISALLOW_COPY_AND_ASSIGN(FakeCellularSetup); +}; + +} // namespace cellular_setup + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_
diff --git a/chromeos/services/cellular_setup/public/cpp/manifest.cc b/chromeos/services/cellular_setup/public/cpp/manifest.cc new file mode 100644 index 0000000..ecc9ea8 --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/manifest.cc
@@ -0,0 +1,31 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/cellular_setup/public/cpp/manifest.h" + +#include "base/no_destructor.h" +#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "chromeos/services/cellular_setup/public/mojom/constants.mojom.h" +#include "services/service_manager/public/cpp/manifest_builder.h" + +namespace chromeos { + +namespace cellular_setup { + +const service_manager::Manifest& GetManifest() { + static base::NoDestructor<service_manager::Manifest> manifest{ + service_manager::ManifestBuilder() + .WithServiceName(mojom::kServiceName) + .WithDisplayName("Cellular Setup Service") + .WithOptions(service_manager::ManifestOptionsBuilder().Build()) + .ExposeCapability( + "cellular_setup", + service_manager::Manifest::InterfaceList<mojom::CellularSetup>()) + .Build()}; + return *manifest; +} + +} // namespace cellular_setup + +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/public/cpp/manifest.h b/chromeos/services/cellular_setup/public/cpp/manifest.h new file mode 100644 index 0000000..2e9ef65 --- /dev/null +++ b/chromeos/services/cellular_setup/public/cpp/manifest.h
@@ -0,0 +1,20 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_MANIFEST_H_ +#define CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_MANIFEST_H_ + +#include "services/service_manager/public/cpp/manifest.h" + +namespace chromeos { + +namespace cellular_setup { + +const service_manager::Manifest& GetManifest(); + +} // namespace cellular_setup + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_MANIFEST_H_
diff --git a/chromeos/services/cellular_setup/public/mojom/BUILD.gn b/chromeos/services/cellular_setup/public/mojom/BUILD.gn new file mode 100644 index 0000000..a14e0c1 --- /dev/null +++ b/chromeos/services/cellular_setup/public/mojom/BUILD.gn
@@ -0,0 +1,16 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//mojo/public/tools/bindings/mojom.gni") + +mojom("mojom") { + sources = [ + "cellular_setup.mojom", + "constants.mojom", + ] + + public_deps = [ + "//url/mojom:url_mojom_gurl", + ] +}
diff --git a/chromeos/services/cellular_setup/public/mojom/OWNERS b/chromeos/services/cellular_setup/public/mojom/OWNERS new file mode 100644 index 0000000..08850f4 --- /dev/null +++ b/chromeos/services/cellular_setup/public/mojom/OWNERS
@@ -0,0 +1,2 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom b/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom new file mode 100644 index 0000000..b9573f9 --- /dev/null +++ b/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom
@@ -0,0 +1,81 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module chromeos.cellular_setup.mojom; + +import "url/mojom/url.mojom"; + +// The CellularSetup interface provides an API for clients to set up a cellular +// connection on this device. Specifically, the StartActivation() function +// provides an interface for activating a cold SIM (i.e., one which is not fully +// set up with a mobile carrier). Clients of the CellularSetup interface are +// expected to render carrier-provided UIs which allow users to sign into a +// carrier portal and pay for mobile service. + +// Status of the carrier portal; in this context, the portal refers to a website +// rendered by a carrier which allows the user to activate a cellular +// connection. +enum CarrierPortalStatus { + kPortalFailedToLoad, + kPortalLoadedWithoutPaidUser, + kPortalLoadedButErrorOccurredDuringPayment, + kPortalLoadedAndUserCompletedPayment, +}; + +// Potential results for an activation attempt. +enum ActivationResult { + kSuccess, + kFailedToActivate, + kTimedOutActivating +}; + +// Metadata corresponding to a cellular activation request which allows the +// carrier to associate the current device with an account with the carrier. +struct CellularMetadata { + // URL to which users should be directed in order to complete the + // carrier-based payment flow. + url.mojom.Url payment_url; + + // Human-readable name of the carrier associated with the SIM card. + string carrier; + + // The Mobile Equipment Identifier, a unique identifier for mobile devices. + string meid; + + // The International Mobile Equipment Identity, another unique identifier. + string imei; + + // The Mobile Directory Number, the carrier-provided number used to reach a + // mobile device. + string mdn; +}; + +// Interface for handling changes to the carrier payment portal; used by the UI +// to notify CellularSetup of updates to the portal. +interface CarrierPortalHandler { + OnCarrierPortalStatusChange(CarrierPortalStatus status); +}; + +// Delegate which is notified when activation starts and finishes. Used by the +// service to notify the UI of the state of the activation flow. +interface ActivationDelegate { + // Called when activation has started; provides relevant metadata for + // activation. + OnActivationStarted(CellularMetadata metadata); + + // Called when activation finishes, regardless of success or failure. + OnActivationFinished(ActivationResult result); +}; + +// Interface used to set up a cellular connection. +interface CellularSetup { + // Entrypoint to the activation flow. |cellular_network_guid| corresponds to + // the GUID associated with the cellular network, obtained via + // chromeos::NetworkState::guid(). |delegate|'s OnActivationFinished() + // function is guaranteed to be called. If |delegate| becomes disconnected + // during the activation process, activation is cancelled. + StartActivation( + string cellular_network_guid, + ActivationDelegate delegate) => (CarrierPortalHandler observer); +};
diff --git a/chromeos/services/cellular_setup/public/mojom/constants.mojom b/chromeos/services/cellular_setup/public/mojom/constants.mojom new file mode 100644 index 0000000..2f9f321 --- /dev/null +++ b/chromeos/services/cellular_setup/public/mojom/constants.mojom
@@ -0,0 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module chromeos.cellular_setup.mojom; + +const string kServiceName = "cellular_setup";
diff --git a/components/chromeos_camera/DEPS b/components/chromeos_camera/DEPS new file mode 100644 index 0000000..0a6d396 --- /dev/null +++ b/components/chromeos_camera/DEPS
@@ -0,0 +1,4 @@ +include_rules = [ + "+media", + "+mojo", +] \ No newline at end of file
diff --git a/components/chromeos_camera/OWNERS b/components/chromeos_camera/OWNERS new file mode 100644 index 0000000..f92472c6 --- /dev/null +++ b/components/chromeos_camera/OWNERS
@@ -0,0 +1,11 @@ +jcliang@chromium.org +shenghao@chromium.org +shik@chromium.org +wtlee@chromium.org + +# Chromium-specific owners +chfremer@chromium.org +mcasas@chromium.org + +# TEAM: chromeos-camera@chromium.org +# COMPONENT: OS>Kernel>Camera \ No newline at end of file
diff --git a/components/chromeos_camera/README b/components/chromeos_camera/README new file mode 100644 index 0000000..f66fd91 --- /dev/null +++ b/components/chromeos_camera/README
@@ -0,0 +1,2 @@ +The mojo interfaces in this component have a separate out-of-Chromium consumer, +so we moved the interfaces from //media to here. \ No newline at end of file
diff --git a/components/chromeos_camera/common/BUILD.gn b/components/chromeos_camera/common/BUILD.gn new file mode 100644 index 0000000..1c2aa7f --- /dev/null +++ b/components/chromeos_camera/common/BUILD.gn
@@ -0,0 +1,17 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//mojo/public/tools/bindings/mojom.gni") + +mojom("common") { + sources = [ + "jpeg_encode_accelerator.mojom", + ] + + public_deps = [ + "//media/mojo/interfaces", + "//mojo/public/mojom/base", + "//ui/gfx/geometry/mojo", + ] +}
diff --git a/components/chromeos_camera/common/OWNERS b/components/chromeos_camera/common/OWNERS new file mode 100644 index 0000000..16d15c7a --- /dev/null +++ b/components/chromeos_camera/common/OWNERS
@@ -0,0 +1,6 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS +per-file *.typemap=set noparent +per-file *.typemap=file://ipc/SECURITY_OWNERS +per-file *_mojom_traits*.*=set noparent +per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/media/mojo/interfaces/jpeg_encode_accelerator.mojom b/components/chromeos_camera/common/jpeg_encode_accelerator.mojom similarity index 96% rename from media/mojo/interfaces/jpeg_encode_accelerator.mojom rename to components/chromeos_camera/common/jpeg_encode_accelerator.mojom index 0c8018e..859f7706 100644 --- a/media/mojo/interfaces/jpeg_encode_accelerator.mojom +++ b/components/chromeos_camera/common/jpeg_encode_accelerator.mojom
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(crbug.com/946366): Change the namespace to chromeos_camera. module media.mojom; import "media/mojo/interfaces/media_types.mojom";
diff --git a/media/mojo/interfaces/jpeg_encode_accelerator.typemap b/components/chromeos_camera/common/jpeg_encode_accelerator.typemap similarity index 60% rename from media/mojo/interfaces/jpeg_encode_accelerator.typemap rename to components/chromeos_camera/common/jpeg_encode_accelerator.typemap index b5b310b..b1fb8cf 100644 --- a/media/mojo/interfaces/jpeg_encode_accelerator.typemap +++ b/components/chromeos_camera/common/jpeg_encode_accelerator.typemap
@@ -2,15 +2,16 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//media/mojo/interfaces/jpeg_encode_accelerator.mojom" +mojom = "//components/chromeos_camera/common/jpeg_encode_accelerator.mojom" public_headers = [ "//media/video/jpeg_encode_accelerator.h" ] -traits_headers = - [ "//media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.h" ] +traits_headers = [ + "//components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.h", +] sources = [ - "//media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.cc", + "//components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.cc", ] deps = [
diff --git a/media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.cc b/components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.cc similarity index 96% rename from media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.cc rename to components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.cc index 1e5a6a4..8313fab 100644 --- a/media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.cc +++ b/components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.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 "media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.h" +#include "components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.h" #include "base/logging.h"
diff --git a/media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.h b/components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.h similarity index 64% rename from media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.h rename to components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.h index 19eb26a..1ce52496 100644 --- a/media/mojo/interfaces/jpeg_encode_accelerator_mojom_traits.h +++ b/components/chromeos_camera/common/jpeg_encode_accelerator_mojom_traits.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_MOJO_INTERFACES_JPEG_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_ -#define MEDIA_MOJO_INTERFACES_JPEG_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_ +#ifndef COMPONENTS_CHROMEOS_CAMERA_COMMON_JPEG_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_ +#define COMPONENTS_CHROMEOS_CAMERA_COMMON_JPEG_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_ -#include "media/mojo/interfaces/jpeg_encode_accelerator.mojom.h" +#include "components/chromeos_camera/common/jpeg_encode_accelerator.mojom.h" #include "media/video/jpeg_encode_accelerator.h" namespace mojo { @@ -22,4 +22,4 @@ } // namespace mojo -#endif // MEDIA_MOJO_INTERFACES_JPEG_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_ +#endif // COMPONENTS_CHROMEOS_CAMERA_COMMON_JPEG_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_
diff --git a/components/chromeos_camera/common/typemaps.gni b/components/chromeos_camera/common/typemaps.gni new file mode 100644 index 0000000..6bc8900c --- /dev/null +++ b/components/chromeos_camera/common/typemaps.gni
@@ -0,0 +1,6 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +typemaps = + [ "//components/chromeos_camera/common/jpeg_encode_accelerator.typemap" ]
diff --git a/components/image_fetcher/core/BUILD.gn b/components/image_fetcher/core/BUILD.gn index 32334c7..b4b1527 100644 --- a/components/image_fetcher/core/BUILD.gn +++ b/components/image_fetcher/core/BUILD.gn
@@ -24,6 +24,7 @@ "request_metadata.h", ] deps = [ + ":metrics", "cache", ] public_deps = [ @@ -38,6 +39,16 @@ ] } +static_library("metrics") { + sources = [ + "image_fetcher_metrics_reporter.cc", + "image_fetcher_metrics_reporter.h", + ] + public_deps = [ + "//base", + ] +} + static_library("test_support") { testonly = true sources = [ @@ -63,10 +74,12 @@ "cached_image_fetcher_unittest.cc", "image_data_fetcher_unittest.cc", "image_fetcher_impl_unittest.cc", + "image_fetcher_metrics_reporter_unittest.cc", "request_metadata_unittest.cc", ] deps = [ ":core", + ":metrics", ":test_support", "cache", "cache:cache_unit_tests", @@ -82,9 +95,9 @@ } if (is_android) { - java_cpp_enum("cached_image_fetcher_java_enums_srcjar") { + java_cpp_enum("java_enums_srcjar") { sources = [ - "cache/cached_image_fetcher_metrics_reporter.h", + "image_fetcher_metrics_reporter.h", "image_fetcher_service.h", ] }
diff --git a/components/image_fetcher/core/cache/BUILD.gn b/components/image_fetcher/core/cache/BUILD.gn index cb231c6..4bb6a9ce 100644 --- a/components/image_fetcher/core/cache/BUILD.gn +++ b/components/image_fetcher/core/cache/BUILD.gn
@@ -4,8 +4,6 @@ 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", @@ -19,6 +17,7 @@ deps = [ "proto", "//components/base32", + "//components/image_fetcher/core:metrics", "//components/leveldb_proto", "//components/prefs", "//net", @@ -31,7 +30,6 @@ source_set("cache_unit_tests") { testonly = true sources = [ - "cached_image_fetcher_metrics_reporter_unittest.cc", "image_cache_unittest.cc", "image_data_store_disk_unittest.cc", "image_metadata_store_leveldb_unittest.cc", @@ -41,6 +39,7 @@ "proto", "//base", "//base/test:test_support", + "//components/image_fetcher/core:metrics", "//components/leveldb_proto:test_support", "//components/prefs:test_support", "//testing/gmock",
diff --git a/components/image_fetcher/core/cache/DEPS b/components/image_fetcher/core/cache/DEPS index 64683ec..1213680 100644 --- a/components/image_fetcher/core/cache/DEPS +++ b/components/image_fetcher/core/cache/DEPS
@@ -2,4 +2,5 @@ "+components/base32", "+components/leveldb_proto", "+components/prefs", + "+components/image_fetcher/core:metrics", ]
diff --git a/components/image_fetcher/core/cache/image_cache.cc b/components/image_fetcher/core/cache/image_cache.cc index e15db42..6a60788 100644 --- a/components/image_fetcher/core/cache/image_cache.cc +++ b/components/image_fetcher/core/cache/image_cache.cc
@@ -17,9 +17,9 @@ #include "base/time/clock.h" #include "base/time/time.h" #include "components/base32/base32.h" -#include "components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h" #include "components/image_fetcher/core/cache/image_data_store.h" #include "components/image_fetcher/core/cache/image_metadata_store.h" +#include "components/image_fetcher/core/image_fetcher_metrics_reporter.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" @@ -137,10 +137,9 @@ // TODO(wylieb): Consider delaying eviction as new requests come in via // separate weak pointers. - CachedImageFetcherMetricsReporter::ReportEvent( - CachedImageFetcherMetricsReporter:: - kCachedImageFetcherInternalUmaClientName, - CachedImageFetcherEvent::kCacheStartupEvictionStarted); + ImageFetcherMetricsReporter::ReportEvent( + ImageFetcherMetricsReporter::kCachedImageFetcherInternalUmaClientName, + ImageFetcherEvent::kCacheStartupEvictionStarted); // Once all the queued requests are taken care of, run eviction. base::PostTaskWithTraitsAndReply( @@ -207,7 +206,7 @@ base::Time last_eviction_time = pref_service_->GetTime(kPrefLastLRUEviction); // Only report for non-null times. if (last_eviction_time != base::Time()) { - CachedImageFetcherMetricsReporter::ReportTimeSinceLastCacheLRUEviction( + ImageFetcherMetricsReporter::ReportTimeSinceLastCacheLRUEviction( last_eviction_time); } @@ -269,10 +268,9 @@ data_store_->DeleteImage(key); } - CachedImageFetcherMetricsReporter::ReportEvent( - CachedImageFetcherMetricsReporter:: - kCachedImageFetcherInternalUmaClientName, - CachedImageFetcherEvent::kCacheStartupEvictionFinished); + ImageFetcherMetricsReporter::ReportEvent( + ImageFetcherMetricsReporter::kCachedImageFetcherInternalUmaClientName, + ImageFetcherEvent::kCacheStartupEvictionFinished); } } // namespace image_fetcher
diff --git a/components/image_fetcher/core/cache/image_cache_unittest.cc b/components/image_fetcher/core/cache/image_cache_unittest.cc index bb57342..b4349d4 100644 --- a/components/image_fetcher/core/cache/image_cache_unittest.cc +++ b/components/image_fetcher/core/cache/image_cache_unittest.cc
@@ -14,10 +14,10 @@ #include "base/test/scoped_task_environment.h" #include "base/test/simple_test_clock.h" #include "base/threading/sequenced_task_runner_handle.h" -#include "components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h" #include "components/image_fetcher/core/cache/image_data_store_disk.h" #include "components/image_fetcher/core/cache/image_metadata_store_leveldb.h" #include "components/image_fetcher/core/cache/proto/cached_image_metadata.pb.h" +#include "components/image_fetcher/core/image_fetcher_metrics_reporter.h" #include "components/leveldb_proto/testing/fake_db.h" #include "components/prefs/testing_pref_service.h" #include "testing/gmock/include/gmock/gmock.h" @@ -32,8 +32,7 @@ constexpr char kPrefLastStartupEviction[] = "cached_image_fetcher_last_startup_eviction_time"; -constexpr char kCachedImageFetcherEventHistogramName[] = - "CachedImageFetcher.Events"; +constexpr char kImageFetcherEventHistogramName[] = "ImageFetcher.Events"; constexpr char kImageUrl[] = "http://gstatic.img.com/foo.jpg"; constexpr char kImageUrlHashed[] = "3H7UODDH3WKDWK6FQ3IZT3LQMVBPYJ4M"; constexpr char kImageData[] = "data"; @@ -305,11 +304,11 @@ RunUntilIdle(); histogram_tester().ExpectBucketCount( - kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kCacheStartupEvictionStarted, 1); + kImageFetcherEventHistogramName, + ImageFetcherEvent::kCacheStartupEvictionStarted, 1); histogram_tester().ExpectBucketCount( - kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kCacheStartupEvictionFinished, 1); + kImageFetcherEventHistogramName, + ImageFetcherEvent::kCacheStartupEvictionFinished, 1); } TEST_F(CachedImageFetcherImageCacheTest, EvictionWhenFull) {
diff --git a/components/image_fetcher/core/cached_image_fetcher.cc b/components/image_fetcher/core/cached_image_fetcher.cc index deaf389..bb916df 100644 --- a/components/image_fetcher/core/cached_image_fetcher.cc +++ b/components/image_fetcher/core/cached_image_fetcher.cc
@@ -12,9 +12,9 @@ #include "base/task/post_task.h" #include "base/threading/sequenced_task_runner_handle.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/image_fetcher_metrics_reporter.h" #include "components/image_fetcher/core/request_metadata.h" #include "ui/gfx/codec/png_codec.h" #include "ui/gfx/image/image.h" @@ -66,8 +66,8 @@ static_cast<int>(bitmap.rowBytes()), /* discard_transparency */ false, std::vector<gfx::PNGCodec::Comment>(), &encoded_data); if (!result) { - CachedImageFetcherMetricsReporter::ReportEvent( - uma_client_name, CachedImageFetcherEvent::kTranscodingError); + ImageFetcherMetricsReporter::ReportEvent( + uma_client_name, ImageFetcherEvent::kTranscodingError); return ""; } else { return std::string(encoded_data.begin(), encoded_data.end()); @@ -106,8 +106,8 @@ /* cache_hit_before_network_request */ false, /* start_time */ base::Time::Now()}; - CachedImageFetcherMetricsReporter::ReportEvent( - request.params.uma_client_name(), CachedImageFetcherEvent::kImageRequest); + ImageFetcherMetricsReporter::ReportEvent(request.params.uma_client_name(), + ImageFetcherEvent::kImageRequest); if (params.skip_disk_cache_read()) { EnqueueFetchImageFromNetwork(request, std::move(image_data_callback), @@ -129,8 +129,8 @@ ImageFetcherCallback image_callback, std::string image_data) { if (image_data.empty()) { - CachedImageFetcherMetricsReporter::ReportEvent( - request.params.uma_client_name(), CachedImageFetcherEvent::kCacheMiss); + ImageFetcherMetricsReporter::ReportEvent(request.params.uma_client_name(), + ImageFetcherEvent::kCacheMiss); // Fetching from the DB failed, start a network fetch. EnqueueFetchImageFromNetwork(std::move(request), @@ -139,8 +139,8 @@ } else { DataCallbackIfPresent(std::move(image_data_callback), image_data, RequestMetadata()); - CachedImageFetcherMetricsReporter::ReportEvent( - request.params.uma_client_name(), CachedImageFetcherEvent::kCacheHit); + ImageFetcherMetricsReporter::ReportEvent(request.params.uma_client_name(), + ImageFetcherEvent::kCacheHit); // Only continue with decoding if the user actually asked for an image. if (!image_callback.is_null()) { @@ -167,12 +167,12 @@ std::move(image_data_callback), std::move(image_callback)); - CachedImageFetcherMetricsReporter::ReportEvent( + ImageFetcherMetricsReporter::ReportEvent( request.params.uma_client_name(), - CachedImageFetcherEvent::kCacheDecodingError); + ImageFetcherEvent::kCacheDecodingError); } else { ImageCallbackIfPresent(std::move(image_callback), image, RequestMetadata()); - CachedImageFetcherMetricsReporter::ReportImageLoadFromCacheTime( + ImageFetcherMetricsReporter::ReportImageLoadFromCacheTime( request.params.uma_client_name(), request.start_time); } } @@ -230,9 +230,8 @@ request_metadata); if (image_data.empty()) { - CachedImageFetcherMetricsReporter::ReportEvent( - request.params.uma_client_name(), - CachedImageFetcherEvent::kTotalFailure); + ImageFetcherMetricsReporter::ReportEvent(request.params.uma_client_name(), + ImageFetcherEvent::kTotalFailure); } StoreData(std::move(request), image_data); @@ -247,10 +246,10 @@ // Report to different histograms depending upon if there was a cache hit. if (request.cache_hit_before_network_request) { - CachedImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit( + ImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit( request.params.uma_client_name(), request.start_time); } else { - CachedImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime( + ImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime( request.params.uma_client_name(), request.start_time); } @@ -258,9 +257,8 @@ const SkBitmap* bitmap = image.IsEmpty() ? nullptr : image.ToSkBitmap(); // If the bitmap is null or otherwise not ready, skip encoding. if (bitmap == nullptr || bitmap->isNull() || !bitmap->readyToDraw()) { - CachedImageFetcherMetricsReporter::ReportEvent( - request.params.uma_client_name(), - CachedImageFetcherEvent::kTotalFailure); + ImageFetcherMetricsReporter::ReportEvent(request.params.uma_client_name(), + ImageFetcherEvent::kTotalFailure); StoreData(std::move(request), ""); } else { std::string uma_client_name = request.params.uma_client_name();
diff --git a/components/image_fetcher/core/cached_image_fetcher_unittest.cc b/components/image_fetcher/core/cached_image_fetcher_unittest.cc index 2c92f1b..b1fb203 100644 --- a/components/image_fetcher/core/cached_image_fetcher_unittest.cc +++ b/components/image_fetcher/core/cached_image_fetcher_unittest.cc
@@ -18,13 +18,13 @@ #include "base/test/scoped_task_environment.h" #include "base/test/simple_test_clock.h" #include "base/threading/sequenced_task_runner_handle.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/cache/image_data_store_disk.h" #include "components/image_fetcher/core/cache/image_metadata_store_leveldb.h" #include "components/image_fetcher/core/cache/proto/cached_image_metadata.pb.h" #include "components/image_fetcher/core/fake_image_decoder.h" #include "components/image_fetcher/core/image_fetcher_impl.h" +#include "components/image_fetcher/core/image_fetcher_metrics_reporter.h" #include "components/image_fetcher/core/image_fetcher_types.h" #include "components/leveldb_proto/testing/fake_db.h" #include "components/prefs/testing_pref_service.h" @@ -52,8 +52,7 @@ constexpr char kImageData[] = "data"; constexpr char kImageDataOther[] = "other"; -const char kCachedImageFetcherEventHistogramName[] = - "CachedImageFetcher.Events"; +const char kImageFetcherEventHistogramName[] = "ImageFetcher.Events"; const char kCacheLoadHistogramName[] = "CachedImageFetcher.ImageLoadFromCacheTime"; const char kNetworkLoadHistogramName[] = @@ -179,11 +178,10 @@ RunUntilIdle(); histogram_tester().ExpectTotalCount(kCacheLoadHistogramName, 1); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kImageRequest, - 1); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kCacheHit, 1); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kImageRequest, 1); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kCacheHit, 1); } TEST_F(CachedImageFetcherTest, FetchImageFromCacheReadOnly) { @@ -204,14 +202,13 @@ ImageFetcherParams(TRAFFIC_ANNOTATION_FOR_TESTS, kUmaClientName)); RunUntilIdle(); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kImageRequest, + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kImageRequest, 1); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kCacheHit, 1); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kCacheDecodingError, 1); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kCacheHit, 1); - histogram_tester().ExpectBucketCount( - kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kCacheDecodingError, 1); } { // Image should still be in the cache. @@ -243,12 +240,10 @@ RunUntilIdle(); histogram_tester().ExpectTotalCount(kNetworkLoadHistogramName, 1); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kImageRequest, - 1); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kCacheMiss, - 1); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kImageRequest, 1); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kCacheMiss, 1); } // Make sure the image data is in the database. { @@ -294,12 +289,10 @@ RunUntilIdle(); histogram_tester().ExpectTotalCount(kNetworkLoadHistogramName, 1); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kImageRequest, - 1); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kCacheMiss, - 1); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kImageRequest, 1); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kCacheMiss, 1); } // Make sure the image data is not in the database. {
diff --git a/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.cc b/components/image_fetcher/core/image_fetcher_metrics_reporter.cc similarity index 79% rename from components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.cc rename to components/image_fetcher/core/image_fetcher_metrics_reporter.cc index 9f301b0d..b2a4a4a7 100644 --- a/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.cc +++ b/components/image_fetcher/core/image_fetcher_metrics_reporter.cc
@@ -2,22 +2,23 @@ // 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 "components/image_fetcher/core/image_fetcher_metrics_reporter.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_macros.h" namespace image_fetcher { -const char CachedImageFetcherMetricsReporter:: - kCachedImageFetcherInternalUmaClientName[] = "Internal"; +const char + ImageFetcherMetricsReporter::kCachedImageFetcherInternalUmaClientName[] = + "Internal"; namespace { // 10 seconds in milliseconds. const int kMaxReportTimeMs = 10 * 1000; -constexpr char kEventsHistogram[] = "CachedImageFetcher.Events"; +constexpr char kEventsHistogram[] = "ImageFetcher.Events"; constexpr char kImageLoadFromCacheHistogram[] = "CachedImageFetcher.ImageLoadFromCacheTime"; constexpr char kImageLoadFromCacheJavaHistogram[] = @@ -42,21 +43,20 @@ } // namespace // static -void CachedImageFetcherMetricsReporter::ReportEvent( - const std::string& client_name, - CachedImageFetcherEvent event) { +void ImageFetcherMetricsReporter::ReportEvent(const std::string& client_name, + ImageFetcherEvent event) { DCHECK(!client_name.empty()); UMA_HISTOGRAM_ENUMERATION(kEventsHistogram, event); base::LinearHistogram::FactoryGet( kEventsHistogram + std::string(".") + client_name, 0, - static_cast<int>(CachedImageFetcherEvent::kMaxValue), - static_cast<int>(CachedImageFetcherEvent::kMaxValue), + static_cast<int>(ImageFetcherEvent::kMaxValue), + static_cast<int>(ImageFetcherEvent::kMaxValue), base::Histogram::kUmaTargetedHistogramFlag) ->Add(static_cast<int>(event)); } // static -void CachedImageFetcherMetricsReporter::ReportImageLoadFromCacheTime( +void ImageFetcherMetricsReporter::ReportImageLoadFromCacheTime( const std::string& client_name, base::Time start_time) { DCHECK(!client_name.empty()); @@ -67,7 +67,7 @@ } // static -void CachedImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava( +void ImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava( const std::string& client_name, base::Time start_time) { DCHECK(!client_name.empty()); @@ -78,7 +78,7 @@ } // static -void CachedImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava( +void ImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava( const std::string& client_name, base::Time start_time) { DCHECK(!client_name.empty()); @@ -89,7 +89,7 @@ } // static -void CachedImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime( +void ImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime( const std::string& client_name, base::Time start_time) { DCHECK(!client_name.empty()); @@ -100,7 +100,7 @@ } // static -void CachedImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit( +void ImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit( const std::string& client_name, base::Time start_time) { DCHECK(!client_name.empty()); @@ -111,7 +111,7 @@ } // static -void CachedImageFetcherMetricsReporter::ReportTimeSinceLastCacheLRUEviction( +void ImageFetcherMetricsReporter::ReportTimeSinceLastCacheLRUEviction( base::Time start_time) { base::TimeDelta time_delta = base::Time::Now() - start_time; UMA_HISTOGRAM_TIMES("CachedImageFetcher.TimeSinceLastCacheLRUEviction",
diff --git a/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h b/components/image_fetcher/core/image_fetcher_metrics_reporter.h similarity index 82% rename from components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h rename to components/image_fetcher/core/image_fetcher_metrics_reporter.h index 4b1b3b1..45c08b8 100644 --- a/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h +++ b/components/image_fetcher/core/image_fetcher_metrics_reporter.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 COMPONENTS_IMAGE_FETCHER_CORE_CACHE_CACHED_IMAGE_FETCHER_METRICS_REPORTER_H_ -#define COMPONENTS_IMAGE_FETCHER_CORE_CACHE_CACHED_IMAGE_FETCHER_METRICS_REPORTER_H_ +#ifndef COMPONENTS_IMAGE_FETCHER_CORE_IMAGE_FETCHER_METRICS_REPORTER_H_ +#define COMPONENTS_IMAGE_FETCHER_CORE_IMAGE_FETCHER_METRICS_REPORTER_H_ #include <string> @@ -12,11 +12,11 @@ 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 +// as ImageFetcherEvent. New values should be added at the end and things // should not be renumbered. // GENERATED_JAVA_ENUM_PACKAGE: ( // org.chromium.chrome.browser.image_fetcher) -enum class CachedImageFetcherEvent { +enum class ImageFetcherEvent { kImageRequest = 0, kCacheHit = 1, kCacheMiss = 2, @@ -30,14 +30,14 @@ kMaxValue = kJavaDiskCacheHit, }; -class CachedImageFetcherMetricsReporter { +class ImageFetcherMetricsReporter { public: // For use in metrics that aren't client-specific. static const char kCachedImageFetcherInternalUmaClientName[]; // Report cache events, used by CachedImageFetcher and composing classes. static void ReportEvent(const std::string& client_name, - CachedImageFetcherEvent event); + ImageFetcherEvent event); // Report the time it takes to load an image from the cache in native code. static void ReportImageLoadFromCacheTime(const std::string& client_name, @@ -67,4 +67,4 @@ } // namespace image_fetcher -#endif // COMPONENTS_IMAGE_FETCHER_CORE_CACHE_CACHED_IMAGE_FETCHER_METRICS_REPORTER_H_ +#endif // COMPONENTS_IMAGE_FETCHER_CORE_IMAGE_FETCHER_METRICS_REPORTER_H_
diff --git a/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter_unittest.cc b/components/image_fetcher/core/image_fetcher_metrics_reporter_unittest.cc similarity index 63% rename from components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter_unittest.cc rename to components/image_fetcher/core/image_fetcher_metrics_reporter_unittest.cc index 60d871b..5fe1acf 100644 --- a/components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter_unittest.cc +++ b/components/image_fetcher/core/image_fetcher_metrics_reporter_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 "components/image_fetcher/core/cache/cached_image_fetcher_metrics_reporter.h" +#include "components/image_fetcher/core/image_fetcher_metrics_reporter.h" #include <string> @@ -16,8 +16,7 @@ const char kUmaClientName[] = "foo"; const char kUmaClientNameOther[] = "bar"; -const char kCachedImageFetcherEventHistogramName[] = - "CachedImageFetcher.Events"; +const char kImageFetcherEventHistogramName[] = "ImageFetcher.Events"; const char kCacheLoadHistogramName[] = "CachedImageFetcher.ImageLoadFromCacheTime"; const char kCacheLoadHistogramNameJava[] = @@ -33,44 +32,43 @@ } // namespace -class CachedImageFetcherMetricsReporterTest : public testing::Test { +class ImageFetcherMetricsReporterTest : public testing::Test { public: - CachedImageFetcherMetricsReporterTest() {} - ~CachedImageFetcherMetricsReporterTest() override = default; + ImageFetcherMetricsReporterTest() {} + ~ImageFetcherMetricsReporterTest() override = default; base::HistogramTester& histogram_tester() { return histogram_tester_; } private: base::HistogramTester histogram_tester_; - DISALLOW_COPY_AND_ASSIGN(CachedImageFetcherMetricsReporterTest); + DISALLOW_COPY_AND_ASSIGN(ImageFetcherMetricsReporterTest); }; -TEST_F(CachedImageFetcherMetricsReporterTest, TestReportEvent) { - CachedImageFetcherMetricsReporter::ReportEvent( - kUmaClientName, CachedImageFetcherEvent::kCacheHit); - CachedImageFetcherMetricsReporter::ReportEvent( - kUmaClientNameOther, CachedImageFetcherEvent::kCacheHit); - histogram_tester().ExpectBucketCount(kCachedImageFetcherEventHistogramName, - CachedImageFetcherEvent::kCacheHit, 2); +TEST_F(ImageFetcherMetricsReporterTest, TestReportEvent) { + ImageFetcherMetricsReporter::ReportEvent(kUmaClientName, + ImageFetcherEvent::kCacheHit); + ImageFetcherMetricsReporter::ReportEvent(kUmaClientNameOther, + ImageFetcherEvent::kCacheHit); + histogram_tester().ExpectBucketCount(kImageFetcherEventHistogramName, + ImageFetcherEvent::kCacheHit, 2); histogram_tester().ExpectBucketCount( - std::string(kCachedImageFetcherEventHistogramName) + std::string(kImageFetcherEventHistogramName) .append(".") .append(kUmaClientName), - CachedImageFetcherEvent::kCacheHit, 1); + ImageFetcherEvent::kCacheHit, 1); histogram_tester().ExpectBucketCount( - std::string(kCachedImageFetcherEventHistogramName) + std::string(kImageFetcherEventHistogramName) .append(".") .append(kUmaClientNameOther), - CachedImageFetcherEvent::kCacheHit, 1); + ImageFetcherEvent::kCacheHit, 1); } -TEST_F(CachedImageFetcherMetricsReporterTest, - TestReportImageLoadFromCacheTime) { - CachedImageFetcherMetricsReporter::ReportImageLoadFromCacheTime( - kUmaClientName, base::Time()); - CachedImageFetcherMetricsReporter::ReportImageLoadFromCacheTime( - kUmaClientNameOther, base::Time()); +TEST_F(ImageFetcherMetricsReporterTest, TestReportImageLoadFromCacheTime) { + ImageFetcherMetricsReporter::ReportImageLoadFromCacheTime(kUmaClientName, + base::Time()); + ImageFetcherMetricsReporter::ReportImageLoadFromCacheTime(kUmaClientNameOther, + base::Time()); histogram_tester().ExpectTotalCount(kCacheLoadHistogramName, 2); histogram_tester().ExpectTotalCount( std::string(kCacheLoadHistogramName).append(".").append(kUmaClientName), @@ -81,11 +79,10 @@ 1); } -TEST_F(CachedImageFetcherMetricsReporterTest, - TestReportImageLoadFromCacheTimeJava) { - CachedImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava( - kUmaClientName, base::Time()); - CachedImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava( +TEST_F(ImageFetcherMetricsReporterTest, TestReportImageLoadFromCacheTimeJava) { + ImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava(kUmaClientName, + base::Time()); + ImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava( kUmaClientNameOther, base::Time()); histogram_tester().ExpectTotalCount(kCacheLoadHistogramNameJava, 2); histogram_tester().ExpectTotalCount(std::string(kCacheLoadHistogramNameJava) @@ -98,11 +95,11 @@ 1); } -TEST_F(CachedImageFetcherMetricsReporterTest, +TEST_F(ImageFetcherMetricsReporterTest, TestReportTotalFetchFromNativeTimeJava) { - CachedImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava( + ImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava( kUmaClientName, base::Time()); - CachedImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava( + ImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava( kUmaClientNameOther, base::Time()); histogram_tester().ExpectTotalCount(kTotalFetchFromNativeHistogramNameJava, 2); @@ -118,11 +115,10 @@ 1); } -TEST_F(CachedImageFetcherMetricsReporterTest, - TestReportImageLoadFromNetworkTime) { - CachedImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime( - kUmaClientName, base::Time()); - CachedImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime( +TEST_F(ImageFetcherMetricsReporterTest, TestReportImageLoadFromNetworkTime) { + ImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime(kUmaClientName, + base::Time()); + ImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime( kUmaClientNameOther, base::Time()); histogram_tester().ExpectTotalCount(kNetworkLoadHistogramName, 2); histogram_tester().ExpectTotalCount( @@ -134,11 +130,11 @@ 1); } -TEST_F(CachedImageFetcherMetricsReporterTest, +TEST_F(ImageFetcherMetricsReporterTest, TestReportImageLoadFromNetworkAfterCacheHit) { - CachedImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit( + ImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit( kUmaClientName, base::Time()); - CachedImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit( + ImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit( kUmaClientNameOther, base::Time()); histogram_tester().ExpectTotalCount(kNetworkLoadAfterCacheHitHistogram, 2); histogram_tester().ExpectTotalCount( @@ -153,9 +149,9 @@ 1); } -TEST_F(CachedImageFetcherMetricsReporterTest, +TEST_F(ImageFetcherMetricsReporterTest, TestReportTimeSinceLastCacheLRUEviction) { - CachedImageFetcherMetricsReporter::ReportTimeSinceLastCacheLRUEviction( + ImageFetcherMetricsReporter::ReportTimeSinceLastCacheLRUEviction( base::Time()); histogram_tester().ExpectTotalCount(kTimeSinceLastCacheLRUEviction, 1); }
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index 92a8579..f7b6625 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -2389,7 +2389,7 @@ اگر <ph name="PRODUCT_NAME" /> نتواند اطلاعات وضعیت ابطال را بهدست آورد، این گواهینامهها بهعنوان باطل شده تلقی میشوند («خرابی سختافزاری»). اگر این خطمشی تنظیم نشده باشد، یا روی اشتباه تنظیم شده باشد، <ph name="PRODUCT_NAME" /> از تنظیمات موجود برای بررسی ابطال آنلاین استفاده خواهد کرد.</translation> -<translation id="5728154254076636808">فعال کردن ایجاد نسخههای رومینگ برای دادههای نمایه <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" /> باید هنگام بستن دستگاه توسط کاربر انجام دهد. @@ -2858,7 +2858,7 @@ <translation id="6766216162565713893">سایتها مجاز هستند از کاربر بخواهند به دستگاه بلوتوث اطراف اجازه دسترسی بدهد</translation> <translation id="6770454900105963262">گزارش دادن اطلاعات کیوسک فعال</translation> <translation id="6786747875388722282">افزونهها</translation> -<translation id="6786967369487349613">تنظیم فهرست راهنمای نمایه رومینگ</translation> +<translation id="6786967369487349613">تنظیم فهرست راهنمای نمایه فراگردی</translation> <translation id="6795485990775913659">اجازه چاپ فقط بدون پین</translation> <translation id="6810445994095397827">مسدود کردن جاوا اسکریپت برای این سایتها</translation> <translation id="6813263547126514821">نیرو و خاموش کردن</translation> @@ -3338,7 +3338,7 @@ <translation id="7643883929273267746">محدود کردن حسابهایی که در <ph name="PRODUCT_NAME" /> نمایان هستند</translation> <translation id="7644825865811580663">اگر این تنظیم روی درست تنظیم شود، <ph name="PRODUCT_NAME" /> بدون هیچ شرطی اندازه اولین پنجره نشان داده شده در اولین اجرا را به حداکثر میرساند. اگر این تنظیم روی نادرست تنظیم شود یا پیکربندی نشود، یک فرآیند اکتشافی براساس اندازه صفحه تعیین میکند اولین پنجره در حالت حداکثر نشان داده شود یا خیر.</translation> -<translation id="7651739109954974365">تعیین میکند آیا رومینگ دادهها برای دستگاه فعال شود یا نه. درصورتیکه روی درست تنظیم شود، رومینگ دادهها امکانپذیر میشود. اگر این خطمشی پیکربندی نشود یا روی نادرست تنظیم شود، رومینگ دادهها موجود نخواهد بود.</translation> +<translation id="7651739109954974365">تعیین میکند آیا فراگردی دادهها برای دستگاه فعال شود یا نه. درصورتیکه روی درست تنظیم شود، فراگردی دادهها امکانپذیر میشود. اگر این خطمشی پیکربندی نشود یا روی نادرست تنظیم شود، فراگردی دادهها موجود نخواهد بود.</translation> <translation id="7657261947024629645">بهینهسازی برای عملکرد.</translation> <translation id="7673194325208122247">دوره زمانی (میلیثانیه)</translation> <translation id="7676708657861783864">کوکیهایی تنظیمشده توسط صفحات منطبق بر این الگوهای نشانی وب، به جلسه کنونی محدود خواهند شد، به این معنی که این کوکیها با خروج از مرورگر حذف میشوند. @@ -3576,7 +3576,7 @@ اگر کاربر همگامسازی را فعال کرده است، تمام این دادهها در نمایه همگامسازی او مانند نمایههای عادی باقی میمانند. حالت ناشناس نیز درصورتیکه توسط خطمشی غیرفعال نشده باشد، قابل دسترس است. اگر این خطمشی روی غیرفعال تنظیم شود، یا کلاً تنظیمنشده باقی بماند، ورود به سیستم به نمایههای عادی هدایت میشود.</translation> -<translation id="8158758865057576716">فعال کردن قابلیت ایجاد کپیهای رومینگ برای دادههای نمایه <ph name="PRODUCT_NAME" />.</translation> +<translation id="8158758865057576716">فعال کردن قابلیت ایجاد کپیهای فراگردی برای دادههای نمایه <ph name="PRODUCT_NAME" />.</translation> <translation id="8172676363520748127">اگر فعال شود عکسهای صفحهنمایش نمیتوانند با استفاده از میانبرهای صفحهکلید یا رابطهای برنامهنویسی نرمافزار افزونه گرفته شوند. اگر غیرفعال شود یا مشخص نشود، گرفتن عکس از صفحهنمایش مجاز است.</translation> @@ -3679,7 +3679,7 @@ اگر این خطمشی تنظیم نشود، تنظیم فعال خواهد شد.</translation> <translation id="8382184662529825177">فعال کردن استفاده از اعطای گواهی راه دور برای محافظت از محتوا برای دستگاه</translation> -<translation id="838870586332499308">رومینگ دادهها فعال شود</translation> +<translation id="838870586332499308">فراگردی دادهها فعال شود</translation> <translation id="8390049129576938611">نمایشگر PDF داخلی را در <ph name="PRODUCT_NAME" /> غیرفعال میکند. درعوض، با آن مثل بارگیری رفتار میکند و به کاربر امکان میدهد تا فایلهای PDF را با برنامه پیشفرض باز کند. اگر این خطمشی تنظیمنشده یا غیرفعال باقی بماند، افزایه PDF برای باز کردن فایلهای PDF استفاده میشود، مگر آنکه کاربر آن را غیرفعال کند.</translation>
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index ee06660..cac47a1 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -3579,6 +3579,7 @@ <translation id="793134539373873765">Tinutukoy kung gagamitin ang p2p para sa mga payload sa pag-update ng OS. Kung nakatakda sa True, ang mga device ay magbabahagi at susubukang gamitin ang mga payload sa pag-update sa LAN, na malamang na babawasan ang paggamit at pagsikip sa Internet bandwidth. Kung hindi available sa LAN ang payload sa pag-update, babalik ang device sa pag-download mula sa server sa pag-update. Kung nakatakda sa False o hindi naka-configure, hindi gagamitin ang p2p.</translation> <translation id="7933141401888114454">I-enable ang paggawa ng mga pinapangasiwaang user</translation> <translation id="793473937901685727">Itakda ang availability ng certificate para sa mga ARC app</translation> +<translation id="7937491150792971922">I-merge ang mga patakaran sa listahan ng pag-install ng extension mula sa maraming pinagmulan</translation> <translation id="7937766917976512374">Payagan o tanggihan ang pagkuha ng video</translation> <translation id="7941975817681987555">Huwag hulaan ang mga pagkilos sa network sa anumang koneksyon sa network</translation> <translation id="7952958573604504839">Hindi na ginagamit ang patakarang ito sa M48 at pinalitan na ng <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />, at inalis sa M54.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index c12d7aac..f4ab4214 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -144,7 +144,7 @@ <translation id="1197437816436565375">आप Android ऐप्लिकेशन को प्रॉक्सी का इस्तेमाल करने के लिए मजबूर नहीं कर सकते. Android ऐप्लिकेशन को प्रॉक्सी सेटिंग का सबसेट उपलब्ध कराया जाता है, जिसे वे अपनी पसंद से इस्तेमाल करना चुन सकते हैं. ज़्यादा जानकारी के लिए <ph name="PROXY_MODE_POLICY_NAME" /> नीति देखें.</translation> <translation id="1198465924256827162">डिवाइस स्थिति अपलोड भेजना कितने मिलीसेकंड में दोहराया जाता है. - अगर पॉलिसी सेट नहीं की गई हो, तो डिफ़ॉल्ट आवृत्ति 3 घंटे की होती है. न्यूनतम + अगर पॉलिसी सेट नहीं की गई हो, तो डिफ़ॉल्ट आवृत्ति 3 घंटे की होती है. कम से कम 60 सेकंड की आवृत्ति की अनुमति है.</translation> <translation id="1204263402976895730">एंटरप्राइज़ प्रिंटर चालू हैं</translation> <translation id="1216919699175573511">साइन की हुई एचटीटीपी एक्सचेंज (एसएक्सजी) सहायता चालू करें</translation> @@ -720,7 +720,7 @@ अगर नीति को गलत पर सेट किया जाता है तो, ऑन-स्क्रीन 'वर्चुअल कीबोर्ड' हमेशा बंद रहेगा. - अगर आप इस नीति को सेट करते हैं तो, उपयोगकर्ता इसे बदल नहीं सकते या इसे रद्द नहीं कर सकते. हालांकि, उपयोगकर्ता अभी भी 'ऑन-स्क्रीन कीबोर्ड' के एक्सेस को चालू/बंद कर सकेंगे जिसे इस नीति से नियंत्रित किए जाने वाले 'वर्चुअल कीबोर्ड' पर प्राथमिकता मिलती है. 'ऑन-स्क्रीन कीबोर्ड' के एक्सेस को नियंत्रित करने वाली |VirtualKeyboardEnabled| नीति देखें. + अगर आप इस नीति को सेट करते हैं तो, उपयोगकर्ता इसे बदल नहीं सकते या इसे रद्द नहीं कर सकते. हालांकि, उपयोगकर्ता अब भी 'ऑन-स्क्रीन कीबोर्ड' के एक्सेस को चालू/बंद कर सकेंगे जिसे इस नीति से नियंत्रित किए जाने वाले 'वर्चुअल कीबोर्ड' पर प्राथमिकता मिलती है. 'ऑन-स्क्रीन कीबोर्ड' के एक्सेस को नियंत्रित करने वाली |VirtualKeyboardEnabled| नीति देखें. अगर यह नीति सेट किए बिना छोड़ दी जाती है तो, 'ऑन-स्क्रीन कीबोर्ड' शुरुआत में बंद रहता है लेकिन उपयोगकर्ता इसे कभी भी चालू कर सकता है. कीबोर्ड कब दिखाना है, इसका फ़ैसला डिवाइस उपयोगकर्ता की पिछली गतिविधियों के आधार पर खुद कर सकता है.</translation> <translation id="2292084646366244343"><ph name="PRODUCT_NAME" /> वर्तनी की त्रुटियां सुधारने में सहायता करने के लिए किसी Google वेब सेवा का उपयोग कर सकता है. अगर यह सेटिंग सक्षम है, तो फिर यह सेवा हमेशा उपयोग की जाती है. अगर यह सेटिंग अक्षम है, तो फिर सेवा कभी उपयोग नहीं की जाती. @@ -817,7 +817,7 @@ अगर यह सेटिंग सक्षम है या कॉन्फ़िगर नहीं की गई है, तो उपयोगकर्ता प्रिंट कर सकते हैं. - अगर यह सेटिंग अक्षम है, तो उपयोगकर्ता <ph name="PRODUCT_NAME" /> से प्रिंट कर सकते हैं. पाना मेनू, एक्सटेंशन, JavaScript ऐप्स , इत्यादि में प्रिंटिंग अक्षम है. प्रिंट करते समय <ph name="PRODUCT_NAME" /> को बायपास करने वाले प्लग इन से प्रिंट करना अभी भी संभव है. उदाहरण के लिए, कुछ Flash ऐप्स के संदर्भ मेनू में प्रिंट विकल्प होता है, जिसे इस नीति द्वारा कवर नहीं किया जाता है.</translation> + अगर यह सेटिंग अक्षम है, तो उपयोगकर्ता <ph name="PRODUCT_NAME" /> से प्रिंट कर सकते हैं. पाना मेनू, एक्सटेंशन, JavaScript ऐप्स , इत्यादि में प्रिंटिंग अक्षम है. प्रिंट करते समय <ph name="PRODUCT_NAME" /> को बायपास करने वाले प्लग इन से प्रिंट करना अब भी संभव है. उदाहरण के लिए, कुछ Flash ऐप्स के संदर्भ मेनू में प्रिंट विकल्प होता है, जिसे इस नीति द्वारा कवर नहीं किया जाता है.</translation> <translation id="2518231489509538392">ऑडियो चलाने दें</translation> <translation id="2521581787935130926">बुकमार्क बार में ऐप्स शॉर्टकट दिखाएं</translation> <translation id="2529659024053332711">आपको स्टार्टअप पर व्यवहार तय करने की मंज़ूरी देती है. @@ -1049,7 +1049,7 @@ * अगर time_window_limit या time_usage_limit, दोनों ही चालू न हों तो डिवाइस को लॉक करने के लिए चालू |LOCK| का इस्तेमाल किया जा सकता है. * |LOCK| से उपयोगकर्ता सत्र सिर्फ़ उतनी ही देर तक के लिए लॉक हो जाता है जब तक कि अगली time_window_limit या time_usage_limit शुरू नहीं हो जाए. * |UNLOCK| से time_window_limit या time_usage_limit के ज़रिए लॉक किया हुआ उपयोगकर्ता का सत्र अनलॉक हो जाता है. - |created_time_millis| ओवरराइड बनाए जाने का UTC टाइमस्टैम्प है, इसे स्ट्रिंग के तौर पर इसलिए भेजा जाता है क्योंकि टाइमस्टैम्प किसी पूर्णांक में फ़िट नहीं बैठेगा. इसका इस्तेमाल यह तय करने के लिए किया जाता है कि इस ओवरराइड को अभी भी लागू किया जाना चाहिए या नहीं. अगर मौजूदा चालू समय सीमा की सुविधा (समय इस्तेमाल की सीमा या समय विंडो की सीमा) ओवरराइड बनाने के बाद शुरू हुई है, तो उसे कार्रवाई नहीं करना चाहिए. इसके साथ ही अगर ओवरराइड को चालू time_window_limit या time_usage_window के आखिरी बदलाव से पहले बनाया गया था, तो उसे लागू नहीं किया जाना चाहिए. + |created_time_millis| ओवरराइड बनाए जाने का UTC टाइमस्टैम्प है, इसे स्ट्रिंग के तौर पर इसलिए भेजा जाता है क्योंकि टाइमस्टैम्प किसी पूर्णांक में फ़िट नहीं बैठेगा. इसका इस्तेमाल यह तय करने के लिए किया जाता है कि इस ओवरराइड को अब भी लागू किया जाना चाहिए या नहीं. अगर मौजूदा चालू समय सीमा की सुविधा (समय इस्तेमाल की सीमा या समय विंडो की सीमा) ओवरराइड बनाने के बाद शुरू हुई है, तो उसे कार्रवाई नहीं करना चाहिए. इसके साथ ही अगर ओवरराइड को चालू time_window_limit या time_usage_window के आखिरी बदलाव से पहले बनाया गया था, तो उसे लागू नहीं किया जाना चाहिए. एक से ज़्यादा ओवरराइड भेजे जा सकते हैं, सबसे नई प्रविष्टि वह है जिसे लागू किया जाने वाला है.</translation> <translation id="2905984450136807296">प्रमाणीकरण डेटा कैश जीवनकाल</translation> @@ -1157,7 +1157,7 @@ नीतियों को नहीं बदल पाएगा.</translation> <translation id="3069958900488014740"><ph name="PRODUCT_NAME" /> में WPAD (वेब प्रॉक्सी अपने आप खोज) ऑप्टिमाइज़ेशन को बंद करती है. - अगर इस पॉलिसी को असत्य पर सेट किया जाता है, तो WPAD ऑप्टिमाइज़ेशन अक्षम हो जाता है, जिसके कारण <ph name="PRODUCT_NAME" /> को DNS-आधारित WPAD सर्वर के लिए अधिक समय तक प्रतीक्षा करनी पड़ती है. अगर यह पॉलिसी सेट नहीं है या सक्षम नहीं है, तो WPAD ऑप्टिमाइज़ेशन सक्षम हो जाता है. + अगर इस पॉलिसी को असत्य पर सेट किया जाता है, तो WPAD ऑप्टिमाइज़ेशन अक्षम हो जाता है, जिसके कारण <ph name="PRODUCT_NAME" /> को DNS-आधारित WPAD सर्वर के लिए ज़्यादा समय तक प्रतीक्षा करनी पड़ती है. अगर यह पॉलिसी सेट नहीं है या सक्षम नहीं है, तो WPAD ऑप्टिमाइज़ेशन सक्षम हो जाता है. भले ही इस पॉलिसी को किसी भी तरह से सेट किया जाए, WPAD ऑप्टिमाइज़ेशन सेटिंग को उपयोगकर्ताओं के द्वारा नहीं बदला जा सकता है.</translation> <translation id="3072045631333522102">रिटेल मोड में साइन इन स्क्रीन पर इस्तेमाल करने के लिए स्क्रीन सेवर</translation> @@ -1171,7 +1171,7 @@ ध्यान दें कि पहले इस नीति को Android पर गलती से चालू कर दिया गया था लेकिन इस कार्यक्षमता ने कभी भी Android पर पूरी तरह से काम नहीं किया.</translation> <translation id="3096595567015595053">सक्षम प्लग इन की सूची</translation> <translation id="3101501961102569744">प्रॉक्सी सर्वर सेटिंग निर्दिष्ट करने का तरीका चुनें</translation> -<translation id="3101709781009526431">दिनांक और समय</translation> +<translation id="3101709781009526431">तारीख और समय</translation> <translation id="3117676313396757089">चेतावनी: DHE को वर्शन 57 (मार्च 2017 के आस-पास) के बाद <ph name="PRODUCT_NAME" /> से पूरी तरह से निकाल दिया जाएगा और तब यह पॉलिसी काम करना बंद कर देगी. अगर पॉलिसी को सेट नहीं की हुई है या गलत पर सेट किया जाता है, तो DHE के सिफ़र सुइट को TLS में सक्षम नहीं किया जाएगा. अन्यथा किसी पुराने सर्वर के साथ संगतता बनाए रखने के लिए उसे सत्य पर सेट किया जा सकता है. यह एक स्टॉपगैप उपाय है और सर्वर को पुनः कॉन्फ़िगर किया जाना चाहिए. @@ -1275,7 +1275,7 @@ अगर इस नीति को सेट किए बिना छोड़ दिया जाता है, तो सभी साइट के लिए या तो 'DefaultWebUsbGuardSetting' नीति अगर वह सेट की गई हो, या उपयोगकर्ता के व्यक्तिगत कॉन्फ़िगरेशन से, ग्लोबल डिफ़ॉल्ट मान का इस्तेमाल किया जाएगा. इस नीति में मौजूद यूआरएल पैटर्न का टकराव WebUsbBlockedForUrls के ज़रिए कॉन्फ़िगर किए गए यूआरएल पैटर्न से नहीं होना चाहिए. अगर कोई टकराव है, तो WebUsbBlockedForUrls और WebUsbAskForUrls के बजाय इस नीति को प्राथमिकता दी जाएगी.</translation> -<translation id="3414260318408232239">अगर यह नीति कॉन्फ़िगर नहीं की जाती है तो फिर <ph name="PRODUCT_NAME" /> डिफ़ॉल्ट न्यूनतम वर्शन का इस्तेमाल करता है, जो कि TLS 1.0 है. +<translation id="3414260318408232239">अगर यह नीति कॉन्फ़िगर नहीं की जाती है तो फिर <ph name="PRODUCT_NAME" /> डिफ़ॉल्ट कम से कम वर्शन का इस्तेमाल करता है, जो कि TLS 1.0 है. अन्यथा उसे आगे दिए गए किसी एक मान पर सेट किया जा सकता है: "tls1", "tls1.1" या "tls1.2". सेट होने पर, <ph name="PRODUCT_NAME" /> बताए गए SSL/TLS वर्शन से नीचे वाले वर्शन का इस्तेमाल नहीं करेगा. नहीं पहचाने गए किसी मान को अनदेखा कर दिया जाएगा.</translation> <translation id="34160070798637152">पूरे डिवाइस के लिए नेटवर्क कॉन्फ़िगरेशन नियंत्रित करती है.</translation> @@ -1290,7 +1290,7 @@ अगर यह सेटिंग 'थोड़ा नरम' पर सेट की जाती है तो, उपयोगकर्ता YouTube पर सिर्फ़ 'थोड़ा नरम पाबंदी वाला मोड' और 'सख्त पाबंदी वाला मोड' में से किसी एक को चुन सकता है लेकिन वह पाबंदी मोड को बंद नहीं कर सकता. - अगर यह सेटिंग बंद कर दी जाती है या कोई मान सेट नहीं किया जाता है तो, <ph name="PRODUCT_NAME" /> YouTube पर पाबंदी वाला मोड लागू नहीं करता. हालांकि, YouTube की नीतियों जैसी बाहरी नीतियां अभी भी पाबंदी वाला मोड लागू कर सकती हैं.</translation> + अगर यह सेटिंग बंद कर दी जाती है या कोई मान सेट नहीं किया जाता है तो, <ph name="PRODUCT_NAME" /> YouTube पर पाबंदी वाला मोड लागू नहीं करता. हालांकि, YouTube की नीतियों जैसी बाहरी नीतियां अब भी पाबंदी वाला मोड लागू कर सकती हैं.</translation> <translation id="3428247105888806363">नेटवर्क पूर्वानुमान सक्षम करें</translation> <translation id="3432863169147125747">प्रिंटिंग सेटिंग नियंत्रित करती है.</translation> <translation id="3434932177006334880">Chrome 42 से पहले इस सेटिंग का नाम EnableWebBasedSignin था और Chrome 43 में इसके लिए पूरा समर्थन हटा दिया जाएगा. @@ -1472,11 +1472,11 @@ <translation id="3824972131618513497">पावर प्रबंधन और फिर से चालू करने से जुड़ी सेटिंग को नियंत्रित करता है.</translation> <translation id="3831376478177535007">इस सेटिंग के चालू होने पर, <ph name="PRODUCT_NAME" /> Symantec Corporation के Legacy PKI संचालनों की ओर से जारी किए गए प्रमाणपत्रों को तब अनुमति देता है अगर वे अन्यथा किसी पहचाने हुए CA प्रमाणपत्र को सफलता से मान्य करते हैं और उससे जुड़ते हैं. - ध्यान रखें कि यह नीति उस ऑपरेटिंग सिस्टम पर निर्भर करती है जो अभी भी Symantec की विरासती बुनियादी संरचना के प्रमाणपत्रों को पहचानता है. अगर किसी OS अपडेट से ऐसे प्रमाणपत्रों की OS हैंडलिंग में बदलाव होता है, तो इस नीति का कोई प्रभाव नहीं होगा. इसी के साथ, यह नीति एक अस्थायी वर्कअराउंड के रूप में लक्षित है ताकि उद्यमों को विरासती Symantec प्रमाणपत्रों से दूर जाने के लिए अधिक समय दिया जा सके. यह नीति 1 जनवरी 2019 को या उसके आस-पास कभी भी निकाल दी जाएगी. + ध्यान रखें कि यह नीति उस ऑपरेटिंग सिस्टम पर निर्भर करती है जो अब भी Symantec की विरासती बुनियादी संरचना के प्रमाणपत्रों को पहचानता है. अगर किसी OS अपडेट से ऐसे प्रमाणपत्रों की OS हैंडलिंग में बदलाव होता है, तो इस नीति का कोई प्रभाव नहीं होगा. इसी के साथ, यह नीति एक अस्थायी वर्कअराउंड के रूप में लक्षित है ताकि उद्यमों को विरासती Symantec प्रमाणपत्रों से दूर जाने के लिए ज़्यादा समय दिया जा सके. यह नीति 1 जनवरी 2019 को या उसके आस-पास कभी भी निकाल दी जाएगी. अगर यह नीति सेट नहीं है या इसे गलत पर सेट किया गया है, तो फिर <ph name="PRODUCT_NAME" /> सार्वजनिक रूप से घोषित बहिष्करण शेड्यूल का पालन करेगा. - इस बहिष्करण पर अधिक जानकारी के लिए https://g.co/chrome/symantecpkicerts देखें.</translation> + इस बहिष्करण पर ज़्यादा जानकारी के लिए https://g.co/chrome/symantecpkicerts देखें.</translation> <translation id="383466854578875212">आपको यह तय करने की सुविधा देती है कि कौनसे स्थानीय मैसेजिंग सेवा होस्ट प्रतिबंधित नहीं करने चाहिए. * के प्रतिबंधित मान का अर्थ यह है कि सभी स्थानीय मैसेजिंग सेवा होस्ट प्रतिबंधित हैं और उपयोगकर्ता केवल मान्य सूची में दिए गए स्थानीय मैसेजिंग सेवा होस्ट ही लोड किए जाएंगे. @@ -1504,7 +1504,7 @@ अगर यह नीति सेट की गई है तो, यह विविधता सीड को फ़ेच करने के लिए इस्तेमाल होने वाले यूआरएल पर 'प्रतिबंधित करें' नाम का क्वेरी पैरामीटर जोड़ देगी. पैरामीटर का मान वही होगा जो इस नीति में बताया गया है. अगर यह नीति सेट नहीं की गई हो तो, यह विविधता सीड यूआरएल में कोई बदलाव नहीं करेगी.</translation> -<translation id="3863409707075047163">न्यूनतम SSL वर्शन सक्षम किया गया</translation> +<translation id="3863409707075047163">कम से कम SSL वर्शन सक्षम किया गया</translation> <translation id="3864020628639910082">खोज सुझाव देने के लिए इस्तेमाल होने वाले सर्च इंजन का यूआरएल बताती है. यूआरएल में '<ph name="SEARCH_TERM_MARKER" />', स्ट्रिंग शामिल होनी चाहिए, जो क्वेरी के समय उस लेख से बदल दी जाएगी जो उपयोगकर्ता ने अब तक डाला है. @@ -2232,7 +2232,7 @@ मान JSON शब्दकोशों वाली स्ट्रिंग की सारिणी होना चाहिए. हर शब्दकोश का फ़ॉर्मैट { "pattern": "$URL_PATTERN", "filter" : $FILTER } होना चाहिए, जहां $URL_PATTERN एक सामग्री सेटिंग पैटर्न है. $FILTER यह प्रतिबंधित करता है कि ब्राउज़र किन क्लाइंट प्रमाणपत्रों से अपने आप चुनेगा. भले ही फ़िल्टर कोई भी हो, सिर्फ़ ऐसे प्रमाणपत्र चुने जाएंगे जिनका मिलान सर्वर के प्रमाणपत्र अनुरोध से होता है. अगर $FILTER का फ़ॉर्मैट { "ISSUER": { "CN": "$ISSUER_CN" } } है, तो अतिरिक्त रूप से सिर्फ़ ऐसे क्लाइंट प्रमाणपत्र चुने जाते हैं जिन्हें CommonName $ISSUER_CN वाले प्रमाणपत्र के ज़रिए जारी किया जाता है. अगर $FILTER खाली शब्दकोश {} है, तो क्लाइंट प्रमाणपत्रों का चुनाव अतिरिक्त रूप से प्रतिबंधित नहीं किया जाता है. अगर यह नीति सेट किए बिना छोड़ दी जाती है, तो किसी भी साइट के लिए अपने आप चुनाव नहीं किया जाएगा.</translation> -<translation id="5366977351895725771">अगर गलत पर सेट है तो, इस उपयोगकर्ता के ज़रिए निगरानी में रखा गया उपयोगकर्ता बनाया जाना बंद हो जाएगा. हालांकि, पहले से मौजूद निगरानी में रखा गया कोई उपयोगकर्ता अभी भी उपलब्ध रहेगा. +<translation id="5366977351895725771">अगर गलत पर सेट है तो, इस उपयोगकर्ता के ज़रिए निगरानी में रखा गया उपयोगकर्ता बनाया जाना बंद हो जाएगा. हालांकि, पहले से मौजूद निगरानी में रखा गया कोई उपयोगकर्ता अब भी उपलब्ध रहेगा. अगर सही पर सेट है या कॉन्फ़िगर नहीं किया गया है तो, इस उपयोगकर्ता के ज़रिए निगरानी में रखे गए उपयोगकर्ता बनाए और प्रबंधित किए जा सकेंगे.</translation> <translation id="5369937289900051171">सिर्फ़ रंगीन प्रिंटिंग</translation> @@ -2260,7 +2260,7 @@ अगर यह नीति सेट किए बिना छोड़ दी जाती है या सही पर सेट की जाती है, तो उपयोगकर्ता हमेशा की तरह वीपीएन कनेक्शन डिसकनेक्ट कर सकते हैं या उनमें बदलाव कर सकते हैं. - अगर वीपीएन कनेक्शन किसी वीपीएन ऐप्लिकेशन के ज़रिए बनाया गया है, तो ऐप्लिकेशन के अंदर मौजूद यूआई पर इस नीति का कोई असर नहीं होता. इसलिए, उपयोगकर्ता वीपीएन कनेक्शन में बदलाव करने के लिए ऐप्लिकेशन का अभी भी इस्तेमाल कर सकता है. + अगर वीपीएन कनेक्शन किसी वीपीएन ऐप्लिकेशन के ज़रिए बनाया गया है, तो ऐप्लिकेशन के अंदर मौजूद यूआई पर इस नीति का कोई असर नहीं होता. इसलिए, उपयोगकर्ता वीपीएन कनेक्शन में बदलाव करने के लिए ऐप्लिकेशन का अब भी इस्तेमाल कर सकता है. इस नीति का इस्तेमाल "हमेशा चालू वीपीएन" सुविधा के साथ मिलकर किया जाना चाहिए, जो एडमिन को बूट पर वीपीएन कनेक्शन बनाने का फ़ैसला करने देती है.</translation> <translation id="5405289061476885481">यह कॉन्फ़िगर करती है कि <ph name="PRODUCT_OS_NAME" /> की साइन इन स्क्रीन पर किस कीबोर्ड लेआउट की अनुमति है. @@ -2436,7 +2436,7 @@ <translation id="5693469654327063861">डेटा माइग्रेशन की अनुमति दें</translation> <translation id="5694594914843889579">जब यह नीति सही पर सेट की जाती है, तो फ़ाइल ब्राउज़र में बाहरी स्टोरेज उपलब्ध नहीं होगा. - इस नीति से सभी प्रकार के संग्रहण मीडिया प्रभावित होते हैं. उदाहरण के लिए: USB फ़्लैश डिस्क, बाहरी हार्ड डिस्क, SD और अन्य मेमोरी कार्ड, ऑप्टिकल मेमोरी वगैरह. आंतरिक जगह प्रभावित नहीं होती है, इसलिए डाउनलोड फ़ोल्डर में सहेजी गईं फ़ाइलें अभी भी एक्सेस की जा सकती हैं. यह नीति Google डिस्क को भी प्रभावित नहीं करती है. + इस नीति से सभी प्रकार के संग्रहण मीडिया प्रभावित होते हैं. उदाहरण के लिए: USB फ़्लैश डिस्क, बाहरी हार्ड डिस्क, SD और अन्य मेमोरी कार्ड, ऑप्टिकल मेमोरी वगैरह. आंतरिक जगह प्रभावित नहीं होती है, इसलिए डाउनलोड फ़ोल्डर में सहेजी गईं फ़ाइलें अब भी एक्सेस की जा सकती हैं. यह नीति Google डिस्क को भी प्रभावित नहीं करती है. अगर यह सेटिंग अक्षम होती है या कॉन्फ़िगर नहीं की जाती है, तो उपयोगकर्ता अपने डिवाइस पर बाहरी जगह के सभी समर्थित प्रकारों का उपयोग कर सकते हैं.</translation> <translation id="5697306356229823047">डिवाइस उपयोगकर्ताओं की रिपोर्ट करें</translation> @@ -3033,13 +3033,13 @@ इस नीति पर सिर्फ़ तभी विचार किया जाता है, जब'DefaultSearchProviderEnabled' नीति लागू हो.</translation> <translation id="6926703471186170050">बड़े किनारे के साथ डुप्लेक्स प्रिंटिंग चालू करें</translation> <translation id="6931242315485576290">Google के साथ डेटा का सिंक करना बंद करें</translation> -<translation id="6936894225179401731">प्रॉक्सी सर्वर के लिए निरंतर कनेक्शन की अधिकतम संख्या निर्दिष्ट करती है. +<translation id="6936894225179401731">प्रॉक्सी सर्वर के लिए निरंतर कनेक्शन की ज़्यादातम संख्या निर्दिष्ट करती है. कुछ प्रॉक्सी कनेक्शन प्रति क्लाइंट समवर्ती कनेक्शन की उच्च संख्या का प्रबंधन नहीं कर सकते हैं और इसका समाधान इस नीति को किसी कम मान पर सेट करके किया जा सकता है. - इस नीति का मान 100 से कम और 6 से अधिक होना चाहिए और डिफ़ॉल्ट मान 32 होता है. + इस नीति का मान 100 से कम और 6 से ज़्यादा होना चाहिए और डिफ़ॉल्ट मान 32 होता है. - कुछ वेब ऐप्स GET को हैंग करने के साथ ही कई कनेक्शन का उपयोग करने के लिए जाने जाते हैं, अत: ऐसे बहुत अधिक वेब ऐप्स के खुले होने पर 32 से नीचे कम करना ब्राउज़र नेटवर्किंग के हैंग होने का कारण बन सकता है. डिफ़ॉल्ट से कम अपने जोखिम पर करें. + कुछ वेब ऐप्स GET को हैंग करने के साथ ही कई कनेक्शन का उपयोग करने के लिए जाने जाते हैं, अत: ऐसे बहुत ज़्यादा वेब ऐप्स के खुले होने पर 32 से नीचे कम करना ब्राउज़र नेटवर्किंग के हैंग होने का कारण बन सकता है. डिफ़ॉल्ट से कम अपने जोखिम पर करें. अगर यह नीति सेट किए बिना छोड़ दी जाती है, तो डिफ़ॉल्ट मान 32 का उपयोग किया जाएगा.</translation> <translation id="6943577887654905793">Mac/Linux प्राथमिकता नाम:</translation> @@ -3368,7 +3368,7 @@ <translation id="7566878661979235378">SAML लॉगिन प्रमाणीकरण प्रकार</translation> <translation id="757395965347379751">जब यह सेटिंग सक्षम होती है, तो <ph name="PRODUCT_NAME" /> SHA-1 हस्ताक्षरित प्रमाणपत्रों की तब तक अनुमति देता है जब तक कि वे किसी स्थानीय रूप से इंस्टॉल किए गए CA प्रमाणपत्रों को सफलतापूर्वक मान्य करते हैं और उससे जुड़ते हैं. - ध्यान रखें कि यह नीति SHA-1 हस्ताक्षरों को अनुमति देने वाले ऑपरेटिंग सिस्टम प्रमाणपत्र सत्यापन स्टैक पर निर्भर करती है. अगर कोई OS अपडेट SHA-1 प्रमाणपत्रों के OS प्रबंधन में बदलाव करता है, तो हो सकता है कि यह नीति प्रभावी ना रहे. इसी के साथ, यह नीति एक अस्थायी वर्कअराउंड के रूप में लक्षित है ताकि उद्यमों को SHA-1 से दूर जाने के लिए अधिक समय दिया जा सके. यह नीति 1 जनवरी 2019 को या उसके आसपास कभी भी निकाल दिया जाएगा. + ध्यान रखें कि यह नीति SHA-1 हस्ताक्षरों को अनुमति देने वाले ऑपरेटिंग सिस्टम प्रमाणपत्र सत्यापन स्टैक पर निर्भर करती है. अगर कोई OS अपडेट SHA-1 प्रमाणपत्रों के OS प्रबंधन में बदलाव करता है, तो हो सकता है कि यह नीति प्रभावी ना रहे. इसी के साथ, यह नीति एक अस्थायी वर्कअराउंड के रूप में लक्षित है ताकि उद्यमों को SHA-1 से दूर जाने के लिए ज़्यादा समय दिया जा सके. यह नीति 1 जनवरी 2019 को या उसके आसपास कभी भी निकाल दिया जाएगा. अगर यह नीति सेट नहीं है या अगर इसे गलत पर सेट किया गया है, तो फिर <ph name="PRODUCT_NAME" /> सार्वजनिक रूप से घोषित SHA-1 बहिष्करण शेड्यूल का पालन करेगा.</translation> <translation id="7578049687634719313">इस नीति से यह तय होता है कि किसी वैकल्पिक ब्राउज़र को लॉन्च करने से पहले कितनी देर (मिलीसेकंड में) इंतज़ार करना चाहिए. @@ -3705,7 +3705,7 @@ इन सेटिंग को मैन्युअल रूप से कॉन्फ़िगर करने की ज़रूरत नहीं होती है! Windows, Mac और Linux के लिए इस्तेमाल में आसान सांचे (टेम्प्लेट) <ph name="POLICY_TEMPLATE_DOWNLOAD_URL" /> से डाउनलोड किए जा सकते हैं. -Windows पर GPO के ज़रिए नीति कॉन्फ़िगर करने का सुझाव दिया जाता है, हालांकि रजिस्ट्री के ज़रिए नीति का प्रावधान करना अभी भी Windows के ऐसे इंस्टेंस पर काम करता है जो किसी <ph name="MS_AD_NAME" /> डोमेन से जुड़े हुए हैं.</translation> +Windows पर GPO के ज़रिए नीति कॉन्फ़िगर करने का सुझाव दिया जाता है, हालांकि रजिस्ट्री के ज़रिए नीति का प्रावधान करना अब भी Windows के ऐसे इंस्टेंस पर काम करता है जो किसी <ph name="MS_AD_NAME" /> डोमेन से जुड़े हुए हैं.</translation> <translation id="8259592978873597235">अगर यह नीति सही पर सेट की जाती है या सेट नहीं की जाती, तो वीडियो चलने के दौरान इस्तेमाल करने वाले व्यक्ति को खाली बैठा हुआ नहीं माना जाता है. इससे 'इस्तेमाल में नहीं' विलंब, स्क्रीन बंद रहने का विलंब और स्क्रीन लॉक का विलंब और संगत कार्रवाइयां होने से रुक जाती हैं. अगर यह नीति गलत पर सेट की जाती है, तो वीडियो गतिविधि इस्तेमाल करने वाले को खाली माने जाने से नहीं रोकती.</translation> @@ -3944,7 +3944,7 @@ अगर यह नीति सेट नहीं है तो, उपयोगकर्ता सेटिंग बदल सकेगा और यह तय कर सकेगा कि रिपोर्ट भेजी जाएं या नहीं. 'सुरक्षित ब्राउज़िंग' के बारे में ज़्यादा जानकारी के लिए https://developers.google.com/safe-browsing देखें.</translation> -<translation id="8736538322216687231">न्यूनतम YouTube प्रतिबंधित मोड लागू करें</translation> +<translation id="8736538322216687231">कम से कम YouTube प्रतिबंधित मोड लागू करें</translation> <translation id="8749370016497832113"><ph name="PRODUCT_NAME" /> में ब्राउज़र इतिहास और डाउनलोड इतिहास को हटाना सक्षम करती है और उपयोगकर्ताओं को इस सेटिंग को बदलने से रोकती है. ध्यान दें कि इस नीति के अक्षम रहते हुए भी, ब्राउज़िंग और डाउनलोड इतिहास के बनाए रखे जाने की गारंटी नहीं दी जाती: उपयोगकर्ता इतिहास डेटाबेस फ़ाइलों को सीधे संपादित कर सकते हैं या उन्हें हटा सकते हैं, और ब्राउज़र किसी भी समय किसी या सभी इतिहास की अवधि स्वयं खत्म कर सकता है या उसे संगृहीत कर सकता है.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index e6836513..365d150 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -4170,7 +4170,7 @@ 이 정책 값은 밀리초로 지정되어야 하며 값은 30초에서 24시간 범위로 잘립니다.</translation> <translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> 기기에 사용자별로 적용되는 네트워크 구성을 사용하도록 허용합니다. 네트워크 구성은 <ph name="ONC_SPEC_URL" />에서 설명한 개방형 네트워크 구성에서 정의한 대로 JSON 형식의 문자열입니다. </translation> -<translation id="9050853837490399534">이 정책은 기기가 빠른 픽스 빌드로 업데이트되어야 하는지를 제어합니다. +<translation id="9050853837490399534">이 정책은 기기가 빠른 픽스 빌드로 업데이트되어야 하는지 여부를 제어합니다. 정책 값이 빠른 픽스 빌드로 매핑되는 토큰으로 설정된 경우 업데이트가 다른 정책에 의해 차단되지 않으면 기기가 빠른 픽스 빌드로 업데이트됩니다.
diff --git a/components/strings/components_chromium_strings_hi.xtb b/components/strings/components_chromium_strings_hi.xtb index 56ac695..103afffe9 100644 --- a/components/strings/components_chromium_strings_hi.xtb +++ b/components/strings/components_chromium_strings_hi.xtb
@@ -37,7 +37,7 @@ अगर इससे समस्या हल नहीं होती, तो बेहतर प्रदर्शन के लिए हम इस विकल्प को फिर से चुनने की अनुशंसा करते हैं.</translation> <translation id="8187289872471304532">यहां - ऐप्स > सिस्टम प्राथमिकताएं > नेटवर्क > उन्नत > प्रॉक्सी + ऐप्स > सिस्टम प्राथमिकताएं > नेटवर्क > बेहतर > प्रॉक्सी पर जाएं और चयनित प्रॉक्सी का चयन ना करें.</translation> <translation id="8684913864886094367">क्रोमियम सही तरीके से बंद नहीं हुआ.</translation> </translationbundle> \ No newline at end of file
diff --git a/components/strings/components_google_chrome_strings_hi.xtb b/components/strings/components_google_chrome_strings_hi.xtb index edd8459f45a..d888e56 100644 --- a/components/strings/components_google_chrome_strings_hi.xtb +++ b/components/strings/components_google_chrome_strings_hi.xtb
@@ -38,6 +38,6 @@ LAN सेटिंग में जाएं और "अपने LAN के लिए किसी प्रॉक्सी सर्वर का उपयोग करें" का चयन ना करें.</translation> <translation id="8187289872471304532">यहां - ऐप्स > सिस्टम प्राथमिकताएं > नेटवर्क > उन्नत > प्रॉक्सी + ऐप्स > सिस्टम प्राथमिकताएं > नेटवर्क > बेहतर > प्रॉक्सी पर जाएं और चयनित प्रॉक्सी का चयन ना करें.</translation> </translationbundle> \ No newline at end of file
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 22fdd0b..32f7823c 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -1422,7 +1422,7 @@ <translation id="8996941253935762404">سایت در پیشرو حاوی برنامههای خطرناک است</translation> <translation id="8997023839087525404">سرور گواهیای را ارائه کرده است که با استفاده از خطمشی شفافیت گواهینامه بهصورت عمومی نشان داده نشده است. برای برخی گواهیها این یک مسئله ضروری است تا از قابل اعتماد بودن آنها و محافظت دربرابر مهاجمین اطمینان حاصل شود.</translation> <translation id="9001074447101275817">پروکسی <ph name="DOMAIN" /> به نام کاربری و گذرواژه نیاز دارد.</translation> -<translation id="9004367719664099443">جلسه VR درجریان است</translation> +<translation id="9004367719664099443">جلسه VR درحال انجام است</translation> <translation id="9005998258318286617">سند PDF بارگیری نشد.</translation> <translation id="9008201768610948239">نادیده گرفتن</translation> <translation id="9011424611726486705">باز کردن تنظیمات سایت</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index feea6c9..a747e08b 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -1424,7 +1424,7 @@ <translation id="8996941253935762404">Sivusto sisältää haitallisia ohjelmia</translation> <translation id="8997023839087525404">Palvelimen lähettämän varmenteen tietoja ei ole annettu yleiseen käyttöön Certificate Transparency ‑käytännön mukaisesti. Tietojen antamista edellytetään joiltakin varmenteilta, jotta niiden luotettavuus voidaan varmistaa ja käyttäjiä suojella hyökkääjiltä.</translation> <translation id="9001074447101275817">Välityspalvelin <ph name="DOMAIN" /> vaatii käyttäjänimen ja salasanan.</translation> -<translation id="9004367719664099443">VR-istunto on käynnissä</translation> +<translation id="9004367719664099443">VR-käyttökerta on käynnissä</translation> <translation id="9005998258318286617">PDF-asiakirjan lataaminen epäonnistui.</translation> <translation id="9008201768610948239">Ohita</translation> <translation id="9011424611726486705">Avaa sivustoasetukset</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index bc30f55..9685250 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -1205,6 +1205,7 @@ <translation id="7668654391829183341">Hindi kilalang device</translation> <translation id="7669271284792375604">Maaaring subukan ng mga attacker sa site na ito na linlangin ka upang mag-install ng mga program na makakasama sa iyong karanasan sa pag-browse (halimbawa, sa pamamagitan ng pagbabago ng iyong homepage o pagpapakita ng mga karagdagang ad sa mga site na binibisita mo).</translation> <translation id="7676643023259824263">Hanapin ang text sa clipboard, na <ph name="TEXT" /></translation> +<translation id="7679176406634891508">Platform at Cloud</translation> <translation id="7681101578153515023">Baguhin ang Search Engine</translation> <translation id="7682287625158474539">Pagpapadala</translation> <translation id="7687186412095877299">Pinupunan ang mga form sa pagbabayad ng iyong mga naka-save na paraan ng pagbabayad</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 56f265a..b82c6a4 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -22,7 +22,7 @@ <translation id="1089439967362294234">पासवर्ड बदलें</translation> <translation id="109743633954054152">Chrome सेटिंग में पासवर्ड प्रबंधित करें</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> का हमेशा अनुवाद करें</translation> -<translation id="1107591249535594099">चेक किए होने पर, अधिक तेज़ फ़ॉर्म भरने के लिए Chrome इस डिवाइस पर आपके कार्ड की कॉपी संग्रहित कर लेगा.</translation> +<translation id="1107591249535594099">चेक किए होने पर, ज़्यादा तेज़ फ़ॉर्म भरने के लिए Chrome इस डिवाइस पर आपके कार्ड की कॉपी संग्रहित कर लेगा.</translation> <translation id="1110994991967754504"><ph name="PERMISSION_NAME" /> के लिए अनुमति चुनें</translation> <translation id="1113869188872983271">&पुन: क्रमित करना वापस लाएं</translation> <translation id="1125573121925420732">जब वेबसाइटें अपनी सुरक्षा अपडेट कर रही होती हैं तब चेतावनियां आम हो सकती हैं. इसमें जल्दी ही सुधार होगा.</translation> @@ -40,7 +40,7 @@ <translation id="1181037720776840403">हटाएं</translation> <translation id="1197088940767939838">नारंगी</translation> <translation id="1201402288615127009">आगे बढ़ें</translation> -<translation id="1201895884277373915">इस साइट की ओर से अधिक</translation> +<translation id="1201895884277373915">इस साइट की ओर से ज़्यादा</translation> <translation id="1206967143813997005">नाम के पहले अक्षर के गलत हस्ताक्षर</translation> <translation id="1209206284964581585">अभी छिपाएं</translation> <translation id="121201262018556460">आपने <ph name="DOMAIN" /> तक पहुंचने का प्रयास किया, लेकिन लेकिन सर्वर ने कमज़ोर कुंजी वाला प्रमाणपत्र प्रस्तुत किया. संभवत: हमलावर ने निजी कुंजी का पता लगा लिया है, और हो सकता है कि सर्वर आपका अपेक्षित सर्वर न हो (हो सकता है कि आप किसी हमलावर से बातचीत कर रहे हों).</translation> @@ -70,7 +70,7 @@ <translation id="132301787627749051">क्लिपबोर्ड इमेज खोजें</translation> <translation id="1323433172918577554">और दिखाएं</translation> <translation id="132390688737681464">पतों की जानकारी सेव करें और फ़ॉर्म में भरें</translation> -<translation id="1333989956347591814">आपकी गतिविधि इन्हें <ph name="BEGIN_EMPHASIS" />अभी भी दिखाई दे सकती है<ph name="END_EMPHASIS" />: +<translation id="1333989956347591814">आपकी गतिविधि इन्हें <ph name="BEGIN_EMPHASIS" />अब भी दिखाई दे सकती है<ph name="END_EMPHASIS" />: <ph name="BEGIN_LIST" /> <ph name="LIST_ITEM" />जिन वेबसाइट पर आप जाते हैं <ph name="LIST_ITEM" />आपका नियोक्ता या स्कूल @@ -109,7 +109,7 @@ <p>गड़बड़ी ठीक करने के लिए, उस पेज पर <strong>कनेक्ट करें</strong> को क्लिक करें जिसे आप खोलने की कोशिश कर रहे हैं.</p></translation> <translation id="1517433312004943670">फ़ोन नंबर आवश्यक है</translation> <translation id="1517500485252541695">स्वीकृत क्रेडिट और डेबिट कार्ड</translation> -<translation id="1519264250979466059">बिल्ड दिनांक</translation> +<translation id="1519264250979466059">बिल्ड तारीख</translation> <translation id="1521655867290435174">Google पत्रक</translation> <translation id="1527263332363067270">कनेक्शन के इंतज़ार में…</translation> <translation id="1529521330346880926">10x15 (एन्वेलप)</translation> @@ -121,9 +121,9 @@ <translation id="155039086686388498">इंजीनियरिंग-डी</translation> <translation id="1555130319947370107">नीला</translation> <translation id="1559528461873125649">कोई ऐसी फ़ाइल या निर्देशिका नहीं है</translation> -<translation id="1559572115229829303"><p><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> से निजी कनेक्शन स्थापित नहीं किया जा सकता क्योंकि आपके डिवाइस का दिनांक और समय (<ph name="DATE_AND_TIME" />) गलत है.</p> +<translation id="1559572115229829303"><p><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> से निजी कनेक्शन स्थापित नहीं किया जा सकता क्योंकि आपके डिवाइस का तारीख और समय (<ph name="DATE_AND_TIME" />) गलत है.</p> - <p>कृपया दिनांक और समय को <strong>सेटिंग</strong> ऐप के <strong>सामान्य</strong> अनुभाग से एडजस्ट करें.</p></translation> + <p>कृपया तारीख और समय को <strong>सेटिंग</strong> ऐप के <strong>सामान्य</strong> अनुभाग से एडजस्ट करें.</p></translation> <translation id="1569487616857761740">खत्म होने की तारीख डालें</translation> <translation id="1581080074034554886">CVC</translation> <translation id="1583429793053364125">इस वेबपेज को दिखाने के दौरान कुछ गड़बड़ी हुई है.</translation> @@ -143,7 +143,7 @@ <translation id="1662550410081243962">भुगतान के तरीके सेव करें और जानकारी भरें</translation> <translation id="1663943134801823270">कार्ड और पते Chrome से मिलते हैं. आप उन्हें <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में प्रबंधित कर सकते हैं.</translation> <translation id="1671391448414634642">अब से <ph name="SOURCE_LANGUAGE" /> भाषा के पेज का अनुवाद <ph name="TARGET_LANGUAGE" /> भाषा में किया जाएगा.</translation> -<translation id="1676269943528358898">आपकी जानकारी की सुरक्षा करने के लिए <ph name="SITE" /> आमतौर पर एन्क्रिप्शन का उपयोग करती है. जब Google Chrome ने इस बार <ph name="SITE" /> से कनेक्ट करने का प्रयास किया, तो वेबसाइट ने असामान्य और गलत क्रेडेंशियल वापस भेजे. ऐसा तब हो सकता है जब कोई हमलावर <ph name="SITE" /> होने का दावा करने का प्रयास कर रहा हो या किसी वाई-फ़ाई प्रवेश स्क्रीन ने कनेक्शन को बाधित कर दिया हो. आपकी जानकारी अभी भी सुरक्षित है क्योंकि किसी भी डेटा के आदान-प्रदान से पहले ही Google Chrome ने कनेक्शन को रोक दिया था.</translation> +<translation id="1676269943528358898">आपकी जानकारी की सुरक्षा करने के लिए <ph name="SITE" /> आमतौर पर एन्क्रिप्शन का उपयोग करती है. जब Google Chrome ने इस बार <ph name="SITE" /> से कनेक्ट करने का प्रयास किया, तो वेबसाइट ने असामान्य और गलत क्रेडेंशियल वापस भेजे. ऐसा तब हो सकता है जब कोई हमलावर <ph name="SITE" /> होने का दावा करने का प्रयास कर रहा हो या किसी वाई-फ़ाई प्रवेश स्क्रीन ने कनेक्शन को बाधित कर दिया हो. आपकी जानकारी अब भी सुरक्षित है क्योंकि किसी भी डेटा के आदान-प्रदान से पहले ही Google Chrome ने कनेक्शन को रोक दिया था.</translation> <translation id="168841957122794586">सर्वर प्रमाणपत्र में कमज़ोर क्रिप्टोग्राफ़िक कुंजी है.</translation> <translation id="1697532407822776718">आप बिल्कुल तैयार हैं!</translation> <translation id="1703835215927279855">लेटर</translation> @@ -193,10 +193,10 @@ <translation id="1948773908305951926">स्वीकृत प्रीपेड कार्ड</translation> <translation id="1962204205936693436"><ph name="DOMAIN" /> बुकमार्क</translation> <translation id="1973335181906896915">क्रमबद्ध करने में गड़बड़ी</translation> -<translation id="1974060860693918893">उन्नत</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="2001146170449793414">{COUNT,plural, =1{और 1 ज़्यादा}one{और # ज़्यादा}other{और # ज़्यादा}}</translation> <translation id="2003709556000175978">अपना पासवर्ड अभी रीसेट करें</translation> <translation id="20053308747750172">आप जिस सर्वर पर जा रहे हैं उसके लिए <ph name="ORIGIN" /> ने यह अनुरोध किया है कि उसके सभी अनुरोधों पर सुरक्षा नीति लागू की जाए. लेकिन अब इसने @@ -258,7 +258,7 @@ <translation id="2354430244986887761">Google सुरक्षित ब्राउज़िंग को हाल में <ph name="SITE" /> पर <ph name="BEGIN_LINK" />नुकसान पहुंचाने वाले ऐप्लिकेशन मिले हैं<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">आप इस साइट पर जिन चित्रों को देख रहे हैं, हो सकता है कि वे हमलावरों को दिखाई दें और हमलावर उन्हें बदलने के लिए आपको भ्रमित करें.</translation> <translation id="2356070529366658676">पूछें</translation> -<translation id="2359629602545592467">एक से अधिक</translation> +<translation id="2359629602545592467">एक से ज़्यादा</translation> <translation id="2359808026110333948">जारी रखें</translation> <translation id="2360873523816792727">सभी डिवाइस पर अपने कार्ड का इस्तेमाल करने के लिए, 'सिंक करें' चालू करें.</translation> <translation id="2365563543831475020"><ph name="CRASH_TIME" /> पर कैप्चर की गई ख़राबी रिपोर्ट अपलोड नहीं की गई</translation> @@ -289,7 +289,7 @@ <translation id="2491120439723279231">सर्वर के प्रमाणपत्र में त्रुटियां हैं.</translation> <translation id="2493640343870896922">लेटर-प्लस</translation> <translation id="2495083838625180221">JSON पार्सर</translation> -<translation id="2495093607237746763">अगर चेक किया गया हो, तो अधिक तेज़ी से फ़ॉर्म भरने के लिए क्रोमियम इस डिवाइस पर आपके कार्ड की कॉपी संग्रहित करेगा.</translation> +<translation id="2495093607237746763">अगर चेक किया गया हो, तो ज़्यादा तेज़ी से फ़ॉर्म भरने के लिए क्रोमियम इस डिवाइस पर आपके कार्ड की कॉपी संग्रहित करेगा.</translation> <translation id="2498091847651709837">नया कार्ड स्कैन करें</translation> <translation id="2501278716633472235">वापस जाएं</translation> <translation id="2503184589641749290">स्वीकृत डेबिट और प्रीपेड कार्ड</translation> @@ -366,7 +366,7 @@ <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="2985306909656435243">अगर सक्षम किया गया हो, तो ज़्यादा तेज़ी से फ़ॉर्म भरने के लिए क्रोमियम इस डिवाइस पर आपके कार्ड की एक कॉपी संग्रहित करेगा.</translation> <translation id="2985398929374701810">मान्य पता डालें</translation> <translation id="2986368408720340940">पिकअप का यह तरीका उपलब्ध नहीं है. कोई दूसरा तरीका आज़माएं.</translation> <translation id="2991174974383378012">वेबसाइटों के साथ साझाकरण</translation> @@ -417,7 +417,7 @@ <translation id="3274521967729236597">पा-काई</translation> <translation id="3282497668470633863">कार्ड पर नाम जोड़ें</translation> <translation id="3287510313208355388">ऑनलाइन होने पर डाउनलोड करें</translation> -<translation id="3293642807462928945"><ph name="POLICY_NAME" /> नीति के बारे में अधिक जानें</translation> +<translation id="3293642807462928945"><ph name="POLICY_NAME" /> नीति के बारे में ज़्यादा जानें</translation> <translation id="3303855915957856445">कोई खोज परिणाम नहीं मिला</translation> <translation id="3320021301628644560">बिलिंग पता जोड़ें</translation> <translation id="3324983252691184275">गहरा लाल</translation> @@ -452,7 +452,7 @@ <translation id="3452404311384756672">प्राप्ति अंतराल:</translation> <translation id="3456231139987291353">संख्या-11 (एन्वेलप)</translation> <translation id="3461824795358126837">हाइलाइटर</translation> -<translation id="3462200631372590220">उन्नत को छिपाएं</translation> +<translation id="3462200631372590220">बेहतर को छिपाएं</translation> <translation id="3467763166455606212">कार्ड मालिक का नाम ज़रूरी है</translation> <translation id="3468054117417088249"><ph name="TAB_SWITCH_SUFFIX" />, फ़िलहाल खुला है, 'टैब' दबाएं फिर खुले टैब पर जाने के लिए Enter दबाएं</translation> <translation id="3479539252931486093">क्या यह अनपेक्षित था? <ph name="BEGIN_LINK" />हमें बताएं<ph name="END_LINK" /></translation> @@ -506,7 +506,7 @@ <translation id="3736520371357197498">अगर आप अपनी सुरक्षा संबंधी जोखिमों को समझते हैं तो, खतरनाक प्रोग्राम हटाए जाने से पहले आप <ph name="BEGIN_LINK" />इस असुरक्षित साइट पर विज़िट<ph name="END_LINK" /> कर सकते हैं.</translation> <translation id="3744899669254331632">आप इस समय <ph name="SITE" /> पर नहीं जा सकते क्योंकि वेबसाइट ने ऐसे अव्यवस्थित क्रेडेंशियल भेजे हैं जिन्हें क्रोमियम प्रोसेस नहीं कर सकता. नेटवर्क की गड़बड़ी और हमले आमतौर पर कुछ देर के लिए होते हैं, इसलिए मुमकिन है कि यह पेज बाद में काम करे.</translation> <translation id="3745099705178523657">आपके पुष्टि करने के बाद, आपके Google खाते के कार्ड का ब्यौरा इस साइट से शेयर किया जाएगा.</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="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> <translation id="3761718714832595332">स्थिति छिपाएं</translation> @@ -523,7 +523,7 @@ <translation id="3828924085048779000">खाली पासफ़्रेज़ की अनुमति नहीं है.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ने और सुविधाओं के लिए एक्सटेंशन इंस्टॉल किया है. एक्सटेंशन आपका कुछ डेटा एक्सेस कर सकते हैं.</translation> <translation id="385051799172605136">वापस</translation> -<translation id="3858027520442213535">दिनांक और समय अपडेट करें</translation> +<translation id="3858027520442213535">तारीख और समय अपडेट करें</translation> <translation id="3884278016824448484">विरोधाभासी डिवाइस पहचानकर्ता</translation> <translation id="3885155851504623709">पैरिश</translation> <translation id="3886446263141354045">यह साइट एक्सेस करने का आपका अनुरोध <ph name="NAME" /> को भेज दिया गया है</translation> @@ -591,7 +591,7 @@ <p>समस्या को ठीक करने के लिए, अपना एंटीवायरस सॉफ़्टवेयर बंद करें. अगर सॉफ़्टवेयर बंद करने के बाद पेज काम करता है तो, सुरक्षित साइटों का इस्तेमाल करते समय इस सॉफ़्टवेयर को बंद कर दें.</p> <p>जब आपका काम हो जाए तो अपना एंटीवायरस प्रोग्राम वापस चालू करना न भूलें.</p> <h4>कदम 5: ज़्यादा मदद पाएं</h4> - <p>अगर आपको अभी भी गड़बड़ी दिखाई दे रही है तो, वेबसाइट के मालिक से संपर्क करें.</p></translation> + <p>अगर आपको अब भी गड़बड़ी दिखाई दे रही है तो, वेबसाइट के मालिक से संपर्क करें.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />नेटवर्क निदान चलाकर देखें<ph name="END_LINK" />.</translation> <translation id="4235360514405112390">मान्य</translation> <translation id="4250431568374086873">इस साइट से आपका कनेक्शन पूरी तरह से सुरक्षित नहीं है</translation> @@ -602,7 +602,7 @@ <translation id="4265872034478892965">आपके व्यवस्थापक ने अनुमति दी है</translation> <translation id="4275830172053184480">अपना डिवाइस फिर से प्रारंभ करें</translation> <translation id="4277028893293644418">पासवर्ड रीसेट करें</translation> -<translation id="4280429058323657511">, समाप्ति दिनांक <ph name="EXPIRATION_DATE_ABBR" /></translation> +<translation id="4280429058323657511">, समाप्ति तारीख <ph name="EXPIRATION_DATE_ABBR" /></translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{यह कार्ड आपके Google खाते में सेव कर लिया गया है}one{ये कार्ड आपके Google खाते में सेव कर लिए गए हैं}other{ये कार्ड आपके Google खाते में सेव कर लिए गए हैं}}</translation> <translation id="42981349822642051">विस्तृत करें</translation> <translation id="4302965934281694568">शू3 (एन्वेलप)</translation> @@ -611,7 +611,7 @@ <translation id="4312866146174492540">अवरुद्ध करें (डिफ़ॉल्ट)</translation> <translation id="4318566738941496689">आपके डिवाइस का नाम और नेटवर्क का पता</translation> <translation id="4325863107915753736">लेख ढूंढ़ने में विफल</translation> -<translation id="4326324639298822553">अपना समाप्ति दिनांक जाँचें और फिर से कोशिश करें</translation> +<translation id="4326324639298822553">अपना समाप्ति तारीख जाँचें और फिर से कोशिश करें</translation> <translation id="4331708818696583467">सुरक्षित नहीं है</translation> <translation id="4340982228985273705">इस कंप्यूटर की पहचान एंटरप्राइज़ की ओर से प्रबंधित होने के रूप में नहीं की गई है इसलिए नीति सिर्फ़ Chrome वेबस्टोर पर होस्ट किए जाने वाले एक्सटेंशन ही अपने आप इंस्टॉल कर सकती है. Chrome वेबस्टोर अपडेट यूआरएल "<ph name="CWS_UPDATE_URL" />" है.</translation> <translation id="4346197816712207223">स्वीकार किए जाने वाले क्रेडिट कार्ड</translation> @@ -685,7 +685,7 @@ <translation id="4771973620359291008">अज्ञात गड़बड़ी आई.</translation> <translation id="4785689107224900852">इस टैब पर जाएं</translation> <translation id="4798078619018708837">अपने कार्ड का ब्यौरा अपडेट करने के लिए <ph name="CREDIT_CARD" /> की खत्म होने की तारीख और कार्ड वेरीफ़िकेशन कोड (सीवीसी) डालें. आपके पुष्टि करने के बाद, आपके Google खाते के कार्ड का ब्यौरा इस साइट के साथ शेयर किया जाएगा.</translation> -<translation id="4800132727771399293">अपना अवधि समाप्ति दिनांक और CVC जाँचें और फिर से प्रयास करें</translation> +<translation id="4800132727771399293">अपना अवधि समाप्ति तारीख और CVC जाँचें और फिर से प्रयास करें</translation> <translation id="480334179571489655">शुरुआत की जगह की नीति में गड़बड़ी</translation> <translation id="4803924862070940586"><ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation> <translation id="4807049035289105102">आप इस समय <ph name="SITE" /> पर नहीं जा सकते क्योंकि वेबसाइट ने ऐसे अव्यवस्थित क्रेडेंशियल भेजे हैं जिन्हें Google Chrome प्रोसेस नहीं कर सकता. नेटवर्क की गड़बड़ी और हमले आमतौर पर कुछ देर के लिए होते हैं, इसलिए मुमकिन है कि यह पेज बाद में काम करे.</translation> @@ -822,7 +822,7 @@ <translation id="5541546772353173584">ईमेल जोड़ें</translation> <translation id="5545756402275714221">आपके लिए लेख</translation> <translation id="5556459405103347317">फिर लोड करें</translation> -<translation id="5560088892362098740">समयसीमा समाप्ति दिनांक</translation> +<translation id="5560088892362098740">समयसीमा समाप्ति तारीख</translation> <translation id="5565735124758917034">सक्रिय</translation> <translation id="5571083550517324815">इस पते से पिक अप नहीं किया जा सकता. कोई दूसरा पता चुनें.</translation> <translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 इस्तेमाल में है}one{# इस्तेमाल में हैं}other{# इस्तेमाल में हैं}})</translation> @@ -840,7 +840,7 @@ <translation id="5629630648637658800">नीति सेटिंग लोड करने में विफल</translation> <translation id="5631439013527180824">अमान्य डिवाइस प्रबंधन टोकन</translation> <translation id="5632627355679805402">आपका डेटा <ph name="TIME" /> से आपके <ph name="BEGIN_LINK" />Google पासवर्ड<ph name="END_LINK" /> के साथ सुरक्षित किया गया था. सिंक करना शुरू करने के लिए पासवर्ड डालें.</translation> -<translation id="5633066919399395251">इस समय <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="5633066919399395251">इस समय <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="563324245173044180">भ्रामक सामग्री ब्लॉक की गई.</translation> <translation id="5659593005791499971">ईमेल</translation> <translation id="5663614846592581799">9x11 (एन्वेलप)</translation> @@ -902,7 +902,7 @@ <translation id="6015796118275082299">वर्ष</translation> <translation id="6016158022840135739">{COUNT,plural, =1{पेज 1}one{पेज #}other{पेज #}}</translation> <translation id="6017514345406065928">हरा</translation> -<translation id="6017850046339264347"><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="6017850046339264347"><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="6025416945513303461"><ph name="TYPE_1" />, <ph name="TYPE_2" />, <ph name="TYPE_3" /> (सिंक किए गए)</translation> <translation id="6027201098523975773">नाम डालें</translation> <translation id="6034000775414344507">हल्का भूरा</translation> @@ -961,7 +961,7 @@ <translation id="6390662030813198813">इंजीनियरिंग-ई</translation> <translation id="6404511346730675251">बुकमार्क में बदलाव करें</translation> <translation id="6406765186087300643">सी0 (एन्वेलप)</translation> -<translation id="6410264514553301377"><ph name="CREDIT_CARD" /> का समाप्ति दिनांक और CVC डालें</translation> +<translation id="6410264514553301377"><ph name="CREDIT_CARD" /> का समाप्ति तारीख और CVC डालें</translation> <translation id="6414888972213066896">आपने अपने अभिभावक से पूछा है कि इस साइट पर जाना ठीक है या नहीं</translation> <translation id="6417515091412812850">प्रमाणपत्र को रद्द किया गया है या नहीं यह जाँच करने में असमरर्थ.</translation> <translation id="6433490469411711332">संपर्क जानकारी संपादित करें</translation> @@ -994,7 +994,7 @@ <translation id="6624427990725312378">संपर्क जानकारी</translation> <translation id="6626291197371920147">मान्य कार्ड नंबर जोड़ें</translation> <translation id="6628463337424475685"><ph name="ENGINE" /> खोज</translation> -<translation id="6630809736994426279">इस समय <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> पर मौजूद हमलावर आपके Mac पर ऐसे खतरनाक प्रोग्राम इंस्टॉल करने की कोशिश कर सकते हैं जो आपकी जानकारी (उदाहरण के लिए, फ़ोटो, पासवर्ड, संदेश और क्रेडिट कार्ड) चुराते हैं या उसे हटा देते हैं. <ph name="BEGIN_LEARN_MORE_LINK" />अधिक जानें<ph name="END_LEARN_MORE_LINK" /></translation> +<translation id="6630809736994426279">इस समय <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> पर मौजूद हमलावर आपके Mac पर ऐसे खतरनाक प्रोग्राम इंस्टॉल करने की कोशिश कर सकते हैं जो आपकी जानकारी (उदाहरण के लिए, फ़ोटो, पासवर्ड, संदेश और क्रेडिट कार्ड) चुराते हैं या उसे हटा देते हैं. <ph name="BEGIN_LEARN_MORE_LINK" />ज़्यादा जानें<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="6643016212128521049">साफ़ करें</translation> <translation id="6644283850729428850">यह नीति हटा दी गई है.</translation> <translation id="6646269444027925224">{COUNT,plural, =0{कोई नहीं}=1{1 साइट से (आप अपने Google खाते से साइन आउट नहीं होंगे)}one{# साइटों से (आप अपने Google खाते से साइन आउट नहीं होंगे)}other{# साइटों से (आप अपने Google खाते से साइन आउट नहीं होंगे)}}</translation> @@ -1092,17 +1092,17 @@ <translation id="7201591969684833065">आपका एडमिन यह देख सकता है:</translation> <translation id="7202346780273620635">लेटर-एक्स्ट्रा</translation> <translation id="7210863904660874423"><ph name="HOST_NAME" /> सुरक्षा मानकों का पालन नहीं करता.</translation> -<translation id="721197778055552897">इस समस्या के बारे में <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" />.</translation> +<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="724766306220616965">चेतावनियां, विरोध</translation> -<translation id="724975217298816891">अपने कार्ड विवरण अपडेट करने के लिए <ph name="CREDIT_CARD" /> का समय समाप्ति दिनांक और CVC डालें. आपकी तरफ से पुष्टि हो जाने पर, आपके कार्ड के विवरण इस साइट के साथ शेयर किए जाएंगे.</translation> +<translation id="724975217298816891">अपने कार्ड विवरण अपडेट करने के लिए <ph name="CREDIT_CARD" /> का समय समाप्ति तारीख और CVC डालें. आपकी तरफ से पुष्टि हो जाने पर, आपके कार्ड के विवरण इस साइट के साथ शेयर किए जाएंगे.</translation> <translation id="7251437084390964440">नेटवर्क कॉन्फ़िगरेशन ONC मानक के मुताबिक नहीं है. हो सकता है कि कॉन्फ़िगरेशन के कुछ हिस्से नहीं लाए गए हों. ज़्यादा जानकारी: <ph name="DEBUG_INFO" /></translation> -<translation id="725866823122871198"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> से एक निजी कनेक्शन स्थापित नहीं किया जा सकता क्योंकि आपके कंप्यूटर का दिनांक और समय (<ph name="DATE_AND_TIME" />) गलत है.</translation> +<translation id="725866823122871198"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> से एक निजी कनेक्शन स्थापित नहीं किया जा सकता क्योंकि आपके कंप्यूटर का तारीख और समय (<ph name="DATE_AND_TIME" />) गलत है.</translation> <translation id="7260504762447901703">एक्सेस निरस्त करें</translation> <translation id="7271803869921933038">स्वीकार किए जाने वाले प्रीपेड कार्ड</translation> <translation id="7275334191706090484">प्रबंधित बुकमार्क</translation> @@ -1145,7 +1145,7 @@ <translation id="7442725080345379071">हल्का नारंगी</translation> <translation id="7444046173054089907">यह साइट अवरोधित है</translation> <translation id="7445762425076701745">जिस सर्वर से आप कनेक्ट हैं उसकी पहचान पूरी तरह सत्यापित नहीं की जा सकती. आपने केवल आपके नेटवर्क में ही मान्य नाम का उपयोग कर किसी सर्वर से कनेक्ट किया है, जिसकी मान्यता का सत्यापन कोई बाह्य प्रमाणपत्र प्राधिकरण नहीं करता है. जैसा कि कुछ प्रमाणपत्र प्राधिकरण इन नामों के लिए प्रमाणपत्र जारी कर देंगे, और इस पर ध्यान नहीं दिया जाएगा कि यह सुनिश्चित करने का कोई तरीका नहीं है कि आप नियत वेबसाइट से कनेक्ट हैं, न कि किसी आक्रमणकर्ता से.</translation> -<translation id="7451311239929941790">इस समस्या के बारे में <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" />.</translation> +<translation id="7451311239929941790">इस समस्या के बारे में <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" />.</translation> <translation id="7455133967321480974">वैश्विक डिफ़ॉल्ट का उपयोग करें (अवरोधित करें)</translation> <translation id="7460618730930299168">यह स्क्रीनिंग आपकी चुनी गई स्क्रीनिंग से अलग है. क्या आप जारी रखना चाहते हैं?</translation> <translation id="7473891865547856676">नहीं, रहने दें</translation> @@ -1186,7 +1186,7 @@ <translation id="7633909222644580952">परफ़ॉर्मेंस डेटा और क्रैश रिपोर्ट</translation> <translation id="7637571805876720304">क्रोमियम से क्रेडिट कार्ड निकालें?</translation> <translation id="7639968568612851608">गहरा धूसर</translation> -<translation id="765676359832457558">उन्नत सेटिंग छिपाएं...</translation> +<translation id="765676359832457558">बेहतर सेटिंग छिपाएं...</translation> <translation id="7658239707568436148">अभी नहीं</translation> <translation id="7662298039739062396">सेटिंग किसी एक्सटेंशन से नियंत्रित है</translation> <translation id="7663736086183791259">प्रमाणपत्र <ph name="CERTIFICATE_VALIDITY" /></translation> @@ -1349,7 +1349,7 @@ <translation id="8543556556237226809">प्रश्न पूछना चाहते हैं? तो उस व्यक्ति से संपर्क करें जो आपकी प्रोफ़ाइल की निगरानी करता है.</translation> <translation id="8553075262323480129">अनुवाद विफल हो गया क्योंकि पेज की भाषा निर्धारित नहीं की जा सकी.</translation> <translation id="8557066899867184262">कार्ड वेरीफ़िकेशन कोड (सीवीसी) आपके कार्ड के पीछे मौजूद होता है.</translation> -<translation id="8559762987265718583"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> से एक निजी कनेक्शन स्थापित नहीं किया जा सकता क्योंकि आपके डिवाइस का दिनांक और समय (<ph name="DATE_AND_TIME" />) गलत है.</translation> +<translation id="8559762987265718583"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> से एक निजी कनेक्शन स्थापित नहीं किया जा सकता क्योंकि आपके डिवाइस का तारीख और समय (<ph name="DATE_AND_TIME" />) गलत है.</translation> <translation id="8564985650692024650">अगर आपने अपने <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> पासवर्ड का दूसरी साइटों पर दोबारा इस्तेमाल किया है, तो क्रोमियम आपको उसे रीसेट करने का सुझाव देता है.</translation> <translation id="8571890674111243710">पेज का अनुवाद <ph name="LANGUAGE" /> में कर रहा है...</translation> <translation id="858637041960032120">फ़ोन नंबर जोड़ें @@ -1420,7 +1420,7 @@ <translation id="9020742383383852663">ए8</translation> <translation id="9025348182339809926">(मान्य नहीं है)</translation> <translation id="9035022520814077154">सुरक्षा गड़बड़ी</translation> -<translation id="9038649477754266430">अधिक तेज़ी से पेज लोड करने के लिए किसी पूर्वानुमान सेवा का उपयोग करें</translation> +<translation id="9038649477754266430">ज़्यादा तेज़ी से पेज लोड करने के लिए किसी पूर्वानुमान सेवा का उपयोग करें</translation> <translation id="9039213469156557790">इसके अतिरिक्त, इस पेज में ऐसे अन्य संसाधन भी शामिल हैं, जो सुरक्षित नहीं हैं. ट्रांज़िट में होने के दौरान ये संसाधन अन्य लोगों द्वारा देखे जा सकते हैं और पेज का व्यवहार बदलने के लिए किसी हमवलावर द्वारा इनमें बदलाव किए जा सकते हैं.</translation> <translation id="9045525010788763347"><ph name="RESULT_MODIFIED_DATE" /> - <ph name="RESULT_PRODUCT_SOURCE" /></translation> <translation id="9049981332609050619">आपने <ph name="DOMAIN" /> पर पहुंचने की कोशिश की लेकिन सर्वर ने एक अमान्य प्रमाणपत्र पेश किया.</translation> @@ -1430,7 +1430,7 @@ <translation id="9069693763241529744">किसी एक्सटेंशन से अवरोधित है</translation> <translation id="9076283476770535406">इसमें वयस्क सामग्री हो सकती है</translation> <translation id="9076630408993835509">यह ब्राउज़र कोई कंपनी या दूसरा संगठन प्रबंधित नहीं करता. शायद इस डिवाइस की गतिविधि को Chrome से बाहर प्रबंधित किया जाए. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> -<translation id="9078964945751709336">अधिक जानकारी की आवश्यकता है</translation> +<translation id="9078964945751709336">ज़्यादा जानकारी की आवश्यकता है</translation> <translation id="9080712759204168376">ऑर्डर की जानकारी</translation> <translation id="9103872766612412690"><ph name="SITE" /> आपकी जानकारी की सुरक्षा करने के लिए आमतौर पर एन्क्रिप्शन का उपयोग करती है. जब क्रोमियम ने इस बार <ph name="SITE" /> से कनेक्ट करने की कोशिश की, तो वेबसाइट ने असामान्य और गलत क्रेडेंशियल वापस भेजे. ऐसा तब हो सकता है जब कोई हमलावर <ph name="SITE" /> होने का दावा करने की कोशिश कर रहा हो या किसी वाई-फ़ाई साइन इन स्क्रीन ने कनेक्शन को रोक दिया हो. आपकी जानकारी अब भी सुरक्षित है क्योंकि किसी भी डेटा के लेन-देन से पहले ही क्रोमियम ने कनेक्शन को रोक दिया था.</translation> <translation id="9106062320799175032">बिलिंग पता जोड़ें</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index a5e5274..14af635 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -764,7 +764,7 @@ <translation id="5252000469029418751">C7 (envelop)</translation> <translation id="5254958791078852567">E1</translation> <translation id="5283044957620376778">B1</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Beëindigen</translation> <translation id="5284909709419567258">Netwerkadressen</translation> <translation id="5285570108065881030">Alle opgeslagen wachtwoorden weergeven</translation> <translation id="5287240709317226393">Cookies weergeven</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 50c7e2fd..f710445 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -777,7 +777,7 @@ <translation id="5252000469029418751">C7 (konvolutt)</translation> <translation id="5254958791078852567">E1</translation> <translation id="5283044957620376778">B1</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Avslutt</translation> <translation id="5284909709419567258">Nettverksadresser</translation> <translation id="5285570108065881030">Vis alle lagrede passord</translation> <translation id="5287240709317226393">Vis informasjonskapsler</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index 6480209d..9bcffa5 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -777,7 +777,7 @@ <translation id="5252000469029418751">C7 (Envelope)</translation> <translation id="5254958791078852567">E1</translation> <translation id="5283044957620376778">B1</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Fim</translation> <translation id="5284909709419567258">Endereços de rede</translation> <translation id="5285570108065881030">Mostrar todas as senhas salvas</translation> <translation id="5287240709317226393">Mostrar cookies</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index d9edabc4..f04aa8d3 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -768,7 +768,7 @@ <translation id="5252000469029418751">C7 (என்வலப்)</translation> <translation id="5254958791078852567">E1</translation> <translation id="5283044957620376778">B1</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">நிறுத்து</translation> <translation id="5284909709419567258">நெட்வொர்க் முகவரிகள்</translation> <translation id="5285570108065881030">சேமித்த எல்லாக் கடவுச்சொற்களையும் காட்டு</translation> <translation id="5287240709317226393">குக்கீகளைக் காட்டும்</translation> @@ -1406,6 +1406,7 @@ <translation id="8996941253935762404">தளத்தில் தீங்கிழைக்கும் நிரல்கள் அதிகளவில் உள்ளன</translation> <translation id="8997023839087525404">சான்றிதழ் வெளிப்படைத்தன்மை கொள்கையின்படி பொதுவில் வெளியிடப்படாத சான்றிதழைச் சேவையகம் வழங்கியுள்ளது. நம்பகத்தன்மை மற்றும் தாக்குதல்களுக்கு எதிரான பாதுகாப்பை உறுதிசெய்ய, சில சான்றிதழ்களுக்கு இது தேவையான ஒன்றாகும்.</translation> <translation id="9001074447101275817"><ph name="DOMAIN" /> என்கிற ப்ராக்ஸிக்கு பயனர்பெயரும் கடவுச்சொல்லும் தேவை.</translation> +<translation id="9004367719664099443">VR அமர்வு செயல்பாட்டிலுள்ளது</translation> <translation id="9005998258318286617">PDF ஆவணத்தை ஏற்ற முடியவில்லை.</translation> <translation id="9008201768610948239">புறக்கணி</translation> <translation id="9011424611726486705">தள அமைப்புகளைத் திறக்கும்</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 3d427f9..c635c28 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -765,7 +765,7 @@ <translation id="5252000469029418751">C7 (Envelope)</translation> <translation id="5254958791078852567">E1</translation> <translation id="5283044957620376778">B1</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">结束</translation> <translation id="5284909709419567258">网络地址</translation> <translation id="5285570108065881030">显示所有已保存的密码</translation> <translation id="5287240709317226393">显示 Cookie</translation>
diff --git a/components/tracing/common/trace_startup_config.cc b/components/tracing/common/trace_startup_config.cc index a8f1051..7e984cb 100644 --- a/components/tracing/common/trace_startup_config.cc +++ b/components/tracing/common/trace_startup_config.cc
@@ -54,6 +54,7 @@ const char kTraceConfigParam[] = "trace_config"; const char kStartupDurationParam[] = "startup_duration"; const char kResultFileParam[] = "result_file"; +const char kResultDirectoryParam[] = "result_directory"; } // namespace @@ -281,9 +282,16 @@ if (startup_duration_ < 0) startup_duration_ = 0; - base::FilePath::StringType result_file_str; - if (dict->GetString(kResultFileParam, &result_file_str)) - result_file_ = base::FilePath(result_file_str); + base::FilePath::StringType result_file_or_dir_str; + if (dict->GetString(kResultFileParam, &result_file_or_dir_str)) + result_file_ = base::FilePath(result_file_or_dir_str); + else if (dict->GetString(kResultDirectoryParam, &result_file_or_dir_str)) { + result_file_ = base::FilePath(result_file_or_dir_str); + // Java time to get an int instead of a double. + result_file_ = result_file_.AppendASCII( + base::NumberToString(base::Time::Now().ToJavaTime()) + + "_chrometrace.log"); + } return true; }
diff --git a/components/tracing/common/trace_startup_config.h b/components/tracing/common/trace_startup_config.h index bc132ab8..a1e4e34 100644 --- a/components/tracing/common/trace_startup_config.h +++ b/components/tracing/common/trace_startup_config.h
@@ -56,6 +56,13 @@ // e.g., by DevTools. In that case, the trace log will not be // saved to this file. // +// result_directory: A directory to save traces to. The saved traces will be +// named chrometrace.log, prefixed with the Unix timestamp of +// Chrome's startup time. This is meant for cases where Chrome +// is started multiple times from one command line, such as +// during tests. This option is ignored if result_file is also +// specified. +// // The trace config file can be specified by the --trace-config-file flag on // most platforms except on Android, e.g., --trace-config-file=path/to/file/. // This flag should not be used with --trace-startup; otherwise,
diff --git a/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc b/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc index a2195f4..07f6280 100644 --- a/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc +++ b/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc
@@ -99,12 +99,12 @@ void CreateArcProtectedBufferManager( arc::mojom::ProtectedBufferManagerRequest pbm_request) override {} -#endif // defined(OS_CHROMEOS) - void CreateJpegDecodeAccelerator( - media::mojom::MjpegDecodeAcceleratorRequest jda_request) override {} void CreateJpegEncodeAccelerator( media::mojom::JpegEncodeAcceleratorRequest jea_request) override {} +#endif // defined(OS_CHROMEOS) + void CreateJpegDecodeAccelerator( + media::mojom::MjpegDecodeAcceleratorRequest jda_request) override {} void CreateVideoEncodeAcceleratorProvider( media::mojom::VideoEncodeAcceleratorProviderRequest request) override {}
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index 809b126c..e8bfed66 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -307,6 +307,8 @@ # then this build target will no longer be needed. viz_source_set("gpu_service_dependencies") { sources = [ + "display_embedder/image_context.cc", + "display_embedder/image_context.h", "display_embedder/skia_output_device.cc", "display_embedder/skia_output_device.h", "display_embedder/skia_output_device_gl.cc",
diff --git a/components/viz/service/display/dc_layer_overlay.cc b/components/viz/service/display/dc_layer_overlay.cc index 422e4b3..bf9a25c5 100644 --- a/components/viz/service/display/dc_layer_overlay.cc +++ b/components/viz/service/display/dc_layer_overlay.cc
@@ -140,15 +140,10 @@ return quad_rect; } -// GetOcclusionBounds() - Find a rectangle containing all the quads in a list -// that occlude the area in target_quad. -// |has_occluding_surface_damage| - used for underlay power optimization. -gfx::RectF GetOcclusionBounds(const gfx::RectF& target_quad, - QuadList::ConstIterator quad_list_begin, - QuadList::ConstIterator quad_list_end, - bool* has_occluding_surface_damage) { - gfx::RectF occlusion_bounding_box; - *has_occluding_surface_damage = false; +// Any occluding quads in the quad list on top of the overlay/underlay +bool HasOccludingQuads(const gfx::RectF& target_quad, + QuadList::ConstIterator quad_list_begin, + QuadList::ConstIterator quad_list_end) { for (auto overlap_iter = quad_list_begin; overlap_iter != quad_list_end; ++overlap_iter) { float opacity = overlap_iter->shared_quad_state->opacity; @@ -163,14 +158,10 @@ alpha < std::numeric_limits<float>::epsilon()) continue; } - overlap_rect.Intersect(target_quad); - if (!overlap_rect.IsEmpty()) { - occlusion_bounding_box.Union(overlap_rect); - *has_occluding_surface_damage |= - overlap_iter->shared_quad_state->has_surface_damage; - } + if (overlap_rect.Intersects(target_quad)) + return true; } - return occlusion_bounding_box; + return false; } void RecordDCLayerResult(DCLayerResult result, @@ -192,13 +183,15 @@ } void RecordOverlayHistograms(bool is_overlay, - bool has_occluding_surface_damage, - bool zero_damage_rect, - bool occluding_damage_equal_to_damage_rect) { + const gfx::Rect& occluding_damage_rect, + gfx::Rect* damage_rect) { UMA_HISTOGRAM_BOOLEAN("GPU.DirectComposition.IsUnderlay", !is_overlay); + bool has_occluding_surface_damage = !occluding_damage_rect.IsEmpty(); + bool occluding_damage_equal_to_damage_rect = + occluding_damage_rect == *damage_rect; OverlayProcessor::RecordOverlayDamageRectHistograms( - is_overlay, has_occluding_surface_damage, zero_damage_rect, + is_overlay, has_occluding_surface_damage, damage_rect->IsEmpty(), occluding_damage_equal_to_damage_rect); } } // namespace @@ -241,7 +234,6 @@ void DCLayerOverlayProcessor::ClearOverlayState() { previous_frame_underlay_rect_ = gfx::Rect(); - previous_frame_underlay_occlusion_ = gfx::Rect(); previous_frame_overlay_rect_union_ = gfx::Rect(); previous_frame_processed_overlay_count_ = 0; } @@ -347,7 +339,6 @@ gfx::Rect* damage_rect, DCLayerOverlayList* dc_layer_overlays) { gfx::Rect this_frame_underlay_rect; - gfx::Rect this_frame_underlay_occlusion; QuadList* quad_list = &render_pass->quad_list; auto next_it = quad_list->begin(); @@ -386,12 +377,14 @@ gfx::Rect quad_rectangle_in_target_space = gfx::ToEnclosingRect(ClippedQuadRectangle(*it)); - bool has_occluding_surface_damage = false; - gfx::RectF occlusion_bounding_box = GetOcclusionBounds( - gfx::RectF(quad_rectangle_in_target_space), quad_list->begin(), it, - &has_occluding_surface_damage); + gfx::Rect occluding_damage_rect = + it->shared_quad_state->occluding_damage_rect.has_value() + ? it->shared_quad_state->occluding_damage_rect.value() + : quad_rectangle_in_target_space; // Non-root video is always treated as underlay. - bool is_overlay = occlusion_bounding_box.IsEmpty() && is_root; + bool is_overlay = is_root && !HasOccludingQuads( + gfx::RectF(quad_rectangle_in_target_space), + quad_list->begin(), it); // Skip quad if it's an underlay and underlays are not allowed if (!is_overlay) { @@ -435,9 +428,8 @@ next_it = it; } else { ProcessForUnderlay(display_rect, render_pass, - quad_rectangle_in_target_space, occlusion_bounding_box, - it, is_root, damage_rect, &this_frame_underlay_rect, - &this_frame_underlay_occlusion, &dc_layer); + quad_rectangle_in_target_space, it, is_root, + damage_rect, &this_frame_underlay_rect, &dc_layer); } gfx::Rect rect_in_root = cc::MathUtil::MapEnclosingClippedRect( @@ -445,9 +437,8 @@ current_frame_overlay_rect_union_.Union(rect_in_root); RecordDCLayerResult(DC_LAYER_SUCCESS, dc_layer.protected_video_type); - RecordOverlayHistograms(is_overlay, has_occluding_surface_damage, - damage_rect->IsEmpty(), - occlusion_bounding_box == gfx::RectF(*damage_rect)); + RecordOverlayHistograms(is_overlay, occluding_damage_rect, damage_rect); + dc_layer_overlays->push_back(dc_layer); // Only allow one overlay unless it's hardware protected video. @@ -474,7 +465,6 @@ damage_rect->Intersect(gfx::ToEnclosingRect(display_rect)); previous_display_rect_ = display_rect; previous_frame_underlay_rect_ = this_frame_underlay_rect; - previous_frame_underlay_occlusion_ = this_frame_underlay_occlusion; } } @@ -499,12 +489,10 @@ const gfx::RectF& display_rect, RenderPass* render_pass, const gfx::Rect& quad_rectangle, - const gfx::RectF& occlusion_bounding_box, const QuadList::Iterator& it, bool is_root, gfx::Rect* damage_rect, gfx::Rect* this_frame_underlay_rect, - gfx::Rect* this_frame_underlay_occlusion, DCLayerOverlay* dc_layer) { // Assign decreasing z-order so that underlays processed earlier, and hence // which are above the subsequent underlays, are placed above in the direct @@ -581,8 +569,6 @@ if (is_root && current_frame_processed_overlay_count_ == 0 && is_axis_aligned && is_opaque) { *this_frame_underlay_rect = quad_rectangle; - *this_frame_underlay_occlusion = - gfx::ToEnclosingRect(occlusion_bounding_box); } // Propagate the punched holes up the chain of render passes. Punch through
diff --git a/components/viz/service/display/dc_layer_overlay.h b/components/viz/service/display/dc_layer_overlay.h index 919f112..b005ccdb 100644 --- a/components/viz/service/display/dc_layer_overlay.h +++ b/components/viz/service/display/dc_layer_overlay.h
@@ -105,16 +105,13 @@ void ProcessForUnderlay(const gfx::RectF& display_rect, RenderPass* render_pass, const gfx::Rect& quad_rectangle, - const gfx::RectF& occlusion_bounding_box, const QuadList::Iterator& it, bool is_root, gfx::Rect* damage_rect, gfx::Rect* this_frame_underlay_rect, - gfx::Rect* this_frame_underlay_occlusion, DCLayerOverlay* dc_layer); gfx::Rect previous_frame_underlay_rect_; - gfx::Rect previous_frame_underlay_occlusion_; gfx::RectF previous_display_rect_; // previous and current overlay_rect_union_ include both overlay and underlay gfx::Rect previous_frame_overlay_rect_union_;
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc index 2211eea9..80c8576 100644 --- a/components/viz/service/display/display_resource_provider.cc +++ b/components/viz/service/display/display_resource_provider.cc
@@ -547,6 +547,7 @@ // TODO(penghuang): support software resource. DCHECK(resource->is_gpu_resource_type()); + metadata.resource_id = id; metadata.mailbox_holder = resource->transferable.mailbox_holder; metadata.size = resource->transferable.size; metadata.resource_format = resource->transferable.format; @@ -667,10 +668,10 @@ to_return.reserve(unused.size()); std::vector<ReturnedResource*> need_synchronization_resources; std::vector<GLbyte*> unverified_sync_tokens; - std::vector<sk_sp<SkImage>> external_used_sk_images; + std::vector<ResourceId> external_used_resource_ids; std::vector<ReturnedResource*> external_used_resources; if (external_use_client_) { - external_used_sk_images.reserve(unused.size()); + external_used_resource_ids.reserve(unused.size()); external_used_resources.reserve(unused.size()); } @@ -684,7 +685,7 @@ auto sk_image_it = resource_sk_images_.find(local_id); if (sk_image_it != resource_sk_images_.end()) { if (external_use_client_) { - external_used_sk_images.push_back(std::move(sk_image_it->second)); + external_used_resource_ids.push_back(local_id); is_external_used_resource = true; } resource_sk_images_.erase(sk_image_it); @@ -771,11 +772,9 @@ for (ReturnedResource* returned : need_synchronization_resources) returned->sync_token = new_sync_token; - if (external_use_client_ && !external_used_sk_images.empty()) { - auto sync_token = external_use_client_->ReleasePromiseSkImages( - std::move(external_used_sk_images)); - for (auto* to_return : external_used_resources) - to_return->sync_token = sync_token; + if (external_use_client_ && !external_used_resource_ids.empty()) { + external_use_client_->ReleaseCachedPromiseSkImages( + std::move(external_used_resource_ids)); } if (!to_return.empty()) @@ -954,23 +953,6 @@ return resource_provider_->LockForExternalUse(id); } -sk_sp<SkImage> -DisplayResourceProvider::LockSetForExternalUse::LockResourceAndCreateSkImage( - ResourceId id, - SkAlphaType alpha_type, - GrSurfaceOrigin origin) { - auto metadata = LockResource(id); - metadata.alpha_type = alpha_type; - metadata.origin = origin; - auto& resource_sk_image = resource_provider_->resource_sk_images_[id]; - if (!resource_sk_image) { - resource_sk_image = - resource_provider_->external_use_client_->MakePromiseSkImage( - std::move(metadata)); - } - return resource_sk_image; -} - void DisplayResourceProvider::LockSetForExternalUse::UnlockResources( const gpu::SyncToken& sync_token) { for (const auto& id : resources_)
diff --git a/components/viz/service/display/display_resource_provider.h b/components/viz/service/display/display_resource_provider.h index 4d89c29..0033144 100644 --- a/components/viz/service/display/display_resource_provider.h +++ b/components/viz/service/display/display_resource_provider.h
@@ -41,6 +41,7 @@ } // namespace gpu namespace viz { + class ContextProvider; class SharedBitmapManager; class SkiaOutputSurface; @@ -205,12 +206,6 @@ // Lock a resource for external use. ResourceMetadata LockResource(ResourceId resource_id); - // Lock a resource and create a SkImage from it by using - // Client::CreateImage. - sk_sp<SkImage> LockResourceAndCreateSkImage(ResourceId resource_id, - SkAlphaType alpha_type, - GrSurfaceOrigin origin); - // Unlock all locked resources with a |sync_token|. // See UnlockForExternalUse for the detail. All resources must be unlocked // before destroying this class.
diff --git a/components/viz/service/display/resource_metadata.cc b/components/viz/service/display/resource_metadata.cc index c746e42..c46dfab2 100644 --- a/components/viz/service/display/resource_metadata.cc +++ b/components/viz/service/display/resource_metadata.cc
@@ -8,11 +8,11 @@ ResourceMetadata::ResourceMetadata() = default; -ResourceMetadata::ResourceMetadata(ResourceMetadata&& other) = default; +ResourceMetadata::ResourceMetadata(const ResourceMetadata& other) = default; ResourceMetadata::~ResourceMetadata() = default; -ResourceMetadata& ResourceMetadata::operator=(ResourceMetadata&& other) = +ResourceMetadata& ResourceMetadata::operator=(const ResourceMetadata& other) = default; } // namespace viz
diff --git a/components/viz/service/display/resource_metadata.h b/components/viz/service/display/resource_metadata.h index 540fa98..3b90d30 100644 --- a/components/viz/service/display/resource_metadata.h +++ b/components/viz/service/display/resource_metadata.h
@@ -7,6 +7,7 @@ #include "GrTypes.h" #include "components/viz/common/resources/resource_format.h" +#include "components/viz/common/resources/resource_id.h" #include "components/viz/service/viz_service_export.h" #include "gpu/command_buffer/common/mailbox_holder.h" #include "gpu/command_buffer/common/sync_token.h" @@ -19,9 +20,12 @@ // Used to construct a promise SkImage for a ResourceId. struct VIZ_SERVICE_EXPORT ResourceMetadata { ResourceMetadata(); - ResourceMetadata(ResourceMetadata&& other); + ResourceMetadata(const ResourceMetadata& other); ~ResourceMetadata(); - ResourceMetadata& operator=(ResourceMetadata&& other); + ResourceMetadata& operator=(const ResourceMetadata& other); + + // Resource Id. + ResourceId resource_id = kInvalidResourceId; // A mailbox holder for the resource texture. gpu::MailboxHolder mailbox_holder;
diff --git a/components/viz/service/display/skia_output_surface.h b/components/viz/service/display/skia_output_surface.h index 5e2e412..1dbf55a 100644 --- a/components/viz/service/display/skia_output_surface.h +++ b/components/viz/service/display/skia_output_surface.h
@@ -52,7 +52,8 @@ // |metadata| is satisfied. The SwapBuffers should take care of this by // scheduling a GPU task with all resource sync tokens recorded by // MakePromiseSkImage for the current frame. - virtual sk_sp<SkImage> MakePromiseSkImage(ResourceMetadata metadata) = 0; + virtual sk_sp<SkImage> MakePromiseSkImage( + const ResourceMetadata& metadata) = 0; // Make a promise SkImage from the given |metadata| and the |yuv_color_space|. // For YUV format, at least three resource metadatas should be provided. @@ -62,7 +63,7 @@ // pixels from y panel, metadatas[1] contains pixels from u and v panels. If // has_alpha is true, the last item in metadatas contains alpha panel. virtual sk_sp<SkImage> MakePromiseSkImageFromYUV( - std::vector<ResourceMetadata> metadatas, + const std::vector<ResourceMetadata>& metadatas, SkYUVColorSpace yuv_color_space, sk_sp<SkColorSpace> dst_color_space, bool has_alpha) = 0; @@ -70,8 +71,7 @@ // Release SkImages created by MakePromiseSkImage on the thread on which // it was fulfilled. SyncToken represents point after which SkImage is // released. - virtual gpu::SyncToken ReleasePromiseSkImages( - std::vector<sk_sp<SkImage>> images) = 0; + virtual void ReleaseCachedPromiseSkImages(std::vector<ResourceId> ids) = 0; // Swaps the current backbuffer to the screen. virtual void SkiaSwapBuffers(OutputSurfaceFrame frame) = 0;
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc index bb80993b..e1e93f2a 100644 --- a/components/viz/service/display/skia_renderer.cc +++ b/components/viz/service/display/skia_renderer.cc
@@ -480,9 +480,11 @@ // to store the new created image later. auto& image = skia_renderer->promise_images_[resource_id]; if (!image) { - image = - skia_renderer->lock_set_for_external_use_ - ->LockResourceAndCreateSkImage(resource_id, alpha_type, origin); + auto metadata = + skia_renderer->lock_set_for_external_use_->LockResource(resource_id); + metadata.alpha_type = alpha_type; + metadata.origin = origin; + image = skia_renderer->skia_output_surface_->MakePromiseSkImage(metadata); LOG_IF(ERROR, !image) << "Failed to create the promise sk image."; } sk_image_ = image.get();
diff --git a/components/viz/service/display_embedder/image_context.cc b/components/viz/service/display_embedder/image_context.cc new file mode 100644 index 0000000..cc894f7a --- /dev/null +++ b/components/viz/service/display_embedder/image_context.cc
@@ -0,0 +1,51 @@ +// 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/viz/service/display_embedder/image_context.h" + +#include "gpu/command_buffer/service/shared_image_representation.h" +#include "third_party/skia/include/core/SkPromiseImageTexture.h" + +namespace viz { + +ImageContext::ImageContext(const gpu::Mailbox& mailbox, + const gfx::Size& size, + ResourceFormat resource_format, + sk_sp<SkColorSpace> color_space, + SkAlphaType alpha_type, + GrSurfaceOrigin origin, + const gpu::SyncToken& sync_token) + : mailbox(mailbox), + size(size), + resource_format(resource_format), + color_space(std::move(color_space)), + alpha_type(alpha_type), + origin(origin), + sync_token(sync_token) {} + +ImageContext::ImageContext(const ResourceMetadata& metadata) + : ImageContext(metadata.mailbox_holder.mailbox, + metadata.size, + metadata.resource_format, + metadata.color_space.ToSkColorSpace(), + metadata.alpha_type, + metadata.origin, + metadata.mailbox_holder.sync_token) {} + +ImageContext::ImageContext(RenderPassId render_pass_id, + const gfx::Size& size, + ResourceFormat resource_format, + bool mipmap, + sk_sp<SkColorSpace> color_space) + : render_pass_id(render_pass_id), + size(size), + resource_format(resource_format), + mipmap(mipmap ? GrMipMapped::kYes : GrMipMapped::kNo), + color_space(std::move(color_space)) {} + +ImageContext::~ImageContext() { + DCHECK(!representation_is_being_accessed); +} + +} // namespace viz
diff --git a/components/viz/service/display_embedder/image_context.h b/components/viz/service/display_embedder/image_context.h new file mode 100644 index 0000000..38ff4ce7 --- /dev/null +++ b/components/viz/service/display_embedder/image_context.h
@@ -0,0 +1,83 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_IMAGE_CONTEXT_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_IMAGE_CONTEXT_H_ + +#include <memory> + +#include "base/macros.h" +#include "components/viz/common/quads/render_pass.h" +#include "components/viz/common/resources/resource_format.h" +#include "components/viz/service/display/resource_metadata.h" +#include "gpu/command_buffer/common/mailbox.h" +#include "gpu/command_buffer/common/sync_token.h" +#include "third_party/skia/include/core/SkImageInfo.h" +#include "third_party/skia/include/core/SkRefCnt.h" +#include "third_party/skia/include/gpu/GrTypes.h" +#include "ui/gfx/geometry/size.h" + +class SkColorSpace; +class SkPromiseImageTexture; + +namespace gpu { +class SharedImageRepresentationSkia; +} + +namespace viz { + +// Contex for hold promise image related properties. +struct ImageContext { + ImageContext(const gpu::Mailbox& mailbox, + const gfx::Size& size, + ResourceFormat resource_format, + sk_sp<SkColorSpace> color_space, + SkAlphaType alpha_type, + GrSurfaceOrigin origin, + const gpu::SyncToken& sync_token); + explicit ImageContext(const ResourceMetadata& metadata); + ImageContext(RenderPassId render_pass_id, + const gfx::Size& size, + ResourceFormat resource_format, + bool mipmap, + sk_sp<SkColorSpace> color_space); + ~ImageContext(); + + // Properties for promise images which are created from a resource. + const gpu::Mailbox mailbox; + + // Properties for promise images which are created from a render pass. + const RenderPassId render_pass_id = 0; + + // Const properties which can be accessed by display and GPU threads. + const gfx::Size size; + const ResourceFormat resource_format; + const GrMipMapped mipmap = GrMipMapped::kNo; + const sk_sp<SkColorSpace> color_space; + const SkAlphaType alpha_type = kPremul_SkAlphaType; + const GrSurfaceOrigin origin = kTopLeft_GrSurfaceOrigin; + + // The promise image which is used on display thread. + sk_sp<SkImage> image; + + // |sync_token| is only accessed on display thread. + gpu::SyncToken sync_token; + + // SharedImage |representation| is only accessed on GPU thread. + std::unique_ptr<gpu::SharedImageRepresentationSkia> representation; + + // |representation_is_being_accessed| is used on GPU thread only. + bool representation_is_being_accessed = false; + + // The |promise_image_texture| is used for fulfilling the promise image. It is + // used on GPU thread. + sk_sp<SkPromiseImageTexture> promise_image_texture; + + private: + DISALLOW_COPY_AND_ASSIGN(ImageContext); +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_IMAGE_CONTEXT_H_
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc index 0dffe29..cb3b02f 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -22,6 +22,7 @@ #include "components/viz/service/display/output_surface_client.h" #include "components/viz/service/display/output_surface_frame.h" #include "components/viz/service/display/resource_metadata.h" +#include "components/viz/service/display_embedder/image_context.h" #include "components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h" #include "components/viz/service/gl/gpu_service_impl.h" #include "gpu/command_buffer/common/swap_buffers_complete_params.h" @@ -38,6 +39,14 @@ namespace { +sk_sp<SkPromiseImageTexture> Fulfill(void* texture_context) { + DCHECK(texture_context); + auto* image_context = static_cast<ImageContext*>(texture_context); + return image_context->promise_image_texture; +} + +void DoNothing(void* texture_context) {} + template <typename... Args> void PostAsyncTask( const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, @@ -57,223 +66,6 @@ } // namespace -// A helper class for fulfilling promise image on the GPU thread. -class SkiaOutputSurfaceImpl::PromiseTextureHelper { - public: - static sk_sp<SkImage> MakePromiseSkImageFromMetadata( - SkiaOutputSurfaceImpl* impl, - const ResourceMetadata& metadata) { - auto* helper = new PromiseTextureHelper( - impl->impl_on_gpu_->weak_ptr(), metadata.size, metadata.resource_format, - metadata.mailbox_holder, metadata.color_space.ToSkColorSpace(), - metadata.alpha_type, metadata.origin); - return helper->MakePromiseSkImage(impl); - } - - static sk_sp<SkImage> MakePromiseSkImageFromRenderPass( - SkiaOutputSurfaceImpl* impl, - ResourceFormat resource_format, - gfx::Size size, - RenderPassId render_pass_id, - bool mipmap, - sk_sp<SkColorSpace> color_space) { - DCHECK_CALLED_ON_VALID_THREAD(impl->thread_checker_); - // The ownership of the helper will be passed into makePromisTexture(). The - // PromiseTextureHelper::Done will always be called. It will delete the - // helper. - auto* helper = new PromiseTextureHelper( - impl->impl_on_gpu_->weak_ptr(), size, resource_format, render_pass_id, - mipmap, std::move(color_space)); - return helper->MakePromiseSkImage(impl); - } - - private: - friend class SkiaOutputSurfaceImpl::YUVAPromiseTextureHelper; - - PromiseTextureHelper(base::WeakPtr<SkiaOutputSurfaceImplOnGpu> impl_on_gpu, - const gfx::Size& size, - ResourceFormat resource_format, - RenderPassId render_pass_id, - bool mipmap, - sk_sp<SkColorSpace> color_space) - : impl_on_gpu_(impl_on_gpu), - size_(size), - resource_format_(resource_format), - render_pass_id_(render_pass_id), - mipmap_(mipmap ? GrMipMapped::kYes : GrMipMapped::kNo), - color_space_(std::move(color_space)) {} - - PromiseTextureHelper(base::WeakPtr<SkiaOutputSurfaceImplOnGpu> impl_on_gpu, - const gfx::Size& size, - ResourceFormat resource_format, - const gpu::MailboxHolder& mailbox_holder, - sk_sp<SkColorSpace> color_space, - SkAlphaType alpha_type, - GrSurfaceOrigin origin) - : impl_on_gpu_(impl_on_gpu), - size_(size), - resource_format_(resource_format), - render_pass_id_(0u), - mailbox_holder_(mailbox_holder), - color_space_(std::move(color_space)), - alpha_type_(alpha_type), - origin_(origin) {} - ~PromiseTextureHelper() = default; - - sk_sp<SkImage> MakePromiseSkImage(SkiaOutputSurfaceImpl* impl) { - SkColorType color_type = ResourceFormatToClosestSkColorType( - true /* gpu_compositing */, resource_format_); - impl->CreateFallbackPromiseImage(color_type); - GrBackendFormat backend_format = impl->GetGrBackendFormatForTexture( - resource_format_, - render_pass_id_ ? GL_TEXTURE_2D : mailbox_holder_.texture_target); - return impl->recorder_->makePromiseTexture( - backend_format, size_.width(), size_.height(), mipmap_, origin_, - color_type, alpha_type_, color_space_, PromiseTextureHelper::Fulfill, - PromiseTextureHelper::Release, PromiseTextureHelper::Done, this); - } - - static sk_sp<SkPromiseImageTexture> Fulfill(void* texture_context) { - DCHECK(texture_context); - auto* helper = static_cast<PromiseTextureHelper*>(texture_context); - // The fulfill is always called by SkiaOutputSurfaceImplOnGpu::SwapBuffers - // or SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass, so impl_on_gpu_ - // should be always valid. - DCHECK(helper->impl_on_gpu_); - if (helper->render_pass_id_) { - return helper->impl_on_gpu_->FulfillPromiseTexture( - helper->render_pass_id_, &helper->shared_image_); - } else { - return helper->impl_on_gpu_->FulfillPromiseTexture( - helper->mailbox_holder_, helper->size_, helper->resource_format_, - &helper->shared_image_); - } - } - - static void Release(void* texture_context) { - DCHECK(texture_context); - auto* helper = static_cast<PromiseTextureHelper*>(texture_context); - if (helper->shared_image_) - helper->shared_image_->EndReadAccess(); - } - - static void Done(void* texture_context) { - DCHECK(texture_context); - auto* helper = static_cast<PromiseTextureHelper*>(texture_context); - if (helper->shared_image_) { - DCHECK(helper->impl_on_gpu_); - if (helper->impl_on_gpu_->was_context_lost()) - helper->shared_image_->OnContextLost(); - } - delete helper; - } - - base::WeakPtr<SkiaOutputSurfaceImplOnGpu> impl_on_gpu_; - const gfx::Size size_; - const ResourceFormat resource_format_; - const RenderPassId render_pass_id_; - const gpu::MailboxHolder mailbox_holder_; - const GrMipMapped mipmap_ = GrMipMapped::kNo; - const sk_sp<SkColorSpace> color_space_; - const SkAlphaType alpha_type_ = kPremul_SkAlphaType; - const GrSurfaceOrigin origin_ = kTopLeft_GrSurfaceOrigin; - - // If non-null, an outstanding SharedImageRepresentation that must be freed on - // Release. Only written / read from GPU thread. - std::unique_ptr<gpu::SharedImageRepresentationSkia> shared_image_; - - DISALLOW_COPY_AND_ASSIGN(PromiseTextureHelper); -}; - -// A helper class for fulfilling YUVA promise image on the GPU thread. -class SkiaOutputSurfaceImpl::YUVAPromiseTextureHelper { - public: - static sk_sp<SkImage> MakeYUVAPromiseSkImage( - SkiaOutputSurfaceImpl* impl, - SkYUVColorSpace yuv_color_space, - sk_sp<SkColorSpace> dst_color_space, - std::vector<ResourceMetadata> metadatas, - bool has_alpha) { - DCHECK_CALLED_ON_VALID_THREAD(impl->thread_checker_); - DCHECK_LE(metadatas.size(), 4u); - - bool is_i420 = has_alpha ? metadatas.size() == 4 : metadatas.size() == 3; - - GrBackendFormat formats[4]; - SkYUVAIndex indices[4] = { - {-1, SkColorChannel::kR}, - {-1, SkColorChannel::kR}, - {-1, SkColorChannel::kR}, - {-1, SkColorChannel::kR}, - }; - SkISize yuva_sizes[4] = {}; - SkDeferredDisplayListRecorder::PromiseImageTextureContext contexts[4] = { - nullptr, nullptr, nullptr, nullptr}; - - // The ownership of the contexts will be passed into - // makeYUVAPromiseTexture(). The PromiseTextureHelper::Done will always be - // called. It will delete contexts. - const auto process_planar = [&](size_t i, ResourceFormat resource_format) { - auto& metadata = metadatas[i]; - DCHECK(metadata.origin == kTopLeft_GrSurfaceOrigin); - metadata.resource_format = resource_format; - formats[i] = impl->GetGrBackendFormatForTexture( - resource_format, metadata.mailbox_holder.texture_target); - yuva_sizes[i].set(metadata.size.width(), metadata.size.height()); - contexts[i] = new PromiseTextureHelper( - impl->impl_on_gpu_->weak_ptr(), metadata.size, - metadata.resource_format, metadata.mailbox_holder, - nullptr /* color_space */, metadata.alpha_type, - kTopLeft_GrSurfaceOrigin); - }; - - if (is_i420) { - process_planar(0, RED_8); - indices[SkYUVAIndex::kY_Index].fIndex = 0; - indices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR; - - process_planar(1, RED_8); - indices[SkYUVAIndex::kU_Index].fIndex = 1; - indices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR; - - process_planar(2, RED_8); - indices[SkYUVAIndex::kV_Index].fIndex = 2; - indices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kR; - if (has_alpha) { - process_planar(3, RED_8); - indices[SkYUVAIndex::kA_Index].fIndex = 3; - indices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR; - } - } else { - process_planar(0, RED_8); - indices[SkYUVAIndex::kY_Index].fIndex = 0; - indices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR; - - process_planar(1, RG_88); - indices[SkYUVAIndex::kU_Index].fIndex = 1; - indices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR; - - indices[SkYUVAIndex::kV_Index].fIndex = 1; - indices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kG; - if (has_alpha) { - process_planar(2, RED_8); - indices[SkYUVAIndex::kA_Index].fIndex = 2; - indices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR; - } - } - - auto image = impl->recorder_->makeYUVAPromiseTexture( - yuv_color_space, formats, yuva_sizes, indices, yuva_sizes[0].width(), - yuva_sizes[0].height(), kTopLeft_GrSurfaceOrigin, dst_color_space, - PromiseTextureHelper::Fulfill, PromiseTextureHelper::Release, - PromiseTextureHelper::Done, contexts); - return image; - } - - private: - DISALLOW_COPY_AND_ASSIGN(YUVAPromiseTextureHelper); -}; - SkiaOutputSurfaceImpl::SkiaOutputSurfaceImpl( GpuServiceImpl* gpu_service, gpu::SurfaceHandle surface_handle, @@ -286,19 +78,41 @@ renderer_settings_(renderer_settings), weak_ptr_factory_(this) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - seen_resource_formats_.resize(kLastEnum_SkColorType + 1); } SkiaOutputSurfaceImpl::~SkiaOutputSurfaceImpl() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); recorder_.reset(); + + std::vector<std::unique_ptr<ImageContext>> image_contexts; + image_contexts.reserve(promise_image_cache_.size()); + for (auto& id_and_image_context : promise_image_cache_) { + id_and_image_context.second->image = nullptr; + image_contexts.push_back(std::move(id_and_image_context.second)); + } + + std::vector<std::unique_ptr<ImageContext>> render_pass_image_contexts; + render_pass_image_contexts.reserve(render_pass_image_cache_.size()); + for (auto& id_and_image_context : render_pass_image_cache_) { + id_and_image_context.second->image = nullptr; + render_pass_image_contexts.push_back( + std::move(id_and_image_context.second)); + } + base::WaitableEvent event; auto callback = base::BindOnce( - [](std::unique_ptr<SkiaOutputSurfaceImplOnGpu> impl_on_gpu, + [](std::vector<std::unique_ptr<ImageContext>> images, + std::vector<std::unique_ptr<ImageContext>> render_passes, + std::unique_ptr<SkiaOutputSurfaceImplOnGpu> impl_on_gpu, base::WaitableEvent* event) { + if (!images.empty()) + impl_on_gpu->ReleaseSkImages(std::move(images)); + if (!render_passes.empty()) + impl_on_gpu->RemoveRenderPassResource(std::move(render_passes)); impl_on_gpu = nullptr; event->Signal(); }, + std::move(image_contexts), std::move(render_pass_image_contexts), std::move(impl_on_gpu_), &event); ScheduleGpuTask(std::move(callback), std::vector<gpu::SyncToken>()); event.Wait(); @@ -466,17 +280,37 @@ } sk_sp<SkImage> SkiaOutputSurfaceImpl::MakePromiseSkImage( - ResourceMetadata metadata) { + const ResourceMetadata& metadata) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(recorder_); - DCHECK(!metadata.mailbox_holder.mailbox.IsZero()); - resource_sync_tokens_.push_back(metadata.mailbox_holder.sync_token); - return PromiseTextureHelper::MakePromiseSkImageFromMetadata(this, metadata); + + auto& image_context = promise_image_cache_[metadata.resource_id]; + if (!image_context) { + image_context = std::make_unique<ImageContext>(metadata); + SkColorType color_type = ResourceFormatToClosestSkColorType( + true /* gpu_compositing */, metadata.resource_format); + GrBackendFormat backend_format = GetGrBackendFormatForTexture( + metadata.resource_format, metadata.mailbox_holder.texture_target); + image_context->image = recorder_->makePromiseTexture( + backend_format, metadata.size.width(), metadata.size.height(), + GrMipMapped::kNo, metadata.origin, color_type, metadata.alpha_type, + image_context->color_space, Fulfill, DoNothing, DoNothing, + image_context.get()); + DCHECK(image_context->image); + } + + if (image_context->sync_token.HasData()) { + resource_sync_tokens_.push_back(image_context->sync_token); + image_context->sync_token.Clear(); + } + images_in_current_paint_.push_back(image_context.get()); + + return image_context->image; } sk_sp<SkImage> SkiaOutputSurfaceImpl::MakePromiseSkImageFromYUV( - std::vector<ResourceMetadata> metadatas, + const std::vector<ResourceMetadata>& metadatas, SkYUVColorSpace yuv_color_space, sk_sp<SkColorSpace> dst_color_space, bool has_alpha) { @@ -485,25 +319,101 @@ DCHECK((has_alpha && (metadatas.size() == 3 || metadatas.size() == 4)) || (!has_alpha && (metadatas.size() == 2 || metadatas.size() == 3))); - return YUVAPromiseTextureHelper::MakeYUVAPromiseSkImage( - this, yuv_color_space, dst_color_space, std::move(metadatas), has_alpha); + bool is_i420 = has_alpha ? metadatas.size() == 4 : metadatas.size() == 3; + + GrBackendFormat formats[4]; + SkYUVAIndex indices[4] = { + {-1, SkColorChannel::kR}, + {-1, SkColorChannel::kR}, + {-1, SkColorChannel::kR}, + {-1, SkColorChannel::kR}, + }; + SkISize yuva_sizes[4] = {}; + SkDeferredDisplayListRecorder::PromiseImageTextureContext + texture_contexts[4] = {nullptr, nullptr, nullptr, nullptr}; + + std::vector<std::unique_ptr<ImageContext>> image_contexts(metadatas.size()); + const auto process_planar = [&](size_t i, ResourceFormat resource_format) { + auto metadata = metadatas[i]; + DCHECK(metadata.origin == kTopLeft_GrSurfaceOrigin); + metadata.resource_format = resource_format; + formats[i] = GetGrBackendFormatForTexture( + resource_format, metadata.mailbox_holder.texture_target); + yuva_sizes[i].set(metadata.size.width(), metadata.size.height()); + auto& image_context = promise_image_cache_[metadata.resource_id]; + if (!image_context) { + image_context = std::make_unique<ImageContext>(metadata); + } + if (image_context->sync_token.HasData()) { + resource_sync_tokens_.push_back(image_context->sync_token); + image_context->sync_token.Clear(); + } + images_in_current_paint_.push_back(image_context.get()); + texture_contexts[i] = image_context.get(); + }; + + if (is_i420) { + process_planar(0, RED_8); + indices[SkYUVAIndex::kY_Index].fIndex = 0; + indices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR; + + process_planar(1, RED_8); + indices[SkYUVAIndex::kU_Index].fIndex = 1; + indices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR; + + process_planar(2, RED_8); + indices[SkYUVAIndex::kV_Index].fIndex = 2; + indices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kR; + if (has_alpha) { + process_planar(3, RED_8); + indices[SkYUVAIndex::kA_Index].fIndex = 3; + indices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR; + } + } else { + process_planar(0, RED_8); + indices[SkYUVAIndex::kY_Index].fIndex = 0; + indices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR; + + process_planar(1, RG_88); + indices[SkYUVAIndex::kU_Index].fIndex = 1; + indices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR; + + indices[SkYUVAIndex::kV_Index].fIndex = 1; + indices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kG; + if (has_alpha) { + process_planar(2, RED_8); + indices[SkYUVAIndex::kA_Index].fIndex = 2; + indices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR; + } + } + auto image = recorder_->makeYUVAPromiseTexture( + yuv_color_space, formats, yuva_sizes, indices, yuva_sizes[0].width(), + yuva_sizes[0].height(), kTopLeft_GrSurfaceOrigin, dst_color_space, + Fulfill, DoNothing, DoNothing, texture_contexts); + DCHECK(image); + return image; } -gpu::SyncToken SkiaOutputSurfaceImpl::ReleasePromiseSkImages( - std::vector<sk_sp<SkImage>> images) { - if (images.empty()) - return gpu::SyncToken(); - gpu::SyncToken sync_token( - gpu::CommandBufferNamespace::VIZ_SKIA_OUTPUT_SURFACE, - impl_on_gpu_->command_buffer_id(), ++sync_fence_release_); - sync_token.SetVerifyFlush(); +void SkiaOutputSurfaceImpl::ReleaseCachedPromiseSkImages( + std::vector<ResourceId> ids) { + if (ids.empty()) + return; + std::vector<std::unique_ptr<ImageContext>> image_contexts; + for (auto id : ids) { + auto it = promise_image_cache_.find(id); + DCHECK(it != promise_image_cache_.end()); + auto& image_context = it->second; + image_context->image = nullptr; + image_contexts.push_back(std::move(image_context)); + promise_image_cache_.erase(it); + } + // impl_on_gpu_ is released on the GPU thread by a posted task from // SkiaOutputSurfaceImpl::dtor. So it is safe to use base::Unretained. - auto callback = base::BindOnce(&SkiaOutputSurfaceImplOnGpu::DestroySkImages, + auto callback = base::BindOnce(&SkiaOutputSurfaceImplOnGpu::ReleaseSkImages, base::Unretained(impl_on_gpu_.get()), - std::move(images), sync_fence_release_); + std::move(image_contexts)); ScheduleGpuTask(std::move(callback), std::vector<gpu::SyncToken>()); - return sync_token; } void SkiaOutputSurfaceImpl::SkiaSwapBuffers(OutputSurfaceFrame frame) { @@ -566,16 +476,26 @@ // SkiaOutputSurfaceImpl::dtor. So it is safe to use base::Unretained. base::OnceCallback<void()> callback; if (painting_render_pass) { + auto it = render_pass_image_cache_.find(current_render_pass_id_); + if (it != render_pass_image_cache_.end()) { + // We are going to overwrite the render pass, so we need reset the + // image_context, so a new promise image will be created when the + // MakePromiseSkImageFromRenderPass() is called. + it->second->image = nullptr; + } callback = base::BindOnce( &SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass, base::Unretained(impl_on_gpu_.get()), current_render_pass_id_, - std::move(ddl), resource_sync_tokens_, sync_fence_release_); + std::move(ddl), std::move(images_in_current_paint_), + resource_sync_tokens_, sync_fence_release_); } else { callback = base::BindOnce( &SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame, base::Unretained(impl_on_gpu_.get()), std::move(ddl), - std::move(overdraw_ddl), resource_sync_tokens_, sync_fence_release_); + std::move(overdraw_ddl), std::move(images_in_current_paint_), + resource_sync_tokens_, sync_fence_release_); } + images_in_current_paint_.clear(); ScheduleGpuTask(std::move(callback), std::move(resource_sync_tokens_)); current_render_pass_id_ = 0; return sync_token; @@ -590,19 +510,49 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(recorder_); - return PromiseTextureHelper::MakePromiseSkImageFromRenderPass( - this, format, size, id, mipmap, std::move(color_space)); + auto& image_context = render_pass_image_cache_[id]; + if (!image_context) { + image_context = std::make_unique<ImageContext>(id, size, format, mipmap, + std::move(color_space)); + } + if (!image_context->image) { + SkColorType color_type = + ResourceFormatToClosestSkColorType(true /* gpu_compositing */, format); + GrBackendFormat backend_format = + GetGrBackendFormatForTexture(format, GL_TEXTURE_2D); + image_context->image = recorder_->makePromiseTexture( + backend_format, image_context->size.width(), + image_context->size.height(), image_context->mipmap, + image_context->origin, color_type, image_context->alpha_type, + image_context->color_space, Fulfill, DoNothing, DoNothing, + image_context.get()); + DCHECK(image_context->image); + } + images_in_current_paint_.push_back(image_context.get()); + return image_context->image; } void SkiaOutputSurfaceImpl::RemoveRenderPassResource( + std::vector<RenderPassId> ids) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(!ids.empty()); + + std::vector<std::unique_ptr<ImageContext>> image_contexts; + image_contexts.reserve(ids.size()); + for (const auto id : ids) { + auto it = render_pass_image_cache_.find(id); + DCHECK(it != render_pass_image_cache_.end()); + it->second->image = nullptr; + image_contexts.push_back(std::move(it->second)); + render_pass_image_cache_.erase(it); + } + // impl_on_gpu_ is released on the GPU thread by a posted task from // SkiaOutputSurfaceImpl::dtor. So it is safe to use base::Unretained. - auto callback = - base::BindOnce(&SkiaOutputSurfaceImplOnGpu::RemoveRenderPassResource, - base::Unretained(impl_on_gpu_.get()), std::move(ids)); + auto callback = base::BindOnce( + &SkiaOutputSurfaceImplOnGpu::RemoveRenderPassResource, + base::Unretained(impl_on_gpu_.get()), std::move(image_contexts)); ScheduleGpuTask(std::move(callback), std::vector<gpu::SyncToken>()); } @@ -773,14 +723,4 @@ } } -void SkiaOutputSurfaceImpl::CreateFallbackPromiseImage(SkColorType color_type) { - if (seen_resource_formats_[color_type]) - return; - seen_resource_formats_[color_type] = true; - auto callback = - base::BindOnce(&SkiaOutputSurfaceImplOnGpu::CreateFallbackPromiseImage, - base::Unretained(impl_on_gpu_.get()), color_type); - ScheduleGpuTask(std::move(callback), std::vector<gpu::SyncToken>()); -} - } // namespace viz
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.h b/components/viz/service/display_embedder/skia_output_surface_impl.h index c946cc9d..a8b3f7b 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl.h
@@ -14,6 +14,7 @@ #include "base/threading/thread_checker.h" #include "components/viz/common/display/renderer_settings.h" #include "components/viz/common/display/update_vsync_parameters_callback.h" +#include "components/viz/common/resources/resource_id.h" #include "components/viz/service/display/skia_output_surface.h" #include "components/viz/service/viz_service_export.h" #include "gpu/command_buffer/common/sync_token.h" @@ -29,6 +30,7 @@ namespace viz { +struct ImageContext; class GpuServiceImpl; class SkiaOutputSurfaceImplOnGpu; @@ -76,7 +78,7 @@ // SkiaOutputSurface implementation: SkCanvas* BeginPaintCurrentFrame() override; sk_sp<SkImage> MakePromiseSkImageFromYUV( - std::vector<ResourceMetadata> metadatas, + const std::vector<ResourceMetadata>& metadatas, SkYUVColorSpace yuv_color_space, sk_sp<SkColorSpace> dst_color_space, bool has_alpha) override; @@ -87,15 +89,14 @@ bool mipmap, sk_sp<SkColorSpace> color_space) override; gpu::SyncToken SubmitPaint() override; - sk_sp<SkImage> MakePromiseSkImage(ResourceMetadata metadata) override; + sk_sp<SkImage> MakePromiseSkImage(const ResourceMetadata& metadata) override; sk_sp<SkImage> MakePromiseSkImageFromRenderPass( const RenderPassId& id, const gfx::Size& size, ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space) override; - gpu::SyncToken ReleasePromiseSkImages( - std::vector<sk_sp<SkImage>> image) override; + void ReleaseCachedPromiseSkImages(std::vector<ResourceId> ids) override; void RemoveRenderPassResource(std::vector<RenderPassId> ids) override; void CopyOutput(RenderPassId id, @@ -111,8 +112,6 @@ void SetCapabilitiesForTesting(bool flipped_output_surface); private: - class PromiseTextureHelper; - class YUVAPromiseTextureHelper; void InitializeOnGpuThread(base::WaitableEvent* event); SkSurfaceCharacterization CreateSkSurfaceCharacterization( const gfx::Size& surface_size, @@ -128,8 +127,6 @@ GrBackendFormat GetGrBackendFormatForTexture(ResourceFormat resource_format, uint32_t gl_texture_target); - void CreateFallbackPromiseImage(SkColorType color_type); - uint64_t sync_fence_release_ = 0; GpuServiceImpl* const gpu_service_; @@ -157,7 +154,19 @@ // |nway_canvas_| contains |overdraw_canvas_| and root canvas. base::Optional<SkNWayCanvas> nway_canvas_; - // Sync tokens for resources which are used for the current frame. + // The cached for promise images indexed by resource id. + base::flat_map<ResourceId, std::unique_ptr<ImageContext>> + promise_image_cache_; + + // The cache for promise image created from render passes. + base::flat_map<RenderPassId, std::unique_ptr<ImageContext>> + render_pass_image_cache_; + + // Image contexts which are used for the current frame or render pass. + std::vector<ImageContext*> images_in_current_paint_; + + // Sync tokens for resources which are used for the current frame or render + // pass. std::vector<gpu::SyncToken> resource_sync_tokens_; // The task runner for running task on the client (compositor) thread. @@ -174,8 +183,6 @@ // Observers for context lost. base::ObserverList<ContextLostObserver>::Unchecked observers_; - std::vector<bool> seen_resource_formats_; - THREAD_CHECKER(thread_checker_); base::WeakPtr<SkiaOutputSurfaceImpl> weak_ptr_;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc index 61a11a4e..b71992b 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc
@@ -19,6 +19,7 @@ #include "components/viz/service/display/output_surface_client.h" #include "components/viz/service/display/output_surface_frame.h" #include "components/viz/service/display/resource_metadata.h" +#include "components/viz/service/display_embedder/image_context.h" #include "gpu/command_buffer/common/shared_image_usage.h" #include "gpu/command_buffer/common/swap_buffers_complete_params.h" #include "gpu/command_buffer/service/mailbox_manager.h" @@ -65,12 +66,6 @@ manager, nullptr /* tracker */); } -void ReleaseSharedImagePresentation(void* context) { - std::unique_ptr<gpu::SharedImageRepresentationSkia> representation( - static_cast<gpu::SharedImageRepresentationSkia*>(context)); - representation->EndReadAccess(); -} - } // namespace SkiaOutputSurfaceImplNonDDL::SkiaOutputSurfaceImplNonDDL( @@ -247,12 +242,29 @@ } sk_sp<SkImage> SkiaOutputSurfaceImplNonDDL::MakePromiseSkImage( - ResourceMetadata metadata) { + const ResourceMetadata& metadata) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (metadata.mailbox_holder.mailbox.IsSharedImage() && sir_factory_) { - WaitSyncToken(metadata.mailbox_holder.sync_token); - return MakeSkImageFromSharedImage(metadata); + auto& image_context = promise_image_cache_[metadata.resource_id]; + if (!image_context) + image_context = MakeSkImageFromSharedImage(metadata); + if (image_context) { + if (!image_context->representation_is_being_accessed) { + // TODO(penghuang): create gather read access semaphores and call skia + // flush() with them. https://crbug.com/944194 + auto promise_image_texture = + image_context->representation->BeginReadAccess(); + // The image has been created and cached. It is too late to tell skia + // the backing of the cached image is not accessible right now, so crash + // for now. + // TODO(penghuang): find a way to notify skia. + CHECK(promise_image_texture); + image_context->representation_is_being_accessed = true; + } + images_in_current_paint_.push_back(image_context.get()); + } + return image_context ? image_context->image : nullptr; } GrBackendTexture backend_texture; @@ -269,7 +281,7 @@ } sk_sp<SkImage> SkiaOutputSurfaceImplNonDDL::MakePromiseSkImageFromYUV( - std::vector<ResourceMetadata> metadatas, + const std::vector<ResourceMetadata>& metadatas, SkYUVColorSpace yuv_color_space, sk_sp<SkColorSpace> dst_color_space, bool has_alpha) { @@ -288,7 +300,7 @@ }; GrBackendTexture yuva_textures[4] = {}; const auto process_planar = [&](size_t i, ResourceFormat resource_format) { - auto& metadata = metadatas[i]; + auto metadata = metadatas[i]; metadata.resource_format = resource_format; if (!GetGrBackendTexture(metadata, &yuva_textures[i])) DLOG(ERROR) << "Failed to GetGrBackendTexture from a mailbox."; @@ -335,26 +347,21 @@ kTopLeft_GrSurfaceOrigin, dst_color_space); } -gpu::SyncToken SkiaOutputSurfaceImplNonDDL::ReleasePromiseSkImages( - std::vector<sk_sp<SkImage>> images) { - if (images.empty()) - return gpu::SyncToken(); +void SkiaOutputSurfaceImplNonDDL::ReleaseCachedPromiseSkImages( + std::vector<ResourceId> ids) { + if (ids.empty()) + return; DCHECK_EQ(order_num_, 0u); order_num_ = sync_point_order_data_->GenerateUnprocessedOrderNumber(); sync_point_order_data_->BeginProcessingOrderNumber(order_num_); - gpu::SyncToken sync_token( - gpu::CommandBufferNamespace::VIZ_SKIA_OUTPUT_SURFACE_NON_DDL, - sync_point_client_state_->command_buffer_id(), ++sync_fence_release_); - sync_token.SetVerifyFlush(); - sync_point_client_state_->ReleaseFenceSync(sync_fence_release_); - const bool is_using_vulkan = shared_context_state_->use_vulkan_gr_context(); - if (!is_using_vulkan) { - DCHECK(mailbox_manager_->UsesSync()); - mailbox_manager_->PushTextureUpdates(sync_token); + for (auto id : ids) { + auto it = promise_image_cache_.find(id); + DCHECK(it != promise_image_cache_.end()); + it->second->image = nullptr; + promise_image_cache_.erase(it); } sync_point_order_data_->FinishProcessingOrderNumber(order_num_); order_num_ = 0u; - return sync_token; } void SkiaOutputSurfaceImplNonDDL::SkiaSwapBuffers(OutputSurfaceFrame frame) { @@ -412,6 +419,19 @@ } else { offscreen_sk_surfaces_[current_render_pass_id_]->flush(); } + + for (auto* image_context : images_in_current_paint_) { + if (!image_context->representation_is_being_accessed) + continue; + // TODO(penghuang): create end read access semaphores and call + // EndReadAccess() with them. https://crbug.com/944194 + DCHECK(image_context->representation); + image_context->representation->EndReadAccess(); + image_context->representation_is_being_accessed = false; + } + + images_in_current_paint_.clear(); + gpu::SyncToken sync_token( gpu::CommandBufferNamespace::VIZ_SKIA_OUTPUT_SURFACE_NON_DDL, sync_point_client_state_->command_buffer_id(), ++sync_fence_release_); @@ -485,43 +505,50 @@ return true; } -sk_sp<SkImage> SkiaOutputSurfaceImplNonDDL::MakeSkImageFromSharedImage( +std::unique_ptr<ImageContext> +SkiaOutputSurfaceImplNonDDL::MakeSkImageFromSharedImage( const ResourceMetadata& metadata) { - auto representation = sir_factory_->ProduceSkia( - metadata.mailbox_holder.mailbox, shared_context_state_.get()); - if (!representation) { - DLOG(ERROR) << "Failed to make the SkImage - SharedImage mailbox not " - "found in SharedImageManager."; + auto image_context = std::make_unique<ImageContext>(metadata); + WaitSyncToken(image_context->sync_token); + image_context->representation = sir_factory_->ProduceSkia( + image_context->mailbox, shared_context_state_.get()); + if (!image_context->representation) { + DLOG(ERROR) << "Failed to make the SkImage - SharedImage mailbox not found " + "in SharedImageManager."; return nullptr; } - if (!(representation->usage() & gpu::SHARED_IMAGE_USAGE_DISPLAY)) { + if (!(image_context->representation->usage() & + gpu::SHARED_IMAGE_USAGE_DISPLAY)) { DLOG(ERROR) << "Failed to make the SkImage - SharedImage was not created " "with display usage."; return nullptr; } - auto promise_texture = representation->BeginReadAccess(); - if (!promise_texture) { + + // TODO(penghuang): create gather read access semaphores and call skia flush() + // with them. https://crbug.com/944194 + image_context->promise_image_texture = + image_context->representation->BeginReadAccess(); + if (!image_context->promise_image_texture) { DLOG(ERROR) - << "Failed to begin read access for SharedImageRepresentationSkia"; + << "Failed to make the SkImage - SharedImage begin access failed."; return nullptr; } + image_context->representation_is_being_accessed = true; SkColorType color_type = ResourceFormatToClosestSkColorType( true /* gpu_compositing */, metadata.resource_format); - auto sk_image = SkImage::MakeFromTexture( - gr_context(), promise_texture->backendTexture(), kTopLeft_GrSurfaceOrigin, - color_type, metadata.alpha_type, metadata.color_space.ToSkColorSpace(), - ReleaseSharedImagePresentation, representation.get()); + image_context->image = SkImage::MakeFromTexture( + gr_context(), image_context->promise_image_texture->backendTexture(), + kTopLeft_GrSurfaceOrigin, color_type, image_context->alpha_type, + image_context->color_space); - if (!sk_image) { + if (!image_context->image) { DLOG(ERROR) << "Failed to create the SkImage"; return nullptr; } - - representation.release(); - return sk_image; + return image_context; } bool SkiaOutputSurfaceImplNonDDL::GetGrBackendTexture(
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h index 5c6a94cb..8907d39 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h
@@ -42,6 +42,8 @@ namespace viz { +struct ImageContext; + // A SkiaOutputSurface implementation for running SkiaRenderer on GpuThread. // Comparing to SkiaOutputSurfaceImpl, it will issue skia draw operations // against OS graphics API (GL, Vulkan, etc) instead of recording deferred @@ -84,7 +86,7 @@ // SkiaOutputSurface implementation: SkCanvas* BeginPaintCurrentFrame() override; sk_sp<SkImage> MakePromiseSkImageFromYUV( - std::vector<ResourceMetadata> metadatas, + const std::vector<ResourceMetadata>& metadatas, SkYUVColorSpace yuv_color_space, sk_sp<SkColorSpace> dst_color_space, bool has_alpha) override; @@ -95,16 +97,14 @@ bool mipmap, sk_sp<SkColorSpace> color_space) override; gpu::SyncToken SubmitPaint() override; - sk_sp<SkImage> MakePromiseSkImage(ResourceMetadata metadata) override; + sk_sp<SkImage> MakePromiseSkImage(const ResourceMetadata& metadata) override; sk_sp<SkImage> MakePromiseSkImageFromRenderPass( const RenderPassId& id, const gfx::Size& size, ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space) override; - gpu::SyncToken ReleasePromiseSkImages( - std::vector<sk_sp<SkImage>> images) override; - + void ReleaseCachedPromiseSkImages(std::vector<ResourceId> ids) override; void RemoveRenderPassResource(std::vector<RenderPassId> ids) override; void CopyOutput(RenderPassId id, const copy_output::RenderPassGeometry& geometry, @@ -117,7 +117,8 @@ GrContext* gr_context() { return shared_context_state_->gr_context(); } bool WaitSyncToken(const gpu::SyncToken& sync_token); - sk_sp<SkImage> MakeSkImageFromSharedImage(const ResourceMetadata& metadata); + std::unique_ptr<ImageContext> MakeSkImageFromSharedImage( + const ResourceMetadata& metadata); bool GetGrBackendTexture(const ResourceMetadata& metadata, GrBackendTexture* backend_texture); @@ -162,6 +163,13 @@ // Offscreen SkSurfaces for render passes. base::flat_map<RenderPassId, sk_sp<SkSurface>> offscreen_sk_surfaces_; + // Cached promise image. + base::flat_map<ResourceId, std::unique_ptr<ImageContext>> + promise_image_cache_; + + // Images for current frame or render pass. + std::vector<ImageContext*> images_in_current_paint_; + THREAD_CHECKER(thread_checker_); base::WeakPtrFactory<SkiaOutputSurfaceImplNonDDL> weak_ptr_factory_;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc index 8bf2ff5..f29fff45 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -18,6 +18,7 @@ #include "components/viz/service/display/output_surface_frame.h" #include "components/viz/service/display/texture_deleter.h" #include "components/viz/service/display_embedder/direct_context_provider.h" +#include "components/viz/service/display_embedder/image_context.h" #include "components/viz/service/display_embedder/skia_output_device.h" #include "components/viz/service/display_embedder/skia_output_device_gl.h" #include "components/viz/service/display_embedder/skia_output_device_offscreen.h" @@ -67,6 +68,29 @@ namespace viz { +class SkiaOutputSurfaceImplOnGpu::ScopedPromiseImageAccess { + public: + ScopedPromiseImageAccess(SkiaOutputSurfaceImplOnGpu* impl_on_gpu, + std::vector<ImageContext*> image_contexts) + : impl_on_gpu_(impl_on_gpu), image_contexts_(std::move(image_contexts)) { + // TODO(penghuang): gather begin read access semaphores from shared images. + // https://crbug.com/944194 + impl_on_gpu_->BeginAccessImages(image_contexts_); + } + + ~ScopedPromiseImageAccess() { + // TODO(penghuang): end shared image access with meaningful semaphores. + // https://crbug.com/944194 + impl_on_gpu_->EndAccessImages(image_contexts_); + } + + private: + SkiaOutputSurfaceImplOnGpu* const impl_on_gpu_; + std::vector<ImageContext*> image_contexts_; + + DISALLOW_COPY_AND_ASSIGN(ScopedPromiseImageAccess); +}; + // Skia gr_context() and |context_provider_| share an underlying GLContext. // Each of them caches some GL state. Interleaving usage could make cached // state inconsistent with GL state. Using a ScopedUseContextProvider whenever @@ -375,6 +399,7 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame( std::unique_ptr<SkDeferredDisplayList> ddl, std::unique_ptr<SkDeferredDisplayList> overdraw_ddl, + std::vector<ImageContext*> image_contexts, std::vector<gpu::SyncToken> sync_tokens, uint64_t sync_fence_release) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -385,12 +410,13 @@ return; PullTextureUpdates(std::move(sync_tokens)); - { base::Optional<gpu::raster::GrShaderCache::ScopedCacheUse> cache_use; if (gr_shader_cache_) { cache_use.emplace(gr_shader_cache_, gpu::kInProcessCommandBufferClientId); } + ScopedPromiseImageAccess scoped_promise_image_access( + this, std::move(image_contexts)); output_sk_surface()->draw(ddl.get()); gr_context()->flush(); } @@ -454,6 +480,7 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass( RenderPassId id, std::unique_ptr<SkDeferredDisplayList> ddl, + std::vector<ImageContext*> image_contexts, std::vector<gpu::SyncToken> sync_tokens, uint64_t sync_fence_release) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -479,6 +506,8 @@ base::Optional<gpu::raster::GrShaderCache::ScopedCacheUse> cache_use; if (gr_shader_cache_) cache_use.emplace(gr_shader_cache_, gpu::kInProcessCommandBufferClientId); + ScopedPromiseImageAccess scoped_promise_image_access( + this, std::move(image_contexts)); offscreen.surface()->draw(ddl.get()); gr_context()->flush(); } @@ -486,11 +515,11 @@ } void SkiaOutputSurfaceImplOnGpu::RemoveRenderPassResource( - std::vector<RenderPassId> ids) { + std::vector<std::unique_ptr<ImageContext>> image_contexts) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(!ids.empty()); - for (const auto& id : ids) { - auto it = offscreen_surfaces_.find(id); + DCHECK(!image_contexts.empty()); + for (auto& image_context : image_contexts) { + auto it = offscreen_surfaces_.find(image_context->render_pass_id); DCHECK(it != offscreen_surfaces_.end()); offscreen_surfaces_.erase(it); } @@ -652,77 +681,174 @@ ResourceFormat format) { SkColorType color_type = ResourceFormatToClosestSkColorType(true /* gpu_compositing */, format); - return fallback_promise_image_texture_[color_type]; + auto& promise_image_texture = fallback_promise_image_texture_[color_type]; + if (!promise_image_texture) { + auto image_info = SkImageInfo::Make(1 /* width */, 1 /* height */, + color_type, kOpaque_SkAlphaType); + auto surface = SkSurface::MakeRenderTarget( + gr_context(), SkBudgeted::kNo, image_info, 0 /* sampleCount */, + kTopLeft_GrSurfaceOrigin, nullptr /* surfaceProps */); + // We don't have driver support for that particular color_type. Try again + // with well supported SkColorType. Reads from this may have unusual colors + // due to interpreting RGBA as |color_type|, but that's better than + // completely undefined. + if (!surface) { + image_info = + SkImageInfo::Make(1 /* width */, 1 /* height */, + kRGBA_8888_SkColorType, kOpaque_SkAlphaType); + surface = SkSurface::MakeRenderTarget( + gr_context(), SkBudgeted::kNo, image_info, 0 /* sampleCount */, + kTopLeft_GrSurfaceOrigin, nullptr /* surfaceProps */); + + if (!surface) + return nullptr; + } + auto* canvas = surface->getCanvas(); +#if DCHECK_IS_ON() + canvas->clear(SK_ColorRED); +#else + canvas->clear(SK_ColorWHITE); +#endif + fallback_promise_images_.push_back(surface->makeImageSnapshot()); + auto gr_texture = fallback_promise_images_.back()->getBackendTexture( + false /* flushPendingGrContextIO */); + promise_image_texture = SkPromiseImageTexture::Make(gr_texture); + } + return promise_image_texture; } -sk_sp<SkPromiseImageTexture> SkiaOutputSurfaceImplOnGpu::FulfillPromiseTexture( - const gpu::MailboxHolder& mailbox_holder, - const gfx::Size& size, - const ResourceFormat resource_format, - std::unique_ptr<gpu::SharedImageRepresentationSkia>* shared_image_out) { +void SkiaOutputSurfaceImplOnGpu::BeginAccessImages( + const std::vector<ImageContext*>& image_contexts) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - - if (!*shared_image_out && mailbox_holder.mailbox.IsSharedImage()) { - std::unique_ptr<gpu::SharedImageRepresentationSkia> shared_image = - shared_image_representation_factory_->ProduceSkia( - mailbox_holder.mailbox, context_state_.get()); - if (!shared_image) { - DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage " - "mailbox not found in SharedImageManager."; - return FallbackPromiseImage(resource_format); + for (auto* context : image_contexts) { + // Skip the context if it has been processed. + if (context->representation_is_being_accessed) + continue; + // Prepare for accessing render pass. + if (context->render_pass_id) { + // We don't cache promise image for render pass, so the it should always + // be nullptr. + auto it = offscreen_surfaces_.find(context->render_pass_id); + DCHECK(it != offscreen_surfaces_.end()); + context->promise_image_texture = it->second.fulfill(); + if (!context->promise_image_texture) { + DLOG(ERROR) << "Failed to fulfill the promise texture created from " + "RenderPassId:" + << context->render_pass_id; + context->promise_image_texture = + FallbackPromiseImage(context->resource_format); + } + continue; } - if (!(shared_image->usage() & gpu::SHARED_IMAGE_USAGE_DISPLAY)) { - DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage " - "was not created with display usage."; - return FallbackPromiseImage(resource_format); + + // Prepare for accessing shared image. + if (context->mailbox.IsSharedImage()) { + if (context->promise_image_texture) { + // The promise image has been fulfilled early, so we just need begin + // access the shared image representation. If representation is nullptr, + // it means the promise image was not fulfilled successfully last time + // and a fallback content has been used, in that case, we cannot change + // the content, so we do nothing. + if (context->representation) { + // TODO(penghuang): create gather read access semaphores and call + // skia flush() with them. https://crbug.com/944194 + auto promise_image_texture = + context->representation->BeginReadAccess(); + // The image has been fulfilled and cached. It is too late to tell + // skia the backing of the cached image is not accessible right now, + // so crash for now. + // TODO(penghuang): find a way to notify skia. + CHECK(promise_image_texture); + context->representation_is_being_accessed = true; + } + continue; + } + + auto representation = shared_image_representation_factory_->ProduceSkia( + context->mailbox, context_state_.get()); + if (!representation) { + DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage " + "mailbox not found in SharedImageManager."; + context->promise_image_texture = + FallbackPromiseImage(context->resource_format); + continue; + } + + if (!(representation->usage() & gpu::SHARED_IMAGE_USAGE_DISPLAY)) { + DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage " + "was not created with display usage."; + context->promise_image_texture = + FallbackPromiseImage(context->resource_format); + continue; + } + + context->representation = std::move(representation); + // TODO(penghuang): create gather read access semaphores and call + // skia flush() with them. https://crbug.com/944194 + context->promise_image_texture = + context->representation->BeginReadAccess(); + if (!context->promise_image_texture) { + DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage " + "begin read access failed.."; + context->promise_image_texture = + FallbackPromiseImage(context->resource_format); + continue; + } + context->representation_is_being_accessed = true; + continue; } - *shared_image_out = std::move(shared_image); - } - if (*shared_image_out) { - auto promise_texture = (*shared_image_out)->BeginReadAccess(); - DLOG_IF(ERROR, !promise_texture) - << "Failed to begin read access for SharedImageRepresentationSkia"; - return promise_texture; - } - if (is_using_vulkan()) { - // Probably this texture is created with wrong inteface (GLES2Interface). - DLOG(ERROR) << "Failed to fulfill the promise texture whose backend is not " - "compitable with vulkan."; - return FallbackPromiseImage(resource_format); - } + // Prepare for accessing legacy mailbox. + // The promise image has been fulfilled once, so we do need do anything. + if (context->promise_image_texture) + continue; - auto* texture_base = mailbox_manager_->ConsumeTexture(mailbox_holder.mailbox); - if (!texture_base) { - DLOG(ERROR) << "Failed to fulfill the promise texture."; - return FallbackPromiseImage(resource_format); + if (is_using_vulkan()) { + // Probably this texture is created with wrong interface + // (GLES2Interface). + DLOG(ERROR) + << "Failed to fulfill the promise texture whose backend is not " + "compitable with vulkan."; + context->promise_image_texture = + FallbackPromiseImage(context->resource_format); + continue; + } + + auto* texture_base = mailbox_manager_->ConsumeTexture(context->mailbox); + if (!texture_base) { + DLOG(ERROR) << "Failed to fulfill the promise texture."; + context->promise_image_texture = + FallbackPromiseImage(context->resource_format); + continue; + } + BindOrCopyTextureIfNecessary(texture_base); + GrBackendTexture backend_texture; + gpu::GetGrBackendTexture(gl_version_info_, texture_base->target(), + context->size, texture_base->service_id(), + context->resource_format, &backend_texture); + if (!backend_texture.isValid()) { + DLOG(ERROR) << "Failed to fulfill the promise texture."; + context->promise_image_texture = + FallbackPromiseImage(context->resource_format); + continue; + } + context->promise_image_texture = + SkPromiseImageTexture::Make(backend_texture); } - BindOrCopyTextureIfNecessary(texture_base); - GrBackendTexture backend_texture; - gpu::GetGrBackendTexture(gl_version_info_, texture_base->target(), size, - texture_base->service_id(), resource_format, - &backend_texture); - if (!backend_texture.isValid()) { - DLOG(ERROR) << "Failed to fulfill the promise texture."; - return FallbackPromiseImage(resource_format); - } - return SkPromiseImageTexture::Make(backend_texture); } -sk_sp<SkPromiseImageTexture> SkiaOutputSurfaceImplOnGpu::FulfillPromiseTexture( - const RenderPassId id, - std::unique_ptr<gpu::SharedImageRepresentationSkia>* shared_image_out) { - DCHECK(!*shared_image_out); - auto it = offscreen_surfaces_.find(id); - DCHECK(it != offscreen_surfaces_.end()); - auto promise_texture = it->second.fulfill(); - if (!promise_texture) { - DLOG(ERROR) - << "Failed to fulfill the promise texture created from RenderPassId:" - << id; - return nullptr; +void SkiaOutputSurfaceImplOnGpu::EndAccessImages( + const std::vector<ImageContext*>& image_contexts) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + for (auto* context : image_contexts) { + if (!context->representation_is_being_accessed) + continue; + // TODO(penghuang): create end read access semaphores and call + // EndReadAccess() with them. https://crbug.com/944194 + DCHECK(context->representation); + context->representation->EndReadAccess(); + context->representation_is_being_accessed = false; } - return promise_texture; } sk_sp<GrContextThreadSafeProxy> @@ -730,60 +856,12 @@ return gr_context()->threadSafeProxy(); } -void SkiaOutputSurfaceImplOnGpu::DestroySkImages( - std::vector<sk_sp<SkImage>>&& images, - uint64_t sync_fence_release) { - DCHECK(!images.empty()); +void SkiaOutputSurfaceImplOnGpu::ReleaseSkImages( + std::vector<std::unique_ptr<ImageContext>> image_contexts) { + DCHECK(!image_contexts.empty()); // The window could be destroyed already, and the MakeCurrent will fail with // an destroyed window, so MakeCurrent without requiring the fbo0. MakeCurrent(false /* need_fbo0 */); -#if DCHECK_IS_ON() - for (const auto& image : images) - DCHECK(image->unique()); -#endif - images.clear(); - // Flush the gr_context() to make sure images are released, and the release - // and done callbacks are called. - gr_context()->flush(); - ReleaseFenceSyncAndPushTextureUpdates(sync_fence_release); -} - -void SkiaOutputSurfaceImplOnGpu::CreateFallbackPromiseImage( - SkColorType color_type) { - MakeCurrent(false /* need_fbo0 */); - - auto image_info = SkImageInfo::Make(1 /* width */, 1 /* height */, color_type, - kOpaque_SkAlphaType); - auto surface = SkSurface::MakeRenderTarget( - gr_context(), SkBudgeted::kNo, image_info, 0 /* sampleCount */, - kTopLeft_GrSurfaceOrigin, nullptr /* surfaceProps */); - - // We don't have driver support for that particular color_type. Try again with - // well supported SkColorType. Reads from this may have unusual colors due to - // interpreting RGBA as |color_type|, but that's better than completely - // undefined. - if (!surface) { - image_info = SkImageInfo::Make(1 /* width */, 1 /* height */, - kRGBA_8888_SkColorType, kOpaque_SkAlphaType); - surface = SkSurface::MakeRenderTarget( - gr_context(), SkBudgeted::kNo, image_info, 0 /* sampleCount */, - kTopLeft_GrSurfaceOrigin, nullptr /* surfaceProps */); - - if (!surface) - return; - } - - auto* canvas = surface->getCanvas(); -#if DCHECK_IS_ON() - canvas->clear(SK_ColorRED); -#else - canvas->clear(SK_ColorWHITE); -#endif - fallback_promise_images_.push_back(surface->makeImageSnapshot()); - auto gr_texture = fallback_promise_images_.back()->getBackendTexture( - false /* flushPendingGrContextIO */); - fallback_promise_image_texture_[color_type] = - SkPromiseImageTexture::Make(gr_texture); } void SkiaOutputSurfaceImplOnGpu::SetCapabilitiesForTesting(
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h index d5ceea4..d50aa266 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
@@ -46,7 +46,6 @@ namespace gpu { class SyncPointClientState; -class SharedImageRepresentationSkia; } namespace ui { @@ -57,6 +56,7 @@ namespace viz { +struct ImageContext; class DirectContextProvider; class GLRendererCopier; class GpuServiceImpl; @@ -120,6 +120,7 @@ void FinishPaintCurrentFrame( std::unique_ptr<SkDeferredDisplayList> ddl, std::unique_ptr<SkDeferredDisplayList> overdraw_ddl, + std::vector<ImageContext*> image_contexts, std::vector<gpu::SyncToken> sync_tokens, uint64_t sync_fence_release); void SwapBuffers(OutputSurfaceFrame frame); @@ -127,34 +128,24 @@ void DiscardBackbuffer() { output_device_->DiscardBackbuffer(); } void FinishPaintRenderPass(RenderPassId id, std::unique_ptr<SkDeferredDisplayList> ddl, + std::vector<ImageContext*> image_contexts, std::vector<gpu::SyncToken> sync_tokens, uint64_t sync_fence_release); - void RemoveRenderPassResource(std::vector<RenderPassId> ids); + void RemoveRenderPassResource( + std::vector<std::unique_ptr<ImageContext>> image_contexts); void CopyOutput(RenderPassId id, const copy_output::RenderPassGeometry& geometry, const gfx::ColorSpace& color_space, std::unique_ptr<CopyOutputRequest> request); - // Fulfill callback for promise SkImage created from a resource. - sk_sp<SkPromiseImageTexture> FulfillPromiseTexture( - const gpu::MailboxHolder& mailbox_holder, - const gfx::Size& size, - const ResourceFormat resource_format, - std::unique_ptr<gpu::SharedImageRepresentationSkia>* shared_image_out); - // Fulfill callback for promise SkImage created from a render pass. - // |shared_image_out| is ignored for render passes, as these aren't based on - // SharedImage. - sk_sp<SkPromiseImageTexture> FulfillPromiseTexture( - const RenderPassId id, - std::unique_ptr<gpu::SharedImageRepresentationSkia>* shared_image_out); + void BeginAccessImages(const std::vector<ImageContext*>& image_contexts); + void EndAccessImages(const std::vector<ImageContext*>& image_contexts); sk_sp<GrContextThreadSafeProxy> GetGrContextThreadSafeProxy(); const gl::GLVersionInfo* gl_version_info() const { return gl_version_info_; } - void DestroySkImages(std::vector<sk_sp<SkImage>>&& images, - uint64_t sync_fence_release); - - void CreateFallbackPromiseImage(SkColorType color_type); + void ReleaseSkImages( + std::vector<std::unique_ptr<ImageContext>> image_contexts); bool was_context_lost() { return context_state_->context_lost(); } @@ -164,6 +155,8 @@ const OutputSurface::Capabilities& capabilities); private: + class ScopedPromiseImageAccess; + void InitializeForGLWithGpuService(GpuServiceImpl* gpu_service); void InitializeForVulkan(GpuServiceImpl* gpu_service);
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc index 4748372..fc5643d 100644 --- a/components/viz/service/gl/gpu_service_impl.cc +++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -43,7 +43,9 @@ #include "media/gpu/gpu_video_encode_accelerator_factory.h" #include "media/gpu/ipc/service/gpu_video_decode_accelerator.h" #include "media/gpu/ipc/service/media_gpu_channel_manager.h" -#include "media/mojo/services/mojo_jpeg_encode_accelerator_service.h" +#if defined(OS_CHROMEOS) +#include "media/mojo/services/cros_mojo_jpeg_encode_accelerator_service.h" +#endif // defined(OS_CHROMEOS) #include "media/mojo/services/mojo_mjpeg_decode_accelerator_service.h" #include "media/mojo/services/mojo_video_encode_accelerator_provider.h" #include "mojo/public/cpp/bindings/strong_binding.h" @@ -397,6 +399,12 @@ protected_buffer_manager_), std::move(pbm_request)); } + +void GpuServiceImpl::CreateJpegEncodeAccelerator( + media::mojom::JpegEncodeAcceleratorRequest jea_request) { + DCHECK(io_runner_->BelongsToCurrentThread()); + media::CrOSMojoJpegEncodeAcceleratorService::Create(std::move(jea_request)); +} #endif // defined(OS_CHROMEOS) void GpuServiceImpl::CreateJpegDecodeAccelerator( @@ -405,12 +413,6 @@ media::MojoMjpegDecodeAcceleratorService::Create(std::move(jda_request)); } -void GpuServiceImpl::CreateJpegEncodeAccelerator( - media::mojom::JpegEncodeAcceleratorRequest jea_request) { - DCHECK(io_runner_->BelongsToCurrentThread()); - media::MojoJpegEncodeAcceleratorService::Create(std::move(jea_request)); -} - void GpuServiceImpl::CreateVideoEncodeAcceleratorProvider( media::mojom::VideoEncodeAcceleratorProviderRequest vea_provider_request) { DCHECK(io_runner_->BelongsToCurrentThread());
diff --git a/components/viz/service/gl/gpu_service_impl.h b/components/viz/service/gl/gpu_service_impl.h index dcc3462..6ebfba0 100644 --- a/components/viz/service/gl/gpu_service_impl.h +++ b/components/viz/service/gl/gpu_service_impl.h
@@ -114,11 +114,11 @@ arc::mojom::VideoProtectedBufferAllocatorRequest pba_request) override; void CreateArcProtectedBufferManager( arc::mojom::ProtectedBufferManagerRequest pbm_request) override; + void CreateJpegEncodeAccelerator( + media::mojom::JpegEncodeAcceleratorRequest jea_request) override; #endif // defined(OS_CHROMEOS) void CreateJpegDecodeAccelerator( media::mojom::MjpegDecodeAcceleratorRequest jda_request) override; - void CreateJpegEncodeAccelerator( - media::mojom::JpegEncodeAcceleratorRequest jea_request) override; void CreateVideoEncodeAcceleratorProvider( media::mojom::VideoEncodeAcceleratorProviderRequest vea_provider_request) override;
diff --git a/components/viz/test/fake_skia_output_surface.cc b/components/viz/test/fake_skia_output_surface.cc index 799d0b1..026d05d9 100644 --- a/components/viz/test/fake_skia_output_surface.cc +++ b/components/viz/test/fake_skia_output_surface.cc
@@ -129,7 +129,7 @@ } sk_sp<SkImage> FakeSkiaOutputSurface::MakePromiseSkImage( - ResourceMetadata metadata) { + const ResourceMetadata& metadata) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); GrBackendTexture backend_texture; @@ -146,7 +146,7 @@ } sk_sp<SkImage> FakeSkiaOutputSurface::MakePromiseSkImageFromYUV( - std::vector<ResourceMetadata> metadatas, + const std::vector<ResourceMetadata>& metadatas, SkYUVColorSpace yuv_color_space, sk_sp<SkColorSpace> dst_color_space, bool has_alpha) { @@ -155,15 +155,8 @@ return nullptr; } -gpu::SyncToken FakeSkiaOutputSurface::ReleasePromiseSkImages( - std::vector<sk_sp<SkImage>> images) { - gpu::SyncToken sync_token; - if (images.empty()) - return sync_token; - images.clear(); - context_provider()->ContextGL()->GenSyncTokenCHROMIUM(sync_token.GetData()); - return sync_token; -} +void FakeSkiaOutputSurface::ReleaseCachedPromiseSkImages( + std::vector<ResourceId> ids) {} void FakeSkiaOutputSurface::SkiaSwapBuffers(OutputSurfaceFrame frame) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/components/viz/test/fake_skia_output_surface.h b/components/viz/test/fake_skia_output_surface.h index 5827cdb..276b4bca 100644 --- a/components/viz/test/fake_skia_output_surface.h +++ b/components/viz/test/fake_skia_output_surface.h
@@ -56,7 +56,7 @@ // SkiaOutputSurface implementation: SkCanvas* BeginPaintCurrentFrame() override; sk_sp<SkImage> MakePromiseSkImageFromYUV( - std::vector<ResourceMetadata> metadatas, + const std::vector<ResourceMetadata>& metadatas, SkYUVColorSpace yuv_color_space, sk_sp<SkColorSpace> dst_color_space, bool has_alpha) override; @@ -67,15 +67,14 @@ bool mipmap, sk_sp<SkColorSpace> color_space) override; gpu::SyncToken SubmitPaint() override; - sk_sp<SkImage> MakePromiseSkImage(ResourceMetadata metadata) override; + sk_sp<SkImage> MakePromiseSkImage(const ResourceMetadata& metadata) override; sk_sp<SkImage> MakePromiseSkImageFromRenderPass( const RenderPassId& id, const gfx::Size& size, ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space) override; - gpu::SyncToken ReleasePromiseSkImages( - std::vector<sk_sp<SkImage>> images) override; + void ReleaseCachedPromiseSkImages(std::vector<ResourceId> ids) override; void RemoveRenderPassResource(std::vector<RenderPassId> ids) override; void CopyOutput(RenderPassId id,
diff --git a/content/app/strings/translations/content_strings_fil.xtb b/content/app/strings/translations/content_strings_fil.xtb index 14636d0..4221e6c67 100644 --- a/content/app/strings/translations/content_strings_fil.xtb +++ b/content/app/strings/translations/content_strings_fil.xtb
@@ -177,6 +177,7 @@ <translation id="6981594929165378967">paglagay</translation> <translation id="6989848892321993519">Pakidagdagan ang text na ito nang hanggang <ph name="MIN_CHARACTERS" /> (na) character o higit pa (kasalukuyan kang gumagamit ng 1 character).</translation> <translation id="709897737746224366">Pakitugma ang hiniling na format.</translation> +<translation id="7118469954320184356">Walang available na paglalarawan.</translation> <translation id="7139483182332611405">preface</translation> <translation id="7263440858009898357">Mangyaring pumili ng item sa listahan.</translation> <translation id="727747134524199931">header ng column</translation>
diff --git a/content/app/strings/translations/content_strings_hi.xtb b/content/app/strings/translations/content_strings_hi.xtb index dfe9d99..e8be46cf 100644 --- a/content/app/strings/translations/content_strings_hi.xtb +++ b/content/app/strings/translations/content_strings_hi.xtb
@@ -41,12 +41,12 @@ <translation id="2277199496770840904">ट्रैक <ph name="NUMBER" /></translation> <translation id="2291999235780842123">चेकबॉक्स</translation> <translation id="2311842470354187719">नया पेज</translation> -<translation id="2335594187091864976">दिनांक और समय पिकर</translation> +<translation id="2335594187091864976">तारीख और समय पिकर</translation> <translation id="245932805758469625">बचे हुए वीडियो का कुल समय सेकंड में</translation> <translation id="248395913932153421">दिन</translation> <translation id="2507943997699731163">कृपया इस फ़ील्ड को भरें.</translation> <translation id="2508569020611168319">टैब सूची</translation> -<translation id="2561842179657104141">अधिक मीडिया नियंत्रण दिखाएं</translation> +<translation id="2561842179657104141">ज़्यादा मीडिया नियंत्रण दिखाएं</translation> <translation id="2572483411312390101">चलाएं</translation> <translation id="2613802280814924224">कृपया कोई मान्य मान डालें. निकटतम मान्य मान <ph name="VALID_VALUE" /> है.</translation> <translation id="2653659639078652383">सबमिट करें</translation> @@ -77,7 +77,7 @@ <translation id="3732799496749320381">mm</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> जीबी</translation> <translation id="3808586225841795776">शब्द</translation> -<translation id="3822383571486410024">कृपया इस लेख को <ph name="MIN_CHARACTERS" /> वर्णों या अधिक तक बढ़ाएं (वर्तमान में आप <ph name="CURRENT_LENGTH" /> वर्णों का उपयोग कर रहे हैं).</translation> +<translation id="3822383571486410024">कृपया इस लेख को <ph name="MIN_CHARACTERS" /> वर्णों या ज़्यादा तक बढ़ाएं (वर्तमान में आप <ph name="CURRENT_LENGTH" /> वर्णों का उपयोग कर रहे हैं).</translation> <translation id="383465348367842624">'<ph name="ATSIGN" />' के बाद आने वाले भाग में '<ph name="INVALIDCHARACTER" />' प्रतीक शामिल नहीं होना चाहिए.</translation> <translation id="3846214748874656680">पूर्णस्क्रीन से बाहर निकलें</translation> <translation id="3920932319529768807">निष्कर्ष</translation> @@ -124,16 +124,16 @@ <translation id="5334352251556557839">मीडिया नहीं चला पा रहे हैं.</translation> <translation id="5406322316791861025">आकृति</translation> <translation id="5453733299334684579">ट्री आइटम</translation> -<translation id="5466621249238537318">कृपया एक या अधिक फ़ाइल को चुनें.</translation> +<translation id="5466621249238537318">कृपया एक या ज़्यादा फ़ाइल को चुनें.</translation> <translation id="5468998798572797635">पूर्ण स्क्रीन से बाहर निकलें</translation> -<translation id="5516424706154626233">दिनांक पिकर</translation> +<translation id="5516424706154626233">तारीख पिकर</translation> <translation id="5537725057119320332">कास्ट करें</translation> <translation id="5546461542133609677">अनम्यूट करें</translation> <translation id="561939826962581046">समय</translation> <translation id="5630795885300617244">10 सेकंड आगे या पीछे जाने के लिए बाएं या दाएं पर दो बार टैप करें</translation> <translation id="5631759159893697722">संक्षेप</translation> <translation id="5643186887447432888">बटन</translation> -<translation id="5677946354068040947">अधिक विकल्प</translation> +<translation id="5677946354068040947">ज़्यादा विकल्प</translation> <translation id="576709008726043716">परिचय</translation> <translation id="57838592816432529">म्यूट करें</translation> <translation id="5860033963881614850">बंद</translation>
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.cc b/content/browser/accessibility/accessibility_tree_formatter_blink.cc index 272fab4..20c7cf3 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_blink.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
@@ -79,6 +79,8 @@ return ui::ToString(static_cast<ax::mojom::HasPopup>(value)); case ax::mojom::IntAttribute::kInvalidState: return ui::ToString(static_cast<ax::mojom::InvalidState>(value)); + case ax::mojom::IntAttribute::kListStyle: + return ui::ToString(static_cast<ax::mojom::ListStyle>(value)); case ax::mojom::IntAttribute::kNameFrom: return ui::ToString(static_cast<ax::mojom::NameFrom>(value)); case ax::mojom::IntAttribute::kRestriction:
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index a01dce8..400e17c 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1615,6 +1615,11 @@ RunHtmlTest(FILE_PATH_LITERAL("list-markers.html")); } +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, + AccessibilityListMarkerStyles) { + RunHtmlTest(FILE_PATH_LITERAL("list-marker-styles.html")); +} + IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityLongText) { RunHtmlTest(FILE_PATH_LITERAL("long-text.html")); }
diff --git a/content/browser/devtools/devtools_session.cc b/content/browser/devtools/devtools_session.cc index 6e2d2f3..f5121ff 100644 --- a/content/browser/devtools/devtools_session.cc +++ b/content/browser/devtools/devtools_session.cc
@@ -15,6 +15,10 @@ #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/public/browser/devtools_external_agent_proxy_delegate.h" #include "content/public/browser/devtools_manager_delegate.h" +#include "third_party/inspector_protocol/encoding/encoding.h" + +using inspector_protocol_encoding::SpanFrom; +using inspector_protocol_encoding::cbor::IsCBORMessage; namespace content { @@ -146,8 +150,9 @@ // TODO(dgozman): revisit the proxy delegate. if (proxy_delegate_) { if (client_->UsesBinaryProtocol()) { - DCHECK(IsCBOR(message)); - proxy_delegate_->SendMessageToBackend(this, ConvertCBORToJSON(message)); + DCHECK(IsCBORMessage(SpanFrom(message))); + proxy_delegate_->SendMessageToBackend( + this, ConvertCBORToJSON(SpanFrom(message))); return true; } proxy_delegate_->SendMessageToBackend(this, message); @@ -163,9 +168,9 @@ if (client_->UsesBinaryProtocol()) { // If the client uses the binary protocol, then |message| is already // CBOR (it comes from the client). - DCHECK(IsCBOR(message)); + DCHECK(IsCBORMessage(SpanFrom(message))); } else { - converted_cbor_message = ConvertJSONToCBOR(message); + converted_cbor_message = ConvertJSONToCBOR(SpanFrom(message)); message_to_send = &converted_cbor_message; } value = protocol::DictionaryValue::cast( @@ -283,10 +288,10 @@ return; } std::string cbor = message->serialize(/*binary=*/true); - DCHECK(IsCBOR(cbor)); - client->DispatchProtocolMessage(agent_host, client->UsesBinaryProtocol() - ? cbor - : ConvertCBORToJSON(cbor)); + DCHECK(IsCBORMessage(SpanFrom(cbor))); + client->DispatchProtocolMessage( + agent_host, + client->UsesBinaryProtocol() ? cbor : ConvertCBORToJSON(SpanFrom(cbor))); } void DevToolsSession::sendProtocolResponse( @@ -324,10 +329,10 @@ } std::string cbor(reinterpret_cast<const char*>(message->data.data()), message->data.size()); - DCHECK(IsCBOR(cbor)); - client->DispatchProtocolMessage(agent_host, client->UsesBinaryProtocol() - ? cbor - : ConvertCBORToJSON(cbor)); + DCHECK(IsCBORMessage(SpanFrom(cbor))); + client->DispatchProtocolMessage( + agent_host, + client->UsesBinaryProtocol() ? cbor : ConvertCBORToJSON(SpanFrom(cbor))); } void DevToolsSession::DispatchProtocolResponse( @@ -358,12 +363,14 @@ // |message| either comes from a web socket, in which case it's JSON. // Or it comes from another devtools_session, in which case it may be CBOR // already. We auto-detect and convert to what the client wants as needed. + inspector_protocol_encoding::span<uint8_t> bytes = SpanFrom(message); + bool is_cbor_message = IsCBORMessage(bytes); if (client_->UsesBinaryProtocol()) { client_->DispatchProtocolMessage( - agent_host_, IsCBOR(message) ? message : ConvertJSONToCBOR(message)); + agent_host_, is_cbor_message ? message : ConvertJSONToCBOR(bytes)); } else { client_->DispatchProtocolMessage( - agent_host_, !IsCBOR(message) ? message : ConvertCBORToJSON(message)); + agent_host_, !is_cbor_message ? message : ConvertCBORToJSON(bytes)); } // |this| may be deleted at this point. }
diff --git a/content/browser/devtools/devtools_session_encoding.cc b/content/browser/devtools/devtools_session_encoding.cc index aa5f39f..c15d0627 100644 --- a/content/browser/devtools/devtools_session_encoding.cc +++ b/content/browser/devtools/devtools_session_encoding.cc
@@ -13,11 +13,8 @@ #include "third_party/inspector_protocol/encoding/encoding.h" using inspector_protocol_encoding::span; -using inspector_protocol_encoding::StreamingParserHandler; -using inspector_protocol_encoding::cbor::NewCBOREncoder; -using inspector_protocol_encoding::cbor::ParseCBOR; -using inspector_protocol_encoding::json::NewJSONEncoder; -using inspector_protocol_encoding::json::ParseJSON; +using inspector_protocol_encoding::json::ConvertCBORToJSON; +using inspector_protocol_encoding::json::ConvertJSONToCBOR; using inspector_protocol_encoding::json::Platform; namespace content { @@ -45,18 +42,13 @@ return !disabled; } -// TODO(johannes): Move this into the cbor library. Don't want to -// do this just yet to first gain more experience about the most -// appropriate API, including how to propagate errors. -std::string ConvertCBORToJSON(const std::string& cbor) { +// TODO(johannes): Push error handling to client code after devtools_session.cc +// is simplified. +std::string ConvertCBORToJSON(inspector_protocol_encoding::span<uint8_t> cbor) { ContentShellPlatform platform; std::string json_message; - inspector_protocol_encoding::Status status; - std::unique_ptr<StreamingParserHandler> json_writer = - NewJSONEncoder(&platform, &json_message, &status); - ParseCBOR( - span<uint8_t>(reinterpret_cast<const uint8_t*>(cbor.data()), cbor.size()), - json_writer.get()); + inspector_protocol_encoding::Status status = + ConvertCBORToJSON(platform, cbor, &json_message); if (!status.ok()) { LOG(ERROR) << "ConvertCBORToJSON error " << static_cast<uint32_t>(status.error) << " position " @@ -66,28 +58,17 @@ return json_message; } -std::string ConvertJSONToCBOR(const std::string& json) { +std::string ConvertJSONToCBOR(inspector_protocol_encoding::span<uint8_t> json) { ContentShellPlatform platform; - std::vector<uint8_t> cbor; - inspector_protocol_encoding::Status status; - std::unique_ptr<StreamingParserHandler> encoder = - NewCBOREncoder(&cbor, &status); - ParseJSON( - platform, - span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()), - encoder.get()); + std::string cbor; + inspector_protocol_encoding::Status status = + ConvertJSONToCBOR(platform, json, &cbor); if (!status.ok()) { LOG(ERROR) << "ConvertJSONToCBOR error " << static_cast<uint32_t>(status.error) << " position " << static_cast<uint32_t>(status.pos); return ""; } - return std::string(cbor.begin(), cbor.end()); -} - -bool IsCBOR(const std::string& serialized) { - return serialized.size() >= 6 && - reinterpret_cast<const uint8_t&>(serialized[0]) == 0xd8 && - reinterpret_cast<const uint8_t&>(serialized[1]) == 0x5a; + return cbor; } } // namespace content
diff --git a/content/browser/devtools/devtools_session_encoding.h b/content/browser/devtools/devtools_session_encoding.h index f4bb1ef..e85874f 100644 --- a/content/browser/devtools/devtools_session_encoding.h +++ b/content/browser/devtools/devtools_session_encoding.h
@@ -7,6 +7,8 @@ #include <string> +#include "third_party/inspector_protocol/encoding/encoding.h" + namespace content { // Whether --enable-internal-devtools-binary-parotocol was passed on the command @@ -16,14 +18,8 @@ // Conversion routines between the inspector protocol binary wire format // (based on CBOR RFC 7049) and JSON. -std::string ConvertCBORToJSON(const std::string& cbor); -std::string ConvertJSONToCBOR(const std::string& json); - -// Whether |serialized| is CBOR produced by the inspector protocol. -// We always enclose messages with an envelope, that is, the 0xd8 tag -// followed by the indicator for the byte string, followed by a 32 bit -// length value (4 bytes). -bool IsCBOR(const std::string& serialized); +std::string ConvertCBORToJSON(inspector_protocol_encoding::span<uint8_t> cbor); +std::string ConvertJSONToCBOR(inspector_protocol_encoding::span<uint8_t> json); } // namespace content #endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_SESSION_ENCODING_H_
diff --git a/content/browser/gpu/video_capture_dependencies.cc b/content/browser/gpu/video_capture_dependencies.cc index 0d3153e4..edb4410 100644 --- a/content/browser/gpu/video_capture_dependencies.cc +++ b/content/browser/gpu/video_capture_dependencies.cc
@@ -32,6 +32,7 @@ } } +#if defined(OS_CHROMEOS) // static void VideoCaptureDependencies::CreateJpegEncodeAccelerator( media::mojom::JpegEncodeAcceleratorRequest accelerator) { @@ -51,5 +52,6 @@ LOG(ERROR) << "No GpuProcessHost"; } } +#endif // defined(OS_CHROMEOS) } // namespace content
diff --git a/content/browser/gpu/video_capture_dependencies.h b/content/browser/gpu/video_capture_dependencies.h index 2747e7f..2be659d 100644 --- a/content/browser/gpu/video_capture_dependencies.h +++ b/content/browser/gpu/video_capture_dependencies.h
@@ -15,8 +15,10 @@ public: static void CreateJpegDecodeAccelerator( media::mojom::MjpegDecodeAcceleratorRequest accelerator); +#if defined(OS_CHROMEOS) static void CreateJpegEncodeAccelerator( media::mojom::JpegEncodeAcceleratorRequest accelerator); +#endif // defined(OS_CHROMEOS) }; } // namespace content
diff --git a/content/browser/renderer_host/cursor_manager_unittest.cc b/content/browser/renderer_host/cursor_manager_unittest.cc index 80b769d..b9e6f97 100644 --- a/content/browser/renderer_host/cursor_manager_unittest.cc +++ b/content/browser/renderer_host/cursor_manager_unittest.cc
@@ -39,7 +39,7 @@ CursorManager* GetCursorManager() override { return cursor_manager_.get(); } - WebCursor cursor() { return current_cursor_; } + const WebCursor& cursor() { return current_cursor_; } private: WebCursor current_cursor_; @@ -128,17 +128,16 @@ top_view_->GetCursorManager()->UpdateViewUnderCursor(top_view_); // The view should be using the default cursor. - EXPECT_TRUE(top_view_->cursor().IsEqual(WebCursor())); + EXPECT_EQ(top_view_->cursor(), WebCursor()); CursorInfo cursor_info(blink::WebCursorInfo::kTypeHand); - WebCursor cursor_hand; - cursor_hand.InitFromCursorInfo(cursor_info); + WebCursor cursor_hand(cursor_info); // Update the view with a non-default cursor. top_view_->GetCursorManager()->UpdateCursor(top_view_, cursor_hand); // Verify the RenderWidgetHostView now uses the correct cursor. - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_hand)); + EXPECT_EQ(top_view_->cursor(), cursor_hand); } // Verify cursor interactions between a parent frame and an out-of-process @@ -149,21 +148,20 @@ new MockRenderWidgetHostViewForCursors(widget_host.get(), false)); CursorInfo cursor_info(blink::WebCursorInfo::kTypeHand); - WebCursor cursor_hand; - cursor_hand.InitFromCursorInfo(cursor_info); + WebCursor cursor_hand(cursor_info); // Set the child frame's cursor to a hand. This should not propagate to the // top-level view without the mouse moving over the child frame. top_view_->GetCursorManager()->UpdateCursor(child_view.get(), cursor_hand); - EXPECT_FALSE(top_view_->cursor().IsEqual(cursor_hand)); + EXPECT_NE(top_view_->cursor(), cursor_hand); // Now moving the mouse over the child frame should update the overall cursor. top_view_->GetCursorManager()->UpdateViewUnderCursor(child_view.get()); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_hand)); + EXPECT_EQ(top_view_->cursor(), cursor_hand); // Destruction of the child view should restore the parent frame's cursor. top_view_->GetCursorManager()->ViewBeingDestroyed(child_view.get()); - EXPECT_FALSE(top_view_->cursor().IsEqual(cursor_hand)); + EXPECT_NE(top_view_->cursor(), cursor_hand); } // Verify interactions between two independent OOPIFs, including interleaving @@ -178,46 +176,43 @@ new MockRenderWidgetHostViewForCursors(widget_host2.get(), false)); CursorInfo cursor_info_hand(blink::WebCursorInfo::kTypeHand); - WebCursor cursor_hand; - cursor_hand.InitFromCursorInfo(cursor_info_hand); + WebCursor cursor_hand(cursor_info_hand); CursorInfo cursor_info_cross(blink::WebCursorInfo::kTypeCross); - WebCursor cursor_cross; - cursor_cross.InitFromCursorInfo(cursor_info_cross); + WebCursor cursor_cross(cursor_info_cross); CursorInfo cursor_info_pointer(blink::WebCursorInfo::kTypePointer); - WebCursor cursor_pointer; - cursor_pointer.InitFromCursorInfo(cursor_info_pointer); + WebCursor cursor_pointer(cursor_info_pointer); // Initialize each View to a different cursor. top_view_->GetCursorManager()->UpdateCursor(top_view_, cursor_hand); top_view_->GetCursorManager()->UpdateCursor(child_view1.get(), cursor_cross); top_view_->GetCursorManager()->UpdateCursor(child_view2.get(), cursor_pointer); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_hand)); + EXPECT_EQ(top_view_->cursor(), cursor_hand); // Simulate moving the mouse between child views and receiving cursor updates. top_view_->GetCursorManager()->UpdateViewUnderCursor(child_view1.get()); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_cross)); + EXPECT_EQ(top_view_->cursor(), cursor_cross); top_view_->GetCursorManager()->UpdateViewUnderCursor(child_view2.get()); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_pointer)); + EXPECT_EQ(top_view_->cursor(), cursor_pointer); // Simulate cursor updates to both child views and the parent view. An // update to child_view1 or the parent view should not change the current // cursor because the mouse is over child_view2. top_view_->GetCursorManager()->UpdateCursor(child_view1.get(), cursor_hand); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_pointer)); + EXPECT_EQ(top_view_->cursor(), cursor_pointer); top_view_->GetCursorManager()->UpdateCursor(child_view2.get(), cursor_cross); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_cross)); + EXPECT_EQ(top_view_->cursor(), cursor_cross); top_view_->GetCursorManager()->UpdateCursor(top_view_, cursor_hand); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_cross)); + EXPECT_EQ(top_view_->cursor(), cursor_cross); // Similarly, destroying child_view1 should have no effect on the cursor, // but destroying child_view2 should change it. top_view_->GetCursorManager()->ViewBeingDestroyed(child_view1.get()); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_cross)); + EXPECT_EQ(top_view_->cursor(), cursor_cross); top_view_->GetCursorManager()->ViewBeingDestroyed(child_view2.get()); - EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_hand)); + EXPECT_EQ(top_view_->cursor(), cursor_hand); } } // namespace content
diff --git a/content/browser/renderer_host/input/touch_emulator.cc b/content/browser/renderer_host/input/touch_emulator.cc index ab7c6f7..e26126f 100644 --- a/content/browser/renderer_host/input/touch_emulator.cc +++ b/content/browser/renderer_host/input/touch_emulator.cc
@@ -158,9 +158,7 @@ use_2x ? IDR_DEVTOOLS_PINCH_CURSOR_ICON_2X : IDR_DEVTOOLS_PINCH_CURSOR_ICON); - CursorInfo cursor_info; - cursor_info.type = blink::WebCursorInfo::kTypePointer; - pointer_cursor_.InitFromCursorInfo(cursor_info); + pointer_cursor_ = WebCursor(CursorInfo(blink::WebCursorInfo::kTypePointer)); return true; } @@ -175,7 +173,7 @@ cursor_info.hotspot = gfx::Point(cursor_image.Width() / 2, cursor_image.Height() / 2); - cursor->InitFromCursorInfo(cursor_info); + *cursor = WebCursor(cursor_info); return gfx::ScaleSize(gfx::SizeF(cursor_image.Size()), 1.f / scale); }
diff --git a/content/browser/renderer_host/input/touch_emulator_unittest.cc b/content/browser/renderer_host/input/touch_emulator_unittest.cc index 85c3798..4cffb84 100644 --- a/content/browser/renderer_host/input/touch_emulator_unittest.cc +++ b/content/browser/renderer_host/input/touch_emulator_unittest.cc
@@ -250,11 +250,7 @@ void DisableSynchronousTouchAck() { ack_touches_synchronously_ = false; } - float GetCursorScaleFactor() { - CursorInfo info; - cursor_.GetCursorInfo(&info); - return info.image_scale_factor; - } + float GetCursorScaleFactor() { return cursor_.info().image_scale_factor; } private: base::test::ScopedTaskEnvironment scoped_task_environment_;
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 2a59445..6541d3f 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -1800,9 +1800,7 @@ } void RenderWidgetHostImpl::SetCursor(const CursorInfo& cursor_info) { - WebCursor cursor; - cursor.InitFromCursorInfo(cursor_info); - SetCursor(cursor); + SetCursor(WebCursor(cursor_info)); } RenderProcessHost::Priority RenderWidgetHostImpl::GetPriority() {
diff --git a/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.mm b/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.mm index 7df9ee6..c8b3df6 100644 --- a/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.mm +++ b/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.mm
@@ -217,7 +217,7 @@ } void RenderWidgetHostNSViewBridgeLocal::DisplayCursor(const WebCursor& cursor) { - WebCursor non_const_cursor = cursor; + WebCursor non_const_cursor(cursor); [cocoa_view_ updateCursor:non_const_cursor.GetNativeCursor()]; }
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index d65695ce..ac1875bd4 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -530,10 +530,8 @@ } void RenderWidgetHostViewAndroid::UpdateCursor(const WebCursor& cursor) { - CursorInfo cursor_info; - cursor.GetCursorInfo(&cursor_info); - view_.OnCursorChanged(cursor_info.type, cursor_info.custom_image, - cursor_info.hotspot); + const CursorInfo& info = cursor.info(); + view_.OnCursorChanged(info.type, info.custom_image, info.hotspot); } void RenderWidgetHostViewAndroid::SetIsLoading(bool is_loading) {
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc index 2af65f3..2085f1d 100644 --- a/content/browser/site_per_process_hit_test_browsertest.cc +++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -3906,9 +3906,7 @@ EXPECT_TRUE( root_view->GetCursorManager()->GetCursorForTesting(child_view, cursor)); // Since this moused over a text box, this should not be the default cursor. - CursorInfo cursor_info; - cursor.GetCursorInfo(&cursor_info); - EXPECT_EQ(cursor_info.type, blink::WebCursorInfo::kTypeIBeam); + EXPECT_EQ(cursor.info().type, blink::WebCursorInfo::kTypeIBeam); } } // namespace
diff --git a/content/browser/web_package/signed_exchange_loader.cc b/content/browser/web_package/signed_exchange_loader.cc index 74efbf6..848981b 100644 --- a/content/browser/web_package/signed_exchange_loader.cc +++ b/content/browser/web_package/signed_exchange_loader.cc
@@ -256,8 +256,8 @@ DCHECK(body_data_pipe_adapter_); DCHECK(pending_body_consumer_.is_valid()); - body_data_pipe_adapter_->Start(); client_->OnStartLoadingResponseBody(std::move(pending_body_consumer_)); + body_data_pipe_adapter_->Start(); } void SignedExchangeLoader::SetPriority(net::RequestPriority priority, @@ -357,9 +357,10 @@ return; } + client_->OnStartLoadingResponseBody(std::move(pending_body_consumer_)); + // Start reading. body_data_pipe_adapter_->Start(); - client_->OnStartLoadingResponseBody(std::move(pending_body_consumer_)); } void SignedExchangeLoader::FinishReadingBody(int result) {
diff --git a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc index 45b4476..5c552f1f 100644 --- a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc +++ b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
@@ -445,6 +445,39 @@ PrefetchIsEnabled() ? 2 : 1); } +IN_PROC_BROWSER_TEST_P(SignedExchangeRequestHandlerBrowserTest, BadMICE) { + InstallMockCertChainInterceptor(); + InstallUrlInterceptor(GURL("https://test.example.org/test/"), + "content/test/data/sxg/fallback.html"); + InstallMockCert(); + + embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data"); + ASSERT_TRUE(embedded_test_server()->Start()); + + GURL url = + embedded_test_server()->GetURL("/sxg/test.example.org_test_bad_mice.sxg"); + + if (PrefetchIsEnabled()) + TriggerPrefetch(url, false); + + const base::string16 title_good = base::ASCIIToUTF16("Reached End: false"); + const base::string16 title_bad = base::ASCIIToUTF16("Reached End: true"); + TitleWatcher title_watcher(shell()->web_contents(), title_good); + title_watcher.AlsoWaitForTitle(title_bad); + NavigateToURL(shell(), url); + EXPECT_EQ(title_good, title_watcher.WaitAndGetTitle()); + + histogram_tester_.ExpectTotalCount(kLoadResultHistogram, + PrefetchIsEnabled() ? 2 : 1); + { + SCOPED_TRACE(testing::Message() + << "testing SignedExchangeLoadResult::kMerkleIntegrityError"); + histogram_tester_.ExpectBucketCount( + kLoadResultHistogram, SignedExchangeLoadResult::kMerkleIntegrityError, + PrefetchIsEnabled() ? 2 : 1); + } +} + IN_PROC_BROWSER_TEST_P(SignedExchangeRequestHandlerBrowserTest, CertNotFound) { InstallUrlInterceptor(GURL("https://cert.example.org/cert.msg"), "content/test/data/sxg/404.msg");
diff --git a/content/common/content_param_traits.h b/content/common/content_param_traits.h index 38d041c..c9b0d877 100644 --- a/content/common/content_param_traits.h +++ b/content/common/content_param_traits.h
@@ -48,7 +48,7 @@ static bool Read(const base::Pickle* m, base::PickleIterator* iter, param_type* r) { - return r->Deserialize(iter); + return r->Deserialize(m, iter); } static void Log(const param_type& p, std::string* l) { l->append("<WebCursor>");
diff --git a/content/common/cursors/webcursor.cc b/content/common/cursors/webcursor.cc index 5d194ad..1babc47 100644 --- a/content/common/cursors/webcursor.cc +++ b/content/common/cursors/webcursor.cc
@@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,202 +10,103 @@ #include "base/pickle.h" #include "build/build_config.h" #include "third_party/blink/public/platform/web_image.h" +#include "ui/gfx/ipc/skia/gfx_skia_param_traits.h" using blink::WebCursorInfo; -static const int kMaxCursorDimension = 1024; +constexpr int kMaxImageSize = 1024; namespace content { -WebCursor::WebCursor() : type_(WebCursorInfo::kTypePointer), custom_scale_(1) { - InitPlatformData(); +namespace { + +// Checks for a reasonable value of a |CursorInfo::image_scale_factor|. +bool IsReasonableScale(float scale) { + return scale >= 0.01f && scale <= 100.f; } +} // namespace + WebCursor::~WebCursor() { - Clear(); + CleanupPlatformData(); } -WebCursor::WebCursor(const WebCursor& other) { - InitPlatformData(); - Copy(other); -} - -const WebCursor& WebCursor::operator=(const WebCursor& other) { - if (this == &other) - return *this; - - Clear(); - Copy(other); - return *this; -} - -void WebCursor::InitFromCursorInfo(const CursorInfo& cursor_info) { - Clear(); - - type_ = cursor_info.type; - hotspot_ = cursor_info.hotspot; - if (IsCustom()) - SetCustomData(cursor_info.custom_image); - custom_scale_ = cursor_info.image_scale_factor; - CHECK(custom_scale_ > 0); +WebCursor::WebCursor(const CursorInfo& info) : info_(info) { + CHECK(IsReasonableScale(info.image_scale_factor)) << info.image_scale_factor; + CHECK_LE(info.custom_image.width(), kMaxImageSize); + CHECK_LE(info.custom_image.height(), kMaxImageSize); + CHECK_LE(info.custom_image.width() / info.image_scale_factor, kMaxImageSize); + CHECK_LE(info.custom_image.height() / info.image_scale_factor, kMaxImageSize); ClampHotspot(); } -void WebCursor::GetCursorInfo(CursorInfo* cursor_info) const { - cursor_info->type = static_cast<WebCursorInfo::Type>(type_); - cursor_info->hotspot = hotspot_; - ImageFromCustomData(&cursor_info->custom_image); - cursor_info->image_scale_factor = custom_scale_; +WebCursor::WebCursor(const WebCursor& other) : info_(other.info_) { + CopyPlatformData(other); } -bool WebCursor::Deserialize(base::PickleIterator* iter) { - int type, hotspot_x, hotspot_y, size_x, size_y, data_len; - float scale; - const char* data; - - // Leave |this| unmodified unless we are going to return success. - if (!iter->ReadInt(&type) || - !iter->ReadInt(&hotspot_x) || - !iter->ReadInt(&hotspot_y) || - !iter->ReadLength(&size_x) || - !iter->ReadLength(&size_y) || - !iter->ReadFloat(&scale) || - !iter->ReadData(&data, &data_len)) +bool WebCursor::Deserialize(const base::Pickle* m, base::PickleIterator* iter) { + // Leave |this| unmodified unless deserialization is successful. + int type = 0, hotspot_x = 0, hotspot_y = 0; + float scale = 1.f; + SkBitmap bitmap; + if (!iter->ReadInt(&type)) return false; - // Ensure the size is sane, and there is enough data. - if (size_x > kMaxCursorDimension || - size_y > kMaxCursorDimension) - return false; - - // Ensure scale isn't ridiculous, and the scaled image size is still sane. - if (scale < 0.01 || scale > 100 || - size_x / scale > kMaxCursorDimension || - size_y / scale > kMaxCursorDimension) - return false; - - type_ = type; - if (type == WebCursorInfo::kTypeCustom) { - if (size_x > 0 && size_y > 0) { - // The * 4 is because the expected format is an array of RGBA pixel - // values. - if (size_x * size_y * 4 != data_len) { - DLOG(WARNING) << "WebCursor's data length and image size mismatch: " - << size_x << "x" << size_y << "x4 != " << data_len; - return false; - } + if (!iter->ReadInt(&hotspot_x) || !iter->ReadInt(&hotspot_y) || + !iter->ReadFloat(&scale) || !IsReasonableScale(scale)) { + return false; + } - hotspot_.set_x(hotspot_x); - hotspot_.set_y(hotspot_y); - custom_size_.set_width(size_x); - custom_size_.set_height(size_y); - custom_scale_ = scale; - ClampHotspot(); + if (!IPC::ParamTraits<SkBitmap>::Read(m, iter, &bitmap)) + return false; - custom_data_.clear(); - if (data_len > 0) { - custom_data_.resize(data_len); - memcpy(&custom_data_[0], data, data_len); - } + if (bitmap.width() > kMaxImageSize || bitmap.height() > kMaxImageSize || + bitmap.width() / scale > kMaxImageSize || + bitmap.height() / scale > kMaxImageSize) { + return false; } } + + info_.type = static_cast<WebCursorInfo::Type>(type); + info_.custom_image = bitmap; + info_.hotspot = gfx::Point(hotspot_x, hotspot_y); + info_.image_scale_factor = scale; + ClampHotspot(); return true; } void WebCursor::Serialize(base::Pickle* pickle) const { - pickle->WriteInt(type_); - pickle->WriteInt(hotspot_.x()); - pickle->WriteInt(hotspot_.y()); - pickle->WriteInt(custom_size_.width()); - pickle->WriteInt(custom_size_.height()); - pickle->WriteFloat(custom_scale_); - - const char* data = nullptr; - if (!custom_data_.empty()) - data = &custom_data_[0]; - pickle->WriteData(data, custom_data_.size()); -} - -bool WebCursor::IsCustom() const { - return type_ == WebCursorInfo::kTypeCustom; -} - -bool WebCursor::IsEqual(const WebCursor& other) const { - if (type_ != other.type_) - return false; - - if (!IsPlatformDataEqual(other)) - return false; - - return hotspot_ == other.hotspot_ && - custom_size_ == other.custom_size_ && - custom_scale_ == other.custom_scale_ && - custom_data_ == other.custom_data_; -} - -void WebCursor::Clear() { - type_ = WebCursorInfo::kTypePointer; - hotspot_.set_x(0); - hotspot_.set_y(0); - custom_size_.set_width(0); - custom_size_.set_height(0); - custom_scale_ = 1; - custom_data_.clear(); - CleanupPlatformData(); -} - -void WebCursor::Copy(const WebCursor& other) { - type_ = other.type_; - hotspot_ = other.hotspot_; - custom_size_ = other.custom_size_; - custom_scale_ = other.custom_scale_; - custom_data_ = other.custom_data_; - CopyPlatformData(other); -} - -void WebCursor::SetCustomData(const SkBitmap& bitmap) { - CreateCustomData(bitmap, &custom_data_, &custom_size_); -} - -void WebCursor::CreateCustomData(const SkBitmap& bitmap, - std::vector<char>* custom_data, - gfx::Size* custom_size) { - if (bitmap.empty()) - return; - - // Fill custom_data directly with the NativeImage pixels. - custom_data->resize(bitmap.computeByteSize()); - if (!custom_data->empty()) { - //This will divide color values by alpha (un-premultiply) if necessary - SkImageInfo dstInfo = bitmap.info().makeAlphaType(kUnpremul_SkAlphaType); - bitmap.readPixels(dstInfo, &(*custom_data)[0], dstInfo.minRowBytes(), 0, 0); + pickle->WriteInt(info_.type); + if (info_.type == WebCursorInfo::kTypeCustom) { + pickle->WriteInt(info_.hotspot.x()); + pickle->WriteInt(info_.hotspot.y()); + pickle->WriteFloat(info_.image_scale_factor); + IPC::ParamTraits<SkBitmap>::Write(pickle, info_.custom_image); } - custom_size->set_width(bitmap.width()); - custom_size->set_height(bitmap.height()); } -void WebCursor::ImageFromCustomData(SkBitmap* image) const { - if (custom_data_.empty()) - return; +bool WebCursor::operator==(const WebCursor& other) const { + return info_ == other.info_ && +#if defined(USE_AURA) || defined(USE_OZONE) + rotation_ == other.rotation_ && +#endif + IsPlatformDataEqual(other); +} - SkImageInfo image_info = SkImageInfo::MakeN32(custom_size_.width(), - custom_size_.height(), - kUnpremul_SkAlphaType); - if (!image->tryAllocPixels(image_info)) - return; - memcpy(image->getPixels(), &custom_data_[0], custom_data_.size()); +bool WebCursor::operator!=(const WebCursor& other) const { + return !(*this == other); } void WebCursor::ClampHotspot() { - if (!IsCustom()) + if (info_.type != WebCursorInfo::kTypeCustom) return; // Clamp the hotspot to the custom image's dimensions. - hotspot_.set_x(std::max(0, - std::min(custom_size_.width() - 1, hotspot_.x()))); - hotspot_.set_y(std::max(0, - std::min(custom_size_.height() - 1, hotspot_.y()))); + info_.hotspot.set_x( + std::max(0, std::min(info_.custom_image.width() - 1, info_.hotspot.x()))); + info_.hotspot.set_y(std::max( + 0, std::min(info_.custom_image.height() - 1, info_.hotspot.y()))); } } // namespace content
diff --git a/content/common/cursors/webcursor.h b/content/common/cursors/webcursor.h index 8e399d4..3a740af 100644 --- a/content/common/cursors/webcursor.h +++ b/content/common/cursors/webcursor.h
@@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -19,18 +19,6 @@ #include "ui/base/cursor/cursor.h" #endif -#if defined(OS_WIN) -typedef struct HINSTANCE__* HINSTANCE; -typedef struct HICON__* HICON; -typedef HICON HCURSOR; -#elif defined(OS_MACOSX) -#ifdef __OBJC__ -@class NSCursor; -#else -class NSCursor; -#endif -#endif - namespace base { class Pickle; class PickleIterator; @@ -41,32 +29,23 @@ // This class encapsulates a cross-platform description of a cursor. Platform // specific methods are provided to translate the cross-platform cursor into a // platform specific cursor. It is also possible to serialize / de-serialize a -// WebCursor. +// WebCursor. This class is highly similar to ui::Cursor. class CONTENT_EXPORT WebCursor { public: - WebCursor(); + WebCursor() = default; + explicit WebCursor(const CursorInfo& info); + explicit WebCursor(const WebCursor& other); ~WebCursor(); - // Copy constructor/assignment operator combine. - WebCursor(const WebCursor& other); - const WebCursor& operator=(const WebCursor& other); - - // Conversion from/to CursorInfo. - void InitFromCursorInfo(const CursorInfo& cursor_info); - void GetCursorInfo(CursorInfo* cursor_info) const; + const CursorInfo& info() const { return info_; } // Serialization / De-serialization - bool Deserialize(base::PickleIterator* iter); + bool Deserialize(const base::Pickle* m, base::PickleIterator* iter); void Serialize(base::Pickle* pickle) const; - // Returns true if GetCustomCursor should be used to allocate a platform - // specific cursor object. Otherwise GetCursor should be used. - bool IsCustom() const; - - // Returns true if the current cursor object contains the same cursor as the - // cursor object passed in. If the current cursor is a custom cursor, we also - // compare the bitmaps to verify whether they are equal. - bool IsEqual(const WebCursor& other) const; + // Equality operator; performs bitmap content comparison as needed. + bool operator==(const WebCursor& other) const; + bool operator!=(const WebCursor& other) const; // Returns a native cursor representing the current WebCursor instance. gfx::NativeCursor GetNativeCursor(); @@ -79,31 +58,14 @@ void CreateScaledBitmapAndHotspotFromCustomData(SkBitmap* bitmap, gfx::Point* hotspot, - float* scale_factor); - -#elif defined(OS_WIN) - // Returns a HCURSOR representing the current WebCursor instance. - // The ownership of the HCURSOR remains with the WebCursor instance. - HCURSOR GetCursor(HINSTANCE module_handle); - -#elif defined(OS_MACOSX) - // Initialize this from the given Cocoa NSCursor. - void InitFromNSCursor(NSCursor* cursor); + float* scale); #endif + void set_info_for_testing(const CursorInfo& info) { info_ = info; } + private: - // Copies the contents of the WebCursor instance passed in. - void Copy(const WebCursor& other); - - // Cleans up the WebCursor instance. - void Clear(); - - // Platform specific initialization goes here. - void InitPlatformData(); - - // Returns true if the platform data in the current cursor object - // matches that of the cursor passed in. - bool IsPlatformDataEqual(const WebCursor& other) const ; + // Returns true if this cursor's platform data matches that of |other|. + bool IsPlatformDataEqual(const WebCursor& other) const; // Copies platform specific data from the WebCursor instance passed in. void CopyPlatformData(const WebCursor& other); @@ -111,48 +73,25 @@ // Platform specific cleanup. void CleanupPlatformData(); - void SetCustomData(const SkBitmap& image); - - // Fills the custom_data vector and custom_size object with the image data - // taken from the bitmap. - void CreateCustomData(const SkBitmap& bitmap, - std::vector<char>* custom_data, - gfx::Size* custom_size); - - void ImageFromCustomData(SkBitmap* image) const; - // Clamp the hotspot to the custom image's bounds, if this is a custom cursor. void ClampHotspot(); float GetCursorScaleFactor(SkBitmap* bitmap); - // WebCore::PlatformCursor type. - int type_; + // The basic cursor info. + CursorInfo info_; - // Hotspot in cursor image in pixels. - gfx::Point hotspot_; - - // Custom cursor data, as 32-bit RGBA. - // Platform-inspecific because it can be serialized. - gfx::Size custom_size_; // In pixels. - float custom_scale_; - std::vector<char> custom_data_; - -#if defined(USE_AURA) && (defined(USE_X11) || defined(USE_OZONE)) +#if defined(USE_AURA) || defined(USE_OZONE) // Only used for custom cursors. - ui::PlatformCursor platform_cursor_; -#elif defined(OS_WIN) - // A custom cursor created from custom bitmap data by Webkit. - HCURSOR custom_cursor_; -#endif -#if defined(USE_AURA) - float device_scale_factor_; -#endif - + ui::PlatformCursor platform_cursor_ = 0; + float device_scale_factor_ = 1.f; display::Display::Rotation rotation_ = display::Display::ROTATE_0; +#endif #if defined(USE_OZONE) - gfx::Size maximum_cursor_size_; + // This matches ozone drm_util.cc's kDefaultCursorWidth/Height. + static constexpr int kDefaultMaxSize = 64; + gfx::Size maximum_cursor_size_ = {kDefaultMaxSize, kDefaultMaxSize}; #endif };
diff --git a/content/common/cursors/webcursor_android.cc b/content/common/cursors/webcursor_android.cc index 5d2db8c..cd1e889 100644 --- a/content/common/cursors/webcursor_android.cc +++ b/content/common/cursors/webcursor_android.cc
@@ -17,21 +17,15 @@ // In the future when we want to support cursors of various kinds in Aura on // Android, we should switch to using webcursor_aura rather than add an // implementation here. -void WebCursor::SetDisplayInfo(const display::Display& display) { -} +void WebCursor::SetDisplayInfo(const display::Display& display) {} #endif -void WebCursor::InitPlatformData() { -} - bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const { return true; } -void WebCursor::CleanupPlatformData() { -} +void WebCursor::CleanupPlatformData() {} -void WebCursor::CopyPlatformData(const WebCursor& other) { -} +void WebCursor::CopyPlatformData(const WebCursor& other) {} } // namespace content
diff --git a/content/common/cursors/webcursor_aura.cc b/content/common/cursors/webcursor_aura.cc index 47ddcba5..6e665d2 100644 --- a/content/common/cursors/webcursor_aura.cc +++ b/content/common/cursors/webcursor_aura.cc
@@ -14,7 +14,7 @@ namespace content { gfx::NativeCursor WebCursor::GetNativeCursor() { - switch (type_) { + switch (info_.type) { case WebCursorInfo::kTypePointer: return ui::CursorType::kPointer; case WebCursorInfo::kTypeCross: @@ -105,12 +105,11 @@ ui::Cursor cursor(ui::CursorType::kCustom); SkBitmap bitmap; gfx::Point hotspot; - float scale_factor = 1.f; - CreateScaledBitmapAndHotspotFromCustomData(&bitmap, &hotspot, - &scale_factor); + float scale; + CreateScaledBitmapAndHotspotFromCustomData(&bitmap, &hotspot, &scale); cursor.set_custom_bitmap(bitmap); cursor.set_custom_hotspot(hotspot); - cursor.set_device_scale_factor(scale_factor); + cursor.set_device_scale_factor(scale); cursor.SetPlatformCursor(GetPlatformCursor(cursor)); return cursor; } @@ -120,17 +119,13 @@ } } -void WebCursor::CreateScaledBitmapAndHotspotFromCustomData( - SkBitmap* bitmap, - gfx::Point* hotspot, - float* scale_factor) { - if (custom_data_.empty()) - return; - ImageFromCustomData(bitmap); - *hotspot = hotspot_; - *scale_factor = GetCursorScaleFactor(bitmap); - ui::ScaleAndRotateCursorBitmapAndHotpoint(*scale_factor, rotation_, bitmap, - hotspot); +void WebCursor::CreateScaledBitmapAndHotspotFromCustomData(SkBitmap* bitmap, + gfx::Point* hotspot, + float* scale) { + *bitmap = info_.custom_image; + *hotspot = info_.hotspot; + *scale = GetCursorScaleFactor(bitmap); + ui::ScaleAndRotateCursorBitmapAndHotpoint(*scale, rotation_, bitmap, hotspot); } #if !defined(USE_OZONE) @@ -146,8 +141,8 @@ // ozone also has extra calculations for scale factor (taking max cursor size // into account). float WebCursor::GetCursorScaleFactor(SkBitmap* bitmap) { - DCHECK(custom_scale_ != 0); - return device_scale_factor_ / custom_scale_; + DCHECK_NE(0, info_.image_scale_factor); + return device_scale_factor_ / info_.image_scale_factor; } #endif
diff --git a/content/common/cursors/webcursor_aurawin.cc b/content/common/cursors/webcursor_aurawin.cc index 134c11df..b25bfab 100644 --- a/content/common/cursors/webcursor_aurawin.cc +++ b/content/common/cursors/webcursor_aurawin.cc
@@ -12,27 +12,17 @@ namespace content { ui::PlatformCursor WebCursor::GetPlatformCursor(const ui::Cursor& cursor) { - if (!IsCustom()) - return LoadCursor(NULL, IDC_ARROW); + if (info_.type != blink::WebCursorInfo::kTypeCustom) + return LoadCursor(nullptr, IDC_ARROW); - if (custom_cursor_) - return custom_cursor_; + if (platform_cursor_) + return platform_cursor_; - gfx::Size custom_size; - std::vector<char> custom_data; - CreateCustomData(cursor.GetBitmap(), &custom_data, &custom_size); - - custom_cursor_ = - IconUtil::CreateCursorFromDIB( - custom_size, cursor.GetHotspot(), - !custom_data.empty() ? &custom_data[0] : NULL, custom_data.size()) - .release(); - return custom_cursor_; -} - -void WebCursor::InitPlatformData() { - custom_cursor_ = NULL; - device_scale_factor_ = 1.f; + DCHECK_EQ(kN32_SkColorType, info_.custom_image.colorType()); + platform_cursor_ = IconUtil::CreateCursorFromSkBitmap(info_.custom_image, + cursor.GetHotspot()) + .release(); + return platform_cursor_; } bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const { @@ -40,9 +30,9 @@ } void WebCursor::CleanupPlatformData() { - if (custom_cursor_) { - DestroyIcon(custom_cursor_); - custom_cursor_ = NULL; + if (platform_cursor_) { + DestroyIcon(platform_cursor_); + platform_cursor_ = nullptr; } }
diff --git a/content/common/cursors/webcursor_aurax11.cc b/content/common/cursors/webcursor_aurax11.cc index 1aa9baf0..8f676e0 100644 --- a/content/common/cursors/webcursor_aurax11.cc +++ b/content/common/cursors/webcursor_aurax11.cc
@@ -26,11 +26,6 @@ return platform_cursor_; } -void WebCursor::InitPlatformData() { - platform_cursor_ = 0; - device_scale_factor_ = 1.f; -} - bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const { return true; }
diff --git a/content/common/cursors/webcursor_mac.mm b/content/common/cursors/webcursor_mac.mm index 972ed72..f810011 100644 --- a/content/common/cursors/webcursor_mac.mm +++ b/content/common/cursors/webcursor_mac.mm
@@ -127,34 +127,9 @@ return LoadCursor(resource_id, hotspot_x, hotspot_y); } -NSCursor* CreateCustomCursor(const std::vector<char>& custom_data, - const gfx::Size& custom_size, - float custom_scale, - const gfx::Point& hotspot) { - // If the data is missing, leave the backing transparent. - void* data = NULL; - size_t data_size = 0; - if (!custom_data.empty()) { - // This is safe since we're not going to draw into the context we're - // creating. - data = const_cast<char*>(&custom_data[0]); - data_size = custom_data.size(); - } - - // If the size is empty, use a 1x1 transparent image. - gfx::Size size = custom_size; - if (size.IsEmpty()) { - size.SetSize(1, 1); - data = NULL; - } - - SkBitmap bitmap; - SkImageInfo image_info = SkImageInfo::MakeN32(size.width(), size.height(), - kUnpremul_SkAlphaType); - if (bitmap.tryAllocPixels(image_info) && data) - memcpy(bitmap.getAddr32(0, 0), data, data_size); - else - bitmap.eraseARGB(0, 0, 0, 0); +NSCursor* CreateCustomCursor(const content::CursorInfo& info) { + float custom_scale = info.image_scale_factor; + gfx::Size custom_size(info.custom_image.width(), info.custom_image.height()); // Convert from pixels to view units. if (custom_scale == 0) @@ -162,12 +137,12 @@ NSSize dip_size = NSSizeFromCGSize( gfx::ScaleToFlooredSize(custom_size, 1 / custom_scale).ToCGSize()); NSPoint dip_hotspot = NSPointFromCGPoint( - gfx::ScaleToFlooredPoint(hotspot, 1 / custom_scale).ToCGPoint()); + gfx::ScaleToFlooredPoint(info.hotspot, 1 / custom_scale).ToCGPoint()); // Both the image and its representation need to have the same size for // cursors to appear in high resolution on retina displays. Note that the // size of a representation is not the same as pixelsWide or pixelsHigh. - NSImage* cursor_image = skia::SkBitmapToNSImage(bitmap); + NSImage* cursor_image = skia::SkBitmapToNSImage(info.custom_image); [cursor_image setSize:dip_size]; [[[cursor_image representations] objectAtIndex:0] setSize:dip_size]; @@ -183,7 +158,7 @@ // Match Safari's cursor choices; see platform/mac/CursorMac.mm . gfx::NativeCursor WebCursor::GetNativeCursor() { - switch (type_) { + switch (info_.type) { case WebCursorInfo::kTypePointer: return [NSCursor arrowCursor]; case WebCursorInfo::kTypeCross: @@ -287,79 +262,12 @@ case WebCursorInfo::kTypeGrabbing: return [NSCursor closedHandCursor]; case WebCursorInfo::kTypeCustom: - return CreateCustomCursor( - custom_data_, custom_size_, custom_scale_, hotspot_); + return CreateCustomCursor(info_); } NOTREACHED(); return nil; } -void WebCursor::InitFromNSCursor(NSCursor* cursor) { - CursorInfo cursor_info; - - if ([cursor isEqual:[NSCursor arrowCursor]]) { - cursor_info.type = WebCursorInfo::kTypePointer; - } else if ([cursor isEqual:[NSCursor IBeamCursor]]) { - cursor_info.type = WebCursorInfo::kTypeIBeam; - } else if ([cursor isEqual:[NSCursor crosshairCursor]]) { - cursor_info.type = WebCursorInfo::kTypeCross; - } else if ([cursor isEqual:[NSCursor pointingHandCursor]]) { - cursor_info.type = WebCursorInfo::kTypeHand; - } else if ([cursor isEqual:[NSCursor resizeLeftCursor]]) { - cursor_info.type = WebCursorInfo::kTypeWestResize; - } else if ([cursor isEqual:[NSCursor resizeRightCursor]]) { - cursor_info.type = WebCursorInfo::kTypeEastResize; - } else if ([cursor isEqual:[NSCursor resizeLeftRightCursor]]) { - cursor_info.type = WebCursorInfo::kTypeEastWestResize; - } else if ([cursor isEqual:[NSCursor resizeUpCursor]]) { - cursor_info.type = WebCursorInfo::kTypeNorthResize; - } else if ([cursor isEqual:[NSCursor resizeDownCursor]]) { - cursor_info.type = WebCursorInfo::kTypeSouthResize; - } else if ([cursor isEqual:[NSCursor resizeUpDownCursor]]) { - cursor_info.type = WebCursorInfo::kTypeNorthSouthResize; - } else if ([cursor isEqual:[NSCursor openHandCursor]]) { - cursor_info.type = WebCursorInfo::kTypeGrab; - } else if ([cursor isEqual:[NSCursor closedHandCursor]]) { - cursor_info.type = WebCursorInfo::kTypeGrabbing; - } else if ([cursor isEqual:[NSCursor operationNotAllowedCursor]]) { - cursor_info.type = WebCursorInfo::kTypeNotAllowed; - } else if ([cursor isEqual:[NSCursor dragCopyCursor]]) { - cursor_info.type = WebCursorInfo::kTypeCopy; - } else if ([cursor isEqual:[NSCursor contextualMenuCursor]]) { - cursor_info.type = WebCursorInfo::kTypeContextMenu; - } else if ( - [NSCursor respondsToSelector:@selector(IBeamCursorForVerticalLayout)] && - [cursor isEqual:[NSCursor IBeamCursorForVerticalLayout]]) { - cursor_info.type = WebCursorInfo::kTypeVerticalText; - } else { - // Also handles the [NSCursor disappearingItemCursor] case. Quick-and-dirty - // image conversion; TODO(avi): do better. - CGImageRef cg_image = nil; - NSImage* image = [cursor image]; - for (id rep in [image representations]) { - if ([rep isKindOfClass:[NSBitmapImageRep class]]) { - cg_image = [rep CGImage]; - break; - } - } - - if (cg_image) { - cursor_info.type = WebCursorInfo::kTypeCustom; - NSPoint hot_spot = [cursor hotSpot]; - cursor_info.hotspot = gfx::Point(hot_spot.x, hot_spot.y); - cursor_info.custom_image = skia::CGImageToSkBitmap(cg_image); - } else { - cursor_info.type = WebCursorInfo::kTypePointer; - } - } - - InitFromCursorInfo(cursor_info); -} - -void WebCursor::InitPlatformData() { - return; -} - bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const { return true; }
diff --git a/content/common/cursors/webcursor_ozone.cc b/content/common/cursors/webcursor_ozone.cc index c9b9cb1d..1456be2 100644 --- a/content/common/cursors/webcursor_ozone.cc +++ b/content/common/cursors/webcursor_ozone.cc
@@ -12,11 +12,6 @@ #include "ui/base/ui_base_features.h" #include "ui/ozone/public/cursor_factory_ozone.h" -namespace { -const int kDefaultMaxCursorWidth = 64; -const int kDefaultMaxCursorHeight = 64; -} - namespace content { ui::PlatformCursor WebCursor::GetPlatformCursor(const ui::Cursor& cursor) { @@ -40,11 +35,9 @@ rotation_ = display.rotation(); maximum_cursor_size_ = display.maximum_cursor_size(); // TODO(oshima): Identify if it's possible to remove this check here and move - // the kDefaultMaxCursor{Width,Height} constants to a single place. - // crbug.com/603512 + // the kDefaultMaxSize constants to a single place. crbug.com/603512 if (maximum_cursor_size_.width() == 0 || maximum_cursor_size_.height() == 0) - maximum_cursor_size_ = - gfx::Size(kDefaultMaxCursorWidth, kDefaultMaxCursorHeight); + maximum_cursor_size_ = gfx::Size(kDefaultMaxSize, kDefaultMaxSize); if (platform_cursor_) ui::CursorFactoryOzone::GetInstance()->UnrefImageCursor(platform_cursor_); platform_cursor_ = NULL; @@ -56,19 +49,11 @@ DCHECK_LT(0, maximum_cursor_size_.width()); DCHECK_LT(0, maximum_cursor_size_.height()); return std::min( - {device_scale_factor_ / custom_scale_, + {device_scale_factor_ / info_.image_scale_factor, static_cast<float>(maximum_cursor_size_.width()) / bitmap->width(), static_cast<float>(maximum_cursor_size_.height()) / bitmap->height()}); } -void WebCursor::InitPlatformData() { - platform_cursor_ = NULL; - device_scale_factor_ = 1.f; - rotation_ = display::Display::ROTATE_0; - maximum_cursor_size_ = - gfx::Size(kDefaultMaxCursorWidth, kDefaultMaxCursorHeight); -} - bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const { return true; }
diff --git a/content/common/cursors/webcursor_unittest.cc b/content/common/cursors/webcursor_unittest.cc index 614d30f..eb51327e 100644 --- a/content/common/cursors/webcursor_unittest.cc +++ b/content/common/cursors/webcursor_unittest.cc
@@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -8,272 +8,153 @@ #include "build/build_config.h" #include "content/common/cursors/webcursor.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/platform/web_cursor_info.h" -#include "third_party/skia/include/core/SkImageInfo.h" +#include "third_party/skia/include/core/SkBitmap.h" #if defined(OS_WIN) #include <windows.h> #endif -using blink::WebCursorInfo; - namespace content { +namespace { -TEST(WebCursorTest, OKCursorSerialization) { - WebCursor custom_cursor; - // This is a valid custom cursor. - base::Pickle ok_custom_pickle; - // Type and hotspots. - ok_custom_pickle.WriteInt(WebCursorInfo::kTypeCustom); - ok_custom_pickle.WriteInt(0); - ok_custom_pickle.WriteInt(0); - // X & Y - ok_custom_pickle.WriteInt(1); - ok_custom_pickle.WriteInt(1); - // Scale - ok_custom_pickle.WriteFloat(1.0); - // Data len including enough data for a 1x1 image. - ok_custom_pickle.WriteInt(4); - ok_custom_pickle.WriteUInt32(0); - // Custom Windows message. - ok_custom_pickle.WriteUInt32(0); - base::PickleIterator iter(ok_custom_pickle); - EXPECT_TRUE(custom_cursor.Deserialize(&iter)); +// Creates a basic bitmap for testing with the given width and height. +SkBitmap CreateTestBitmap(int width, int height) { + SkBitmap bitmap; + bitmap.allocN32Pixels(width, height); + bitmap.eraseColor(SK_ColorRED); + return bitmap; } -TEST(WebCursorTest, BrokenCursorSerialization) { - WebCursor custom_cursor; - // This custom cursor has not been send with enough data. - base::Pickle short_custom_pickle; - // Type and hotspots. - short_custom_pickle.WriteInt(WebCursorInfo::kTypeCustom); - short_custom_pickle.WriteInt(0); - short_custom_pickle.WriteInt(0); - // X & Y - short_custom_pickle.WriteInt(1); - short_custom_pickle.WriteInt(1); - // Scale - short_custom_pickle.WriteFloat(1.0); - // Data len not including enough data for a 1x1 image. - short_custom_pickle.WriteInt(3); - short_custom_pickle.WriteUInt32(0); - base::PickleIterator iter(short_custom_pickle); - EXPECT_FALSE(custom_cursor.Deserialize(&iter)); +TEST(WebCursorTest, DefaultConstructor) { + WebCursor cursor; + EXPECT_EQ(blink::WebCursorInfo::kTypePointer, cursor.info().type); + EXPECT_TRUE(cursor.info().custom_image.isNull()); + EXPECT_TRUE(cursor.info().hotspot.IsOrigin()); + EXPECT_EQ(1.f, cursor.info().image_scale_factor); +} - // This custom cursor has enough data but is too big. - base::Pickle large_custom_pickle; - // Type and hotspots. - large_custom_pickle.WriteInt(WebCursorInfo::kTypeCustom); - large_custom_pickle.WriteInt(0); - large_custom_pickle.WriteInt(0); - // X & Y - static const int kTooBigSize = 4096 + 1; - large_custom_pickle.WriteInt(kTooBigSize); - large_custom_pickle.WriteInt(1); - // Scale - large_custom_pickle.WriteFloat(1.0); - // Data len including enough data for a 4097x1 image. - large_custom_pickle.WriteInt(kTooBigSize * 4); - for (int i = 0; i < kTooBigSize; ++i) - large_custom_pickle.WriteUInt32(0); - iter = base::PickleIterator(large_custom_pickle); - EXPECT_FALSE(custom_cursor.Deserialize(&iter)); +TEST(WebCursorTest, CursorInfoConstructor) { + CursorInfo info(blink::WebCursorInfo::kTypeHand); + WebCursor cursor(info); + EXPECT_EQ(info, cursor.info()); +} - // This custom cursor uses negative lengths. - base::Pickle neg_custom_pickle; - // Type and hotspots. - neg_custom_pickle.WriteInt(WebCursorInfo::kTypeCustom); - neg_custom_pickle.WriteInt(0); - neg_custom_pickle.WriteInt(0); - // X & Y - neg_custom_pickle.WriteInt(-1); - neg_custom_pickle.WriteInt(-1); - // Scale - neg_custom_pickle.WriteFloat(1.0); - // Data len including enough data for a 1x1 image. - neg_custom_pickle.WriteInt(4); - neg_custom_pickle.WriteUInt32(0); - // Custom Windows message. - neg_custom_pickle.WriteUInt32(0); - iter = base::PickleIterator(neg_custom_pickle); - EXPECT_FALSE(custom_cursor.Deserialize(&iter)); +TEST(WebCursorTest, CursorInfoConstructorCustom) { + CursorInfo info(blink::WebCursorInfo::kTypeCustom); + info.custom_image = CreateTestBitmap(32, 32); + info.hotspot = gfx::Point(10, 20); + info.image_scale_factor = 1.5f; + WebCursor cursor(info); + EXPECT_EQ(info, cursor.info()); +} - // This custom cursor uses zero scale. - base::Pickle scale_zero_custom_pickle; - // Type and hotspots. - scale_zero_custom_pickle.WriteInt(WebCursorInfo::kTypeCustom); - scale_zero_custom_pickle.WriteInt(0); - scale_zero_custom_pickle.WriteInt(0); - // X & Y - scale_zero_custom_pickle.WriteInt(1); - scale_zero_custom_pickle.WriteInt(1); - // Scale - scale_zero_custom_pickle.WriteFloat(0); - // Data len including enough data for a 1x1 image. - scale_zero_custom_pickle.WriteInt(4); - scale_zero_custom_pickle.WriteUInt32(0); - // Custom Windows message. - scale_zero_custom_pickle.WriteUInt32(0); - iter = base::PickleIterator(scale_zero_custom_pickle); - EXPECT_FALSE(custom_cursor.Deserialize(&iter)); +TEST(WebCursorTest, CopyConstructorType) { + CursorInfo info(blink::WebCursorInfo::kTypeHand); + WebCursor cursor(info); + WebCursor copy(cursor); + EXPECT_EQ(cursor, copy); +} - // This custom cursor uses tiny scale. - base::Pickle scale_tiny_custom_pickle; - // Type and hotspots. - scale_tiny_custom_pickle.WriteInt(WebCursorInfo::kTypeCustom); - scale_tiny_custom_pickle.WriteInt(0); - scale_tiny_custom_pickle.WriteInt(0); - // X & Y - scale_tiny_custom_pickle.WriteInt(1); - scale_tiny_custom_pickle.WriteInt(1); - // Scale - scale_tiny_custom_pickle.WriteFloat(0.001f); - // Data len including enough data for a 1x1 image. - scale_tiny_custom_pickle.WriteInt(4); - scale_tiny_custom_pickle.WriteUInt32(0); - // Custom Windows message. - scale_tiny_custom_pickle.WriteUInt32(0); - iter = base::PickleIterator(scale_tiny_custom_pickle); - EXPECT_FALSE(custom_cursor.Deserialize(&iter)); +TEST(WebCursorTest, CopyConstructorCustom) { + CursorInfo info(blink::WebCursorInfo::kTypeCustom); + info.custom_image = CreateTestBitmap(32, 32); + info.hotspot = gfx::Point(10, 20); + info.image_scale_factor = 1.5f; + WebCursor cursor(info); + WebCursor copy(cursor); + EXPECT_EQ(cursor, copy); +} + +TEST(WebCursorTest, SerializationDefault) { + WebCursor cursor; + base::Pickle pickle; + cursor.Serialize(&pickle); + + WebCursor copy; + base::PickleIterator iter(pickle); + ASSERT_TRUE(copy.Deserialize(&pickle, &iter)); + EXPECT_EQ(cursor, copy); +} + +TEST(WebCursorTest, SerializationCustom) { + CursorInfo info(blink::WebCursorInfo::kTypeCustom); + info.custom_image = CreateTestBitmap(32, 32); + info.hotspot = gfx::Point(10, 20); + info.image_scale_factor = 1.5f; + WebCursor cursor(info); + base::Pickle pickle; + cursor.Serialize(&pickle); + + WebCursor copy; + base::PickleIterator iter(pickle); + ASSERT_TRUE(copy.Deserialize(&pickle, &iter)); + EXPECT_EQ(cursor, copy); +} + +TEST(WebCursorTest, DeserializeBadMessage) { + WebCursor cursor((CursorInfo(blink::WebCursorInfo::kTypeHand))); + WebCursor unmodified_cursor(cursor); + WebCursor invalid_cursor; + + // Serialize a cursor with a small scale; deserialization should fail. + CursorInfo small_scale_info(blink::WebCursorInfo::kTypeCustom); + small_scale_info.image_scale_factor = 0.001f; + invalid_cursor.set_info_for_testing(small_scale_info); + base::Pickle small_scale_pickle; + invalid_cursor.Serialize(&small_scale_pickle); + base::PickleIterator iter = base::PickleIterator(small_scale_pickle); + EXPECT_FALSE(cursor.Deserialize(&small_scale_pickle, &iter)); + EXPECT_EQ(unmodified_cursor, cursor); + + // Serialize a cursor with a big scale; deserialization should fail. + CursorInfo big_scale_info(blink::WebCursorInfo::kTypeCustom); + big_scale_info.image_scale_factor = 1000.f; + invalid_cursor.set_info_for_testing(big_scale_info); + base::Pickle big_scale_pickle; + invalid_cursor.Serialize(&big_scale_pickle); + iter = base::PickleIterator(big_scale_pickle); + EXPECT_FALSE(cursor.Deserialize(&big_scale_pickle, &iter)); + EXPECT_EQ(unmodified_cursor, cursor); + + // Serialize a cursor with a big image; deserialization should fail. + CursorInfo big_image_info(blink::WebCursorInfo::kTypeCustom); + big_image_info.custom_image = CreateTestBitmap(1025, 3); + invalid_cursor.set_info_for_testing(big_image_info); + base::Pickle big_image_pickle; + invalid_cursor.Serialize(&big_image_pickle); + iter = base::PickleIterator(big_image_pickle); + EXPECT_FALSE(cursor.Deserialize(&big_image_pickle, &iter)); + EXPECT_EQ(unmodified_cursor, cursor); } TEST(WebCursorTest, ClampHotspot) { - WebCursor custom_cursor; - // This is a valid custom cursor. - base::Pickle ok_custom_pickle; - // Type and hotspots. - ok_custom_pickle.WriteInt(WebCursorInfo::kTypeCustom); - // Hotspot is invalid --- outside the bounds of the image. - ok_custom_pickle.WriteInt(5); - ok_custom_pickle.WriteInt(5); - // X & Y - ok_custom_pickle.WriteInt(2); - ok_custom_pickle.WriteInt(2); - // Scale - ok_custom_pickle.WriteFloat(1.0); - // Data len including enough data for a 2x2 image. - ok_custom_pickle.WriteInt(4 * 4); - for (size_t i = 0; i < 4; i++) - ok_custom_pickle.WriteUInt32(0); - // Custom Windows message. - ok_custom_pickle.WriteUInt32(0); - base::PickleIterator iter(ok_custom_pickle); - EXPECT_TRUE(custom_cursor.Deserialize(&iter)); + // Initialize a cursor with an invalid hotspot; it should be clamped. + CursorInfo info(blink::WebCursorInfo::kTypeCustom); + info.hotspot = gfx::Point(100, 100); + info.custom_image = CreateTestBitmap(5, 7); + WebCursor cursor(info); + EXPECT_EQ(gfx::Point(4, 6), cursor.info().hotspot); - // Convert to WebCursorInfo, make sure the hotspot got clamped. - CursorInfo info; - custom_cursor.GetCursorInfo(&info); - EXPECT_EQ(gfx::Point(1, 1), info.hotspot); - - // Set hotspot to an invalid point again, pipe back through WebCursor, - // and make sure the hotspot got clamped again. - info.hotspot = gfx::Point(-1, -1); - custom_cursor.InitFromCursorInfo(info); - custom_cursor.GetCursorInfo(&info); - EXPECT_EQ(gfx::Point(0, 0), info.hotspot); -} - -TEST(WebCursorTest, EmptyImage) { - WebCursor custom_cursor; - base::Pickle broken_cursor_pickle; - broken_cursor_pickle.WriteInt(WebCursorInfo::kTypeCustom); - // Hotspot is at origin - broken_cursor_pickle.WriteInt(0); - broken_cursor_pickle.WriteInt(0); - // X & Y are empty - broken_cursor_pickle.WriteInt(0); - broken_cursor_pickle.WriteInt(0); - // Scale - broken_cursor_pickle.WriteFloat(1.0); - // No data for the image since the size is 0. - broken_cursor_pickle.WriteInt(0); - // Custom Windows message. - broken_cursor_pickle.WriteInt(0); - - // Make sure we can read this on all platforms; it is technicaally a valid - // cursor. - base::PickleIterator iter(broken_cursor_pickle); - EXPECT_TRUE(custom_cursor.Deserialize(&iter)); -} - -TEST(WebCursorTest, Scale2) { - WebCursor custom_cursor; - // This is a valid custom cursor. - base::Pickle ok_custom_pickle; - // Type and hotspots. - ok_custom_pickle.WriteInt(WebCursorInfo::kTypeCustom); - ok_custom_pickle.WriteInt(0); - ok_custom_pickle.WriteInt(0); - // X & Y - ok_custom_pickle.WriteInt(1); - ok_custom_pickle.WriteInt(1); - // Scale - 2 image pixels per UI pixel. - ok_custom_pickle.WriteFloat(2.0); - // Data len including enough data for a 1x1 image. - ok_custom_pickle.WriteInt(4); - ok_custom_pickle.WriteUInt32(0); - // Custom Windows message. - ok_custom_pickle.WriteUInt32(0); - base::PickleIterator iter(ok_custom_pickle); - EXPECT_TRUE(custom_cursor.Deserialize(&iter)); -} - -TEST(WebCursorTest, AlphaConversion) { - SkBitmap bitmap; - SkPMColor testColor = SkPreMultiplyARGB(10, 255, 255, 255); - bitmap.allocN32Pixels(1,1); - *bitmap.getAddr32(0, 0) = testColor; - CursorInfo cursor_info; - cursor_info.type = WebCursorInfo::kTypeCustom; - cursor_info.custom_image = bitmap; - cursor_info.image_scale_factor = 1; - WebCursor custom_cursor; - - // This round trip will convert the cursor to unpremultiplied form. - custom_cursor.InitFromCursorInfo(cursor_info); - custom_cursor.GetCursorInfo(&cursor_info); - EXPECT_EQ(kUnpremul_SkAlphaType, cursor_info.custom_image.alphaType()); - EXPECT_EQ(testColor, - SkPreMultiplyColor(*cursor_info.custom_image.getAddr32(0, 0))); - - // Second round trip should not do any conversion because data is already - // unpremultiplied. - custom_cursor.InitFromCursorInfo(cursor_info); - custom_cursor.GetCursorInfo(&cursor_info); - EXPECT_EQ(kUnpremul_SkAlphaType, cursor_info.custom_image.alphaType()); - EXPECT_EQ(testColor, - SkPreMultiplyColor(*cursor_info.custom_image.getAddr32(0, 0))); - -#if defined(OS_MACOSX) - // On MacOS, test roundtrip through NSCursor conversion. - WebCursor custom_cursor_copy; - custom_cursor_copy.InitFromNSCursor(custom_cursor.GetNativeCursor()); - custom_cursor_copy.GetCursorInfo(&cursor_info); - EXPECT_EQ(kUnpremul_SkAlphaType, cursor_info.custom_image.alphaType()); - EXPECT_EQ(testColor, - SkPreMultiplyColor(*cursor_info.custom_image.getAddr32(0, 0))); -#endif + // Serialize a cursor with an invalid hotspot; it should be clamped. + cursor.set_info_for_testing(info); + base::Pickle pickle; + cursor.Serialize(&pickle); + base::PickleIterator iter = base::PickleIterator(pickle); + EXPECT_TRUE(cursor.Deserialize(&pickle, &iter)); + EXPECT_EQ(gfx::Point(4, 6), cursor.info().hotspot); } #if defined(USE_AURA) TEST(WebCursorTest, CursorScaleFactor) { - display::Display display; - display.set_device_scale_factor(4.2f); - CursorInfo info; - info.type = WebCursorInfo::kTypeCustom; + info.type = blink::WebCursorInfo::kTypeCustom; info.hotspot = gfx::Point(0, 1); info.image_scale_factor = 2.0f; + info.custom_image = CreateTestBitmap(128, 128); + WebCursor cursor(info); - SkImageInfo image_info = - SkImageInfo::MakeN32(128, 128, kUnpremul_SkAlphaType); - info.custom_image = SkBitmap(); - info.custom_image.setInfo(image_info); - info.custom_image.allocN32Pixels(128, 128); - info.custom_image.eraseColor(0xFFFFFFFF); - - WebCursor cursor; - cursor.InitFromCursorInfo(info); + display::Display display; + display.set_device_scale_factor(4.2f); cursor.SetDisplayInfo(display); #if defined(USE_OZONE) @@ -285,73 +166,51 @@ #endif // Test that the Display dsf is copied. - WebCursor cursor2 = cursor; + WebCursor copy(cursor); EXPECT_EQ(cursor.GetNativeCursor().device_scale_factor(), - cursor2.GetNativeCursor().device_scale_factor()); + copy.GetNativeCursor().device_scale_factor()); } TEST(WebCursorTest, UnscaledImageCopy) { CursorInfo info; - info.type = WebCursorInfo::kTypeCustom; + info.type = blink::WebCursorInfo::kTypeCustom; info.hotspot = gfx::Point(0, 1); + info.custom_image = CreateTestBitmap(2, 2); + WebCursor cursor(info); - SkImageInfo image_info = SkImageInfo::MakeN32(2, 2, kUnpremul_SkAlphaType); - info.custom_image = SkBitmap(); - info.custom_image.setInfo(image_info); - info.custom_image.allocN32Pixels(2, 2); - info.custom_image.eraseColor(0xFFFFFFFF); - - WebCursor cursor; - cursor.InitFromCursorInfo(info); - - SkBitmap image_copy; + SkBitmap copy; gfx::Point hotspot; - float dsf; - cursor.CreateScaledBitmapAndHotspotFromCustomData(&image_copy, &hotspot, - &dsf); - EXPECT_EQ(1.0f, dsf); - - EXPECT_EQ(kBGRA_8888_SkColorType, image_copy.colorType()); - EXPECT_EQ(kUnpremul_SkAlphaType, image_copy.alphaType()); - EXPECT_EQ(2, image_copy.width()); - EXPECT_EQ(2, image_copy.height()); + float dsf = 0.f; + cursor.CreateScaledBitmapAndHotspotFromCustomData(©, &hotspot, &dsf); + EXPECT_EQ(1.f, dsf); + EXPECT_EQ(2, copy.width()); + EXPECT_EQ(2, copy.height()); EXPECT_EQ(0, hotspot.x()); EXPECT_EQ(1, hotspot.y()); } #endif #if defined(OS_WIN) -namespace { - -void ScaleCursor(float scale_factor, int hotspot_x, int hotspot_y) { - display::Display display; - display.set_device_scale_factor(scale_factor); - +void ScaleCursor(float scale, int hotspot_x, int hotspot_y) { CursorInfo info; - info.type = WebCursorInfo::kTypeCustom; + info.type = blink::WebCursorInfo::kTypeCustom; info.hotspot = gfx::Point(hotspot_x, hotspot_y); + info.custom_image = CreateTestBitmap(10, 10); + WebCursor cursor(info); - info.custom_image = SkBitmap(); - info.custom_image.allocN32Pixels(10, 10); - info.custom_image.eraseColor(0); - - WebCursor cursor; + display::Display display; + display.set_device_scale_factor(scale); cursor.SetDisplayInfo(display); - cursor.InitFromCursorInfo(info); HCURSOR windows_cursor_handle = cursor.GetNativeCursor().platform(); EXPECT_NE(nullptr, windows_cursor_handle); ICONINFO windows_icon_info; EXPECT_TRUE(GetIconInfo(windows_cursor_handle, &windows_icon_info)); EXPECT_FALSE(windows_icon_info.fIcon); - EXPECT_EQ(static_cast<DWORD>(scale_factor * hotspot_x), - windows_icon_info.xHotspot); - EXPECT_EQ(static_cast<DWORD>(scale_factor * hotspot_y), - windows_icon_info.yHotspot); + EXPECT_EQ(static_cast<DWORD>(scale * hotspot_x), windows_icon_info.xHotspot); + EXPECT_EQ(static_cast<DWORD>(scale * hotspot_y), windows_icon_info.yHotspot); } -} // namespace - TEST(WebCursorTest, WindowsCursorScaledAtHiDpi) { ScaleCursor(2.0f, 4, 6); ScaleCursor(1.5f, 2, 8); @@ -359,4 +218,5 @@ } #endif +} // namespace } // namespace content
diff --git a/content/public/android/java/strings/translations/android_content_strings_hi.xtb b/content/public/android/java/strings/translations/android_content_strings_hi.xtb index 35a8fba1..ac01186 100644 --- a/content/public/android/java/strings/translations/android_content_strings_hi.xtb +++ b/content/public/android/java/strings/translations/android_content_strings_hi.xtb
@@ -15,12 +15,12 @@ <translation id="4247305538398689241">सप्ताह सेट करें</translation> <translation id="4768459022382175196">सेकंड</translation> <translation id="4859501799452851758">प्रोफ़ाइलर पूर्ण. परिणाम <ph name="FILENAME" /> में हैं.</translation> -<translation id="4932733599132424254">दिनांक</translation> +<translation id="4932733599132424254">तारीख</translation> <translation id="5659744962989939577">शब्दकोश में जोड़ें</translation> <translation id="5789643057113097023">.</translation> <translation id="5966707198760109579">सप्ताह</translation> <translation id="6015796118275082299">वर्ष</translation> -<translation id="6444070574980481588">दिनांक और समय सेट करें</translation> +<translation id="6444070574980481588">तारीख और समय सेट करें</translation> <translation id="6527303717912515753">शेयर करें</translation> <translation id="6643016212128521049">साफ़ करें</translation> <translation id="6727102863431372879">सेट करें</translation> @@ -29,7 +29,7 @@ <translation id="7138678301420049075">अन्य</translation> <translation id="7575803462290353686">समय सेट करें</translation> <translation id="7781164152564914424">माह सेट करें</translation> -<translation id="7821540960913969614">दिनांक सेट करें</translation> +<translation id="7821540960913969614">तारीख सेट करें</translation> <translation id="8261506727792406068">हटाएं</translation> <translation id="8987927404178983737">माह</translation> </translationbundle> \ No newline at end of file
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn index 3ac0aa0..da96b06 100644 --- a/content/public/common/BUILD.gn +++ b/content/public/common/BUILD.gn
@@ -139,6 +139,7 @@ "content_switches.h", "context_menu_params.cc", "context_menu_params.h", + "cursor_info.cc", "cursor_info.h", "drop_data.cc", "drop_data.h",
diff --git a/content/public/common/cursor_info.cc b/content/public/common/cursor_info.cc new file mode 100644 index 0000000..e4e1aff --- /dev/null +++ b/content/public/common/cursor_info.cc
@@ -0,0 +1,36 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/public/common/cursor_info.h" + +#include "ui/gfx/skia_util.h" + +namespace content { + +CursorInfo::CursorInfo(blink::WebCursorInfo::Type cursor) : type(cursor) {} + +CursorInfo::CursorInfo(const blink::WebCursorInfo& info) + : type(info.type), + custom_image(info.custom_image), + hotspot(info.hot_spot), + image_scale_factor(info.image_scale_factor) {} + +bool CursorInfo::operator==(const CursorInfo& other) const { + return type == other.type && hotspot == other.hotspot && + image_scale_factor == other.image_scale_factor && + (custom_image.getGenerationID() == + other.custom_image.getGenerationID() || + gfx::BitmapsAreEqual(custom_image, other.custom_image)); +} + +blink::WebCursorInfo CursorInfo::GetWebCursorInfo() const { + blink::WebCursorInfo info; + info.type = type; + info.hot_spot = hotspot; + info.custom_image = custom_image; + info.image_scale_factor = image_scale_factor; + return info; +} + +} // namespace content
diff --git a/content/public/common/cursor_info.h b/content/public/common/cursor_info.h index eb05468..963fff2 100644 --- a/content/public/common/cursor_info.h +++ b/content/public/common/cursor_info.h
@@ -1,11 +1,10 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_PUBLIC_COMMON_CURSOR_INFO_H_ #define CONTENT_PUBLIC_COMMON_CURSOR_INFO_H_ -#include "build/build_config.h" #include "content/common/content_export.h" #include "third_party/blink/public/platform/web_cursor_info.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -14,15 +13,20 @@ // This struct represents the data sufficient to create a cross-platform cursor: // either a predefined cursor type (from WebCursorInfo) or custom image. +// This structure is highly similar to blink::WebCursorInfo. struct CONTENT_EXPORT CursorInfo { - explicit CursorInfo(blink::WebCursorInfo::Type cursor_type) - : type(cursor_type), image_scale_factor(1) {} + CursorInfo() = default; + explicit CursorInfo(blink::WebCursorInfo::Type cursor); + explicit CursorInfo(const blink::WebCursorInfo& info); - CursorInfo() - : type(blink::WebCursorInfo::kTypePointer), image_scale_factor(1) {} + // Equality operator; performs bitmap content comparison as needed. + bool operator==(const CursorInfo& other) const; + + // Get a blink::WebCursorInfo struct with fields matching this struct. + blink::WebCursorInfo GetWebCursorInfo() const; // One of the predefined cursors. - blink::WebCursorInfo::Type type; + blink::WebCursorInfo::Type type = blink::WebCursorInfo::kTypePointer; // Custom cursor image. SkBitmap custom_image; @@ -32,7 +36,7 @@ // The scale factor of custom image, used to possibly re-scale the image // for a different density display. - float image_scale_factor; + float image_scale_factor = 1.f; }; } // namespace content
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index d74bbd0..f2cbdbc7 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -71,8 +71,6 @@ "context_menu_params_builder.h", "crash_helpers.cc", "crash_helpers.h", - "cursor_utils.cc", - "cursor_utils.h", "dom_automation_controller.cc", "dom_automation_controller.h", "dom_storage/dom_storage_cached_area.cc", @@ -540,6 +538,8 @@ "web_ui_extension_data.h", "webgraphicscontext3d_provider_impl.cc", "webgraphicscontext3d_provider_impl.h", + "worker/application_cache_host_for_shared_worker.cc", + "worker/application_cache_host_for_shared_worker.h", "worker/dedicated_worker_host_factory_client.cc", "worker/dedicated_worker_host_factory_client.h", "worker/embedded_shared_worker_stub.cc",
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc index 2951268..c971e336 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -681,6 +681,11 @@ dst->SetCheckedState(src.CheckedState()); } + if (dst->role == ax::mojom::Role::kListItem && + src.GetListStyle() != ax::mojom::ListStyle::kNone) { + dst->SetListStyle(src.GetListStyle()); + } + if (src.GetTextDirection() != ax::mojom::TextDirection::kNone) { dst->SetTextDirection(src.GetTextDirection()); }
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index e7705ff3..5e38e8c 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -33,7 +33,6 @@ #include "content/renderer/accessibility/render_accessibility_impl.h" #include "content/renderer/browser_plugin/browser_plugin_manager.h" #include "content/renderer/child_frame_compositing_helper.h" -#include "content/renderer/cursor_utils.h" #include "content/renderer/drop_data_builder.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/sad_plugin.h" @@ -684,7 +683,7 @@ BrowserPluginManager::Get()->Send( new BrowserPluginHostMsg_HandleInputEvent(browser_plugin_instance_id_, &event)); - GetWebCursorInfo(cursor_, &cursor_info); + cursor_info = cursor_.info().GetWebCursorInfo(); // Although we forward this event to the guest, we don't report it as consumed // since other targets of this event in Blink never get that chance either.
diff --git a/content/renderer/cursor_utils.cc b/content/renderer/cursor_utils.cc deleted file mode 100644 index 523fd53..0000000 --- a/content/renderer/cursor_utils.cc +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2013 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/renderer/cursor_utils.h" - -#include "build/build_config.h" -#include "content/common/cursors/webcursor.h" -#include "third_party/blink/public/platform/web_cursor_info.h" - -using blink::WebCursorInfo; - -namespace content { - -bool GetWebCursorInfo(const WebCursor& cursor, - WebCursorInfo* web_cursor_info) { - CursorInfo cursor_info; - cursor.GetCursorInfo(&cursor_info); - - web_cursor_info->type = cursor_info.type; - web_cursor_info->hot_spot = cursor_info.hotspot; - web_cursor_info->custom_image = cursor_info.custom_image; - web_cursor_info->image_scale_factor = cursor_info.image_scale_factor; - return true; -} - -void InitializeCursorFromWebCursorInfo(WebCursor* cursor, - const WebCursorInfo& web_cursor_info) { - CursorInfo cursor_info; - cursor_info.type = web_cursor_info.type; - cursor_info.image_scale_factor = web_cursor_info.image_scale_factor; - cursor_info.hotspot = web_cursor_info.hot_spot; - cursor_info.custom_image = web_cursor_info.custom_image; - cursor->InitFromCursorInfo(cursor_info); -} - -} // namespce content
diff --git a/content/renderer/cursor_utils.h b/content/renderer/cursor_utils.h deleted file mode 100644 index 595e49a..0000000 --- a/content/renderer/cursor_utils.h +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2013 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 CONTENT_RENDERER_CURSOR_UTILS_H_ -#define CONTENT_RENDERER_CURSOR_UTILS_H_ - -class WebCursor; - -namespace blink { -struct WebCursorInfo; -} - -namespace content { - -// Adapts our cursor info to blink::WebCursorInfo. -bool GetWebCursorInfo(const WebCursor& cursor, - blink::WebCursorInfo* web_cursor_info); - -// Adapts blink::WebCursorInfo to our cursor. -void InitializeCursorFromWebCursorInfo( - WebCursor* cursor, - const blink::WebCursorInfo& web_cursor_info); - -} // namespace content - -#endif // CONTENT_RENDERER_CURSOR_UTILS_H_
diff --git a/content/renderer/input/render_widget_input_handler.cc b/content/renderer/input/render_widget_input_handler.cc index e192902..14d7baee 100644 --- a/content/renderer/input/render_widget_input_handler.cc +++ b/content/renderer/input/render_widget_input_handler.cc
@@ -504,11 +504,10 @@ } bool RenderWidgetInputHandler::DidChangeCursor(const WebCursor& cursor) { - if (!current_cursor_ || !current_cursor_->IsEqual(cursor)) { - current_cursor_ = cursor; - return true; - } - return false; + if (current_cursor_.has_value() && current_cursor_.value() == cursor) + return false; + current_cursor_ = cursor; + return true; } bool RenderWidgetInputHandler::ProcessTouchAction(
diff --git a/content/renderer/installedapp/related_apps_fetcher.cc b/content/renderer/installedapp/related_apps_fetcher.cc index 11d50f8..ff62e93 100644 --- a/content/renderer/installedapp/related_apps_fetcher.cc +++ b/content/renderer/installedapp/related_apps_fetcher.cc
@@ -20,18 +20,14 @@ RelatedAppsFetcher::~RelatedAppsFetcher() {} void RelatedAppsFetcher::GetManifestRelatedApplications( - std::unique_ptr<blink::WebCallbacks< - const blink::WebVector<blink::WebRelatedApplication>&, - void>> callbacks) { + blink::GetManifestRelatedApplicationsCallback completion_callback) { manifest_manager_->RequestManifest( base::BindOnce(&RelatedAppsFetcher::OnGetManifestForRelatedApplications, - base::Unretained(this), std::move(callbacks))); + base::Unretained(this), std::move(completion_callback))); } void RelatedAppsFetcher::OnGetManifestForRelatedApplications( - std::unique_ptr<blink::WebCallbacks< - const blink::WebVector<blink::WebRelatedApplication>&, - void>> callbacks, + blink::GetManifestRelatedApplicationsCallback completion_callback, const GURL& /*url*/, const blink::Manifest& manifest) { std::vector<blink::WebRelatedApplication> related_apps; @@ -47,7 +43,7 @@ } related_apps.push_back(std::move(webRelatedApplication)); } - callbacks->OnSuccess(std::move(related_apps)); + std::move(completion_callback).Run(std::move(related_apps)); } } // namespace content
diff --git a/content/renderer/installedapp/related_apps_fetcher.h b/content/renderer/installedapp/related_apps_fetcher.h index 0f50aaa..186491a 100644 --- a/content/renderer/installedapp/related_apps_fetcher.h +++ b/content/renderer/installedapp/related_apps_fetcher.h
@@ -29,17 +29,14 @@ // blink::WebRelatedAppsFetcher overrides: void GetManifestRelatedApplications( - std::unique_ptr<blink::WebCallbacks< - const blink::WebVector<blink::WebRelatedApplication>&, - void>> callbacks) override; + blink::GetManifestRelatedApplicationsCallback completion_callback) + override; private: // Callback for when the manifest has been fetched, triggered by a call to // getManifestRelatedApplications. void OnGetManifestForRelatedApplications( - std::unique_ptr<blink::WebCallbacks< - const blink::WebVector<blink::WebRelatedApplication>&, - void>> callbacks, + blink::GetManifestRelatedApplicationsCallback completion_callback, const GURL& url, const blink::Manifest& manifest);
diff --git a/content/renderer/loader/navigation_body_loader.cc b/content/renderer/loader/navigation_body_loader.cc index 13fbd54..66c8f934 100644 --- a/content/renderer/loader/navigation_body_loader.cc +++ b/content/renderer/loader/navigation_body_loader.cc
@@ -140,6 +140,7 @@ void NavigationBodyLoader::OnStartLoadingResponseBody( mojo::ScopedDataPipeConsumerHandle handle) { DCHECK(!has_received_body_handle_); + DCHECK(!has_received_completion_); has_received_body_handle_ = true; has_seen_end_of_data_ = false; handle_ = std::move(handle);
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc index 9d9ac56a..ca4338f 100644 --- a/content/renderer/media/media_factory.cc +++ b/content/renderer/media/media_factory.cc
@@ -430,7 +430,6 @@ // MediaPlayerRendererClientFactory setup. auto mojo_media_player_renderer_factory = std::make_unique<media::MojoRendererFactory>( - media::MojoRendererFactory::GetGpuFactoriesCB(), GetMediaInterfaceFactory()); // Always give |factory_selector| a MediaPlayerRendererClient factory. WMPI @@ -449,7 +448,6 @@ // FlingingRendererClientFactory (FRCF) setup. auto mojo_flinging_factory = std::make_unique<media::MojoRendererFactory>( - media::MojoRendererFactory::GetGpuFactoriesCB(), GetMediaInterfaceFactory()); auto flinging_factory = std::make_unique<FlingingRendererClientFactory>( @@ -471,8 +469,6 @@ use_mojo_renderer_factory = enable_mojo_renderer; if (use_mojo_renderer_factory) { auto mojo_renderer_factory = std::make_unique<media::MojoRendererFactory>( - base::Bind(&RenderThreadImpl::GetGpuFactories, - base::Unretained(render_thread)), GetMediaInterfaceFactory()); // The "default" MojoRendererFactory can be wrapped by a
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 1755b34..970bdf4 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -56,7 +56,6 @@ #include "content/public/renderer/render_thread.h" #include "content/renderer/browser_plugin/browser_plugin.h" #include "content/renderer/compositor/layer_tree_view.h" -#include "content/renderer/cursor_utils.h" #include "content/renderer/drop_data_builder.h" #include "content/renderer/external_popup_menu.h" #include "content/renderer/frame_swap_message_queue.h" @@ -1712,8 +1711,7 @@ void RenderWidget::DidChangeCursor(const WebCursorInfo& cursor_info) { // TODO(darin): Eliminate this temporary. - WebCursor cursor; - InitializeCursorFromWebCursorInfo(&cursor, cursor_info); + WebCursor cursor((CursorInfo(cursor_info))); // Only send a SetCursor message if we need to make a change. if (input_handler_->DidChangeCursor(cursor)) Send(new WidgetHostMsg_SetCursor(routing_id_, cursor));
diff --git a/content/renderer/worker/application_cache_host_for_shared_worker.cc b/content/renderer/worker/application_cache_host_for_shared_worker.cc new file mode 100644 index 0000000..2241b19a --- /dev/null +++ b/content/renderer/worker/application_cache_host_for_shared_worker.cc
@@ -0,0 +1,43 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/renderer/worker/application_cache_host_for_shared_worker.h" + +namespace content { + +ApplicationCacheHostForSharedWorker::ApplicationCacheHostForSharedWorker( + blink::WebApplicationCacheHostClient* client, + int appcache_host_id, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) + : WebApplicationCacheHostImpl(client, + appcache_host_id, + MSG_ROUTING_NONE, + std::move(task_runner)) {} + +ApplicationCacheHostForSharedWorker::~ApplicationCacheHostForSharedWorker() = + default; + +void ApplicationCacheHostForSharedWorker::WillStartMainResourceRequest( + const blink::WebURL& url, + const blink::WebString& method, + const WebApplicationCacheHost* spawning_host) {} + +void ApplicationCacheHostForSharedWorker::DidReceiveResponseForMainResource( + const blink::WebURLResponse&) {} + +void ApplicationCacheHostForSharedWorker::SelectCacheWithoutManifest() {} + +bool ApplicationCacheHostForSharedWorker::SelectCacheWithManifest( + const blink::WebURL& manifestURL) { + return true; +} + +void ApplicationCacheHostForSharedWorker::LogMessage( + blink::mojom::ConsoleMessageLevel log_level, + const std::string& message) {} + +void ApplicationCacheHostForSharedWorker::SetSubresourceFactory( + network::mojom::URLLoaderFactoryPtr url_loader_factory) {} + +} // namespace content
diff --git a/content/renderer/worker/application_cache_host_for_shared_worker.h b/content/renderer/worker/application_cache_host_for_shared_worker.h new file mode 100644 index 0000000..19ba4790 --- /dev/null +++ b/content/renderer/worker/application_cache_host_for_shared_worker.h
@@ -0,0 +1,45 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_RENDERER_WORKER_APPLICATION_CACHE_HOST_FOR_SHARED_WORKER_H_ +#define CONTENT_RENDERER_WORKER_APPLICATION_CACHE_HOST_FOR_SHARED_WORKER_H_ + +#include "content/renderer/appcache/web_application_cache_host_impl.h" + +namespace content { + +class ApplicationCacheHostForSharedWorker final + : public WebApplicationCacheHostImpl { + public: + ApplicationCacheHostForSharedWorker( + blink::WebApplicationCacheHostClient* client, + int appcache_host_id, + scoped_refptr<base::SingleThreadTaskRunner> task_runner); + ~ApplicationCacheHostForSharedWorker() override; + + // Main resource loading is different for workers. The main resource is + // loaded by the worker using WorkerClassicScriptLoader. + // These overrides are stubbed out. + void WillStartMainResourceRequest( + const blink::WebURL& url, + const blink::WebString& method, + const WebApplicationCacheHost* spawning_host) override; + void DidReceiveResponseForMainResource(const blink::WebURLResponse&) override; + + // Cache selection is also different for workers. We know at construction + // time what cache to select and do so then. + // These overrides are stubbed out. + void SelectCacheWithoutManifest() override; + bool SelectCacheWithManifest(const blink::WebURL& manifestURL) override; + + // blink::mojom::AppCacheFrontend: + void LogMessage(blink::mojom::ConsoleMessageLevel log_level, + const std::string& message) override; + void SetSubresourceFactory( + network::mojom::URLLoaderFactoryPtr url_loader_factory) override; +}; + +} // namespace content + +#endif // CONTENT_RENDERER_WORKER_APPLICATION_CACHE_HOST_FOR_SHARED_WORKER_H_
diff --git a/content/renderer/worker/embedded_shared_worker_stub.cc b/content/renderer/worker/embedded_shared_worker_stub.cc index 1114cb2d..6899bc0 100644 --- a/content/renderer/worker/embedded_shared_worker_stub.cc +++ b/content/renderer/worker/embedded_shared_worker_stub.cc
@@ -15,12 +15,12 @@ #include "content/public/common/content_switches.h" #include "content/public/common/network_service_util.h" #include "content/public/common/origin_util.h" -#include "content/renderer/appcache/web_application_cache_host_impl.h" #include "content/renderer/loader/child_url_loader_factory_bundle.h" #include "content/renderer/loader/navigation_response_override_parameters.h" #include "content/renderer/loader/web_worker_fetch_context_impl.h" #include "content/renderer/renderer_blink_platform_impl.h" #include "content/renderer/service_worker/service_worker_provider_context.h" +#include "content/renderer/worker/application_cache_host_for_shared_worker.h" #include "content/renderer/worker/service_worker_network_provider_for_worker.h" #include "ipc/ipc_message_macros.h" #include "services/network/public/cpp/features.h" @@ -44,47 +44,6 @@ namespace content { -namespace { - -class SharedWorkerWebApplicationCacheHostImpl - : public WebApplicationCacheHostImpl { - public: - SharedWorkerWebApplicationCacheHostImpl( - blink::WebApplicationCacheHostClient* client, - int appcache_host_id, - scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : WebApplicationCacheHostImpl(client, - appcache_host_id, - MSG_ROUTING_NONE, - std::move(task_runner)) {} - - // Main resource loading is different for workers. The main resource is - // loaded by the worker using WorkerClassicScriptLoader. - // These overrides are stubbed out. - void WillStartMainResourceRequest( - const blink::WebURL& url, - const blink::WebString& method, - const WebApplicationCacheHost* spawning_host) override {} - void DidReceiveResponseForMainResource( - const blink::WebURLResponse&) override {} - - // Cache selection is also different for workers. We know at construction - // time what cache to select and do so then. - // These overrides are stubbed out. - void SelectCacheWithoutManifest() override {} - bool SelectCacheWithManifest(const blink::WebURL& manifestURL) override { - return true; - } - - // blink::mojom::AppCacheFrontend: - void LogMessage(blink::mojom::ConsoleMessageLevel log_level, - const std::string& message) override {} - void SetSubresourceFactory( - network::mojom::URLLoaderFactoryPtr url_loader_factory) override {} -}; - -} // namespace - EmbeddedSharedWorkerStub::EmbeddedSharedWorkerStub( blink::mojom::SharedWorkerInfoPtr info, bool pause_on_start, @@ -227,7 +186,7 @@ EmbeddedSharedWorkerStub::CreateApplicationCacheHost( blink::WebApplicationCacheHostClient* client) { std::unique_ptr<WebApplicationCacheHostImpl> host = - std::make_unique<SharedWorkerWebApplicationCacheHostImpl>( + std::make_unique<ApplicationCacheHostForSharedWorker>( client, appcache_host_id_, impl_->GetTaskRunner(blink::TaskType::kNetworking)); app_cache_host_ = host.get();
diff --git a/content/test/data/accessibility/html/list-marker-styles-expected-blink.txt b/content/test/data/accessibility/html/list-marker-styles-expected-blink.txt new file mode 100644 index 0000000..1257c95d --- /dev/null +++ b/content/test/data/accessibility/html/list-marker-styles-expected-blink.txt
@@ -0,0 +1,45 @@ +rootWebArea +++list +++++listItem +++++++staticText name='none' +++++++++inlineTextBox name='none' +++list +++++listItem listStyle=circle +++++++listMarker name='◦ ' +++++++staticText name='circle' +++++++++inlineTextBox name='circle' +++list +++++listItem listStyle=disc +++++++listMarker name='• ' +++++++staticText name='disc' +++++++++inlineTextBox name='disc' +++list +++++listItem listStyle=image +++++++listMarker name=' ' +++++++staticText name='image' +++++++++inlineTextBox name='image' +++list +++++listItem listStyle=square +++++++listMarker name='■ ' +++++++staticText name='square' +++++++++inlineTextBox name='square' +++list +++++listItem listStyle=numeric +++++++listMarker name='1. ' +++++++staticText name='decimal' +++++++++inlineTextBox name='decimal' +++list +++++listItem listStyle=other +++++++listMarker name='I. ' +++++++staticText name='upper-roman' +++++++++inlineTextBox name='upper-roman' +++list +++++listItem listStyle=other +++++++listMarker name='Ա. ' +++++++staticText name='armenian' +++++++++inlineTextBox name='armenian' +++list +++++listItem listStyle=other +++++++listMarker name='a. ' +++++++staticText name='lower-alpha' +++++++++inlineTextBox name='lower-alpha'
diff --git a/content/test/data/accessibility/html/list-marker-styles.html b/content/test/data/accessibility/html/list-marker-styles.html new file mode 100644 index 0000000..4f1b36a --- /dev/null +++ b/content/test/data/accessibility/html/list-marker-styles.html
@@ -0,0 +1,34 @@ +<!-- +@BLINK-ALLOW:listStyle* +--> +<html> + <body> + <ul style="list-style-type: none"> + <li>none</li> + </ul> + <ul style="list-style-type: circle"> + <li>circle</li> + </ul> + <ul style="list-style-type: disc"> + <li>disc</li> + </ul> + <ul style="list-style-image: url('bullet.png')"> + <li>image</li> + </ul> + <ul style="list-style-type: square"> + <li>square</li> + </ul> + <ul style="list-style-type: decimal"> + <li>decimal</li> + </ul> + <ul style="list-style-type: upper-roman"> + <li>upper-roman</li> + </ul> + <ul style="list-style-type: armenian"> + <li>armenian</li> + </ul> + <ul style="list-style-type: lower-alpha"> + <li>lower-alpha</li> + </ul> + </body> +</html>
diff --git a/content/test/data/sxg/badmice_test.html b/content/test/data/sxg/badmice_test.html new file mode 100644 index 0000000..e28f6c0 --- /dev/null +++ b/content/test/data/sxg/badmice_test.html
@@ -0,0 +1,6746 @@ +<!DOCTYPE html> +<title>Bad MICE test</title> +<body> +dummydata_to_flush_mice_chunk +<script> +window.reached_end = false; +setTimeout(() => { + document.title = `Reached End: ${window.reached_end}`; +}, 100); +</script> +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ +___dummy data to fill 64kB buffer___ ___dummy data to fill 64kB buffer___ + +_dummydata_to_flush_mice_chunk_ +XXX +_dummydata_to_flush_mice_chunk_ +<script> +window.reached_end = true; +</script> +</body>
diff --git a/content/test/data/sxg/generate-test-sxgs.sh b/content/test/data/sxg/generate-test-sxgs.sh index 21d31d5b..e6823f9 100755 --- a/content/test/data/sxg/generate-test-sxgs.sh +++ b/content/test/data/sxg/generate-test-sxgs.sh
@@ -71,6 +71,24 @@ sed 's/a44664/a54664/' | xxd -r -p > test.example.org_test_invalid_cbor_header.sxg +# Generate the signed exchange file with bad MICE integrity. +gen-signedexchange \ + -version 1b3 \ + -uri https://test.example.org/test/ \ + -status 200 \ + -content badmice_test.html \ + -certificate prime256v1-sha256.public.pem \ + -certUrl https://cert.example.org/cert.msg \ + -validityUrl https://test.example.org/resource.validity.msg \ + -privateKey prime256v1.key \ + -date 2018-03-12T05:53:20Z \ + -o - \ + -miRecordSize 32 | + xxd -p | + tr -d '\n' | + sed 's/585858/4f4f4f/' | + xxd -r -p > test.example.org_test_bad_mice.sxg + # Generate the signed exchange file with noext certificate gen-signedexchange \ -version 1b3 \
diff --git a/content/test/data/sxg/test.example.org_test_bad_mice.sxg b/content/test/data/sxg/test.example.org_test_bad_mice.sxg new file mode 100644 index 0000000..44118063 --- /dev/null +++ b/content/test/data/sxg/test.example.org_test_bad_mice.sxg Binary files differ
diff --git a/content/test/data/sxg/test.example.org_test_bad_mice.sxg.mock-http-headers b/content/test/data/sxg/test.example.org_test_bad_mice.sxg.mock-http-headers new file mode 100644 index 0000000..5833ecf6 --- /dev/null +++ b/content/test/data/sxg/test.example.org_test_bad_mice.sxg.mock-http-headers
@@ -0,0 +1,3 @@ +HTTP/1.1 200 OK +Content-Type: application/signed-exchange;v=b3 +X-Content-Type-Options: nosniff
diff --git a/docs/documentation_best_practices.md b/docs/documentation_best_practices.md index 4e4df45..623e18b 100644 --- a/docs/documentation_best_practices.md +++ b/docs/documentation_best_practices.md
@@ -1,7 +1,7 @@ # Documentation Best Practices -"Say what you mean, simply and directly." - [Brian Kernighan] -(http://en.wikipedia.org/wiki/The_Elements_of_Programming_Style) +"Say what you mean, simply and directly." - +[Brian Kernighan](http://en.wikipedia.org/wiki/The_Elements_of_Programming_Style) [TOC] @@ -43,7 +43,7 @@ Documentation is an art. There is no perfect document, there are only proven methods and prudent guidelines. See -go/g3doc-style#good. +[Better is better than perfect](https://github.com/google/styleguide/blob/gh-pages/docguide/philosophy.md#better-is-better-than-perfect). ## Documentation is the story of your code
diff --git a/extensions/browser/api/management/management_api.cc b/extensions/browser/api/management/management_api.cc index 0a131a33..5026753 100644 --- a/extensions/browser/api/management/management_api.cc +++ b/extensions/browser/api/management/management_api.cc
@@ -40,10 +40,13 @@ #include "extensions/common/manifest_handlers/icons_handler.h" #include "extensions/common/manifest_handlers/offline_enabled_info.h" #include "extensions/common/manifest_handlers/options_page_info.h" +#include "extensions/common/manifest_handlers/replacement_web_app.h" #include "extensions/common/manifest_url_handlers.h" #include "extensions/common/permissions/permission_message.h" #include "extensions/common/permissions/permissions_data.h" #include "extensions/common/url_pattern.h" +#include "url/gurl.h" +#include "url/url_constants.h" using content::BrowserThread; @@ -756,11 +759,9 @@ return RespondNow(NoArguments()); } -ManagementGenerateAppForLinkFunction::ManagementGenerateAppForLinkFunction() { -} +ManagementGenerateAppForLinkFunction::ManagementGenerateAppForLinkFunction() {} -ManagementGenerateAppForLinkFunction::~ManagementGenerateAppForLinkFunction() { -} +ManagementGenerateAppForLinkFunction::~ManagementGenerateAppForLinkFunction() {} void ManagementGenerateAppForLinkFunction::FinishCreateWebApp( const std::string& web_app_id, @@ -812,10 +813,52 @@ ->GenerateAppForLinkFunctionDelegate(this, browser_context(), params->title, launch_url); - // Matched with a Release() in FinishCreateBookmarkApp(). + // Matched with a Release() in FinishCreateWebApp(). AddRef(); - // Response is sent async in FinishCreateBookmarkApp(). + // Response is sent async in FinishCreateWebApp(). + return RespondLater(); +} + +ManagementInstallReplacementWebAppFunction:: + ManagementInstallReplacementWebAppFunction() {} + +ManagementInstallReplacementWebAppFunction:: + ~ManagementInstallReplacementWebAppFunction() {} + +ExtensionFunction::ResponseAction +ManagementInstallReplacementWebAppFunction::Run() { + if (ExtensionsBrowserClient::Get()->IsRunningInForcedAppMode()) + return RespondNow(Error(keys::kNotAllowedInKioskError)); + + if (!user_gesture()) { + return RespondNow( + Error(keys::kGestureNeededForInstallReplacementWebAppError)); + } + + DCHECK(ReplacementWebAppInfo::HasReplacementWebApp(extension())); + const GURL& web_app_url = + ReplacementWebAppInfo::GetReplacementWebApp(extension()); + + DCHECK(web_app_url.is_valid()); + DCHECK(web_app_url.SchemeIs(url::kHttpsScheme)); + + auto* api_delegate = ManagementAPI::GetFactoryInstance() + ->Get(browser_context()) + ->GetDelegate(); + if (api_delegate->IsWebAppInstalled(browser_context(), web_app_url)) { + return RespondNow( + Error(keys::kInstallReplacementWebAppAlreadyInstalledError)); + } + + // Adds a ref-count. + api_delegate->InstallReplacementWebApp( + browser_context(), web_app_url, + base::BindOnce( + &ManagementInstallReplacementWebAppFunction::FinishCreateWebApp, + this)); + + // Response is sent async in FinishCreateWebApp(). return RespondLater(); } @@ -827,6 +870,22 @@ ManagementEventRouter::~ManagementEventRouter() { } +void ManagementInstallReplacementWebAppFunction::FinishCreateWebApp( + ManagementAPIDelegate::InstallWebAppResult result) { + ResponseValue response; + switch (result) { + case ManagementAPIDelegate::InstallWebAppResult::kSuccess: + response = NoArguments(); + break; + case ManagementAPIDelegate::InstallWebAppResult::kInvalidWebApp: + response = Error(keys::kInstallReplacementWebAppInvalidWebAppError); + break; + case ManagementAPIDelegate::InstallWebAppResult::kUnknownError: + response = Error(keys::kGenerateAppForLinkInstallError); + } + Respond(std::move(response)); +} + void ManagementEventRouter::OnExtensionLoaded( content::BrowserContext* browser_context, const Extension* extension) {
diff --git a/extensions/browser/api/management/management_api.h b/extensions/browser/api/management/management_api.h index c57897b..caa6296 100644 --- a/extensions/browser/api/management/management_api.h +++ b/extensions/browser/api/management/management_api.h
@@ -215,6 +215,23 @@ std::unique_ptr<AppForLinkDelegate> app_for_link_delegate_; }; +class ManagementInstallReplacementWebAppFunction + : public UIThreadExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("management.installReplacementWebApp", + MANAGEMENT_INSTALLREPLACEMENTWEBAPP) + + ManagementInstallReplacementWebAppFunction(); + + protected: + ~ManagementInstallReplacementWebAppFunction() override; + + ResponseAction Run() override; + + private: + void FinishCreateWebApp(ManagementAPIDelegate::InstallWebAppResult result); +}; + class ManagementEventRouter : public ExtensionRegistryObserver { public: explicit ManagementEventRouter(content::BrowserContext* context);
diff --git a/extensions/browser/api/management/management_api_constants.cc b/extensions/browser/api/management/management_api_constants.cc index c062cda..1108e4c 100644 --- a/extensions/browser/api/management/management_api_constants.cc +++ b/extensions/browser/api/management/management_api_constants.cc
@@ -47,5 +47,11 @@ const char kNotAllowedInKioskError[] = "Not allowed in kiosk."; const char kCannotChangePrimaryKioskAppError[] = "Cannot change the primary kiosk app state."; +const char kInstallReplacementWebAppAlreadyInstalledError[] = + "Web app is already installed."; +const char kInstallReplacementWebAppInvalidWebAppError[] = + "Web app is not a valid installable web app."; +const char kGestureNeededForInstallReplacementWebAppError[] = + "chrome.management.installWebApp requires a user gesture."; } // namespace extension_management_api_constants
diff --git a/extensions/browser/api/management/management_api_constants.h b/extensions/browser/api/management/management_api_constants.h index cf72e07..ce767cae 100644 --- a/extensions/browser/api/management/management_api_constants.h +++ b/extensions/browser/api/management/management_api_constants.h
@@ -36,6 +36,9 @@ extern const char kGenerateAppForLinkInstallError[]; extern const char kNotAllowedInKioskError[]; extern const char kCannotChangePrimaryKioskAppError[]; +extern const char kInstallReplacementWebAppAlreadyInstalledError[]; +extern const char kInstallReplacementWebAppInvalidWebAppError[]; +extern const char kGestureNeededForInstallReplacementWebAppError[]; } // namespace extension_management_api_constants
diff --git a/extensions/browser/api/management/management_api_delegate.h b/extensions/browser/api/management/management_api_delegate.h index 3136455..3da5c62 100644 --- a/extensions/browser/api/management/management_api_delegate.h +++ b/extensions/browser/api/management/management_api_delegate.h
@@ -49,6 +49,9 @@ public: virtual ~ManagementAPIDelegate() {} + enum class InstallWebAppResult { kSuccess, kInvalidWebApp, kUnknownError }; + typedef base::OnceCallback<void(InstallWebAppResult)> InstallWebAppCallback; + // Launches the app |extension|. virtual void LaunchAppFunctionDelegate( const Extension* extension, @@ -118,6 +121,16 @@ const std::string& title, const GURL& launch_url) const = 0; + // Returns true if there is already a web app installed for |web_app_url|. + virtual bool IsWebAppInstalled(content::BrowserContext* context, + const GURL& web_app_url) const = 0; + + // Installs a web app for |web_app_url|. + virtual void InstallReplacementWebApp( + content::BrowserContext* context, + const GURL& web_app_url, + InstallWebAppCallback callback) const = 0; + // Forwards the call to ExtensionIconSource::GetIconURL in chrome. virtual GURL GetIconURL(const Extension* extension, int icon_size,
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 2a04a4e..e52da389 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1392,6 +1392,7 @@ AUTOTESTPRIVATE_SHOWVIRTUALKEYBOARDIFENABLED = 1329, FEEDBACKPRIVATE_LOGINFEEDBACKCOMPLETE = 1330, FILEMANAGERPRIVATE_SEARCHFILES = 1331, + MANAGEMENT_INSTALLREPLACEMENTWEBAPP = 1332, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json index 5209a16..f36eea9 100644 --- a/extensions/common/api/_api_features.json +++ b/extensions/common/api/_api_features.json
@@ -285,6 +285,11 @@ "channel": "stable", "extension_types": ["extension", "legacy_packaged_app", "platform_app"] }, + "management.installReplacementWebApp": { + "dependencies": ["manifest:replacement_web_app"], + "channel": "dev", + "extension_types": ["extension"] + }, "management.uninstallSelf": { "dependencies": [], "channel": "stable",
diff --git a/extensions/common/api/_manifest_features.json b/extensions/common/api/_manifest_features.json index f1abc04..08a088ad 100644 --- a/extensions/common/api/_manifest_features.json +++ b/extensions/common/api/_manifest_features.json
@@ -287,7 +287,7 @@ ] }, "replacement_web_app": { - "channel": "trunk", + "channel": "dev", "extension_types": ["extension", "platform_app"], "min_manifest_version": 2 },
diff --git a/extensions/common/api/management.json b/extensions/common/api/management.json index c8a0217..47089bb 100644 --- a/extensions/common/api/management.json +++ b/extensions/common/api/management.json
@@ -160,7 +160,7 @@ } } } - } + } ], "functions": [ { @@ -424,6 +424,18 @@ ] } ] + }, + { + "name": "installReplacementWebApp", + "description": "Prompts the user to install the replacement web app from the manifest.", + "parameters": [ + { + "name": "callback", + "type": "function", + "optional": true, + "parameters": [] + } + ] } ], "events": [
diff --git a/extensions/common/manifest_handlers/replacement_web_app.cc b/extensions/common/manifest_handlers/replacement_web_app.cc index df6ea666..f1251b2 100644 --- a/extensions/common/manifest_handlers/replacement_web_app.cc +++ b/extensions/common/manifest_handlers/replacement_web_app.cc
@@ -32,10 +32,18 @@ ReplacementWebAppInfo::~ReplacementWebAppInfo() {} // static -bool ReplacementWebAppInfo::IsReplacementWebApp(const Extension* extension, - const GURL& web_app_url) { +bool ReplacementWebAppInfo::HasReplacementWebApp(const Extension* extension) { const ReplacementWebAppInfo* info = GetReplacementWebAppInfo(extension); - return info && info->replacement_web_app == web_app_url; + return info; +} + +// static +GURL ReplacementWebAppInfo::GetReplacementWebApp(const Extension* extension) { + const ReplacementWebAppInfo* info = GetReplacementWebAppInfo(extension); + if (info) + return info->replacement_web_app; + + return GURL(); } ReplacementWebAppHandler::ReplacementWebAppHandler() {}
diff --git a/extensions/common/manifest_handlers/replacement_web_app.h b/extensions/common/manifest_handlers/replacement_web_app.h index 2a247f83..c721ef56 100644 --- a/extensions/common/manifest_handlers/replacement_web_app.h +++ b/extensions/common/manifest_handlers/replacement_web_app.h
@@ -19,9 +19,11 @@ ReplacementWebAppInfo(); ~ReplacementWebAppInfo() override; - // Returns true if the specified URL is the replacement web app. - static bool IsReplacementWebApp(const Extension* extension, - const GURL& web_app_url); + // Returns true if the specified URL has a replacement web app. + static bool HasReplacementWebApp(const Extension* extension); + + // Returns the replacement web app for |extension|. + static GURL GetReplacementWebApp(const Extension* extension); GURL replacement_web_app; };
diff --git a/extensions/common/manifest_handlers/replacement_web_app_unittest.cc b/extensions/common/manifest_handlers/replacement_web_app_unittest.cc index 8700686..a16be89 100644 --- a/extensions/common/manifest_handlers/replacement_web_app_unittest.cc +++ b/extensions/common/manifest_handlers/replacement_web_app_unittest.cc
@@ -66,10 +66,9 @@ TEST_F(ReplacementWebAppManifestTest, VerifyParse) { scoped_refptr<Extension> good = LoadAndExpectSuccess(CreateManifest(R"("https://www.google.com")")); - EXPECT_TRUE(ReplacementWebAppInfo::IsReplacementWebApp( - good.get(), GURL("https://www.google.com"))); - EXPECT_FALSE(ReplacementWebAppInfo::IsReplacementWebApp( - good.get(), GURL("https://www.youtube.com"))); + EXPECT_TRUE(ReplacementWebAppInfo::HasReplacementWebApp(good.get())); + EXPECT_EQ(ReplacementWebAppInfo::GetReplacementWebApp(good.get()), + GURL("https://www.google.com")); } } // namespace extensions
diff --git a/extensions/strings/extensions_strings_hi.xtb b/extensions/strings/extensions_strings_hi.xtb index 94dad5ec..2aebd31 100644 --- a/extensions/strings/extensions_strings_hi.xtb +++ b/extensions/strings/extensions_strings_hi.xtb
@@ -48,7 +48,7 @@ <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="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> <translation id="6731255991101203740">अनज़िप करने के लिए निर्देशिका नहीं बनाई जा सकी: '<ph name="DIRECTORY_PATH" />'</translation>
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc index f4fda014..f4fca8c0f 100644 --- a/gpu/command_buffer/service/shared_image_factory.cc +++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -232,22 +232,22 @@ SharedImageBackingFactory* SharedImageFactory::GetFactoryByUsage( uint32_t usage, bool* allow_legacy_mailbox) { + bool using_dawn = usage & SHARED_IMAGE_USAGE_WEBGPU; + bool vulkan_usage = using_vulkan_ && (usage & SHARED_IMAGE_USAGE_DISPLAY); + bool gl_usage = usage & SHARED_IMAGE_USAGE_GLES2; + bool share_between_threads = IsSharedBetweenThreads(usage); + bool share_between_gl_vulkan = gl_usage && vulkan_usage; + bool using_interop_factory = + share_between_threads || share_between_gl_vulkan || using_dawn; // wrapped_sk_image_factory_ is only used for OOPR and supports // a limited number of flags (e.g. no SHARED_IMAGE_USAGE_SCANOUT). constexpr auto kWrappedSkImageUsage = SHARED_IMAGE_USAGE_RASTER | SHARED_IMAGE_USAGE_OOP_RASTERIZATION | SHARED_IMAGE_USAGE_DISPLAY; - bool using_wrapped_sk_image = - wrapped_sk_image_factory_ && (usage == kWrappedSkImageUsage); - bool using_dawn = usage & SHARED_IMAGE_USAGE_WEBGPU; - - bool vulkan_usage = using_vulkan_ && (usage & SHARED_IMAGE_USAGE_DISPLAY); - bool gl_usage = usage & SHARED_IMAGE_USAGE_GLES2; - bool share_between_threads = IsSharedBetweenThreads(usage); - bool share_between_gl_vulkan = gl_usage && vulkan_usage; - bool using_interop_factory = share_between_threads || - share_between_gl_vulkan || using_dawn || - (vulkan_usage && !using_wrapped_sk_image); + bool using_wrapped_sk_image = wrapped_sk_image_factory_ && + (usage == kWrappedSkImageUsage) && + !using_interop_factory; + using_interop_factory |= vulkan_usage && !using_wrapped_sk_image; *allow_legacy_mailbox = !using_wrapped_sk_image && !using_interop_factory && !using_vulkan_;
diff --git a/gpu/vulkan/vulkan_instance.cc b/gpu/vulkan/vulkan_instance.cc index 33b2e1d0..2831776 100644 --- a/gpu/vulkan/vulkan_instance.cc +++ b/gpu/vulkan/vulkan_instance.cc
@@ -105,6 +105,23 @@ } } +#if DCHECK_IS_ON() + for (const char* enabled_extension : enabled_extensions) { + bool found = false; + for (const VkExtensionProperties& ext_property : instance_exts) { + if (strcmp(ext_property.extensionName, enabled_extension) == 0) { + found = true; + break; + } + } + if (!found) { + DLOG(ERROR) << "Required extension " << enabled_extension + << " missing from enumerated Vulkan extensions. " + "vkCreateInstance will likely fail."; + } + } +#endif + std::vector<const char*> enabled_layer_names; #if DCHECK_IS_ON() uint32_t num_instance_layers = 0;
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg index 5fabe81..7986a63 100644 --- a/infra/config/cr-buildbucket.cfg +++ b/infra/config/cr-buildbucket.cfg
@@ -159,21 +159,6 @@ } } -# Enables use of Goma RBE Prod backend in a builder. -# TODO(crbug.com/950415): Use new system that can combine multiple mixins with -# "$build/goma" properties. -builder_mixins { - name: "goma-rbe-prod" - recipe { - properties_j: <<END - $build/goma: { - "server_host": "goma.chromium.org", - "rpc_extra_params": "?prod" - } - END - } -} - builder_mixins { name: "android" dimensions: "os:Android" @@ -3117,101 +3102,85 @@ dimensions: "os:Mac-10.13" dimensions: "cores:4" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Mac Goma Latest Client (clobber)" dimensions: "os:Mac-10.13" dimensions: "cores:4" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Win Builder Goma Latest Client" dimensions: "os:Windows-10" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Android Builder (dbg) Goma Latest Client" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Mac Goma Latest Client LocalOutputCache" dimensions: "os:Mac-10.13" dimensions: "cores:4" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Win7 Builder Goma Latest Client" dimensions: "os:Windows-7" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Mac Builder (dbg) Goma Latest Client" dimensions: "os:Mac-10.13" dimensions: "cores:4" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Win Builder (dbg) Goma Latest Client" dimensions: "os:Windows-10" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Linux x64 Goma Latest Client LocalOutputCache" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Linux Builder Goma Latest Client" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Win cl.exe Goma Latest Client LocalOutputCache" dimensions: "os:Windows-10" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Win7 Builder (dbg) Goma Latest Client" dimensions: "os:Windows-7" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Win Goma Latest Client LocalOutputCache" dimensions: "os:Windows-10" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Mac Builder Goma Latest Client" dimensions: "os:Mac-10.13" dimensions: "cores:4" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "WinMSVC64 Goma Latest Client" dimensions: "os:Windows-10" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Linux x64 Goma Latest Client (clobber)" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "chromeos-amd64-generic-rel-goma-latest"
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 ad95f0fe..3ceecb919 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -8,7 +8,7 @@ <translation id="1617663976202781617">क्रोमियम सिंक से मिला डेटा</translation> <translation id="1736662517232558588">क्रोमियम का डेटा साफ़ हो गया</translation> <translation id="1838412507805038478">क्रोमियम ने सत्यापित किया है कि इस वेबसाइट का प्रमाणपत्र <ph name="ISSUER" /> ने जारी किया है.</translation> -<translation id="1843424232666537147">क्रोमियम में ऐसी सुविधाएं हैं जो आपको अपने इंटरनेट डेटा को प्रबंधित करने और वेबपृष्ठों को तेज़ी से लोड करने में आपकी सहायता करती हैं. <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation> +<translation id="1843424232666537147">क्रोमियम में ऐसी सुविधाएं हैं जो आपको अपने इंटरनेट डेटा को प्रबंधित करने और वेबपृष्ठों को तेज़ी से लोड करने में आपकी सहायता करती हैं. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="2075400798887076382">अपने कंप्यूटर पर खोले गए टैब सीधे यहां से एक्सेस करें. बस अपने कंप्यूटर पर क्रोमियम खोलें, मेन्यू पर जाएं और “क्रोमियम में साइन इन करें…” चुनें</translation> <translation id="2168108852149185974">कुछ ऐड-ऑन के कारण क्रोमियम क्रैश हो जाता है. कृपया इन्हें अनइंस्टॉल करें:</translation> <translation id="2178608107313874732">क्रोमियम इस समय आपके कैमरे का उपयोग नहीं कर सकता</translation> @@ -26,7 +26,7 @@ <translation id="4157467675761413638">क्रोमियम के लिए सलाह. ज़्यादा टैब विकल्पोंं के लिए, टूलबार में 'टैब दिखाएं' बटन को दबाकर रखें, जो आपकी स्क्रीन में सबसे नीचे या सबसे ऊपर होगा.</translation> <translation id="4241912885070669028">आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> द्वारा प्रबंधित खाते से प्रस्थान कर रहे हैं. इससे आपका क्रोमियम डेटा इस डिवाइस से हट जाएगा, लेकिन आपका डेटा आपके Google खाते में बना रहेगा.</translation> <translation id="4272892696084633551">क्रोमियम की सुविधाओं और प्रदर्शन को बेहतर बनाने में सहायता करें</translation> -<translation id="4555020257205549924">जब यह सुविधा चालू होती है, तो क्रोमियम अन्य भाषा में लिखे पृष्ठों को Google अनुवाद का उपयोग करके अनुवाद करने के लिए ऑफ़र करेगा. <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation> +<translation id="4555020257205549924">जब यह सुविधा चालू होती है, तो क्रोमियम अन्य भाषा में लिखे पृष्ठों को Google अनुवाद का उपयोग करके अनुवाद करने के लिए ऑफ़र करेगा. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="4787850887676698916">आपके अन्य डिवाइस पर क्रोमियम में खोले हुए आपके टैब यहां दिखाई देंगे.</translation> <translation id="495292094137889840">क्रोमियम QR स्कैनर का उपयोग करना शुरू करें</translation> <translation id="4999538639245140991">क्योंकि आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> की ओर से प्रबंधित खाते से साइन आउट कर रहे हैं, इसलिए आपका क्रोमियम डेटा इस डिवाइस से मिट जाएगा. आपका डेटा आपके Google खाते में बना रहेगा.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index b39bd79..efa6fda 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -61,7 +61,7 @@ <translation id="1740468249224277719">इंस्टॉल करने के लिए डबल टैप करें.</translation> <translation id="1746815479209538200">वेब ब्राउज़ करने के लिए, नया टैब जोड़ें.</translation> <translation id="1752547299766512813">पासवर्ड सेव करें</translation> -<translation id="1753905327828125965">सबसे अधिक देखे गए</translation> +<translation id="1753905327828125965">सबसे ज़्यादा देखे गए</translation> <translation id="1809939268435598390">फ़ोल्डर हटाएं</translation> <translation id="1813414402673211292">ब्राउज़िंग डेटा साफ़ करें</translation> <translation id="1820259098641718022">पठन सूची में जोड़ा गया</translation> @@ -71,7 +71,7 @@ <translation id="1911619930368729126">Google डिस्क पर अपलोड करें</translation> <translation id="1941314575388338491">कॉपी करने के लिए डबल टैप करें.</translation> <translation id="1952728750904661634">प्रबंधित खाते से साइन इन करें</translation> -<translation id="1974060860693918893">उन्नत</translation> +<translation id="1974060860693918893">बेहतर</translation> <translation id="1989112275319619282">ब्राउज़ करें</translation> <translation id="2000419248597011803">'पता बार' और 'खोज बॉक्स' की कुछ कुकी और खोजों को आपके डिफ़ॉल्ट खोज इंजन पर भेजा जाता है</translation> <translation id="2015722694326466240">पासवर्ड देखने के लिए, आपको सबसे पहले अपने डिवाइस पर एक पासकोड सेट करना होगा.</translation> @@ -93,7 +93,7 @@ <translation id="2256128224215992540">खोज और साइट सुझाव</translation> <translation id="2267753748892043616">खाता जोड़ें</translation> <translation id="2268044343513325586">परिशोधित करें</translation> -<translation id="2273327106802955778">अधिक मेनू</translation> +<translation id="2273327106802955778">ज़्यादा मेनू</translation> <translation id="2316709634732130529">सुझाए गए पासवर्ड का इस्तेमाल करें</translation> <translation id="2320166752086256636">कीबोर्ड छिपाएं</translation> <translation id="2339560363438331454">सिंक, Google सेवाएं</translation> @@ -169,7 +169,7 @@ <translation id="3474649192738347024">फ़ॉर्म भर दिए गए.</translation> <translation id="3478058380795961209">समाप्ति माह</translation> <translation id="3482959374254649722">आपके टैब समन्वयित कर रहा है...</translation> -<translation id="3493531032208478708">सुझाई गई सामग्री के बारे में <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation> +<translation id="3493531032208478708">सुझाई गई सामग्री के बारे में <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="3494788280727468875">ब्राउज़िंग डेटा साफ़ करने की पुष्टि करें</translation> <translation id="3519193562722059437">वेब ब्राउज़ करने के लिए टैब खोलें.</translation> <translation id="3527085408025491307">फ़ोल्डर</translation> @@ -227,7 +227,7 @@ <translation id="4508750114462689118">साइन इन प्रोमो बंद करें</translation> <translation id="4526249700380860531">सहेजे गए पासवर्ड <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> पर देखें और प्रबंधित करें</translation> <translation id="4536418791685807335">फिर से प्रवेश करके देखें.</translation> -<translation id="457386861538956877">अधिक...</translation> +<translation id="457386861538956877">ज़्यादा...</translation> <translation id="4592368184551360546">कीबोर्ड</translation> <translation id="461440297010471931">Google से खोजना</translation> <translation id="4619615317237390068">अन्य डिवाइस के टैब</translation> @@ -414,7 +414,7 @@ <translation id="744343212394640790"><ph name="EMAIL" /> नहीं है</translation> <translation id="7454057999980797137">राज्य / देश</translation> <translation id="7456847797759667638">स्थान खोलें...</translation> -<translation id="7464701184726199289">इससे सभी डिवाइस में समन्वयित डेटा साफ़ हो जाता है. सहेजी गई साइट सेटिंग नहीं हटाई जाएंगी और इससे आपका ब्राउज़िंग व्यवहार प्रदर्शित हो सकता है. <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation> +<translation id="7464701184726199289">इससे सभी डिवाइस में समन्वयित डेटा साफ़ हो जाता है. सहेजी गई साइट सेटिंग नहीं हटाई जाएंगी और इससे आपका ब्राउज़िंग व्यवहार प्रदर्शित हो सकता है. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="7472734401283673885">कंपनी का नाम</translation> <translation id="7481312909269577407">आगे जाएं</translation> <translation id="750493650310597496">0 चयनित</translation> @@ -453,7 +453,7 @@ <translation id="8059533439631660104">अनुभाग को संक्षिप्त करें.</translation> <translation id="806745655614357130">मेरा डेटा अलग रखें</translation> <translation id="8073670137947914548">डाउनलोड पूरा हो गया</translation> -<translation id="8076014560081431679">सहेजी गई साइट सेटिंग नहीं हटाई जाएंगी और इससे आपका ब्राउज़िंग व्यवहार प्रदर्शित हो सकता है. <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation> +<translation id="8076014560081431679">सहेजी गई साइट सेटिंग नहीं हटाई जाएंगी और इससे आपका ब्राउज़िंग व्यवहार प्रदर्शित हो सकता है. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="8114753159095730575">फ़ाइल डाउनलोड करने की सुविधा उपलब्ध है. विकल्प स्क्रीन के नीचे उपलब्ध हैं.</translation> <translation id="8131740175452115882">दुबारा पूछें</translation> <translation id="8205564605687841303">रद्द करें</translation>
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn index f2fe346..6b7f3a08 100644 --- a/ios/chrome/browser/ui/settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -275,6 +275,7 @@ "//components/sync_preferences:test_support", "//components/translate/core/browser", "//components/translate/core/common", + "//components/ukm/ios:features", "//components/unified_consent", "//ios/chrome/app/strings", "//ios/chrome/browser",
diff --git a/ios/chrome/browser/ui/settings/privacy_table_view_controller.mm b/ios/chrome/browser/ui/settings/privacy_table_view_controller.mm index 097f7b7..df6b806e 100644 --- a/ios/chrome/browser/ui/settings/privacy_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy_table_view_controller.mm
@@ -58,20 +58,16 @@ namespace { typedef NS_ENUM(NSInteger, SectionIdentifier) { - SectionIdentifierOtherDevices = kSectionIdentifierEnumZero, - SectionIdentifierWebServices, - SectionIdentifierCanMakePayment, + SectionIdentifierWebServices = kSectionIdentifierEnumZero, SectionIdentifierClearBrowsingData, }; typedef NS_ENUM(NSInteger, ItemType) { - ItemTypeOtherDevicesHeader = kItemTypeEnumZero, - ItemTypeOtherDevicesHandoff, - ItemTypeWebServicesHeader, - ItemTypeWebServicesShowSuggestions, + ItemTypeOtherDevicesHandoff = kItemTypeEnumZero, + ItemTypeWebServicesPaymentSwitch, ItemTypeWebServicesSendUsageData, + ItemTypeWebServicesShowSuggestions, ItemTypeWebServicesFooter, - ItemTypeCanMakePaymentSwitch, ItemTypeClearBrowsingDataClear, }; @@ -159,36 +155,16 @@ TableViewModel* model = self.tableViewModel; - // Other Devices Section - [model addSectionWithIdentifier:SectionIdentifierOtherDevices]; - TableViewTextHeaderFooterItem* otherDevicesHeader = - [[TableViewTextHeaderFooterItem alloc] - initWithType:ItemTypeOtherDevicesHeader]; - otherDevicesHeader.text = - l10n_util::GetNSString(IDS_IOS_OPTIONS_CONTINUITY_LABEL); - [model setHeader:otherDevicesHeader - forSectionWithIdentifier:SectionIdentifierOtherDevices]; + // Web Services Section + [model addSectionWithIdentifier:SectionIdentifierWebServices]; [model addItem:[self handoffDetailItem] - toSectionWithIdentifier:SectionIdentifierOtherDevices]; - + toSectionWithIdentifier:SectionIdentifierWebServices]; + [model addItem:[self canMakePaymentItem] + toSectionWithIdentifier:SectionIdentifierWebServices]; if (!unified_consent::IsUnifiedConsentFeatureEnabled()) { - // Add "Web services" section only if the unified consent is disabled. - // Otherwise the metrics reporting and show suggestions feature are - // available in the Google services settings. - [model addSectionWithIdentifier:SectionIdentifierWebServices]; - TableViewTextHeaderFooterItem* webServicesHeader = - [[TableViewTextHeaderFooterItem alloc] - initWithType:ItemTypeWebServicesHeader]; - webServicesHeader.text = - l10n_util::GetNSString(IDS_IOS_OPTIONS_WEB_SERVICES_LABEL); - [model setHeader:webServicesHeader - forSectionWithIdentifier:SectionIdentifierWebServices]; // When unified consent flag is enabled, the show suggestions feature and // metrics reporting feature are available in the "Google Services and sync" // settings. - _showSuggestionsItem = [self showSuggestionsSwitchItem]; - [model addItem:_showSuggestionsItem - toSectionWithIdentifier:SectionIdentifierWebServices]; if (base::FeatureList::IsEnabled(kUmaCellular)) { [model addItem:[self sendUsageToggleSwitchItem] toSectionWithIdentifier:SectionIdentifierWebServices]; @@ -196,15 +172,14 @@ [model addItem:[self sendUsageDetailItem] toSectionWithIdentifier:SectionIdentifierWebServices]; } + _showSuggestionsItem = [self showSuggestionsSwitchItem]; + [model addItem:_showSuggestionsItem + toSectionWithIdentifier:SectionIdentifierWebServices]; [model setFooter:[self showSuggestionsFooterItem] forSectionWithIdentifier:SectionIdentifierWebServices]; } - // CanMakePayment Section - [model addSectionWithIdentifier:SectionIdentifierCanMakePayment]; - [model addItem:[self canMakePaymentItem] - toSectionWithIdentifier:SectionIdentifierCanMakePayment]; // Clear Browsing Section [model addSectionWithIdentifier:SectionIdentifierClearBrowsingData]; @@ -257,8 +232,8 @@ } - (TableViewItem*)canMakePaymentItem { - SettingsSwitchItem* canMakePaymentItem = - [[SettingsSwitchItem alloc] initWithType:ItemTypeCanMakePaymentSwitch]; + SettingsSwitchItem* canMakePaymentItem = [[SettingsSwitchItem alloc] + initWithType:ItemTypeWebServicesPaymentSwitch]; canMakePaymentItem.text = l10n_util::GetNSString(IDS_SETTINGS_CAN_MAKE_PAYMENT_TOGGLE_LABEL); canMakePaymentItem.on = [self isCanMakePaymentEnabled]; @@ -328,7 +303,7 @@ [switchCell.switchView addTarget:self action:@selector(showSuggestionsToggled:) forControlEvents:UIControlEventValueChanged]; - } else if (itemType == ItemTypeCanMakePaymentSwitch) { + } else if (itemType == ItemTypeWebServicesPaymentSwitch) { SettingsSwitchCell* switchCell = base::mac::ObjCCastStrict<SettingsSwitchCell>(cell); [switchCell.switchView addTarget:self @@ -395,7 +370,7 @@ initWithBrowserState:_browserState]; } break; - case ItemTypeCanMakePaymentSwitch: + case ItemTypeWebServicesPaymentSwitch: case ItemTypeWebServicesShowSuggestions: default: break; @@ -465,9 +440,9 @@ } - (void)canMakePaymentSwitchChanged:(UISwitch*)sender { - NSIndexPath* switchPath = [self.tableViewModel - indexPathForItemType:ItemTypeCanMakePaymentSwitch - sectionIdentifier:SectionIdentifierCanMakePayment]; + NSIndexPath* switchPath = + [self.tableViewModel indexPathForItemType:ItemTypeWebServicesPaymentSwitch + sectionIdentifier:SectionIdentifierWebServices]; SettingsSwitchItem* switchItem = base::mac::ObjCCastStrict<SettingsSwitchItem>(
diff --git a/ios/chrome/browser/ui/settings/privacy_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/privacy_table_view_controller_unittest.mm index c3369767..97d3b55 100644 --- a/ios/chrome/browser/ui/settings/privacy_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/privacy_table_view_controller_unittest.mm
@@ -14,6 +14,7 @@ #include "components/strings/grit/components_strings.h" #include "components/sync_preferences/pref_service_mock_factory.h" #include "components/sync_preferences/pref_service_syncable.h" +#include "components/ukm/ios/features.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/pref_names.h" @@ -90,11 +91,10 @@ // and sections. TEST_F(PrivacyTableViewControllerTest, TestModel) { CheckController(); - EXPECT_EQ(4, NumberOfSections()); + EXPECT_EQ(2, NumberOfSections()); // Sections[0]. - EXPECT_EQ(1, NumberOfItemsInSection(0)); - CheckSectionHeaderWithId(IDS_IOS_OPTIONS_CONTINUITY_LABEL, 0); + EXPECT_EQ(4, NumberOfItemsInSection(0)); NSString* handoffSubtitle = chrome_browser_state_->GetPrefs()->GetBoolean( prefs::kIosHandoffToOtherDevices) ? l10n_util::GetNSString(IDS_IOS_SETTING_ON) @@ -102,26 +102,24 @@ CheckTextCellTextAndDetailText( l10n_util::GetNSString(IDS_IOS_OPTIONS_ENABLE_HANDOFF_TO_OTHER_DEVICES), handoffSubtitle, 0, 0); + CheckSwitchCellStateAndText( + NO, l10n_util::GetNSString(IDS_SETTINGS_CAN_MAKE_PAYMENT_TOGGLE_LABEL), 0, + 1); + if (base::FeatureList::IsEnabled(kUmaCellular)) { + CheckSwitchCellStateAndTextWithId( + YES, IDS_IOS_OPTIONS_SEARCH_URL_SUGGESTIONS, 0, 2); + } else { + CheckDetailItemTextWithIds(IDS_IOS_OPTIONS_SEND_USAGE_DATA, + IDS_IOS_OPTIONS_DATA_USAGE_NEVER, 0, 2); + } + CheckSwitchCellStateAndTextWithId(YES, IDS_IOS_OPTIONS_SEARCH_URL_SUGGESTIONS, + 0, 3); + CheckSectionFooterWithId(IDS_IOS_OPTIONS_PRIVACY_FOOTER, 0); // Sections[1]. - EXPECT_EQ(2, NumberOfItemsInSection(1)); - CheckSectionHeaderWithId(IDS_IOS_OPTIONS_WEB_SERVICES_LABEL, 1); - CheckSwitchCellStateAndTextWithId(YES, IDS_IOS_OPTIONS_SEARCH_URL_SUGGESTIONS, - 1, 0); - CheckDetailItemTextWithIds(IDS_IOS_OPTIONS_SEND_USAGE_DATA, - IDS_IOS_OPTIONS_DATA_USAGE_NEVER, 1, 1); - CheckSectionFooterWithId(IDS_IOS_OPTIONS_PRIVACY_FOOTER, 1); - - // Sections[2]. - EXPECT_EQ(1, NumberOfItemsInSection(2)); - CheckSwitchCellStateAndText( - NO, l10n_util::GetNSString(IDS_SETTINGS_CAN_MAKE_PAYMENT_TOGGLE_LABEL), 2, - 0); - - // Sections[3]. - EXPECT_EQ(1, NumberOfItemsInSection(3)); + EXPECT_EQ(1, NumberOfItemsInSection(1)); CheckTextCellText(l10n_util::GetNSString(IDS_IOS_CLEAR_BROWSING_DATA_TITLE), - 3, 0); + 1, 0); } } // namespace
diff --git a/ios/web/navigation/navigation_manager_util_unittest.mm b/ios/web/navigation/navigation_manager_util_unittest.mm index 61f121c..c3f075c6 100644 --- a/ios/web/navigation/navigation_manager_util_unittest.mm +++ b/ios/web/navigation/navigation_manager_util_unittest.mm
@@ -4,15 +4,20 @@ #include "ios/web/navigation/navigation_manager_util.h" +#import <WebKit/WebKit.h> + #include "base/memory/ptr_util.h" #import "ios/web/navigation/crw_session_controller+private_constructors.h" #import "ios/web/navigation/crw_session_controller.h" #import "ios/web/navigation/legacy_navigation_manager_impl.h" +#import "ios/web/navigation/wk_based_navigation_manager_impl.h" #import "ios/web/public/navigation_item.h" #include "ios/web/public/test/fakes/test_browser_state.h" +#import "ios/web/test/fakes/crw_fake_back_forward_list.h" #import "ios/web/test/fakes/fake_navigation_manager_delegate.h" #import "ios/web/web_state/navigation_context_impl.h" #include "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -27,23 +32,29 @@ class NavigationManagerUtilTest : public PlatformTest, public ::testing::WithParamInterface<bool> { protected: - NavigationManagerUtilTest() - : controller_([[CRWSessionController alloc] - initWithBrowserState:&browser_state_]) { + NavigationManagerUtilTest() { bool test_legacy_navigation_manager = GetParam(); if (test_legacy_navigation_manager) { - manager_.reset(new LegacyNavigationManagerImpl); + controller_ = + [[CRWSessionController alloc] initWithBrowserState:&browser_state_]; + manager_ = std::make_unique<LegacyNavigationManagerImpl>(); manager_->SetBrowserState(&browser_state_); - manager_->SetDelegate(&delegate_); manager_->SetSessionController(controller_); } else { - DCHECK(false) << "Not yet implemented."; + manager_ = std::make_unique<WKBasedNavigationManagerImpl>(); + manager_->SetBrowserState(&browser_state_); + WKWebView* mock_web_view = OCMClassMock([WKWebView class]); + mock_wk_list_ = [[CRWFakeBackForwardList alloc] init]; + OCMStub([mock_web_view backForwardList]).andReturn(mock_wk_list_); + delegate_.SetWebViewNavigationProxy(mock_web_view); } + manager_->SetDelegate(&delegate_); } std::unique_ptr<NavigationManagerImpl> manager_; web::FakeNavigationManagerDelegate delegate_; - CRWSessionController* controller_; + CRWSessionController* controller_ = nil; + CRWFakeBackForwardList* mock_wk_list_ = nil; private: TestBrowserState browser_state_; @@ -70,6 +81,7 @@ EXPECT_EQ(-1, GetCommittedItemIndexWithUniqueID(manager_.get(), unique_id)); // Commit that pending item. + [mock_wk_list_ setCurrentURL:@"http://chromium.org"]; manager_->CommitPendingItem(); EXPECT_EQ(item, GetCommittedItemWithUniqueID(manager_.get(), unique_id)); EXPECT_EQ(item, GetItemWithUniqueID(manager_.get(), context.get())); @@ -88,7 +100,7 @@ EXPECT_EQ(-1, GetCommittedItemIndexWithUniqueID(manager_.get(), unique_id)); // Add transient item. - [controller_ addTransientItemWithURL:GURL("http://chromium.org")]; + manager_->AddTransientItem(GURL("http://chromium.org")); item = manager_->GetTransientItem(); unique_id = item->GetUniqueID(); context->SetNavigationItemUniqueID(unique_id); @@ -107,6 +119,7 @@ INSTANTIATE_TEST_SUITE_P( ProgrammaticNavigationManagerUtilTest, NavigationManagerUtilTest, - ::testing::Values(true /* test_legacy_navigation_manager */)); + ::testing::Values(/*test_legacy_navigation_manager=*/true, + /*test_legacy_navigation_manager=*/false)); } // namespace web
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc index dd7783d..53514b6 100644 --- a/ipc/ipc_message_utils.cc +++ b/ipc/ipc_message_utils.cc
@@ -36,6 +36,7 @@ #endif #if defined(OS_FUCHSIA) +#include "ipc/handle_attachment_fuchsia.h" #include "ipc/handle_fuchsia.h" #endif @@ -624,6 +625,53 @@ } #endif // defined(OS_POSIX) || defined(OS_FUCHSIA) +#if defined(OS_FUCHSIA) +void ParamTraits<zx::vmo>::Write(base::Pickle* m, const param_type& p) { + // This serialization must be kept in sync with + // nacl_message_scanner.cc:WriteHandle(). + const bool valid = p.is_valid(); + WriteParam(m, valid); + + if (!valid) + return; + + if (!m->WriteAttachment(new internal::HandleAttachmentFuchsia( + const_cast<param_type&>(p).release()))) { + NOTREACHED(); + } +} + +bool ParamTraits<zx::vmo>::Read(const base::Pickle* m, + base::PickleIterator* iter, + param_type* r) { + r->reset(); + + bool valid; + if (!ReadParam(m, iter, &valid)) + return false; + + if (!valid) + return true; + + scoped_refptr<base::Pickle::Attachment> attachment; + if (!m->ReadAttachment(iter, &attachment)) + return false; + + if (static_cast<MessageAttachment*>(attachment.get())->GetType() != + MessageAttachment::Type::FUCHSIA_HANDLE) { + return false; + } + + *r = zx::vmo(static_cast<internal::HandleAttachmentFuchsia*>(attachment.get()) + ->Take()); + return true; +} + +void ParamTraits<zx::vmo>::Log(const param_type& p, std::string* l) { + l->append("ZirconVMO"); +} +#endif // defined(OS_FUCHSIA) + #if defined(OS_ANDROID) void ParamTraits<base::android::ScopedHardwareBufferHandle>::Write( base::Pickle* m,
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h index 816b131..a1b58cd 100644 --- a/ipc/ipc_message_utils.h +++ b/ipc/ipc_message_utils.h
@@ -602,6 +602,18 @@ #endif // defined(OS_POSIX) || defined(OS_FUCHSIA) +#if defined(OS_FUCHSIA) +template <> +struct COMPONENT_EXPORT(IPC) ParamTraits<zx::vmo> { + typedef zx::vmo param_type; + static void Write(base::Pickle* m, const param_type& p); + static bool Read(const base::Pickle* m, + base::PickleIterator* iter, + param_type* r); + static void Log(const param_type& p, std::string* l); +}; +#endif // defined(OS_FUCHSIA) + template <> struct COMPONENT_EXPORT(IPC) ParamTraits<base::SharedMemoryHandle> { typedef base::SharedMemoryHandle param_type;
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index 31f36b3..064d6b25 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc
@@ -236,6 +236,20 @@ } // static +scoped_refptr<VideoFrame> VideoFrame::CreateVideoHoleFrame( + const base::UnguessableToken& overlay_plane_id, + const gfx::Size& natural_size, + base::TimeDelta timestamp) { + auto layout = VideoFrameLayout::Create(PIXEL_FORMAT_UNKNOWN, natural_size); + scoped_refptr<VideoFrame> frame = + new VideoFrame(*layout, StorageType::STORAGE_OPAQUE, + gfx::Rect(natural_size), natural_size, timestamp); + frame->metadata()->SetUnguessableToken(VideoFrameMetadata::OVERLAY_PLANE_ID, + overlay_plane_id); + return frame; +} + +// static scoped_refptr<VideoFrame> VideoFrame::CreateZeroInitializedFrame( VideoPixelFormat format, const gfx::Size& coded_size,
diff --git a/media/base/video_frame.h b/media/base/video_frame.h index 5159f6b9..3ab20a32 100644 --- a/media/base/video_frame.h +++ b/media/base/video_frame.h
@@ -24,6 +24,7 @@ #include "base/memory/unsafe_shared_memory_region.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" +#include "base/unguessable_token.h" #include "build/build_config.h" #include "gpu/command_buffer/common/mailbox_holder.h" #include "media/base/video_frame_layout.h" @@ -118,6 +119,15 @@ const gfx::Size& natural_size, base::TimeDelta timestamp); + // Used by Chromecast only. + // Create a new frame that doesn't contain any valid video content. This frame + // is meant to be sent to compositor to inform that the compositor should + // punch a transparent hole so the video underlay will be visible. + static scoped_refptr<VideoFrame> CreateVideoHoleFrame( + const base::UnguessableToken& overlay_plane_id, + const gfx::Size& natural_size, + base::TimeDelta timestamp); + // Offers the same functionality as CreateFrame, and additionally zeroes out // the initial allocated buffers. static scoped_refptr<VideoFrame> CreateZeroInitializedFrame(
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn index b3c18e5..96376c73 100644 --- a/media/capture/BUILD.gn +++ b/media/capture/BUILD.gn
@@ -284,6 +284,7 @@ deps += [ "//build/config/linux/libdrm", "//chromeos/dbus/power", + "//components/chromeos_camera/common", "//media/capture/video/chromeos/mojo:cros_camera", "//third_party/libsync", ]
diff --git a/media/capture/video/chromeos/DEPS b/media/capture/video/chromeos/DEPS index f1958045..156f915b 100644 --- a/media/capture/video/chromeos/DEPS +++ b/media/capture/video/chromeos/DEPS
@@ -1,4 +1,5 @@ include_rules = [ "+chromeos/dbus", + "+components/chromeos_camera", "+third_party/libsync", ]
diff --git a/media/capture/video/chromeos/camera_hal_dispatcher_impl.h b/media/capture/video/chromeos/camera_hal_dispatcher_impl.h index 40bf84d..d36c792 100644 --- a/media/capture/video/chromeos/camera_hal_dispatcher_impl.h +++ b/media/capture/video/chromeos/camera_hal_dispatcher_impl.h
@@ -12,6 +12,7 @@ #include "base/files/scoped_file.h" #include "base/memory/singleton.h" #include "base/threading/thread.h" +#include "components/chromeos_camera/common/jpeg_encode_accelerator.mojom.h" #include "media/capture/capture_export.h" #include "media/capture/video/chromeos/mojo/cros_camera_service.mojom.h" #include "media/capture/video/video_capture_device_factory.h" @@ -28,6 +29,9 @@ namespace media { +using MojoJpegEncodeAcceleratorFactoryCB = + base::RepeatingCallback<void(media::mojom::JpegEncodeAcceleratorRequest)>; + class CAPTURE_EXPORT CameraClientObserver { public: virtual ~CameraClientObserver();
diff --git a/media/capture/video/chromeos/mojo/BUILD.gn b/media/capture/video/chromeos/mojo/BUILD.gn index ccd75a9..43598d1 100644 --- a/media/capture/video/chromeos/mojo/BUILD.gn +++ b/media/capture/video/chromeos/mojo/BUILD.gn
@@ -15,6 +15,7 @@ ] deps = [ + "//components/chromeos_camera/common", "//media/capture/mojom:image_capture", "//media/mojo/interfaces", ]
diff --git a/media/capture/video/chromeos/mojo/cros_camera_service.mojom b/media/capture/video/chromeos/mojo/cros_camera_service.mojom index 6c76469..db69317 100644 --- a/media/capture/video/chromeos/mojo/cros_camera_service.mojom +++ b/media/capture/video/chromeos/mojo/cros_camera_service.mojom
@@ -6,9 +6,9 @@ module cros.mojom; +import "components/chromeos_camera/common/jpeg_encode_accelerator.mojom"; import "media/capture/video/chromeos/mojo/camera_common.mojom"; import "media/mojo/interfaces/mjpeg_decode_accelerator.mojom"; -import "media/mojo/interfaces/jpeg_encode_accelerator.mojom"; // The CrOS camera HAL v3 Mojo dispatcher. The dispatcher acts as a proxy and // waits for the server and the clients to register. There can only be one
diff --git a/media/capture/video/video_capture_device_factory.h b/media/capture/video/video_capture_device_factory.h index 3db8ecc..2f95f55 100644 --- a/media/capture/video/video_capture_device_factory.h +++ b/media/capture/video/video_capture_device_factory.h
@@ -10,15 +10,12 @@ #include "base/threading/thread_checker.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" #include "media/capture/video/video_capture_device.h" -#include "media/mojo/interfaces/jpeg_encode_accelerator.mojom.h" #include "media/mojo/interfaces/mjpeg_decode_accelerator.mojom.h" namespace media { using MojoMjpegDecodeAcceleratorFactoryCB = base::RepeatingCallback<void(media::mojom::MjpegDecodeAcceleratorRequest)>; -using MojoJpegEncodeAcceleratorFactoryCB = - base::RepeatingCallback<void(media::mojom::JpegEncodeAcceleratorRequest)>; // VideoCaptureDeviceFactory is the base class for creation of video capture // devices in the different platforms. VCDFs are created by MediaStreamManager
diff --git a/media/gpu/vaapi/vaapi_utils.cc b/media/gpu/vaapi/vaapi_utils.cc index 1bd831b8..2212d7f 100644 --- a/media/gpu/vaapi/vaapi_utils.cc +++ b/media/gpu/vaapi/vaapi_utils.cc
@@ -53,9 +53,10 @@ } ScopedVABufferMapping::~ScopedVABufferMapping() { - lock_->AssertAcquired(); - if (va_buffer_data_) + if (va_buffer_data_) { + lock_->AssertAcquired(); Unmap(); + } } VAStatus ScopedVABufferMapping::Unmap() { @@ -83,6 +84,7 @@ LOG(ERROR) << "vaCreateImage failed: " << vaErrorStr(result); return; } + DCHECK_NE(image_->image_id, VA_INVALID_ID); result = vaGetImage(va_display_, va_surface_id, 0, 0, size.width(), size.height(), image_->image_id); @@ -96,11 +98,13 @@ } ScopedVAImage::~ScopedVAImage() { - base::AutoLock auto_lock(*lock_); + if (image_->image_id != VA_INVALID_ID) { + base::AutoLock auto_lock(*lock_); - // |va_buffer_| has to be deleted before vaDestroyImage(). - va_buffer_.release(); - vaDestroyImage(va_display_, image_->image_id); + // |va_buffer_| has to be deleted before vaDestroyImage(). + va_buffer_.release(); + vaDestroyImage(va_display_, image_->image_id); + } } bool FillVP8DataStructuresAndPassToVaapiWrapper(
diff --git a/media/gpu/vaapi/vaapi_utils.h b/media/gpu/vaapi/vaapi_utils.h index 3d168763..0a86d42e 100644 --- a/media/gpu/vaapi/vaapi_utils.h +++ b/media/gpu/vaapi/vaapi_utils.h
@@ -84,7 +84,7 @@ private: base::Lock* lock_; - const VADisplay va_display_; + const VADisplay va_display_ GUARDED_BY(lock_); std::unique_ptr<VAImage> image_; std::unique_ptr<ScopedVABufferMapping> va_buffer_;
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc index 926bf405..57277a1 100644 --- a/media/gpu/vaapi/vaapi_wrapper.cc +++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -1443,13 +1443,16 @@ VASurfaceID va_surface_id, VAImageFormat* format, const gfx::Size& size) { - base::AutoLock auto_lock(*va_lock_); + std::unique_ptr<ScopedVAImage> scoped_image; + { + base::AutoLock auto_lock(*va_lock_); - VAStatus va_res = vaSyncSurface(va_display_, va_surface_id); - VA_SUCCESS_OR_RETURN(va_res, "Failed syncing surface", nullptr); + VAStatus va_res = vaSyncSurface(va_display_, va_surface_id); + VA_SUCCESS_OR_RETURN(va_res, "Failed syncing surface", nullptr); - auto scoped_image = std::make_unique<ScopedVAImage>( - va_lock_, va_display_, va_surface_id, format, size); + scoped_image = std::make_unique<ScopedVAImage>(va_lock_, va_display_, + va_surface_id, format, size); + } return scoped_image->IsValid() ? std::move(scoped_image) : nullptr; }
diff --git a/media/mojo/clients/mojo_renderer_factory.cc b/media/mojo/clients/mojo_renderer_factory.cc index 182b1e0..1947ec5 100644 --- a/media/mojo/clients/mojo_renderer_factory.cc +++ b/media/mojo/clients/mojo_renderer_factory.cc
@@ -19,10 +19,8 @@ namespace media { MojoRendererFactory::MojoRendererFactory( - const GetGpuFactoriesCB& get_gpu_factories_cb, media::mojom::InterfaceFactory* interface_factory) - : get_gpu_factories_cb_(get_gpu_factories_cb), - interface_factory_(interface_factory) { + : interface_factory_(interface_factory) { DCHECK(interface_factory_); } @@ -37,9 +35,7 @@ const gfx::ColorSpace& /* target_color_space */) { DCHECK(interface_factory_); - DCHECK(get_gpu_factories_cb_); - auto overlay_factory = - std::make_unique<VideoOverlayFactory>(get_gpu_factories_cb_.Run()); + auto overlay_factory = std::make_unique<VideoOverlayFactory>(); mojom::RendererPtr renderer_ptr; interface_factory_->CreateDefaultRenderer(std::string(),
diff --git a/media/mojo/clients/mojo_renderer_factory.h b/media/mojo/clients/mojo_renderer_factory.h index 4997725..16fdf0f0 100644 --- a/media/mojo/clients/mojo_renderer_factory.h +++ b/media/mojo/clients/mojo_renderer_factory.h
@@ -20,7 +20,6 @@ namespace media { -class GpuVideoAcceleratorFactories; class MojoRenderer; // The default factory class for creating MojoRenderer. @@ -34,12 +33,10 @@ // MediaPlayerRendererClientFactory for examples of small wrappers around MRF. class MojoRendererFactory : public RendererFactory { public: - using GetGpuFactoriesCB = base::Callback<GpuVideoAcceleratorFactories*()>; using GetTypeSpecificIdCB = base::Callback<std::string()>; - MojoRendererFactory(const GetGpuFactoriesCB& get_gpu_factories_cb, - media::mojom::InterfaceFactory* interface_factory); - + explicit MojoRendererFactory( + media::mojom::InterfaceFactory* interface_factory); ~MojoRendererFactory() final; std::unique_ptr<Renderer> CreateRenderer( @@ -64,8 +61,6 @@ #endif // defined (OS_ANDROID) private: - GetGpuFactoriesCB get_gpu_factories_cb_; - // InterfaceFactory or InterfaceProvider used to create or connect to remote // renderer. media::mojom::InterfaceFactory* interface_factory_ = nullptr;
diff --git a/media/mojo/interfaces/BUILD.gn b/media/mojo/interfaces/BUILD.gn index 3e3fae7..6da484e 100644 --- a/media/mojo/interfaces/BUILD.gn +++ b/media/mojo/interfaces/BUILD.gn
@@ -23,7 +23,6 @@ "demuxer_stream.mojom", "display_media_information.mojom", "interface_factory.mojom", - "jpeg_encode_accelerator.mojom", "key_system_support.mojom", "media_log.mojom", "media_metrics_provider.mojom",
diff --git a/media/mojo/interfaces/typemaps.gni b/media/mojo/interfaces/typemaps.gni index 20094ad8..f4879ad 100644 --- a/media/mojo/interfaces/typemaps.gni +++ b/media/mojo/interfaces/typemaps.gni
@@ -12,7 +12,6 @@ "//media/mojo/interfaces/demuxer_stream.typemap", "//media/mojo/interfaces/encryption_scheme.typemap", "//media/mojo/interfaces/hdr_metadata.typemap", - "//media/mojo/interfaces/jpeg_encode_accelerator.typemap", "//media/mojo/interfaces/media_drm_storage.typemap", "//media/mojo/interfaces/media_types.typemap", "//media/mojo/interfaces/mjpeg_decode_accelerator.typemap",
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn index 6884d4b6..2e0cabe 100644 --- a/media/mojo/services/BUILD.gn +++ b/media/mojo/services/BUILD.gn
@@ -45,8 +45,6 @@ "mojo_decryptor_service.h", "mojo_demuxer_stream_adapter.cc", "mojo_demuxer_stream_adapter.h", - "mojo_jpeg_encode_accelerator_service.cc", - "mojo_jpeg_encode_accelerator_service.h", "mojo_media_client.cc", "mojo_media_client.h", "mojo_media_log.cc", @@ -118,6 +116,14 @@ ] } + if (is_chromeos) { + sources += [ + "cros_mojo_jpeg_encode_accelerator_service.cc", + "cros_mojo_jpeg_encode_accelerator_service.h", + ] + deps += [ "//components/chromeos_camera/common" ] + } + if (enable_library_cdms) { sources += [ "cdm_service.cc",
diff --git a/media/mojo/services/DEPS b/media/mojo/services/DEPS index c57f39ec..12bf0a0 100644 --- a/media/mojo/services/DEPS +++ b/media/mojo/services/DEPS
@@ -1,6 +1,9 @@ specific_include_rules = { "media_manifest\.cc": [ "+chromecast/common/mojom", - ] + ], + "cros_mojo_jpeg_encode_accelerator_service\.h": [ + "+components/chromeos_camera/common", + ], }
diff --git a/media/mojo/services/mojo_jpeg_encode_accelerator_service.cc b/media/mojo/services/cros_mojo_jpeg_encode_accelerator_service.cc similarity index 91% rename from media/mojo/services/mojo_jpeg_encode_accelerator_service.cc rename to media/mojo/services/cros_mojo_jpeg_encode_accelerator_service.cc index 17efe96d2b..ae0ed92e 100644 --- a/media/mojo/services/mojo_jpeg_encode_accelerator_service.cc +++ b/media/mojo/services/cros_mojo_jpeg_encode_accelerator_service.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 "media/mojo/services/mojo_jpeg_encode_accelerator_service.h" +#include "media/mojo/services/cros_mojo_jpeg_encode_accelerator_service.h" #include <stdint.h> @@ -32,21 +32,21 @@ namespace media { // static -void MojoJpegEncodeAcceleratorService::Create( +void CrOSMojoJpegEncodeAcceleratorService::Create( mojom::JpegEncodeAcceleratorRequest request) { - auto* jpeg_encoder = new MojoJpegEncodeAcceleratorService(); + auto* jpeg_encoder = new CrOSMojoJpegEncodeAcceleratorService(); mojo::MakeStrongBinding(base::WrapUnique(jpeg_encoder), std::move(request)); } -MojoJpegEncodeAcceleratorService::MojoJpegEncodeAcceleratorService() +CrOSMojoJpegEncodeAcceleratorService::CrOSMojoJpegEncodeAcceleratorService() : accelerator_factory_functions_( GpuJpegEncodeAcceleratorFactory::GetAcceleratorFactories()) {} -MojoJpegEncodeAcceleratorService::~MojoJpegEncodeAcceleratorService() { +CrOSMojoJpegEncodeAcceleratorService::~CrOSMojoJpegEncodeAcceleratorService() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); } -void MojoJpegEncodeAcceleratorService::VideoFrameReady( +void CrOSMojoJpegEncodeAcceleratorService::VideoFrameReady( int32_t bitstream_buffer_id, size_t encoded_picture_size) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -54,14 +54,15 @@ ::media::JpegEncodeAccelerator::Status::ENCODE_OK); } -void MojoJpegEncodeAcceleratorService::NotifyError( +void CrOSMojoJpegEncodeAcceleratorService::NotifyError( int32_t bitstream_buffer_id, ::media::JpegEncodeAccelerator::Status error) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); NotifyEncodeStatus(bitstream_buffer_id, 0, error); } -void MojoJpegEncodeAcceleratorService::Initialize(InitializeCallback callback) { +void CrOSMojoJpegEncodeAcceleratorService::Initialize( + InitializeCallback callback) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); // When adding non-chromeos platforms, VideoCaptureGpuJpegEncoder::Initialize @@ -89,7 +90,7 @@ std::move(callback).Run(true); } -void MojoJpegEncodeAcceleratorService::EncodeWithFD( +void CrOSMojoJpegEncodeAcceleratorService::EncodeWithFD( int32_t buffer_id, mojo::ScopedHandle input_handle, uint32_t input_buffer_size, @@ -197,7 +198,7 @@ #endif } -void MojoJpegEncodeAcceleratorService::NotifyEncodeStatus( +void CrOSMojoJpegEncodeAcceleratorService::NotifyEncodeStatus( int32_t bitstream_buffer_id, size_t encoded_picture_size, ::media::JpegEncodeAccelerator::Status error) {
diff --git a/media/mojo/services/mojo_jpeg_encode_accelerator_service.h b/media/mojo/services/cros_mojo_jpeg_encode_accelerator_service.h similarity index 82% rename from media/mojo/services/mojo_jpeg_encode_accelerator_service.h rename to media/mojo/services/cros_mojo_jpeg_encode_accelerator_service.h index 7603f18a..2f9fc3c4 100644 --- a/media/mojo/services/mojo_jpeg_encode_accelerator_service.h +++ b/media/mojo/services/cros_mojo_jpeg_encode_accelerator_service.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 MEDIA_MOJO_SERVICES_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_ -#define MEDIA_MOJO_SERVICES_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_ +#ifndef MEDIA_MOJO_SERVICES_CROS_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_ +#define MEDIA_MOJO_SERVICES_CROS_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_ #include <stdint.h> @@ -12,8 +12,8 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/threading/thread_checker.h" +#include "components/chromeos_camera/common/jpeg_encode_accelerator.mojom.h" #include "media/gpu/gpu_jpeg_encode_accelerator_factory.h" -#include "media/mojo/interfaces/jpeg_encode_accelerator.mojom.h" #include "media/mojo/services/media_mojo_export.h" #include "media/video/jpeg_encode_accelerator.h" @@ -21,13 +21,13 @@ // Implementation of a mojom::JpegEncodeAccelerator which runs in the GPU // process, and wraps a JpegEncodeAccelerator. -class MEDIA_MOJO_EXPORT MojoJpegEncodeAcceleratorService +class MEDIA_MOJO_EXPORT CrOSMojoJpegEncodeAcceleratorService : public mojom::JpegEncodeAccelerator, public JpegEncodeAccelerator::Client { public: static void Create(mojom::JpegEncodeAcceleratorRequest request); - ~MojoJpegEncodeAcceleratorService() override; + ~CrOSMojoJpegEncodeAcceleratorService() override; // JpegEncodeAccelerator::Client implementation. void VideoFrameReady(int32_t buffer_id, size_t encoded_picture_size) override; @@ -40,7 +40,7 @@ // This constructor internally calls // GpuJpegEncodeAcceleratorFactory::GetAcceleratorFactories() to // fill |accelerator_factory_functions_|. - MojoJpegEncodeAcceleratorService(); + CrOSMojoJpegEncodeAcceleratorService(); // mojom::JpegEncodeAccelerator implementation. void Initialize(InitializeCallback callback) override; @@ -69,9 +69,9 @@ THREAD_CHECKER(thread_checker_); - DISALLOW_COPY_AND_ASSIGN(MojoJpegEncodeAcceleratorService); + DISALLOW_COPY_AND_ASSIGN(CrOSMojoJpegEncodeAcceleratorService); }; } // namespace media -#endif // MEDIA_MOJO_SERVICES_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_ +#endif // MEDIA_MOJO_SERVICES_CROS_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_
diff --git a/media/renderers/video_overlay_factory.cc b/media/renderers/video_overlay_factory.cc index 8cfb62f..be39534 100644 --- a/media/renderers/video_overlay_factory.cc +++ b/media/renderers/video_overlay_factory.cc
@@ -4,75 +4,14 @@ #include "media/renderers/video_overlay_factory.h" -#include "base/single_thread_task_runner.h" -#include "gpu/GLES2/gl2extchromium.h" -#include "gpu/command_buffer/client/gles2_interface.h" -#include "gpu/command_buffer/common/mailbox.h" -#include "gpu/command_buffer/common/sync_token.h" +#include "base/time/time.h" #include "media/base/video_frame.h" -#include "media/video/gpu_video_accelerator_factories.h" +#include "ui/gfx/geometry/size.h" namespace media { -class VideoOverlayFactory::Texture { - public: - explicit Texture(GpuVideoAcceleratorFactories* gpu_factories) - : gpu_factories_(gpu_factories), image_id_(0), texture_id_(0) { - DCHECK(gpu_factories_); - DCHECK(gpu_factories_->GetTaskRunner()->BelongsToCurrentThread()); - - gpu::gles2::GLES2Interface* gl = gpu_factories_->ContextGL(); - if (!gl) - return; - gpu_memory_buffer_ = gpu_factories_->CreateGpuMemoryBuffer( - gfx::Size(1, 1), gfx::BufferFormat::BGRA_8888, - gfx::BufferUsage::SCANOUT); - if (gpu_memory_buffer_) { - image_id_ = gl->CreateImageCHROMIUM(gpu_memory_buffer_->AsClientBuffer(), - 1, 1, GL_BGRA_EXT); - } - if (image_id_) { - gl->GenTextures(1, &texture_id_); - gl->BindTexture(GL_TEXTURE_2D, texture_id_); - gl->BindTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id_); - - gl->ProduceTextureDirectCHROMIUM(texture_id_, mailbox_.name); - - gl->GenSyncTokenCHROMIUM(sync_token_.GetData()); - } - } - - ~Texture() { - DCHECK(gpu_factories_->GetTaskRunner()->BelongsToCurrentThread()); - - if (image_id_) { - gpu::gles2::GLES2Interface* gl = gpu_factories_->ContextGL(); - if (!gl) - return; - gl->BindTexture(GL_TEXTURE_2D, texture_id_); - gl->ReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id_); - gl->DeleteTextures(1, &texture_id_); - gl->DestroyImageCHROMIUM(image_id_); - } - } - - bool IsValid() const { return image_id_ != 0; } - - private: - friend class VideoOverlayFactory; - GpuVideoAcceleratorFactories* gpu_factories_; - - std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_; - GLuint image_id_; - GLuint texture_id_; - gpu::Mailbox mailbox_; - gpu::SyncToken sync_token_; -}; - -VideoOverlayFactory::VideoOverlayFactory( - GpuVideoAcceleratorFactories* gpu_factories) - : overlay_plane_id_(base::UnguessableToken::Create()), - gpu_factories_(gpu_factories) {} +VideoOverlayFactory::VideoOverlayFactory() + : overlay_plane_id_(base::UnguessableToken::Create()) {} VideoOverlayFactory::~VideoOverlayFactory() = default; @@ -81,48 +20,18 @@ // Frame size empty => video has one dimension = 0. // Dimension 0 case triggers a DCHECK later on if we push through the overlay // path. - Texture* texture = size.IsEmpty() ? nullptr : GetTexture(); - if (!texture) { + if (size.IsEmpty()) { DVLOG(1) << "Create black frame " << size.width() << "x" << size.height(); return VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); } - DCHECK(texture); - DCHECK(texture->IsValid()); DVLOG(2) << "Create video overlay frame: " << size.ToString(); - gpu::MailboxHolder holders[VideoFrame::kMaxPlanes] = {gpu::MailboxHolder( - texture->mailbox_, texture->sync_token_, GL_TEXTURE_2D)}; - scoped_refptr<VideoFrame> frame = VideoFrame::WrapNativeTextures( - PIXEL_FORMAT_XRGB, holders, VideoFrame::ReleaseMailboxCB(), - size, // coded_size - gfx::Rect(size), // visible rect - size, // natural size - base::TimeDelta()); // timestamp - CHECK(frame); - frame->metadata()->SetBoolean(VideoFrameMetadata::ALLOW_OVERLAY, true); - // On platforms that use the video hole, the video never makes it in the media - // pipeline as it is side loaded straight into the hardware video plane. This - // is intended for protected video such that userspace cannot copy potentially - // protected content. While the video may not be protected, since it goes - // through the protected video path, the video always looks like a protected - // video from the perspective of VideoOverlayFactory which produces a dummy - // video frame in its place. - frame->metadata()->SetBoolean(VideoFrameMetadata::PROTECTED_VIDEO, true); - frame->metadata()->SetBoolean(VideoFrameMetadata::HW_PROTECTED, true); - frame->metadata()->SetUnguessableToken(VideoFrameMetadata::OVERLAY_PLANE_ID, - overlay_plane_id_); + scoped_refptr<VideoFrame> frame = + VideoFrame::CreateVideoHoleFrame(overlay_plane_id_, + size, // natural size + base::TimeDelta()); // timestamp + DCHECK(frame); return frame; } -VideoOverlayFactory::Texture* VideoOverlayFactory::GetTexture() { - if (!gpu_factories_) - return nullptr; - - // Lazily create overlay texture. - if (!texture_) - texture_.reset(new Texture(gpu_factories_)); - - return texture_->IsValid() ? texture_.get() : nullptr; -} - } // namespace media
diff --git a/media/renderers/video_overlay_factory.h b/media/renderers/video_overlay_factory.h index ede6492..e11ee06 100644 --- a/media/renderers/video_overlay_factory.h +++ b/media/renderers/video_overlay_factory.h
@@ -16,16 +16,13 @@ namespace media { -class GpuVideoAcceleratorFactories; class VideoFrame; // Creates video overlay frames - native textures that get turned into // transparent holes in the browser compositor using overlay system. -// This class must be used on GpuVideoAcceleratorFactories::GetTaskRunner(). class MEDIA_EXPORT VideoOverlayFactory { public: - explicit VideoOverlayFactory( - ::media::GpuVideoAcceleratorFactories* gpu_factories); + VideoOverlayFactory(); ~VideoOverlayFactory(); scoped_refptr<::media::VideoFrame> CreateFrame(const gfx::Size& size); @@ -34,13 +31,8 @@ } private: - class Texture; - Texture* GetTexture(); - // |overlay_plane_id_| identifies the instances of VideoOverlayFactory. const base::UnguessableToken overlay_plane_id_; - ::media::GpuVideoAcceleratorFactories* gpu_factories_; - std::unique_ptr<Texture> texture_; DISALLOW_COPY_AND_ASSIGN(VideoOverlayFactory); };
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc index 127e7da..5220564 100644 --- a/media/renderers/video_resource_updater.cc +++ b/media/renderers/video_resource_updater.cc
@@ -19,7 +19,6 @@ #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/process_memory_dump.h" #include "base/trace_event/trace_event.h" -#include "base/unguessable_token.h" #include "build/build_config.h" #include "cc/base/math_util.h" #include "cc/paint/skia_paint_canvas.h" @@ -443,6 +442,13 @@ void VideoResourceUpdater::ObtainFrameResources( scoped_refptr<VideoFrame> video_frame) { + if (video_frame->metadata()->GetUnguessableToken( + VideoFrameMetadata::OVERLAY_PLANE_ID, &overlay_plane_id_)) { + // This is a hole punching VideoFrame, there is nothing to display. + frame_resource_type_ = VideoFrameResourceType::VIDEO_HOLE; + return; + } + VideoFrameExternalResources external_resources = CreateExternalResourcesFromVideoFrame(video_frame); frame_resource_type_ = external_resources.type; @@ -508,6 +514,13 @@ const gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); switch (frame_resource_type_) { + case VideoFrameResourceType::VIDEO_HOLE: { + auto* video_hole_quad = + render_pass->CreateAndAppendDrawQuad<viz::VideoHoleDrawQuad>(); + video_hole_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, + overlay_plane_id_); + break; + } case VideoFrameResourceType::YUV: { const gfx::Size ya_tex_size = coded_size; @@ -593,30 +606,16 @@ protected_video_type = ui::ProtectedVideoType::kSoftwareProtected; } - base::UnguessableToken overlay_plane_id; - if (frame->metadata()->GetUnguessableToken( - VideoFrameMetadata::OVERLAY_PLANE_ID, &overlay_plane_id)) { - // Valid |overlay_plane_id| is present, this frame is generated by cast - // and we should punch the video hole accordingly. - auto* video_hole_quad = - render_pass->CreateAndAppendDrawQuad<viz::VideoHoleDrawQuad>(); - video_hole_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, - overlay_plane_id); - } else { - // TODO(guohuideng): Consider replacing TextureDrawQuad with - // VideoHoleDrawQuad here if the quad is for video hole punching - // purpose. - auto* texture_quad = - render_pass->CreateAndAppendDrawQuad<viz::TextureDrawQuad>(); - texture_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, - needs_blending, frame_resources_[0].id, - premultiplied_alpha, uv_top_left, uv_bottom_right, - SK_ColorTRANSPARENT, opacity, flipped, - nearest_neighbor, false, protected_video_type); - texture_quad->set_resource_size_in_pixels(coded_size); - for (viz::ResourceId resource_id : texture_quad->resources) { - resource_provider_->ValidateResource(resource_id); - } + auto* texture_quad = + render_pass->CreateAndAppendDrawQuad<viz::TextureDrawQuad>(); + texture_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, + needs_blending, frame_resources_[0].id, + premultiplied_alpha, uv_top_left, uv_bottom_right, + SK_ColorTRANSPARENT, opacity, flipped, + nearest_neighbor, false, protected_video_type); + texture_quad->set_resource_size_in_pixels(coded_size); + for (viz::ResourceId resource_id : texture_quad->resources) { + resource_provider_->ValidateResource(resource_id); } break;
diff --git a/media/renderers/video_resource_updater.h b/media/renderers/video_resource_updater.h index 634c1ad9..783780c 100644 --- a/media/renderers/video_resource_updater.h +++ b/media/renderers/video_resource_updater.h
@@ -17,6 +17,7 @@ #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "base/trace_event/memory_dump_provider.h" +#include "base/unguessable_token.h" #include "components/viz/common/resources/release_callback.h" #include "components/viz/common/resources/resource_format.h" #include "components/viz/common/resources/resource_id.h" @@ -52,6 +53,10 @@ RGBA_PREMULTIPLIED, RGBA, STREAM_TEXTURE, + // The VideoFrame is merely a hint to compositor that a hole must be made + // transparent so the video underlay will be visible. + // Used by Chromecast only. + VIDEO_HOLE, }; class MEDIA_EXPORT VideoFrameExternalResources { @@ -214,6 +219,10 @@ // Resources that will be placed into quads by the next call to // AppendDrawQuads(). std::vector<FrameResource> frame_resources_; + // If the video resource is a hole punching VideoFrame sent by Chromecast, + // the VideoFrame carries an |overlay_plane_id_| to activate the video + // overlay, but there is no video content to display within VideoFrame. + base::UnguessableToken overlay_plane_id_; // Resources allocated by VideoResourceUpdater. Used to recycle resources so // we can reduce the number of allocations and data transfers.
diff --git a/mojo/core/channel_fuchsia.cc b/mojo/core/channel_fuchsia.cc index eb30cb9..e6037317 100644 --- a/mojo/core/channel_fuchsia.cc +++ b/mojo/core/channel_fuchsia.cc
@@ -300,8 +300,8 @@ zx_handle_t handles[ZX_CHANNEL_MAX_MSG_HANDLES] = {}; zx_status_t read_result = - handle_.read(0, buffer, buffer_capacity, &bytes_read, handles, - base::size(handles), &handles_read); + handle_.rea2(0, buffer, handles, buffer_capacity, base::size(handles), + &bytes_read, &handles_read); if (read_result == ZX_OK) { for (size_t i = 0; i < handles_read; ++i) { incoming_handles_.emplace_back(handles[i]);
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni index d8c1bfd..c2a0f444 100644 --- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni +++ b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
@@ -13,6 +13,7 @@ "//chromeos/components/multidevice/mojom/typemaps.gni", "//chromeos/services/secure_channel/public/mojom/typemaps.gni", "//components/arc/common/typemaps.gni", + "//components/chromeos_camera/common/typemaps.gni", "//components/sync/mojo/typemaps.gni", "//components/typemaps.gni", "//content/common/bluetooth/typemaps.gni",
diff --git a/net/dns/context_host_resolver.cc b/net/dns/context_host_resolver.cc index 658ac8f..4e19564c 100644 --- a/net/dns/context_host_resolver.cc +++ b/net/dns/context_host_resolver.cc
@@ -112,7 +112,7 @@ // TODO(crbug.com/934402): DHCECK |context_| once universally set. auto request = std::make_unique<WrappedRequest>( manager_->CreateRequest(host, source_net_log, optional_parameters, - context_), + context_, host_cache_.get()), this); active_requests_.insert(request.get()); return request;
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc index 0cb763a..3c75dde 100644 --- a/net/dns/host_resolver_manager.cc +++ b/net/dns/host_resolver_manager.cc
@@ -499,12 +499,14 @@ const HostPortPair& request_host, const base::Optional<ResolveHostParameters>& optional_parameters, URLRequestContext* request_context, + HostCache* host_cache, base::WeakPtr<HostResolverManager> resolver) : source_net_log_(source_net_log), request_host_(request_host), parameters_(optional_parameters ? optional_parameters.value() : ResolveHostParameters()), request_context_(request_context), + host_cache_(host_cache), host_resolver_flags_( HostResolver::ParametersToHostResolverFlags(parameters_)), priority_(parameters_.initial_priority), @@ -636,6 +638,8 @@ URLRequestContext* request_context() const { return request_context_; } + HostCache* host_cache() const { return host_cache_; } + HostResolverFlags host_resolver_flags() const { return host_resolver_flags_; } RequestPriority priority() const { return priority_; } @@ -659,6 +663,7 @@ const HostPortPair request_host_; const ResolveHostParameters parameters_; URLRequestContext* const request_context_; + HostCache* const host_cache_; const HostResolverFlags host_resolver_flags_; RequestPriority priority_; @@ -2317,10 +2322,11 @@ const HostPortPair& host, const NetLogWithSource& net_log, const base::Optional<ResolveHostParameters>& optional_parameters, - URLRequestContext* request_context) { + URLRequestContext* request_context, + HostCache* host_cache) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); return std::make_unique<RequestImpl>(net_log, host, optional_parameters, - request_context, + request_context, host_cache, weak_ptr_factory_.GetWeakPtr()); }
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h index 6339c87..6cdec34 100644 --- a/net/dns/host_resolver_manager.h +++ b/net/dns/host_resolver_manager.h
@@ -123,7 +123,8 @@ const HostPortPair& host, const NetLogWithSource& net_log, const base::Optional<ResolveHostParameters>& optional_parameters, - URLRequestContext* request_context); + URLRequestContext* request_context, + HostCache* host_cache); std::unique_ptr<MdnsListener> CreateMdnsListener(const HostPortPair& host, DnsQueryType query_type); void SetDnsClientEnabled(bool enabled);
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc index 1fc4c71f..1f49aef 100644 --- a/net/dns/host_resolver_manager_unittest.cc +++ b/net/dns/host_resolver_manager_unittest.cc
@@ -490,6 +490,7 @@ void SetUp() override { CreateResolver(); request_context_ = std::make_unique<TestURLRequestContext>(); + host_cache_ = HostCache::CreateDefaultCache(); } void TearDown() override { @@ -537,6 +538,7 @@ void MakeCacheStale() { DCHECK(resolver_.get()); resolver_->GetHostCache()->OnNetworkChange(); + host_cache_->OnNetworkChange(); } IPEndPoint CreateExpected(const std::string& ip_literal, uint16_t port) { @@ -549,6 +551,7 @@ scoped_refptr<MockHostResolverProc> proc_; std::unique_ptr<HostResolverManager> resolver_; std::unique_ptr<URLRequestContext> request_context_; + std::unique_ptr<HostCache> host_cache_; }; TEST_F(HostResolverManagerTest, AsynchronousLookup) { @@ -557,7 +560,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), @@ -579,7 +582,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_EQ(1u, resolver_->num_jobs_for_testing()); EXPECT_THAT(response.result_error(), IsOk()); @@ -592,10 +595,10 @@ ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper response2(resolver_->CreateRequest( HostPortPair("just.testing", 85), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_EQ(1u, resolver_->num_jobs_for_testing()); EXPECT_THAT(response1.result_error(), IsOk()); @@ -610,7 +613,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_EQ(1u, resolver_->num_jobs_for_testing()); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); @@ -622,7 +625,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_EQ(1u, resolver_->num_jobs_for_testing()); NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); @@ -639,14 +642,14 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::A; - ResolveHostResponseHelper v4_response( - resolver_->CreateRequest(HostPortPair("host", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper v4_response(resolver_->CreateRequest( + HostPortPair("host", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); parameters.dns_query_type = DnsQueryType::AAAA; - ResolveHostResponseHelper v6_response( - resolver_->CreateRequest(HostPortPair("host", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper v6_response(resolver_->CreateRequest( + HostPortPair("host", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(2u); @@ -665,7 +668,7 @@ parameters.dns_query_type = DnsQueryType::A; ResolveHostResponseHelper v6_v4_response(resolver_->CreateRequest( HostPortPair("localhost6", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v6_v4_response.result_error(), IsOk()); EXPECT_THAT(v6_v4_response.request()->GetAddressResults().value().endpoints(), testing::IsEmpty()); @@ -673,14 +676,14 @@ parameters.dns_query_type = DnsQueryType::AAAA; ResolveHostResponseHelper v6_v6_response(resolver_->CreateRequest( HostPortPair("localhost6", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v6_v6_response.result_error(), IsOk()); EXPECT_THAT(v6_v6_response.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("::1", 80))); ResolveHostResponseHelper v6_unsp_response(resolver_->CreateRequest( HostPortPair("localhost6", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v6_unsp_response.result_error(), IsOk()); EXPECT_THAT( v6_unsp_response.request()->GetAddressResults().value().endpoints(), @@ -689,7 +692,7 @@ parameters.dns_query_type = DnsQueryType::A; ResolveHostResponseHelper v4_v4_response(resolver_->CreateRequest( HostPortPair("localhost", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v4_v4_response.result_error(), IsOk()); EXPECT_THAT(v4_v4_response.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("127.0.0.1", 80))); @@ -697,14 +700,14 @@ parameters.dns_query_type = DnsQueryType::AAAA; ResolveHostResponseHelper v4_v6_response(resolver_->CreateRequest( HostPortPair("localhost", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v4_v6_response.result_error(), IsOk()); EXPECT_THAT(v4_v6_response.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("::1", 80))); ResolveHostResponseHelper v4_unsp_response(resolver_->CreateRequest( HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v4_unsp_response.result_error(), IsOk()); EXPECT_THAT( v4_unsp_response.request()->GetAddressResults().value().endpoints(), @@ -721,9 +724,9 @@ HostResolver::ResolveHostParameters parameters; parameters.source = HostResolverSource::SYSTEM; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair(kIpLiteral, 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair(kIpLiteral, 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); // IP literal resolution is expected to take precedence over source, so the // result is expected to be the input IP, not the result IP from the proc rule @@ -739,7 +742,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); @@ -755,7 +758,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetStaleInfo()); @@ -773,7 +776,7 @@ TEST_F(HostResolverManagerTest, AbortedAsynchronousLookup) { ResolveHostResponseHelper response0(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response0.complete()); ASSERT_TRUE(proc_->WaitFor(1u)); @@ -786,7 +789,7 @@ CreateResolver(); ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(2u); @@ -799,7 +802,7 @@ TEST_F(HostResolverManagerTest, NumericIPv4Address) { ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("127.1.2.3", 5555), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), @@ -811,7 +814,7 @@ // the caller should have removed them. ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("2001:db8::1", 5555), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), @@ -821,7 +824,7 @@ TEST_F(HostResolverManagerTest, EmptyHost) { ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair(std::string(), 5555), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); @@ -831,7 +834,7 @@ for (int i = 0; i < 16; ++i) { ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair(std::string(i, '.'), 5555), NetLogWithSource(), - base::nullopt, request_context_.get())); + base::nullopt, request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); @@ -841,7 +844,7 @@ TEST_F(HostResolverManagerTest, LongHost) { ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair(std::string(4097, 'a'), 5555), NetLogWithSource(), - base::nullopt, request_context_.get())); + base::nullopt, request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); @@ -851,21 +854,26 @@ // Start 5 requests, duplicating hosts "a" and "b". Since the resolver_proc is // blocked, these should all pile up until we signal it. std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 81), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 82), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 83), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 81), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 82), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 83), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); for (auto& response : responses) { ASSERT_FALSE(response->complete()); @@ -880,21 +888,26 @@ TEST_F(HostResolverManagerTest, CancelMultipleRequests) { std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 81), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 82), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 83), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 81), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 82), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 83), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); for (auto& response : responses) { ASSERT_FALSE(response->complete()); @@ -924,14 +937,16 @@ std::string hostname = "a_"; hostname[1] = 'a' + i; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair(hostname, 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); ASSERT_FALSE(responses.back()->complete()); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair(hostname, 81), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair(hostname, 81), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); ASSERT_FALSE(responses.back()->complete()); } @@ -971,15 +986,18 @@ ResolveHostResponseHelper cancelling_response( resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), std::move(custom_callback)); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 81), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 82), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 81), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 82), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); proc_->SignalMultiple(2u); // One for "a". One for "finalrequest". @@ -987,7 +1005,7 @@ ResolveHostResponseHelper final_response(resolver_->CreateRequest( HostPortPair("finalrequest", 70), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(final_response.result_error(), IsOk()); for (auto& response : responses) { @@ -1013,18 +1031,21 @@ ResolveHostResponseHelper deleting_response( resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), std::move(custom_callback)); // Start additional requests to be cancelled as part of the first's deletion. // Assumes all requests for a job are handled in order so that the deleting // request will run first and cancel the rest. - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 81), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 82), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 81), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 82), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); proc_->SignalMultiple(3u); @@ -1060,18 +1081,22 @@ ResolveHostResponseHelper deleting_response( resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), std::move(custom_callback)); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 81), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 82), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 83), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 81), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 82), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 83), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); // Wait for all calls to queue up, trigger abort via IP address change, then // signal all the queued requests to let them all try to finish. @@ -1091,15 +1116,16 @@ auto custom_callback = base::BindLambdaForTesting( [&](CompletionOnceCallback completion_callback, int error) { new_response = std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("new", 70), - NetLogWithSource(), base::nullopt, - request_context_.get())); + resolver_->CreateRequest( + HostPortPair("new", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); std::move(completion_callback).Run(error); }); ResolveHostResponseHelper starting_response( resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), std::move(custom_callback)); proc_->SignalMultiple(2u); // One for "a". One for "new". @@ -1116,28 +1142,29 @@ auto custom_callback = base::BindLambdaForTesting( [&](CompletionOnceCallback completion_callback, int error) { new_response = std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("new", 70), - NetLogWithSource(), base::nullopt, - request_context_.get())); + resolver_->CreateRequest( + HostPortPair("new", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); std::move(completion_callback).Run(error); }); - ResolveHostResponseHelper initial_response( - resolver_->CreateRequest(HostPortPair("initial", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response(resolver_->CreateRequest( + HostPortPair("initial", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper evictee1_response( resolver_->CreateRequest(HostPortPair("evictee1", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), std::move(custom_callback)); - ResolveHostResponseHelper evictee2_response( - resolver_->CreateRequest(HostPortPair("evictee2", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper evictee2_response(resolver_->CreateRequest( + HostPortPair("evictee2", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); // Now one running request ("initial") and two queued requests ("evictee1" and // "evictee2"). Any further requests will cause evictions. - ResolveHostResponseHelper evictor_response( - resolver_->CreateRequest(HostPortPair("evictor", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper evictor_response(resolver_->CreateRequest( + HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(evictee1_response.result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); @@ -1162,25 +1189,26 @@ auto custom_callback = base::BindLambdaForTesting( [&](CompletionOnceCallback completion_callback, int error) { new_response = std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("new", 70), - NetLogWithSource(), base::nullopt, - request_context_.get())); + resolver_->CreateRequest( + HostPortPair("new", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); std::move(completion_callback).Run(error); }); - ResolveHostResponseHelper initial_response( - resolver_->CreateRequest(HostPortPair("initial", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response(resolver_->CreateRequest( + HostPortPair("initial", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper evictee_response( resolver_->CreateRequest(HostPortPair("evictee", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), std::move(custom_callback)); // Now one running request ("initial") and one queued requests ("evictee"). // Any further requests will cause evictions. - ResolveHostResponseHelper evictor_response( - resolver_->CreateRequest(HostPortPair("evictor", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper evictor_response(resolver_->CreateRequest( + HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(evictee_response.result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); @@ -1202,28 +1230,29 @@ auto custom_callback = base::BindLambdaForTesting( [&](CompletionOnceCallback completion_callback, int error) { new_response = std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("evictor", 70), - NetLogWithSource(), base::nullopt, - request_context_.get())); + resolver_->CreateRequest( + HostPortPair("evictor", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); std::move(completion_callback).Run(error); }); - ResolveHostResponseHelper initial_response( - resolver_->CreateRequest(HostPortPair("initial", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response(resolver_->CreateRequest( + HostPortPair("initial", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper evictee_response( resolver_->CreateRequest(HostPortPair("evictee", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), std::move(custom_callback)); ResolveHostResponseHelper additional_response(resolver_->CreateRequest( HostPortPair("additional", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); // Now one running request ("initial") and two queued requests ("evictee" and // "additional"). Any further requests will cause evictions. - ResolveHostResponseHelper evictor_response( - resolver_->CreateRequest(HostPortPair("evictor", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper evictor_response(resolver_->CreateRequest( + HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(evictee_response.result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); @@ -1241,15 +1270,15 @@ TEST_F(HostResolverManagerTest, BypassCache) { proc_->SignalMultiple(2u); - ResolveHostResponseHelper initial_response( - resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response(resolver_->CreateRequest( + HostPortPair("a", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(initial_response.result_error(), IsOk()); EXPECT_EQ(1u, proc_->GetCaptureList().size()); - ResolveHostResponseHelper cached_response( - resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper cached_response(resolver_->CreateRequest( + HostPortPair("a", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(cached_response.result_error(), IsOk()); // Expect no increase to calls to |proc_| because result was cached. EXPECT_EQ(1u, proc_->GetCaptureList().size()); @@ -1257,9 +1286,9 @@ HostResolver::ResolveHostParameters parameters; parameters.cache_usage = HostResolver::ResolveHostParameters::CacheUsage::DISALLOWED; - ResolveHostResponseHelper cache_bypassed_response( - resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper cache_bypassed_response(resolver_->CreateRequest( + HostPortPair("a", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(cache_bypassed_response.result_error(), IsOk()); // Expect call to |proc_| because cache was bypassed. EXPECT_EQ(2u, proc_->GetCaptureList().size()); @@ -1270,23 +1299,23 @@ TEST_F(HostResolverManagerTest, FlushCacheOnIPAddressChange) { proc_->SignalMultiple(2u); // One before the flush, one after. - ResolveHostResponseHelper initial_response( - resolver_->CreateRequest(HostPortPair("host1", 70), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response(resolver_->CreateRequest( + HostPortPair("host1", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(initial_response.result_error(), IsOk()); EXPECT_EQ(1u, proc_->GetCaptureList().size()); - ResolveHostResponseHelper cached_response( - resolver_->CreateRequest(HostPortPair("host1", 75), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper cached_response(resolver_->CreateRequest( + HostPortPair("host1", 75), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(cached_response.result_error(), IsOk()); EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase. // Verify initial DNS config read does not flush cache. NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests(); - ResolveHostResponseHelper unflushed_response( - resolver_->CreateRequest(HostPortPair("host1", 75), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper unflushed_response(resolver_->CreateRequest( + HostPortPair("host1", 75), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(unflushed_response.result_error(), IsOk()); EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase. @@ -1296,18 +1325,18 @@ // Resolve "host1" again -- this time it won't be served from cache, so it // will complete asynchronously. - ResolveHostResponseHelper flushed_response( - resolver_->CreateRequest(HostPortPair("host1", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper flushed_response(resolver_->CreateRequest( + HostPortPair("host1", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(flushed_response.result_error(), IsOk()); EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase. } // Test that IP address changes send ERR_NETWORK_CHANGED to pending requests. TEST_F(HostResolverManagerTest, AbortOnIPAddressChanged) { - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host1", 70), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host1", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); ASSERT_TRUE(proc_->WaitFor(1u)); @@ -1324,9 +1353,9 @@ // Test that initial DNS config read signals do not abort pending requests. TEST_F(HostResolverManagerTest, DontAbortOnInitialDNSConfigRead) { - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host1", 70), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host1", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); ASSERT_TRUE(proc_->WaitFor(1u)); @@ -1346,15 +1375,18 @@ CreateSerialResolver(); std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("b", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("c", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("a", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("b", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("c", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); for (auto& response : responses) { ASSERT_FALSE(response->complete()); @@ -1388,7 +1420,8 @@ CompletionOnceCallback completion_callback, int error) { *next_response = std::make_unique<ResolveHostResponseHelper>( resolver_->CreateRequest(next_host, NetLogWithSource(), - base::nullopt, request_context_.get())); + base::nullopt, request_context_.get(), + host_cache_.get())); std::move(completion_callback).Run(error); }); @@ -1396,19 +1429,22 @@ ResolveHostResponseHelper response0( resolver_->CreateRequest(HostPortPair("bbb", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), base::BindOnce(custom_callback_template, HostPortPair("zzz", 80), &next_responses[0])); ResolveHostResponseHelper response1( resolver_->CreateRequest(HostPortPair("eee", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), base::BindOnce(custom_callback_template, HostPortPair("aaa", 80), &next_responses[1])); ResolveHostResponseHelper response2( resolver_->CreateRequest(HostPortPair("ccc", 80), NetLogWithSource(), - base::nullopt, request_context_.get()), + base::nullopt, request_context_.get(), + host_cache_.get()), base::BindOnce(custom_callback_template, HostPortPair("eee", 80), &next_responses[2])); @@ -1456,30 +1492,38 @@ // requests we make will not complete. std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req0", 80), NetLogWithSource(), - low_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req1", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req2", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req3", 80), NetLogWithSource(), - low_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req4", 80), NetLogWithSource(), - highest_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req5", 80), NetLogWithSource(), - low_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req6", 80), NetLogWithSource(), - low_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req5", 80), NetLogWithSource(), - highest_priority, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req0", 80), NetLogWithSource(), low_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req1", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req2", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req3", 80), NetLogWithSource(), low_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req4", 80), NetLogWithSource(), highest_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req5", 80), NetLogWithSource(), low_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req6", 80), NetLogWithSource(), low_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req5", 80), NetLogWithSource(), highest_priority, + request_context_.get(), host_cache_.get()))); for (const auto& response : responses) { ASSERT_FALSE(response->complete()); @@ -1521,15 +1565,18 @@ medium_priority.initial_priority = MEDIUM; std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req0", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req1", 80), NetLogWithSource(), - low_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req2", 80), NetLogWithSource(), - lowest_priority, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req0", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req1", 80), NetLogWithSource(), low_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req2", 80), NetLogWithSource(), lowest_priority, + request_context_.get(), host_cache_.get()))); // req0 starts immediately; without ChangePriority, req1 and then req2 should // run. @@ -1570,27 +1617,34 @@ highest_priority.initial_priority = HIGHEST; std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req0", 80), NetLogWithSource(), - lowest_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req1", 80), NetLogWithSource(), - highest_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req2", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req3", 80), NetLogWithSource(), - low_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req4", 80), NetLogWithSource(), - highest_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req5", 80), NetLogWithSource(), - lowest_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req6", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req0", 80), NetLogWithSource(), lowest_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req1", 80), NetLogWithSource(), highest_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req2", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req3", 80), NetLogWithSource(), low_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req4", 80), NetLogWithSource(), highest_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req5", 80), NetLogWithSource(), lowest_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req6", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); // Cancel some requests responses[1]->CancelRequest(); @@ -1646,46 +1700,54 @@ // requests we make will not complete. std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req0", 80), NetLogWithSource(), - lowest_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req1", 80), NetLogWithSource(), - highest_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req2", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req3", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req0", 80), NetLogWithSource(), lowest_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req1", 80), NetLogWithSource(), highest_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req2", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req3", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); // At this point, there are 3 enqueued jobs (and one "running" job). // Insertion of subsequent requests will cause evictions. - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req4", 80), NetLogWithSource(), - low_priority, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req4", 80), NetLogWithSource(), low_priority, + request_context_.get(), host_cache_.get()))); EXPECT_THAT(responses[4]->result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self. EXPECT_FALSE(responses[4]->request()->GetAddressResults()); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req5", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req5", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); EXPECT_THAT(responses[2]->result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); EXPECT_FALSE(responses[2]->request()->GetAddressResults()); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req6", 80), NetLogWithSource(), - highest_priority, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req6", 80), NetLogWithSource(), highest_priority, + request_context_.get(), host_cache_.get()))); EXPECT_THAT(responses[3]->result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); EXPECT_FALSE(responses[3]->request()->GetAddressResults()); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("req7", 80), NetLogWithSource(), - medium_priority, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("req7", 80), NetLogWithSource(), medium_priority, + request_context_.get(), host_cache_.get()))); EXPECT_THAT(responses[5]->result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); EXPECT_FALSE(responses[5]->request()->GetAddressResults()); @@ -1729,13 +1791,13 @@ // Note that at this point the MockHostResolverProc is blocked, so any // requests we make will not complete. - ResolveHostResponseHelper run_response( - resolver_->CreateRequest(HostPortPair("run", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper run_response(resolver_->CreateRequest( + HostPortPair("run", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); - ResolveHostResponseHelper evict_response( - resolver_->CreateRequest(HostPortPair("req1", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper evict_response(resolver_->CreateRequest( + HostPortPair("req1", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(evict_response.result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); EXPECT_FALSE(evict_response.request()->GetAddressResults()); @@ -1757,39 +1819,39 @@ ResolveHostResponseHelper v4_v4_request(resolver_->CreateRequest( HostPortPair("127.0.0.1", 80), NetLogWithSource(), v4_parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v4_v4_request.result_error(), IsOk()); EXPECT_THAT(v4_v4_request.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("127.0.0.1", 80))); ResolveHostResponseHelper v4_v6_request(resolver_->CreateRequest( HostPortPair("127.0.0.1", 80), NetLogWithSource(), v6_parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v4_v6_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); ResolveHostResponseHelper v4_unsp_request(resolver_->CreateRequest( HostPortPair("127.0.0.1", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(v4_unsp_request.result_error(), IsOk()); EXPECT_THAT( v4_unsp_request.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("127.0.0.1", 80))); - ResolveHostResponseHelper v6_v4_request( - resolver_->CreateRequest(HostPortPair("::1", 80), NetLogWithSource(), - v4_parameters, request_context_.get())); + ResolveHostResponseHelper v6_v4_request(resolver_->CreateRequest( + HostPortPair("::1", 80), NetLogWithSource(), v4_parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(v6_v4_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - ResolveHostResponseHelper v6_v6_request( - resolver_->CreateRequest(HostPortPair("::1", 80), NetLogWithSource(), - v6_parameters, request_context_.get())); + ResolveHostResponseHelper v6_v6_request(resolver_->CreateRequest( + HostPortPair("::1", 80), NetLogWithSource(), v6_parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(v6_v6_request.result_error(), IsOk()); EXPECT_THAT(v6_v6_request.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("::1", 80))); - ResolveHostResponseHelper v6_unsp_request( - resolver_->CreateRequest(HostPortPair("::1", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper v6_unsp_request(resolver_->CreateRequest( + HostPortPair("::1", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(v6_unsp_request.result_error(), IsOk()); EXPECT_THAT( v6_unsp_request.request()->GetAddressResults().value().endpoints(), @@ -1806,7 +1868,7 @@ // First NONE query expected to complete synchronously with a cache miss. ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), - source_none_parameters, request_context_.get())); + source_none_parameters, request_context_.get(), host_cache_.get())); EXPECT_TRUE(cache_miss_request.complete()); EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS)); EXPECT_FALSE(cache_miss_request.request()->GetAddressResults()); @@ -1815,14 +1877,14 @@ // Normal query to populate the cache. ResolveHostResponseHelper normal_request(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(normal_request.result_error(), IsOk()); EXPECT_FALSE(normal_request.request()->GetStaleInfo()); // Second NONE query expected to complete synchronously with cache hit. ResolveHostResponseHelper cache_hit_request(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), - source_none_parameters, request_context_.get())); + source_none_parameters, request_context_.get(), host_cache_.get())); EXPECT_TRUE(cache_hit_request.complete()); EXPECT_THAT(cache_hit_request.result_error(), IsOk()); EXPECT_THAT( @@ -1841,7 +1903,7 @@ // First NONE query expected to complete synchronously with a cache miss. ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), - source_none_parameters, request_context_.get())); + source_none_parameters, request_context_.get(), host_cache_.get())); EXPECT_TRUE(cache_miss_request.complete()); EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS)); EXPECT_FALSE(cache_miss_request.request()->GetAddressResults()); @@ -1850,7 +1912,7 @@ // Normal query to populate the cache. ResolveHostResponseHelper normal_request(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(normal_request.result_error(), IsOk()); EXPECT_FALSE(normal_request.request()->GetStaleInfo()); @@ -1859,7 +1921,7 @@ // Second NONE query still expected to complete synchronously with cache miss. ResolveHostResponseHelper stale_request(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), - source_none_parameters, request_context_.get())); + source_none_parameters, request_context_.get(), host_cache_.get())); EXPECT_TRUE(stale_request.complete()); EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS)); EXPECT_FALSE(stale_request.request()->GetAddressResults()); @@ -1870,9 +1932,9 @@ HostResolver::ResolveHostParameters source_none_parameters; source_none_parameters.source = HostResolverSource::LOCAL_ONLY; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("1.2.3.4", 56), NetLogWithSource(), - source_none_parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("1.2.3.4", 56), NetLogWithSource(), source_none_parameters, + request_context_.get(), host_cache_.get())); // Expected to resolve synchronously. EXPECT_TRUE(response.complete()); @@ -1890,7 +1952,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("foo,bar.com", 57), NetLogWithSource(), - source_none_parameters, request_context_.get())); + source_none_parameters, request_context_.get(), host_cache_.get())); // Expected to fail synchronously. EXPECT_TRUE(response.complete()); @@ -1905,7 +1967,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("foo,bar.localhost", 58), NetLogWithSource(), - source_none_parameters, request_context_.get())); + source_none_parameters, request_context_.get(), host_cache_.get())); // Expected to fail synchronously. EXPECT_TRUE(response.complete()); @@ -1926,7 +1988,7 @@ // First query expected to complete synchronously as a cache miss. ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), - stale_allowed_parameters, request_context_.get())); + stale_allowed_parameters, request_context_.get(), host_cache_.get())); EXPECT_TRUE(cache_miss_request.complete()); EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS)); EXPECT_FALSE(cache_miss_request.request()->GetAddressResults()); @@ -1935,7 +1997,7 @@ // Normal query to populate cache ResolveHostResponseHelper normal_request(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(normal_request.result_error(), IsOk()); EXPECT_FALSE(normal_request.request()->GetStaleInfo()); @@ -1944,7 +2006,7 @@ // Second NONE query expected to get a stale cache hit. ResolveHostResponseHelper stale_request(resolver_->CreateRequest( HostPortPair("just.testing", 84), NetLogWithSource(), - stale_allowed_parameters, request_context_.get())); + stale_allowed_parameters, request_context_.get(), host_cache_.get())); EXPECT_TRUE(stale_request.complete()); EXPECT_THAT(stale_request.result_error(), IsOk()); EXPECT_THAT(stale_request.request()->GetAddressResults().value().endpoints(), @@ -1964,7 +2026,7 @@ // parameter, and there should be no stale info. ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 85), NetLogWithSource(), - stale_allowed_parameters, request_context_.get())); + stale_allowed_parameters, request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("192.168.2.42", 85))); @@ -1978,7 +2040,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("1.2.3.4", 57), NetLogWithSource(), stale_allowed_parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); // Expected to resolve synchronously without stale info. EXPECT_TRUE(response.complete()); @@ -2023,9 +2085,9 @@ base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner); // Resolve "host1". - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host1", 70), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host1", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_FALSE(response.complete()); resolver_proc->WaitForNAttemptsToBeBlocked(1); @@ -2067,9 +2129,9 @@ proc_->AddRuleForAllFamilies("not_reserved3", "10.0.53.53"); proc_->SignalMultiple(6u); - ResolveHostResponseHelper single_response( - resolver_->CreateRequest(HostPortPair("single", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper single_response(resolver_->CreateRequest( + HostPortPair("single", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(single_response.result_error(), IsError(ERR_ICANN_NAME_COLLISION)); EXPECT_FALSE(single_response.request()->GetAddressResults()); @@ -2083,40 +2145,40 @@ HostResolverSource::ANY)); EXPECT_FALSE(cache_result); - ResolveHostResponseHelper multiple_response( - resolver_->CreateRequest(HostPortPair("multiple", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper multiple_response(resolver_->CreateRequest( + HostPortPair("multiple", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(multiple_response.result_error(), IsError(ERR_ICANN_NAME_COLLISION)); // Resolving an IP literal of 127.0.53.53 however is allowed. ResolveHostResponseHelper literal_response(resolver_->CreateRequest( HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(literal_response.result_error(), IsOk()); // Moreover the address should not be recognized when embedded in an IPv6 // address. ResolveHostResponseHelper ipv6_response(resolver_->CreateRequest( HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(ipv6_response.result_error(), IsOk()); // Try some other IPs which are similar, but NOT an exact match on // 127.0.53.53. ResolveHostResponseHelper similar_response1(resolver_->CreateRequest( HostPortPair("not_reserved1", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(similar_response1.result_error(), IsOk()); ResolveHostResponseHelper similar_response2(resolver_->CreateRequest( HostPortPair("not_reserved2", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(similar_response2.result_error(), IsOk()); ResolveHostResponseHelper similar_response3(resolver_->CreateRequest( HostPortPair("not_reserved3", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(similar_response3.result_error(), IsOk()); } @@ -2162,10 +2224,10 @@ parameters.include_canonical_name = true; ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), @@ -2185,10 +2247,10 @@ parameters.loopback_only = true; ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("otherlocal", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest( HostPortPair("otherlocal", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), @@ -2206,7 +2268,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); @@ -2218,7 +2280,7 @@ // cache. ResolveHostResponseHelper response2(resolver_->CreateRequest( HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response2.result_error(), IsOk()); EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(), @@ -2491,7 +2553,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA)); socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA, @@ -2520,7 +2582,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA, sizeof(kMdnsResponseAAAA)); @@ -2544,7 +2606,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive(kMdnsResponseTxt, sizeof(kMdnsResponseTxt)); @@ -2569,7 +2631,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 83), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive(kMdnsResponsePtr, sizeof(kMdnsResponsePtr)); @@ -2595,7 +2657,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 83), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive(kMdnsResponseSrv, sizeof(kMdnsResponseSrv)); @@ -2621,7 +2683,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("foo bar(A1B2)._ipps._tcp.local", 83), NetLogWithSource(), - parameters, request_context_.get())); + parameters, request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive(kMdnsResponseSrvUnrestricted, sizeof(kMdnsResponseSrvUnrestricted)); @@ -2647,7 +2709,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 83), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive( kMdnsResponseSrvUnrestrictedResult, @@ -2676,7 +2738,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive(kMdnsResponseNsec, sizeof(kMdnsResponseNsec)); @@ -2708,7 +2770,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); ASSERT_TRUE(test_task_runner->HasPendingTask()); test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout + @@ -2746,7 +2808,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); // Not the requested type. Should be ignored. socket_factory_ptr->SimulateReceive(kMdnsResponseTxt, @@ -2789,7 +2851,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); ASSERT_TRUE(test_task_runner->HasPendingTask()); @@ -2816,7 +2878,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); response.CancelRequest(); @@ -2853,7 +2915,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_FAILED)); EXPECT_FALSE(response.request()->GetAddressResults()); @@ -2871,7 +2933,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_FAILED)); EXPECT_FALSE(response.request()->GetAddressResults()); @@ -3377,7 +3439,7 @@ ResolveHostResponseHelper response0(resolver_->CreateRequest( HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response0.result_error(), IsOk()); EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(), testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80), @@ -3385,7 +3447,7 @@ ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response1.result_error(), IsOk()); EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(), testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80), @@ -3393,7 +3455,7 @@ ResolveHostResponseHelper response2(resolver_->CreateRequest( HostPortPair("localhost.", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response2.result_error(), IsOk()); EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(), testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80), @@ -3415,7 +3477,7 @@ ResolveHostResponseHelper response0(resolver_->CreateRequest( HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response0.result_error(), IsOk()); EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(), testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80), @@ -3423,7 +3485,7 @@ ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response1.result_error(), IsOk()); EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(), testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80), @@ -3436,9 +3498,9 @@ // All other hostnames will fail in proc_. // Initially there is no config, so client should not be invoked. - ResolveHostResponseHelper initial_response( - resolver_->CreateRequest(HostPortPair("ok_fail", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response(resolver_->CreateRequest( + HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_FALSE(initial_response.complete()); proc_->SignalMultiple(1u); @@ -3447,15 +3509,15 @@ ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response0( - resolver_->CreateRequest(HostPortPair("ok_fail", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); - ResolveHostResponseHelper response1( - resolver_->CreateRequest(HostPortPair("nx_fail", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response0(resolver_->CreateRequest( + HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); + ResolveHostResponseHelper response1(resolver_->CreateRequest( + HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper response2(resolver_->CreateRequest( HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(4u); @@ -3483,12 +3545,12 @@ // Set empty DnsConfig. ChangeDnsConfig(DnsConfig()); // Initially there is no config, so client should not be invoked. - ResolveHostResponseHelper initial_response0( - resolver_->CreateRequest(HostPortPair("ok_fail", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response0(resolver_->CreateRequest( + HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper initial_response1(resolver_->CreateRequest( HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(2u); EXPECT_THAT(initial_response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); @@ -3499,12 +3561,12 @@ ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper abort_response0( - resolver_->CreateRequest(HostPortPair("ok_abort", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); - ResolveHostResponseHelper abort_response1( - resolver_->CreateRequest(HostPortPair("nx_abort", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper abort_response0(resolver_->CreateRequest( + HostPortPair("ok_abort", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); + ResolveHostResponseHelper abort_response1(resolver_->CreateRequest( + HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); // Simulate the case when the preference or policy has disabled the DNS // client causing AbortDnsTasks. @@ -3512,12 +3574,12 @@ // First request is resolved by MockDnsClient, others should fail due to // disabled fallback to ProcTask. - ResolveHostResponseHelper response0( - resolver_->CreateRequest(HostPortPair("ok_fail", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); - ResolveHostResponseHelper response1( - resolver_->CreateRequest(HostPortPair("nx_fail", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response0(resolver_->CreateRequest( + HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); + ResolveHostResponseHelper response1(resolver_->CreateRequest( + HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(6u); // Aborted due to Network Change. @@ -3535,9 +3597,9 @@ // Test behavior of OnDnsTaskFailure when Job is aborted. TEST_F(HostResolverManagerDnsTest, OnDnsTaskFailureAbortedJob) { ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("nx_abort", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); // Abort all jobs here. CreateResolver(); proc_->SignalMultiple(1u); @@ -3549,9 +3611,9 @@ // Repeat test with Fallback to ProcTask disabled set_allow_fallback_to_proctask(false); ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper no_fallback_response( - resolver_->CreateRequest(HostPortPair("nx_abort", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper no_fallback_response(resolver_->CreateRequest( + HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); // Abort all jobs here. CreateResolver(); proc_->SignalMultiple(2u); @@ -3571,12 +3633,12 @@ ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response0( - resolver_->CreateRequest(HostPortPair("nx_fail", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response0(resolver_->CreateRequest( + HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(2u); EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); @@ -3597,12 +3659,12 @@ HostResolver::ResolveHostParameters parameters; parameters.source = HostResolverSource::DNS; - ResolveHostResponseHelper response0( - resolver_->CreateRequest(HostPortPair("nx_fail", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response0(resolver_->CreateRequest( + HostPortPair("nx_fail", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); // Nothing should reach |proc_| on success, but let failures through to fail // instead of hanging. proc_->SignalMultiple(2u); @@ -3621,12 +3683,12 @@ ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response0( - resolver_->CreateRequest(HostPortPair("ok_fail", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response0(resolver_->CreateRequest( + HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(2u); // Simulate the case when the preference or policy has disabled the DNS client @@ -3652,12 +3714,12 @@ HostResolver::ResolveHostParameters parameters; parameters.source = HostResolverSource::DNS; - ResolveHostResponseHelper response0( - resolver_->CreateRequest(HostPortPair("ok_fail", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response0(resolver_->CreateRequest( + HostPortPair("ok_fail", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); // Nothing should reach |proc_| on success, but let failures through to fail // instead of hanging. proc_->SignalMultiple(2u); @@ -3678,18 +3740,22 @@ // All other hostnames will fail in proc_. std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("4ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("6ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("4nx", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("4ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("6ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("4nx", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); proc_->SignalMultiple(4u); @@ -3715,7 +3781,7 @@ // mapped to a special error. ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest( HostPortPair("4collision", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION)); EXPECT_FALSE(response_ipv4.request()->GetAddressResults()); @@ -3724,7 +3790,7 @@ // considered special) ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest( HostPortPair("6collision", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response_ipv6.result_error(), IsOk()); EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("::127.0.53.53", 80))); @@ -3739,9 +3805,9 @@ std::string()); // Default to failures. proc_->SignalMultiple(1u); // For the first request which misses. - ResolveHostResponseHelper initial_response( - resolver_->CreateRequest(HostPortPair("nx_ipv4", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response(resolver_->CreateRequest( + HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); IPAddress local_ipv4 = IPAddress::IPv4Localhost(); @@ -3757,23 +3823,23 @@ config.hosts = hosts; ChangeDnsConfig(config); - ResolveHostResponseHelper response_ipv4( - resolver_->CreateRequest(HostPortPair("nx_ipv4", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest( + HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response_ipv4.result_error(), IsOk()); EXPECT_THAT(response_ipv4.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("127.0.0.1", 80))); - ResolveHostResponseHelper response_ipv6( - resolver_->CreateRequest(HostPortPair("nx_ipv6", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest( + HostPortPair("nx_ipv6", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response_ipv6.result_error(), IsOk()); EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("::1", 80))); - ResolveHostResponseHelper response_both( - resolver_->CreateRequest(HostPortPair("nx_both", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response_both(resolver_->CreateRequest( + HostPortPair("nx_both", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response_both.result_error(), IsOk()); EXPECT_THAT(response_both.request()->GetAddressResults().value().endpoints(), testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80), @@ -3783,9 +3849,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::A; - ResolveHostResponseHelper response_specified_ipv4( - resolver_->CreateRequest(HostPortPair("nx_ipv4", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response_specified_ipv4(resolver_->CreateRequest( + HostPortPair("nx_ipv4", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response_specified_ipv4.result_error(), IsOk()); EXPECT_THAT(response_specified_ipv4.request() ->GetAddressResults() @@ -3794,9 +3860,9 @@ testing::ElementsAre(CreateExpected("127.0.0.1", 80))); parameters.dns_query_type = DnsQueryType::AAAA; - ResolveHostResponseHelper response_specified_ipv6( - resolver_->CreateRequest(HostPortPair("nx_ipv6", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response_specified_ipv6(resolver_->CreateRequest( + HostPortPair("nx_ipv6", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response_specified_ipv6.result_error(), IsOk()); EXPECT_THAT(response_specified_ipv6.request() ->GetAddressResults() @@ -3805,9 +3871,9 @@ testing::ElementsAre(CreateExpected("::1", 80))); // Request with upper case. - ResolveHostResponseHelper response_upper( - resolver_->CreateRequest(HostPortPair("nx_IPV4", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response_upper(resolver_->CreateRequest( + HostPortPair("nx_IPV4", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response_upper.result_error(), IsOk()); EXPECT_THAT(response_upper.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("127.0.0.1", 80))); @@ -3825,12 +3891,12 @@ std::string()); // Default to failures. proc_->SignalMultiple(1u); // For the first request which fails. - ResolveHostResponseHelper failure_response( - resolver_->CreateRequest(HostPortPair("nx_ipv4", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); - ResolveHostResponseHelper queued_response( - resolver_->CreateRequest(HostPortPair("nx_ipv6", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper failure_response(resolver_->CreateRequest( + HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); + ResolveHostResponseHelper queued_response(resolver_->CreateRequest( + HostPortPair("nx_ipv6", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); DnsHosts hosts; hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] = @@ -3869,22 +3935,26 @@ std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("ok.local", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("ok.local.", 80), NetLogWithSource(), base::nullopt, - request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("oklocal", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("oklocal.", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("oklocal", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("oklocal.", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); proc_->SignalMultiple(5u); @@ -3919,7 +3989,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("myhello.local", 80), NetLogWithSource(), dns_parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); socket_factory_ptr->SimulateReceive(kMdnsResponseTxt, sizeof(kMdnsResponseTxt)); @@ -3941,15 +4011,15 @@ HostResolver::ResolveHostParameters dns_parameters; dns_parameters.source = HostResolverSource::DNS; - ResolveHostResponseHelper dns_response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - dns_parameters, request_context_.get())); - ResolveHostResponseHelper dns_local_response( - resolver_->CreateRequest(HostPortPair("ok.local", 80), NetLogWithSource(), - dns_parameters, request_context_.get())); - ResolveHostResponseHelper normal_local_response( - resolver_->CreateRequest(HostPortPair("ok.local", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper dns_response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), dns_parameters, + request_context_.get(), host_cache_.get())); + ResolveHostResponseHelper dns_local_response(resolver_->CreateRequest( + HostPortPair("ok.local", 80), NetLogWithSource(), dns_parameters, + request_context_.get(), host_cache_.get())); + ResolveHostResponseHelper normal_local_response(resolver_->CreateRequest( + HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(3u); @@ -3964,15 +4034,15 @@ ChangeDnsConfig(CreateValidDnsConfig()); proc_->AddRuleForAllFamilies(std::string(), std::string()); - ResolveHostResponseHelper dns_response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper dns_response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); HostResolver::ResolveHostParameters parameters; parameters.source = HostResolverSource::SYSTEM; - ResolveHostResponseHelper system_response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper system_response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(2u); @@ -3987,9 +4057,9 @@ std::string()); // Default to failures. // Check that DnsTask works. - ResolveHostResponseHelper initial_response( - resolver_->CreateRequest(HostPortPair("ok_1", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper initial_response(resolver_->CreateRequest( + HostPortPair("ok_1", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(initial_response.result_error(), IsOk()); std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; @@ -3998,9 +4068,10 @@ std::string hostname = base::StringPrintf("nx_%u", i); // Ensure fallback to ProcTask succeeds. proc_->AddRuleForAllFamilies(hostname, "192.168.1.101"); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair(hostname, 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); } proc_->SignalMultiple(responses.size()); @@ -4011,23 +4082,23 @@ ASSERT_FALSE(proc_->HasBlockedRequests()); // DnsTask should be disabled by now unless explictly requested via |source|. - ResolveHostResponseHelper fail_response( - resolver_->CreateRequest(HostPortPair("ok_2", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper fail_response(resolver_->CreateRequest( + HostPortPair("ok_2", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); HostResolver::ResolveHostParameters parameters; parameters.source = HostResolverSource::DNS; - ResolveHostResponseHelper dns_response( - resolver_->CreateRequest(HostPortPair("ok_2", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper dns_response(resolver_->CreateRequest( + HostPortPair("ok_2", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(2u); EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_THAT(dns_response.result_error(), IsOk()); // Check that it is re-enabled after DNS change. ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper reenabled_response( - resolver_->CreateRequest(HostPortPair("ok_3", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest( + HostPortPair("ok_3", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(reenabled_response.result_error(), IsOk()); } @@ -4042,9 +4113,10 @@ // Use custom names to require separate Jobs. std::string hostname = (i % 2) == 0 ? base::StringPrintf("nx_%u", i) : base::StringPrintf("ok_%u", i); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair(hostname, 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); } proc_->SignalMultiple(40u); @@ -4056,9 +4128,9 @@ proc_->AddRuleForAllFamilies(std::string(), std::string()); // DnsTask should still be enabled. - ResolveHostResponseHelper final_response( - resolver_->CreateRequest(HostPortPair("ok_last", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper final_response(resolver_->CreateRequest( + HostPortPair("ok_last", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(final_response.result_error(), IsOk()); } @@ -4076,7 +4148,7 @@ resolver_->SetDnsClient(nullptr); ResolveHostResponseHelper system_response(resolver_->CreateRequest( HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(system_response.result_error(), IsOk()); EXPECT_THAT( system_response.request()->GetAddressResults().value().endpoints(), @@ -4087,7 +4159,7 @@ UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules()); ResolveHostResponseHelper builtin_response(resolver_->CreateRequest( HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(builtin_response.result_error(), IsOk()); EXPECT_THAT( builtin_response.request()->GetAddressResults().value().endpoints(), @@ -4101,7 +4173,7 @@ ChangeDnsConfig(config); ResolveHostResponseHelper ipv6_disabled_response(resolver_->CreateRequest( HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(ipv6_disabled_response.result_error(), IsOk()); EXPECT_THAT( ipv6_disabled_response.request()->GetAddressResults().value().endpoints(), @@ -4118,9 +4190,9 @@ config.use_local_ipv6 = false; ChangeDnsConfig(config); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); ASSERT_EQ(1u, num_running_dispatcher_jobs()); @@ -4136,9 +4208,9 @@ CreateSerialResolver(); ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_EQ(1u, num_running_dispatcher_jobs()); response.CancelRequest(); @@ -4152,9 +4224,9 @@ TEST_F(HostResolverManagerDnsTest, CancelWithTwoTransactionsActive) { ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_EQ(2u, num_running_dispatcher_jobs()); response.CancelRequest(); @@ -4176,9 +4248,10 @@ std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; for (int i = 0; i < 12; ++i) { std::string hostname = base::StringPrintf("ok%i", i); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair(hostname, 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); } EXPECT_EQ(10u, num_running_dispatcher_jobs()); @@ -4193,9 +4266,9 @@ TEST_F(HostResolverManagerDnsTest, DeleteWithCompletedRequests) { ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), @@ -4215,7 +4288,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); response.request()->Cancel(); dns_client_->CompleteDelayedTransactions(); @@ -4227,9 +4300,9 @@ TEST_F(HostResolverManagerDnsTest, ExplicitCancel_Completed) { ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), @@ -4248,9 +4321,9 @@ TEST_F(HostResolverManagerDnsTest, CancelWithIPv6TransactionActive) { ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("6slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("6slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_EQ(2u, num_running_dispatcher_jobs()); // The IPv4 request should complete, the IPv6 request is still pending. @@ -4269,9 +4342,9 @@ set_allow_fallback_to_proctask(false); ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_EQ(2u, num_running_dispatcher_jobs()); // The IPv6 request should complete, the IPv4 request is still pending. @@ -4289,21 +4362,22 @@ ChangeDnsConfig(CreateValidDnsConfig()); std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt, - request_context_.get()))); + request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("4slow_4timeout", 80), NetLogWithSource(), base::nullopt, - request_context_.get()))); + request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("4slow_6timeout", 80), NetLogWithSource(), base::nullopt, - request_context_.get()))); + request_context_.get(), host_cache_.get()))); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(responses[0]->complete()); @@ -4362,29 +4436,30 @@ set_allow_fallback_to_proctask(false); std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("secure", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("secure", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("4insecure_6slowsecure", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + base::nullopt, request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("4insecure_6slowemptysecure", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + base::nullopt, request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("4insecureempty_6slowsecure", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + base::nullopt, request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("4insecure_6slowfailsecure", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + base::nullopt, request_context_.get(), host_cache_.get()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair("4secure_6slowinsecure", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + base::nullopt, request_context_.get(), host_cache_.get()))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(responses[0]->complete()); @@ -4461,9 +4536,9 @@ set_allow_fallback_to_proctask(false); ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_FALSE(response.complete()); EXPECT_EQ(1u, num_running_dispatcher_jobs()); @@ -4484,13 +4559,13 @@ set_allow_fallback_to_proctask(false); ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response0( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response0(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_EQ(2u, num_running_dispatcher_jobs()); - ResolveHostResponseHelper response1( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response1(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_EQ(3u, num_running_dispatcher_jobs()); // Request 0's transactions should complete, starting Request 1's second @@ -4523,7 +4598,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), testing::ElementsAre(CreateExpected("192.168.0.1", 80))); @@ -4538,7 +4613,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(), @@ -4562,16 +4637,19 @@ std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; // First active job gets two slots. - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("slow_nx1", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("slow_nx1", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); // Next job gets one slot, and waits on another. - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("slow_nx2", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("slow_nx2", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); EXPECT_EQ(3u, num_running_dispatcher_jobs()); for (auto& response : responses) { @@ -4600,9 +4678,9 @@ TEST_F(HostResolverManagerDnsTest, DontAbortOnInitialDNSConfigRead) { // DnsClient is enabled, but there's no DnsConfig, so the request should start // using ProcTask. - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host1", 70), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host1", 70), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_FALSE(response.complete()); EXPECT_TRUE(proc_->WaitFor(1u)); @@ -4637,7 +4715,7 @@ failure_responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( HostPortPair(host, 80), NetLogWithSource(), base::nullopt, - request_context_.get()))); + request_context_.get(), host_cache_.get()))); EXPECT_FALSE(failure_responses[i]->complete()); } @@ -4646,17 +4724,17 @@ proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2"); ResolveHostResponseHelper response0(resolver_->CreateRequest( HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_FALSE(response0.complete()); proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.3"); ResolveHostResponseHelper response1(resolver_->CreateRequest( HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_FALSE(response1.complete()); proc_->AddRuleForAllFamilies("slow_ok3", "192.168.0.4"); ResolveHostResponseHelper response2(resolver_->CreateRequest( HostPortPair("slow_ok3", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_FALSE(response2.complete()); // Requests specifying DNS source cannot fallback to ProcTask, so they @@ -4665,16 +4743,16 @@ parameters.source = HostResolverSource::DNS; ResolveHostResponseHelper response_dns(resolver_->CreateRequest( HostPortPair("4slow_ok", 80), NetLogWithSource(), parameters, - request_context_.get())); + request_context_.get(), host_cache_.get())); EXPECT_FALSE(response_dns.complete()); // Requests specifying SYSTEM source should be unaffected by disabling // DnsClient. proc_->AddRuleForAllFamilies("nx_ok", "192.168.0.5"); parameters.source = HostResolverSource::SYSTEM; - ResolveHostResponseHelper response_system( - resolver_->CreateRequest(HostPortPair("nx_ok", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response_system(resolver_->CreateRequest( + HostPortPair("nx_ok", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_FALSE(response_system.complete()); proc_->SignalMultiple(maximum_dns_failures() + 5); @@ -4727,19 +4805,22 @@ std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses; // First active job gets two slots. - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("slow_ok1", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); EXPECT_FALSE(responses[0]->complete()); // Next job gets one slot, and waits on another. - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("slow_ok2", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); EXPECT_FALSE(responses[1]->complete()); // Next one is queued. - responses.emplace_back(std::make_unique<ResolveHostResponseHelper>( - resolver_->CreateRequest(HostPortPair("ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get()))); + responses.emplace_back( + std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( + HostPortPair("ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get()))); EXPECT_FALSE(responses[2]->complete()); EXPECT_EQ(3u, num_running_dispatcher_jobs()); @@ -4784,18 +4865,18 @@ HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6); proc_->AddRule("h1", ADDRESS_FAMILY_IPV6, "::2"); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("h1", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("h1", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::A; - ResolveHostResponseHelper v4_response( - resolver_->CreateRequest(HostPortPair("h1", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper v4_response(resolver_->CreateRequest( + HostPortPair("h1", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); parameters.dns_query_type = DnsQueryType::AAAA; - ResolveHostResponseHelper v6_response( - resolver_->CreateRequest(HostPortPair("h1", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper v6_response(resolver_->CreateRequest( + HostPortPair("h1", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(3u); @@ -4817,17 +4898,17 @@ NetworkChangeNotifier::CONNECTION_4G); base::RunLoop().RunUntilIdle(); // Wait for NetworkChangeNotifier. - ResolveHostResponseHelper no_wifi_response( - resolver_->CreateRequest(HostPortPair("h1", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper no_wifi_response(resolver_->CreateRequest( + HostPortPair("h1", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); parameters.dns_query_type = DnsQueryType::A; - ResolveHostResponseHelper no_wifi_v4_response( - resolver_->CreateRequest(HostPortPair("h1", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper no_wifi_v4_response(resolver_->CreateRequest( + HostPortPair("h1", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); parameters.dns_query_type = DnsQueryType::AAAA; - ResolveHostResponseHelper no_wifi_v6_response( - resolver_->CreateRequest(HostPortPair("h1", 80), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper no_wifi_v6_response(resolver_->CreateRequest( + HostPortPair("h1", 80), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); proc_->SignalMultiple(3u); @@ -4853,9 +4934,9 @@ ChangeDnsConfig(CreateValidDnsConfig()); // NODATA - ResolveHostResponseHelper no_data_response( - resolver_->CreateRequest(HostPortPair("empty", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper no_data_response(resolver_->CreateRequest( + HostPortPair("empty", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(no_data_response.request()->GetAddressResults()); HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0, @@ -4869,9 +4950,9 @@ EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400)); // NXDOMAIN - ResolveHostResponseHelper no_domain_response( - resolver_->CreateRequest(HostPortPair("nodomain", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest( + HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(no_domain_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(no_domain_response.request()->GetAddressResults()); @@ -4893,23 +4974,23 @@ cache_only_parameters.source = HostResolverSource::LOCAL_ONLY; // Expect cache initially empty. - ResolveHostResponseHelper cache_miss_response( - resolver_->CreateRequest(HostPortPair("nodomain", 80), NetLogWithSource(), - cache_only_parameters, request_context_.get())); + ResolveHostResponseHelper cache_miss_response(resolver_->CreateRequest( + HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(cache_miss_response.result_error(), IsError(ERR_DNS_CACHE_MISS)); EXPECT_FALSE(cache_miss_response.request()->GetStaleInfo()); // Populate cache with an error. - ResolveHostResponseHelper no_domain_response( - resolver_->CreateRequest(HostPortPair("nodomain", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest( + HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); EXPECT_THAT(no_domain_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); // Expect the error result can be resolved from the cache. - ResolveHostResponseHelper cache_hit_response( - resolver_->CreateRequest(HostPortPair("nodomain", 80), NetLogWithSource(), - cache_only_parameters, request_context_.get())); + ResolveHostResponseHelper cache_hit_response(resolver_->CreateRequest( + HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(cache_hit_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(cache_hit_response.request()->GetStaleInfo().value().is_stale()); @@ -4926,9 +5007,9 @@ UseMockDnsClient(CreateValidDnsConfig(), std::move(rules)); set_allow_fallback_to_proctask(false); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("alias", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("alias", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_THAT(response.result_error(), IsOk()); // HostResolver may still give name, but if so, it must be correct. @@ -4951,9 +5032,9 @@ HostResolver::ResolveHostParameters params; params.include_canonical_name = true; params.source = HostResolverSource::DNS; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("alias", 80), NetLogWithSource(), - params, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("alias", 80), NetLogWithSource(), params, + request_context_.get(), host_cache_.get())); ASSERT_THAT(response.result_error(), IsOk()); EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(), @@ -4974,9 +5055,9 @@ HostResolver::ResolveHostParameters params; params.include_canonical_name = true; params.source = HostResolverSource::DNS; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("alias", 80), NetLogWithSource(), - params, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("alias", 80), NetLogWithSource(), params, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); base::RunLoop().RunUntilIdle(); dns_client_->CompleteDelayedTransactions(); @@ -4997,9 +5078,9 @@ params.dns_query_type = DnsQueryType::A; params.include_canonical_name = true; params.source = HostResolverSource::DNS; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("alias", 80), NetLogWithSource(), - params, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("alias", 80), NetLogWithSource(), params, + request_context_.get(), host_cache_.get())); ASSERT_THAT(response.result_error(), IsOk()); EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(), "correct"); @@ -5022,7 +5103,7 @@ params.include_canonical_name = true; ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("nx_succeed", 80), NetLogWithSource(), params, - request_context_.get())); + request_context_.get(), host_cache_.get())); ASSERT_THAT(response.result_error(), IsOk()); EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(), @@ -5092,7 +5173,7 @@ ResolveHostResponseHelper response(resolver_->CreateRequest( HostPortPair("dns.example2.com", 80), NetLogWithSource(), base::nullopt, - request_context_.get())); + request_context_.get(), host_cache_.get())); ASSERT_THAT(response.result_error(), IsOk()); } @@ -5416,9 +5497,9 @@ ASSERT_FALSE(overrides.OverridesEverything()); resolver_->SetDnsConfigOverrides(overrides); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); DnsConfig new_config = original_config; @@ -5441,9 +5522,9 @@ ASSERT_TRUE(overrides.OverridesEverything()); resolver_->SetDnsConfigOverrides(overrides); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); DnsConfig new_config = original_config; @@ -5458,9 +5539,9 @@ // overrides, same as receiving a new DnsConfig from the system. TEST_F(HostResolverManagerDnsTest, CancelQueriesOnSettingOverrides) { ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); DnsConfigOverrides overrides; @@ -5478,9 +5559,9 @@ overrides.attempts = 123; resolver_->SetDnsConfigOverrides(overrides); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); resolver_->SetDnsConfigOverrides(overrides); @@ -5497,9 +5578,9 @@ overrides.attempts = 123; resolver_->SetDnsConfigOverrides(overrides); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); resolver_->SetDnsConfigOverrides(DnsConfigOverrides()); @@ -5512,9 +5593,9 @@ TEST_F(HostResolverManagerDnsTest, CancelQueriesOnClearingOverrides_NoOverrides) { ChangeDnsConfig(CreateValidDnsConfig()); - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("4slow_ok", 80), NetLogWithSource(), - base::nullopt, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt, + request_context_.get(), host_cache_.get())); ASSERT_FALSE(response.complete()); resolver_->SetDnsConfigOverrides(DnsConfigOverrides()); @@ -5588,9 +5669,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::TXT; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetHostnameResults()); @@ -5625,9 +5706,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::TXT; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5651,9 +5732,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::TXT; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5677,9 +5758,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::TXT; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5703,9 +5784,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::TXT; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5729,9 +5810,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::TXT; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5752,9 +5833,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::TXT; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5776,9 +5857,9 @@ parameters.dns_query_type = DnsQueryType::TXT; // Responses for the wrong type should be ignored. - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5809,9 +5890,9 @@ parameters.source = HostResolverSource::DNS; parameters.dns_query_type = DnsQueryType::TXT; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetHostnameResults()); @@ -5842,9 +5923,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5869,9 +5950,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("8.8.8.8", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("8.8.8.8", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5899,9 +5980,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5925,9 +6006,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5951,9 +6032,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -5977,9 +6058,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6003,9 +6084,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6026,9 +6107,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6050,9 +6131,9 @@ parameters.dns_query_type = DnsQueryType::PTR; // Responses for the wrong type should be ignored. - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6077,9 +6158,9 @@ parameters.source = HostResolverSource::DNS; parameters.dns_query_type = DnsQueryType::PTR; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6107,9 +6188,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6151,9 +6232,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6181,9 +6262,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6207,9 +6288,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6233,9 +6314,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6259,9 +6340,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6285,9 +6366,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6308,9 +6389,9 @@ HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6332,9 +6413,9 @@ parameters.dns_query_type = DnsQueryType::SRV; // Responses for the wrong type should be ignored. - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("ok", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("ok", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults()); @@ -6363,9 +6444,9 @@ parameters.source = HostResolverSource::DNS; parameters.dns_query_type = DnsQueryType::SRV; - ResolveHostResponseHelper response( - resolver_->CreateRequest(HostPortPair("host", 108), NetLogWithSource(), - parameters, request_context_.get())); + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host", 108), NetLogWithSource(), parameters, + request_context_.get(), host_cache_.get())); EXPECT_THAT(response.result_error(), IsOk()); EXPECT_FALSE(response.request()->GetAddressResults()); EXPECT_FALSE(response.request()->GetTextResults());
diff --git a/net/proxy_resolution/proxy_resolution_service.cc b/net/proxy_resolution/proxy_resolution_service.cc index 133bff3..0cb73b25 100644 --- a/net/proxy_resolution/proxy_resolution_service.cc +++ b/net/proxy_resolution/proxy_resolution_service.cc
@@ -365,10 +365,22 @@ #endif // Returns a sanitized copy of |url| which is safe to pass on to a PAC script. -// The method for sanitizing is determined by |policy|. See the comments for -// that enum for details. -GURL SanitizeUrl(const GURL& url, - ProxyResolutionService::SanitizeUrlPolicy policy) { +// +// PAC scripts are modelled as being controllable by a network-present +// attacker (since such an attacker can influence the outcome of proxy +// auto-discovery, or modify the contents of insecurely delivered PAC scripts). +// +// As such, it is important that the full path/query of https:// URLs not be +// sent to PAC scripts, since that would give an attacker access to data that +// is ordinarily protected by TLS. +// +// Obscuring the path for http:// URLs isn't being done since it doesn't matter +// for security (attacker can already route traffic through their HTTP proxy +// and see the full URL for http:// requests). +// +// TODO(https://crbug.com/882536): Use the same stripping for insecure URL +// schemes. +GURL SanitizeUrl(const GURL& url) { DCHECK(url.is_valid()); GURL::Replacements replacements; @@ -376,8 +388,7 @@ replacements.ClearPassword(); replacements.ClearRef(); - if (policy == ProxyResolutionService::SanitizeUrlPolicy::SAFE && - url.SchemeIsCryptographic()) { + if (url.SchemeIsCryptographic()) { replacements.ClearPath(); replacements.ClearQuery(); } @@ -1056,7 +1067,6 @@ stall_proxy_auto_config_delay_( TimeDelta::FromMilliseconds(kDelayAfterNetworkChangesMs)), quick_check_enabled_(true), - sanitize_url_policy_(SanitizeUrlPolicy::SAFE), weak_ptr_factory_(this) { NetworkChangeNotifier::AddIPAddressObserver(this); NetworkChangeNotifier::AddDNSObserver(this); @@ -1175,7 +1185,7 @@ // script). The goal is to remove sensitive data (like embedded user names // and password), and local data (i.e. reference fragment) which does not need // to be disclosed to the resolver. - GURL url = SanitizeUrl(raw_url, sanitize_url_policy_); + GURL url = SanitizeUrl(raw_url); // Check if the request can be completed right away. (This is the case when // using a direct connection for example).
diff --git a/net/proxy_resolution/proxy_resolution_service.h b/net/proxy_resolution/proxy_resolution_service.h index 3ead1551..48b190d 100644 --- a/net/proxy_resolution/proxy_resolution_service.h +++ b/net/proxy_resolution/proxy_resolution_service.h
@@ -54,25 +54,6 @@ public NetworkChangeNotifier::DNSObserver, public ProxyConfigService::Observer { public: - // Enumerates the policy to use when sanitizing URLs for proxy resolution - // (before passing them off to PAC scripts). - enum class SanitizeUrlPolicy { - // Do a basic level of sanitization for URLs: - // - strip embedded identities (ex: "username:password@") - // - strip the fragment (ex: "#blah") - // - // This is considered "unsafe" because it does not do any additional - // stripping for https:// URLs. - UNSAFE, - - // SAFE does the same sanitization as UNSAFE, but additionally strips - // everything but the (scheme,host,port) from cryptographic URL schemes - // (https:// and wss://). - // - // In other words, it strips the path and query portion of https:// URLs. - SAFE, - }; - // This interface defines the set of policies for when to poll the PAC // script for changes. // @@ -306,13 +287,6 @@ } bool quick_check_enabled_for_testing() const { return quick_check_enabled_; } - void set_sanitize_url_policy(SanitizeUrlPolicy policy) { - sanitize_url_policy_ = policy; - } - SanitizeUrlPolicy sanitize_url_policy_for_testing() const { - return sanitize_url_policy_; - } - private: FRIEND_TEST_ALL_PREFIXES(ProxyResolutionServiceTest, UpdateConfigAfterFailedAutodetect); @@ -470,9 +444,6 @@ // Whether child PacFileDeciders should use QuickCheck bool quick_check_enabled_; - // The method to use for sanitizing URLs seen by the proxy resolver. - SanitizeUrlPolicy sanitize_url_policy_; - THREAD_CHECKER(thread_checker_); ProxyDelegate* proxy_delegate_ = nullptr;
diff --git a/net/proxy_resolution/proxy_resolution_service_unittest.cc b/net/proxy_resolution/proxy_resolution_service_unittest.cc index c747bcf..2757b58 100644 --- a/net/proxy_resolution/proxy_resolution_service_unittest.cc +++ b/net/proxy_resolution/proxy_resolution_service_unittest.cc
@@ -3691,10 +3691,8 @@ EXPECT_TRUE(info3.is_direct()); } -// Helper class to exercise URL sanitization using the different policies. This -// works by submitted URLs to the ProxyResolutionService. In turn the -// ProxyResolutionService sanitizes the URL and then passes it along to the -// ProxyResolver. This helper returns the URL seen by the ProxyResolver. +// Helper class to exercise URL sanitization by submitting URLs to the +// ProxyResolutionService and returning the URL passed to the ProxyResolver. class SanitizeUrlHelper { public: SanitizeUrlHelper() { @@ -3733,12 +3731,6 @@ EXPECT_TRUE(info.is_direct()); } - // Changes the URL sanitization policy for the underlying - // ProxyResolutionService. This will affect subsequent calls to SanitizeUrl. - void SetSanitizeUrlPolicy(ProxyResolutionService::SanitizeUrlPolicy policy) { - service_->set_sanitize_url_policy(policy); - } - // Makes a proxy resolution request through the ProxyResolutionService, and // returns the URL that was submitted to the Proxy Resolver. GURL SanitizeUrl(const GURL& raw_url) { @@ -3764,44 +3756,68 @@ return sanitized_url; } - // Changes the ProxyResolutionService's URL sanitization policy and then - // sanitizes |raw_url|. - GURL SanitizeUrl(const GURL& raw_url, - ProxyResolutionService::SanitizeUrlPolicy policy) { - service_->set_sanitize_url_policy(policy); - return SanitizeUrl(raw_url); - } - private: MockAsyncProxyResolver resolver; MockAsyncProxyResolverFactory* factory; std::unique_ptr<ProxyResolutionService> service_; }; -TEST_F(ProxyResolutionServiceTest, SanitizeUrlDefaultsToSafe) { - SanitizeUrlHelper helper; - - // Without changing the URL sanitization policy, the default should be to - // strip https:// URLs. - EXPECT_EQ(GURL("https://example.com/"), - helper.SanitizeUrl( - GURL("https://foo:bar@example.com/foo/bar/baz?hello#sigh"))); -} - -// Tests URL sanitization with input URLs that have a // non-cryptographic -// scheme (i.e. http://). The sanitized result is consistent regardless of the -// stripping mode selected. -TEST_F(ProxyResolutionServiceTest, SanitizeUrlForPacScriptNonCryptographic) { +// Tests that input URLs to proxy resolution are sanitized before being passed +// on to the ProxyResolver (i.e. PAC script evaluator). For instance PAC +// scripts should not be able to see the path for https:// URLs. +TEST_F(ProxyResolutionServiceTest, SanitizeUrlForPacScript) { const struct { const char* raw_url; const char* sanitized_url; } kTests[] = { + // --------------------------------- + // Sanitize cryptographic URLs. + // --------------------------------- + // Embedded identity is stripped. { - "http://foo:bar@example.com/", "http://example.com/", + "https://foo:bar@example.com/", + "https://example.com/", + }, + // Fragments and path are stripped. + { + "https://example.com/blah#hello", + "https://example.com/", + }, + // Query is stripped. + { + "https://example.com/?hello", + "https://example.com/", + }, + // The embedded identity and fragment are stripped. + { + "https://foo:bar@example.com/foo/bar/baz?hello#sigh", + "https://example.com/", + }, + // The URL's port should not be stripped. + { + "https://example.com:88/hi", + "https://example.com:88/", + }, + // Try a wss:// URL, to make sure it is treated as a cryptographic schemed + // URL. + { + "wss://example.com:88/hi", + "wss://example.com:88/", + }, + + // --------------------------------- + // Sanitize non-cryptographic URLs. + // --------------------------------- + + // Embedded identity is stripped. + { + "http://foo:bar@example.com/", + "http://example.com/", }, { - "ftp://foo:bar@example.com/", "ftp://example.com/", + "ftp://foo:bar@example.com/", + "ftp://example.com/", }, { "ftp://example.com/some/path/here", @@ -3809,7 +3825,8 @@ }, // Reference fragment is stripped. { - "http://example.com/blah#hello", "http://example.com/blah", + "http://example.com/blah#hello", + "http://example.com/blah", }, // Query parameters are NOT stripped. { @@ -3823,76 +3840,8 @@ }, // Port numbers are not affected. { - "http://example.com:88/hi", "http://example.com:88/hi", - }, - }; - - SanitizeUrlHelper helper; - - for (const auto& test : kTests) { - // The result of SanitizeUrlForPacScript() is the same regardless of the - // second parameter (sanitization mode), since the input URLs do not use a - // cryptographic scheme. - GURL raw_url(test.raw_url); - ASSERT_TRUE(raw_url.is_valid()); - EXPECT_FALSE(raw_url.SchemeIsCryptographic()); - - EXPECT_EQ(GURL(test.sanitized_url), - helper.SanitizeUrl( - raw_url, ProxyResolutionService::SanitizeUrlPolicy::UNSAFE)); - - EXPECT_EQ(GURL(test.sanitized_url), - helper.SanitizeUrl( - raw_url, ProxyResolutionService::SanitizeUrlPolicy::SAFE)); - } -} - -// Tests URL sanitization using input URLs that have a cryptographic schemes -// (i.e. https://). The sanitized result differs depending on the sanitization -// mode chosen. -TEST_F(ProxyResolutionServiceTest, SanitizeUrlForPacScriptCryptographic) { - const struct { - // Input URL. - const char* raw_url; - - // Output URL when stripping of cryptographic URLs is disabled. - const char* sanitized_url_unstripped; - - // Output URL when stripping of cryptographic URLs is enabled. - const char* sanitized_url; - } kTests[] = { - // Embedded identity is always stripped. - { - "https://foo:bar@example.com/", "https://example.com/", - "https://example.com/", - }, - // Fragments are always stripped, but stripping path is conditional on the - // mode. - { - "https://example.com/blah#hello", "https://example.com/blah", - "https://example.com/", - }, - // Stripping the query is conditional on the mode. - { - "https://example.com/?hello", "https://example.com/?hello", - "https://example.com/", - }, - // The embedded identity and fragment is always stripped, however path and - // query are conditional on the stripping mode. - { - "https://foo:bar@example.com/foo/bar/baz?hello#sigh", - "https://example.com/foo/bar/baz?hello", "https://example.com/", - }, - // The URL's port should not be stripped. - { - "https://example.com:88/hi", "https://example.com:88/hi", - "https://example.com:88/", - }, - // Try a wss:// URL, to make sure it also strips (is is also a - // cryptographic URL). - { - "wss://example.com:88/hi", "wss://example.com:88/hi", - "wss://example.com:88/", + "http://example.com:88/hi", + "http://example.com:88/hi", }, }; @@ -3901,15 +3850,8 @@ for (const auto& test : kTests) { GURL raw_url(test.raw_url); ASSERT_TRUE(raw_url.is_valid()); - EXPECT_TRUE(raw_url.SchemeIsCryptographic()); - EXPECT_EQ(GURL(test.sanitized_url_unstripped), - helper.SanitizeUrl( - raw_url, ProxyResolutionService::SanitizeUrlPolicy::UNSAFE)); - - EXPECT_EQ(GURL(test.sanitized_url), - helper.SanitizeUrl( - raw_url, ProxyResolutionService::SanitizeUrlPolicy::SAFE)); + EXPECT_EQ(GURL(test.sanitized_url), helper.SanitizeUrl(raw_url)); } }
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h index b1548e2..2516f6a9 100644 --- a/net/quic/quic_flags_list.h +++ b/net/quic/quic_flags_list.h
@@ -324,4 +324,4 @@ // alarm. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_ignore_tlpr_if_sending_ping, - false) + true)
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc index 1964d203..b82fca8 100644 --- a/net/url_request/url_request_context_builder.cc +++ b/net/url_request/url_request_context_builder.cc
@@ -549,8 +549,6 @@ context->net_log()); proxy_resolution_service_->set_quick_check_enabled( pac_quick_check_enabled_); - proxy_resolution_service_->set_sanitize_url_policy( - pac_sanitize_url_policy_); } ProxyResolutionService* proxy_resolution_service = proxy_resolution_service_.get();
diff --git a/net/url_request/url_request_context_builder.h b/net/url_request/url_request_context_builder.h index 4338284..54da5d1 100644 --- a/net/url_request/url_request_context_builder.h +++ b/net/url_request/url_request_context_builder.h
@@ -172,14 +172,6 @@ pac_quick_check_enabled_ = pac_quick_check_enabled; } - // Sets policy for sanitizing URLs before passing them to a PAC. Defaults to - // ProxyResolutionService::SanitizeUrlPolicy::SAFE. Ignored if - // a ProxyResolutionService is set directly. - void set_pac_sanitize_url_policy( - ProxyResolutionService::SanitizeUrlPolicy pac_sanitize_url_policy) { - pac_sanitize_url_policy_ = pac_sanitize_url_policy; - } - // Sets the proxy service. If one is not provided, by default, uses system // libraries to evaluate PAC scripts, if available (And if not, skips PAC // resolution). Subclasses may override CreateProxyResolutionService for @@ -422,8 +414,6 @@ HostResolver::Factory* host_resolver_factory_ = nullptr; std::unique_ptr<ProxyConfigService> proxy_config_service_; bool pac_quick_check_enabled_ = true; - ProxyResolutionService::SanitizeUrlPolicy pac_sanitize_url_policy_ = - ProxyResolutionService::SanitizeUrlPolicy::SAFE; std::unique_ptr<ProxyResolutionService> proxy_resolution_service_; std::unique_ptr<SSLConfigService> ssl_config_service_; std::unique_ptr<NetworkDelegate> network_delegate_;
diff --git a/remoting/android/client_java_tmpl.gni b/remoting/android/client_java_tmpl.gni index 6a1db68e..7c37778 100644 --- a/remoting/android/client_java_tmpl.gni +++ b/remoting/android/client_java_tmpl.gni
@@ -37,6 +37,7 @@ "NavigationMenuAdapter.java", "OAuthTokenConsumer.java", "Preconditions.java", + "PrivacyPolicyActivity.java", "RenderData.java", "RenderStub.java", "ScaleEventParameter.java", @@ -47,6 +48,7 @@ "SwipePinchDetector.java", "SystemUiVisibilityChangedEventParameter.java", "TapGestureDetector.java", + "TermsOfServiceActivity.java", "ThirdPartyTokenFetcher.java", "TouchEventParameter.java", "TouchInputHandler.java", @@ -54,6 +56,7 @@ "TrackpadInputStrategy.java", "TapEventParameter.java", "TwoPointsEventParameter.java", + "WebViewActivity.java", "accountswitcher/AccountManagerCompat.java", "accountswitcher/AccountSwitcher.java", "accountswitcher/AccountSwitcherBase.java",
diff --git a/remoting/android/java/AndroidManifest.xml.jinja2 b/remoting/android/java/AndroidManifest.xml.jinja2 index da6abba..ce070c0 100644 --- a/remoting/android/java/AndroidManifest.xml.jinja2 +++ b/remoting/android/java/AndroidManifest.xml.jinja2
@@ -49,6 +49,12 @@ android:exported="false" android:uiOptions="splitActionBarWhenNarrow"/> <activity + android:name="org.chromium.chromoting.TermsOfServiceActivity" + android:exported="false"/> + <activity + android:name="org.chromium.chromoting.PrivacyPolicyActivity" + android:exported="false"/> + <activity android:name="org.chromium.chromoting.help.CreditsActivity" android:exported="true"/> </application>
diff --git a/remoting/android/java/res/layout/navigation_list_separator.xml b/remoting/android/java/res/layout/navigation_list_separator.xml new file mode 100644 index 0000000..9c58557 --- /dev/null +++ b/remoting/android/java/res/layout/navigation_list_separator.xml
@@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. +--> + +<View xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/navigation_list_separator" + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="@android:color/darker_gray"/>
diff --git a/remoting/android/java/src/org/chromium/chromoting/NavigationMenuAdapter.java b/remoting/android/java/src/org/chromium/chromoting/NavigationMenuAdapter.java index b4ab754..86842f60 100644 --- a/remoting/android/java/src/org/chromium/chromoting/NavigationMenuAdapter.java +++ b/remoting/android/java/src/org/chromium/chromoting/NavigationMenuAdapter.java
@@ -6,6 +6,7 @@ import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; @@ -28,6 +29,8 @@ * Defines a menu item. */ public static class NavigationMenuItem { + public static final NavigationMenuItem SEPARATOR = new NavigationMenuItem(null, null, null); + private String mText; private Drawable mIcon; private Runnable mCallback; @@ -45,23 +48,25 @@ NavigationMenuItem feedbackItem = new NavigationMenuItem( chromoting.getResources().getString(R.string.actionbar_send_feedback), - getIcon(chromoting, R.drawable.ic_announcement), new Runnable() { - @Override - public void run() { - chromoting.launchFeedback(); - } + getIcon(chromoting, R.drawable.ic_announcement), chromoting::launchFeedback); + + NavigationMenuItem helpItem = + new NavigationMenuItem(chromoting.getResources().getString(R.string.actionbar_help), + getIcon(chromoting, R.drawable.ic_help), + () -> chromoting.launchHelp(HelpContext.HOST_LIST)); + + NavigationMenuItem tosItem = new NavigationMenuItem( + chromoting.getResources().getString(R.string.terms_of_service), null, () -> { + chromoting.startActivity(new Intent(chromoting, TermsOfServiceActivity.class)); }); - NavigationMenuItem helpItem = new NavigationMenuItem( - chromoting.getResources().getString(R.string.actionbar_help), - getIcon(chromoting, R.drawable.ic_help), new Runnable() { - @Override - public void run() { - chromoting.launchHelp(HelpContext.HOST_LIST); - } + NavigationMenuItem privacyPolicyItem = new NavigationMenuItem( + chromoting.getResources().getString(R.string.privacy_policy), null, () -> { + chromoting.startActivity(new Intent(chromoting, PrivacyPolicyActivity.class)); }); - NavigationMenuItem[] navigationMenuItems = { feedbackItem, helpItem }; + NavigationMenuItem[] navigationMenuItems = { + feedbackItem, helpItem, NavigationMenuItem.SEPARATOR, tosItem, privacyPolicyItem}; NavigationMenuAdapter adapter = new NavigationMenuAdapter(chromoting, navigationMenuItems); navigationMenu.setAdapter(adapter); navigationMenu.setOnItemClickListener(adapter); @@ -82,13 +87,21 @@ /** Generates a View corresponding to the particular navigation item. */ @Override public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - LayoutInflater inflater = - (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.navigation_list_item, parent, false); - } - TextView textView = (TextView) convertView.findViewById(R.id.navigation_item_label); NavigationMenuItem item = getItem(position); + Preconditions.notNull(item); + if (item == NavigationMenuItem.SEPARATOR) { + if (convertView == null || convertView instanceof TextView) { + convertView = + getInflater().inflate(R.layout.navigation_list_separator, parent, false); + } + Preconditions.notNull(convertView); + return convertView; + } + if (convertView == null || !(convertView instanceof TextView)) { + convertView = getInflater().inflate(R.layout.navigation_list_item, parent, false); + } + Preconditions.notNull(convertView); + TextView textView = convertView.findViewById(R.id.navigation_item_label); textView.setCompoundDrawables(item.mIcon, null, null, null); textView.setText(item.mText); return convertView; @@ -100,4 +113,8 @@ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { getItem(position).mCallback.run(); } + + private LayoutInflater getInflater() { + return (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } }
diff --git a/remoting/android/java/src/org/chromium/chromoting/PrivacyPolicyActivity.java b/remoting/android/java/src/org/chromium/chromoting/PrivacyPolicyActivity.java new file mode 100644 index 0000000..8f4ec28b --- /dev/null +++ b/remoting/android/java/src/org/chromium/chromoting/PrivacyPolicyActivity.java
@@ -0,0 +1,16 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chromoting; + +/** + * The Activity for showing the privacy policy. + */ +public class PrivacyPolicyActivity extends WebViewActivity { + private static final String POLICY_URL = "https://policies.google.com/privacy"; + + public PrivacyPolicyActivity() { + super(R.string.privacy_policy, POLICY_URL); + } +}
diff --git a/remoting/android/java/src/org/chromium/chromoting/TermsOfServiceActivity.java b/remoting/android/java/src/org/chromium/chromoting/TermsOfServiceActivity.java new file mode 100644 index 0000000..1afad9e --- /dev/null +++ b/remoting/android/java/src/org/chromium/chromoting/TermsOfServiceActivity.java
@@ -0,0 +1,16 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chromoting; + +/** + * The Activity for showing the terms of service. + */ +public class TermsOfServiceActivity extends WebViewActivity { + private static final String TOS_URL = "https://policies.google.com/terms"; + + public TermsOfServiceActivity() { + super(R.string.terms_of_service, TOS_URL); + } +}
diff --git a/remoting/android/java/src/org/chromium/chromoting/WebViewActivity.java b/remoting/android/java/src/org/chromium/chromoting/WebViewActivity.java new file mode 100644 index 0000000..6a883791 --- /dev/null +++ b/remoting/android/java/src/org/chromium/chromoting/WebViewActivity.java
@@ -0,0 +1,76 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chromoting; + +import android.annotation.TargetApi; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.StringRes; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.webkit.WebResourceRequest; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +/** + * The Activity for showing the Credits screen. + */ +public class WebViewActivity extends AppCompatActivity { + private final @StringRes int mTitleId; + private final String mUrl; + + public WebViewActivity(@StringRes int titleId, String url) { + super(); + mTitleId = titleId; + mUrl = url; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.credits); + WebView webView = (WebView) findViewById(R.id.web_view); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setTitle(getString(mTitleId)); + + webView.getSettings().setJavaScriptEnabled(true); + webView.setWebViewClient(new WebViewClient() { + private boolean shouldOverrideUrlLoading(final Uri uri) { + ChromotingUtil.openUrl(WebViewActivity.this, uri); + return true; + } + + @TargetApi(Build.VERSION_CODES.N) + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + return shouldOverrideUrlLoading(request.getUrl()); + } + + @SuppressWarnings("deprecation") + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return shouldOverrideUrlLoading(Uri.parse(url)); + } + }); + webView.loadUrl(mUrl); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } +}
diff --git a/remoting/android/java/src/org/chromium/chromoting/help/CreditsActivity.java b/remoting/android/java/src/org/chromium/chromoting/help/CreditsActivity.java index 2a6e277..bcdeecf 100644 --- a/remoting/android/java/src/org/chromium/chromoting/help/CreditsActivity.java +++ b/remoting/android/java/src/org/chromium/chromoting/help/CreditsActivity.java
@@ -4,70 +4,16 @@ package org.chromium.chromoting.help; -import android.annotation.TargetApi; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.view.MenuItem; -import android.webkit.WebResourceRequest; -import android.webkit.WebView; -import android.webkit.WebViewClient; - -import org.chromium.chromoting.ChromotingUtil; import org.chromium.chromoting.R; +import org.chromium.chromoting.WebViewActivity; /** * The Activity for showing the Credits screen. */ -public class CreditsActivity extends AppCompatActivity { +public class CreditsActivity extends WebViewActivity { private static final String CREDITS_URL = "file:///android_res/raw/credits.html"; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.credits); - WebView webView = (WebView) findViewById(R.id.web_view); - - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle(getString(R.string.actionbar_help_title)); - - webView.getSettings().setJavaScriptEnabled(true); - webView.setWebViewClient(new WebViewClient() { - private boolean shouldOverrideUrlLoading(final Uri uri) { - // There are no internal links in the Credits page, so open any links in a - // Web browser. - ChromotingUtil.openUrl(CreditsActivity.this, uri); - return true; - } - - @TargetApi(Build.VERSION_CODES.N) - @Override - public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { - return shouldOverrideUrlLoading(request.getUrl()); - } - - @SuppressWarnings("deprecation") - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - return shouldOverrideUrlLoading(Uri.parse(url)); - } - }); - webView.loadUrl(CREDITS_URL); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - finish(); - return true; - } - return super.onOptionsItemSelected(item); + public CreditsActivity() { + super(R.string.credits, CREDITS_URL); } }
diff --git a/remoting/resources/remoting_strings.grd b/remoting/resources/remoting_strings.grd index c4d100e..e31ecb35 100644 --- a/remoting/resources/remoting_strings.grd +++ b/remoting/resources/remoting_strings.grd
@@ -653,6 +653,12 @@ <message name="IDS_SERVER_COMMUNICATION_ERROR" desc="Message shown when the client fails to communicate with the back end server."> Failed to communicate with the server: <ph name="ERROR">$1<ex>Server Unavailable</ex></ph> </message> + <message name="IDS_TERMS_OF_SERVICE" desc="The label to access the terms of service, displayed in navigation menu." formatter_data="android_java"> + Terms of Service + </message> + <message name="IDS_PRIVACY_POLICY" desc="The label to access the privacy policy, displayed in navigation menu." formatter_data="android_java"> + Privacy Policy + </message> <!-- Play Store listings text. These Android-specific strings are not marked with formatter_data="android_java" since they are used only for the Play
diff --git a/remoting/resources/remoting_strings_grd/IDS_PRIVACY_POLICY.png.sha1 b/remoting/resources/remoting_strings_grd/IDS_PRIVACY_POLICY.png.sha1 new file mode 100644 index 0000000..ee1e84d --- /dev/null +++ b/remoting/resources/remoting_strings_grd/IDS_PRIVACY_POLICY.png.sha1
@@ -0,0 +1 @@ +8900724d6e561e28e55a36999291f02d988371c1 \ No newline at end of file
diff --git a/remoting/resources/remoting_strings_grd/IDS_TERMS_OF_SERVICE.png.sha1 b/remoting/resources/remoting_strings_grd/IDS_TERMS_OF_SERVICE.png.sha1 new file mode 100644 index 0000000..ee1e84d --- /dev/null +++ b/remoting/resources/remoting_strings_grd/IDS_TERMS_OF_SERVICE.png.sha1
@@ -0,0 +1 @@ +8900724d6e561e28e55a36999291f02d988371c1 \ No newline at end of file
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb index 7aaf69c..f7c76da 100644 --- a/remoting/resources/remoting_strings_hi.xtb +++ b/remoting/resources/remoting_strings_hi.xtb
@@ -151,7 +151,7 @@ <translation id="4207623512727273241">कृपया जारी रखने से पहले इंस्टॉलर चलाएं.</translation> <translation id="4227991223508142681">होस्ट प्रावधानीकरण सुविधा</translation> <translation id="4240294130679914010">Chromoting होस्ट अनइंस्टॉलर</translation> -<translation id="4277463233460010382">इस कंप्यूटर को PIN डाले बिना एक या इससे अधिक क्लाइंट से कनेक्ट करने देने के लिए कॉन्फ़िगर किया गया है.</translation> +<translation id="4277463233460010382">इस कंप्यूटर को PIN डाले बिना एक या इससे ज़्यादा क्लाइंट से कनेक्ट करने देने के लिए कॉन्फ़िगर किया गया है.</translation> <translation id="4277736576214464567">एक्सेस कोड गलत है. कृपया फिर से कोशिश करें.</translation> <translation id="4361728918881830843">किसी भिन्न कंप्यूटर के लिए दूरस्थ कनेक्शन सक्षम करने के लिए, वहां Chrome दूरस्थ डेस्कटॉप इंस्टॉल करें और “<ph name="BUTTON_NAME" />” क्लिक करें.</translation> <translation id="4394049700291259645">बंद करें</translation> @@ -202,7 +202,7 @@ <translation id="5081343395220691640">सर्वर से संपर्क नहीं किया जा सका: <ph name="ERROR" /></translation> <translation id="5156271271724754543">कृपया दोनों बॉक्स में समान पिन दर्ज करें.</translation> <translation id="5170982930780719864">अमान्य होस्ट आईडी.</translation> -<translation id="518094545883702183">इस जानकारी का उपयोग आपके द्वारा रिपोर्ट की जा रही समस्या का निदान करने के लिए ही किया जाता है, यह आपकी रिपोर्ट की जाँच कर रहे व्यक्ति के लिए ही उपलब्ध होती है, और इसे 30 दिन से अधिक समय तक नहीं रखा जाता.</translation> +<translation id="518094545883702183">इस जानकारी का उपयोग आपके द्वारा रिपोर्ट की जा रही समस्या का निदान करने के लिए ही किया जाता है, यह आपकी रिपोर्ट की जाँच कर रहे व्यक्ति के लिए ही उपलब्ध होती है, और इसे 30 दिन से ज़्यादा समय तक नहीं रखा जाता.</translation> <translation id="5204575267916639804">अक्सर पूछे जाने वाले सवाल</translation> <translation id="5222676887888702881">साइन आउट करें</translation> <translation id="5254120496627797685">इस पेज को छोड़ देने पर आपका Chrome दूरस्थ डेस्कटॉप सत्र खत्म हो जाएगा.</translation> @@ -222,7 +222,7 @@ <translation id="5702987232842159181">कनेक्ट किया गया:</translation> <translation id="5708869785009007625">आपका डेस्कटॉप वर्तमान में <ph name="USER" /> के साथ शेयर किया गया है.</translation> <translation id="5750083143895808682"><ph name="EMAIL_ADDRESS" /> के रूप में साइन इन किया है.</translation> -<translation id="5773590752998175013">युग्मन दिनांक</translation> +<translation id="5773590752998175013">युग्मन तारीख</translation> <translation id="579702532610384533">फिर से कनेक्ट करें</translation> <translation id="5810269635982033450">स्क्रीन किसी ट्रैकपैड की तरह काम करती है</translation> <translation id="5823658491130719298">आप जिस कंप्यूटर को दूर से एक्सेस करना चाहते हैं, उस पर Chrome खोलें और <ph name="INSTALLATION_LINK" /> पर जाएं</translation> @@ -285,7 +285,7 @@ <translation id="7116737094673640201">Chrome दूरस्थ डेस्कटॉप में आपका स्वागत है</translation> <translation id="7144878232160441200">फिर से प्रयास करें</translation> <translation id="7149517134817561223">ऐप्लिकेशन, Chrome दूरस्थ डेस्कटॉप होस्ट को आदेश जारी करेगा.</translation> -<translation id="7215059001581613786">कृपया छः या अधिक अंकों वाला पिन दर्ज करें.</translation> +<translation id="7215059001581613786">कृपया छः या ज़्यादा अंकों वाला पिन दर्ज करें.</translation> <translation id="7312846573060934304">होस्ट ऑफ़लाइन है.</translation> <translation id="7319983568955948908">साझाकरण रोकें</translation> <translation id="7401733114166276557">Chrome दूरस्थ डेस्कटॉप</translation>
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index f1c7896d..e2a57fa 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -1835,10 +1835,6 @@ std::move(params_->initial_proxy_config), std::move(params_->proxy_config_poller_client))); builder->set_pac_quick_check_enabled(params_->pac_quick_check_enabled); - builder->set_pac_sanitize_url_policy( - params_->dangerously_allow_pac_access_to_secure_urls - ? net::ProxyResolutionService::SanitizeUrlPolicy::UNSAFE - : net::ProxyResolutionService::SanitizeUrlPolicy::SAFE); std::unique_ptr<PrefService> pref_service; if (params_->http_server_properties_path) {
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc index 76b9a03b..2a84df3 100644 --- a/services/network/network_context_unittest.cc +++ b/services/network/network_context_unittest.cc
@@ -2378,34 +2378,6 @@ ->quick_check_enabled_for_testing()); } -TEST_F(NetworkContextTest, DangerouslyAllowPacAccessToSecureURLs) { - // Check the default value. - std::unique_ptr<NetworkContext> network_context = - CreateContextWithParams(CreateContextParams()); - EXPECT_EQ(net::ProxyResolutionService::SanitizeUrlPolicy::SAFE, - network_context->url_request_context() - ->proxy_resolution_service() - ->sanitize_url_policy_for_testing()); - - // Explicitly disable. - mojom::NetworkContextParamsPtr context_params = CreateContextParams(); - context_params->dangerously_allow_pac_access_to_secure_urls = false; - network_context = CreateContextWithParams(std::move(context_params)); - EXPECT_EQ(net::ProxyResolutionService::SanitizeUrlPolicy::SAFE, - network_context->url_request_context() - ->proxy_resolution_service() - ->sanitize_url_policy_for_testing()); - - // Explicitly enable. - context_params = CreateContextParams(); - context_params->dangerously_allow_pac_access_to_secure_urls = true; - network_context = CreateContextWithParams(std::move(context_params)); - EXPECT_EQ(net::ProxyResolutionService::SanitizeUrlPolicy::UNSAFE, - network_context->url_request_context() - ->proxy_resolution_service() - ->sanitize_url_policy_for_testing()); -} - net::IPEndPoint GetLocalHostWithAnyPort() { return net::IPEndPoint(net::IPAddress(127, 0, 0, 1), 0); }
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom index 29a7329..2bc4866 100644 --- a/services/network/public/mojom/network_context.mojom +++ b/services/network/public/mojom/network_context.mojom
@@ -293,11 +293,6 @@ // likely that the network service erroneously fails to fetch a PAC file. bool pac_quick_check_enabled = true; - // When enabled, exposes full URLs to PAC scripts. This setting will be - // removed in the future. - // See https://crbug.com/619087 - bool dangerously_allow_pac_access_to_secure_urls = false; - // Enables reporting certain SSL errors, such as HTTP Public Key Pinning, to // servers, so they can discover misconfigurations. bool enable_certificate_reporting = false;
diff --git a/services/viz/privileged/interfaces/gl/BUILD.gn b/services/viz/privileged/interfaces/gl/BUILD.gn index 2e03b5d..8ae4ede 100644 --- a/services/viz/privileged/interfaces/gl/BUILD.gn +++ b/services/viz/privileged/interfaces/gl/BUILD.gn
@@ -19,6 +19,9 @@ "//url/mojom:url_mojom_gurl", ] if (is_chromeos) { - public_deps += [ "//components/arc/common:media" ] + public_deps += [ + "//components/arc/common:media", + "//components/chromeos_camera/common", + ] } }
diff --git a/services/viz/privileged/interfaces/gl/gpu_service.mojom b/services/viz/privileged/interfaces/gl/gpu_service.mojom index a08feb74..d823885c 100644 --- a/services/viz/privileged/interfaces/gl/gpu_service.mojom +++ b/services/viz/privileged/interfaces/gl/gpu_service.mojom
@@ -12,13 +12,14 @@ import "components/arc/common/video_encode_accelerator.mojom"; [EnableIf=is_chromeos] import "components/arc/common/video_protected_buffer_allocator.mojom"; +[EnableIf=is_chromeos] +import "components/chromeos_camera/common/jpeg_encode_accelerator.mojom"; import "gpu/ipc/common/dx_diag_node.mojom"; import "gpu/ipc/common/gpu_info.mojom"; import "gpu/ipc/common/memory_stats.mojom"; import "gpu/ipc/common/surface_handle.mojom"; import "gpu/ipc/common/sync_token.mojom"; import "media/mojo/interfaces/mjpeg_decode_accelerator.mojom"; -import "media/mojo/interfaces/jpeg_encode_accelerator.mojom"; import "media/mojo/interfaces/video_encode_accelerator.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; import "ui/gfx/mojo/buffer_types.mojom"; @@ -57,6 +58,7 @@ CreateJpegDecodeAccelerator(media.mojom.MjpegDecodeAccelerator& jda); // Creates a new JpegEncodeAccelerator and binds it to |jea|. + [EnableIf=is_chromeos] CreateJpegEncodeAccelerator(media.mojom.JpegEncodeAccelerator& jea); // Creates a VideoEncodeAcceleratorProvider and binds it to |vea_provider|.
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 98a669f..b8f065d 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -17992,6 +17992,9 @@ "isolated_scripts": [ { "isolate_name": "resource_sizes_cronet_sample_apk", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, "name": "resource_sizes_cronet_sample_apk", "swarming": { "can_use_on_swarming_builders": false @@ -18051,6 +18054,9 @@ "isolated_scripts": [ { "isolate_name": "resource_sizes_cronet_sample_apk", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, "name": "resource_sizes_cronet_sample_apk", "swarming": { "can_use_on_swarming_builders": false @@ -19033,6 +19039,9 @@ "isolated_scripts": [ { "isolate_name": "resource_sizes_cronet_sample_apk", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, "name": "resource_sizes_cronet_sample_apk", "swarming": { "can_use_on_swarming_builders": false
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index 7e5a8ac..677346d 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -2142,6 +2142,32 @@ } ] } + }, + { + "args": [ + "--num-retries=3", + "--target", + "Release_x64" + ], + "isolate_name": "blink_web_tests_exparchive", + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "webkit_layout_tests", + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-15063" + } + ], + "shards": 12 + } } ] },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 1e467b97..308a05e 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1571,8 +1571,6 @@ 'Win 7 Tests x64 (1)', # 64-bit win is unsupported by the layout tests. 'Win10 Tests x64 (dbg)', - 'Win10 Tests x64', # TODO(tikuta): enable this (crbug.com/950584) - # chromium.mac. TODO(https://crbug.com/944117): Remove this. 'mac-dummy-rel', ], @@ -1849,6 +1847,12 @@ ], }, }, + 'Win10 Tests x64': { + 'args': [ + '--target', + 'Release_x64', + ], + }, 'Win10 Tests x64 (dbg)': { 'args': [ '--debug',
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index e94d42d..f218a633 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -2699,6 +2699,9 @@ 'cronet_isolated_scripts': { 'resource_sizes_cronet_sample_apk': { + 'merge': { + 'script': '//tools/perf/process_perf_results.py', + }, 'swarming': { 'can_use_on_swarming_builders': False, },
diff --git a/third_party/blink/public/platform/modules/installedapp/web_related_apps_fetcher.h b/third_party/blink/public/platform/modules/installedapp/web_related_apps_fetcher.h index da6eb9ab..2f34998 100644 --- a/third_party/blink/public/platform/modules/installedapp/web_related_apps_fetcher.h +++ b/third_party/blink/public/platform/modules/installedapp/web_related_apps_fetcher.h
@@ -5,8 +5,8 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INSTALLEDAPP_WEB_RELATED_APPS_FETCHER_H_ #define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INSTALLEDAPP_WEB_RELATED_APPS_FETCHER_H_ +#include "base/callback.h" #include "third_party/blink/public/platform/modules/installedapp/web_related_application.h" -#include "third_party/blink/public/platform/web_callbacks.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/platform/web_vector.h" @@ -14,8 +14,8 @@ namespace blink { -using AppInstalledCallbacks = - WebCallbacks<const WebVector<WebRelatedApplication>&, void>; +using GetManifestRelatedApplicationsCallback = + base::OnceCallback<void(const WebVector<WebRelatedApplication>&)>; class WebRelatedAppsFetcher { public: @@ -23,7 +23,7 @@ // Gets the list of related applications from the web frame's manifest. virtual void GetManifestRelatedApplications( - std::unique_ptr<AppInstalledCallbacks>) = 0; + GetManifestRelatedApplicationsCallback) = 0; }; } // namespace blink
diff --git a/third_party/blink/public/web/web_ax_object.h b/third_party/blink/public/web/web_ax_object.h index 4d227af5..13ac49de6 100644 --- a/third_party/blink/public/web/web_ax_object.h +++ b/third_party/blink/public/web/web_ax_object.h
@@ -184,6 +184,7 @@ BLINK_EXPORT WebVector<WebAXObject> RadioButtonsInGroup() const; BLINK_EXPORT ax::mojom::Role Role() const; BLINK_EXPORT WebString StringValue() const; + BLINK_EXPORT ax::mojom::ListStyle GetListStyle() const; BLINK_EXPORT ax::mojom::TextDirection GetTextDirection() const; BLINK_EXPORT ax::mojom::TextPosition GetTextPosition() const; BLINK_EXPORT void GetTextStyleAndTextDecorationStyle(
diff --git a/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc b/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc index 68d19bf..02d087e 100644 --- a/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc +++ b/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc
@@ -57,8 +57,6 @@ #include "third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h" #include "third_party/blink/renderer/platform/bindings/v8_private_property.h" #include "third_party/blink/renderer/platform/heap/handle.h" -#include "third_party/blink/renderer/platform/heap/heap.h" -#include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/weborigin/security_violation_reporting_policy.h" @@ -146,15 +144,6 @@ void LocalWindowProxy::Initialize() { TRACE_EVENT1("v8", "LocalWindowProxy::Initialize", "IsMainFrame", GetFrame()->IsMainFrame()); - DEFINE_STATIC_LOCAL( - CustomCountHistogram, main_frame_hist, - ("Blink.Binding.InitializeMainLocalWindowProxy", 0, 10000000, 50)); - DEFINE_STATIC_LOCAL( - CustomCountHistogram, non_main_frame_hist, - ("Blink.Binding.InitializeNonMainLocalWindowProxy", 0, 10000000, 50)); - ScopedUsHistogramTimer timer(GetFrame()->IsMainFrame() ? main_frame_hist - : non_main_frame_hist); - CHECK(!GetFrame()->IsProvisional()); ScriptForbiddenScope::AllowUserAgentScript allow_script; // Inspector may request V8 interruption to process DevTools protocol @@ -226,15 +215,6 @@ v8::Local<v8::Context> context; { - DEFINE_STATIC_LOCAL( - CustomCountHistogram, main_frame_hist, - ("Blink.Binding.CreateV8ContextForMainFrame", 0, 10000000, 50)); - DEFINE_STATIC_LOCAL( - CustomCountHistogram, non_main_frame_hist, - ("Blink.Binding.CreateV8ContextForNonMainFrame", 0, 10000000, 50)); - ScopedUsHistogramTimer timer( - GetFrame()->IsMainFrame() ? main_frame_hist : non_main_frame_hist); - v8::Isolate* isolate = GetIsolate(); V8PerIsolateData::UseCounterDisabledScope use_counter_disabled( V8PerIsolateData::From(isolate));
diff --git a/third_party/blink/renderer/bindings/core/v8/remote_window_proxy.cc b/third_party/blink/renderer/bindings/core/v8/remote_window_proxy.cc index 3714e04..e94085b 100644 --- a/third_party/blink/renderer/bindings/core/v8/remote_window_proxy.cc +++ b/third_party/blink/renderer/bindings/core/v8/remote_window_proxy.cc
@@ -37,7 +37,6 @@ #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h" #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" #include "third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h" -#include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" #include "v8/include/v8.h" @@ -96,11 +95,6 @@ void RemoteWindowProxy::Initialize() { TRACE_EVENT1("v8", "RemoteWindowProxy::initialize", "isMainWindow", GetFrame()->IsMainFrame()); - SCOPED_BLINK_UMA_HISTOGRAM_TIMER( - GetFrame()->IsMainFrame() - ? "Blink.Binding.InitializeMainRemoteWindowProxy" - : "Blink.Binding.InitializeNonMainRemoteWindowProxy"); - ScriptForbiddenScope::AllowUserAgentScript allow_script; v8::HandleScope handle_scope(GetIsolate());
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc index 330f3ac..c3567b4 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
@@ -98,6 +98,11 @@ // can do minimal work to ensure we have a context, ignoring containment and // other requirements. SetBodyInnerHTML(R"HTML( + <style> + div { + contain: style layout; + } + </style> <div id="container"></div> )HTML"); @@ -273,6 +278,11 @@ // can do minimal work to ensure we have a context, ignoring containment and // other requirements. SetBodyInnerHTML(R"HTML( + <style> + div { + contain: style layout; + } + </style> <div id="container"></div> )HTML");
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 452a79b..36e4178 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -189,6 +189,17 @@ // If we're already connected then we need to ensure that we update our layout // size based on the options and we have cleared the painted output. if (ConnectedToView()) { + if (!ElementSupportsDisplayLocking()) { + // The element has up-to-date style and doesn't satisfy the containment + // requirement, so we unlock and reject now. + // If the style needs recalc we would instead check containment after + // style recalc for this element. + DCHECK(!element_->NeedsStyleRecalc()); + state_ = kUnlocked; + return GetRejectedPromise(script_state, + rejection_names::kContainmentNotSatisfied); + } + acquire_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); if (auto* layout_object = element_->GetLayoutObject()) { @@ -337,7 +348,25 @@ } void DisplayLockContext::DidStyle(LifecycleTarget target) { + if (state_ == kUnlocked) + return; + if (target == kSelf) { + // We must have "contain: style layout" for display locking. + // Note that we should always have this containment after every style + // update. Otherwise, proceeding with layout may cause unexpected behavior. + // By rejecting the promise, the behavior can be detected by script. + // TODO(rakina): If this is after acquire's promise is resolved and update() + // commit() isn't in progress, the web author won't know that the element + // got unlocked. Figure out how to notify the author. + if (!ElementSupportsDisplayLocking()) { + FinishUpdateResolver(kReject, rejection_names::kContainmentNotSatisfied); + FinishCommitResolver(kReject, rejection_names::kContainmentNotSatisfied); + FinishAcquireResolver(kReject, rejection_names::kContainmentNotSatisfied); + state_ = kUnlocked; + return; + } + if (blocked_style_traversal_type_ == kStyleUpdateSelf) blocked_style_traversal_type_ = kStyleUpdateNotRequired; return; @@ -349,19 +378,6 @@ blocked_style_traversal_type_ = kStyleUpdateNotRequired; MarkElementsForWhitespaceReattachment(); - // We must have "contain: style layout" for display locking. - // Note that we should also have this containment even if we're forcing - // this update to happen. Otherwise, proceeding with layout may cause - // unexpected behavior. By rejecting the promise, the behavior can be detected - // by script. - if (!ElementSupportsDisplayLocking()) { - bool should_stay_locked = state_ == kUpdating && !commit_resolver_; - FinishUpdateResolver(kReject, rejection_names::kContainmentNotSatisfied); - FinishCommitResolver(kReject, rejection_names::kContainmentNotSatisfied); - FinishAcquireResolver(kReject, rejection_names::kContainmentNotSatisfied); - state_ = should_stay_locked ? kLocked : kUnlocked; - return; - } if (state_ == kUpdating) update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kStyle);
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 68508d9..a2efa4b 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -720,7 +720,8 @@ } else { fetcher_ = MakeGarbageCollected<ResourceFetcher>(ResourceFetcherInit( *MakeGarbageCollected<NullResourceFetcherProperties>(), - &FetchContext::NullInstance(), GetTaskRunner(TaskType::kNetworking))); + &FetchContext::NullInstance(), GetTaskRunner(TaskType::kNetworking), + nullptr /* loader_factory */)); } DCHECK(fetcher_);
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client.cc b/third_party/blink/renderer/core/editing/caret_display_item_client.cc index 0955f34..4c715aa 100644 --- a/third_party/blink/renderer/core/editing/caret_display_item_client.cc +++ b/third_party/blink/renderer/core/editing/caret_display_item_client.cc
@@ -52,11 +52,11 @@ return node && !IsDisplayInsideTable(node) && !EditingIgnoresContent(*node); } -LayoutBlock* CaretLayoutBlock(const Node* node) { +LayoutBlock* CaretLayoutBlock(const Node* node, + const LayoutObject* layout_object) { if (!node) return nullptr; - LayoutObject* layout_object = node->GetLayoutObject(); if (!layout_object) return nullptr; @@ -64,13 +64,7 @@ // if caretNode is a block and caret is inside it then caret should be painted // by that block bool painted_by_block = caret_layout_object && CaretRendersInsideNode(node); - // TODO(yoichio): This function is called at least - // DocumentLifeCycle::LayoutClean but caretRendersInsideNode above can - // layout. Thus |node->layoutObject()| can be changed then this is bad - // design. We should make caret painting algorithm clean. - CHECK_EQ(layout_object, node->GetLayoutObject()) - << "Layout tree should not changed"; - return painted_by_block ? caret_layout_object + return painted_by_block ? const_cast<LayoutBlock*>(caret_layout_object) : layout_object->ContainingBlock(); } @@ -99,24 +93,25 @@ } // namespace -LayoutRect CaretDisplayItemClient::ComputeCaretRect( +CaretDisplayItemClient::CaretRectAndPainterBlock +CaretDisplayItemClient::ComputeCaretRectAndPainterBlock( const PositionWithAffinity& caret_position) { if (caret_position.IsNull()) - return LayoutRect(); + return {}; if (!caret_position.AnchorNode()->GetLayoutObject()) - return LayoutRect(); + return {}; // First compute a rect local to the layoutObject at the selection start. const LocalCaretRect& caret_rect = LocalCaretRectOfPosition(caret_position); if (!caret_rect.layout_object) - return LayoutRect(); + return {}; // Get the layoutObject that will be responsible for painting the caret // (which is either the layoutObject we just found, or one of its containers). - const LayoutBlock* caret_block = - CaretLayoutBlock(caret_position.AnchorNode()); - return MapCaretRectToCaretPainter(caret_block, caret_rect); + LayoutBlock* caret_block = + CaretLayoutBlock(caret_position.AnchorNode(), caret_rect.layout_object); + return {MapCaretRectToCaretPainter(caret_block, caret_rect), caret_block}; } void CaretDisplayItemClient::ClearPreviousVisualRect(const LayoutBlock& block) { @@ -147,7 +142,9 @@ visual_rect_in_previous_layout_block_ = visual_rect_; } - LayoutBlock* new_layout_block = CaretLayoutBlock(caret_position.AnchorNode()); + CaretRectAndPainterBlock rect_and_block = + ComputeCaretRectAndPainterBlock(caret_position); + LayoutBlock* new_layout_block = rect_and_block.painter_block; if (new_layout_block != layout_block_) { if (layout_block_) layout_block_->SetShouldCheckForPaintInvalidation(); @@ -181,7 +178,7 @@ color_ = new_color; } - LayoutRect new_local_rect = ComputeCaretRect(caret_position); + LayoutRect new_local_rect = rect_and_block.caret_rect; if (new_local_rect != local_rect_) { needs_paint_invalidation_ = true; local_rect_ = new_local_rect;
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client.h b/third_party/blink/renderer/core/editing/caret_display_item_client.h index 3354563cd..15d88d1 100644 --- a/third_party/blink/renderer/core/editing/caret_display_item_client.h +++ b/third_party/blink/renderer/core/editing/caret_display_item_client.h
@@ -74,10 +74,14 @@ friend class CaretDisplayItemClientTest; friend class ParameterizedComputeCaretRectTest; + struct CaretRectAndPainterBlock { + LayoutRect caret_rect; // local to |painter_block| + LayoutBlock* painter_block = nullptr; + }; // Creating VisiblePosition causes synchronous layout so we should use the // PositionWithAffinity version if possible. // A position in HTMLTextFromControlElement is a typical example. - static LayoutRect ComputeCaretRect( + static CaretRectAndPainterBlock ComputeCaretRectAndPainterBlock( const PositionWithAffinity& caret_position); void InvalidatePaintInCurrentLayoutBlock(const PaintInvalidatorContext&);
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc b/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc index 941ce89..46915315 100644 --- a/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc +++ b/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc
@@ -374,7 +374,8 @@ protected: LayoutRect ComputeCaretRect(const PositionWithAffinity& position) const { - return CaretDisplayItemClient::ComputeCaretRect(position); + return CaretDisplayItemClient::ComputeCaretRectAndPainterBlock(position) + .caret_rect; } };
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observation.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observation.cc index a82d786c..5321705 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observation.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observation.cc
@@ -50,7 +50,7 @@ // Compute() method will be called again after the delay period has passed. return; } - if (Observer()->trackVisibility()) { + if (target_->isConnected() && Observer()->trackVisibility()) { FrameOcclusionState occlusion_state = target_->GetDocument().GetFrame()->GetOcclusionState(); // If we're tracking visibility, and we don't have occlusion information @@ -103,7 +103,8 @@ DCHECK(Observer()); if (target_) { Target()->EnsureIntersectionObserverData().RemoveObservation(*Observer()); - if (target_->isConnected()) { + if (target_->isConnected() && + !Target()->EnsureIntersectionObserverData().HasObservations()) { target_->GetDocument() .EnsureIntersectionObserverController() .RemoveTrackedTarget(*target_);
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc index 325e6a0..b51e043 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc
@@ -109,15 +109,15 @@ SimRequest main_resource("https://example.com/", "text/html"); LoadURL("https://example.com/"); main_resource.Complete(R"HTML( -<style> -#target { - width: 100px; - height: 100px; -} -</style> -<div id='root'> - <div id='target'></div> -</div> + <style> + #target { + width: 100px; + height: 100px; + } + </style> + <div id='root'> + <div id='target'></div> + </div> )HTML"); Element* root = GetDocument().getElementById("root"); @@ -421,6 +421,43 @@ EXPECT_TRUE(observer_delegate->LastIntersectionRect().IsEmpty()); } +TEST_F(IntersectionObserverTest, TrackedTargetBookkeeping) { + SimRequest main_resource("https://example.com/", "text/html"); + LoadURL("https://example.com/"); + main_resource.Complete(R"HTML( + <style> + </style> + <div id='target'></div> + )HTML"); + + Element* target = GetDocument().getElementById("target"); + ASSERT_TRUE(target); + IntersectionObserverInit* observer_init = IntersectionObserverInit::Create(); + DummyExceptionStateForTesting exception_state; + TestIntersectionObserverDelegate* observer_delegate = + MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument()); + IntersectionObserver* observer1 = IntersectionObserver::Create( + observer_init, *observer_delegate, exception_state); + ASSERT_FALSE(exception_state.HadException()); + observer1->observe(target, exception_state); + ASSERT_FALSE(exception_state.HadException()); + IntersectionObserver* observer2 = IntersectionObserver::Create( + observer_init, *observer_delegate, exception_state); + ASSERT_FALSE(exception_state.HadException()); + observer2->observe(target, exception_state); + ASSERT_FALSE(exception_state.HadException()); + + IntersectionObserverController& controller = + GetDocument().EnsureIntersectionObserverController(); + EXPECT_EQ(controller.GetTrackedTargetCountForTesting(), 1u); + observer1->unobserve(target, exception_state); + ASSERT_FALSE(exception_state.HadException()); + EXPECT_EQ(controller.GetTrackedTargetCountForTesting(), 1u); + observer2->unobserve(target, exception_state); + ASSERT_FALSE(exception_state.HadException()); + EXPECT_EQ(controller.GetTrackedTargetCountForTesting(), 0u); +} + TEST_F(IntersectionObserverV2Test, TrackVisibilityInit) { IntersectionObserverInit* observer_init = IntersectionObserverInit::Create(); DummyExceptionStateForTesting exception_state;
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index 40e87c2..25ac202 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -1004,12 +1004,6 @@ } LayoutPoint LayoutInline::FirstLineBoxTopLeft() const { - // This method is called from various places. It's mainly (only?) about - // calculating offsetLeft and offsetTop, though. Thus the callers seem to - // expect a purely physical point. This is what NG does. Legacy, on the other - // hand, sets the block-axis coordinate relatively to the block-start border - // edge, which means that offsetLeft will be wrong when writing-mode is - // vertical-rl. if (IsInLayoutNGInlineFormattingContext()) { const NGPhysicalBoxFragment* box_fragment = ContainingBlockFlowFragmentOf(*this); @@ -1021,8 +1015,14 @@ return LayoutPoint(); return fragments.front().offset_to_container_box.ToLayoutPoint(); } - if (InlineBox* first_box = FirstLineBoxIncludingCulling()) - return first_box->Location(); + if (InlineBox* first_box = FirstLineBoxIncludingCulling()) { + LayoutPoint location = first_box->Location(); + if (UNLIKELY(HasFlippedBlocksWritingMode())) { + location = ContainingBlock()->FlipForWritingMode(location); + location.Move(-LinesBoundingBox().Width(), LayoutUnit()); + } + return location; + } return LayoutPoint(); }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc index f78a40f..ea43555 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
@@ -1072,12 +1072,27 @@ is_after_break = true; } + void AddTabulationCharacters(const NGInlineItem& item) { + AddTextUntil(&item); + DCHECK(item.Style()); + const ComputedStyle& style = *item.Style(); + const Font& font = style.GetFont(); + const SimpleFontData* font_data = font.PrimaryFont(); + const TabSize& tab_size = style.GetTabSize(); + float advance = font.TabWidth(font_data, tab_size, position); + unsigned length = item.Length(); + DCHECK_GE(length, 1u); + if (length > 1u) + advance += font.TabWidth(font_data, tab_size) * (length - 1); + position += LayoutUnit::FromFloatCeil(advance).ClampNegativeToZero(); + } + LayoutUnit Finish(const NGInlineItem* end) { AddTextUntil(end); return std::max(position, max_size); } - bool ComputeFromMinSize(const NGLineInfo& line_info) { + void ComputeFromMinSize(const NGLineInfo& line_info) { if (is_after_break) { position += line_info.TextIndent(); is_after_break = false; @@ -1106,12 +1121,13 @@ // Tabulation characters change the widths by their positions, so // their widths for the max size may be different from the widths for // the min size. Fall back to 2 pass for now. - if (c == kTabulationCharacter) - return false; + if (c == kTabulationCharacter) { + AddTabulationCharacters(item); + continue; + } } position += result.inline_size; } - return true; } }; // Instantiate |MaxSizeFromMinSize| if we can compute the max size in 1 pass. @@ -1147,10 +1163,10 @@ // Compute the max size from the line break result for the min size. if (max_size_from_min_size.has_value()) { // If there were floats, fall back to 2 pass for now. - if (!floats_for_min_max.IsEmpty() || - !max_size_from_min_size->ComputeFromMinSize(line_info)) { + if (!floats_for_min_max.IsEmpty()) max_size_from_min_size.reset(); - } + else + max_size_from_min_size->ComputeFromMinSize(line_info); } for (auto* floating_object : floats_for_min_max) {
diff --git a/third_party/blink/renderer/core/loader/base_fetch_context_test.cc b/third_party/blink/renderer/core/loader/base_fetch_context_test.cc index f66849a..09f039ea 100644 --- a/third_party/blink/renderer/core/loader/base_fetch_context_test.cc +++ b/third_party/blink/renderer/core/loader/base_fetch_context_test.cc
@@ -37,6 +37,7 @@ #include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" +#include "third_party/blink/renderer/platform/loader/testing/test_loader_factory.h" #include "third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" @@ -125,7 +126,8 @@ *execution_context_)); resource_fetcher_ = MakeGarbageCollected<ResourceFetcher>( ResourceFetcherInit(*resource_fetcher_properties_, fetch_context_, - base::MakeRefCounted<scheduler::FakeTaskRunner>())); + base::MakeRefCounted<scheduler::FakeTaskRunner>(), + MakeGarbageCollected<TestLoaderFactory>())); } const FetchClientSettingsObject& GetFetchClientSettingsObject() const {
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc index 1b39f4d..c6d972d 100644 --- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc +++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -223,8 +223,8 @@ *resource_fetcher_properties, MakeGarbageCollected<FrameFetchContext>(*frame_or_imported_document), frame.GetTaskRunner(TaskType::kNetworking), - MakeGarbageCollected<LoaderFactoryForFrame>(*frame_or_imported_document), - document); + MakeGarbageCollected<LoaderFactoryForFrame>(*frame_or_imported_document)); + init.console_logger = &document; // Frame loading should normally start with |kTight| throttling, as the // frame will be in layout-blocking state until the <body> tag is inserted init.initial_throttling_policy = @@ -254,8 +254,8 @@ frame_or_imported_document), MakeGarbageCollected<FrameFetchContext>(frame_or_imported_document), document->GetTaskRunner(blink::TaskType::kNetworking), - MakeGarbageCollected<LoaderFactoryForFrame>(frame_or_imported_document), - *document); + MakeGarbageCollected<LoaderFactoryForFrame>(frame_or_imported_document)); + init.console_logger = document; init.frame_scheduler = frame.GetFrameScheduler(); auto* fetcher = MakeGarbageCollected<ResourceFetcher>(init); fetcher->SetResourceLoadObserver( @@ -384,19 +384,6 @@ return &frame_or_imported_document_->GetMasterDocumentLoader(); } -void FrameFetchContext::DispatchDidChangeResourcePriority( - uint64_t identifier, - ResourceLoadPriority load_priority, - int intra_priority_value) { - if (GetResourceFetcherProperties().IsDetached()) - return; - TRACE_EVENT1("devtools.timeline", "ResourceChangePriority", "data", - inspector_change_resource_priority_event::Data( - MasterDocumentLoader(), identifier, load_priority)); - probe::DidChangeResourcePriority(GetFrame(), MasterDocumentLoader(), - identifier, load_priority); -} - void FrameFetchContext::PrepareRequest( ResourceRequest& request, const FetchInitiatorInfo& initiator_info,
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.h b/third_party/blink/renderer/core/loader/frame_fetch_context.h index 32a35a9c..1e02cbbc 100644 --- a/third_party/blink/renderer/core/loader/frame_fetch_context.h +++ b/third_party/blink/renderer/core/loader/frame_fetch_context.h
@@ -81,9 +81,6 @@ const ResourceRequest&, ResourceType, FetchParameters::DeferOption) const override; - void DispatchDidChangeResourcePriority(uint64_t identifier, - ResourceLoadPriority, - int intra_priority_value) override; void PrepareRequest(ResourceRequest&, const FetchInitiatorInfo&, WebScopedVirtualTimePauser&,
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc index 8c0d9c52..62538cf 100644 --- a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc +++ b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
@@ -1170,14 +1170,6 @@ request, ResourceType::kRaw, FetchParameters::kNoDefer)); } -TEST_F(FrameFetchContextTest, DispatchDidChangePriorityWhenDetached) { - dummy_page_holder = nullptr; - - GetFetchContext()->DispatchDidChangeResourcePriority( - 2, ResourceLoadPriority::kLow, 3); - // Should not crash. -} - TEST_F(FrameFetchContextMockedLocalFrameClientTest, PrepareRequestWhenDetached) { Checkpoint checkpoint;
diff --git a/third_party/blink/renderer/core/loader/navigation_policy_test.cc b/third_party/blink/renderer/core/loader/navigation_policy_test.cc index a5df47b..1882709f 100644 --- a/third_party/blink/renderer/core/loader/navigation_policy_test.cc +++ b/third_party/blink/renderer/core/loader/navigation_policy_test.cc
@@ -37,6 +37,7 @@ #include "third_party/blink/public/web/web_window_features.h" #include "third_party/blink/renderer/core/events/current_input_event.h" #include "third_party/blink/renderer/core/events/mouse_event.h" +#include "third_party/blink/renderer/core/page/create_window.h" namespace blink { @@ -215,6 +216,29 @@ NavigationPolicyForCreateWindow(features)); } +TEST_F(NavigationPolicyTest, NoOpener) { + static const struct { + const char* feature_string; + NavigationPolicy policy; + } kCases[] = { + {"", kNavigationPolicyNewForegroundTab}, + {"something", kNavigationPolicyNewPopup}, + {"something, something", kNavigationPolicyNewPopup}, + {"notnoopener", kNavigationPolicyNewPopup}, + {"noopener", kNavigationPolicyNewForegroundTab}, + {"something, noopener", kNavigationPolicyNewPopup}, + {"noopener, something", kNavigationPolicyNewPopup}, + {"NoOpEnEr", kNavigationPolicyNewForegroundTab}, + }; + + for (const auto& test : kCases) { + EXPECT_EQ(test.policy, + NavigationPolicyForCreateWindow( + GetWindowFeaturesFromString(test.feature_string))) + << "Testing '" << test.feature_string << "'"; + } +} + TEST_F(NavigationPolicyTest, NotResizableForcesPopup) { features.resizable = false; EXPECT_EQ(kNavigationPolicyNewPopup,
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc index d51eb74..0ef6fcef 100644 --- a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc +++ b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
@@ -1872,7 +1872,8 @@ auto* context = MakeGarbageCollected<MockFetchContext>(); auto* properties = MakeGarbageCollected<TestResourceFetcherProperties>(); auto* fetcher = MakeGarbageCollected<ResourceFetcher>( - ResourceFetcherInit(*properties, context, task_runner)); + ResourceFetcherInit(*properties, context, task_runner, + MakeGarbageCollected<TestLoaderFactory>())); auto frame_scheduler = std::make_unique<scheduler::FakeFrameScheduler>(); auto* scheduler = MakeGarbageCollected<ResourceLoadScheduler>( ResourceLoadScheduler::ThrottlingPolicy::kNormal, *properties,
diff --git a/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc b/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc index ff28994..1462748 100644 --- a/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc +++ b/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/core/frame/use_counter.h" #include "third_party/blink/renderer/core/frame/web_feature.h" +#include "third_party/blink/renderer/core/inspector/inspector_trace_events.h" #include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" #include "third_party/blink/renderer/core/loader/frame_or_imported_document.h" @@ -58,6 +59,19 @@ interactive_detector->OnResourceLoadBegin(base::nullopt); } +void ResourceLoadObserverForFrame::DidChangePriority( + uint64_t identifier, + ResourceLoadPriority priority, + int intra_priority_value) { + DocumentLoader& document_loader = + frame_or_imported_document_->GetMasterDocumentLoader(); + TRACE_EVENT1("devtools.timeline", "ResourceChangePriority", "data", + inspector_change_resource_priority_event::Data( + &document_loader, identifier, priority)); + probe::DidChangeResourcePriority(&frame_or_imported_document_->GetFrame(), + &document_loader, identifier, priority); +} + void ResourceLoadObserverForFrame::DidReceiveResponse( uint64_t identifier, const ResourceRequest& request,
diff --git a/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.h b/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.h index 8558965..909a1ae9 100644 --- a/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.h +++ b/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.h
@@ -33,6 +33,9 @@ const ResourceResponse& redirect_response, ResourceType, const FetchInitiatorInfo&) override; + void DidChangePriority(uint64_t identifier, + ResourceLoadPriority, + int intra_priority_value) override; void DidReceiveResponse(uint64_t identifier, const ResourceRequest& request, const ResourceResponse& response,
diff --git a/third_party/blink/renderer/core/loader/resource_load_observer_for_worker.cc b/third_party/blink/renderer/core/loader/resource_load_observer_for_worker.cc index fe031bd9..879a846 100644 --- a/third_party/blink/renderer/core/loader/resource_load_observer_for_worker.cc +++ b/third_party/blink/renderer/core/loader/resource_load_observer_for_worker.cc
@@ -36,6 +36,11 @@ request, redirect_response, initiator_info, resource_type); } +void ResourceLoadObserverForWorker::DidChangePriority( + uint64_t identifier, + ResourceLoadPriority priority, + int intra_priority_value) {} + void ResourceLoadObserverForWorker::DidReceiveResponse( uint64_t identifier, const ResourceRequest& request,
diff --git a/third_party/blink/renderer/core/loader/resource_load_observer_for_worker.h b/third_party/blink/renderer/core/loader/resource_load_observer_for_worker.h index 59a2329..3e606658 100644 --- a/third_party/blink/renderer/core/loader/resource_load_observer_for_worker.h +++ b/third_party/blink/renderer/core/loader/resource_load_observer_for_worker.h
@@ -30,6 +30,9 @@ const ResourceResponse& redirect_response, ResourceType, const FetchInitiatorInfo&) override; + void DidChangePriority(uint64_t identifier, + ResourceLoadPriority, + int intra_priority_value) override; void DidReceiveResponse(uint64_t identifier, const ResourceRequest& request, const ResourceResponse& response,
diff --git a/third_party/blink/renderer/core/page/create_window.cc b/third_party/blink/renderer/core/page/create_window.cc index 827382c..5f205aa3 100644 --- a/third_party/blink/renderer/core/page/create_window.cc +++ b/third_party/blink/renderer/core/page/create_window.cc
@@ -67,10 +67,7 @@ if (feature_string.IsEmpty()) return window_features; - window_features.menu_bar_visible = false; - window_features.status_bar_visible = false; - window_features.tool_bar_visible = false; - window_features.scrollbars_visible = false; + bool ui_features_were_disabled = false; unsigned key_begin, key_end; unsigned value_begin, value_end; @@ -143,6 +140,14 @@ if (key_string.IsEmpty()) continue; + if (!ui_features_were_disabled && key_string != "noopener") { + ui_features_were_disabled = true; + window_features.menu_bar_visible = false; + window_features.status_bar_visible = false; + window_features.tool_bar_visible = false; + window_features.scrollbars_visible = false; + } + if (key_string == "left" || key_string == "screenx") { window_features.x_set = true; window_features.x = value; @@ -166,7 +171,7 @@ } else if (key_string == "resizable") { window_features.resizable = value; } else if (key_string == "noopener") { - window_features.noopener = true; + window_features.noopener = value; } else if (key_string == "background") { window_features.background = true; } else if (key_string == "persistent") {
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index fad2b51..130dfc5e4 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -887,7 +887,7 @@ // List style properties. // list-style-image - StyleImage* ListStyleImage() const; + CORE_EXPORT StyleImage* ListStyleImage() const; void SetListStyleImage(StyleImage*); // quotes
diff --git a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc index 6d3170a..91e947d7 100644 --- a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
@@ -286,7 +286,7 @@ InitializeWebFetchContextIfNeeded(); ResourceFetcher* fetcher = nullptr; if (web_worker_fetch_context_) { - fetcher = MakeGarbageCollected<ResourceFetcher>(ResourceFetcherInit( + ResourceFetcherInit init( *MakeGarbageCollected<WorkerResourceFetcherProperties>( *this, fetch_client_settings_object, web_worker_fetch_context_), @@ -294,9 +294,10 @@ *this, web_worker_fetch_context_, subresource_filter_, content_security_policy), GetTaskRunner(TaskType::kNetworking), - MakeGarbageCollected<LoaderFactoryForWorker>(*this, - web_worker_fetch_context_), - *this)); + MakeGarbageCollected<LoaderFactoryForWorker>( + *this, web_worker_fetch_context_)); + init.console_logger = this; + fetcher = MakeGarbageCollected<ResourceFetcher>(init); fetcher->SetResourceLoadObserver( MakeGarbageCollected<ResourceLoadObserverForWorker>( *probe::ToCoreProbeSink(static_cast<ExecutionContext*>(this)), @@ -305,7 +306,8 @@ // This code path is for unittests. fetcher = MakeGarbageCollected<ResourceFetcher>(ResourceFetcherInit( *MakeGarbageCollected<NullResourceFetcherProperties>(), - &FetchContext::NullInstance(), GetTaskRunner(TaskType::kNetworking))); + &FetchContext::NullInstance(), GetTaskRunner(TaskType::kNetworking), + nullptr /* loader_factory */)); } if (IsContextPaused()) fetcher->SetDefersLoading(true);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc index c91f3ce..c39003e3 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -997,6 +997,36 @@ return buffer->ToDataURL(kMimeTypePng, 1.0); } +ax::mojom::ListStyle AXLayoutObject::GetListStyle() const { + const LayoutObject* layout_object = GetLayoutObject(); + if (!layout_object) + return AXNodeObject::GetListStyle(); + + const ComputedStyle* computed_style = layout_object->Style(); + if (!computed_style) + return AXNodeObject::GetListStyle(); + + const StyleImage* style_image = computed_style->ListStyleImage(); + if (style_image && !style_image->ErrorOccurred()) + return ax::mojom::ListStyle::kImage; + + switch (computed_style->ListStyleType()) { + case EListStyleType::kNone: + return ax::mojom::ListStyle::kNone; + case EListStyleType::kDisc: + return ax::mojom::ListStyle::kDisc; + case EListStyleType::kCircle: + return ax::mojom::ListStyle::kCircle; + case EListStyleType::kSquare: + return ax::mojom::ListStyle::kSquare; + case EListStyleType::kDecimal: + case EListStyleType::kDecimalLeadingZero: + return ax::mojom::ListStyle::kNumeric; + default: + return ax::mojom::ListStyle::kOther; + } +} + String AXLayoutObject::GetText() const { if (IsPasswordFieldAndShouldHideValue()) { if (!GetLayoutObject())
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.h b/third_party/blink/renderer/modules/accessibility/ax_layout_object.h index 1dd5049..10144a8f 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.h
@@ -105,6 +105,7 @@ float FontSize() const final; float FontWeight() const final; String ImageDataUrl(const IntSize& max_size) const final; + ax::mojom::ListStyle GetListStyle() const final; String GetText() const override; ax::mojom::TextDirection GetTextDirection() const final; ax::mojom::TextPosition GetTextPosition() const final;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h index c9e07e16..633f429 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -686,6 +686,9 @@ } virtual AXObject* InPageLinkTarget() const { return nullptr; } virtual AccessibilityOrientation Orientation() const; + virtual ax::mojom::ListStyle GetListStyle() const { + return ax::mojom::ListStyle::kNone; + } virtual String GetText() const { return String(); } virtual ax::mojom::TextDirection GetTextDirection() const { return ax::mojom::TextDirection::kLtr;
diff --git a/third_party/blink/renderer/modules/exported/web_ax_object.cc b/third_party/blink/renderer/modules/exported/web_ax_object.cc index b74634c..11afd19 100644 --- a/third_party/blink/renderer/modules/exported/web_ax_object.cc +++ b/third_party/blink/renderer/modules/exported/web_ax_object.cc
@@ -1015,6 +1015,13 @@ return private_->StringValue(); } +ax::mojom::ListStyle WebAXObject::GetListStyle() const { + if (IsDetached()) + return ax::mojom::ListStyle::kNone; + + return private_->GetListStyle(); +} + ax::mojom::TextDirection WebAXObject::GetTextDirection() const { if (IsDetached()) return ax::mojom::TextDirection::kLtr;
diff --git a/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc b/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc index 2c50eae..29ce573a9 100644 --- a/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc +++ b/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc
@@ -13,31 +13,6 @@ namespace blink { -// Callbacks for the result of -// WebRelatedAppsFetcher::getManifestRelatedApplications. Calls -// filterByInstalledApps upon receiving the list of related applications. -class InstalledAppController::GetRelatedAppsCallbacks - : public AppInstalledCallbacks { - public: - GetRelatedAppsCallbacks(InstalledAppController* controller, - std::unique_ptr<AppInstalledCallbacks> callbacks) - : controller_(controller), callbacks_(std::move(callbacks)) {} - - // AppInstalledCallbacks overrides: - void OnSuccess( - const WebVector<WebRelatedApplication>& related_apps) override { - if (!controller_) - return; - - controller_->FilterByInstalledApps(related_apps, std::move(callbacks_)); - } - void OnError() override { callbacks_->OnError(); } - - private: - WeakPersistent<InstalledAppController> controller_; - std::unique_ptr<AppInstalledCallbacks> callbacks_; -}; - InstalledAppController::~InstalledAppController() = default; void InstalledAppController::GetInstalledRelatedApps( @@ -56,7 +31,8 @@ // TODO(mgiuca): This roundtrip to content could be eliminated if the Manifest // class was moved from content into Blink. related_apps_fetcher_->GetManifestRelatedApplications( - std::make_unique<GetRelatedAppsCallbacks>(this, std::move(callbacks))); + WTF::Bind(&InstalledAppController::OnGetRelatedAppsCallback, + WrapWeakPersistent(this), std::move(callbacks))); } void InstalledAppController::ProvideTo( @@ -88,6 +64,14 @@ related_apps_fetcher_ = nullptr; } +void InstalledAppController::OnGetRelatedAppsCallback( + std::unique_ptr<AppInstalledCallbacks> callbacks, + const WebVector<WebRelatedApplication>& related_apps) { + // TODO: Fix the order of the parameters in ::FilterByInstalledApps + // and bound it right away as the completion callback. + FilterByInstalledApps(related_apps, std::move(callbacks)); +} + void InstalledAppController::FilterByInstalledApps( const blink::WebVector<blink::WebRelatedApplication>& related_apps, std::unique_ptr<blink::AppInstalledCallbacks> callbacks) {
diff --git a/third_party/blink/renderer/modules/installedapp/installed_app_controller.h b/third_party/blink/renderer/modules/installedapp/installed_app_controller.h index 7bba3ff..e449d10 100644 --- a/third_party/blink/renderer/modules/installedapp/installed_app_controller.h +++ b/third_party/blink/renderer/modules/installedapp/installed_app_controller.h
@@ -13,6 +13,7 @@ #include "third_party/blink/public/mojom/installedapp/related_application.mojom-blink.h" #include "third_party/blink/public/platform/modules/installedapp/web_related_application.h" #include "third_party/blink/public/platform/modules/installedapp/web_related_apps_fetcher.h" +#include "third_party/blink/public/platform/web_callbacks.h" #include "third_party/blink/public/platform/web_vector.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -22,6 +23,9 @@ namespace blink { +using AppInstalledCallbacks = + WebCallbacks<const WebVector<WebRelatedApplication>&, void>; + class MODULES_EXPORT InstalledAppController final : public GarbageCollectedFinalized<InstalledAppController>, public Supplement<LocalFrame>, @@ -49,6 +53,12 @@ // Inherited from ContextLifecycleObserver. void ContextDestroyed(ExecutionContext*) override; + // Callback for the result of + // WebRelatedAppsFetcher::getManifestRelatedApplications. Calls + // filterByInstalledApps upon receiving the list of related applications. + void OnGetRelatedAppsCallback(std::unique_ptr<AppInstalledCallbacks>, + const WebVector<WebRelatedApplication>&); + // Takes a set of related applications and filters them by those which belong // to the current underlying platform, and are actually installed and related // to the current page's origin. Passes the filtered list to the callback.
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities_decoding_info.idl b/third_party/blink/renderer/modules/media_capabilities/media_capabilities_decoding_info.idl index 8ddb1de..9078e44 100644 --- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities_decoding_info.idl +++ b/third_party/blink/renderer/modules/media_capabilities/media_capabilities_decoding_info.idl
@@ -5,5 +5,5 @@ // https://wicg.github.io/media-capabilities/#dictdef-mediacapabilitiesdecodinginfo dictionary MediaCapabilitiesDecodingInfo : MediaCapabilitiesInfo { - [RuntimeEnabled=MediaCapabilitiesEncryptedMedia] MediaKeySystemAccess? keySystemAccess = null; + [OriginTrialEnabled=MediaCapabilitiesEncryptedMedia] MediaKeySystemAccess? keySystemAccess = null; };
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_decoding_configuration.idl b/third_party/blink/renderer/modules/media_capabilities/media_decoding_configuration.idl index 26779a24..f803ccc 100644 --- a/third_party/blink/renderer/modules/media_capabilities/media_decoding_configuration.idl +++ b/third_party/blink/renderer/modules/media_capabilities/media_decoding_configuration.idl
@@ -13,5 +13,5 @@ dictionary MediaDecodingConfiguration : MediaConfiguration { required MediaDecodingType type; - [RuntimeEnabled=MediaCapabilitiesEncryptedMedia] MediaCapabilitiesKeySystemConfiguration keySystemConfiguration; + [OriginTrialEnabled=MediaCapabilitiesEncryptedMedia] MediaCapabilitiesKeySystemConfiguration keySystemConfiguration; };
diff --git a/third_party/blink/renderer/modules/peerconnection/BUILD.gn b/third_party/blink/renderer/modules/peerconnection/BUILD.gn index 066dfcb..833201fa 100644 --- a/third_party/blink/renderer/modules/peerconnection/BUILD.gn +++ b/third_party/blink/renderer/modules/peerconnection/BUILD.gn
@@ -19,6 +19,9 @@ "adapters/p2p_quic_crypto_config_factory.h", "adapters/p2p_quic_crypto_config_factory_impl.cc", "adapters/p2p_quic_crypto_config_factory_impl.h", + "adapters/p2p_quic_crypto_stream_factory.h", + "adapters/p2p_quic_crypto_stream_factory_impl.cc", + "adapters/p2p_quic_crypto_stream_factory_impl.h", "adapters/p2p_quic_packet_transport.h", "adapters/p2p_quic_stream.h", "adapters/p2p_quic_stream_impl.cc",
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory.h b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory.h new file mode 100644 index 0000000..b0b9c97 --- /dev/null +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory.h
@@ -0,0 +1,34 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_P2P_QUIC_CRYPTO_STREAM_FACTORY_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_P2P_QUIC_CRYPTO_STREAM_FACTORY_H_ + +#include "net/third_party/quiche/src/quic/core/quic_crypto_client_stream.h" +#include "net/third_party/quiche/src/quic/core/quic_crypto_server_stream.h" + +namespace blink { + +// Builds the crypto stream to be used by the P2PQuicTransport. +class P2PQuicCryptoStreamFactory { + public: + virtual ~P2PQuicCryptoStreamFactory() = default; + + virtual std::unique_ptr<quic::QuicCryptoClientStream> + CreateClientCryptoStream( + quic::QuicSession* session, + quic::QuicCryptoClientConfig* crypto_config, + quic::QuicCryptoClientStream::ProofHandler* proof_handler) = 0; + + virtual std::unique_ptr<quic::QuicCryptoServerStream> + CreateServerCryptoStream( + const quic::QuicCryptoServerConfig* crypto_config, + quic::QuicCompressedCertsCache* compressed_certs_cache, + quic::QuicSession* session, + quic::QuicCryptoServerStream::Helper* helper) = 0; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_P2P_QUIC_CRYPTO_STREAM_FACTORY_H_
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.cc new file mode 100644 index 0000000..99c4357 --- /dev/null +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.cc
@@ -0,0 +1,38 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.h" +#include "net/third_party/quiche/src/quic/core/quic_crypto_server_stream.h" + +namespace blink { + +std::unique_ptr<quic::QuicCryptoClientStream> +P2PQuicCryptoStreamFactoryImpl::CreateClientCryptoStream( + quic::QuicSession* session, + quic::QuicCryptoClientConfig* crypto_config, + quic::QuicCryptoClientStream::ProofHandler* proof_handler) { + // The QuicServerId is not important since we are communicating with a peer + // endpoint and the connection is on top of ICE. + quic::QuicServerId server_id( + /*host=*/"", + /*port=*/0, + /*privacy_mode_enabled=*/false); + return std::make_unique<quic::QuicCryptoClientStream>( + server_id, session, + crypto_config->proof_verifier()->CreateDefaultContext(), crypto_config, + proof_handler); +} + +std::unique_ptr<quic::QuicCryptoServerStream> +P2PQuicCryptoStreamFactoryImpl::CreateServerCryptoStream( + const quic::QuicCryptoServerConfig* crypto_config, + quic::QuicCompressedCertsCache* compressed_certs_cache, + quic::QuicSession* session, + quic::QuicCryptoServerStream::Helper* helper) { + return std::make_unique<quic::QuicCryptoServerStream>( + crypto_config, compressed_certs_cache, + /*use_stateless_rejects_if_peer_supported=*/false, session, helper); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.h b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.h new file mode 100644 index 0000000..e4ee2aa --- /dev/null +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.h
@@ -0,0 +1,36 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_P2P_QUIC_CRYPTO_STREAM_FACTORY_IMPL_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_P2P_QUIC_CRYPTO_STREAM_FACTORY_IMPL_H_ + +#include "net/third_party/quiche/src/quic/core/quic_crypto_server_stream.h" +#include "third_party/blink/renderer/modules/modules_export.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory.h" + +namespace blink { + +// The default factory for creating crypto streams to be used by the +// P2PQuicTransport. +class MODULES_EXPORT P2PQuicCryptoStreamFactoryImpl final + : public P2PQuicCryptoStreamFactory { + public: + ~P2PQuicCryptoStreamFactoryImpl() override {} + + // P2PQuicCryptoStreamFactory overrides. + std::unique_ptr<quic::QuicCryptoClientStream> CreateClientCryptoStream( + quic::QuicSession* session, + quic::QuicCryptoClientConfig* crypto_config, + quic::QuicCryptoClientStream::ProofHandler* proof_handler) override; + + std::unique_ptr<quic::QuicCryptoServerStream> CreateServerCryptoStream( + const quic::QuicCryptoServerConfig* crypto_config, + quic::QuicCompressedCertsCache* compressed_certs_cache, + quic::QuicSession* session, + quic::QuicCryptoServerStream::Helper* helper) override; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_P2P_QUIC_CRYPTO_STREAM_FACTORY_IMPL_H_
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h index 72761c89..e77b62e 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h
@@ -8,12 +8,37 @@ #include "base/logging.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.h" #include "third_party/blink/renderer/platform/wtf/allocator.h" +#include "third_party/blink/renderer/platform/wtf/vector.h" #include "third_party/webrtc/rtc_base/ssl_fingerprint.h" namespace blink { class P2PQuicStream; +// Includes any relevant parameters that were negotiated in the QUIC handshake. +// Used in the P2PQuicTransport::Delegate::OnConnected callback. +struct P2PQuicNegotiatedParams final { + // If datagrams were negotiated to be supported. + bool datagrams_supported() const { return max_datagram_length_.has_value(); } + + void set_max_datagram_length(uint16_t max_datagram_length) { + max_datagram_length_ = max_datagram_length; + } + + uint16_t max_datagram_length() const { + DCHECK(datagrams_supported()); + return max_datagram_length_.value_or(0); + } + + private: + // According to draft-pauly-quic-datagram-02#section-3, this should be + // negotiated as a transport parameter, although in the QUICHE implementation + // it is based upon the QUIC version (determines packet header size) and + // default max packet size (1350 bytes). + // 0 means datagrams are not supported. + base::Optional<uint16_t> max_datagram_length_; +}; + // Used by the RTCQuicTransport Web API. This transport creates and manages // streams, handles negotiation, state changes and errors. Every // P2PQuicTransport function maps directly to a method in the RTCQuicTransport @@ -63,7 +88,14 @@ bool from_remote) {} // Called when the crypto handshake has completed and fingerprints have been // verified. - virtual void OnConnected() {} + virtual void OnConnected(P2PQuicNegotiatedParams negotiated_params) {} + + // Called when the datagram has been consumed by the QUIC library and sent + // on the network. + virtual void OnDatagramSent() {} + + // Called when we receive a datagram from the remote side. + virtual void OnReceivedDatagram(Vector<uint8_t> datagram) {} // Called when an incoming stream is received from the remote side. This // stream is owned by the P2PQuicTransport. Its lifetime is managed by the @@ -97,6 +129,11 @@ // Gets the associated stats. These are QUIC connection level stats. virtual P2PQuicTransportStats GetStats() const = 0; + // Sends datagram. If the QUIC connection is write blocked due to congestion + // control the message will be buffered and sent once it is unblocked. Once + // the datagram has been sent, Delegate::OnDatagramSent will be called. + virtual void SendDatagram(Vector<uint8_t> datagram) = 0; + // TODO(https://crbug.com/874296): Consider adding a getter for the // local fingerprints of the certificate(s) set in the constructor. };
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_factory_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_factory_impl.cc index 4be2ed0..6954e02 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_factory_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_factory_impl.cc
@@ -6,6 +6,7 @@ #include "net/third_party/quiche/src/quic/core/quic_connection_id.h" #include "net/third_party/quiche/src/quic/core/quic_packet_writer.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_config_factory_impl.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_packet_transport.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h" #include "third_party/webrtc/rtc_base/rtc_certificate.h" @@ -34,6 +35,7 @@ return P2PQuicTransportImpl::Create( clock_, alarm_factory_.get(), quic_random, delegate, packet_transport, std::move(config), - std::make_unique<P2PQuicCryptoConfigFactoryImpl>(quic_random)); + std::make_unique<P2PQuicCryptoConfigFactoryImpl>(quic_random), + std::make_unique<P2PQuicCryptoStreamFactoryImpl>()); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc index 241dbc0..d15bbe2 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
@@ -6,17 +6,21 @@ #include "net/quic/quic_chromium_connection_helper.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_random.h" #include "net/third_party/quiche/src/quic/core/quic_config.h" +#include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" #include "net/third_party/quiche/src/quic/core/tls_client_handshaker.h" #include "net/third_party/quiche/src/quic/core/tls_server_handshaker.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_storage.h" #include "net/third_party/quiche/src/quic/tools/quic_simple_crypto_server_stream_helper.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.h" namespace blink { namespace { static const char kClosingDetails[] = "Application closed connection."; -static const size_t kHostnameLength = 32; // QUIC's default is 100. Setting this value to 10000 allows room for QUIC to // not refuse new incoming streams in the case that an application wants to send @@ -198,10 +202,12 @@ P2PQuicTransport::Delegate* delegate, P2PQuicPacketTransport* packet_transport, const P2PQuicTransportConfig& config, - std::unique_ptr<P2PQuicCryptoConfigFactory> crypto_config_factory) { + std::unique_ptr<P2PQuicCryptoConfigFactory> crypto_config_factory, + std::unique_ptr<P2PQuicCryptoStreamFactory> crypto_stream_factory) { DCHECK(delegate); DCHECK(packet_transport); DCHECK(crypto_config_factory); + DCHECK(crypto_stream_factory); // The P2PQuicSession owns these chromium specific objects required // by the QuicConnection. These outlive the QuicConnection itself. @@ -238,17 +244,18 @@ return std::make_unique<P2PQuicTransportImpl>( delegate, packet_transport, std::move(config), std::move(helper), std::move(quic_connection), quic_config, std::move(crypto_config_factory), - clock); + std::move(crypto_stream_factory), clock); } P2PQuicTransportImpl::P2PQuicTransportImpl( Delegate* delegate, P2PQuicPacketTransport* packet_transport, const P2PQuicTransportConfig& p2p_transport_config, - std::unique_ptr<net::QuicChromiumConnectionHelper> helper, + std::unique_ptr<quic::QuicConnectionHelperInterface> helper, std::unique_ptr<quic::QuicConnection> connection, const quic::QuicConfig& quic_config, std::unique_ptr<P2PQuicCryptoConfigFactory> crypto_config_factory, + std::unique_ptr<P2PQuicCryptoStreamFactory> crypto_stream_factory, quic::QuicClock* clock) : quic::QuicSession(connection.get(), nullptr /* visitor */, @@ -257,6 +264,7 @@ helper_(std::move(helper)), connection_(std::move(connection)), crypto_config_factory_(std::move(crypto_config_factory)), + crypto_stream_factory_(std::move(crypto_stream_factory)), perspective_(p2p_transport_config.perspective), packet_transport_(packet_transport), delegate_(delegate), @@ -267,6 +275,7 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(delegate_); DCHECK(crypto_config_factory_); + DCHECK(crypto_stream_factory_); DCHECK(clock_); DCHECK(packet_transport_); DCHECK_GT(stream_delegate_read_buffer_size_, 0u); @@ -374,9 +383,34 @@ } P2PQuicTransportStats P2PQuicTransportImpl::GetStats() const { - return P2PQuicTransportStats(connection_->GetStats(), - num_outgoing_streams_created_, - num_incoming_streams_created_); + P2PQuicTransportStats stats(connection_->GetStats()); + stats.num_incoming_streams_created = num_incoming_streams_created_; + stats.num_outgoing_streams_created = num_outgoing_streams_created_; + stats.num_datagrams_lost = num_datagrams_lost_; + return stats; +} + +void P2PQuicTransportImpl::SendDatagram(Vector<uint8_t> datagram) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DCHECK(CanSendDatagram()); + DCHECK_LT(datagram.size(), + quic::QuicSession::GetCurrentLargestMessagePayload()); + + if (!datagram_buffer_.empty()) { + // We are currently write blocked, just add to the buffer. + datagram_buffer_.push(std::move(datagram)); + return; + } + if (!TrySendDatagram(datagram)) { + datagram_buffer_.push(std::move(datagram)); + } +} + +bool P2PQuicTransportImpl::CanSendDatagram() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + return IsEncryptionEstablished() && + (connection()->transport_version() > quic::QUIC_VERSION_44) && + !IsClosed(); } P2PQuicStreamImpl* P2PQuicTransportImpl::CreateOutgoingBidirectionalStream() { @@ -429,6 +463,36 @@ stream_write_buffer_size_); } +bool P2PQuicTransportImpl::TrySendDatagram(Vector<uint8_t>& datagram) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DCHECK(CanSendDatagram()); + DCHECK_LT(datagram.size(), + quic::QuicSession::GetCurrentLargestMessagePayload()); + + struct iovec iov = {datagram.data(), datagram.size()}; + quic::QuicMemSliceStorage storage( + &iov, 1, connection()->helper()->GetStreamSendBufferAllocator(), + datagram.size()); + quic::MessageResult result = QuicSession::SendMessage(storage.ToSpan()); + switch (result.status) { + case quic::MESSAGE_STATUS_BLOCKED: + return false; + case quic::MESSAGE_STATUS_SUCCESS: + delegate_->OnDatagramSent(); + return true; + case quic::MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED: + case quic::MESSAGE_STATUS_INTERNAL_ERROR: + case quic::MESSAGE_STATUS_TOO_LARGE: + case quic::MESSAGE_STATUS_UNSUPPORTED: + break; + } + // Anything besides blocked/success should never happen. + LOG(ERROR) << "Unexpected result with QuicSession::SendMessage: " + << result.status; + NOTREACHED(); + return false; +} + void P2PQuicTransportImpl::InitializeCryptoStream() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(!crypto_stream_); @@ -438,19 +502,9 @@ switch (perspective_) { case quic::Perspective::IS_CLIENT: { DCHECK(crypto_client_config_); - // The host must be unique for every endpoint the client communicates - // with. - char random_hostname[kHostnameLength]; - helper_->GetRandomGenerator()->RandBytes(random_hostname, - kHostnameLength); - quic::QuicServerId server_id( - /*host=*/std::string(random_hostname, kHostnameLength), - /*port=*/0, - /*privacy_mode_enabled=*/false); - crypto_stream_ = std::make_unique<quic::QuicCryptoClientStream>( - server_id, /*QuicSession=*/this, - crypto_client_config_->proof_verifier()->CreateDefaultContext(), - crypto_client_config_.get(), /*ProofHandler=*/this); + crypto_stream_ = crypto_stream_factory_->CreateClientCryptoStream( + /*QuicSession=*/this, crypto_client_config_.get(), + /*ProofHandler=*/this); QuicSession::Initialize(); break; } @@ -465,13 +519,11 @@ helper_->GetRandomGenerator(), helper_->GetClock(), options)); compressed_certs_cache_.reset(new quic::QuicCompressedCertsCache( quic::QuicCompressedCertsCache::kQuicCompressedCertsCacheSize)); - bool use_stateless_rejects_if_peer_supported = false; server_stream_helper_ = std::make_unique<DummyCryptoServerStreamHelper>( helper_->GetRandomGenerator()); - crypto_stream_ = std::make_unique<quic::QuicCryptoServerStream>( - crypto_server_config_.get(), compressed_certs_cache_.get(), - use_stateless_rejects_if_peer_supported, this, + crypto_stream_ = crypto_stream_factory_->CreateServerCryptoStream( + crypto_server_config_.get(), compressed_certs_cache_.get(), this, server_stream_helper_.get()); QuicSession::Initialize(); break; @@ -488,10 +540,47 @@ if (event == HANDSHAKE_CONFIRMED) { DCHECK(IsEncryptionEstablished()); DCHECK(IsCryptoHandshakeConfirmed()); - delegate_->OnConnected(); + P2PQuicNegotiatedParams negotiated_params; + // The guaranteed largest message payload will not change throughout the + // connection. + uint16_t max_datagram_length = + quic::QuicSession::GetGuaranteedLargestMessagePayload(); + if (max_datagram_length > 0) { + // Datagrams are supported in this case. + negotiated_params.set_max_datagram_length(max_datagram_length); + } + delegate_->OnConnected(negotiated_params); } } +void P2PQuicTransportImpl::OnCanWrite() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + while (!datagram_buffer_.empty()) { + if (TrySendDatagram(datagram_buffer_.front())) { + datagram_buffer_.pop(); + } else { + // Keep the message in the buffer to be written when we can write again. + return; + } + } + + // We have successfully sent all buffered datagrams. + QuicSession::OnCanWrite(); +} + +void P2PQuicTransportImpl::OnMessageReceived(quic::QuicStringPiece message) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + // This will never overflow because of the datagram size limit. + Vector<uint8_t> datagram(static_cast<wtf_size_t>(message.size())); + memcpy(datagram.data(), message.data(), message.size()); + delegate_->OnReceivedDatagram(std::move(datagram)); +} + +void P2PQuicTransportImpl::OnMessageLost(quic::QuicMessageId message_id) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + num_datagrams_lost_++; +} + void P2PQuicTransportImpl::OnConnectionClosed( quic::QuicErrorCode error, const std::string& error_details, @@ -508,8 +597,6 @@ } bool P2PQuicTransportImpl::ShouldKeepConnectionAlive() const { - // TODO: this is default behavior; please change the timeout logic as - // appropriate. return GetNumOpenDynamicStreams() > 0; } @@ -518,10 +605,4 @@ return !connection_->connected(); } -void P2PQuicTransportImpl::set_crypto_client_config( - std::unique_ptr<quic::QuicCryptoClientConfig> crypto_client_config) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - crypto_client_config_ = std::move(crypto_client_config); -} - } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h index 53d03c0..1f914507 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h
@@ -5,10 +5,12 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_P2P_QUIC_TRANSPORT_IMPL_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_P2P_QUIC_TRANSPORT_IMPL_H_ +#include <queue> #include "base/threading/thread_checker.h" #include "net/quic/quic_chromium_connection_helper.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_client_config.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.h" +#include "net/third_party/quiche/src/quic/core/quic_connection.h" #include "net/third_party/quiche/src/quic/core/quic_crypto_client_stream.h" #include "net/third_party/quiche/src/quic/core/quic_crypto_server_stream.h" #include "net/third_party/quiche/src/quic/core/quic_packet_writer.h" @@ -16,6 +18,8 @@ #include "net/third_party/quiche/src/quic/tools/quic_simple_crypto_server_stream_helper.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_config_factory.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_packet_transport.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_impl.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h" @@ -53,16 +57,18 @@ Delegate* delegate, P2PQuicPacketTransport* packet_transport, const P2PQuicTransportConfig& config, - std::unique_ptr<P2PQuicCryptoConfigFactory> crypto_config_factory); + std::unique_ptr<P2PQuicCryptoConfigFactory> crypto_config_factory, + std::unique_ptr<P2PQuicCryptoStreamFactory> crypto_stream_factory); P2PQuicTransportImpl( Delegate* delegate, P2PQuicPacketTransport* packet_transport, const P2PQuicTransportConfig& p2p_transport_config, - std::unique_ptr<net::QuicChromiumConnectionHelper> helper, + std::unique_ptr<quic::QuicConnectionHelperInterface> helper, std::unique_ptr<quic::QuicConnection> connection, const quic::QuicConfig& quic_config, std::unique_ptr<P2PQuicCryptoConfigFactory> crypto_config_factory, + std::unique_ptr<P2PQuicCryptoStreamFactory> crypto_stream_factory, quic::QuicClock* clock); ~P2PQuicTransportImpl() override; @@ -82,6 +88,21 @@ // Creates an outgoing stream that is owned by the quic::QuicSession. P2PQuicStreamImpl* CreateStream() override; P2PQuicTransportStats GetStats() const override; + // This should not be called until the transport has become connected, and + // cannot be called with a |datagram| larger than the maximum size given in + // GetGuaranteedLargestMessagePayload(). Once the datagram has been sent, + // Delegate::OnDatagramSent will be called. If Delegate::OnDatagramSent is not + // immediately called, it can be assumed that the datagram is buffered due to + // congestion control. + void SendDatagram(Vector<uint8_t> datagram) override; + + // Returns true if a datagram can be sent on the transport. + bool CanSendDatagram(); + + // quic::QuicSession override. + void OnMessageReceived(quic::QuicStringPiece message) override; + void OnMessageLost(quic::QuicMessageId message_id) override; + void OnCanWrite() override; // P2PQuicPacketTransport::Delegate override. void OnPacketDataReceived(const char* data, size_t data_len) override; @@ -106,9 +127,6 @@ protected: // quic::QuicSession overrides. - // TODO(https://crbug.com/874296): Subclass QuicStream and implement these - // functions. - // Creates a new stream initiated from the remote side. The caller does not // own the stream, so the stream is activated and ownership is moved to the // quic::QuicSession. @@ -133,9 +151,6 @@ // locally. bool IsClosed(); quic::QuicConnection* connection() { return connection_.get(); } - // Allows the test to set its own proof verification. - void set_crypto_client_config( - std::unique_ptr<quic::QuicCryptoClientConfig> crypto_client_config); // quic::QuicSession overrides. const quic::QuicCryptoStream* GetCryptoStream() const override; @@ -151,6 +166,10 @@ P2PQuicStreamImpl* CreateStreamInternal(quic::QuicStreamId id); P2PQuicStreamImpl* CreateStreamInternal(quic::PendingStream pending); + // Returns true if datagram was sent, false if it was not because of + // congestion control blocking. + bool TrySendDatagram(Vector<uint8_t>& datagram); + // The server_config and client_config are used for setting up the crypto // connection. The ownership of these objects or the objects they own // (quic::ProofSource, quic::ProofVerifier, etc.), are not passed on to the @@ -163,12 +182,14 @@ std::unique_ptr<quic::QuicCryptoServerStream::Helper> server_stream_helper_; // Owned by the P2PQuicTransportImpl. |helper_| is placed before // |connection_| to ensure it outlives it. - std::unique_ptr<net::QuicChromiumConnectionHelper> helper_; + std::unique_ptr<quic::QuicConnectionHelperInterface> helper_; std::unique_ptr<quic::QuicConnection> connection_; // Used to create either a crypto client or server config. std::unique_ptr<P2PQuicCryptoConfigFactory> crypto_config_factory_; + // Used to create a client or server crypto stream. + std::unique_ptr<P2PQuicCryptoStreamFactory> crypto_stream_factory_; std::unique_ptr<quic::QuicCryptoStream> crypto_stream_; // Crypto certificate information. Note that currently the handshake is @@ -194,6 +215,11 @@ // For stats: uint32_t num_outgoing_streams_created_ = 0; uint32_t num_incoming_streams_created_ = 0; + // The number reported lost on the network by the quic::QuicSession. + uint32_t num_datagrams_lost_ = 0; + + // Datagrams not yet sent due to congestion control blocking. + std::queue<Vector<uint8_t>> datagram_buffer_; THREAD_CHECKER(thread_checker_); };
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.cc index 8e574ed..edc88dd 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.cc
@@ -10,16 +10,12 @@ : timestamp(base::TimeTicks::Now()) {} P2PQuicTransportStats::P2PQuicTransportStats( - const quic::QuicConnectionStats& quic_stats, - uint32_t num_outgoing_streams_created, - uint32_t num_incoming_streams_created) + const quic::QuicConnectionStats& quic_stats) : timestamp(base::TimeTicks::Now()), bytes_sent(quic_stats.bytes_sent), packets_sent(quic_stats.packets_sent), stream_bytes_sent(quic_stats.stream_bytes_sent), stream_bytes_received(quic_stats.stream_bytes_received), - num_outgoing_streams_created(num_outgoing_streams_created), - num_incoming_streams_created(num_incoming_streams_created), bytes_received(quic_stats.bytes_received), packets_received(quic_stats.packets_received), packets_processed(quic_stats.packets_processed),
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.h b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.h index d9ea3fd..0a4d2d4 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_stats.h
@@ -17,7 +17,7 @@ // Currently QUIC does not have stats at the stream level. struct MODULES_EXPORT P2PQuicTransportStats { P2PQuicTransportStats(); - // Note: The following stats are ignored form the QuicConnectionStats: + // Note: The following stats are ignored from the QuicConnectionStats: // -packets_spuriously_retransmitted // -bytes_spuriously_retransmitted // -slowstart_packets_sent @@ -30,9 +30,7 @@ // -max_time_reordering_us // -tcp_loss_events // -connection_creation_time - explicit P2PQuicTransportStats(const quic::QuicConnectionStats& stats, - uint32_t num_outgoing_streams_created, - uint32_t num_incoming_streams_created); + explicit P2PQuicTransportStats(const quic::QuicConnectionStats& stats); ~P2PQuicTransportStats() = default; base::TimeTicks timestamp; @@ -42,8 +40,6 @@ // |stream_bytes_sent| does not include retransmissions. uint64_t stream_bytes_sent = 0; uint64_t stream_bytes_received = 0; - uint32_t num_outgoing_streams_created = 0; - uint32_t num_incoming_streams_created = 0; // These include version negotiation and public reset packets. // @@ -74,6 +70,11 @@ uint64_t blocked_frames_sent = 0; // Number of connectivity probing packets received by this connection. uint64_t connectivity_probing_packets_received = 0; + + // The following are stats not taken directly from QuicConnectionStats: + uint32_t num_outgoing_streams_created = 0; + uint32_t num_incoming_streams_created = 0; + uint32_t num_datagrams_lost = 0; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc index dbc1d84..b4e9e9dd 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc
@@ -2,17 +2,30 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h" #include "base/bind.h" +#include "net/quic/mock_crypto_client_stream.h" +#include "net/quic/mock_crypto_client_stream_factory.h" #include "net/quic/quic_chromium_alarm_factory.h" #include "net/quic/test_task_runner.h" #include "net/test/gtest_util.h" +#include "net/third_party/quiche/src/quic/core/crypto/proof_verifier.h" +#include "net/third_party/quiche/src/quic/core/crypto/quic_compressed_certs_cache.h" +#include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.h" +#include "net/third_party/quiche/src/quic/core/quic_server_id.h" +#include "net/third_party/quiche/src/quic/core/quic_session.h" #include "net/third_party/quiche/src/quic/core/tls_client_handshaker.h" #include "net/third_party/quiche/src/quic/core/tls_server_handshaker.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_span.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/test_tools/mock_clock.h" +#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_config_factory_impl.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_packet_transport.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_factory_impl.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_packet_transport.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_stream_delegate.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport_delegate.h" #include "third_party/blink/renderer/platform/wtf/allocator.h" @@ -26,16 +39,31 @@ using testing::_; using testing::ElementsAreArray; +using testing::Eq; using testing::Invoke; using testing::InvokeWithoutArgs; using ::testing::MakePolymorphicAction; using ::testing::PolymorphicAction; +using testing::Property; +using testing::ResultOf; +using testing::Return; const uint8_t kTriggerRemoteStreamPhrase[] = {'o', 'p', 'e', 'n', ' ', 's', 'e', 's', 'a', 'm', 'e'}; +const uint8_t kMessage[] = {'h', 'o', 'w', 'd', 'y'}; +const uint8_t kMessage2[] = {'p', 'a', 'r', 't', 'n', 'e', 'r'}; +const uint8_t kClientMessage[] = {'h', 'o', 'w', 'd', 'y'}; +const uint8_t kServerMessage[] = {'p', 'a', 'r', 't', 'n', 'e', 'r'}; const uint32_t kTransportWriteBufferSize = 100 * 1024; const uint32_t kTransportDelegateReadBufferSize = 100 * 1024; +template <wtf_size_t Size> +static Vector<uint8_t> VectorFromArray(const uint8_t (&array)[Size]) { + Vector<uint8_t> vector; + vector.Append(array, Size); + return vector; +} + // A custom gmock Action that fires the given callback. This is used in // conjuction with the CallbackRunLoop in order to drive the TestTaskRunner // until callbacks are fired. For example: @@ -414,6 +442,91 @@ quic::QuicRandom* quic_random_; }; +// A CryptoClientStream that bypasses the QUIC handshake and becomes connected. +class ConnectedCryptoClientStream final : public quic::QuicCryptoClientStream { + public: + ConnectedCryptoClientStream( + const quic::QuicServerId& server_id, + quic::QuicSession* session, + std::unique_ptr<quic::ProofVerifyContext> verify_context, + quic::QuicCryptoClientConfig* crypto_config, + quic::QuicCryptoClientStream::ProofHandler* proof_handler) + : quic::QuicCryptoClientStream(server_id, + session, + std::move(verify_context), + crypto_config, + proof_handler), + session_(session) {} + ~ConnectedCryptoClientStream() override {} + + bool CryptoConnect() override { + encryption_established_ = true; + handshake_confirmed_ = true; + // quic::QuicSession checks that its config has been negotiated after the + // handshake has been confirmed. The easiest way to fake negotiated values + // is to have the config object process a hello message. + quic::QuicConfig config; + config.SetIdleNetworkTimeout( + quic::QuicTime::Delta::FromSeconds(2 * quic::kMaximumIdleTimeoutSecs), + quic::QuicTime::Delta::FromSeconds(quic::kMaximumIdleTimeoutSecs)); + config.SetBytesForConnectionIdToSend(quic::PACKET_8BYTE_CONNECTION_ID); + config.SetMaxIncomingDynamicStreamsToSend( + quic::kDefaultMaxStreamsPerConnection / 2); + quic::CryptoHandshakeMessage message; + config.ToHandshakeMessage(&message); + std::string error_details; + session()->config()->ProcessPeerHello(message, quic::CLIENT, + &error_details); + session()->OnConfigNegotiated(); + session()->OnCryptoHandshakeEvent(quic::QuicSession::HANDSHAKE_CONFIRMED); + return true; + } + + quic::QuicSession* session() { return session_; } + + bool encryption_established() const override { + return encryption_established_; + } + + bool handshake_confirmed() const override { return handshake_confirmed_; } + + private: + bool encryption_established_ = false; + bool handshake_confirmed_ = false; + // Outlives this object. + quic::QuicSession* session_; +}; + +// A P2PQuicCryptoStream factory that uses a ConnectedCryptoClientStream +// test object that can fake a successful connection. +class ConnectedCryptoClientStreamFactory final + : public P2PQuicCryptoStreamFactory { + public: + ~ConnectedCryptoClientStreamFactory() override {} + + std::unique_ptr<quic::QuicCryptoClientStream> CreateClientCryptoStream( + quic::QuicSession* session, + quic::QuicCryptoClientConfig* crypto_config, + quic::QuicCryptoClientStream::ProofHandler* proof_handler) override { + quic::QuicServerId server_id("dummy_host", 12345); + return std::make_unique<ConnectedCryptoClientStream>( + server_id, session, + crypto_config->proof_verifier()->CreateDefaultContext(), crypto_config, + proof_handler); + } + + // Creates a real quic::QuiCryptoServerStream. + std::unique_ptr<quic::QuicCryptoServerStream> CreateServerCryptoStream( + const quic::QuicCryptoServerConfig* crypto_config, + quic::QuicCompressedCertsCache* compressed_certs_cache, + quic::QuicSession* session, + quic::QuicCryptoServerStream::Helper* helper) override { + return std::make_unique<quic::QuicCryptoServerStream>( + crypto_config, compressed_certs_cache, + /*use_stateless_rejects_if_peer_supported=*/false, session, helper); + } +}; + } // namespace // Unit tests for the P2PQuicTransport, using an underlying fake packet @@ -474,7 +587,8 @@ P2PQuicTransportImpl::Create( &clock_, alarm_factory_.get(), quic_random_, client_quic_transport_delegate.get(), client_packet_transport.get(), - client_config, std::move(client_crypto_factory)); + client_config, std::move(client_crypto_factory), + std::make_unique<P2PQuicCryptoStreamFactoryImpl>()); client_peer_ = std::make_unique<QuicPeerForTest>( std::move(client_packet_transport), @@ -494,7 +608,8 @@ P2PQuicTransportImpl::Create( &clock_, alarm_factory_.get(), quic_random_, server_quic_transport_delegate.get(), server_packet_transport.get(), - server_config, std::move(server_crypto_factory)); + server_config, std::move(server_crypto_factory), + std::make_unique<P2PQuicCryptoStreamFactoryImpl>()); server_peer_ = std::make_unique<QuicPeerForTest>( std::move(server_packet_transport), @@ -528,9 +643,9 @@ // This is done using a pre shared key. void Connect() { CallbackRunLoop run_loop(runner()); - EXPECT_CALL(*client_peer_->quic_transport_delegate(), OnConnected()) + EXPECT_CALL(*client_peer_->quic_transport_delegate(), OnConnected(_)) .WillOnce(FireCallback(run_loop.CreateCallback())); - EXPECT_CALL(*server_peer_->quic_transport_delegate(), OnConnected()) + EXPECT_CALL(*server_peer_->quic_transport_delegate(), OnConnected(_)) .WillOnce(FireCallback(run_loop.CreateCallback())); server_peer_->quic_transport()->Start( @@ -626,13 +741,6 @@ scoped_refptr<net::test::TestTaskRunner> runner() { return runner_; } - template <wtf_size_t Size> - static Vector<uint8_t> VectorFromArray(const uint8_t (&array)[Size]) { - Vector<uint8_t> vector; - vector.Append(array, Size); - return vector; - } - private: quic::MockClock clock_; quic::QuicRandom* quic_random_; @@ -653,9 +761,14 @@ Initialize(); CallbackRunLoop run_loop(runner()); - EXPECT_CALL(*client_peer()->quic_transport_delegate(), OnConnected()) + // Datagrams should be supported. + EXPECT_CALL(*client_peer()->quic_transport_delegate(), + OnConnected(Property( + &P2PQuicNegotiatedParams::datagrams_supported, Eq(true)))) .WillOnce(FireCallback(run_loop.CreateCallback())); - EXPECT_CALL(*server_peer()->quic_transport_delegate(), OnConnected()) + EXPECT_CALL(*server_peer()->quic_transport_delegate(), + OnConnected(Property( + &P2PQuicNegotiatedParams::datagrams_supported, Eq(true)))) .WillOnce(FireCallback(run_loop.CreateCallback())); server_peer()->quic_transport()->Start( @@ -677,9 +790,14 @@ Initialize(); CallbackRunLoop run_loop(runner()); - EXPECT_CALL(*client_peer()->quic_transport_delegate(), OnConnected()) + // Datagrams should be supported. + EXPECT_CALL(*client_peer()->quic_transport_delegate(), + OnConnected(Property( + &P2PQuicNegotiatedParams::datagrams_supported, Eq(true)))) .WillOnce(FireCallback(run_loop.CreateCallback())); - EXPECT_CALL(*server_peer()->quic_transport_delegate(), OnConnected()) + EXPECT_CALL(*server_peer()->quic_transport_delegate(), + OnConnected(Property( + &P2PQuicNegotiatedParams::datagrams_supported, Eq(true)))) .WillOnce(FireCallback(run_loop.CreateCallback())); // Start the handshake with the remote fingerprints. @@ -702,6 +820,7 @@ EXPECT_TRUE(server_peer()->quic_transport()->IsCryptoHandshakeConfirmed()); EXPECT_TRUE(server_peer()->quic_transport()->IsEncryptionEstablished()); } + // Tests the standard case for the server side closing the connection. TEST_F(P2PQuicTransportTest, ServerStops) { Initialize(); @@ -1116,13 +1235,42 @@ ExpectStreamsClosed(); } +// Tests that when datagrams are sent from each side they are received on the +// other end. +TEST_F(P2PQuicTransportTest, DatagramsSentReceivedOnRemoteSide) { + Initialize(); + Connect(); + CallbackRunLoop run_loop(runner()); + + // We should get the appropriate message on each end. + EXPECT_CALL(*server_peer()->quic_transport_delegate(), + OnReceivedDatagram(ElementsAreArray(kClientMessage))) + .WillOnce(FireCallback(run_loop.CreateCallback())); + EXPECT_CALL(*client_peer()->quic_transport_delegate(), + OnReceivedDatagram(ElementsAreArray(kServerMessage))) + .WillOnce(FireCallback(run_loop.CreateCallback())); + // The OnDatagramSent callback should fire for each datagram being sent. + EXPECT_CALL(*server_peer()->quic_transport_delegate(), OnDatagramSent()) + .Times(1) + .WillOnce(FireCallback(run_loop.CreateCallback())); + EXPECT_CALL(*client_peer()->quic_transport_delegate(), OnDatagramSent()) + .Times(1) + .WillOnce(FireCallback(run_loop.CreateCallback())); + + server_peer()->quic_transport()->SendDatagram( + VectorFromArray(kServerMessage)); + client_peer()->quic_transport()->SendDatagram( + VectorFromArray(kClientMessage)); + + run_loop.RunUntilCallbacksFired(); +} + // Tests that when data is sent on a stream it is received on the other end. TEST_F(P2PQuicTransportTest, StreamDataSentThenReceivedOnRemoteSide) { Initialize(); Connect(); SetupConnectedStreams(); CallbackRunLoop run_loop(runner()); - const uint8_t kMessage[] = {'h', 'o', 'w', 'd', 'y'}; EXPECT_CALL(*server_peer()->stream_delegate(), OnDataReceived(ElementsAreArray(kMessage), false)) @@ -1143,8 +1291,6 @@ Connect(); SetupConnectedStreams(); CallbackRunLoop run_loop(runner()); - const uint8_t kServerMessage[] = {'s', 'e', 'r', 'v', 'e', 'r'}; - const uint8_t kClientMessage[] = {'c', 'l', 'i', 'e', 'n', 't'}; EXPECT_CALL(*server_peer()->stream_delegate(), OnDataReceived(VectorFromArray(kClientMessage), true)) @@ -1213,4 +1359,170 @@ EXPECT_GT(server_stats_2.timestamp, server_stats_1.timestamp); } +// P2PQuicTransport tests that use a fake quic::QuicConnection. +class P2PQuicTransportMockConnectionTest : public testing::Test { + public: + P2PQuicTransportMockConnectionTest() { + connection_helper_ = new quic::test::MockQuicConnectionHelper(); + connection_ = new quic::test::MockQuicConnection( + connection_helper_, &alarm_factory_, quic::Perspective::IS_CLIENT); + + rtc::scoped_refptr<rtc::RTCCertificate> certificate = + CreateTestCertificate(); + P2PQuicTransportConfig config(quic::Perspective::IS_CLIENT, {certificate}, + kTransportDelegateReadBufferSize, + kTransportWriteBufferSize); + quic::QuicConfig quic_config; + transport_ = std::make_unique<P2PQuicTransportImpl>( + &delegate_, &packet_transport_, config, + std::unique_ptr<quic::test::MockQuicConnectionHelper>( + connection_helper_), + std::unique_ptr<quic::test::MockQuicConnection>(connection_), + quic_config, + std::make_unique<P2PQuicCryptoConfigFactoryImpl>(&quic_random_), + std::make_unique<ConnectedCryptoClientStreamFactory>(), &clock_); + // Called once in P2PQuicTransportImpl::Start and once in the destructor. + EXPECT_CALL(packet_transport_, SetReceiveDelegate(transport())).Times(1); + EXPECT_CALL(packet_transport_, SetReceiveDelegate(nullptr)).Times(1); + // DCHECKS get hit when the clock is at 0. + connection_helper_->AdvanceTime(quic::QuicTime::Delta::FromSeconds(1)); + transport_->Start(P2PQuicTransport::StartConfig("foobar")); + } + + ~P2PQuicTransportMockConnectionTest() override {} + + P2PQuicTransportImpl* transport() { return transport_.get(); } + + MockP2PQuicTransportDelegate* delegate() { return &delegate_; } + + quic::test::MockQuicConnection* connection() { return connection_; } + + private: + quic::MockClock clock_; + MockP2PQuicPacketTransport packet_transport_; + quic::test::MockRandom quic_random_; + quic::test::MockAlarmFactory alarm_factory_; + MockP2PQuicTransportDelegate delegate_; + std::unique_ptr<P2PQuicTransportImpl> transport_; + // Owned by the |transport_|. + quic::test::MockQuicConnection* connection_; + quic::test::MockQuicConnectionHelper* connection_helper_; +}; + +// Test that when a datagram is received it properly fires the +// OnReceivedDatagram function on the delegate. +TEST_F(P2PQuicTransportMockConnectionTest, OnReceivedDatagram) { + EXPECT_TRUE(transport()->CanSendDatagram()); + EXPECT_CALL(*delegate(), OnReceivedDatagram(ElementsAreArray(kMessage))); + transport()->OnMessageReceived(quic::QuicStringPiece( + reinterpret_cast<const char*>(kMessage), sizeof(kMessage))); +} + +// Test that when a datagram is sent that is properly fires the OnDatagramSent +// function on the delegate. +TEST_F(P2PQuicTransportMockConnectionTest, OnDatagramSent) { + EXPECT_CALL(*connection(), SendMessage(_, _)) + .WillOnce(Invoke( + [](quic::QuicMessageId message_id, quic::QuicMemSliceSpan message) { + EXPECT_THAT(message.GetData(0), ElementsAreArray(kMessage)); + return quic::MESSAGE_STATUS_SUCCESS; + })); + EXPECT_CALL(*delegate(), OnDatagramSent()); + + transport()->SendDatagram(VectorFromArray(kMessage)); +} + +// Test that when the quic::QuicConnection is congestion control blocked that +// the datagram gets buffered and not sent. +TEST_F(P2PQuicTransportMockConnectionTest, DatagramNotSent) { + EXPECT_CALL(*connection(), SendMessage(_, _)) + .WillOnce(Return(quic::MESSAGE_STATUS_BLOCKED)); + EXPECT_CALL(*delegate(), OnDatagramSent()).Times(0); + + transport()->SendDatagram(VectorFromArray(kMessage)); +} + +// Test that when datagrams are buffered they are later sent when the transport +// is no longer congestion control blocked. +TEST_F(P2PQuicTransportMockConnectionTest, BufferedDatagramsSent) { + EXPECT_CALL(*connection(), SendMessage(_, _)) + .WillOnce(Return(quic::MESSAGE_STATUS_BLOCKED)); + transport()->SendDatagram(VectorFromArray(kMessage)); + transport()->SendDatagram(VectorFromArray(kMessage2)); + + EXPECT_CALL(*delegate(), OnDatagramSent()).Times(2); + // Need to check equality with the function call matcher, instead of + // passing a lamda that checks equality in an Invoke as done in other tests. + EXPECT_CALL(*connection(), + SendMessage(_, ResultOf( + [](quic::QuicMemSliceSpan message) { + return message.GetData(0); + }, + ElementsAreArray(kMessage)))) + .WillOnce(Return(quic::MESSAGE_STATUS_SUCCESS)); + EXPECT_CALL(*connection(), + SendMessage(_, ResultOf( + [](quic::QuicMemSliceSpan message) { + return message.GetData(0); + }, + ElementsAreArray(kMessage2)))) + .WillOnce(Return(quic::MESSAGE_STATUS_SUCCESS)); + + transport()->OnCanWrite(); +} + +// Tests the following scenario: +// -Write blocked - datagrams are buffered. +// -Write unblocked - send buffered datagrams. +// -Write blocked - keep datagrams buffered. +TEST_F(P2PQuicTransportMockConnectionTest, BufferedDatagramRemainBuffered) { + EXPECT_CALL(*connection(), SendMessage(_, _)) + .WillOnce(Return(quic::MESSAGE_STATUS_BLOCKED)); + transport()->SendDatagram(VectorFromArray(kMessage)); + transport()->SendDatagram(VectorFromArray(kMessage2)); + + // The first datagram gets sent off after becoming write unblocked, while the + // second datagram is buffered. + EXPECT_CALL(*connection(), + SendMessage(_, ResultOf( + [](quic::QuicMemSliceSpan message) { + return message.GetData(0); + }, + ElementsAreArray(kMessage)))) + .WillOnce(Return(quic::MESSAGE_STATUS_SUCCESS)); + EXPECT_CALL(*connection(), + SendMessage(_, ResultOf( + [](quic::QuicMemSliceSpan message) { + return message.GetData(0); + }, + ElementsAreArray(kMessage2)))) + .WillOnce(Return(quic::MESSAGE_STATUS_BLOCKED)); + // No callback for the second datagram, as it is still buffered. + EXPECT_CALL(*delegate(), OnDatagramSent()).Times(1); + + transport()->OnCanWrite(); + + // Sending another datagram at this point should just buffer it. + EXPECT_CALL(*connection(), SendMessage(_, _)).Times(0); + transport()->SendDatagram(VectorFromArray(kMessage)); +} + +TEST_F(P2PQuicTransportMockConnectionTest, LostDatagramUpdatesStats) { + // The ID the quic::QuicSession will assign to the datagram that is used for + // callbacks, like OnDatagramLost. + uint32_t datagram_id; + EXPECT_CALL(*connection(), SendMessage(_, _)) + .WillOnce(Invoke([&datagram_id](quic::QuicMessageId message_id, + quic::QuicMemSliceSpan message) { + datagram_id = message_id; + return quic::MESSAGE_STATUS_SUCCESS; + })); + EXPECT_CALL(*delegate(), OnDatagramSent()).Times(1); + transport()->SendDatagram(VectorFromArray(kMessage)); + + EXPECT_EQ(0u, transport()->GetStats().num_datagrams_lost); + transport()->OnMessageLost(datagram_id); + + EXPECT_EQ(1u, transport()->GetStats().num_datagrams_lost); +} } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/quic_transport_host.cc b/third_party/blink/renderer/modules/peerconnection/adapters/quic_transport_host.cc index d112cdc7..bcc47ba 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/quic_transport_host.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/quic_transport_host.cc
@@ -7,6 +7,7 @@ #include <utility> #include "third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_factory.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/quic_stream_host.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/quic_stream_proxy.h" @@ -114,8 +115,10 @@ proxy_, error_details, from_remote)); } -void QuicTransportHost::OnConnected() { +void QuicTransportHost::OnConnected(P2PQuicNegotiatedParams negotiated_params) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + // TODO(shampson): When datagrams are integrated with RTCQuicTransport + // propagate the negotiated_params up. PostCrossThreadTask( *proxy_thread(), FROM_HERE, CrossThreadBind(&QuicTransportProxy::OnConnected, proxy_)); @@ -140,4 +143,16 @@ WTF::Passed(std::move(stream_proxy)))); } +void QuicTransportHost::OnDatagramSent() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + // TODO(shampson): Implement when this is hooked into RTCQuicTransport. + return; +} + +void QuicTransportHost::OnReceivedDatagram(Vector<uint8_t> datagram) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + // TODO(shampson): Implement when this is hooked into RTCQuicTransport. + return; +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/quic_transport_host.h b/third_party/blink/renderer/modules/peerconnection/adapters/quic_transport_host.h index 9c03337..824ca3b 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/quic_transport_host.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/quic_transport_host.h
@@ -71,8 +71,10 @@ void OnRemoteStopped() override; void OnConnectionFailed(const std::string& error_details, bool from_remote) override; - void OnConnected() override; + void OnConnected(P2PQuicNegotiatedParams negotiated_params) override; void OnStream(P2PQuicStream* stream) override; + void OnDatagramSent() override; + void OnReceivedDatagram(Vector<uint8_t> datagram) override; std::unique_ptr<P2PQuicTransportFactory> quic_transport_factory_; std::unique_ptr<P2PQuicTransport> quic_transport_;
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport.h b/third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport.h index c2cc116..e9cfc96 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport.h
@@ -22,6 +22,7 @@ MOCK_METHOD1(MockStart, void(const StartConfig&)); MOCK_METHOD0(CreateStream, P2PQuicStream*()); MOCK_CONST_METHOD0(GetStats, P2PQuicTransportStats()); + MOCK_METHOD1(SendDatagram, void(Vector<uint8_t>)); }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport_delegate.h b/third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport_delegate.h index 9c0efc5..8f7c339 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport_delegate.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_transport_delegate.h
@@ -16,8 +16,10 @@ // P2PQuicTransport::Delegate overrides. MOCK_METHOD0(OnRemoteStopped, void()); MOCK_METHOD2(OnConnectionFailed, void(const std::string&, bool)); - MOCK_METHOD0(OnConnected, void()); + MOCK_METHOD1(OnConnected, void(P2PQuicNegotiatedParams)); MOCK_METHOD1(OnStream, void(P2PQuicStream*)); + MOCK_METHOD1(OnReceivedDatagram, void(Vector<uint8_t> datagram)); + MOCK_METHOD0(OnDatagramSent, void()); }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_quic_transport_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_quic_transport_test.cc index f4b17da..72bb5127 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_quic_transport_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_quic_transport_test.cc
@@ -11,6 +11,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_quic_transport_stats.h" #include "third_party/blink/renderer/core/dom/dom_high_res_time_stamp.h" +#include "third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport.h" #include "third_party/blink/renderer/modules/peerconnection/adapters/test/mock_p2p_quic_packet_transport.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_ice_gather_options.h" #include "third_party/webrtc/rtc_base/rtc_certificate_generator.h" @@ -100,7 +101,7 @@ quic_transport->start(CreateRemoteRTCQuicParameters1(), ASSERT_NO_EXCEPTION); RunUntilIdle(); DCHECK(delegate); - delegate->OnConnected(); + delegate->OnConnected(P2PQuicNegotiatedParams()); RunUntilIdle(); DCHECK_EQ("connected", quic_transport->state()); if (delegate_out) {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc index 7efcfb71..aad7f26c 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc
@@ -34,8 +34,6 @@ DISALLOW_NEW(); public: - using BytesChunk = Vector<char>; - Receiver(mojo::ScopedDataPipeConsumerHandle handle, uint64_t total_bytes, scoped_refptr<base::SingleThreadTaskRunner> task_runner) @@ -43,7 +41,9 @@ watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL, std::move(task_runner)), - remaining_bytes_(total_bytes) {} + remaining_bytes_(total_bytes) { + data_.ReserveInitialCapacity(SafeCast<wtf_size_t>(total_bytes)); + } void Start(base::OnceClosure callback) { if (!handle_.is_valid()) { @@ -88,11 +88,9 @@ return; } - if (bytes_read > 0) { - BytesChunk chunk; - chunk.Append(static_cast<const char*>(buffer), bytes_read); - chunks_.emplace_back(std::move(chunk)); - } + if (bytes_read > 0) + data_.Append(static_cast<const uint8_t*>(buffer), bytes_read); + rv = handle_->EndReadData(bytes_read); DCHECK_EQ(rv, MOJO_RESULT_OK); CHECK_GE(remaining_bytes_, bytes_read); @@ -103,9 +101,9 @@ bool IsRunning() const { return handle_.is_valid(); } bool HasReceivedAllData() const { return remaining_bytes_ == 0; } - Vector<BytesChunk> TakeChunks() { + Vector<uint8_t> TakeData() { DCHECK(!IsRunning()); - return std::move(chunks_); + return std::move(data_); } private: @@ -113,7 +111,7 @@ handle_.reset(); watcher_.Cancel(); if (!HasReceivedAllData()) - chunks_.clear(); + data_.clear(); DCHECK(callback_); std::move(callback_).Run(); } @@ -122,7 +120,7 @@ mojo::ScopedDataPipeConsumerHandle handle_; mojo::SimpleWatcher watcher_; - Vector<BytesChunk> chunks_; + Vector<uint8_t> data_; uint64_t remaining_bytes_; }; @@ -219,8 +217,8 @@ } auto script_data = std::make_unique<RawScriptData>( - script_info->encoding, receivers->body()->TakeChunks(), - receivers->meta_data()->TakeChunks()); + script_info->encoding, receivers->body()->TakeData(), + receivers->meta_data()->TakeData()); for (const auto& entry : script_info->headers) script_data->AddHeader(entry.key, entry.value); script_container_->AddOnIOThread(script_info->script_url, @@ -286,24 +284,19 @@ ? UTF8Encoding() : WTF::TextEncoding(raw_script_data->Encoding()))); - StringBuilder source_text_builder; - for (const auto& chunk : raw_script_data->ScriptTextChunks()) - source_text_builder.Append(decoder->Decode(chunk.data(), chunk.size())); + Vector<uint8_t> source_text = raw_script_data->TakeScriptText(); + String decoded_source_text = decoder->Decode( + reinterpret_cast<const char*>(source_text.data()), source_text.size()); + // TODO(crbug.com/946676): Remove the unique_ptr<> wrapper around the Vector + // as we can just use Vector::IsEmpty() to distinguish missing code cache. std::unique_ptr<Vector<uint8_t>> meta_data; - if (raw_script_data->MetaDataChunks().size() > 0) { - size_t total_metadata_size = 0; - for (const auto& chunk : raw_script_data->MetaDataChunks()) - total_metadata_size += chunk.size(); - meta_data = std::make_unique<Vector<uint8_t>>(); - meta_data->ReserveInitialCapacity( - SafeCast<wtf_size_t>(total_metadata_size)); - for (const auto& chunk : raw_script_data->MetaDataChunks()) - meta_data->Append(chunk.data(), static_cast<wtf_size_t>(chunk.size())); - } + Vector<uint8_t> meta_data_in = raw_script_data->TakeMetaData(); + if (meta_data_in.size() > 0) + meta_data = std::make_unique<Vector<uint8_t>>(std::move(meta_data_in)); return std::make_unique<InstalledScriptsManager::ScriptData>( - script_url, source_text_builder.ToString(), std::move(meta_data), + script_url, decoded_source_text, std::move(meta_data), raw_script_data->TakeHeaders()); }
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager_test.cc b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager_test.cc index 6370640..e266f99 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager_test.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager_test.cc
@@ -245,16 +245,14 @@ // Wait for the script's arrival. get_raw_script_data_waiter->Wait(); EXPECT_TRUE(script_data); - ASSERT_EQ(1u, script_data->ScriptTextChunks().size()); - ASSERT_EQ(kExpectedBody.size() + 1, - script_data->ScriptTextChunks()[0].size()); + Vector<uint8_t> script_text = script_data->TakeScriptText(); + Vector<uint8_t> meta_data = script_data->TakeMetaData(); + ASSERT_EQ(kExpectedBody.size() + 1, script_text.size()); EXPECT_STREQ(kExpectedBody.data(), - script_data->ScriptTextChunks()[0].data()); - ASSERT_EQ(1u, script_data->MetaDataChunks().size()); - ASSERT_EQ(kExpectedMetaData.size() + 1, - script_data->MetaDataChunks()[0].size()); + reinterpret_cast<const char*>(script_text.data())); + ASSERT_EQ(kExpectedMetaData.size() + 1, meta_data.size()); EXPECT_STREQ(kExpectedMetaData.data(), - script_data->MetaDataChunks()[0].data()); + reinterpret_cast<const char*>(meta_data.data())); EXPECT_EQ(kScriptInfoEncoding, script_data->Encoding()); EXPECT_EQ(ToCrossThreadHTTPHeaderMapData(kScriptInfoHeaders), *(script_data->TakeHeaders())); @@ -290,16 +288,14 @@ // Wait for the script's arrival. get_raw_script_data_waiter->Wait(); EXPECT_TRUE(script_data); - ASSERT_EQ(1u, script_data->ScriptTextChunks().size()); - ASSERT_EQ(kExpectedBody.size() + 1, - script_data->ScriptTextChunks()[0].size()); + Vector<uint8_t> script_text = script_data->TakeScriptText(); + Vector<uint8_t> meta_data = script_data->TakeMetaData(); + ASSERT_EQ(kExpectedBody.size() + 1, script_text.size()); EXPECT_STREQ(kExpectedBody.data(), - script_data->ScriptTextChunks()[0].data()); - ASSERT_EQ(1u, script_data->MetaDataChunks().size()); - ASSERT_EQ(kExpectedMetaData.size() + 1, - script_data->MetaDataChunks()[0].size()); + reinterpret_cast<const char*>(script_text.data())); + ASSERT_EQ(kExpectedMetaData.size() + 1, meta_data.size()); EXPECT_STREQ(kExpectedMetaData.data(), - script_data->MetaDataChunks()[0].data()); + reinterpret_cast<const char*>(meta_data.data())); EXPECT_EQ(kScriptInfoEncoding, script_data->Encoding()); EXPECT_EQ(ToCrossThreadHTTPHeaderMapData(kScriptInfoHeaders), *(script_data->TakeHeaders()));
diff --git a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.cc b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.cc index fdb883d0..2596ead 100644 --- a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.cc +++ b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.cc
@@ -10,8 +10,8 @@ ThreadSafeScriptContainer::RawScriptData::RawScriptData( const String& encoding, - Vector<BytesChunk> script_text, - Vector<BytesChunk> meta_data) + Vector<uint8_t> script_text, + Vector<uint8_t> meta_data) : encoding_(encoding.IsolatedCopy()), script_text_(std::move(script_text)), meta_data_(std::move(meta_data)),
diff --git a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.h b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.h index 00a9e857..65484933 100644 --- a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.h +++ b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.h
@@ -48,19 +48,20 @@ public: RawScriptData(const String& encoding, - Vector<BytesChunk> script_text, - Vector<BytesChunk> meta_data); + Vector<uint8_t> script_text, + Vector<uint8_t> meta_data); ~RawScriptData(); void AddHeader(const String& key, const String& value); // The encoding of the script text. const String& Encoding() const { return encoding_; } - // An array of raw byte chunks of the script text. - const Vector<BytesChunk>& ScriptTextChunks() const { return script_text_; } - // An array of raw byte chunks of the scripts's meta data from the script's - // V8 code cache. - const Vector<BytesChunk>& MetaDataChunks() const { return meta_data_; } + + // An array of raw bytes representing the script text. + Vector<uint8_t> TakeScriptText() { return std::move(script_text_); } + + // An array of raw bytes representing the cached metadata. + Vector<uint8_t> TakeMetaData() { return std::move(meta_data_); } // The HTTP headers of the script. std::unique_ptr<CrossThreadHTTPHeaderMapData> TakeHeaders() { @@ -69,8 +70,8 @@ private: String encoding_; - Vector<BytesChunk> script_text_; - Vector<BytesChunk> meta_data_; + Vector<uint8_t> script_text_; + Vector<uint8_t> meta_data_; std::unique_ptr<CrossThreadHTTPHeaderMapData> headers_; };
diff --git a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container_test.cc b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container_test.cc index 0e23e13..d4bb1e03 100644 --- a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container_test.cc +++ b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container_test.cc
@@ -49,8 +49,8 @@ auto data = std::make_unique<ThreadSafeScriptContainer::RawScriptData>( String::FromUTF8("utf-8") /* encoding */, - Vector<Vector<char>>() /* script_text */, - Vector<Vector<char>>() /* meta_data */); + Vector<uint8_t>() /* script_text */, + Vector<uint8_t>() /* meta_data */); *out_data = data.get(); container->AddOnIOThread(KURL(kKeyUrl), std::move(data)); waiter->Signal();
diff --git a/third_party/blink/renderer/platform/loader/allowed_by_nosniff_test.cc b/third_party/blink/renderer/platform/loader/allowed_by_nosniff_test.cc index ba686b97..c923f52 100644 --- a/third_party/blink/renderer/platform/loader/allowed_by_nosniff_test.cc +++ b/third_party/blink/renderer/platform/loader/allowed_by_nosniff_test.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_response.h" #include "third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h" +#include "third_party/blink/renderer/platform/loader/testing/test_loader_factory.h" #include "third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -107,7 +108,8 @@ auto* context = CountUsageMockFetchContext::Create(); // Bind |properties| to |context| through a ResourceFetcher. MakeGarbageCollected<ResourceFetcher>( - ResourceFetcherInit(*properties, context, CreateTaskRunner())); + ResourceFetcherInit(*properties, context, CreateTaskRunner(), + MakeGarbageCollected<TestLoaderFactory>())); Persistent<MockConsoleLogger> logger = MakeGarbageCollected<MockConsoleLogger>(); ResourceResponse response(url); @@ -218,7 +220,8 @@ auto* context = CountUsageMockFetchContext::Create(); // Bind |properties| to |context| through a ResourceFetcher. MakeGarbageCollected<ResourceFetcher>( - ResourceFetcherInit(*properties, context, CreateTaskRunner())); + ResourceFetcherInit(*properties, context, CreateTaskRunner(), + MakeGarbageCollected<TestLoaderFactory>())); Persistent<MockConsoleLogger> logger = MakeGarbageCollected<MockConsoleLogger>(); ResourceResponse response(KURL(testcase.url)); @@ -263,7 +266,8 @@ auto* context = CountUsageMockFetchContext::Create(); // Bind |properties| to |context| through a ResourceFetcher. MakeGarbageCollected<ResourceFetcher>( - ResourceFetcherInit(*properties, context, CreateTaskRunner())); + ResourceFetcherInit(*properties, context, CreateTaskRunner(), + MakeGarbageCollected<TestLoaderFactory>())); Persistent<MockConsoleLogger> logger = MakeGarbageCollected<MockConsoleLogger>(); EXPECT_CALL(*logger, AddConsoleMessage(_, _, _))
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_context.cc b/third_party/blink/renderer/platform/loader/fetch/fetch_context.cc index 7dd8c17..86138816 100644 --- a/third_party/blink/renderer/platform/loader/fetch/fetch_context.cc +++ b/third_party/blink/renderer/platform/loader/fetch/fetch_context.cc
@@ -65,10 +65,6 @@ visitor->Trace(resource_fetcher_properties_); } -void FetchContext::DispatchDidChangeResourcePriority(uint64_t, - ResourceLoadPriority, - int) {} - void FetchContext::AddAdditionalRequestHeaders(ResourceRequest&) {} mojom::FetchCacheMode FetchContext::ResourceRequestCachePolicy(
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_context.h b/third_party/blink/renderer/platform/loader/fetch/fetch_context.h index a5dd6db..219445fb 100644 --- a/third_party/blink/renderer/platform/loader/fetch/fetch_context.h +++ b/third_party/blink/renderer/platform/loader/fetch/fetch_context.h
@@ -105,10 +105,6 @@ ResourceType, FetchParameters::DeferOption) const; - virtual void DispatchDidChangeResourcePriority(uint64_t identifier, - ResourceLoadPriority, - int intra_priority_value); - // This internally dispatches WebLocalFrameClient::WillSendRequest and hooks // request interceptors like ServiceWorker and ApplicationCache. // This may modify the request.
diff --git a/third_party/blink/renderer/platform/loader/fetch/memory_cache_correctness_test.cc b/third_party/blink/renderer/platform/loader/fetch/memory_cache_correctness_test.cc index ea9cdeb..44c5a5c 100644 --- a/third_party/blink/renderer/platform/loader/fetch/memory_cache_correctness_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/memory_cache_correctness_test.cc
@@ -40,6 +40,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" #include "third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h" #include "third_party/blink/renderer/platform/loader/testing/mock_resource.h" +#include "third_party/blink/renderer/platform/loader/testing/test_loader_factory.h" #include "third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h" @@ -119,9 +120,9 @@ auto* properties = MakeGarbageCollected<TestResourceFetcherProperties>(security_origin_); properties->SetShouldBlockLoadingSubResource(true); - fetcher_ = MakeGarbageCollected<ResourceFetcher>( - ResourceFetcherInit(*properties, context, - base::MakeRefCounted<scheduler::FakeTaskRunner>())); + fetcher_ = MakeGarbageCollected<ResourceFetcher>(ResourceFetcherInit( + *properties, context, base::MakeRefCounted<scheduler::FakeTaskRunner>(), + MakeGarbageCollected<TestLoaderFactory>())); } void TearDown() override { GetMemoryCache()->EvictResources();
diff --git a/third_party/blink/renderer/platform/loader/fetch/memory_cache_test.cc b/third_party/blink/renderer/platform/loader/fetch/memory_cache_test.cc index 7100d42..18dcc3b0 100644 --- a/third_party/blink/renderer/platform/loader/fetch/memory_cache_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/memory_cache_test.cc
@@ -40,6 +40,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" #include "third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h" #include "third_party/blink/renderer/platform/loader/testing/mock_resource_client.h" +#include "third_party/blink/renderer/platform/loader/testing/test_loader_factory.h" #include "third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" @@ -103,7 +104,8 @@ auto* properties = MakeGarbageCollected<TestResourceFetcherProperties>(); fetcher_ = MakeGarbageCollected<ResourceFetcher>(ResourceFetcherInit( *properties, MakeGarbageCollected<MockFetchContext>(), - base::MakeRefCounted<scheduler::FakeTaskRunner>())); + base::MakeRefCounted<scheduler::FakeTaskRunner>(), + MakeGarbageCollected<TestLoaderFactory>())); } void TearDown() override {
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index 6eab68b..810e9c1 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -253,11 +253,14 @@ FetchContext* context, scoped_refptr<base::SingleThreadTaskRunner> task_runner, ResourceFetcher::LoaderFactory* loader_factory) - : ResourceFetcherInit(properties, - context, - std::move(task_runner), - loader_factory, - *MakeGarbageCollected<NullConsoleLogger>()) {} + : properties(properties), + context(context), + task_runner(std::move(task_runner)), + loader_factory(loader_factory) { + DCHECK(context); + DCHECK(this->task_runner); + DCHECK(loader_factory || properties.IsDetached()); +} ResourceLoadPriority ResourceFetcher::ComputeLoadPriority( ResourceType type, @@ -483,8 +486,9 @@ *MakeGarbageCollected<DetachableProperties>(*init.properties)), context_(init.context), task_runner_(init.task_runner), - console_logger_( - MakeGarbageCollected<DetachableConsoleLogger>(*init.console_logger)), + console_logger_(MakeGarbageCollected<DetachableConsoleLogger>( + init.console_logger ? *init.console_logger + : *MakeGarbageCollected<NullConsoleLogger>())), loader_factory_(init.loader_factory), scheduler_(MakeGarbageCollected<ResourceLoadScheduler>( init.initial_throttling_policy, @@ -1934,7 +1938,8 @@ TRACE_ID_WITH_SCOPE("BlinkResourceID", TRACE_ID_LOCAL(resource->InspectorId())), "data", ResourcePrioritySetData(resource_load_priority)); - Context().DispatchDidChangeResourcePriority( + DCHECK(!IsDetached()); + resource_load_observer_->DidChangePriority( resource->InspectorId(), resource_load_priority, resource_priority.intra_priority_value); }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h index ec7e3bb..b37e186b 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -445,33 +445,14 @@ // The given ResourceFetcherProperties is kept until ClearContext() is called. ResourceFetcherInit(const ResourceFetcherProperties& properties, FetchContext* context, - scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : ResourceFetcherInit(properties, - context, - std::move(task_runner), - nullptr) {} - ResourceFetcherInit(const ResourceFetcherProperties& properties, - FetchContext* context, scoped_refptr<base::SingleThreadTaskRunner> task_runner, ResourceFetcher::LoaderFactory* loader_factory); - ResourceFetcherInit(const ResourceFetcherProperties& properties, - FetchContext* context, - scoped_refptr<base::SingleThreadTaskRunner> task_runner, - ResourceFetcher::LoaderFactory* loader_factory, - ConsoleLogger& console_logger) - : properties(properties), - context(context), - task_runner(std::move(task_runner)), - loader_factory(loader_factory), - console_logger(console_logger) { - DCHECK(context); - DCHECK(this->task_runner); - } + const Member<const ResourceFetcherProperties> properties; const Member<FetchContext> context; const scoped_refptr<base::SingleThreadTaskRunner> task_runner; const Member<ResourceFetcher::LoaderFactory> loader_factory; - const Member<ConsoleLogger> console_logger; + Member<ConsoleLogger> console_logger; ResourceLoadScheduler::ThrottlingPolicy initial_throttling_policy = ResourceLoadScheduler::ThrottlingPolicy::kNormal; Member<MHTMLArchive> archive;
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc index 299aa53..39f1daf 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
@@ -111,6 +111,9 @@ const FetchInitiatorInfo&) override { request_ = request; } + void DidChangePriority(uint64_t identifier, + ResourceLoadPriority, + int intra_priority_value) override {} void DidReceiveResponse(uint64_t identifier, const ResourceRequest& request, const ResourceResponse& response, @@ -149,8 +152,7 @@ FetchContext* context) { return MakeGarbageCollected<ResourceFetcher>( ResourceFetcherInit(properties, context, CreateTaskRunner(), - MakeGarbageCollected<TestLoaderFactory>(), - *MakeGarbageCollected<NullConsoleLogger>())); + MakeGarbageCollected<TestLoaderFactory>())); } ResourceFetcher* CreateFetcher(const ResourceFetcherProperties& properties) { return CreateFetcher(properties, MakeGarbageCollected<MockFetchContext>());
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_observer.h b/third_party/blink/renderer/platform/loader/fetch/resource_load_observer.h index e074443..d1d05b7a 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_load_observer.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_observer.h
@@ -10,6 +10,7 @@ #include "base/containers/span.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/loader/fetch/resource.h" +#include "third_party/blink/renderer/platform/loader/fetch/resource_load_priority.h" #include "third_party/blink/renderer/platform/platform_export.h" namespace blink { @@ -30,6 +31,9 @@ // from network - For example, this class may have a function which is called // when ResourceFetcher::RequestResource is called. On the other hand, this // class will not have "operation"s, such as PrepareRequest. +// +// All functions except for the destructor and the trace method must be pure +// virtual, and must not be called when the associated fetcher is detached. class PLATFORM_EXPORT ResourceLoadObserver : public GarbageCollectedFinalized<ResourceLoadObserver> { public: @@ -43,6 +47,11 @@ ResourceType, const FetchInitiatorInfo&) = 0; + // Called when the priority of the request changes. + virtual void DidChangePriority(uint64_t identifier, + ResourceLoadPriority, + int intra_priority_value) = 0; + enum ResponseSource { kFromMemoryCache, kNotFromMemoryCache }; // Called when a response is received. // |request| and |resource| are provided separately because when it's from
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index b8a2018a..daa74c7 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -797,6 +797,7 @@ }, { name: "MediaCapabilitiesEncryptedMedia", + origin_trial_feature_name: "MediaCapabilitiesEncryptedMedia", status: "experimental", }, {
diff --git a/third_party/blink/tools/blinkpy/common/config/builders.json b/third_party/blink/tools/blinkpy/common/config/builders.json index 5c3e7c60..c38cd6b 100644 --- a/third_party/blink/tools/blinkpy/common/config/builders.json +++ b/third_party/blink/tools/blinkpy/common/config/builders.json
@@ -51,6 +51,14 @@ "port_name": "win-win7", "specifiers": ["Win7", "Debug"] }, + "Win10 Tests x64": { + "port_name": "win-win10", + "specifiers": ["Win10", "Release"] + }, + "Win10 Tests x64 (dbg)": { + "port_name": "win-win10", + "specifiers": ["Win10", "Debug"] + }, "linux-blink-rel": { "port_name": "linux-trusty", "specifiers": ["Trusty", "Release"],
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG index 3e57f714..03715c1 100644 --- a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
@@ -235,7 +235,7 @@ crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-009.xht [ Pass ] crbug.com/591099 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-ltr.html [ Pass ] crbug.com/591099 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-rtl.html [ Pass ] -crbug.com/591099 external/wpt/css/cssom-view/offsetTopLeftInline.html [ Pass ] +crbug.com/953479 external/wpt/css/cssom-view/offsetTopLeftEmptyInline.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-011.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-1.html [ Pass ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index be3a489..fd58546 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -280,7 +280,6 @@ crbug.com/882663 display-lock [ Skip ] crbug.com/926276 virtual/display-lock/display-lock/lock-after-append/nested-update.html [ Timeout ] crbug.com/926276 virtual/display-lock/display-lock/lock-after-append/nested-update-and-commit.html [ Timeout ] -crbug.com/944412 virtual/display-lock/display-lock/lock-after-append/acquire-on-no-containment.html [ Crash Pass ] crbug.com/933544 virtual/display-lock/display-lock/lock-after-append/acquire-on-composited-layer.html [ Crash Pass ] # Sheriff 2018/05/25 @@ -548,6 +547,7 @@ crbug.com/377847 external/wpt/css/css-tables/subpixel-table-cell-width-002.html [ Failure ] crbug.com/377847 external/wpt/css/css-tables/subpixel-table-width-001.html [ Failure ] crbug.com/764031 external/wpt/css/css-tables/toggle-row-display-property-001.html [ Failure ] +crbug.com/613753 external/wpt/css/css-tables/border-spacing-included-in-sizes-001.html [ Failure ] # [css-contain] @@ -678,7 +678,6 @@ crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-non-replaced-005.html [ Failure ] crbug.com/591099 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-ltr.html [ Failure ] crbug.com/591099 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-rtl.html [ Failure ] -crbug.com/591099 external/wpt/css/cssom-view/offsetTopLeftInline.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/inline-box-border-vlr-001.html [ Failure ] crbug.com/591099 external/wpt/css/filter-effects/filtered-inline-applies-to-float.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug14159-1.html [ Failure ] @@ -1982,7 +1981,7 @@ crbug.com/922508 [ Linux Debug ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchpad-zoom-in-slow.html [ Failure Pass ] crbug.com/922508 [ Win7 ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchpad-zoom-in-slow.html [ Failure Pass ] crbug.com/922508 [ Linux Debug ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchpad.html [ Failure Pass ] -crbug.com/922508 [ Win7 ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchpad.html [ Failure Pass ] +crbug.com/922508 [ Win ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchpad.html [ Failure Pass ] crbug.com/871139 [ Android ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-in-slow.html [ Failure Timeout ] crbug.com/871139 [ Android ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-out-slow.html [ Failure Timeout ] @@ -2096,8 +2095,8 @@ crbug.com/498539 virtual/nobinary-for-devtools/http/tests/devtools/tracing/timeline-misc/timeline-bound-function.js [ Pass Failure ] crbug.com/498539 virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-bound-function.js [ Pass Failure ] -crbug.com/498539 crbug.com/794869 crbug.com/798548 [ Win7 ] http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Crash Pass Failure ] -crbug.com/498539 crbug.com/794869 crbug.com/798548 [ Win7 ] virtual/nobinary-for-devtools/http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Crash Pass Failure ] +crbug.com/498539 crbug.com/794869 crbug.com/798548 [ Win ] http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Crash Pass Failure ] +crbug.com/498539 crbug.com/794869 crbug.com/798548 [ Win ] virtual/nobinary-for-devtools/http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Crash Pass Failure ] crbug.com/498539 crbug.com/794869 crbug.com/798548 [ Mac ] http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Crash Pass Failure ] crbug.com/498539 crbug.com/794869 crbug.com/798548 [ Mac ] virtual/nobinary-for-devtools/http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Crash Pass Failure ] crbug.com/498539 crbug.com/794869 crbug.com/798548 [ Linux ] http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Crash Pass Failure ] @@ -3077,7 +3076,6 @@ crbug.com/952266 virtual/omt-worker-fetch/external/wpt/workers/modules/dedicated-worker-options-credentials.html [ Timeout ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 [ Mac ] virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-wrap.html [ Failure ] crbug.com/626703 [ Mac10.12 ] external/wpt/media-source/mediasource-config-change-webm-av-framesize.html [ Timeout ] crbug.com/626703 [ Mac10.13 ] external/wpt/media-source/mediasource-config-change-webm-av-framesize.html [ Timeout ] crbug.com/626703 [ Retina ] external/wpt/media-source/mediasource-config-change-webm-av-framesize.html [ Timeout ] @@ -6123,7 +6121,6 @@ # Sheriff 2019-03-06 crbug.com/938591 [ Linux ] fast/events/middleClickAutoscroll-nested-divs-forbidden.html [ Failure Pass ] -crbug.com/938884 [ Win7 Mac ] http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Pass Timeout ] # Caused a revert of a good change. crbug.com/931533 media/video-played-collapse.html [ Pass Failure ] @@ -6310,3 +6307,6 @@ # portals-adopt-predecessor occasionally times out. crbug.com/952584 external/wpt/portals/portals-adopt-predecessor.html [ Pass Timeout ] + +# Sheriff 2019-04-17 +crbug.com/953534 [ Mac ] virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-wrap.html [ Failure ]
diff --git a/third_party/blink/web_tests/display-lock/lock-after-append/acquire-changed-containment-expected.html b/third_party/blink/web_tests/display-lock/lock-after-append/acquire-changed-containment-expected.html new file mode 100644 index 0000000..e2812ba --- /dev/null +++ b/third_party/blink/web_tests/display-lock/lock-after-append/acquire-changed-containment-expected.html
@@ -0,0 +1,12 @@ +<!doctype HTML> + +<style> +#container { + width: 150px; + height: 150px; + background: lightblue; +} +</style> + +<div id="log">PASS Containment requirement is not satisfied.</div> +<div id="container"></div>
diff --git a/third_party/blink/web_tests/display-lock/lock-after-append/acquire-changed-containment.html b/third_party/blink/web_tests/display-lock/lock-after-append/acquire-changed-containment.html new file mode 100644 index 0000000..e82eef13 --- /dev/null +++ b/third_party/blink/web_tests/display-lock/lock-after-append/acquire-changed-containment.html
@@ -0,0 +1,37 @@ +<!-- +Runs an acquire on an element with no containment after recalc, which fails. +--> + +<style> +#container { + width: 150px; + height: 150px; + background: lightblue; +} +</style> + +<div id="log"></div> +<div id="container" style="contain: style layout;"></div> + +<script> +// TODO(vmpstr): In WPT this needs to be replaced with reftest-wait. +if (window.testRunner) + window.testRunner.waitUntilDone(); + +function finishTest(status_string) { + if (document.getElementById("log").innerHTML === "") + document.getElementById("log").innerHTML = status_string; + if (window.testRunner) + window.testRunner.notifyDone(); +} + +function runTest() { + let container = document.getElementById("container"); + container.style = ""; + container.displayLock.acquire({ timeout: Infinity }).then( + () => { finishTest("FAIL"); }, + (e) => { finishTest("PASS " + e.message); }); +} + +window.onload = runTest; +</script>
diff --git a/third_party/blink/web_tests/display-lock/lock-after-append/acquire-on-no-containment-expected.html b/third_party/blink/web_tests/display-lock/lock-after-append/acquire-on-no-containment-expected.html index f7f5df11..e2812ba 100644 --- a/third_party/blink/web_tests/display-lock/lock-after-append/acquire-on-no-containment-expected.html +++ b/third_party/blink/web_tests/display-lock/lock-after-append/acquire-on-no-containment-expected.html
@@ -6,11 +6,6 @@ height: 150px; background: lightblue; } -#child { - width: 50px; - height: 50px; - background: lightgreen; -} </style> <div id="log">PASS Containment requirement is not satisfied.</div>
diff --git a/third_party/blink/web_tests/display-lock/lock-after-append/acquire-on-no-containment.html b/third_party/blink/web_tests/display-lock/lock-after-append/acquire-on-no-containment.html index 24be35bb..b034325 100644 --- a/third_party/blink/web_tests/display-lock/lock-after-append/acquire-on-no-containment.html +++ b/third_party/blink/web_tests/display-lock/lock-after-append/acquire-on-no-containment.html
@@ -10,11 +10,6 @@ height: 150px; background: lightblue; } -#child { - width: 50px; - height: 50px; - background: lightgreen; -} </style> <div id="log"></div>
diff --git a/third_party/blink/web_tests/editing/execCommand/replaceSelectorCommand-crash-expected.txt b/third_party/blink/web_tests/editing/execCommand/replaceSelectorCommand-crash-expected.txt deleted file mode 100644 index 265940ec..0000000 --- a/third_party/blink/web_tests/editing/execCommand/replaceSelectorCommand-crash-expected.txt +++ /dev/null
@@ -1,112 +0,0 @@ -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 31: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 40: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 31: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 31: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 40: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 31: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 40: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 31: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 40: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 31: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 40: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 31: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 52: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 31: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 61: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 65: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 69: We don't execute document.execCommand() this time, because it is called recursively. -CONSOLE WARNING: line 70: We don't execute document.execCommand() this time, because it is called recursively. - - - - - - - - - - - - - - - -Test for crbug.com/338982. Passes if it does not crash - -PASS
diff --git a/third_party/blink/web_tests/editing/execCommand/replaceSelectorCommand-crash.html b/third_party/blink/web_tests/editing/execCommand/replaceSelectorCommand-crash.html index 566b01f9..980df5c 100644 --- a/third_party/blink/web_tests/editing/execCommand/replaceSelectorCommand-crash.html +++ b/third_party/blink/web_tests/editing/execCommand/replaceSelectorCommand-crash.html
@@ -1,29 +1,29 @@ <!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> <script> - if (window.testRunner) { - testRunner.waitUntilDone(); - testRunner.dumpAsText(); - } + const testObject = async_test('Does not crash'); var af = [], i = 0; var setIntervalId; var done = false; function main() { - if (done) + testObject.step(() => { + if (done) return; - if (i == 20 * af.length) { - done = true; - document.body.innerHTML += "<p>Test for crbug.com/338982. Passes if it does not crash</p>"; - document.body.innerHTML += "<p>PASS</p>"; - clearInterval(setIntervalId); - if (window.testRunner) - testRunner.notifyDone(); - return; - } + if (i == 20 * af.length) { + done = true; + document.body.innerHTML += "<p>Test for crbug.com/338982. Passes if it does not crash</p>"; + document.body.innerHTML += "<p>PASS</p>"; + clearInterval(setIntervalId); + testObject.done(); + return; + } - af[i++ % af.length](); + af[i++ % af.length](); + }); } af.push(function() {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/border-spacing-included-in-sizes-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-tables/border-spacing-included-in-sizes-001-expected.txt deleted file mode 100644 index 5e292f5..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-tables/border-spacing-included-in-sizes-001-expected.txt +++ /dev/null
@@ -1,38 +0,0 @@ -This is a testharness.js-based test. -FAIL tbody 1 assert_equals: -<tbody class="outline" data-expected-height="100"> - <tr> - <td></td> - <td></td> - </tr> - </tbody> -height expected 100 but got 120 -FAIL tbody 2 assert_equals: -<tbody class="outline" data-expected-height="150"> - <tr></tr> - <tr></tr> - <tr></tr> - <tr> - <td></td> - <td></td> - </tr> - <tr></tr> - <tr></tr> - </tbody> -height expected 150 but got 160 -FAIL tbody 3 assert_equals: -<tbody class="outline" data-expected-height="100"> - <tr> - <td></td> - <td></td> - </tr> - </tbody> -height expected 100 but got 110 -FAIL tfoot tr 4 assert_equals: -<tr style="outline: 2px dashed black" data-expected-width="210" data-expected-height="100"> - <td></td> - <td></td> - </tr> -width expected 210 but got 230 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/offsetTopLeftEmptyInline.html b/third_party/blink/web_tests/external/wpt/css/cssom-view/offsetTopLeftEmptyInline.html new file mode 100644 index 0000000..85abbb7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/offsetTopLeftEmptyInline.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/cssom-view-1/#extensions-to-the-htmlelement-interface"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<style> + .container { + position: relative; + width: 8em; + height: 7em; + padding: 1em; + } +</style> +<div class="container" style="writing-mode:horizontal-tb;"> + offset + <br>offset<span class="target"></span><span>ref</span> +</div> +<div class="container" style="writing-mode:vertical-lr;"> + offset + <br>offset<span class="target"></span><span>ref</span> +</div> +<div class="container" style="writing-mode:vertical-rl;"> + offset + <br>offset<span class="target"></span><span>ref</span> +</div> +<div class="container" style="writing-mode:horizontal-tb; direction:rtl;"> + offset + <br>offset<span class="target"></span><span>ref</span> +</div> +<div class="container" style="writing-mode:vertical-lr; direction:rtl;"> + offset + <br>offset<span class="target"></span><span>ref</span> +</div> +<div class="container" style="writing-mode:vertical-rl; direction:rtl;"> + offset + <br>offset<span class="target"></span><span>ref</span> +</div> +<script> +var i = 0; +document.querySelectorAll('span.target').forEach((target) => { + var ref = target.nextSibling; + test(() => { + assert_equals(target.offsetLeft, ref.offsetLeft, 'offsetLeft'); + assert_equals(target.offsetTop, ref.offsetTop, 'offsetTop'); + }, 'offsetTop/Left of empty inline elements should work as if they were not empty: ' + i); + i++; +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-tokenization-noopener-expected.txt b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-tokenization-noopener-expected.txt deleted file mode 100644 index fe041cb..0000000 --- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-tokenization-noopener-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -This is a testharness.js-based test. -PASS Tokenization of "noopener" should skip window features separators before feature -PASS Feature "noopener" should be converted to ASCII lowercase -PASS After "noopener", tokenization should skip window features separators that are not "=" or "," -PASS Tokenizing "noopener" should ignore window feature separators except "," after initial "=" and before value -PASS Tokenizing "noopener" should read characters until first window feature separator as `value` -PASS Integer values other than 0 should activate the feature -FAIL Integer value of 0 should not activate "noopener" assert_not_equals: "noopener=0" should NOT activate feature "noopener" got disallowed value null -PASS Invalid feature names should not tokenize as "noopener" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener_indexed-expected.txt b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener_indexed-expected.txt index 23fd006..a7eef5f1 100644 --- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener_indexed-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener_indexed-expected.txt
@@ -1,7 +1,7 @@ This is a testharness.js-based test. PASS window.open() with 'noopener' should not reuse existing target PASS noopener=1 means the same as noopener -FAIL noopener=0 means lack of noopener assert_equals: expected object "[object Window]" but got null +PASS noopener=0 means lack of noopener FAIL noopener needs to be present as a token on its own assert_equals: expected object "[object Window]" but got null PASS Trailing noopener should work PASS Leading noopener should work
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/css-variables/color-swatch.js b/third_party/blink/web_tests/http/tests/devtools/elements/css-variables/color-swatch.js index a7e2819..5b35271 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/css-variables/color-swatch.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/css-variables/color-swatch.js
@@ -29,8 +29,7 @@ const bazTreeElement = ElementsTestRunner.getMatchedStylePropertyTreeItem('--baz'); bazTreeElement.startEditing(bazTreeElement.valueElement); bazTreeElement.valueElement.textContent = 'blue'; - bazTreeElement.kickFreeFlowStyleEditForTest(); - await ElementsTestRunner.waitForStyleAppliedPromise(); + await bazTreeElement.kickFreeFlowStyleEditForTest(); TestRunner.addResult('After css Variable editing:' ); dumpSwatches();
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js index 8bce8a3..36cb862 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js
@@ -51,7 +51,7 @@ startEditingAndDumpValue(Common.Color.Format.RGB, 'color', next); }, - function editNewProperty(next) { + async function editNewProperty(next) { var section = ElementsTestRunner.inlineStyleSection(); treeElement = section.addNewBlankProperty(0); @@ -59,15 +59,12 @@ treeElement.nameElement.textContent = 'border-color'; treeElement.nameElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); treeElement.valueElement.textContent = 'hsl(120, 100%, 25%)'; - treeElement.kickFreeFlowStyleEditForTest(); - ElementsTestRunner.waitForStyleApplied(kicked); + await treeElement.kickFreeFlowStyleEditForTest(); - function kicked() { - treeElement.valueElement.dispatchEvent(TestRunner.createKeyEvent('Tab', false, false, true)); - treeElement.nameElement.dispatchEvent(TestRunner.createKeyEvent('Tab')); - TestRunner.addResult(treeElement.valueElement.textContent); - next(); - } + treeElement.valueElement.dispatchEvent(TestRunner.createKeyEvent('Tab', false, false, true)); + treeElement.nameElement.dispatchEvent(TestRunner.createKeyEvent('Tab')); + TestRunner.addResult(treeElement.valueElement.textContent); + next(); } ]);
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-add-blank-property.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-add-blank-property.js index f402fb1..554eb0c 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-add-blank-property.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-add-blank-property.js
@@ -39,13 +39,14 @@ ElementsTestRunner.waitForStyleApplied(commitProperty); } - function commitProperty() { + async function commitProperty() { // Commit. - treeElement.nameElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); + treeElement.valueElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); + await ElementsTestRunner.waitForStyleAppliedPromise(); reloadStyles(addAndChangeLastCompoundProperty); } - function addAndChangeLastCompoundProperty() { + async function addAndChangeLastCompoundProperty() { TestRunner.addResult('After insertion at index 0:'); ElementsTestRunner.dumpSelectedElementStyles(true); @@ -55,16 +56,17 @@ treeElement.nameElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); treeElement.valueElement.textContent = 'green; font-weight: bold'; - treeElement.kickFreeFlowStyleEditForTest(); + await treeElement.kickFreeFlowStyleEditForTest(); treeElement.valueElement.textContent = 'red; font-weight: bold'; - treeElement.kickFreeFlowStyleEditForTest(); + await treeElement.kickFreeFlowStyleEditForTest(); treeElement.valueElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); - ElementsTestRunner.waitForStyleApplied(reloadStyles.bind(this, addAndCommitMiddleProperty)); + await ElementsTestRunner.waitForStyleAppliedPromise(); + reloadStyles(addAndCommitMiddleProperty); } - function addAndCommitMiddleProperty() { + async function addAndCommitMiddleProperty() { TestRunner.addResult('After appending and changing a \'compound\' property:'); ElementsTestRunner.dumpSelectedElementStyles(true); @@ -75,7 +77,8 @@ treeElement.valueElement.textContent = 'third-value'; treeElement.valueElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); - ElementsTestRunner.waitForStyleApplied(reloadStyles.bind(this, dumpAndComplete)); + await ElementsTestRunner.waitForStyleAppliedPromise(); + reloadStyles(dumpAndComplete); } function dumpAndComplete() {
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-cancel-editing.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-cancel-editing.js index 001032f..cd81d31 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-cancel-editing.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-cancel-editing.js
@@ -16,7 +16,7 @@ var treeElement; var section; - function step1() { + async function step1() { ElementsTestRunner.dumpSelectedElementStyles(true); treeElement = ElementsTestRunner.getElementStylePropertyTreeItem('color'); @@ -26,20 +26,14 @@ // Update incrementally, do not commit. treeElement.valueElement.textContent = 'green'; - treeElement.kickFreeFlowStyleEditForTest(); + await treeElement.kickFreeFlowStyleEditForTest(); // Cancel editing. treeElement.valueElement.firstChild.select(); - ElementsTestRunner.waitForStyleApplied(onStyleApplied); + treeElement.valueElement.dispatchEvent(TestRunner.createKeyEvent('Escape')); + await ElementsTestRunner.waitForStyleAppliedPromise(); - function onStyleApplied() { - treeElement.valueElement.dispatchEvent(TestRunner.createKeyEvent('Escape')); - ElementsTestRunner.waitForStyleApplied(onStyleReverted); - } - - function onStyleReverted() { - ElementsTestRunner.selectNodeWithId('other', step2); - } + ElementsTestRunner.selectNodeWithId('other', step2); } function step2() {
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-commit-editing.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-commit-editing.js index 165de58..b41c038 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-commit-editing.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/styles-commit-editing.js
@@ -20,7 +20,7 @@ ElementsTestRunner.selectNodeAndWaitForStyles('inspected', next); }, - function testFreeFlowEdit(next) { + async function testFreeFlowEdit(next) { ElementsTestRunner.dumpSelectedElementStyles(true); treeElement = ElementsTestRunner.getElementStylePropertyTreeItem('color'); treeOutline = treeElement.treeOutline; @@ -29,10 +29,10 @@ treeElement.nameElement.textContent = 'color'; treeElement.nameElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); - // Update incrementally, do not commit. + // Update incrementally, do not commit. treeElement.valueElement.textContent = 'rgb(/*'; - ElementsTestRunner.waitForStyleApplied(next); - treeElement.kickFreeFlowStyleEditForTest(); + await treeElement.kickFreeFlowStyleEditForTest(); + next(); }, function testCommitEditing(next) {
diff --git a/third_party/blink/web_tests/intersection-observer/document-without-frame.html b/third_party/blink/web_tests/intersection-observer/document-without-frame.html new file mode 100644 index 0000000..afc0cd3 --- /dev/null +++ b/third_party/blink/web_tests/intersection-observer/document-without-frame.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> + +<style> +div { + width: 100px; + height: 100px; +} +</style> + +<div id=target></div> + +<script> +if (self.internals) { + internals.DisableIntersectionObserverThrottleDelay(); +} +async_test(t => { + let observer = new IntersectionObserver( + entries => {}, + {trackVisibility: true, delay: 100}); + let target = document.getElementById('target'); + observer.observe(target); + let newdoc = document.implementation.createHTMLDocument(""); + newdoc.body.appendChild(target); + target.parentNode.removeChild(target); + requestAnimationFrame(() => { + setTimeout(() => { t.done() }); + }); +}, "Removing an IntersectionObserver target from a frameless document. Test passes if it does not crash."); +</script>
diff --git a/third_party/blink/web_tests/platform/linux/transforms/matrix-02-expected.png b/third_party/blink/web_tests/platform/linux/transforms/matrix-02-expected.png new file mode 100644 index 0000000..6cda17ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/transforms/matrix-02-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/masking/mask-repeat-space-padding-expected.png b/third_party/blink/web_tests/platform/win/css3/masking/mask-repeat-space-padding-expected.png index a18edc9..0f7ecb4 100644 --- a/third_party/blink/web_tests/platform/win/css3/masking/mask-repeat-space-padding-expected.png +++ b/third_party/blink/web_tests/platform/win/css3/masking/mask-repeat-space-padding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/datalist/input-appearance-range-with-transform-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/datalist/input-appearance-range-with-transform-expected.png index 56392e6..be53e3a 100644 --- a/third_party/blink/web_tests/platform/win/fast/forms/datalist/input-appearance-range-with-transform-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/forms/datalist/input-appearance-range-with-transform-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/transforms/matrix-02-expected.png b/third_party/blink/web_tests/platform/win/transforms/matrix-02-expected.png index 6cda17ad..db489a6 100644 --- a/third_party/blink/web_tests/platform/win/transforms/matrix-02-expected.png +++ b/third_party/blink/web_tests/platform/win/transforms/matrix-02-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/css3/masking/mask-repeat-space-padding-expected.png b/third_party/blink/web_tests/platform/win7/css3/masking/mask-repeat-space-padding-expected.png new file mode 100644 index 0000000..a18edc9 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/css3/masking/mask-repeat-space-padding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/datalist/input-appearance-range-with-transform-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/datalist/input-appearance-range-with-transform-expected.png new file mode 100644 index 0000000..56392e6 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/fast/forms/datalist/input-appearance-range-with-transform-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/transforms/matrix-02-expected.png b/third_party/blink/web_tests/platform/win7/transforms/matrix-02-expected.png new file mode 100644 index 0000000..6cda17ad --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/transforms/matrix-02-expected.png Binary files differ
diff --git a/third_party/dav1d/README.chromium b/third_party/dav1d/README.chromium index 6859376..cf479a8a 100644 --- a/third_party/dav1d/README.chromium +++ b/third_party/dav1d/README.chromium
@@ -3,13 +3,13 @@ URL: https://code.videolan.org/videolan/dav1d Version: dce4e788614bf8c2e353b7157e7b59b34b177779 License: 2-Clause BSD -License File: LICENSE, copied from: libdav1d/COPYING +License File: LICENSE Security Critical: yes Source: https://code.videolan.org/videolan/dav1d --[ DESCRIPTION ] ------------------ This contains the source to the dav1d video decoder; used for AV1 decoding in -Chromium. +Chromium. The LICENSE file is copied from libdav1d/COPYING. --[ UPDATING ] ------------------
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/BUILD.gn index 1e36cb4b..149d87b 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/BUILD.gn index 6a514c9..facca4f5 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/BUILD.gn index 3d41400..293bea7 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-behaviors/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-behaviors/BUILD.gn index b521ef1..e3dd06a9 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-behaviors/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-behaviors/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-collapse/BUILD.gn index 4dc066d..301a4e3 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-collapse/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-dropdown/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-dropdown/BUILD.gn index 2ff9732..1fe9c23 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-dropdown/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-dropdown/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/BUILD.gn index 5eb3ff9..7410bdc 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-form-element-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-form-element-behavior/BUILD.gn index f3f7547a..369090e8 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-form-element-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-form-element-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-icon/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-icon/BUILD.gn index e5f96729..504bc78 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-icon/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-icon/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-iconset-svg/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-iconset-svg/BUILD.gn index 88ef22e..4010b38 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-iconset-svg/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-iconset-svg/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-input/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-input/BUILD.gn index 9396174..c21a07f 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-input/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-input/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-list/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-list/BUILD.gn index 19906a3..43f8943 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-list/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-list/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-location/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-location/BUILD.gn index 8f55e72..e502ced 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-location/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-location/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-media-query/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-media-query/BUILD.gn index 7470eb03..05879f1 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-media-query/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-media-query/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/BUILD.gn index 6d652fb..b534890c 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-meta/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-meta/BUILD.gn index 40355c8..3b207b2 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-meta/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-meta/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/BUILD.gn index 9285fba..9305be9 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-pages/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-pages/BUILD.gn index 6b3f416e..430f3615 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-pages/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-pages/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-range-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-range-behavior/BUILD.gn index f85df5e..c906aeb2 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-range-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-range-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/BUILD.gn index c86a3083..b04c9fb 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/BUILD.gn index 0e02c81..3b41716 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/BUILD.gn index c6fa70d..9b65c19 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-selector/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-selector/BUILD.gn index 15a76fb..3ae53a1d7 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-selector/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-selector/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/BUILD.gn b/third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/BUILD.gn index 9a7dccc..cd8d61e 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/BUILD.gn b/third_party/polymer/v1_0/components-chromium/neon-animation/BUILD.gn index 48025b6..e9a13b38 100644 --- a/third_party/polymer/v1_0/components-chromium/neon-animation/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/neon-animation/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/BUILD.gn b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/BUILD.gn index c21de636..68a8d82 100644 --- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-behaviors/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-behaviors/BUILD.gn index 84361782..2f94101 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-behaviors/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-behaviors/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-button/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-button/BUILD.gn index c6c486df..e187633 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-button/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-button/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-fab/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-fab/BUILD.gn index 03f2506..5642052 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-fab/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-fab/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-icon-button/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-icon-button/BUILD.gn index 07fd49b8..2535d27 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-icon-button/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-icon-button/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-input/BUILD.gn index 9cf16f7..4e8f276f 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-input/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-progress/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-progress/BUILD.gn index 97d26a3..d3f60da 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-progress/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-progress/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-ripple/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-ripple/BUILD.gn index 55d39a5e..aab1bad 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-ripple/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-ripple/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-spinner/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-spinner/BUILD.gn index 6762cbc..2677d9ac 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-spinner/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-spinner/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-tabs/BUILD.gn index 338bf58d..d171bc08 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-tabs/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-tabs/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tooltip/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-tooltip/BUILD.gn index 41be885..50e30af1 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-tooltip/BUILD.gn +++ b/third_party/polymer/v1_0/components-chromium/paper-tooltip/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #
diff --git a/tools/ipc_fuzzer/fuzzer/fuzzer.cc b/tools/ipc_fuzzer/fuzzer/fuzzer.cc index 76d8c6f2..12d284e5 100644 --- a/tools/ipc_fuzzer/fuzzer/fuzzer.cc +++ b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
@@ -748,8 +748,7 @@ template <> struct FuzzTraits<content::WebCursor> { static bool Fuzz(content::WebCursor* p, Fuzzer* fuzzer) { - content::CursorInfo info; - p->GetCursorInfo(&info); + content::CursorInfo info = p->info(); // |type| enum is not validated on de-serialization, so pick random value. if (!FuzzParam(reinterpret_cast<int*>(&info.type), fuzzer)) @@ -768,8 +767,7 @@ if (!(info.image_scale_factor > 0.0)) info.image_scale_factor = 1; - *p = content::WebCursor(); - p->InitFromCursorInfo(info); + *p = content::WebCursor(info); return true; } };
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 4267bc9..41189c3 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -6395,19 +6395,6 @@ <int value="31" label="Chooser Permissions Bubble"/> </enum> -<enum name="CachedImageFetcherEvent"> - <int value="0" label="Request for an image"/> - <int value="1" label="Cache hit"/> - <int value="2" label="Cache miss"/> - <int value="3" label="Cache decoding error"/> - <int value="4" label="Network transcoding error"/> - <int value="5" label="Failure to fetch the image from the network"/> - <int value="6" label="Cache startup eviction began"/> - <int value="7" label="Cache startup eviction finished"/> - <int value="8" label="Java in-memory cache hit"/> - <int value="9" label="Java disk cache hit"/> -</enum> - <enum name="CacheResult"> <int value="0" label="MEMORY_CACHE_HIT"/> <int value="1" label="DISK_CACHE_HIT"/> @@ -19086,6 +19073,7 @@ <int value="1329" label="AUTOTESTPRIVATE_SHOWVIRTUALKEYBOARDIFENABLED"/> <int value="1330" label="FEEDBACKPRIVATE_LOGINFEEDBACKCOMPLETE"/> <int value="1331" label="FILEMANAGERPRIVATE_SEARCHFILES"/> + <int value="1332" label="MANAGEMENT_INSTALLREPLACEMENTWEBAPP"/> </enum> <enum name="ExtensionIconState"> @@ -28699,6 +28687,19 @@ <int value="3" label="Failed using photo stream"/> </enum> +<enum name="ImageFetcherEvent"> + <int value="0" label="Request for an image"/> + <int value="1" label="Cache hit"/> + <int value="2" label="Cache miss"/> + <int value="3" label="Cache decoding error"/> + <int value="4" label="Network transcoding error"/> + <int value="5" label="Failure to fetch the image from the network"/> + <int value="6" label="Cache startup eviction began"/> + <int value="7" label="Cache startup eviction finished"/> + <int value="8" label="Java in-memory cache hit"/> + <int value="9" label="Java disk cache hit"/> +</enum> + <enum name="IMECommitType"> <obsolete> Deprecated 03/2015, and replaced by IMECommitType2.
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 848d08f..770c15b 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -4588,8 +4588,7 @@ <histogram name="Apps.StateTransition.AnimationSmoothness" units="%"> <!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" and - name="EnterOrExitOverview" and - name="AppListTargetState" --> + name="EnterOrExitOverview" --> <owner>newcomer@chromium.org</owner> <summary> @@ -11044,7 +11043,11 @@ </histogram> <histogram name="Blink.Binding.CreateV8ContextForMainFrame" - units="microseconds"> + units="microseconds" expires_after="2019-04-16"> + <obsolete> + Deprecated as of 04/2019 with the removal of field trial experiment + settings. + </obsolete> <owner>peria@chromium.org</owner> <summary> Time spent to create a v8::Context instance during a page loading in the @@ -11059,7 +11062,11 @@ </histogram> <histogram name="Blink.Binding.CreateV8ContextForNonMainFrame" - units="microseconds" expires_after="M77"> + units="microseconds" expires_after="2019-04-16"> + <obsolete> + Deprecated as of 04/2019 with the removal of field trial experiment + settings. + </obsolete> <owner>peria@chromium.org</owner> <summary> Time spent to create a v8::Context instance during a page loading in a @@ -11075,6 +11082,10 @@ <histogram name="Blink.Binding.InitializeMainLocalWindowProxy" units="microseconds"> + <obsolete> + Deprecated as of 04/2019 with the removal of field trial experiment + settings. + </obsolete> <owner>peria@chromium.org</owner> <summary> Time spent initializing LocalWindowProxy during a page loading in main @@ -11089,7 +11100,11 @@ </histogram> <histogram name="Blink.Binding.InitializeMainRemoteWindowProxy" - units="microseconds" expires_after="M77"> + units="microseconds" expires_after="2019-04-16"> + <obsolete> + Deprecated as of 04/2019 with the removal of field trial experiment + settings. + </obsolete> <owner>peria@chromium.org</owner> <summary> Time spent initializing RemoteWindowProxy during a page loading in main @@ -11116,7 +11131,11 @@ </histogram> <histogram name="Blink.Binding.InitializeNonMainLocalWindowProxy" - units="microseconds" expires_after="M77"> + units="microseconds" expires_after="2019-04-16"> + <obsolete> + Deprecated as of 04/2019 with the removal of field trial experiment + settings. + </obsolete> <owner>peria@chromium.org</owner> <summary> Time spent initializing LocalWindowProxy during a page loading in non-main @@ -11131,7 +11150,11 @@ </histogram> <histogram name="Blink.Binding.InitializeNonMainRemoteWindowProxy" - units="microseconds" expires_after="M77"> + units="microseconds" expires_after="2019-04-16"> + <obsolete> + Deprecated as of 04/2019 with the removal of field trial experiment + settings. + </obsolete> <owner>peria@chromium.org</owner> <summary> Time spent initializing RemoteWindowProxy during a page loading in OOPIF. @@ -14877,8 +14900,11 @@ <summary>A bubble was given to the bubble manager but not shown.</summary> </histogram> -<histogram name="CachedImageFetcher.Events" enum="CachedImageFetcherEvent" +<histogram name="CachedImageFetcher.Events" enum="ImageFetcherEvent" expires_after="2019-12-01"> + <obsolete> + Renamed to ImageFetcher.Events on 04/2019. + </obsolete> <owner>fgorski@chromium.org</owner> <owner>wylieb@chromium.org</owner> <summary> @@ -44867,6 +44893,17 @@ </summary> </histogram> +<histogram name="ImageFetcher.Events" enum="ImageFetcherEvent" + expires_after="2019-12-01"> + <owner>fgorski@chromium.org</owner> + <owner>wylieb@chromium.org</owner> + <summary> + Events that track the lifecycle and performance of the cached_image_fetcher. + The events reported include: success/failure conditions, various recoverable + errors and a couple of dead-end errors. + </summary> +</histogram> + <histogram name="ImageLoader.Client.Cache.HitMiss" enum="BooleanCacheHit" expires_after="2019-01-01"> <owner>chromeos-files-app@google.com</owner> @@ -142302,17 +142339,6 @@ <affected-histogram name="Apps.AppsInFolders"/> </histogram_suffixes> -<histogram_suffixes name="AppListTargetState" separator="."> - <suffix name="Close.ClamshellMode" label="Closing the app list"/> - <suffix name="FullscreenAllApps.ClamshellMode" - label="Fullscreen and showing all apps"/> - <suffix name="FullscreenSearch.ClamshellMode" - label="Fullscreen with search results"/> - <suffix name="Half.ClamshellMode" label="Half-visible state of the app list"/> - <suffix name="Peeking.ClamshellMode" label="Peek state of the app list"/> - <affected-histogram name="Apps.StateTransition.AnimationSmoothness"/> -</histogram_suffixes> - <histogram_suffixes name="AppUIComponent" separator="."> <suffix name="AppGrid" label="App - Fullscreen Launcher"/> <suffix name="Desktop" label="Desktop"/> @@ -142995,6 +143021,9 @@ </histogram_suffixes> <histogram_suffixes name="CachedImageFetcherClients" separator="."> + <obsolete> + Renamed to ImageFetcherClients on 04/2019. + </obsolete> <suffix name="AssistantDetails" label="Showing cache patterns only for AssistantDetails."/> <suffix name="ContextualSuggestions" @@ -146299,6 +146328,26 @@ <affected-histogram name="Blink.DecodedImage.YCanvasExpansion"/> </histogram_suffixes> +<histogram_suffixes name="ImageFetcherClients" separator="."> + <suffix name="AssistantDetails" + label="Showing cache patterns only for AssistantDetails."/> + <suffix name="ContextualSuggestions" + label="Showing cache patterns only for ContextualSuggestions."/> + <suffix name="Feed" label="Showing cache patterns only for Feed."/> + <suffix name="Internal" label="Showing cache patterns only for Internal."/> + <suffix name="NewTabPageAnimatedLogo" + label="Showing cache patterns only for NewTabPageAnimatedLogo."/> + <suffix name="OfflinePages" + label="Showing cache patterns only for OfflinePages."/> + <affected-histogram name="CachedImageFetcher.ImageLoadFromCacheTime"/> + <affected-histogram name="CachedImageFetcher.ImageLoadFromCacheTimeJava"/> + <affected-histogram name="CachedImageFetcher.ImageLoadFromNativeTimeJava"/> + <affected-histogram + name="CachedImageFetcher.ImageLoadFromNetworkAfterCacheHit"/> + <affected-histogram name="CachedImageFetcher.ImageLoadFromNetworkTime"/> + <affected-histogram name="ImageFetcher.Events"/> +</histogram_suffixes> + <histogram_suffixes name="IMEAutoCorrect" separator="."> <suffix name="AC0" label="The auto-correct level is 0"/> <suffix name="AC1" label="The auto-correct level is 1"/>
diff --git a/ui/accessibility/ax_enum_util.cc b/ui/accessibility/ax_enum_util.cc index 012e3e6..8e83d78 100644 --- a/ui/accessibility/ax_enum_util.cc +++ b/ui/accessibility/ax_enum_util.cc
@@ -1497,6 +1497,8 @@ return "invalidState"; case ax::mojom::IntAttribute::kCheckedState: return "checkedState"; + case ax::mojom::IntAttribute::kListStyle: + return "listStyle"; case ax::mojom::IntAttribute::kTextDirection: return "textDirection"; case ax::mojom::IntAttribute::kTextPosition: @@ -1613,6 +1615,8 @@ return ax::mojom::IntAttribute::kInvalidState; if (0 == strcmp(int_attribute, "checkedState")) return ax::mojom::IntAttribute::kCheckedState; + if (0 == strcmp(int_attribute, "listStyle")) + return ax::mojom::IntAttribute::kListStyle; if (0 == strcmp(int_attribute, "textDirection")) return ax::mojom::IntAttribute::kTextDirection; if (0 == strcmp(int_attribute, "textPosition")) @@ -1832,6 +1836,45 @@ return ax::mojom::StringListAttribute::kNone; } +const char* ToString(ax::mojom::ListStyle list_style) { + switch (list_style) { + case ax::mojom::ListStyle::kNone: + return "none"; + case ax::mojom::ListStyle::kCircle: + return "circle"; + case ax::mojom::ListStyle::kDisc: + return "disc"; + case ax::mojom::ListStyle::kImage: + return "image"; + case ax::mojom::ListStyle::kNumeric: + return "numeric"; + case ax::mojom::ListStyle::kOther: + return "other"; + case ax::mojom::ListStyle::kSquare: + return "square"; + } + + return ""; +} + +ax::mojom::ListStyle ParseListStyle(const char* list_style) { + if (0 == strcmp(list_style, "none")) + return ax::mojom::ListStyle::kNone; + if (0 == strcmp(list_style, "circle")) + return ax::mojom::ListStyle::kCircle; + if (0 == strcmp(list_style, "disc")) + return ax::mojom::ListStyle::kDisc; + if (0 == strcmp(list_style, "image")) + return ax::mojom::ListStyle::kImage; + if (0 == strcmp(list_style, "numeric")) + return ax::mojom::ListStyle::kNumeric; + if (0 == strcmp(list_style, "other")) + return ax::mojom::ListStyle::kOther; + if (0 == strcmp(list_style, "square")) + return ax::mojom::ListStyle::kSquare; + return ax::mojom::ListStyle::kNone; +} + const char* ToString(ax::mojom::MarkerType marker_type) { switch (marker_type) { case ax::mojom::MarkerType::kNone:
diff --git a/ui/accessibility/ax_enum_util.h b/ui/accessibility/ax_enum_util.h index 3b65385..badb66c2 100644 --- a/ui/accessibility/ax_enum_util.h +++ b/ui/accessibility/ax_enum_util.h
@@ -70,6 +70,10 @@ AX_EXPORT ax::mojom::StringListAttribute ParseStringListAttribute( const char* string_list_attribute); +// ax::mojom::ListStyle +AX_EXPORT const char* ToString(ax::mojom::ListStyle list_style); +AX_EXPORT ax::mojom::ListStyle ParseListStyle(const char* list_style); + // ax::mojom::MarkerType AX_EXPORT const char* ToString(ax::mojom::MarkerType marker_type); AX_EXPORT ax::mojom::MarkerType ParseMarkerType(const char* marker_type);
diff --git a/ui/accessibility/ax_enum_util_unittest.cc b/ui/accessibility/ax_enum_util_unittest.cc index 05b4d1c..861e35e3 100644 --- a/ui/accessibility/ax_enum_util_unittest.cc +++ b/ui/accessibility/ax_enum_util_unittest.cc
@@ -140,6 +140,10 @@ ParseTextDecorationStyle); } +TEST(AXEnumUtilTest, ListStyle) { + TestEnumStringConversion<ax::mojom::ListStyle>(ParseListStyle); +} + TEST(AXEnumUtilTest, TextDirection) { TestEnumStringConversion<ax::mojom::TextDirection>(ParseTextDirection); }
diff --git a/ui/accessibility/ax_enums.mojom b/ui/accessibility/ax_enums.mojom index 6eeb9e8..8636c8d 100644 --- a/ui/accessibility/ax_enums.mojom +++ b/ui/accessibility/ax_enums.mojom
@@ -578,6 +578,9 @@ // Of type AXCheckedState kCheckedState, + // The list style type. Only available on list items. + kListStyle, + // Specifies the direction of the text, e.g., right-to-left. kTextDirection, @@ -763,6 +766,16 @@ kSpellingGrammarTextMatchActiveSuggestionSuggestion = 55, }; +enum ListStyle { + kNone, + kCircle, + kDisc, + kImage, + kNumeric, + kSquare, + kOther, // Language specific ordering (alpha, roman, cjk-ideographic, etc...) +}; + enum TextDirection { kNone, kLtr,
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc index 17e07bb..8d38fe6 100644 --- a/ui/accessibility/ax_node_data.cc +++ b/ui/accessibility/ax_node_data.cc
@@ -144,6 +144,7 @@ case ax::mojom::IntAttribute::kInvalidState: case ax::mojom::IntAttribute::kCheckedState: case ax::mojom::IntAttribute::kRestriction: + case ax::mojom::IntAttribute::kListStyle: case ax::mojom::IntAttribute::kTextDirection: case ax::mojom::IntAttribute::kTextPosition: case ax::mojom::IntAttribute::kTextStyle: @@ -804,6 +805,20 @@ } } +ax::mojom::ListStyle AXNodeData::GetListStyle() const { + return static_cast<ax::mojom::ListStyle>( + GetIntAttribute(ax::mojom::IntAttribute::kListStyle)); +} + +void AXNodeData::SetListStyle(ax::mojom::ListStyle list_style) { + if (HasIntAttribute(ax::mojom::IntAttribute::kListStyle)) + RemoveIntAttribute(ax::mojom::IntAttribute::kListStyle); + if (list_style != ax::mojom::ListStyle::kNone) { + AddIntAttribute(ax::mojom::IntAttribute::kListStyle, + static_cast<int32_t>(list_style)); + } +} + ax::mojom::TextDirection AXNodeData::GetTextDirection() const { return static_cast<ax::mojom::TextDirection>( GetIntAttribute(ax::mojom::IntAttribute::kTextDirection)); @@ -1018,6 +1033,30 @@ case ax::mojom::IntAttribute::kColor: result += base::StringPrintf(" color=&%X", int_attribute.second); break; + case ax::mojom::IntAttribute::kListStyle: + switch (static_cast<ax::mojom::ListStyle>(int_attribute.second)) { + case ax::mojom::ListStyle::kCircle: + result += " list_style=circle"; + break; + case ax::mojom::ListStyle::kDisc: + result += " list_style=disc"; + break; + case ax::mojom::ListStyle::kImage: + result += " list_style=image"; + break; + case ax::mojom::ListStyle::kNumeric: + result += " list_style=numeric"; + break; + case ax::mojom::ListStyle::kOther: + result += " list_style=other"; + break; + case ax::mojom::ListStyle::kSquare: + result += " list_style=square"; + break; + default: + break; + } + break; case ax::mojom::IntAttribute::kTextDirection: switch (static_cast<ax::mojom::TextDirection>(int_attribute.second)) { case ax::mojom::TextDirection::kLtr:
diff --git a/ui/accessibility/ax_node_data.h b/ui/accessibility/ax_node_data.h index 48b50260..369ceaa7 100644 --- a/ui/accessibility/ax_node_data.h +++ b/ui/accessibility/ax_node_data.h
@@ -173,6 +173,8 @@ void SetTextPosition(ax::mojom::TextPosition text_position); ax::mojom::Restriction GetRestriction() const; void SetRestriction(ax::mojom::Restriction restriction); + ax::mojom::ListStyle GetListStyle() const; + void SetListStyle(ax::mojom::ListStyle list_style); ax::mojom::TextDirection GetTextDirection() const; void SetTextDirection(ax::mojom::TextDirection text_direction); ax::mojom::ImageAnnotationStatus GetImageAnnotationStatus() const;
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_hi.xtb b/ui/accessibility/extensions/strings/accessibility_extensions_strings_hi.xtb index b60ebef..e8f5672 100644 --- a/ui/accessibility/extensions/strings/accessibility_extensions_strings_hi.xtb +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_hi.xtb
@@ -42,7 +42,7 @@ <translation id="5594989420907487559">सिर्फ़ एक बार ऐनिमेशन चलाएं या ऐनिमेशन को पूरी तरह बंद करें.</translation> <translation id="5631241868147802353">डिफ़ॉल्ट रंग योजना:</translation> <translation id="5650358096585648000">विज़ुअल फ़ीडबैक</translation> -<translation id="5710185147685935461">वेबपृष्ठों को पढ़ने में अधिक आसान बनाने के लिए रंग योजना को बदलें या उलट दें.</translation> +<translation id="5710185147685935461">वेबपृष्ठों को पढ़ने में ज़्यादा आसान बनाने के लिए रंग योजना को बदलें या उलट दें.</translation> <translation id="5939518447894949180">रीसेट करें</translation> <translation id="595639123821853262">विपरीत ग्रेस्केल</translation> <translation id="6017514345406065928">हरा</translation>
diff --git a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc index 7c85556..6f1358e 100644 --- a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
@@ -1584,10 +1584,47 @@ mark_text_data.SetTextDirection(ax::mojom::TextDirection::kRtl); mark_text_data.SetName("marked text"); + ui::AXNodeData list_data; + list_data.id = 7; + list_data.role = ax::mojom::Role::kList; + list_data.child_ids = {8, 10}; + + ui::AXNodeData list_item_data; + list_item_data.id = 8; + list_item_data.role = ax::mojom::Role::kListItem; + list_item_data.child_ids = {9}; + list_item_data.AddIntAttribute( + ax::mojom::IntAttribute::kListStyle, + static_cast<int>(ax::mojom::ListStyle::kOther)); + + ui::AXNodeData list_item_text_data; + list_item_text_data.id = 9; + list_item_text_data.role = ax::mojom::Role::kStaticText; + list_item_text_data.AddIntAttribute(ax::mojom::IntAttribute::kBackgroundColor, + 0xDEADBEEFU); + list_item_text_data.AddIntAttribute(ax::mojom::IntAttribute::kColor, + 0xDEADC0DEU); + + ui::AXNodeData list_item2_data; + list_item2_data.id = 10; + list_item2_data.role = ax::mojom::Role::kListItem; + list_item2_data.child_ids = {11}; + list_item2_data.AddIntAttribute( + ax::mojom::IntAttribute::kListStyle, + static_cast<int>(ax::mojom::ListStyle::kDisc)); + + ui::AXNodeData list_item2_text_data; + list_item2_text_data.id = 11; + list_item2_text_data.role = ax::mojom::Role::kStaticText; + list_item2_text_data.AddIntAttribute( + ax::mojom::IntAttribute::kBackgroundColor, 0xDEADBEEFU); + list_item2_text_data.AddIntAttribute(ax::mojom::IntAttribute::kColor, + 0xDEADC0DEU); + ui::AXNodeData root_data; root_data.id = 1; root_data.role = ax::mojom::Role::kRootWebArea; - root_data.child_ids = {2, 3, 5}; + root_data.child_ids = {2, 3, 5, 7}; ui::AXTreeUpdate update; ui::AXTreeData tree_data; @@ -1601,6 +1638,11 @@ update.nodes.push_back(heading_text_data); update.nodes.push_back(mark_data); update.nodes.push_back(mark_text_data); + update.nodes.push_back(list_data); + update.nodes.push_back(list_item_data); + update.nodes.push_back(list_item_text_data); + update.nodes.push_back(list_item2_data); + update.nodes.push_back(list_item2_text_data); Init(update); AXNodePosition::SetTreeForTesting(tree_.get()); @@ -1612,6 +1654,11 @@ AXNode* heading_text_node = heading_node->children()[0]; AXNode* mark_node = root_node->children()[2]; AXNode* mark_text_node = mark_node->children()[0]; + AXNode* list_node = root_node->children()[3]; + AXNode* list_item_node = list_node->children()[0]; + AXNode* list_item_text_node = list_item_node->children()[0]; + AXNode* list_item2_node = list_node->children()[1]; + AXNode* list_item2_text_node = list_item2_node->children()[0]; ComPtr<ITextRangeProvider> document_range_provider; GetTextRangeProviderFromTextNode(document_range_provider, root_node); @@ -1622,6 +1669,12 @@ heading_text_node); ComPtr<ITextRangeProvider> mark_text_range_provider; GetTextRangeProviderFromTextNode(mark_text_range_provider, mark_text_node); + ComPtr<ITextRangeProvider> list_item_text_range_provider; + GetTextRangeProviderFromTextNode(list_item_text_range_provider, + list_item_text_node); + ComPtr<ITextRangeProvider> list_item2_text_range_provider; + GetTextRangeProviderFromTextNode(list_item2_text_range_provider, + list_item2_text_node); base::win::ScopedVariant expected_mixed_variant; { @@ -1642,6 +1695,17 @@ UIA_BackgroundColorAttributeId, expected_variant); expected_variant.Reset(); + expected_variant.Set(static_cast<int32_t>(BulletStyle::BulletStyle_None)); + EXPECT_UIA_TEXTATTRIBUTE_EQ(list_item_text_range_provider, + UIA_BulletStyleAttributeId, expected_variant); + expected_variant.Reset(); + + expected_variant.Set( + static_cast<int32_t>(BulletStyle::BulletStyle_FilledRoundBullet)); + EXPECT_UIA_TEXTATTRIBUTE_EQ(list_item2_text_range_provider, + UIA_BulletStyleAttributeId, expected_variant); + expected_variant.Reset(); + { base::win::ScopedVariant lang_variant; EXPECT_HRESULT_SUCCEEDED(text_range_provider->GetAttributeValue( @@ -1713,6 +1777,16 @@ UIA_StyleNameAttributeId, expected_variant); expected_variant.Reset(); + expected_variant.Set(static_cast<int32_t>(StyleId_NumberedList)); + EXPECT_UIA_TEXTATTRIBUTE_EQ(list_item_text_range_provider, + UIA_StyleIdAttributeId, expected_variant); + expected_variant.Reset(); + + expected_variant.Set(static_cast<int32_t>(StyleId_BulletedList)); + EXPECT_UIA_TEXTATTRIBUTE_EQ(list_item2_text_range_provider, + UIA_StyleIdAttributeId, expected_variant); + expected_variant.Reset(); + expected_variant.Set( static_cast<int32_t>(FlowDirections::FlowDirections_RightToLeft)); EXPECT_UIA_TEXTATTRIBUTE_EQ(
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index 308e1ee..5a74467 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -4038,6 +4038,10 @@ V_I4(result) = GetIntAttributeAsCOLORREF(ax::mojom::IntAttribute::kBackgroundColor); break; + case UIA_BulletStyleAttributeId: + V_VT(result) = VT_I4; + V_I4(result) = ComputeUIABulletStyle(); + break; case UIA_CultureAttributeId: return GetCultureAttributeAsVariant(result); case UIA_FontNameAttributeId: @@ -4107,6 +4111,38 @@ return skia::SkColorToCOLORREF(color); } +BulletStyle AXPlatformNodeWin::ComputeUIABulletStyle() const { + // UIA expects the list style of a non-list-item to be none however the + // default list style cascaded is disc not none. Therefore we must ensure that + // this node is contained within a list-item to distinguish non-list-items and + // disc styled list items. + const AXPlatformNodeBase* current_node = this; + while (current_node && + current_node->GetData().role != ax::mojom::Role::kListItem) { + current_node = FromNativeViewAccessible(current_node->GetParent()); + } + + const ax::mojom::ListStyle list_style = + current_node ? current_node->GetData().GetListStyle() + : ax::mojom::ListStyle::kNone; + + switch (list_style) { + case ax::mojom::ListStyle::kNone: + return BulletStyle::BulletStyle_None; + case ax::mojom::ListStyle::kCircle: + return BulletStyle::BulletStyle_HollowRoundBullet; + case ax::mojom::ListStyle::kDisc: + return BulletStyle::BulletStyle_FilledRoundBullet; + case ax::mojom::ListStyle::kImage: + return BulletStyle::BulletStyle_Other; + case ax::mojom::ListStyle::kNumeric: + case ax::mojom::ListStyle::kOther: + return BulletStyle::BulletStyle_None; + case ax::mojom::ListStyle::kSquare: + return BulletStyle::BulletStyle_FilledSquareBullet; + } +} + LONG AXPlatformNodeWin::ComputeUIAStyleId() const { const AXPlatformNodeBase* current_node = this; do { @@ -4115,10 +4151,7 @@ return AXHierarchicalLevelToUIAStyleId(current_node->GetIntAttribute( ax::mojom::IntAttribute::kHierarchicalLevel)); case ax::mojom::Role::kListItem: - // TODO: In a following change, introduce enum ax::mojom::ListStyle, - // then return either |StyleId_NumberedList| or |StyleId_BulletedList|. - // The enum will also be used to implement UIA_BulletStyleAttributeId. - break; + return AXListStyleToUIAStyleId(current_node->GetData().GetListStyle()); case ax::mojom::Role::kMark: return StyleId_Custom; case ax::mojom::Role::kBlockquote: @@ -4162,6 +4195,23 @@ } // static +LONG AXPlatformNodeWin::AXListStyleToUIAStyleId( + ax::mojom::ListStyle list_style) { + switch (list_style) { + case ax::mojom::ListStyle::kNone: + return StyleId_Normal; + case ax::mojom::ListStyle::kCircle: + case ax::mojom::ListStyle::kDisc: + case ax::mojom::ListStyle::kImage: + case ax::mojom::ListStyle::kSquare: + return StyleId_BulletedList; + case ax::mojom::ListStyle::kNumeric: + case ax::mojom::ListStyle::kOther: + return StyleId_NumberedList; + } +} + +// static FlowDirections AXPlatformNodeWin::TextDirectionToFlowDirections( ax::mojom::TextDirection text_direction) { switch (text_direction) {
diff --git a/ui/accessibility/platform/ax_platform_node_win.h b/ui/accessibility/platform/ax_platform_node_win.h index fb243c264..0882059 100644 --- a/ui/accessibility/platform/ax_platform_node_win.h +++ b/ui/accessibility/platform/ax_platform_node_win.h
@@ -1204,10 +1204,14 @@ HRESULT GetCultureAttributeAsVariant(VARIANT* result) const; // Converts an int attribute to a COLORREF COLORREF GetIntAttributeAsCOLORREF(ax::mojom::IntAttribute attribute) const; + // Converts the ListStyle to UIA BulletStyle + BulletStyle ComputeUIABulletStyle() const; // Helper to get the UIA StyleId enumeration for this node LONG ComputeUIAStyleId() const; // Converts IntAttribute::kHierarchicalLevel to UIA StyleId enumeration static LONG AXHierarchicalLevelToUIAStyleId(int32_t hierarchical_level); + // Converts a ListStyle to UIA StyleId enumeration + static LONG AXListStyleToUIAStyleId(ax::mojom::ListStyle list_style); // Convert mojom TextDirection to UIA FlowDirections enumeration static FlowDirections TextDirectionToFlowDirections(ax::mojom::TextDirection);
diff --git a/ui/chromeos/file_manager_strings.grdp b/ui/chromeos/file_manager_strings.grdp index e191c58..be44a8b 100644 --- a/ui/chromeos/file_manager_strings.grdp +++ b/ui/chromeos/file_manager_strings.grdp
@@ -1253,6 +1253,9 @@ <message name="IDS_FILE_BROWSER_SELECTION_MENU_BUTTON_TOOLTIP" desc="Tooltip for the button to open the context menu of currently selected items in the Files app."> More... </message> + <message name="IDS_FILE_BROWSER_CONTEXT_MENU_LABEL" desc="Label for Context menu used for Chromevox/screenreader."> + Context + </message> <message name="IDS_FILE_BROWSER_TIME_TODAY" desc="File date and time in case the date is today."> Today <ph name="TODAY_DAYTIME">$1<ex>6:19 AM</ex></ph>
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_CONTEXT_MENU_LABEL.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_CONTEXT_MENU_LABEL.png.sha1 new file mode 100644 index 0000000..2ed99f0 --- /dev/null +++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_CONTEXT_MENU_LABEL.png.sha1
@@ -0,0 +1 @@ +14ad1793226b8ebf1614e5782637c162ea7d3a9d \ No newline at end of file
diff --git a/ui/chromeos/ime/candidate_view.cc b/ui/chromeos/ime/candidate_view.cc index cdc27a3..032f26d 100644 --- a/ui/chromeos/ime/candidate_view.cc +++ b/ui/chromeos/ime/candidate_view.cc
@@ -204,11 +204,9 @@ theme->GetSystemColor(ui::NativeTheme::kColorId_FocusedBorderColor))); // Cancel currently focused one. - for (int i = 0; i < parent()->child_count(); ++i) { - CandidateView* view = - static_cast<CandidateView*>((parent()->child_at(i))); + for (View* view : parent()->children()) { if (view != this) - view->SetHighlighted(false); + static_cast<CandidateView*>(view)->SetHighlighted(false); } } else { SetBackground(nullptr); @@ -235,17 +233,16 @@ // Moves the drag target to the sibling view. gfx::Point location_in_widget(event.location()); ConvertPointToWidget(this, &location_in_widget); - for (int i = 0; i < parent()->child_count(); ++i) { - CandidateView* sibling = - static_cast<CandidateView*>(parent()->child_at(i)); - if (sibling == this) + for (View* view : parent()->children()) { + if (view == this) continue; gfx::Point location_in_sibling(location_in_widget); - ConvertPointFromWidget(sibling, &location_in_sibling); - if (sibling->HitTestPoint(location_in_sibling)) { - GetWidget()->GetRootView()->SetMouseHandler(sibling); + ConvertPointFromWidget(view, &location_in_sibling); + if (view->HitTestPoint(location_in_sibling)) { + GetWidget()->GetRootView()->SetMouseHandler(view); + auto* sibling = static_cast<CandidateView*>(view); sibling->SetHighlighted(true); - return sibling->OnMouseDragged(ui::MouseEvent(event, this, sibling)); + return view->OnMouseDragged(ui::MouseEvent(event, this, sibling)); } }
diff --git a/ui/chromeos/ime/candidate_view_unittest.cc b/ui/chromeos/ime/candidate_view_unittest.cc index 5fa5ec95..80f47d9 100644 --- a/ui/chromeos/ime/candidate_view_unittest.cc +++ b/ui/chromeos/ime/candidate_view_unittest.cc
@@ -76,28 +76,32 @@ return static_cast<CandidateView*>(container_->child_at(index)); } - int GetHighlightedIndex(int* highlighted_count) const { - *highlighted_count = 0; - int last_highlighted = -1; + size_t GetHighlightedCount() const { + size_t highlighted_count = 0; for (int i = 0; i < container_->child_count(); ++i) { - if (container_->child_at(i)->background() != NULL) { - (*highlighted_count)++; - last_highlighted = i; - } + if (!!container_->child_at(i)->background()) + ++highlighted_count; } - return last_highlighted; + return highlighted_count; + } + + int GetHighlightedIndex() const { + for (int i = 0; i < container_->child_count(); ++i) { + if (!!container_->child_at(i)->background()) + return i; + } + return -1; } int GetLastPressedIndexAndReset() { for (int i = 0; i < container_->child_count(); ++i) { if (last_pressed_ == container_->child_at(i)) { - last_pressed_ = NULL; + last_pressed_ = nullptr; return i; } } - DCHECK(last_pressed_ == NULL); - last_pressed_ = NULL; + DCHECK(!last_pressed_); return -1; } @@ -119,27 +123,26 @@ TEST_F(CandidateViewTest, MouseHovers) { GetCandidateAt(0)->SetHighlighted(true); - int highlighted_count = 0; - EXPECT_EQ(0, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(0, GetHighlightedIndex()); // Mouse hover shouldn't change the background. event_generator()->MoveMouseTo( GetCandidateAt(0)->GetBoundsInScreen().CenterPoint()); - EXPECT_EQ(0, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(0, GetHighlightedIndex()); // Mouse hover shouldn't change the background. event_generator()->MoveMouseTo( GetCandidateAt(1)->GetBoundsInScreen().CenterPoint()); - EXPECT_EQ(0, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(0, GetHighlightedIndex()); // Mouse hover shouldn't change the background. event_generator()->MoveMouseTo( GetCandidateAt(2)->GetBoundsInScreen().CenterPoint()); - EXPECT_EQ(0, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(0, GetHighlightedIndex()); } TEST_F(CandidateViewTest, MouseClick) { @@ -152,31 +155,30 @@ TEST_F(CandidateViewTest, ClickAndMove) { GetCandidateAt(0)->SetHighlighted(true); - int highlighted_count = 0; - EXPECT_EQ(0, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(0, GetHighlightedIndex()); event_generator()->MoveMouseTo( GetCandidateAt(2)->GetBoundsInScreen().CenterPoint()); event_generator()->PressLeftButton(); - EXPECT_EQ(2, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(2, GetHighlightedIndex()); // Highlight follows the drag. event_generator()->MoveMouseTo( GetCandidateAt(1)->GetBoundsInScreen().CenterPoint()); - EXPECT_EQ(1, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(1, GetHighlightedIndex()); event_generator()->MoveMouseTo( GetCandidateAt(0)->GetBoundsInScreen().CenterPoint()); - EXPECT_EQ(0, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(0, GetHighlightedIndex()); event_generator()->MoveMouseTo( GetCandidateAt(1)->GetBoundsInScreen().CenterPoint()); - EXPECT_EQ(1, GetHighlightedIndex(&highlighted_count)); - EXPECT_EQ(1, highlighted_count); + EXPECT_EQ(1u, GetHighlightedCount()); + EXPECT_EQ(1, GetHighlightedIndex()); event_generator()->ReleaseLeftButton(); EXPECT_EQ(1, GetLastPressedIndexAndReset());
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb index 507709c..6478bb8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -284,6 +284,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> na file</translation> <translation id="457386861538956877">Higit pa...</translation> <translation id="4582497162516204941">I-install gamit ang Linux (Beta)</translation> +<translation id="4584780943629874245">Ibahagi sa Plugin VM</translation> <translation id="4631887759990505102">Artist</translation> <translation id="4656293982926141856">Sa computer na ito</translation> <translation id="4669606053856530811">Mawawalan ng access ang mga miyembro ng '<ph name="SOURCE_NAME" />' maliban na lang kung ibinahagi sa kanila ang mga item na ito.</translation> @@ -524,6 +525,7 @@ <translation id="7339898014177206373">Bagong window</translation> <translation id="7348749398828259943">US Workman international na keyboard</translation> <translation id="7359359531237882347">Kinokopya ang <ph name="NUMBER_OF_ITEMS" /> (na) item...</translation> +<translation id="7379734276381389090">Nagbahagi ng <ph name="NUMBER_OF_ITEMS" /> folder sa Plugin VM</translation> <translation id="7389722738210761877">Thai keyboard (TIS 820-2531)</translation> <translation id="7396038720194014279">Hindi keyboard (Phonetic)</translation> <translation id="7417453074306512035">Ethiopic keyboard</translation> @@ -586,6 +588,7 @@ <translation id="7969525169268594403">Slovenian</translation> <translation id="7982283708762922719">Taas</translation> <translation id="7987485481246785146">Keyboard na batay sa Sorani Kurdish Arabic</translation> +<translation id="7990715602172183602">Nagbahagi ng 1 folder sa Plugin VM</translation> <translation id="799547531016638432">Alisin ang shortcut</translation> <translation id="799923393800005025">Makakatingin</translation> <translation id="8008366997883261463">Aso</translation> @@ -626,6 +629,7 @@ <translation id="8342318071240498787">Umiiral na ang isang file o direktoryong may parehong pangalan.</translation> <translation id="8391950649760071442">Transliteration (emandi → ఏమండీ)</translation> <translation id="8395901698320285466">Mga Sakop</translation> +<translation id="8400874747056634633">Pamahalaan ang pagbabahagi ng Plugin VM</translation> <translation id="8412586565681117057">Mabilis na paraan ng pag-input</translation> <translation id="8418113698656761985">Romanian na keyboard</translation> <translation id="8432745813735585631">US Colemak na keyboard</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb index 19f8c502..098f4f9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -278,11 +278,11 @@ <translation id="4479812471636796472">यूएस ड्वोराक कीबोर्ड</translation> <translation id="4487088045714738411">बेल्जियन कीबोर्ड</translation> <translation id="4522570452068850558">विवरण</translation> -<translation id="4552678318981539154">अधिक मेमोरी खरीदें</translation> +<translation id="4552678318981539154">ज़्यादा मेमोरी खरीदें</translation> <translation id="4559767610552730302">बोके</translation> <translation id="4568854179928172494">बदलाव करने का समय</translation> <translation id="4572815280350369984"><ph name="FILE_TYPE" /> फ़ाइल</translation> -<translation id="457386861538956877">अधिक...</translation> +<translation id="457386861538956877">ज़्यादा...</translation> <translation id="4582497162516204941">Linux (बीटा) वाला पैकेज इंस्टॉल करें</translation> <translation id="4584780943629874245">प्लग इन VM से शेयर करें</translation> <translation id="4631887759990505102">कलाकार</translation> @@ -331,7 +331,7 @@ <translation id="5004584466530475658"><ph name="FILE_COUNT" /> नई फ़ोटो</translation> <translation id="5010406651457630570">कंप्यूटर</translation> <translation id="5011233892417813670">Chromebook</translation> -<translation id="5024856940085636730">किसी कार्य में अपेक्षा से अधिक समय लग रहा है. क्या आप उसे निरस्त करना चाहते हैं?</translation> +<translation id="5024856940085636730">किसी कार्य में अपेक्षा से ज़्यादा समय लग रहा है. क्या आप उसे निरस्त करना चाहते हैं?</translation> <translation id="5038625366300922036">और देखें...</translation> <translation id="5061708541166515394">कंट्रास्ट</translation> <translation id="5068919226082848014">पिज़्ज़ा</translation> @@ -340,7 +340,7 @@ <translation id="5123433949759960244">बास्केटबॉल</translation> <translation id="5129662217315786329">पोलिश</translation> <translation id="5144820558584035333">हंगुल 3 सेट (390)</translation> -<translation id="5145331109270917438">संशोधन दिनांक</translation> +<translation id="5145331109270917438">संशोधन तारीख</translation> <translation id="515594325917491223">शतरंज</translation> <translation id="5158593464696388225">चित्र को सहेजने में विफल रहा.</translation> <translation id="5159383109919732130"><ph name="BEGIN_BOLD" />इस समय अपना डिवाइस न निकालें!<ph name="END_BOLD" /> @@ -439,7 +439,7 @@ <translation id="6170470584681422115">सैंडविच</translation> <translation id="6189412234224385711"><ph name="EXTENSION_NAME" /> से खोलें</translation> <translation id="6199801702437275229">स्थान जानकारी की प्रतीक्षा कर रहा है...</translation> -<translation id="6205710420833115353">कुछ कार्य अपेक्षा से अधिक समय ले रहे हैं. क्या आप उन्हें निरस्त करना चाहते हैं?</translation> +<translation id="6205710420833115353">कुछ कार्य अपेक्षा से ज़्यादा समय ले रहे हैं. क्या आप उन्हें निरस्त करना चाहते हैं?</translation> <translation id="6227235786875481728">यह फ़ाइल चलाई नहीं जा सकती.</translation> <translation id="6248400709929739064">उपशीर्षक सक्षम करें</translation> <translation id="6264347891387618177">लिप्यंतरण (selam → ሰላም)</translation> @@ -508,7 +508,7 @@ <translation id="7014174261166285193">स्थापना विफल.</translation> <translation id="7040138676081995583">इसके साथ खोलें...</translation> <translation id="7100897339030255923"><ph name="COUNT" /> आइटम चयनित</translation> -<translation id="7106346894903675391">अधिक मेमोरी खरीदें...</translation> +<translation id="7106346894903675391">ज़्यादा मेमोरी खरीदें...</translation> <translation id="7126604456862387217">'<b><ph name="SEARCH_STRING" /></b>' - <em>खोज डिस्क</em></translation> <translation id="714034171374937760">Chromebase</translation> <translation id="7170467426996704624">लिप्यंतरण (salam → ሰላም)</translation> @@ -676,7 +676,7 @@ <translation id="9110990317705400362">हम आपकी ब्राउज़िंग को सुरक्षित रखने के तरीकों पर लगातार कार्य कर रहे हैं. पूर्व में, कोई भी वेबसाइट आपको अपने ब्राउज़र में एक्सटेंशन जोड़ने के लिए संकेत दे सकती थी. Google Chrome के नवीनतम संस्करणों में, आपको एक्सटेंशन पेज के माध्यम से इन एक्सटेंशन को जोड़कर Chrome को स्पष्ट रूप से बताना होगा कि आप इन्हें इंस्टॉल करना चाहते हैं. <ph name="BEGIN_LINK" />और जानें<ph name="END_LINK" /></translation> <translation id="912419004897138677">कोडेक</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' के सदस्यों को इन आइटम का एक्सेस मिल जाएगा.</translation> -<translation id="9131598836763251128">एक या अधिक फ़ाइल को चुनें</translation> +<translation id="9131598836763251128">एक या ज़्यादा फ़ाइल को चुनें</translation> <translation id="9133055936679483811">ज़िप करना विफल रहा. <ph name="ERROR_MESSAGE" /></translation> <translation id="9134524245363717059">यह फ़ाइल Macintosh सॉफ़्टवेयर का उपयोग करने वाले कंप्यूटर के लिए बनाई गई है. यह Chrome OS चलाने वाले आपके डिवाइस से संगत नहीं है. कृपया उचित प्रतिस्थापन ऐप्स के लिए Chrome वेब स्टोर खोजें.</translation> <translation id="913758436357682283">म्यांमार म्यांसन कीबोर्ड</translation>
diff --git a/ui/file_manager/file_manager/cws_widget/app_installer.js b/ui/file_manager/file_manager/cws_widget/app_installer.js index 69d31bf0..df2d0c2 100644 --- a/ui/file_manager/file_manager/cws_widget/app_installer.js +++ b/ui/file_manager/file_manager/cws_widget/app_installer.js
@@ -50,7 +50,7 @@ return; } - var installerResult = AppInstaller.Result.SUCCESS; + let installerResult = AppInstaller.Result.SUCCESS; if (error !== null) { installerResult = error == AppInstaller.USER_CANCELLED_ERROR_STR_ ? AppInstaller.Result.CANCELLED :
diff --git a/ui/file_manager/file_manager/cws_widget/cws_webview_client.js b/ui/file_manager/file_manager/cws_widget/cws_webview_client.js index e5a985b..1c45a98 100644 --- a/ui/file_manager/file_manager/cws_widget/cws_webview_client.js +++ b/ui/file_manager/file_manager/cws_widget/cws_webview_client.js
@@ -43,7 +43,7 @@ return; } - var data = event.data; + const data = event.data; switch (data['message']) { case 'widget_loaded': this.onWidgetLoaded_(); @@ -129,7 +129,7 @@ * @private */ sendInstallRequest_(itemId) { - var event = new Event(CWSContainerClient.Events.REQUEST_INSTALL); + const event = new Event(CWSContainerClient.Events.REQUEST_INSTALL); event.itemId = itemId; this.dispatchEvent(event); } @@ -141,7 +141,7 @@ * @private */ sendInstallDone_(itemId) { - var event = new Event(CWSContainerClient.Events.INSTALL_DONE); + const event = new Event(CWSContainerClient.Events.INSTALL_DONE); event.itemId = itemId; this.dispatchEvent(event); } @@ -153,7 +153,7 @@ * @private */ postInstallFailureMessage_(itemId) { - var message = {message: 'install_failure', item_id: itemId, v: 1}; + const message = {message: 'install_failure', item_id: itemId, v: 1}; this.postMessage_(message); } @@ -165,7 +165,7 @@ * @private */ postInstallSuccessMessage_(itemId) { - var message = {message: 'install_success', item_id: itemId, v: 1}; + const message = {message: 'install_success', item_id: itemId, v: 1}; this.postMessage_(message); } @@ -175,41 +175,41 @@ * @private */ postInitializeMessage_() { - new Promise(function(fulfill, reject) { + new Promise((fulfill, reject) => { this.delegate_.getInstalledItems( /** * @param {?Array<!string>} items Installed items. * Null on error. */ - function(items) { + items => { if (!items) { reject('Failed to retrive installed items.'); return; } fulfill(items); }); - }.bind(this)) - .then((/** - * @param {!Array<string>} preinstalledExtensionIDs - */ - function(preinstalledExtensionIDs) { - var message = { - message: 'initialize', - hl: this.delegate_.strings.UI_LOCALE, - width: this.width_, - height: this.height_, - preinstalled_items: preinstalledExtensionIDs, - v: 1 - }; + }) + .then(/** + * @param {!Array<string>} preinstalledExtensionIDs + */ + preinstalledExtensionIDs => { + const message = { + message: 'initialize', + hl: this.delegate_.strings.UI_LOCALE, + width: this.width_, + height: this.height_, + preinstalled_items: preinstalledExtensionIDs, + v: 1 + }; - if (this.options_) { - Object.keys(this.options_).forEach(function(key) { - message[key] = this.options_[key]; - }.bind(this)); - } + if (this.options_) { + Object.keys(this.options_).forEach(key => { + message[key] = this.options_[key]; + }); + } - this.postMessage_(message); - }).bind(this)); + this.postMessage_(message); + }); } /**
diff --git a/ui/file_manager/file_manager/cws_widget/cws_widget_container.js b/ui/file_manager/file_manager/cws_widget/cws_widget_container.js index fd39e528..dd5c8b1 100644 --- a/ui/file_manager/file_manager/cws_widget/cws_widget_container.js +++ b/ui/file_manager/file_manager/cws_widget/cws_widget_container.js
@@ -16,21 +16,21 @@ * @type {number} * @const */ -var WEBVIEW_WIDTH = 735; +const WEBVIEW_WIDTH = 735; /** * The height of the widget (in pixels). * @type {number} * @const */ -var WEBVIEW_HEIGHT = 480; +const WEBVIEW_HEIGHT = 480; /** * The URL of the widget showing suggested apps. * @type {string} * @const */ -var CWS_WIDGET_URL = +const CWS_WIDGET_URL = 'https://clients5.google.com/webstore/wall/cros-widget-container'; /** @@ -38,7 +38,7 @@ * @type {string} * @const */ -var CWS_WIDGET_ORIGIN = 'https://clients5.google.com'; +const CWS_WIDGET_ORIGIN = 'https://clients5.google.com'; /** * Creates the widget container element in DOM tree. @@ -87,7 +87,7 @@ * Element showing spinner layout in place of Web Store widget. * @type {!Element} */ - var spinnerLayer = document.createElement('div'); + const spinnerLayer = document.createElement('div'); spinnerLayer.className = 'cws-widget-spinner-layer'; parentNode.appendChild(spinnerLayer); @@ -99,7 +99,7 @@ * The widget container's button strip. * @type {!Element} */ - var buttons = document.createElement('div'); + const buttons = document.createElement('div'); buttons.classList.add('cws-widget-buttons'); parentNode.appendChild(buttons); @@ -117,7 +117,7 @@ * Icon for the Webstore button. * @type {!Element} */ - var webstoreButtonIcon = this.document_.createElement('span'); + const webstoreButtonIcon = this.document_.createElement('span'); webstoreButtonIcon.classList.add('cws-widget-webstore-button-icon'); this.webstoreButton_.appendChild(webstoreButtonIcon); @@ -125,7 +125,7 @@ * The label for the Webstore button. * @type {!Element} */ - var webstoreButtonLabel = this.document_.createElement('span'); + const webstoreButtonLabel = this.document_.createElement('span'); webstoreButtonLabel.classList.add('cws-widget-webstore-button-label'); webstoreButtonLabel.textContent = this.delegate_.strings.LINK_TO_WEBSTORE; this.webstoreButton_.appendChild(webstoreButtonLabel); @@ -253,7 +253,7 @@ * @private */ createTokenGetter_() { - return new Promise(function(resolve, reject) { + return new Promise((resolve, reject) => { if (window.IN_TEST) { // In test, use a dummy string as token. This must be a non-empty // string. @@ -266,14 +266,14 @@ /** @param {?string} accessToken The requested token. Null on error. */ - function(accessToken) { + accessToken => { if (!accessToken) { reject('Error retrieving Web Store access token.'); return; } resolve(accessToken); }); - }.bind(this)); + }); } /** @@ -289,7 +289,7 @@ * @return {Promise} Resolved when the container is ready to be used. */ ready() { - return new Promise(function(resolve, reject) { + return new Promise((resolve, reject) => { if (this.state_ !== CWSWidgetContainer.State.UNINITIALIZED) { reject('Invalid state.'); return; @@ -305,17 +305,17 @@ this.state_ = CWSWidgetContainer.State.GETTING_ACCESS_TOKEN; this.tokenGetter_.then( - function(accessToken) { + accessToken => { this.state_ = CWSWidgetContainer.State.ACCESS_TOKEN_READY; this.accessToken_ = accessToken; resolve(); - }.bind(this), - function(error) { + }, + error => { this.spinnerLayerController_.setVisible(false); this.state_ = CWSWidgetContainer.State.UNINITIALIZED; reject('Failed to get Web Store access token: ' + error); - }.bind(this)); - }.bind(this)); + }); + }); } /** @@ -328,7 +328,7 @@ * installation is done, or the installation is cancelled. */ start(options, webStoreUrl) { - return new Promise(function(resolve, reject) { + return new Promise((resolve, reject) => { if (this.state_ !== CWSWidgetContainer.State.ACCESS_TOKEN_READY) { this.state_ = CWSWidgetContainer.State.INITIALIZE_FAILED_CLOSING; reject('Invalid state in |start|.'); @@ -362,7 +362,7 @@ this.authorizeRequest_.bind(this), /** @type {!RequestFilter}*/ ({urls: [this.widgetOrigin_ + '/*']}), ['blocking', 'requestHeaders']); - this.webview_.addEventListener('newwindow', function(event) { + this.webview_.addEventListener('newwindow', event => { event = /** @type {NewWindowEvent} */ (event); // Discard the window object and reopen in an external window. event.window.discard(); @@ -391,7 +391,7 @@ CWSContainerClient.Events.INSTALL_DONE, this.onInstallDone_.bind(this)); this.webviewClient_.load(); - }.bind(this)); + }); } /** @@ -469,7 +469,7 @@ * @private */ onInstallRequest_(e) { - var itemId = e.itemId; + const itemId = e.itemId; this.installingItemId_ = itemId; this.appInstaller_ = new AppInstaller(itemId, this.delegate_); @@ -500,7 +500,7 @@ * @private */ onItemInstalled_(result, error) { - var success = (result === AppInstaller.Result.SUCCESS); + const success = (result === AppInstaller.Result.SUCCESS); // If install succeeded, the spinner will be removed once // |this.webviewClient_| dispatched INSTALL_DONE event. @@ -597,7 +597,7 @@ console.error('Invalid state.'); } - var result; + let result; switch (this.state_) { case CWSWidgetContainer.State.INSTALLED_CLOSING: result = CWSWidgetContainer.Result.INSTALL_SUCCESSFUL; @@ -838,7 +838,7 @@ this.spinnerLayer_.classList.add('cws-widget-hiding-spinner'); } - this.clearTransition_ = function() { + this.clearTransition_ = () => { if (this.clearTransitionTimeout_) { clearTimeout(this.clearTransitionTimeout_); } @@ -852,16 +852,16 @@ this.spinnerLayer_.classList.remove('cws-widget-hiding-spinner'); this.spinnerLayer_.classList.remove('cws-widget-show-spinner'); } - }.bind(this); + }; this.spinnerLayer_.addEventListener('transitionend', this.clearTransition_); // Ensure the transition state gets cleared, even if transitionend is not // fired. - this.clearTransitionTimeout_ = setTimeout(function() { + this.clearTransitionTimeout_ = setTimeout(() => { this.clearTransitionTimeout_ = null; this.clearTransition_(); - }.bind(this), 550 /* ms */); + }, 550 /* ms */); } };
diff --git a/ui/file_manager/file_manager/cws_widget/cws_widget_container_error_dialog.js b/ui/file_manager/file_manager/cws_widget/cws_widget_container_error_dialog.js index a065ab2..40b92f7 100644 --- a/ui/file_manager/file_manager/cws_widget/cws_widget_container_error_dialog.js +++ b/ui/file_manager/file_manager/cws_widget/cws_widget_container_error_dialog.js
@@ -25,7 +25,7 @@ initDom_() { super.initDom_(); this.frame_.classList.add('cws-widget-error-dialog-frame'); - var img = this.document_.createElement('div'); + const img = this.document_.createElement('div'); img.className = 'cws-widget-error-dialog-img'; this.frame_.insertBefore(img, this.text_);
diff --git a/ui/file_manager/file_manager/cws_widget/cws_widget_container_platform_delegate.js b/ui/file_manager/file_manager/cws_widget/cws_widget_container_platform_delegate.js index d5bb6cd..0266ad3 100644 --- a/ui/file_manager/file_manager/cws_widget/cws_widget_container_platform_delegate.js +++ b/ui/file_manager/file_manager/cws_widget/cws_widget_container_platform_delegate.js
@@ -12,7 +12,7 @@ * INSTALLING_SPINNER_ALT: string * }} */ -var CWSWidgetContainerStrings; +let CWSWidgetContainerStrings; /** * Functions for reporting metrics for the widget. @@ -23,7 +23,7 @@ * recordInterval: function(string) * }} */ -var CWSWidgetContainerMetricsImpl; +let CWSWidgetContainerMetricsImpl; /** * Type for delegate used by CWSWidgetContainer component to access Chrome @@ -36,4 +36,4 @@ * requestWebstoreAccessToken: function(function(?string)) * }} */ -var CWSWidgetContainerPlatformDelegate; +let CWSWidgetContainerPlatformDelegate;
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.js b/ui/file_manager/file_manager/foreground/js/directory_model.js index 5ab1553b..9c18901 100644 --- a/ui/file_manager/file_manager/foreground/js/directory_model.js +++ b/ui/file_manager/file_manager/foreground/js/directory_model.js
@@ -1203,17 +1203,14 @@ }); } - // If a volume within My files is mounted, rescan the contents. - // TODO(crbug.com/901690): Remove this special case. - if (this.getCurrentRootType() === VolumeManagerCommon.RootType.MY_FILES) { - for (let newVolume of event.added) { - if (newVolume.volumeType === VolumeManagerCommon.VolumeType.DOWNLOADS || - newVolume.volumeType === - VolumeManagerCommon.VolumeType.ANDROID_FILES || - newVolume.volumeType === VolumeManagerCommon.VolumeType.CROSTINI) { - this.rescan(false); - break; - } + // If a volume within My files or removable root is mounted/unmounted rescan + // its contents. + const currentDir = this.getCurrentDirEntry(); + const affectedVolumes = event.added.concat(event.removed); + for (let volume of affectedVolumes) { + if (util.isSameEntry(currentDir, volume.prefixEntry)) { + this.rescan(false); + break; } }
diff --git a/ui/file_manager/file_manager/main.html b/ui/file_manager/file_manager/main.html index 4f66f24f..92cc612 100644 --- a/ui/file_manager/file_manager/main.html +++ b/ui/file_manager/file_manager/main.html
@@ -200,7 +200,8 @@ </commands> <cr-menu id="file-context-menu" class="chrome-menu files-menu" - menu-item-selector="cr-menu-item,hr" showShortcuts> + menu-item-selector="cr-menu-item,hr" showShortcuts + aria-label="$i18n{CONTEXT_MENU_LABEL}"> <cr-menu-item id="default-task-menu-item" command="#default-task" visibleif="full-page" class="hide-on-toolbar" hidden></cr-menu-item> <cr-menu-item command="#open-with" @@ -230,7 +231,8 @@ </cr-menu> <cr-menu id="roots-context-menu" class="chrome-menu files-menu" - menu-item-selector="cr-menu-item"> + menu-item-selector="cr-menu-item" + aria-label="$i18n{CONTEXT_MENU_LABEL}"> <cr-menu-item command="#configure"></cr-menu-item> <cr-menu-item command="#unmount"></cr-menu-item> <cr-menu-item command="#format"></cr-menu-item> @@ -243,7 +245,8 @@ </cr-menu> <cr-menu id="directory-tree-context-menu" class="chrome-menu files-menu" - menu-item-selector="cr-menu-item,hr"> + menu-item-selector="cr-menu-item,hr" + aria-label="$i18n{CONTEXT_MENU_LABEL}"> <cr-menu-item command="#cut" visibleif="full-page"></cr-menu-item> <cr-menu-item command="#copy" visibleif="full-page"></cr-menu-item> <cr-menu-item command="#paste-into-folder" visibleif="full-page"></cr-menu-item> @@ -342,7 +345,8 @@ </cr-menu> <cr-menu id="text-context-menu" class="chrome-menu files-menu" showShortcuts - menu-item-selector="cr-menu-item"> + menu-item-selector="cr-menu-item" + aria-label="$i18n{CONTEXT_MENU_LABEL}"> <cr-menu-item command="#cut"></cr-menu-item> <cr-menu-item command="#copy"></cr-menu-item> <cr-menu-item command="#paste"></cr-menu-item>
diff --git a/ui/file_manager/image_loader/piex/piex.cpp b/ui/file_manager/image_loader/piex/piex.cpp index a6bc668..f5003c4 100644 --- a/ui/file_manager/image_loader/piex/piex.cpp +++ b/ui/file_manager/image_loader/piex/piex.cpp
@@ -36,15 +36,9 @@ class PiexReader { public: static void ReadImage(const char* data, size_t size, int callback) { - assert(callback); + assert(data && callback); auto result = emscripten::val::object(); - if (!data || !size) { - result.set("error", emscripten::val("failed to fetch image source")); - CallbackResult(callback, result); - return; - } - PiexStreamReader reader(data, size); piex::PreviewImageData image; @@ -89,7 +83,7 @@ } static emscripten::val GetPreview(const piex::PreviewImageData& image) { - auto undefined = emscripten::val::undefined(); + const auto undefined = emscripten::val::undefined(); const auto format = static_cast<uint32_t>(image.preview.format); if (format != piex::Image::Format::kJpegCompressed) @@ -110,7 +104,7 @@ } static emscripten::val GetThumbnail(const piex::PreviewImageData& image) { - auto undefined = emscripten::val::undefined(); + const auto undefined = emscripten::val::undefined(); const auto format = static_cast<uint32_t>(image.thumbnail.format); if (!image.thumbnail.offset || !image.thumbnail.length)
diff --git a/ui/file_manager/image_loader/piex/tests.html b/ui/file_manager/image_loader/piex/tests.html index a482b9e..a7823ec 100644 --- a/ui/file_manager/image_loader/piex/tests.html +++ b/ui/file_manager/image_loader/piex/tests.html
@@ -27,12 +27,9 @@ } process(resolve, reject) { - if (this.length <= 0 || this.length >= Math.pow(2, 30)) - throw new Error('invalid image length'); - this.memory = Module._malloc(this.length); if (!this.memory) - throw Error('image malloc failure'); + throw new Error('image malloc failure'); this.callback = Module.addFunction((result) => { resolve(this.result = result); @@ -74,9 +71,9 @@ throw new Error('failed to extract thumbnail'); const view = new Uint8Array(this.source.buffer, offset, length); + thumbnail.data = new Uint8Array(view); if (thumbnail.format == 1) // RGB thumbnail.size = thumbnail.width * thumbnail.height * 3; - thumbnail.data = new Uint8Array(view); thumbnail.type = 'thumbnail'; return thumbnail; @@ -93,7 +90,7 @@ document.title = 'createFileSystem'; function failed(error) { - reject(new Error('Creating file system: ' + error.name)); + reject(new Error('Creating file system: ' + error)); } function createdFileSystem(fileSystem) { @@ -119,7 +116,7 @@ }).catch(reject); function failure(error) { - reject(new Error('Writing file system: ' + error.name)); + reject(new Error('Writing file system: ' + error)); } function writeEntry(fileEntry) { @@ -140,11 +137,17 @@ document.title = image; function failure(error) { - reject(new Error('Reading file system: ' + error.name)); + reject(new Error('Reading file system: ' + error)); + } + + function invalid(size) { + return size <= 0 || size >= Math.pow(2, 30); } function readEntry(fileEntry) { fileEntry.file((file) => { + if (invalid(file.size)) + return failure('invalid file size'); const reader = new FileReader(); reader.onerror = failure; reader.onload = () => resolve(reader.result); @@ -247,12 +250,8 @@ document.body.innerHTML = `<pre>${image}</pre>`; // Fetch the image in an array buffer. - let time = performance.now(); - const buffer = await fetch(image).then((response) => { - if (!response.ok) - throw new Error('failed fetching image ' + image); - return response.arrayBuffer(); - }).catch(onerror); + let time = window.performance.now(); + const buffer = await readFromFileSystem(image).catch(onerror); if (!buffer) return;
diff --git a/ui/file_manager/integration_tests/file_manager/my_files.js b/ui/file_manager/integration_tests/file_manager/my_files.js index 3faf773f..704cb37 100644 --- a/ui/file_manager/integration_tests/file_manager/my_files.js +++ b/ui/file_manager/integration_tests/file_manager/my_files.js
@@ -332,3 +332,57 @@ // Check that MyFiles is still collapsed. await remoteCall.waitForElement(appId, myFiles + ':not([expanded])'); }; + +/** + * Tests that My files refreshes its contents when PlayFiles is mounted. + * crbug.com/946972. + */ +testcase.myFilesUpdatesWhenAndroidVolumeMounts = async () => { + const playFilesTreeItem = '#directory-tree [entry-label="Play files"]'; + // Mount Downloads. + await sendTestMessage({name: 'mountDownloads'}); + + // Wait until Downloads is mounted. + await remoteCall.waitFor('getVolumesCount', null, (count) => count === 1, []); + + // Open Files app on local Downloads. + const appId = + await setupAndWaitUntilReady(RootPath.DOWNLOADS, [ENTRIES.beautiful], []); + + // Click on My files and wait it to load. + const myFiles = '#directory-tree [entry-label="My files"]'; + const downloadsRow = ['Downloads', '--', 'Folder']; + const playFilesRow = ['Play files', '--', 'Folder']; + const crostiniRow = ['Linux files', '--', 'Folder']; + await remoteCall.waitAndClickElement(appId, myFiles); + await remoteCall.waitForFiles( + appId, [downloadsRow, crostiniRow], + {ignoreFileSize: true, ignoreLastModifiedTime: true}); + + // Mount Play files volume. + await sendTestMessage({name: 'mountPlayFiles'}); + + // Wait until it is mounted. + await remoteCall.waitFor('getVolumesCount', null, (count) => count === 2, []); + + // Android volume should automatically appear on directory tree and file list. + await remoteCall.waitForElement(appId, playFilesTreeItem); + await remoteCall.waitForFiles( + appId, [downloadsRow, crostiniRow, playFilesRow], + {ignoreFileSize: true, ignoreLastModifiedTime: true}); + + // Un-mount Play files volume. + await sendTestMessage({name: 'unmountPlayFiles'}); + + // Wait until it is un-mounted. + await remoteCall.waitFor('getVolumesCount', null, (count) => count === 1, []); + + // Check: Play files should disappear from file list. + await remoteCall.waitForFiles( + appId, [downloadsRow, crostiniRow], + {ignoreFileSize: true, ignoreLastModifiedTime: true}); + + // Check: Play files should disappear from directory tree. + chrome.test.assertTrue( + !!await remoteCall.waitForElementLost(appId, playFilesTreeItem)); +};
diff --git a/ui/file_manager/integration_tests/file_manager/tasks.js b/ui/file_manager/integration_tests/file_manager/tasks.js index ffb65ad..4df0b6e7 100644 --- a/ui/file_manager/integration_tests/file_manager/tasks.js +++ b/ui/file_manager/integration_tests/file_manager/tasks.js
@@ -36,6 +36,16 @@ ]; /** + * Fake tasks for a local volume opening in browser. + * + * @type {Array<FakeTask>} + * @const + */ +const DOWNLOADS_FAKE_TEXT = [ + new FakeTask(true, FILE_MANAGER_EXTENSIONS_ID + '|file|view-in-browser'), +]; + +/** * Fake tasks for a drive volume. * * @type {Array<FakeTask>} @@ -168,6 +178,12 @@ await executeDefaultTask(appId, 'dummytaskid|open-with'); }; +testcase.defaultTaskForTextPlain = async () => { + const appId = await setupTaskTest(RootPath.DOWNLOADS, DOWNLOADS_FAKE_TEXT); + await executeDefaultTask( + appId, FILE_MANAGER_EXTENSIONS_ID + '|file|view-in-browser'); +}; + testcase.defaultTaskDialogDrive = async () => { const appId = await setupTaskTest(RootPath.DRIVE, DRIVE_FAKE_TASKS); await defaultTaskDialog(appId, 'dummytaskid-2|drive|open-with');
diff --git a/ui/gfx/icon_util.cc b/ui/gfx/icon_util.cc index 1f226e8..2881d21 100644 --- a/ui/gfx/icon_util.cc +++ b/ui/gfx/icon_util.cc
@@ -314,14 +314,16 @@ return CreateSkBitmapFromHICONHelper(icon, icon_size); } -base::win::ScopedHICON IconUtil::CreateCursorFromDIB(const gfx::Size& icon_size, - const gfx::Point& hotspot, - const void* dib_bits, - size_t dib_size) { +base::win::ScopedHICON IconUtil::CreateCursorFromSkBitmap( + const SkBitmap& bitmap, + const gfx::Point& hotspot) { + // Only 32 bit ARGB bitmaps are supported. + if (bitmap.empty() || bitmap.colorType() != kN32_SkColorType) + return base::win::ScopedHICON(); + BITMAPINFO icon_bitmap_info = {}; skia::CreateBitmapHeader( - icon_size.width(), - icon_size.height(), + bitmap.width(), bitmap.height(), reinterpret_cast<BITMAPINFOHEADER*>(&icon_bitmap_info)); base::win::ScopedGetDC dc(NULL); @@ -333,15 +335,8 @@ 0, 0, 0)); - if (dib_size > 0) { - SetDIBits(0, - bitmap_handle.get(), - 0, - icon_size.height(), - dib_bits, - &icon_bitmap_info, - DIB_RGB_COLORS); - } + SetDIBits(0, bitmap_handle.get(), 0, bitmap.height(), bitmap.getPixels(), + &icon_bitmap_info, DIB_RGB_COLORS); HBITMAP old_bitmap = reinterpret_cast<HBITMAP>( SelectObject(working_dc.Get(), bitmap_handle.get())); @@ -349,11 +344,7 @@ SelectObject(working_dc.Get(), old_bitmap); base::win::ScopedGDIObject<HBITMAP> mask( - CreateBitmap(icon_size.width(), - icon_size.height(), - 1, - 1, - NULL)); + CreateBitmap(bitmap.width(), bitmap.height(), 1, 1, NULL)); ICONINFO ii = {0}; ii.fIcon = FALSE; ii.xHotspot = hotspot.x();
diff --git a/ui/gfx/icon_util.h b/ui/gfx/icon_util.h index e2fcbd18b3..87bac92 100644 --- a/ui/gfx/icon_util.h +++ b/ui/gfx/icon_util.h
@@ -129,12 +129,11 @@ const base::FilePath& icon_path, WriteType write_type = ATOMIC_WRITE); - // Creates a cursor of the specified size from the DIB passed in. + // Creates a cursor of the specified size from the SkBitmap passed in. // Returns the cursor on success or NULL on failure. - static base::win::ScopedHICON CreateCursorFromDIB(const gfx::Size& icon_size, - const gfx::Point& hotspot, - const void* dib_bits, - size_t dib_size); + static base::win::ScopedHICON CreateCursorFromSkBitmap( + const SkBitmap& bitmap, + const gfx::Point& hotspot); // Given a valid HICON handle representing an icon, this function retrieves // the hot spot of the icon.
diff --git a/ui/gfx/ipc/gfx_param_traits_macros.h b/ui/gfx/ipc/gfx_param_traits_macros.h index daf1bf3..4f63ede 100644 --- a/ui/gfx/ipc/gfx_param_traits_macros.h +++ b/ui/gfx/ipc/gfx_param_traits_macros.h
@@ -51,7 +51,7 @@ IPC_STRUCT_TRAITS_MEMBER(region) IPC_STRUCT_TRAITS_MEMBER(offset) IPC_STRUCT_TRAITS_MEMBER(stride) -#if defined(OS_LINUX) +#if defined(OS_LINUX) || defined(OS_FUCHSIA) IPC_STRUCT_TRAITS_MEMBER(native_pixmap_handle) #elif defined(OS_MACOSX) IPC_STRUCT_TRAITS_MEMBER(mach_port) @@ -66,13 +66,17 @@ IPC_STRUCT_TRAITS_MEMBER(id) IPC_STRUCT_TRAITS_END() -#if defined(OS_LINUX) +#if defined(OS_LINUX) || defined(OS_FUCHSIA) IPC_STRUCT_TRAITS_BEGIN(gfx::NativePixmapPlane) IPC_STRUCT_TRAITS_MEMBER(stride) IPC_STRUCT_TRAITS_MEMBER(offset) IPC_STRUCT_TRAITS_MEMBER(size) IPC_STRUCT_TRAITS_MEMBER(modifier) +#if defined(OS_LINUX) IPC_STRUCT_TRAITS_MEMBER(fd) +#elif defined(OS_FUCHSIA) + IPC_STRUCT_TRAITS_MEMBER(vmo) +#endif IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(gfx::NativePixmapHandle)
diff --git a/ui/message_center/views/notification_view.cc b/ui/message_center/views/notification_view.cc index 08f43237..dd8798b 100644 --- a/ui/message_center/views/notification_view.cc +++ b/ui/message_center/views/notification_view.cc
@@ -644,12 +644,12 @@ // Reduce width of the topmost label not to be covered by the control buttons // only on non Chrome OS platform. #if !defined(OS_CHROMEOS) - const int child_count = top_view_->child_count(); - if (child_count > 0) { - const int buttons_width = control_buttons_view_->GetPreferredSize().width(); - SetBorderRight(top_view_->child_at(0), kTextRightPadding + buttons_width); - for (int i = 1; i < child_count; ++i) - SetBorderRight(top_view_->child_at(i), kTextRightPadding); + const auto& children = top_view_->children(); + int right = + kTextRightPadding + control_buttons_view_->GetPreferredSize().width(); + for (auto* child : children) { + SetBorderRight(child, right); + right = kTextRightPadding; } #endif }
diff --git a/ui/strings/translations/ui_strings_hi.xtb b/ui/strings/translations/ui_strings_hi.xtb index 13c2cdba..29112fa 100644 --- a/ui/strings/translations/ui_strings_hi.xtb +++ b/ui/strings/translations/ui_strings_hi.xtb
@@ -161,7 +161,7 @@ <translation id="6965382102122355670">ठीक है</translation> <translation id="6974053822202609517">दाएं से बाएं</translation> <translation id="7052633198403197513">F1</translation> -<translation id="7130207228079676353">सबसे अधिक संभावना है</translation> +<translation id="7130207228079676353">सबसे ज़्यादा संभावना है</translation> <translation id="7222373446505536781">F11</translation> <translation id="7238427729722629793">{MINUTES,plural, =1{1 मिनट शेष}one{# मिनट शेष}other{# मिनट शेष}}</translation> <translation id="7319740667687257810">लॉन्चर, आंशिक दृश्य</translation>
diff --git a/ui/strings/translations/ui_strings_nl.xtb b/ui/strings/translations/ui_strings_nl.xtb index 2170f4b..2a1f7ea1 100644 --- a/ui/strings/translations/ui_strings_nl.xtb +++ b/ui/strings/translations/ui_strings_nl.xtb
@@ -110,7 +110,7 @@ <translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation> <translation id="5266161281976477809">Driehoek voor samen-/uitvouwen</translation> <translation id="5278860589123563674">Verzenden mislukt</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Beëindigen</translation> <translation id="5329858601952122676">Verwij&deren</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> bovenop <ph name="IN_PLACE_APP" />, laat los om een map te maken.</translation> <translation id="5463830097259460683">Emoji en symbolen</translation>
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb index a0d45ff7fe5..1ad905db 100644 --- a/ui/strings/translations/ui_strings_no.xtb +++ b/ui/strings/translations/ui_strings_no.xtb
@@ -110,7 +110,7 @@ <translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation> <translation id="5266161281976477809">Trekant for mer innhold</translation> <translation id="5278860589123563674">Kunne ikke sende</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Avslutt</translation> <translation id="5329858601952122676">&Slett</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> oppå <ph name="IN_PLACE_APP" /> – slipp for å opprette en mappe.</translation> <translation id="5463830097259460683">Emoji og symboler</translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb index 1cdfe1d..c194958 100644 --- a/ui/strings/translations/ui_strings_pt-BR.xtb +++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -110,7 +110,7 @@ <translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation> <translation id="5266161281976477809">Triângulo de divulgação</translation> <translation id="5278860589123563674">Falha ao enviar</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">Fim</translation> <translation id="5329858601952122676">&Excluir</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> sobre <ph name="IN_PLACE_APP" />, solte para criar pasta.</translation> <translation id="5463830097259460683">Emojis e símbolos</translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb index e76e98d..151e9a5d 100644 --- a/ui/strings/translations/ui_strings_ta.xtb +++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -109,7 +109,7 @@ <translation id="5137751499640340777">Google அசிஸ்டண்ட்டைத் தொடங்கும்</translation> <translation id="520299402983819650"><ph name="QUANTITY" /> பெ.பை</translation> <translation id="5266161281976477809">கூடுதல் உள்ளடக்கத்தைக் காட்டும் முக்கோணம்</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">நிறுத்து</translation> <translation id="5329858601952122676">&நீக்கு</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" />ன் மேல் <ph name="DRAGGED_APP_NAME" />ஐ இழுத்துவிடுகிறீர்கள். கோப்புறையை உருவாக்க, விடுவிக்கவும்.</translation> <translation id="5463830097259460683">ஈமோஜி && குறியீடுகள்</translation>
diff --git a/ui/strings/translations/ui_strings_zh-CN.xtb b/ui/strings/translations/ui_strings_zh-CN.xtb index 6f87b97c..7a11b4f 100644 --- a/ui/strings/translations/ui_strings_zh-CN.xtb +++ b/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -110,7 +110,7 @@ <translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation> <translation id="5266161281976477809">开合三角标记</translation> <translation id="5278860589123563674">发送失败</translation> -<translation id="528468243742722775">End</translation> +<translation id="528468243742722775">结束</translation> <translation id="5329858601952122676">删除(&D)</translation> <translation id="5395308026110844773">“<ph name="DRAGGED_APP_NAME" />”已拖至“<ph name="IN_PLACE_APP" />”上,松开即可创建文件夹。</translation> <translation id="5463830097259460683">表情符号与符号</translation>